Merged Mario's modbus fix : Modbus plugin: reset periodic activation timer when overrun occurs (delays due to communication errors, ...)
authorEdouard Tisserant
Mon, 07 Jan 2019 13:50:39 +0100
changeset 2480 8efa26af791d
parent 2478 733d77bf0aa7 (diff)
parent 2479 7f08b03a5d92 (current diff)
child 2481 6cd7dae360d4
Merged Mario's modbus fix : Modbus plugin: reset periodic activation timer when overrun occurs (delays due to communication errors, ...)
modbus/mb_runtime.c
--- a/.hgignore	Sat Jun 02 11:56:01 2018 +0100
+++ b/.hgignore	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,10 @@
 .project
 
-syntax: glob
-bug_report*
+.directory
+.pytest_cache
+.cache
+.coverage_full
+
 syntax: regexp
 ^tests/.*/build$
 ^.idea/.*
@@ -15,3 +18,6 @@
 bug_report.*\.txt
 i18n/.*.new$
 revision
+
+doc/_build
+doc/locale
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.pylint	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,410 @@
+[MASTER]
+
+# Specify a configuration file.
+#rcfile=
+
+# Python code to execute, usually for sys.path manipulation such as
+# pygtk.require().
+#init-hook=
+
+# Add files or directories to the blacklist. They should be base names, not
+# paths.
+ignore=CVS
+
+# Add files or directories matching the regex patterns to the blacklist. The
+# regex matches against base names, not paths.
+ignore-patterns=
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+# Use multiple processes to speed up Pylint.
+jobs=1
+
+# Allow loading of arbitrary C extensions. Extensions are imported into the
+# active Python interpreter and may run arbitrary code.
+unsafe-load-any-extension=no
+
+# A comma-separated list of package or module names from where C extensions may
+# be loaded. Extensions are loading into the active Python interpreter and may
+# run arbitrary code
+extension-pkg-whitelist=
+
+# Allow optimization of some AST trees. This will activate a peephole AST
+# optimizer, which will apply various small optimizations. For instance, it can
+# be used to obtain the result of joining multiple strings with the addition
+# operator. Joining a lot of strings can lead to a maximum recursion error in
+# Pylint and this flag can prevent that. It has one side effect, the resulting
+# AST will be different than the one from reality. This option is deprecated
+# and it will be removed in Pylint 2.0.
+optimize-ast=no
+
+
+[MESSAGES CONTROL]
+
+# Only show warnings with the listed confidence levels. Leave empty to show
+# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
+confidence=
+
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifiers separated by comma (,) or put this
+# option multiple times (only on the command line, not in the configuration
+# file where it should appear only once).You can also use "--disable=all" to
+# disable everything first and then reenable specific checks. For example, if
+# you want to run only the similarities checker, you can use "--disable=all
+# --enable=similarities". If you want to run only the classes checker, but have
+# no Warning level messages displayed, use"--disable=all --enable=classes
+# --disable=W"
+# disable=all
+# disable=import-star-module-level,old-octal-literal,oct-method,print-statement,unpacking-in-except,parameter-unpacking,backtick,old-raise-syntax,old-ne-operator,long-suffix,dict-view-method,dict-iter-method,metaclass-assignment,next-method-called,raising-string,indexing-exception,raw_input-builtin,long-builtin,file-builtin,execfile-builtin,coerce-builtin,cmp-builtin,buffer-builtin,basestring-builtin,apply-builtin,too-many-lines,filter-builtin-not-iterating,line-too-long,using-cmp-argument,useless-suppression,bad-whitespace,missing-docstring,range-builtin-not-iterating,suppressed-message,invalid-name,no-absolute-import,old-division,cmp-method,reload-builtin,zip-builtin-not-iterating,intern-builtin,unichr-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,input-builtin,round-builtin,fixme,broad-except,hex-method,nonzero-method,map-builtin-not-iterating
+
+
+# Enable the message, report, category or checker with the given id(s). You can
+# either give multiple identifier separated by comma (,) or put this option
+# multiple time (only on the command line, not in the configuration file where
+# it should appear only once). See also the "--disable" option for examples.
+# enable=W0611
+
+
+
+[REPORTS]
+
+# Set the output format. Available formats are text, parseable, colorized, msvs
+# (visual studio) and html. You can also give a reporter class, eg
+# mypackage.mymodule.MyReporterClass.
+output-format=parseable
+
+# Put messages in a separate file for each module / package specified on the
+# command line instead of printing them on stdout. Reports (if any) will be
+# written in a file name "pylint_global.[txt|html]". This option is deprecated
+# and it will be removed in Pylint 2.0.
+files-output=no
+
+# Tells whether to display a full report or only the messages
+reports=no
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note). You have access to the variables errors warning, statement which
+# respectively contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (RP0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Template used to display messages. This is a python new-style format string
+# used to format the message information. See doc for all details
+#msg-template=
+
+
+[VARIABLES]
+
+# Tells whether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching the name of dummy variables (i.e. expectedly
+# not used).
+dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=_,website,JS,cobalt,PLCBinary
+
+# List of strings which can identify a callback function by name. A callback
+# name must start or end with one of those strings.
+callbacks=cb_,_cb
+
+# List of qualified module names which can have objects that can redefine
+# builtins.
+redefining-builtins-modules=six.moves,future.builtins
+
+
+[SPELLING]
+
+# Spelling dictionary name. Available dictionaries: none. To make it working
+# install python-enchant package.
+spelling-dict=
+
+# List of comma separated words that should not be checked.
+spelling-ignore-words=
+
+# A path to a file that contains private dictionary; one word per line.
+spelling-private-dict-file=
+
+# Tells whether to store unknown words to indicated private dictionary in
+# --spelling-private-dict-file option instead of raising a message.
+spelling-store-unknown-words=no
+
+
+[SIMILARITIES]
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
+
+# Ignore imports when computing similarities.
+ignore-imports=no
+
+
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,XXX,TODO
+
+
+[BASIC]
+
+# Good variable names which should always be accepted, separated by a comma
+good-names=i,j,k,ex,Run,_
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# Colon-delimited sets of names that determine each other's naming style when
+# the name regexes allow several styles.
+name-group=
+
+# Include a hint for the correct naming format with invalid-name
+include-naming-hint=no
+
+# List of decorators that produce properties, such as abc.abstractproperty. Add
+# to this list to register other decorators that produce valid properties.
+property-classes=abc.abstractproperty
+
+# Regular expression matching correct function names
+function-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Naming hint for function names
+function-name-hint=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression matching correct variable names
+variable-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Naming hint for variable names
+variable-name-hint=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression matching correct constant names
+const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
+
+# Naming hint for constant names
+const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$
+
+# Regular expression matching correct attribute names
+attr-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Naming hint for attribute names
+attr-name-hint=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression matching correct argument names
+argument-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Naming hint for argument names
+argument-name-hint=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression matching correct class attribute names
+class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
+
+# Naming hint for class attribute names
+class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
+
+# Regular expression matching correct inline iteration names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Naming hint for inline iteration names
+inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$
+
+# Regular expression matching correct class names
+class-rgx=[A-Z_][a-zA-Z0-9]+$
+
+# Naming hint for class names
+class-name-hint=[A-Z_][a-zA-Z0-9]+$
+
+# Regular expression matching correct module names
+module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Naming hint for module names
+module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Regular expression matching correct method names
+method-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Naming hint for method names
+method-name-hint=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match function or class names that do
+# not require a docstring.
+no-docstring-rgx=^_
+
+# Minimum line length for functions/classes that require docstrings, shorter
+# ones are exempt.
+docstring-min-length=-1
+
+
+[ELIF]
+
+# Maximum number of nested blocks for function / method body
+max-nested-blocks=5
+
+
+[LOGGING]
+
+# Logging modules to check that the string format arguments are in logging
+# function parameter format
+logging-modules=logging
+
+
+[TYPECHECK]
+
+# Tells whether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# List of module names for which member attributes should not be checked
+# (useful for modules/projects where namespaces are manipulated during runtime
+# and thus existing member attributes cannot be deduced by static analysis. It
+# supports qualified module names, as well as Unix pattern matching.
+ignored-modules=_ctypes,_winreg,winreg,django.core.serializers,__pyjamas__,gluon.contrib.simplejson,MotionLibrary
+
+# List of class names for which member attributes should not be checked (useful
+# for classes with dynamically set attributes). This supports the use of
+# qualified names.
+ignored-classes=optparse.Values,thread._local,_thread._local
+
+# List of members which are set dynamically and missed by pylint inference
+# system, and so shouldn't trigger E1101 when accessed. Python regular
+# expressions are accepted.
+generated-members=
+
+# List of decorators that produce context managers, such as
+# contextlib.contextmanager. Add to this list to register other decorators that
+# produce valid context managers.
+contextmanager-decorators=contextlib.contextmanager
+
+
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=100
+
+# Regexp for a line that is allowed to be longer than the limit.
+ignore-long-lines=^\s*(# )?<?https?://\S+>?$
+
+# Allow the body of an if to be on the same line as the test if there is no
+# else.
+single-line-if-stmt=no
+
+# List of optional constructs for which whitespace checking is disabled. `dict-
+# separator` is used to allow tabulation in dicts, etc.: {1  : 1,\n222: 2}.
+# `trailing-comma` allows a space between comma and closing bracket: (a, ).
+# `empty-line` allows space-only lines.
+no-space-check=trailing-comma,dict-separator
+
+# Maximum number of lines in a module
+max-module-lines=1000
+
+# String used as indentation unit. This is usually "    " (4 spaces) or "\t" (1
+# tab).
+indent-string='    '
+
+# Number of spaces of indent required inside a hanging  or continued line.
+indent-after-paren=4
+
+# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
+expected-line-ending-format=LF
+
+
+[IMPORTS]
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=regsub,TERMIOS,Bastion,rexec
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report RP0402 must not be disabled)
+import-graph=
+
+# Create a graph of external dependencies in the given file (report RP0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of internal dependencies in the given file (report RP0402 must
+# not be disabled)
+int-import-graph=
+
+# Force import order to recognize a module as part of the standard
+# compatibility libraries.
+known-standard-library=
+
+# Force import order to recognize a module as part of a third party library.
+known-third-party=enchant
+
+# Analyse import fallback blocks. This can be used to support both Python 2 and
+# 3 compatible code, which means that the block might have code that exists
+# only in one or another interpreter, leading to false positives when analysed.
+analyse-fallback-blocks=no
+
+
+[CLASSES]
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+# List of valid names for the first argument in a class method.
+valid-classmethod-first-arg=cls
+
+# List of valid names for the first argument in a metaclass class method.
+valid-metaclass-classmethod-first-arg=mcs
+
+# List of member names, which should be excluded from the protected access
+# warning.
+exclude-protected=_asdict,_fields,_replace,_source,_make
+
+
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=5
+
+# Argument names that match this expression will be ignored. Default to name
+# with leading underscore
+ignored-argument-names=_.*
+
+# Maximum number of locals for function / method body
+max-locals=15
+
+# Maximum number of return / yield for function / method body
+max-returns=6
+
+# Maximum number of branch for function / method body
+max-branches=12
+
+# Maximum number of statements in function / method body
+max-statements=50
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=7
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=2
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+# Maximum number of boolean expressions in a if statement
+max-bool-expr=5
+
+
+[EXCEPTIONS]
+
+# Exceptions that will emit a warning when being caught. Defaults to
+# "Exception"
+overgeneral-exceptions=Exception
--- a/Beremiz.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/Beremiz.py	Mon Jan 07 13:50:39 2019 +0100
@@ -4,7 +4,7 @@
 # This file is part of Beremiz, a Integrated Development Environment for
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2016 - 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,1269 +22,205 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-updateinfo_url = None
-
-import os, sys, getopt
-import __builtin__
-import tempfile
-import shutil
-import random
-import time
-import version
-from types import ListType
-
-beremiz_dir = os.path.dirname(os.path.realpath(__file__))
-
-if __name__ == '__main__':
-    import wxversion
-    wxversion.select(['2.8', '3.0'])
-    import wx
-    
-from wx.lib.agw.advancedsplash import AdvancedSplash
-
-def Bpath(*args):
-    return os.path.join(beremiz_dir,*args)
-
-def ShowSplashScreen():
-    bmp = wx.Image(Bpath("images", "splash.png")).ConvertToBitmap()
-    #splash=AdvancedSplash(None, bitmap=bmp, style=wx.SPLASH_CENTRE_ON_SCREEN, timeout=4000)
-    splash = AdvancedSplash(None, bitmap=bmp)
-
-    # process all events
-    # even the events generated by splash themself during showing
-    for i in range(0,30):
-        wx.Yield()
-        time.sleep(0.01);
-    return splash
-
-if __name__ == '__main__':
-    def usage():
-        print "\nUsage of Beremiz.py :"
-        print "\n   %s [Projectpath] [Buildpath]\n"%sys.argv[0]
-
-    try:
-        opts, args = getopt.getopt(sys.argv[1:], "hu:e:", ["help", "updatecheck=", "extend="])
-    except getopt.GetoptError:
-        # print help information and exit:
-        usage()
-        sys.exit(2)
-
-    extensions=[]
-
-    for o, a in opts:
+
+from __future__ import absolute_import
+from __future__ import print_function
+import os
+import sys
+import getopt
+from past.builtins import execfile
+
+import wx
+from wx.lib.agw.advancedsplash import AdvancedSplash, AS_NOTIMEOUT, AS_CENTER_ON_SCREEN
+
+import util.paths as paths
+
+
+class BeremizIDELauncher(object):
+    def __init__(self):
+        self.app = None
+        self.frame = None
+        self.updateinfo_url = None
+        self.extensions = []
+        self.app_dir = paths.AbsDir(__file__)
+        self.projectOpen = None
+        self.buildpath = None
+        self.splash = None
+        self.splashPath = self.Bpath("images", "splash.png")
+        self.modules = ["BeremizIDE"]
+        self.debug = os.path.exists("BEREMIZ_DEBUG")
+        self.handle_exception = None
+
+    def Bpath(self, *args):
+        return os.path.join(self.app_dir, *args)
+
+    def Usage(self):
+        print("Usage:")
+        print("%s [Options] [Projectpath] [Buildpath]" % sys.argv[0])
+        print("")
+        print("Supported options:")
+        print("-h --help                    Print this help")
+        print("-u --updatecheck URL         Retrieve update information by checking URL")
+        print("-e --extend PathToExtension  Extend IDE functionality by loading at start additional extensions")
+        print("")
+        print("")
+
+    def SetCmdOptions(self):
+        self.shortCmdOpts = "hu:e:"
+        self.longCmdOpts = ["help", "updatecheck=", "extend="]
+
+    def ProcessOption(self, o, a):
         if o in ("-h", "--help"):
-            usage()
+            self.Usage()
             sys.exit()
         if o in ("-u", "--updatecheck"):
-            updateinfo_url = a
+            self.updateinfo_url = a
         if o in ("-e", "--extend"):
-            extensions.append(a)
-
-    if len(args) > 2:
-        usage()
-        sys.exit()
-    elif len(args) == 1:
-        projectOpen = args[0]
-        buildpath = None
-    elif len(args) == 2:
-        projectOpen = args[0]
-        buildpath = args[1]
-    else:
-        projectOpen = None
-        buildpath = None
-
-    if os.path.exists("BEREMIZ_DEBUG"):
-        __builtin__.__dict__["BMZ_DBG"] = True
-    else :
-        __builtin__.__dict__["BMZ_DBG"] = False
-
-    if wx.VERSION >= (3, 0, 0):
-        app = wx.App(redirect=BMZ_DBG)
-    else:
-        app = wx.PySimpleApp(redirect=BMZ_DBG)
-
-    app.SetAppName('beremiz')
-    if wx.VERSION < (3, 0, 0):
-        wx.InitAllImageHandlers()
-
-    # popup splash
-    splash = ShowSplashScreen()
-
-    # load internatialization files
-    from util.misc import InstallLocalRessources
-    InstallLocalRessources(beremiz_dir)
-    
-    if updateinfo_url is not None:
-        updateinfo = _("Fetching %s") % updateinfo_url
-        # warn for possible updates
-        def updateinfoproc():
-            global updateinfo
-            try :
-                import urllib2
-                updateinfo = urllib2.urlopen(updateinfo_url,None).read()
-            except :
-                updateinfo = _("update info unavailable.")
-
-        from threading import Thread
-        splash.SetText(text=updateinfo)
-        wx.Yield()
-        updateinfoThread = Thread(target=updateinfoproc)
-        updateinfoThread.start()
-        updateinfoThread.join(2)
-        splash.SetText(text=updateinfo)
-        wx.Yield()
-
-    # Load extensions
-    for extfilename in extensions:
-        from util.TranslationCatalogs import AddCatalog
-        from util.BitmapLibrary import AddBitmapFolder
-        extension_folder = os.path.split(os.path.realpath(extfilename))[0]
-        sys.path.append(extension_folder)
-        AddCatalog(os.path.join(extension_folder, "locale"))
-        AddBitmapFolder(os.path.join(extension_folder, "images"))
-        execfile(extfilename, locals())
-
-
-import wx.lib.buttons, wx.lib.statbmp, wx.stc
-import cPickle
-import types, time, re, platform, time, traceback, commands
-
-from docutil import OpenHtmlFrame
-from editors.EditorPanel import EditorPanel
-from editors.Viewer import Viewer
-from editors.TextViewer import TextViewer
-from editors.ResourceEditor import ConfigurationEditor, ResourceEditor
-from editors.DataTypeEditor import DataTypeEditor
-from util.MiniTextControler import MiniTextControler
-from util.ProcessLogger import ProcessLogger
-from controls.LogViewer import LogViewer
-from controls.CustomStyledTextCtrl import CustomStyledTextCtrl
-from controls import EnhancedStatusBar as esb
-from dialogs.AboutDialog import ShowAboutDialog
-
-from PLCControler import LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY, ITEM_PROJECT, ITEM_RESOURCE
-from ProjectController import ProjectController, GetAddMenuItems, MATIEC_ERROR_MODEL, ITEM_CONFNODE
-
-
-MAX_RECENT_PROJECTS = 10
-
-if wx.Platform == '__WXMSW__':
-    faces = {
-        'mono' : 'Courier New',
-        'size' : 8,
-    }
-else:
-    faces = {
-        'mono' : 'Courier',
-        'size' : 10,
-    }
-
-from threading import Lock,Timer,currentThread
-MainThread = currentThread().ident
-REFRESH_PERIOD = 0.1
-from time import time as gettime
-class LogPseudoFile:
-    """ Base class for file like objects to facilitate StdOut for the Shell."""
-    def __init__(self, output, risecall):
-        self.red_white = 1
-        self.red_yellow = 2
-        self.black_white = wx.stc.STC_STYLE_DEFAULT
-        self.output = output
-        self.risecall = risecall
-        # to prevent rapid fire on rising log panel
-        self.rising_timer = 0
-        self.lock = Lock()
-        self.YieldLock = Lock()
-        self.RefreshLock = Lock()
-        self.TimerAccessLock = Lock()
-        self.stack = []
-        self.LastRefreshTime = gettime()
-        self.LastRefreshTimer = None
-
-    def write(self, s, style = None):
-        if self.lock.acquire():
-            self.stack.append((s,style))
-            self.lock.release()
-            current_time = gettime()
-            self.TimerAccessLock.acquire()
-            if self.LastRefreshTimer:
-                self.LastRefreshTimer.cancel()
-                self.LastRefreshTimer=None
-            self.TimerAccessLock.release()
-            if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False):
-                self._should_write()
+            self.extensions.append(a)
+
+    def ProcessCommandLineArgs(self):
+        self.SetCmdOptions()
+        try:
+            opts, args = getopt.getopt(sys.argv[1:], self.shortCmdOpts, self.longCmdOpts)
+        except getopt.GetoptError:
+            # print help information and exit:
+            self.Usage()
+            sys.exit(2)
+
+        for o, a in opts:
+            self.ProcessOption(o, a)
+
+        if len(args) > 2:
+            self.Usage()
+            sys.exit()
+
+        elif len(args) == 1:
+            self.projectOpen = args[0]
+            self.buildpath = None
+        elif len(args) == 2:
+            self.projectOpen = args[0]
+            self.buildpath = args[1]
+
+    def CreateApplication(self):
+
+        BeremizAppType = wx.App if wx.VERSION >= (3, 0, 0) else wx.PySimpleApp
+
+        class BeremizApp(BeremizAppType):
+            def OnInit(_self):  # pylint: disable=no-self-argument
+                self.ShowSplashScreen()
+                return True
+
+        self.app = BeremizApp(redirect=self.debug)
+        self.app.SetAppName('beremiz')
+        if wx.VERSION < (3, 0, 0):
+            wx.InitAllImageHandlers()
+
+    def ShowSplashScreen(self):
+        class Splash(AdvancedSplash):
+            Painted = False
+
+            def OnPaint(_self, event):  # pylint: disable=no-self-argument
+                AdvancedSplash.OnPaint(_self, event)
+                if not _self.Painted:  # trigger app start only once
+                    _self.Painted = True
+                    wx.CallAfter(self.AppStart)
+        bmp = wx.Image(self.splashPath).ConvertToBitmap()
+        self.splash = Splash(None,
+                             bitmap=bmp,
+                             agwStyle=AS_NOTIMEOUT | AS_CENTER_ON_SCREEN)
+
+    def BackgroundInitialization(self):
+        self.InitI18n()
+        self.CheckUpdates()
+        self.LoadExtensions()
+        self.ImportModules()
+
+    def InitI18n(self):
+        from util.misc import InstallLocalRessources
+        InstallLocalRessources(self.app_dir)
+
+    def globals(self):
+        """
+        allows customizations to specify what globals
+        are passed to extensions
+        """
+        return globals()
+
+    def LoadExtensions(self):
+        for extfilename in self.extensions:
+            from util.TranslationCatalogs import AddCatalog
+            from util.BitmapLibrary import AddBitmapFolder
+            extension_folder = os.path.split(os.path.realpath(extfilename))[0]
+            sys.path.append(extension_folder)
+            AddCatalog(os.path.join(extension_folder, "locale"))
+            AddBitmapFolder(os.path.join(extension_folder, "images"))
+            execfile(extfilename, self.globals())
+
+    def CheckUpdates(self):
+        if self.updateinfo_url is not None:
+            self.updateinfo = _("Fetching %s") % self.updateinfo_url
+
+            def updateinfoproc():
+                try:
+                    import urllib2
+                    self.updateinfo = urllib2.urlopen(self.updateinfo_url, None).read()
+                except Exception:
+                    self.updateinfo = _("update info unavailable.")
+
+            from threading import Thread
+            self.splash.SetText(text=self.updateinfo)
+            updateinfoThread = Thread(target=updateinfoproc)
+            updateinfoThread.start()
+            updateinfoThread.join(2)
+            self.splash.SetText(text=self.updateinfo)
+
+    def ImportModules(self):
+        for modname in self.modules:
+            mod = __import__(modname)
+            setattr(self, modname, mod)
+
+    def InstallExceptionHandler(self):
+        import version
+        import util.ExceptionHandler
+        self.handle_exception = util.ExceptionHandler.AddExceptHook(version.app_version)
+
+    def CreateUI(self):
+        self.frame = self.BeremizIDE.Beremiz(None, self.projectOpen, self.buildpath)
+
+    def CloseSplash(self):
+        if self.splash:
+            self.splash.Close()
+
+    def ShowUI(self):
+        self.frame.Show()
+
+    def PreStart(self):
+        self.ProcessCommandLineArgs()
+        self.CreateApplication()
+
+    def AppStart(self):
+        try:
+            self.BackgroundInitialization()
+            self.CreateUI()
+            self.CloseSplash()
+            self.ShowUI()
+        except (KeyboardInterrupt, SystemExit):
+            raise
+        except Exception:
+            if self.handle_exception is not None:
+                self.handle_exception(*sys.exc_info(), exit=True)
             else:
-                self.TimerAccessLock.acquire()
-                self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._timer_expired)
-                self.LastRefreshTimer.start()
-                self.TimerAccessLock.release()
-
-    def _timer_expired(self):
-        if self.RefreshLock.acquire(False):
-            self._should_write()
-        else:
-            self.TimerAccessLock.acquire()
-            self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._timer_expired)
-            self.LastRefreshTimer.start()
-            self.TimerAccessLock.release()
-
-    def _should_write(self):
-        wx.CallAfter(self._write)
-        if MainThread == currentThread().ident:
-            app = wx.GetApp()
-            if app is not None:
-                if self.YieldLock.acquire(0):
-                    app.Yield()
-                    self.YieldLock.release()
-
-    def _write(self):
-        if self.output :
-            self.output.Freeze()
-            self.lock.acquire()
-            for s, style in self.stack:
-                if style is None : style=self.black_white
-                if style != self.black_white:
-                    self.output.StartStyling(self.output.GetLength(), 0xff)
-
-                # Temporary deactivate read only mode on StyledTextCtrl for
-                # adding text. It seems that text modifications, even
-                # programmatically, are disabled in StyledTextCtrl when read
-                # only is active
-                start_pos = self.output.GetLength()
-                self.output.SetReadOnly(False)
-                self.output.AppendText(s)
-                self.output.SetReadOnly(True)
-                text_len = self.output.GetLength() - start_pos
-
-                if style != self.black_white:
-                    self.output.SetStyling(text_len, style)
-            self.stack = []
-            self.lock.release()
-            self.output.Thaw()
-            self.LastRefreshTime = gettime()
-            try:
-                self.RefreshLock.release()
-            except:
-                pass
-            newtime = time.time()
-            if newtime - self.rising_timer > 1:
-                self.risecall(self.output)
-            self.rising_timer = newtime
-
-    def write_warning(self, s):
-        self.write(s,self.red_white)
-
-    def write_error(self, s):
-        self.write(s,self.red_yellow)
-
-    def writeyield(self, s):
-        self.write(s)
-        wx.GetApp().Yield()
-
-    def flush(self):
-        # Temporary deactivate read only mode on StyledTextCtrl for clearing
-        # text. It seems that text modifications, even programmatically, are
-        # disabled in StyledTextCtrl when read only is active
-        self.output.SetReadOnly(False)
-        self.output.SetText("")
-        self.output.SetReadOnly(True)
-
-    def isatty(self):
-        return False
-
-ID_FILEMENURECENTPROJECTS = wx.NewId()
-
-from IDEFrame import TITLE,\
-                     EDITORTOOLBAR,\
-                     FILEMENU,\
-                     EDITMENU,\
-                     DISPLAYMENU,\
-                     PROJECTTREE,\
-                     POUINSTANCEVARIABLESPANEL,\
-                     LIBRARYTREE,\
-                     SCALING,\
-                     PAGETITLES,\
-                     IDEFrame, AppendMenu,\
-                     EncodeFileSystemPath, DecodeFileSystemPath
-from util.BitmapLibrary import GetBitmap
-
-class Beremiz(IDEFrame):
-
-    def _init_utils(self):
-        self.ConfNodeMenu = wx.Menu(title='')
-        self.RecentProjectsMenu = wx.Menu(title='')
-
-        IDEFrame._init_utils(self)
-
-    def _init_coll_FileMenu_Items(self, parent):
-        AppendMenu(parent, help='', id=wx.ID_NEW,
-              kind=wx.ITEM_NORMAL, text=_(u'New') + '\tCTRL+N')
-        AppendMenu(parent, help='', id=wx.ID_OPEN,
-              kind=wx.ITEM_NORMAL, text=_(u'Open') + '\tCTRL+O')
-        parent.AppendMenu(ID_FILEMENURECENTPROJECTS, _("&Recent Projects"), self.RecentProjectsMenu)
-        parent.AppendSeparator()
-        AppendMenu(parent, help='', id=wx.ID_SAVE,
-              kind=wx.ITEM_NORMAL, text=_(u'Save') + '\tCTRL+S')
-        AppendMenu(parent, help='', id=wx.ID_SAVEAS,
-              kind=wx.ITEM_NORMAL, text=_(u'Save as') + '\tCTRL+SHIFT+S')
-        AppendMenu(parent, help='', id=wx.ID_CLOSE,
-              kind=wx.ITEM_NORMAL, text=_(u'Close Tab') + '\tCTRL+W')
-        AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL,
-              kind=wx.ITEM_NORMAL, text=_(u'Close Project') + '\tCTRL+SHIFT+W')
-        parent.AppendSeparator()
-        AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP,
-              kind=wx.ITEM_NORMAL, text=_(u'Page Setup') + '\tCTRL+ALT+P')
-        AppendMenu(parent, help='', id=wx.ID_PREVIEW,
-              kind=wx.ITEM_NORMAL, text=_(u'Preview') + '\tCTRL+SHIFT+P')
-        AppendMenu(parent, help='', id=wx.ID_PRINT,
-              kind=wx.ITEM_NORMAL, text=_(u'Print') + '\tCTRL+P')
-        parent.AppendSeparator()
-        AppendMenu(parent, help='', id=wx.ID_EXIT,
-              kind=wx.ITEM_NORMAL, text=_(u'Quit') + '\tCTRL+Q')
-
-        self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW)
-        self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN)
-        self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE)
-        self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, id=wx.ID_SAVEAS)
-        self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE)
-        self.Bind(wx.EVT_MENU, self.OnCloseProjectMenu, id=wx.ID_CLOSE_ALL)
-        self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP)
-        self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW)
-        self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT)
-        self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT)
-
-        self.AddToMenuToolBar([(wx.ID_NEW, "new", _(u'New'), None),
-                               (wx.ID_OPEN, "open", _(u'Open'), None),
-                               (wx.ID_SAVE, "save", _(u'Save'), None),
-                               (wx.ID_SAVEAS, "saveas", _(u'Save As...'), None),
-                               (wx.ID_PRINT, "print", _(u'Print'), None)])
-
-    def _RecursiveAddMenuItems(self, menu, items):
-        for name, text, help, children in items:
-            new_id = wx.NewId()
-            if len(children) > 0:
-                new_menu = wx.Menu(title='')
-                menu.AppendMenu(new_id, text, new_menu)
-                self._RecursiveAddMenuItems(new_menu, children)
-            else:
-                AppendMenu(menu, help=help, id=new_id,
-                       kind=wx.ITEM_NORMAL, text=text)
-                self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name),
-                          id=new_id)
-
-    def _init_coll_AddMenu_Items(self, parent):
-        IDEFrame._init_coll_AddMenu_Items(self, parent, False)
-        self._RecursiveAddMenuItems(parent, GetAddMenuItems())
-
-    def _init_coll_HelpMenu_Items(self, parent):
-        parent.Append(help='', id=wx.ID_ABOUT,
-              kind=wx.ITEM_NORMAL, text=_(u'About'))
-        self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)
-
-    def _init_coll_ConnectionStatusBar_Fields(self, parent):
-        parent.SetFieldsCount(3)
-
-        parent.SetStatusText(number=0, text='')
-        parent.SetStatusText(number=1, text='')
-        parent.SetStatusText(number=2, text='')
-
-        parent.SetStatusWidths([-1, 300, 200])
-
-    def _init_ctrls(self, prnt):
-        IDEFrame._init_ctrls(self, prnt)
-
-        self.EditMenuSize = self.EditMenu.GetMenuItemCount()
-
-        inspectorID = wx.NewId()
-        self.Bind(wx.EVT_MENU, self.OnOpenWidgetInspector, id=inspectorID)
-        accels = [wx.AcceleratorEntry(wx.ACCEL_CTRL|wx.ACCEL_ALT, ord('I'), inspectorID)]
-
-        keyID = wx.NewId()
-        self.Bind(wx.EVT_MENU, self.SwitchFullScrMode, id=keyID)
-        accels += [wx.AcceleratorEntry(wx.ACCEL_NORMAL, wx.WXK_F12, keyID)]
-
-        for method,shortcut in [("Stop",     wx.WXK_F4),
-                                ("Run",      wx.WXK_F5),
-                                ("Transfer", wx.WXK_F6),
-                                ("Connect",  wx.WXK_F7),
-                                ("Build",    wx.WXK_F11)]:
-            def OnMethodGen(obj,meth):
-                def OnMethod(evt):
-                    if obj.CTR is not None:
-                       obj.CTR.CallMethod('_'+meth)
-                    wx.CallAfter(self.RefreshStatusToolBar)
-                return OnMethod
-            newid = wx.NewId()
-            self.Bind(wx.EVT_MENU, OnMethodGen(self,method), id=newid)
-            accels += [wx.AcceleratorEntry(wx.ACCEL_NORMAL, shortcut,newid)]
-
-        self.SetAcceleratorTable(wx.AcceleratorTable(accels))
-
-        self.LogConsole = CustomStyledTextCtrl(
-                  name='LogConsole', parent=self.BottomNoteBook, pos=wx.Point(0, 0),
-                  size=wx.Size(0, 0))
-        self.LogConsole.Bind(wx.EVT_SET_FOCUS, self.OnLogConsoleFocusChanged)
-        self.LogConsole.Bind(wx.EVT_KILL_FOCUS, self.OnLogConsoleFocusChanged)
-        self.LogConsole.Bind(wx.stc.EVT_STC_UPDATEUI, self.OnLogConsoleUpdateUI)
-        self.LogConsole.SetReadOnly(True)
-        self.LogConsole.SetWrapMode(wx.stc.STC_WRAP_CHAR)
-
-        # Define Log Console styles
-        self.LogConsole.StyleSetSpec(wx.stc.STC_STYLE_DEFAULT, "face:%(mono)s,size:%(size)d" % faces)
-        self.LogConsole.StyleClearAll()
-        self.LogConsole.StyleSetSpec(1, "face:%(mono)s,fore:#FF0000,size:%(size)d" % faces)
-        self.LogConsole.StyleSetSpec(2, "face:%(mono)s,fore:#FF0000,back:#FFFF00,size:%(size)d" % faces)
-
-        # Define Log Console markers
-        self.LogConsole.SetMarginSensitive(1, True)
-        self.LogConsole.SetMarginType(1, wx.stc.STC_MARGIN_SYMBOL)
-        self.LogConsole.MarkerDefine(0, wx.stc.STC_MARK_CIRCLE, "BLACK", "RED")
-
-        self.LogConsole.SetModEventMask(wx.stc.STC_MOD_INSERTTEXT)
-
-        self.LogConsole.Bind(wx.stc.EVT_STC_MARGINCLICK, self.OnLogConsoleMarginClick)
-        self.LogConsole.Bind(wx.stc.EVT_STC_MODIFIED, self.OnLogConsoleModified)
-
-        self.MainTabs["LogConsole"] = (self.LogConsole, _("Console"))
-        self.BottomNoteBook.AddPage(*self.MainTabs["LogConsole"])
-        #self.BottomNoteBook.Split(self.BottomNoteBook.GetPageIndex(self.LogConsole), wx.RIGHT)
-
-        self.LogViewer = LogViewer(self.BottomNoteBook, self)
-        self.MainTabs["LogViewer"] = (self.LogViewer, _("PLC Log"))
-        self.BottomNoteBook.AddPage(*self.MainTabs["LogViewer"])
-        #self.BottomNoteBook.Split(self.BottomNoteBook.GetPageIndex(self.LogViewer), wx.RIGHT)
-
-        StatusToolBar = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
-                wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
-        StatusToolBar.SetToolBitmapSize(wx.Size(25, 25))
-        StatusToolBar.Realize()
-        self.Panes["StatusToolBar"] = StatusToolBar
-        self.AUIManager.AddPane(StatusToolBar, wx.aui.AuiPaneInfo().
-                  Name("StatusToolBar").Caption(_("Status ToolBar")).
-                  ToolbarPane().Top().Position(1).
-                  LeftDockable(False).RightDockable(False))
-
-        self.AUIManager.Update()
-
-        self.ConnectionStatusBar = esb.EnhancedStatusBar(self, style=wx.ST_SIZEGRIP)
-        self._init_coll_ConnectionStatusBar_Fields(self.ConnectionStatusBar)
-        self.ProgressStatusBar = wx.Gauge(self.ConnectionStatusBar, -1, range = 100)
-        self.ConnectionStatusBar.AddWidget(self.ProgressStatusBar, esb.ESB_EXACT_FIT, esb.ESB_EXACT_FIT, 2)        
-        self.ProgressStatusBar.Hide()
-        self.SetStatusBar(self.ConnectionStatusBar)
-
-    def __init_execute_path(self):
-        if os.name == 'nt':
-            # on windows, desktop shortcut launches Beremiz.py
-            # with working dir set to mingw/bin.
-            # then we prefix CWD to PATH in order to ensure that
-            # commands invoked by build process by default are
-            # found here.
-            os.environ["PATH"] = os.getcwd()+';'+os.environ["PATH"]
-        
-        
-    def __init__(self, parent, projectOpen=None, buildpath=None, ctr=None, debug=True):
-        # Add beremiz's icon in top left corner of the frame
-        self.icon = wx.Icon(Bpath("images", "brz.ico"), wx.BITMAP_TYPE_ICO)
-        self.__init_execute_path()
-        
-        IDEFrame.__init__(self, parent, debug)
-        self.Log = LogPseudoFile(self.LogConsole,self.SelectTab)
-
-        self.local_runtime = None
-        self.runtime_port = None
-        self.local_runtime_tmpdir = None
-
-        self.LastPanelSelected = None
-
-        # Define Tree item icon list
-        self.LocationImageList = wx.ImageList(16, 16)
-        self.LocationImageDict = {}
-
-        # Icons for location items
-        for imgname, itemtype in [
-            ("CONFIGURATION", LOCATION_CONFNODE),
-            ("RESOURCE",      LOCATION_MODULE),
-            ("PROGRAM",       LOCATION_GROUP),
-            ("VAR_INPUT",     LOCATION_VAR_INPUT),
-            ("VAR_OUTPUT",    LOCATION_VAR_OUTPUT),
-            ("VAR_LOCAL",     LOCATION_VAR_MEMORY)]:
-            self.LocationImageDict[itemtype] = self.LocationImageList.Add(GetBitmap(imgname))
-
-        # Icons for other items
-        for imgname, itemtype in [
-            ("Extension", ITEM_CONFNODE)]:
-            self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(imgname))
-
-        if projectOpen is not None:
-            projectOpen = DecodeFileSystemPath(projectOpen, False)
-
-        if projectOpen is not None and os.path.isdir(projectOpen):
-            self.CTR = ProjectController(self, self.Log)
-            self.Controler = self.CTR
-            result, err = self.CTR.LoadProject(projectOpen, buildpath)
-            if not result:
-                self.LibraryPanel.SetController(self.Controler)
-                self.ProjectTree.Enable(True)
-                self.PouInstanceVariablesPanel.SetController(self.Controler)
-                self.RefreshConfigRecentProjects(os.path.abspath(projectOpen))
-                self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
-            else:
-                self.ResetView()
-                self.ShowErrorMessage(result)
-        else:
-            self.CTR = ctr
-            self.Controler = ctr
-            if ctr is not None:
-                self.LibraryPanel.SetController(self.Controler)
-                self.ProjectTree.Enable(True)
-                self.PouInstanceVariablesPanel.SetController(self.Controler)
-                self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
-        if self.EnableDebug:
-            self.DebugVariablePanel.SetDataProducer(self.CTR)
-
-        self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
-
-        self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
-        self.RefreshAll()
-        self.LogConsole.SetFocus()
-
-    def RefreshTitle(self):
-        name = _("Beremiz")
-        if self.CTR is not None:
-            projectname = self.CTR.GetProjectName()
-            if self.CTR.ProjectTestModified():
-                projectname = "~%s~" % projectname
-            self.SetTitle("%s - %s" % (name, projectname))
-        else:
-            self.SetTitle(name)
-
-    def StartLocalRuntime(self, taskbaricon = True):
-        if (self.local_runtime is None) or (self.local_runtime.exitcode is not None):
-            # create temporary directory for runtime working directory
-            self.local_runtime_tmpdir = tempfile.mkdtemp()
-            # choose an arbitrary random port for runtime
-            self.runtime_port = int(random.random() * 1000) + 61131
-            # launch local runtime
-            self.local_runtime = ProcessLogger(self.Log,
-                "\"%s\" \"%s\" -p %s -i localhost %s %s"%(
-                    sys.executable,
-                    Bpath("Beremiz_service.py"),
-                    self.runtime_port,
-                    {False : "-x 0", True :"-x 1"}[taskbaricon],
-                    self.local_runtime_tmpdir),
-                no_gui=False,
-                timeout=500, keyword = self.local_runtime_tmpdir,
-                cwd = self.local_runtime_tmpdir)
-            self.local_runtime.spin()
-        return self.runtime_port
-
-    def KillLocalRuntime(self):
-        if self.local_runtime is not None:
-            # shutdown local runtime
-            self.local_runtime.kill(gently=False)
-            # clear temp dir
-            shutil.rmtree(self.local_runtime_tmpdir)
-
-            self.local_runtime = None
-
-    def OnOpenWidgetInspector(self, evt):
-        # Activate the widget inspection tool
-        from wx.lib.inspection import InspectionTool
-        if not InspectionTool().initialized:
-            InspectionTool().Init()
-
-        # Find a widget to be selected in the tree.  Use either the
-        # one under the cursor, if any, or this frame.
-        wnd = wx.FindWindowAtPointer()
-        if not wnd:
-            wnd = self
-        InspectionTool().Show(wnd, True)
-
-    def OnLogConsoleFocusChanged(self, event):
-        self.RefreshEditMenu()
-        event.Skip()
-
-    def OnLogConsoleUpdateUI(self, event):
-        self.SetCopyBuffer(self.LogConsole.GetSelectedText(), True)
-        event.Skip()
-
-    def OnLogConsoleMarginClick(self, event):
-        line_idx = self.LogConsole.LineFromPosition(event.GetPosition())
-        wx.CallAfter(self.SearchLineForError, self.LogConsole.GetLine(line_idx))
-        event.Skip()
-
-    def OnLogConsoleModified(self, event):
-        line_idx = self.LogConsole.LineFromPosition(event.GetPosition())
-        line = self.LogConsole.GetLine(line_idx)
-        if line:
-            result = MATIEC_ERROR_MODEL.match(line)
-            if result is not None:
-                self.LogConsole.MarkerAdd(line_idx, 0)
-        event.Skip()
-
-    def SearchLineForError(self, line):
-        if self.CTR is not None:
-            result = MATIEC_ERROR_MODEL.match(line)
-            if result is not None:
-                first_line, first_column, last_line, last_column, error = result.groups()
-                infos = self.CTR.ShowError(self.Log,
-                                                  (int(first_line), int(first_column)),
-                                                  (int(last_line), int(last_column)))
-
-    ## Function displaying an Error dialog in PLCOpenEditor.
-    #  @return False if closing cancelled.
-    def CheckSaveBeforeClosing(self, title=_("Close Project")):
-        if self.CTR.ProjectTestModified():
-            dialog = wx.MessageDialog(self,
-                                      _("There are changes, do you want to save?"),
-                                      title,
-                                      wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
-            answer = dialog.ShowModal()
-            dialog.Destroy()
-            if answer == wx.ID_YES:
-                self.CTR.SaveProject()
-            elif answer == wx.ID_CANCEL:
-                return False
-
-        for idx in xrange(self.TabsOpened.GetPageCount()):
-            window = self.TabsOpened.GetPage(idx)
-            if not window.CheckSaveBeforeClosing():
-                return False
-
-        return True
-
-    def GetTabInfos(self, tab):
-        if (isinstance(tab, EditorPanel) and
-            not isinstance(tab, (Viewer,
-                                 TextViewer,
-                                 ResourceEditor,
-                                 ConfigurationEditor,
-                                 DataTypeEditor))):
-            return ("confnode", tab.Controler.CTNFullName(), tab.GetTagName())
-        elif (isinstance(tab, TextViewer) and
-              (tab.Controler is None or isinstance(tab.Controler, MiniTextControler))):
-            return ("confnode", None, tab.GetInstancePath())
-        else:
-            return IDEFrame.GetTabInfos(self, tab)
-
-    def LoadTab(self, notebook, page_infos):
-        if page_infos[0] == "confnode":
-            if page_infos[1] is None:
-                confnode = self.CTR
-            else:
-                confnode = self.CTR.GetChildByName(page_infos[1])
-            return notebook.GetPageIndex(confnode._OpenView(*page_infos[2:]))
-        else:
-            return IDEFrame.LoadTab(self, notebook, page_infos)
-
-    # Strange hack required by WAMP connector, using twisted.
-    # Twisted reactor needs to be stopped only before quit,
-    # since it cannot be restarted
-    ToDoBeforeQuit = []
-    def AddToDoBeforeQuit(self, Thing):
-        self.ToDoBeforeQuit.append(Thing)
-
-    def OnCloseFrame(self, event):
-        for evt_type in [wx.EVT_SET_FOCUS,
-                         wx.EVT_KILL_FOCUS,
-                         wx.stc.EVT_STC_UPDATEUI]:
-            self.LogConsole.Unbind(evt_type)
-        if self.CTR is None or self.CheckSaveBeforeClosing(_("Close Application")):
-            if self.CTR is not None:
-                self.CTR.KillDebugThread()
-            self.KillLocalRuntime()
-
-            self.SaveLastState()
-
-            for Thing in self.ToDoBeforeQuit :
-                Thing()
-            self.ToDoBeforeQuit = []
-
-            event.Skip()
-        else:
-            event.Veto()
-
-    def RefreshFileMenu(self):
-        self.RefreshRecentProjectsMenu()
-
-        MenuToolBar = self.Panes["MenuToolBar"]
-        if self.CTR is not None:
-            selected = self.TabsOpened.GetSelection()
-            if selected >= 0:
-                window = self.TabsOpened.GetPage(selected)
-                viewer_is_modified = window.IsModified()
-                is_viewer = isinstance(window, Viewer)
-            else:
-                viewer_is_modified = is_viewer = False
-            if self.TabsOpened.GetPageCount() > 0:
-                self.FileMenu.Enable(wx.ID_CLOSE, True)
-                if is_viewer:
-                    self.FileMenu.Enable(wx.ID_PREVIEW, True)
-                    self.FileMenu.Enable(wx.ID_PRINT, True)
-                    MenuToolBar.EnableTool(wx.ID_PRINT, True)
-                else:
-                    self.FileMenu.Enable(wx.ID_PREVIEW, False)
-                    self.FileMenu.Enable(wx.ID_PRINT, False)
-                    MenuToolBar.EnableTool(wx.ID_PRINT, False)
-            else:
-                self.FileMenu.Enable(wx.ID_CLOSE, False)
-                self.FileMenu.Enable(wx.ID_PREVIEW, False)
-                self.FileMenu.Enable(wx.ID_PRINT, False)
-                MenuToolBar.EnableTool(wx.ID_PRINT, False)
-            self.FileMenu.Enable(wx.ID_PAGE_SETUP, True)
-            project_modified = self.CTR.ProjectTestModified() or viewer_is_modified
-            self.FileMenu.Enable(wx.ID_SAVE, project_modified)
-            MenuToolBar.EnableTool(wx.ID_SAVE, project_modified)
-            self.FileMenu.Enable(wx.ID_SAVEAS, True)
-            MenuToolBar.EnableTool(wx.ID_SAVEAS, True)
-            self.FileMenu.Enable(wx.ID_CLOSE_ALL, True)
-        else:
-            self.FileMenu.Enable(wx.ID_CLOSE, False)
-            self.FileMenu.Enable(wx.ID_PAGE_SETUP, False)
-            self.FileMenu.Enable(wx.ID_PREVIEW, False)
-            self.FileMenu.Enable(wx.ID_PRINT, False)
-            MenuToolBar.EnableTool(wx.ID_PRINT, False)
-            self.FileMenu.Enable(wx.ID_SAVE, False)
-            MenuToolBar.EnableTool(wx.ID_SAVE, False)
-            self.FileMenu.Enable(wx.ID_SAVEAS, False)
-            MenuToolBar.EnableTool(wx.ID_SAVEAS, False)
-            self.FileMenu.Enable(wx.ID_CLOSE_ALL, False)
-
-    def RefreshRecentProjectsMenu(self):
-        try:
-            recent_projects = map(DecodeFileSystemPath,
-                                  self.GetConfigEntry("RecentProjects", []))
-        except:
-            recent_projects = []
-
-        while self.RecentProjectsMenu.GetMenuItemCount() > len(recent_projects):
-            item = self.RecentProjectsMenu.FindItemByPosition(0)
-            self.RecentProjectsMenu.RemoveItem(item)
-
-        self.FileMenu.Enable(ID_FILEMENURECENTPROJECTS, len(recent_projects) > 0)
-        for idx, projectpath in enumerate(recent_projects):
-            text = u'%d: %s' % (idx + 1, projectpath)
-
-            if idx < self.RecentProjectsMenu.GetMenuItemCount():
-                item = self.RecentProjectsMenu.FindItemByPosition(idx)
-                id = item.GetId()
-                item.SetItemLabel(text)
-                self.Disconnect(id, id, wx.EVT_BUTTON._getEvtType())
-            else:
-                id = wx.NewId()
-                AppendMenu(self.RecentProjectsMenu, help='', id=id,
-                           kind=wx.ITEM_NORMAL, text=text)
-            self.Bind(wx.EVT_MENU, self.GenerateOpenRecentProjectFunction(projectpath), id=id)
-
-    def GenerateOpenRecentProjectFunction(self, projectpath):
-        def OpenRecentProject(event):
-            if self.CTR is not None and not self.CheckSaveBeforeClosing():
-                return
-
-            self.OpenProject(projectpath)
-        return OpenRecentProject
-
-    def GenerateMenuRecursive(self, items, menu):
-        for kind, infos in items:
-            if isinstance(kind, ListType):
-                text, id = infos
-                submenu = wx.Menu('')
-                self.GenerateMenuRecursive(kind, submenu)
-                menu.AppendMenu(id, text, submenu)
-            elif kind == wx.ITEM_SEPARATOR:
-                menu.AppendSeparator()
-            else:
-                text, id, help, callback = infos
-                AppendMenu(menu, help='', id=id, kind=kind, text=text)
-                if callback is not None:
-                    self.Bind(wx.EVT_MENU, callback, id=id)
-
-    def RefreshEditorToolBar(self):
-        IDEFrame.RefreshEditorToolBar(self)
-        self.AUIManager.GetPane("EditorToolBar").Position(2)
-        self.AUIManager.GetPane("StatusToolBar").Position(1)
-        self.AUIManager.Update()
-
-    def RefreshStatusToolBar(self):
-        StatusToolBar = self.Panes["StatusToolBar"]
-        StatusToolBar.ClearTools()
-
-        if self.CTR is not None:
-
-            for confnode_method in self.CTR.StatusMethods:
-                if "method" in confnode_method and confnode_method.get("shown",True):
-                    id = wx.NewId()
-                    StatusToolBar.AddSimpleTool(id,
-                        GetBitmap(confnode_method.get("bitmap", "Unknown")),
-                        confnode_method["tooltip"])
-                    self.Bind(wx.EVT_MENU, self.GetMenuCallBackFunction(confnode_method["method"]), id=id)
-
-            StatusToolBar.Realize()
-            self.AUIManager.GetPane("StatusToolBar").BestSize(StatusToolBar.GetBestSize()).Show()
-        else:
-            self.AUIManager.GetPane("StatusToolBar").Hide()
-        self.AUIManager.GetPane("EditorToolBar").Position(2)
-        self.AUIManager.GetPane("StatusToolBar").Position(1)
-        self.AUIManager.Update()
-
-    def RefreshEditMenu(self):
-        IDEFrame.RefreshEditMenu(self)
-        if self.FindFocus() == self.LogConsole:
-            self.EditMenu.Enable(wx.ID_COPY, True)
-            self.Panes["MenuToolBar"].EnableTool(wx.ID_COPY, True)
-
-        if self.CTR is not None:
-            selected = self.TabsOpened.GetSelection()
-            if selected >= 0:
-                panel = self.TabsOpened.GetPage(selected)
-            else:
-                panel = None
-            if panel != self.LastPanelSelected:
-                for i in xrange(self.EditMenuSize, self.EditMenu.GetMenuItemCount()):
-                    item = self.EditMenu.FindItemByPosition(self.EditMenuSize)
-                    if item is not None:
-                        if item.IsSeparator():
-                            self.EditMenu.RemoveItem(item)
-                        else:
-                            self.EditMenu.Delete(item.GetId())
-                self.LastPanelSelected = panel
-                if panel is not None:
-                    items = panel.GetConfNodeMenuItems()
-                else:
-                    items = []
-                if len(items) > 0:
-                    self.EditMenu.AppendSeparator()
-                    self.GenerateMenuRecursive(items, self.EditMenu)
-            if panel is not None:
-                panel.RefreshConfNodeMenu(self.EditMenu)
-        else:
-            for i in xrange(self.EditMenuSize, self.EditMenu.GetMenuItemCount()):
-                item = self.EditMenu.FindItemByPosition(i)
-                if item is not None:
-                    if item.IsSeparator():
-                        self.EditMenu.RemoveItem(item)
-                    else:
-                        self.EditMenu.Delete(item.GetId())
-            self.LastPanelSelected = None
-        self.MenuBar.UpdateMenus()
-
-    def RefreshAll(self):
-        self.RefreshStatusToolBar()
-
-    def GetMenuCallBackFunction(self, method):
-        """ Generate the callbackfunc for a given CTR method"""
-        def OnMenu(event):
-            # Disable button to prevent re-entrant call
-            event.GetEventObject().Disable()
-            # Call
-            getattr(self.CTR, method)()
-            # Re-enable button
-            event.GetEventObject().Enable()
-        return OnMenu
-
-    def GetConfigEntry(self, entry_name, default):
-        return cPickle.loads(str(self.Config.Read(entry_name, cPickle.dumps(default))))
-
-    def ResetConnectionStatusBar(self):
-        for field in xrange(self.ConnectionStatusBar.GetFieldsCount()):
-            self.ConnectionStatusBar.SetStatusText('', field)
-
-    def ResetView(self):
-        IDEFrame.ResetView(self)
-        self.ConfNodeInfos = {}
-        if self.CTR is not None:
-            self.CTR.CloseProject()
-        self.CTR = None
-        self.Log.flush()
-        if self.EnableDebug:
-            self.DebugVariablePanel.SetDataProducer(None)
-            self.ResetConnectionStatusBar()
-
-    def RefreshConfigRecentProjects(self, projectpath, err=False):
-        try:
-            recent_projects = map(DecodeFileSystemPath,
-                                  self.GetConfigEntry("RecentProjects", []))
-        except:
-            recent_projects = []
-        if projectpath in recent_projects:
-            recent_projects.remove(projectpath)
-        if not err:
-            recent_projects.insert(0, projectpath)
-        self.Config.Write("RecentProjects", cPickle.dumps(
-            map(EncodeFileSystemPath, recent_projects[:MAX_RECENT_PROJECTS])))
-        self.Config.Flush()
-
-    def ResetPerspective(self):
-        IDEFrame.ResetPerspective(self)
-        self.RefreshStatusToolBar()
-
-    def OnNewProjectMenu(self, event):
-        if self.CTR is not None and not self.CheckSaveBeforeClosing():
-            return
-
-        try:
-            defaultpath = DecodeFileSystemPath(self.Config.Read("lastopenedfolder"))
-        except:
-            defaultpath = os.path.expanduser("~")
-
-        dialog = wx.DirDialog(self , _("Choose a project"), defaultpath)
-        if dialog.ShowModal() == wx.ID_OK:
-            projectpath = dialog.GetPath()
-            self.Config.Write("lastopenedfolder",
-                              EncodeFileSystemPath(os.path.dirname(projectpath)))
-            self.Config.Flush()
-            self.ResetView()
-            ctr = ProjectController(self, self.Log)
-            result = ctr.NewProject(projectpath)
-            if not result:
-                self.CTR = ctr
-                self.Controler = self.CTR
-                self.LibraryPanel.SetController(self.Controler)
-                self.ProjectTree.Enable(True)
-                self.PouInstanceVariablesPanel.SetController(self.Controler)
-                self.RefreshConfigRecentProjects(projectpath)
-                if self.EnableDebug:
-                    self.DebugVariablePanel.SetDataProducer(self.CTR)
-                self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
-            else:
-                self.ResetView()
-                self.ShowErrorMessage(result)
-            self.RefreshAll()
-            self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
-        dialog.Destroy()
-
-    def OnOpenProjectMenu(self, event):
-        if self.CTR is not None and not self.CheckSaveBeforeClosing():
-            return
-
-        try:
-            defaultpath = DecodeFileSystemPath(self.Config.Read("lastopenedfolder"))
-        except:
-            defaultpath = os.path.expanduser("~")
-
-        dialog = wx.DirDialog(self , _("Choose a project"), defaultpath, style=wx.DEFAULT_DIALOG_STYLE|
-                                                                               wx.RESIZE_BORDER)
-        if dialog.ShowModal() == wx.ID_OK:
-            self.OpenProject(dialog.GetPath())
-        dialog.Destroy()
-
-    def OpenProject(self, projectpath):
-        if os.path.isdir(projectpath):
-            self.Config.Write("lastopenedfolder",
-                              EncodeFileSystemPath(os.path.dirname(projectpath)))
-            self.Config.Flush()
-            self.ResetView()
-            self.CTR = ProjectController(self, self.Log)
-            self.Controler = self.CTR
-            result, err = self.CTR.LoadProject(projectpath)
-            if not result:
-                self.LibraryPanel.SetController(self.Controler)
-                self.ProjectTree.Enable(True)
-                self.PouInstanceVariablesPanel.SetController(self.Controler)
-                if self.EnableDebug:
-                    self.DebugVariablePanel.SetDataProducer(self.CTR)
-                self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
-            else:
-                self.ResetView()
-                self.ShowErrorMessage(result)
-            self.RefreshAll()
-            self.SearchResultPanel.ResetSearchResults()
-        else:
-            self.ShowErrorMessage(_("\"%s\" folder is not a valid Beremiz project\n") % projectpath)
-            err = True
-        self.RefreshConfigRecentProjects(projectpath, err)
-        self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
-
-    def OnCloseProjectMenu(self, event):
-        if self.CTR is not None and not self.CheckSaveBeforeClosing():
-            return
-
-        self.ResetView()
-        self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
-        self.RefreshAll()
-
-    def OnSaveProjectMenu(self, event):
-        selected = self.TabsOpened.GetSelection()
-        if selected != -1:
-            window = self.TabsOpened.GetPage(selected)
-            window.Save()
-        if self.CTR is not None:
-            self.CTR.SaveProject()
-            self.RefreshAll()
-            self._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES)
-
-    def OnSaveProjectAsMenu(self, event):
-        selected = self.TabsOpened.GetSelection()
-        if selected != -1:
-            window = self.TabsOpened.GetPage(selected)
-            window.SaveAs()
-        if self.CTR is not None:
-            self.CTR.SaveProjectAs()
-            self.RefreshAll()
-            self.RefreshConfigRecentProjects(self.CTR.ProjectPath)
-            self._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES)
-
-    def OnQuitMenu(self, event):
-        self.Close()
-
-    def OnAboutMenu(self, event):
-        info = version.GetAboutDialogInfo()        
-        ShowAboutDialog(self, info)
-
-    def OnProjectTreeItemBeginEdit(self, event):
-        selected = event.GetItem()
-        if self.ProjectTree.GetPyData(selected)["type"] == ITEM_CONFNODE:
-            event.Veto()
-        else:
-            IDEFrame.OnProjectTreeItemBeginEdit(self, event)
-
-    def OnProjectTreeRightUp(self, event):
-        item = event.GetItem()
-        item_infos = self.ProjectTree.GetPyData(item)
-
-        if item_infos["type"] == ITEM_CONFNODE:
-            confnode_menu = wx.Menu(title='')
-
-            confnode = item_infos["confnode"]
-            if confnode is not None:
-                menu_items = confnode.GetContextualMenuItems()
-                if menu_items is not None:
-                    for text, help, callback in menu_items:
-                        new_id = wx.NewId()
-                        confnode_menu.Append(help=help, id=new_id, kind=wx.ITEM_NORMAL, text=text)
-                        self.Bind(wx.EVT_MENU, callback, id=new_id)
-                else:
-                    for name, XSDClass, help in confnode.CTNChildrenTypes:
-                        new_id = wx.NewId()
-                        confnode_menu.Append(help=help, id=new_id, kind=wx.ITEM_NORMAL, text=_("Add") + " " + name)
-                        self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name, confnode), id=new_id)
-
-            new_id = wx.NewId()
-            AppendMenu(confnode_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete"))
-            self.Bind(wx.EVT_MENU, self.GetDeleteMenuFunction(confnode), id=new_id)
-
-            self.PopupMenu(confnode_menu)
-            confnode_menu.Destroy()
-
-            event.Skip()
-        elif item_infos["type"] == ITEM_RESOURCE:
-            # prevent last resource to be delted
-            parent = self.ProjectTree.GetItemParent(item)
-            parent_name = self.ProjectTree.GetItemText(parent)
-            if parent_name == _("Resources"):
-                IDEFrame.OnProjectTreeRightUp(self, event)
-        else:
-            IDEFrame.OnProjectTreeRightUp(self, event)
-
-    def OnProjectTreeItemActivated(self, event):
-        selected = event.GetItem()
-        name = self.ProjectTree.GetItemText(selected)
-        item_infos = self.ProjectTree.GetPyData(selected)
-        if item_infos["type"] == ITEM_CONFNODE:
-            item_infos["confnode"]._OpenView()
-            event.Skip()
-        elif item_infos["type"] == ITEM_PROJECT:
-            self.CTR._OpenView()
-        else:
-            IDEFrame.OnProjectTreeItemActivated(self, event)
-
-    def ProjectTreeItemSelect(self, select_item):
-        if select_item is not None and select_item.IsOk():
-            name = self.ProjectTree.GetItemText(select_item)
-            item_infos = self.ProjectTree.GetPyData(select_item)
-            if item_infos["type"] == ITEM_CONFNODE:
-                item_infos["confnode"]._OpenView(onlyopened=True)
-            elif item_infos["type"] == ITEM_PROJECT:
-                self.CTR._OpenView(onlyopened=True)
-            else:
-                IDEFrame.ProjectTreeItemSelect(self, select_item)
-
-    def SelectProjectTreeItem(self, tagname):
-        if self.ProjectTree is not None:
-            root = self.ProjectTree.GetRootItem()
-            if root.IsOk():
-                words = tagname.split("::")
-                if len(words) == 1:
-                    if tagname == "Project":
-                        self.SelectedItem = root
-                        self.ProjectTree.SelectItem(root)
-                        self.ResetSelectedItem()
-                    else:
-                        return self.RecursiveProjectTreeItemSelection(root,
-                              [(word, ITEM_CONFNODE) for word in tagname.split(".")])
-                elif words[0] == "R":
-                    return self.RecursiveProjectTreeItemSelection(root, [(words[2], ITEM_RESOURCE)])
-                elif not os.path.exists(words[0]):
-                    IDEFrame.SelectProjectTreeItem(self, tagname)
-
-    def GetAddConfNodeFunction(self, name, confnode=None):
-        def AddConfNodeMenuFunction(event):
-            wx.CallAfter(self.AddConfNode, name, confnode)
-        return AddConfNodeMenuFunction
-
-    def GetDeleteMenuFunction(self, confnode):
-        def DeleteMenuFunction(event):
-            wx.CallAfter(self.DeleteConfNode, confnode)
-        return DeleteMenuFunction
-
-    def AddConfNode(self, ConfNodeType, confnode=None):
-        if self.CTR.CheckProjectPathPerm():
-            ConfNodeName = "%s_0" % ConfNodeType
-            if confnode is not None:
-                confnode.CTNAddChild(ConfNodeName, ConfNodeType)
-            else:
-                self.CTR.CTNAddChild(ConfNodeName, ConfNodeType)
-            self._Refresh(TITLE, FILEMENU, PROJECTTREE)
-
-    def DeleteConfNode(self, confnode):
-        if self.CTR.CheckProjectPathPerm():
-            dialog = wx.MessageDialog(self,
-                _("Really delete node '%s'?") % confnode.CTNName(),
-                _("Remove %s node") % confnode.CTNType,
-                wx.YES_NO|wx.NO_DEFAULT)
-            if dialog.ShowModal() == wx.ID_YES:
-                confnode.CTNRemove()
-                del confnode
-                self._Refresh(TITLE, FILEMENU, PROJECTTREE)
-            dialog.Destroy()
-
-#-------------------------------------------------------------------------------
-#                        Highlights showing functions
-#-------------------------------------------------------------------------------
-
-    def ShowHighlight(self, infos, start, end, highlight_type):
-        config_name = self.Controler.GetProjectMainConfigurationName()
-        if config_name is not None and infos[0] == self.Controler.ComputeConfigurationName(config_name):
-            self.CTR._OpenView()
-            selected = self.TabsOpened.GetSelection()
-            if selected != -1:
-                viewer = self.TabsOpened.GetPage(selected)
-                viewer.AddHighlight(infos[1:], start, end, highlight_type)
-        else:
-            IDEFrame.ShowHighlight(self, infos, start, end, highlight_type)
-
-#-------------------------------------------------------------------------------
-#                               Exception Handler
-#-------------------------------------------------------------------------------
-import threading, traceback
-
-Max_Traceback_List_Size = 20
-
-def Display_Exception_Dialog(e_type, e_value, e_tb, bug_report_path):
-    trcbck_lst = []
-    for i,line in enumerate(traceback.extract_tb(e_tb)):
-        trcbck = " " + str(i+1) + ". "
-        if line[0].find(os.getcwd()) == -1:
-            trcbck += "file : " + str(line[0]) + ",   "
-        else:
-            trcbck += "file : " + str(line[0][len(os.getcwd()):]) + ",   "
-        trcbck += "line : " + str(line[1]) + ",   " + "function : " + str(line[2])
-        trcbck_lst.append(trcbck)
-
-    # Allow clicking....
-    cap = wx.Window_GetCapture()
-    if cap:
-        cap.ReleaseMouse()
-
-    dlg = wx.SingleChoiceDialog(None,
-        _("""
-An unhandled exception (bug) occured. Bug report saved at :
-(%s)
-
-Please be kind enough to send this file to:
-beremiz-devel@lists.sourceforge.net
-
-You should now restart program.
-
-Traceback:
-""") % bug_report_path +
-        repr(e_type) + " : " + repr(e_value),
-        _("Error"),
-        trcbck_lst)
-    try:
-        res = (dlg.ShowModal() == wx.ID_OK)
-    finally:
-        dlg.Destroy()
-
-    return res
-
-def get_last_traceback(tb):
-    while tb.tb_next:
-        tb = tb.tb_next
-    return tb
-
-
-def format_namespace(d, indent='    '):
-    return '\n'.join(['%s%s: %s' % (indent, k, repr(v)[:10000]) for k, v in d.iteritems()])
-
-
-ignored_exceptions = [] # a problem with a line in a module is only reported once per session
-
-def AddExceptHook(path, app_version='[No version]'):#, ignored_exceptions=[]):
-
-    def handle_exception(e_type, e_value, e_traceback):
-        traceback.print_exception(e_type, e_value, e_traceback) # this is very helpful when there's an exception in the rest of this func
-        last_tb = get_last_traceback(e_traceback)
-        ex = (last_tb.tb_frame.f_code.co_filename, last_tb.tb_frame.f_lineno)
-        if ex not in ignored_exceptions:
-            date = time.ctime()
-            bug_report_path = path+os.sep+"bug_report_"+date.replace(':','-').replace(' ','_')+".txt"
-            result = Display_Exception_Dialog(e_type,e_value,e_traceback,bug_report_path)
-            if result:
-                ignored_exceptions.append(ex)
-                info = {
-                    'app-title' : wx.GetApp().GetAppName(), # app_title
-                    'app-version' : app_version,
-                    'wx-version' : wx.VERSION_STRING,
-                    'wx-platform' : wx.Platform,
-                    'python-version' : platform.python_version(), #sys.version.split()[0],
-                    'platform' : platform.platform(),
-                    'e-type' : e_type,
-                    'e-value' : e_value,
-                    'date' : date,
-                    'cwd' : os.getcwd(),
-                    }
-                if e_traceback:
-                    info['traceback'] = ''.join(traceback.format_tb(e_traceback)) + '%s: %s' % (e_type, e_value)
-                    last_tb = get_last_traceback(e_traceback)
-                    exception_locals = last_tb.tb_frame.f_locals # the locals at the level of the stack trace where the exception actually occurred
-                    info['locals'] = format_namespace(exception_locals)
-                    if 'self' in exception_locals:
-                        try :
-                            info['self'] = format_namespace(exception_locals['self'].__dict__)
-                        except :
-                            pass
-
-                output = open(bug_report_path,'w')
-                lst = info.keys()
-                lst.sort()
-                for a in lst:
-                    output.write(a+":\n"+str(info[a])+"\n\n")
-
-    #sys.excepthook = lambda *args: wx.CallAfter(handle_exception, *args)
-    sys.excepthook = handle_exception
-
-    init_old = threading.Thread.__init__
-    def init(self, *args, **kwargs):
-        init_old(self, *args, **kwargs)
-        run_old = self.run
-        def run_with_except_hook(*args, **kw):
-            try:
-                run_old(*args, **kw)
-            except (KeyboardInterrupt, SystemExit):
                 raise
-            except:
-                sys.excepthook(*sys.exc_info())
-        self.run = run_with_except_hook
-    threading.Thread.__init__ = init
+
+    def MainLoop(self):
+        self.app.MainLoop()
+
+    def Start(self):
+        self.PreStart()
+        self.InstallExceptionHandler()
+        self.MainLoop()
+
 
 if __name__ == '__main__':
-    # Install a exception handle for bug reports
-    AddExceptHook(os.getcwd(),version.app_version)
-
-    frame = Beremiz(None, projectOpen, buildpath)
-    if splash:
-        splash.Close()
-    frame.Show()
-    app.MainLoop()
+    beremiz = BeremizIDELauncher()
+    beremiz.Start()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BeremizIDE.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,1102 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2016: Andrey Skvortsov <andrej.skvortzov@gmail.com>
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+
+from __future__ import absolute_import
+from __future__ import print_function
+import os
+import sys
+import tempfile
+import shutil
+import random
+import time
+from time import time as gettime
+from threading import Lock, Timer, currentThread
+
+from six.moves import cPickle, xrange
+import wx.lib.buttons
+import wx.lib.statbmp
+import wx.stc
+
+
+import version
+from editors.EditorPanel import EditorPanel
+from editors.Viewer import Viewer
+from editors.TextViewer import TextViewer
+from editors.ResourceEditor import ConfigurationEditor, ResourceEditor
+from editors.DataTypeEditor import DataTypeEditor
+from util import paths as paths
+from util.MiniTextControler import MiniTextControler
+from util.ProcessLogger import ProcessLogger
+from util.BitmapLibrary import GetBitmap
+from controls.LogViewer import LogViewer
+from controls.CustomStyledTextCtrl import CustomStyledTextCtrl
+from controls import EnhancedStatusBar as esb
+from dialogs.AboutDialog import ShowAboutDialog
+
+from plcopen.types_enums import \
+    ComputeConfigurationName, \
+    LOCATION_CONFNODE, \
+    LOCATION_MODULE, \
+    LOCATION_GROUP, \
+    LOCATION_VAR_INPUT, \
+    LOCATION_VAR_OUTPUT, \
+    LOCATION_VAR_MEMORY, \
+    ITEM_PROJECT, \
+    ITEM_RESOURCE, \
+    ITEM_CONFNODE
+
+from ProjectController import ProjectController, GetAddMenuItems, MATIEC_ERROR_MODEL
+
+from IDEFrame import \
+    TITLE,\
+    EDITORTOOLBAR,\
+    FILEMENU,\
+    EDITMENU,\
+    DISPLAYMENU,\
+    PROJECTTREE,\
+    POUINSTANCEVARIABLESPANEL,\
+    LIBRARYTREE,\
+    PAGETITLES,\
+    IDEFrame, \
+    AppendMenu,\
+    EncodeFileSystemPath, \
+    DecodeFileSystemPath
+
+
+beremiz_dir = paths.AbsDir(__file__)
+
+
+def Bpath(*args):
+    return os.path.join(beremiz_dir, *args)
+
+
+MAX_RECENT_PROJECTS = 9
+
+
+if wx.Platform == '__WXMSW__':
+    faces = {
+        'mono': 'Courier New',
+        'size': 8,
+    }
+else:
+    faces = {
+        'mono': 'Courier',
+        'size': 10,
+    }
+
+
+MainThread = currentThread().ident
+REFRESH_PERIOD = 0.1
+
+
+class LogPseudoFile(object):
+    """ Base class for file like objects to facilitate StdOut for the Shell."""
+    def __init__(self, output, risecall):
+        self.red_white = 1
+        self.red_yellow = 2
+        self.black_white = wx.stc.STC_STYLE_DEFAULT
+        self.output = output
+        self.risecall = risecall
+        # to prevent rapid fire on rising log panel
+        self.rising_timer = 0
+        self.lock = Lock()
+        self.YieldLock = Lock()
+        self.RefreshLock = Lock()
+        self.TimerAccessLock = Lock()
+        self.stack = []
+        self.LastRefreshTime = gettime()
+        self.LastRefreshTimer = None
+
+    def write(self, s, style=None):
+        if self.lock.acquire():
+            self.stack.append((s, style))
+            self.lock.release()
+            current_time = gettime()
+            self.TimerAccessLock.acquire()
+            if self.LastRefreshTimer:
+                self.LastRefreshTimer.cancel()
+                self.LastRefreshTimer = None
+            self.TimerAccessLock.release()
+            if current_time - self.LastRefreshTime > REFRESH_PERIOD and self.RefreshLock.acquire(False):
+                self._should_write()
+            else:
+                self.TimerAccessLock.acquire()
+                self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._timer_expired)
+                self.LastRefreshTimer.start()
+                self.TimerAccessLock.release()
+
+    def _timer_expired(self):
+        if self.RefreshLock.acquire(False):
+            self._should_write()
+        else:
+            self.TimerAccessLock.acquire()
+            self.LastRefreshTimer = Timer(REFRESH_PERIOD, self._timer_expired)
+            self.LastRefreshTimer.start()
+            self.TimerAccessLock.release()
+
+    def _should_write(self):
+        app = wx.GetApp()
+        if app is not None:
+            wx.CallAfter(self._write)
+
+        if MainThread == currentThread().ident:
+            if app is not None:
+                if self.YieldLock.acquire(0):
+                    app.Yield()
+                    self.YieldLock.release()
+
+    def _write(self):
+        if self.output:
+            self.output.Freeze()
+            self.lock.acquire()
+            for s, style in self.stack:
+                if style is None:
+                    style = self.black_white
+                if style != self.black_white:
+                    self.output.StartStyling(self.output.GetLength(), 0xff)
+
+                # Temporary deactivate read only mode on StyledTextCtrl for
+                # adding text. It seems that text modifications, even
+                # programmatically, are disabled in StyledTextCtrl when read
+                # only is active
+                start_pos = self.output.GetLength()
+                self.output.SetReadOnly(False)
+                self.output.AppendText(s)
+                self.output.SetReadOnly(True)
+                text_len = self.output.GetLength() - start_pos
+
+                if style != self.black_white:
+                    self.output.SetStyling(text_len, style)
+            self.stack = []
+            self.lock.release()
+            self.output.Thaw()
+            self.LastRefreshTime = gettime()
+            try:
+                self.RefreshLock.release()
+            except Exception:
+                pass
+            newtime = time.time()
+            if newtime - self.rising_timer > 1:
+                self.risecall(self.output)
+            self.rising_timer = newtime
+
+    def write_warning(self, s):
+        self.write(s, self.red_white)
+
+    def write_error(self, s):
+        self.write(s, self.red_yellow)
+
+    def writeyield(self, s):
+        self.write(s)
+        wx.GetApp().Yield()
+
+    def flush(self):
+        # Temporary deactivate read only mode on StyledTextCtrl for clearing
+        # text. It seems that text modifications, even programmatically, are
+        # disabled in StyledTextCtrl when read only is active
+        self.output.SetReadOnly(False)
+        self.output.SetText("")
+        self.output.SetReadOnly(True)
+
+    def isatty(self):
+        return False
+
+
+ID_FILEMENURECENTPROJECTS = wx.NewId()
+
+
+class Beremiz(IDEFrame):
+
+    def _init_utils(self):
+        self.ConfNodeMenu = wx.Menu(title='')
+        self.RecentProjectsMenu = wx.Menu(title='')
+
+        IDEFrame._init_utils(self)
+
+    def _init_coll_FileMenu_Items(self, parent):
+        AppendMenu(parent, help='', id=wx.ID_NEW,
+                   kind=wx.ITEM_NORMAL, text=_(u'New') + '\tCTRL+N')
+        AppendMenu(parent, help='', id=wx.ID_OPEN,
+                   kind=wx.ITEM_NORMAL, text=_(u'Open') + '\tCTRL+O')
+        parent.AppendMenu(ID_FILEMENURECENTPROJECTS, _("&Recent Projects"), self.RecentProjectsMenu)
+        parent.AppendSeparator()
+        AppendMenu(parent, help='', id=wx.ID_SAVE,
+                   kind=wx.ITEM_NORMAL, text=_(u'Save') + '\tCTRL+S')
+        AppendMenu(parent, help='', id=wx.ID_SAVEAS,
+                   kind=wx.ITEM_NORMAL, text=_(u'Save as') + '\tCTRL+SHIFT+S')
+        AppendMenu(parent, help='', id=wx.ID_CLOSE,
+                   kind=wx.ITEM_NORMAL, text=_(u'Close Tab') + '\tCTRL+W')
+        AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL,
+                   kind=wx.ITEM_NORMAL, text=_(u'Close Project') + '\tCTRL+SHIFT+W')
+        parent.AppendSeparator()
+        AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP,
+                   kind=wx.ITEM_NORMAL, text=_(u'Page Setup') + '\tCTRL+ALT+P')
+        AppendMenu(parent, help='', id=wx.ID_PREVIEW,
+                   kind=wx.ITEM_NORMAL, text=_(u'Preview') + '\tCTRL+SHIFT+P')
+        AppendMenu(parent, help='', id=wx.ID_PRINT,
+                   kind=wx.ITEM_NORMAL, text=_(u'Print') + '\tCTRL+P')
+        parent.AppendSeparator()
+        AppendMenu(parent, help='', id=wx.ID_EXIT,
+                   kind=wx.ITEM_NORMAL, text=_(u'Quit') + '\tCTRL+Q')
+
+        self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW)
+        self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN)
+        self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE)
+        self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, id=wx.ID_SAVEAS)
+        self.Bind(wx.EVT_MENU, self.OnCloseTabMenu, id=wx.ID_CLOSE)
+        self.Bind(wx.EVT_MENU, self.OnCloseProjectMenu, id=wx.ID_CLOSE_ALL)
+        self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP)
+        self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW)
+        self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT)
+        self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT)
+
+        self.AddToMenuToolBar([(wx.ID_NEW, "new", _(u'New'), None),
+                               (wx.ID_OPEN, "open", _(u'Open'), None),
+                               (wx.ID_SAVE, "save", _(u'Save'), None),
+                               (wx.ID_SAVEAS, "saveas", _(u'Save As...'), None),
+                               (wx.ID_PRINT, "print", _(u'Print'), None)])
+
+    def _RecursiveAddMenuItems(self, menu, items):
+        for name, text, help, children in items:
+            new_id = wx.NewId()
+            if len(children) > 0:
+                new_menu = wx.Menu(title='')
+                menu.AppendMenu(new_id, text, new_menu)
+                self._RecursiveAddMenuItems(new_menu, children)
+            else:
+                AppendMenu(menu, help=help, id=new_id,
+                           kind=wx.ITEM_NORMAL, text=text)
+                self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name),
+                          id=new_id)
+
+    def _init_coll_AddMenu_Items(self, parent):
+        IDEFrame._init_coll_AddMenu_Items(self, parent, False)
+        self._RecursiveAddMenuItems(parent, GetAddMenuItems())
+
+    def _init_coll_HelpMenu_Items(self, parent):
+        def handler(event):
+            return wx.MessageBox(
+                version.GetCommunityHelpMsg(),
+                _(u'Community support'),
+                wx.OK | wx.ICON_INFORMATION)
+
+        id = wx.NewId()
+        parent.Append(help='', id=id, kind=wx.ITEM_NORMAL, text=_(u'Community support'))
+        self.Bind(wx.EVT_MENU, handler, id=id)
+
+        parent.Append(help='', id=wx.ID_ABOUT,
+                      kind=wx.ITEM_NORMAL, text=_(u'About'))
+        self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)
+
+    def _init_coll_ConnectionStatusBar_Fields(self, parent):
+        parent.SetFieldsCount(3)
+
+        parent.SetStatusText(number=0, text='')
+        parent.SetStatusText(number=1, text='')
+        parent.SetStatusText(number=2, text='')
+
+        parent.SetStatusWidths([-1, 300, 200])
+
+    def _init_ctrls(self, prnt):
+        IDEFrame._init_ctrls(self, prnt)
+
+        self.EditMenuSize = self.EditMenu.GetMenuItemCount()
+
+        inspectorID = wx.NewId()
+        self.Bind(wx.EVT_MENU, self.OnOpenWidgetInspector, id=inspectorID)
+        accels = [wx.AcceleratorEntry(wx.ACCEL_CTRL | wx.ACCEL_ALT, ord('I'), inspectorID)]
+
+        for method, shortcut in [("Stop",     wx.WXK_F4),
+                                 ("Run",      wx.WXK_F5),
+                                 ("Transfer", wx.WXK_F6),
+                                 ("Connect",  wx.WXK_F7),
+                                 ("Build",    wx.WXK_F11)]:
+            def OnMethodGen(obj, meth):
+                def OnMethod(evt):
+                    if obj.CTR is not None:
+                        obj.CTR.CallMethod('_'+meth)
+                    wx.CallAfter(self.RefreshStatusToolBar)
+                return OnMethod
+            newid = wx.NewId()
+            self.Bind(wx.EVT_MENU, OnMethodGen(self, method), id=newid)
+            accels += [wx.AcceleratorEntry(wx.ACCEL_NORMAL, shortcut, newid)]
+
+        self.SetAcceleratorTable(wx.AcceleratorTable(accels))
+
+        self.LogConsole = CustomStyledTextCtrl(
+            name='LogConsole', parent=self.BottomNoteBook, pos=wx.Point(0, 0),
+            size=wx.Size(0, 0))
+        self.LogConsole.Bind(wx.EVT_SET_FOCUS, self.OnLogConsoleFocusChanged)
+        self.LogConsole.Bind(wx.EVT_KILL_FOCUS, self.OnLogConsoleFocusChanged)
+        self.LogConsole.Bind(wx.stc.EVT_STC_UPDATEUI, self.OnLogConsoleUpdateUI)
+        self.LogConsole.SetReadOnly(True)
+        self.LogConsole.SetWrapMode(wx.stc.STC_WRAP_CHAR)
+
+        # Define Log Console styles
+        self.LogConsole.StyleSetSpec(wx.stc.STC_STYLE_DEFAULT, "face:%(mono)s,size:%(size)d" % faces)
+        self.LogConsole.StyleClearAll()
+        self.LogConsole.StyleSetSpec(1, "face:%(mono)s,fore:#FF0000,size:%(size)d" % faces)
+        self.LogConsole.StyleSetSpec(2, "face:%(mono)s,fore:#FF0000,back:#FFFF00,size:%(size)d" % faces)
+
+        # Define Log Console markers
+        self.LogConsole.SetMarginSensitive(1, True)
+        self.LogConsole.SetMarginType(1, wx.stc.STC_MARGIN_SYMBOL)
+        self.LogConsole.MarkerDefine(0, wx.stc.STC_MARK_CIRCLE, "BLACK", "RED")
+
+        self.LogConsole.SetModEventMask(wx.stc.STC_MOD_INSERTTEXT)
+
+        self.LogConsole.Bind(wx.stc.EVT_STC_MARGINCLICK, self.OnLogConsoleMarginClick)
+        self.LogConsole.Bind(wx.stc.EVT_STC_MODIFIED, self.OnLogConsoleModified)
+
+        self.MainTabs["LogConsole"] = (self.LogConsole, _("Console"))
+        self.BottomNoteBook.AddPage(*self.MainTabs["LogConsole"])
+        # self.BottomNoteBook.Split(self.BottomNoteBook.GetPageIndex(self.LogConsole), wx.RIGHT)
+
+        self.LogViewer = LogViewer(self.BottomNoteBook, self)
+        self.MainTabs["LogViewer"] = (self.LogViewer, _("PLC Log"))
+        self.BottomNoteBook.AddPage(*self.MainTabs["LogViewer"])
+        # self.BottomNoteBook.Split(self.BottomNoteBook.GetPageIndex(self.LogViewer), wx.RIGHT)
+
+        StatusToolBar = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
+                                   wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
+        StatusToolBar.SetToolBitmapSize(wx.Size(25, 25))
+        StatusToolBar.Realize()
+        self.Panes["StatusToolBar"] = StatusToolBar
+        self.AUIManager.AddPane(StatusToolBar, wx.aui.AuiPaneInfo().
+                                Name("StatusToolBar").Caption(_("Status ToolBar")).
+                                ToolbarPane().Top().Position(1).
+                                LeftDockable(False).RightDockable(False))
+
+        self.AUIManager.Update()
+
+        self.ConnectionStatusBar = esb.EnhancedStatusBar(self, style=wx.ST_SIZEGRIP)
+        self._init_coll_ConnectionStatusBar_Fields(self.ConnectionStatusBar)
+        self.ProgressStatusBar = wx.Gauge(self.ConnectionStatusBar, -1, range=100)
+        self.ConnectionStatusBar.AddWidget(self.ProgressStatusBar, esb.ESB_EXACT_FIT, esb.ESB_EXACT_FIT, 2)
+        self.ProgressStatusBar.Hide()
+        self.SetStatusBar(self.ConnectionStatusBar)
+
+    def __init_execute_path(self):
+        if os.name == 'nt':
+            # on windows, desktop shortcut launches Beremiz.py
+            # with working dir set to mingw/bin.
+            # then we prefix CWD to PATH in order to ensure that
+            # commands invoked by build process by default are
+            # found here.
+            os.environ["PATH"] = os.getcwd()+';'+os.environ["PATH"]
+
+    def __init__(self, parent, projectOpen=None, buildpath=None, ctr=None, debug=True):
+        # Add beremiz's icon in top left corner of the frame
+        self.icon = wx.Icon(Bpath("images", "brz.ico"), wx.BITMAP_TYPE_ICO)
+        self.__init_execute_path()
+
+        IDEFrame.__init__(self, parent, debug)
+        self.Log = LogPseudoFile(self.LogConsole, self.SelectTab)
+
+        self.local_runtime = None
+        self.runtime_port = None
+        self.local_runtime_tmpdir = None
+
+        self.LastPanelSelected = None
+
+        # Define Tree item icon list
+        self.LocationImageList = wx.ImageList(16, 16)
+        self.LocationImageDict = {}
+
+        # Icons for location items
+        for imgname, itemtype in [
+                ("CONFIGURATION", LOCATION_CONFNODE),
+                ("RESOURCE",      LOCATION_MODULE),
+                ("PROGRAM",       LOCATION_GROUP),
+                ("VAR_INPUT",     LOCATION_VAR_INPUT),
+                ("VAR_OUTPUT",    LOCATION_VAR_OUTPUT),
+                ("VAR_LOCAL",     LOCATION_VAR_MEMORY)]:
+            self.LocationImageDict[itemtype] = self.LocationImageList.Add(GetBitmap(imgname))
+
+        # Icons for other items
+        for imgname, itemtype in [
+                ("Extension", ITEM_CONFNODE)]:
+            self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(imgname))
+
+        if projectOpen is not None:
+            projectOpen = DecodeFileSystemPath(projectOpen, False)
+
+        if projectOpen is not None and os.path.isdir(projectOpen):
+            self.CTR = ProjectController(self, self.Log)
+            self.Controler = self.CTR
+            result, _err = self.CTR.LoadProject(projectOpen, buildpath)
+            if not result:
+                self.LibraryPanel.SetController(self.Controler)
+                self.ProjectTree.Enable(True)
+                self.PouInstanceVariablesPanel.SetController(self.Controler)
+                self.RefreshConfigRecentProjects(os.path.abspath(projectOpen))
+                self.RefreshAfterLoad()
+            else:
+                self.ResetView()
+                self.ShowErrorMessage(result)
+        else:
+            self.CTR = ctr
+            self.Controler = ctr
+            if ctr is not None:
+                ctr.SetAppFrame(self, self.Log)
+                self.LibraryPanel.SetController(self.Controler)
+                self.ProjectTree.Enable(True)
+                self.PouInstanceVariablesPanel.SetController(self.Controler)
+                self.RefreshAfterLoad()
+        if self.EnableDebug:
+            self.DebugVariablePanel.SetDataProducer(self.CTR)
+
+        self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
+
+        self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
+        self.RefreshAll()
+        self.LogConsole.SetFocus()
+
+    def RefreshTitle(self):
+        name = _("Beremiz")
+        if self.CTR is not None:
+            projectname = self.CTR.GetProjectName()
+            if self.CTR.ProjectTestModified():
+                projectname = "~%s~" % projectname
+            self.SetTitle("%s - %s" % (name, projectname))
+        else:
+            self.SetTitle(name)
+
+    def StartLocalRuntime(self, taskbaricon=True):
+        if (self.local_runtime is None) or (self.local_runtime.exitcode is not None):
+            # create temporary directory for runtime working directory
+            self.local_runtime_tmpdir = tempfile.mkdtemp()
+            # choose an arbitrary random port for runtime
+            self.runtime_port = int(random.random() * 1000) + 61131
+            # launch local runtime
+            self.local_runtime = ProcessLogger(
+                self.Log,
+                "\"%s\" \"%s\" -p %s -i localhost %s %s" % (
+                    sys.executable,
+                    Bpath("Beremiz_service.py"),
+                    self.runtime_port,
+                    {False: "-x 0", True: "-x 1"}[taskbaricon],
+                    self.local_runtime_tmpdir),
+                no_gui=False,
+                timeout=500, keyword=self.local_runtime_tmpdir,
+                cwd=self.local_runtime_tmpdir)
+            self.local_runtime.spin()
+        return self.runtime_port
+
+    def KillLocalRuntime(self):
+        if self.local_runtime is not None:
+            # shutdown local runtime
+            self.local_runtime.kill(gently=False)
+            # clear temp dir
+            shutil.rmtree(self.local_runtime_tmpdir)
+
+            self.local_runtime = None
+
+    def OnOpenWidgetInspector(self, evt):
+        # Activate the widget inspection tool
+        from wx.lib.inspection import InspectionTool
+        if not InspectionTool().initialized:
+            InspectionTool().Init()
+
+        # Find a widget to be selected in the tree.  Use either the
+        # one under the cursor, if any, or this frame.
+        wnd = wx.FindWindowAtPointer()
+        if not wnd:
+            wnd = self
+        InspectionTool().Show(wnd, True)
+
+    def OnLogConsoleFocusChanged(self, event):
+        self.RefreshEditMenu()
+        event.Skip()
+
+    def OnLogConsoleUpdateUI(self, event):
+        self.SetCopyBuffer(self.LogConsole.GetSelectedText(), True)
+        event.Skip()
+
+    def OnLogConsoleMarginClick(self, event):
+        line_idx = self.LogConsole.LineFromPosition(event.GetPosition())
+        wx.CallAfter(self.SearchLineForError, self.LogConsole.GetLine(line_idx))
+        event.Skip()
+
+    def OnLogConsoleModified(self, event):
+        line_idx = self.LogConsole.LineFromPosition(event.GetPosition())
+        line = self.LogConsole.GetLine(line_idx)
+        if line:
+            result = MATIEC_ERROR_MODEL.match(line)
+            if result is not None:
+                self.LogConsole.MarkerAdd(line_idx, 0)
+        event.Skip()
+
+    def SearchLineForError(self, line):
+        if self.CTR is not None:
+            result = MATIEC_ERROR_MODEL.match(line)
+            if result is not None:
+                first_line, first_column, last_line, last_column, _error = result.groups()
+                self.CTR.ShowError(self.Log,
+                                   (int(first_line), int(first_column)),
+                                   (int(last_line),  int(last_column)))
+
+    def CheckSaveBeforeClosing(self, title=_("Close Project")):
+        """Function displaying an Error dialog in PLCOpenEditor.
+
+        :returns: False if closing cancelled.
+        """
+        if self.CTR.ProjectTestModified():
+            dialog = wx.MessageDialog(self,
+                                      _("There are changes, do you want to save?"),
+                                      title,
+                                      wx.YES_NO | wx.CANCEL | wx.ICON_QUESTION)
+            answer = dialog.ShowModal()
+            dialog.Destroy()
+            if answer == wx.ID_YES:
+                self.CTR.SaveProject()
+            elif answer == wx.ID_CANCEL:
+                return False
+
+        for idx in xrange(self.TabsOpened.GetPageCount()):
+            window = self.TabsOpened.GetPage(idx)
+            if not window.CheckSaveBeforeClosing():
+                return False
+
+        return True
+
+    def GetTabInfos(self, tab):
+        if isinstance(tab, EditorPanel) and \
+           not isinstance(tab, (Viewer,
+                                TextViewer,
+                                ResourceEditor,
+                                ConfigurationEditor,
+                                DataTypeEditor)):
+            return ("confnode", tab.Controler.CTNFullName(), tab.GetTagName())
+        elif (isinstance(tab, TextViewer) and
+              (tab.Controler is None or isinstance(tab.Controler, MiniTextControler))):
+            return ("confnode", None, tab.GetInstancePath())
+        else:
+            return IDEFrame.GetTabInfos(self, tab)
+
+    def LoadTab(self, notebook, page_infos):
+        if page_infos[0] == "confnode":
+            if page_infos[1] is None:
+                confnode = self.CTR
+            else:
+                confnode = self.CTR.GetChildByName(page_infos[1])
+            return notebook.GetPageIndex(confnode._OpenView(*page_infos[2:]))
+        else:
+            return IDEFrame.LoadTab(self, notebook, page_infos)
+
+    # Strange hack required by WAMP connector, using twisted.
+    # Twisted reactor needs to be stopped only before quit,
+    # since it cannot be restarted
+    ToDoBeforeQuit = []
+
+    def AddToDoBeforeQuit(self, Thing):
+        self.ToDoBeforeQuit.append(Thing)
+
+    def OnCloseFrame(self, event):
+        for evt_type in [wx.EVT_SET_FOCUS,
+                         wx.EVT_KILL_FOCUS,
+                         wx.stc.EVT_STC_UPDATEUI]:
+            self.LogConsole.Unbind(evt_type)
+        if self.CTR is None or self.CheckSaveBeforeClosing(_("Close Application")):
+            if self.CTR is not None:
+                self.CTR.KillDebugThread()
+            self.KillLocalRuntime()
+
+            self.SaveLastState()
+
+            for Thing in self.ToDoBeforeQuit:
+                Thing()
+            self.ToDoBeforeQuit = []
+
+            event.Skip()
+        else:
+            event.Veto()
+
+    def RefreshFileMenu(self):
+        self.RefreshRecentProjectsMenu()
+
+        MenuToolBar = self.Panes["MenuToolBar"]
+        if self.CTR is not None:
+            selected = self.TabsOpened.GetSelection()
+            if selected >= 0:
+                window = self.TabsOpened.GetPage(selected)
+                viewer_is_modified = window.IsModified()
+                is_viewer = isinstance(window, Viewer)
+            else:
+                viewer_is_modified = is_viewer = False
+            if self.TabsOpened.GetPageCount() > 0:
+                self.FileMenu.Enable(wx.ID_CLOSE, True)
+                if is_viewer:
+                    self.FileMenu.Enable(wx.ID_PREVIEW, True)
+                    self.FileMenu.Enable(wx.ID_PRINT, True)
+                    MenuToolBar.EnableTool(wx.ID_PRINT, True)
+                else:
+                    self.FileMenu.Enable(wx.ID_PREVIEW, False)
+                    self.FileMenu.Enable(wx.ID_PRINT, False)
+                    MenuToolBar.EnableTool(wx.ID_PRINT, False)
+            else:
+                self.FileMenu.Enable(wx.ID_CLOSE, False)
+                self.FileMenu.Enable(wx.ID_PREVIEW, False)
+                self.FileMenu.Enable(wx.ID_PRINT, False)
+                MenuToolBar.EnableTool(wx.ID_PRINT, False)
+            self.FileMenu.Enable(wx.ID_PAGE_SETUP, True)
+            project_modified = self.CTR.ProjectTestModified() or viewer_is_modified
+            self.FileMenu.Enable(wx.ID_SAVE, project_modified)
+            MenuToolBar.EnableTool(wx.ID_SAVE, project_modified)
+            self.FileMenu.Enable(wx.ID_SAVEAS, True)
+            MenuToolBar.EnableTool(wx.ID_SAVEAS, True)
+            self.FileMenu.Enable(wx.ID_CLOSE_ALL, True)
+        else:
+            self.FileMenu.Enable(wx.ID_CLOSE, False)
+            self.FileMenu.Enable(wx.ID_PAGE_SETUP, False)
+            self.FileMenu.Enable(wx.ID_PREVIEW, False)
+            self.FileMenu.Enable(wx.ID_PRINT, False)
+            MenuToolBar.EnableTool(wx.ID_PRINT, False)
+            self.FileMenu.Enable(wx.ID_SAVE, False)
+            MenuToolBar.EnableTool(wx.ID_SAVE, False)
+            self.FileMenu.Enable(wx.ID_SAVEAS, False)
+            MenuToolBar.EnableTool(wx.ID_SAVEAS, False)
+            self.FileMenu.Enable(wx.ID_CLOSE_ALL, False)
+
+    def RefreshRecentProjectsMenu(self):
+        try:
+            recent_projects = map(DecodeFileSystemPath,
+                                  self.GetConfigEntry("RecentProjects", []))
+        except Exception:
+            recent_projects = []
+
+        while self.RecentProjectsMenu.GetMenuItemCount() > len(recent_projects):
+            item = self.RecentProjectsMenu.FindItemByPosition(0)
+            self.RecentProjectsMenu.RemoveItem(item)
+
+        self.FileMenu.Enable(ID_FILEMENURECENTPROJECTS, len(recent_projects) > 0)
+        for idx, projectpath in enumerate(recent_projects):
+            text = u'&%d: %s' % (idx + 1, projectpath)
+
+            if idx < self.RecentProjectsMenu.GetMenuItemCount():
+                item = self.RecentProjectsMenu.FindItemByPosition(idx)
+                id = item.GetId()
+                item.SetItemLabel(text)
+                self.Disconnect(id, id, wx.EVT_BUTTON._getEvtType())
+            else:
+                id = wx.NewId()
+                AppendMenu(self.RecentProjectsMenu, help='', id=id,
+                           kind=wx.ITEM_NORMAL, text=text)
+            self.Bind(wx.EVT_MENU, self.GenerateOpenRecentProjectFunction(projectpath), id=id)
+
+    def GenerateOpenRecentProjectFunction(self, projectpath):
+        def OpenRecentProject(event):
+            if self.CTR is not None and not self.CheckSaveBeforeClosing():
+                return
+
+            self.OpenProject(projectpath)
+        return OpenRecentProject
+
+    def GenerateMenuRecursive(self, items, menu):
+        for kind, infos in items:
+            if isinstance(kind, list):
+                text, id = infos
+                submenu = wx.Menu('')
+                self.GenerateMenuRecursive(kind, submenu)
+                menu.AppendMenu(id, text, submenu)
+            elif kind == wx.ITEM_SEPARATOR:
+                menu.AppendSeparator()
+            else:
+                text, id, _help, callback = infos
+                AppendMenu(menu, help='', id=id, kind=kind, text=text)
+                if callback is not None:
+                    self.Bind(wx.EVT_MENU, callback, id=id)
+
+    def RefreshEditorToolBar(self):
+        IDEFrame.RefreshEditorToolBar(self)
+        self.AUIManager.GetPane("EditorToolBar").Position(2)
+        self.AUIManager.GetPane("StatusToolBar").Position(1)
+        self.AUIManager.Update()
+
+    def RefreshStatusToolBar(self):
+        StatusToolBar = self.Panes["StatusToolBar"]
+        StatusToolBar.ClearTools()
+        StatusToolBar.SetMinSize(StatusToolBar.GetToolBitmapSize())
+
+        if self.CTR is not None:
+
+            for confnode_method in self.CTR.StatusMethods:
+                if "method" in confnode_method and confnode_method.get("shown", True):
+                    id = wx.NewId()
+                    StatusToolBar.AddSimpleTool(
+                        id, GetBitmap(confnode_method.get("bitmap", "Unknown")),
+                        confnode_method["tooltip"])
+                    self.Bind(wx.EVT_MENU, self.GetMenuCallBackFunction(confnode_method["method"]), id=id)
+
+            StatusToolBar.Realize()
+            self.AUIManager.GetPane("StatusToolBar").BestSize(StatusToolBar.GetBestSize()).Show()
+        else:
+            self.AUIManager.GetPane("StatusToolBar").Hide()
+        self.AUIManager.GetPane("EditorToolBar").Position(2)
+        self.AUIManager.GetPane("StatusToolBar").Position(1)
+        self.AUIManager.Update()
+
+    def RefreshEditMenu(self):
+        IDEFrame.RefreshEditMenu(self)
+        if self.FindFocus() == self.LogConsole:
+            self.EditMenu.Enable(wx.ID_COPY, True)
+            self.Panes["MenuToolBar"].EnableTool(wx.ID_COPY, True)
+
+        if self.CTR is not None:
+            selected = self.TabsOpened.GetSelection()
+            if selected >= 0:
+                panel = self.TabsOpened.GetPage(selected)
+            else:
+                panel = None
+            if panel != self.LastPanelSelected:
+                for i in xrange(self.EditMenuSize, self.EditMenu.GetMenuItemCount()):
+                    item = self.EditMenu.FindItemByPosition(self.EditMenuSize)
+                    if item is not None:
+                        if item.IsSeparator():
+                            self.EditMenu.RemoveItem(item)
+                        else:
+                            self.EditMenu.Delete(item.GetId())
+                self.LastPanelSelected = panel
+                if panel is not None:
+                    items = panel.GetConfNodeMenuItems()
+                else:
+                    items = []
+                if len(items) > 0:
+                    self.EditMenu.AppendSeparator()
+                    self.GenerateMenuRecursive(items, self.EditMenu)
+            if panel is not None:
+                panel.RefreshConfNodeMenu(self.EditMenu)
+        else:
+            for i in xrange(self.EditMenuSize, self.EditMenu.GetMenuItemCount()):
+                item = self.EditMenu.FindItemByPosition(i)
+                if item is not None:
+                    if item.IsSeparator():
+                        self.EditMenu.RemoveItem(item)
+                    else:
+                        self.EditMenu.Delete(item.GetId())
+            self.LastPanelSelected = None
+        self.MenuBar.UpdateMenus()
+
+    def RefreshAll(self):
+        self.RefreshStatusToolBar()
+
+    def GetMenuCallBackFunction(self, method):
+        """ Generate the callbackfunc for a given CTR method"""
+        def OnMenu(event):
+            # Disable button to prevent re-entrant call
+            event.GetEventObject().Disable()
+            # Call
+            getattr(self.CTR, method)()
+            # Re-enable button
+            event.GetEventObject().Enable()
+        return OnMenu
+
+    def GetConfigEntry(self, entry_name, default):
+        return cPickle.loads(str(self.Config.Read(entry_name, cPickle.dumps(default))))
+
+    def ResetConnectionStatusBar(self):
+        for field in xrange(self.ConnectionStatusBar.GetFieldsCount()):
+            self.ConnectionStatusBar.SetStatusText('', field)
+
+    def ResetView(self):
+        IDEFrame.ResetView(self)
+        if self.CTR is not None:
+            self.CTR.CloseProject()
+        self.CTR = None
+        self.Log.flush()
+        if self.EnableDebug:
+            self.DebugVariablePanel.SetDataProducer(None)
+            self.ResetConnectionStatusBar()
+
+    def RefreshConfigRecentProjects(self, projectpath, err=False):
+        try:
+            recent_projects = map(DecodeFileSystemPath,
+                                  self.GetConfigEntry("RecentProjects", []))
+        except Exception:
+            recent_projects = []
+        if projectpath in recent_projects:
+            recent_projects.remove(projectpath)
+        if not err:
+            recent_projects.insert(0, projectpath)
+        self.Config.Write("RecentProjects", cPickle.dumps(
+            map(EncodeFileSystemPath, recent_projects[:MAX_RECENT_PROJECTS])))
+        self.Config.Flush()
+
+    def ResetPerspective(self):
+        IDEFrame.ResetPerspective(self)
+        self.RefreshStatusToolBar()
+
+    def OnNewProjectMenu(self, event):
+        if self.CTR is not None and not self.CheckSaveBeforeClosing():
+            return
+
+        try:
+            defaultpath = DecodeFileSystemPath(self.Config.Read("lastopenedfolder"))
+        except Exception:
+            defaultpath = os.path.expanduser("~")
+
+        dialog = wx.DirDialog(self, _("Choose an empty directory for new project"), defaultpath)
+        if dialog.ShowModal() == wx.ID_OK:
+            projectpath = dialog.GetPath()
+            self.Config.Write("lastopenedfolder",
+                              EncodeFileSystemPath(os.path.dirname(projectpath)))
+            self.Config.Flush()
+            self.ResetView()
+            ctr = ProjectController(self, self.Log)
+            result = ctr.NewProject(projectpath)
+            if not result:
+                self.CTR = ctr
+                self.Controler = self.CTR
+                self.LibraryPanel.SetController(self.Controler)
+                self.ProjectTree.Enable(True)
+                self.PouInstanceVariablesPanel.SetController(self.Controler)
+                self.RefreshConfigRecentProjects(projectpath)
+                if self.EnableDebug:
+                    self.DebugVariablePanel.SetDataProducer(self.CTR)
+                self.RefreshAfterLoad()
+                IDEFrame.OnAddNewProject(self, event)
+            else:
+                self.ResetView()
+                self.ShowErrorMessage(result)
+            self.RefreshAll()
+            self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
+        dialog.Destroy()
+
+    def OnOpenProjectMenu(self, event):
+        if self.CTR is not None and not self.CheckSaveBeforeClosing():
+            return
+
+        try:
+            defaultpath = DecodeFileSystemPath(self.Config.Read("lastopenedfolder"))
+        except Exception:
+            defaultpath = os.path.expanduser("~")
+
+        dialog = wx.DirDialog(self, _("Choose a project"), defaultpath,
+                              style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
+        if dialog.ShowModal() == wx.ID_OK:
+            self.OpenProject(dialog.GetPath())
+        dialog.Destroy()
+
+    def OpenProject(self, projectpath):
+        if os.path.isdir(projectpath):
+            self.Config.Write("lastopenedfolder",
+                              EncodeFileSystemPath(os.path.dirname(projectpath)))
+            self.Config.Flush()
+            self.ResetView()
+            self.CTR = ProjectController(self, self.Log)
+            self.Controler = self.CTR
+            result, err = self.CTR.LoadProject(projectpath)
+            if not result:
+                self.LibraryPanel.SetController(self.Controler)
+                self.ProjectTree.Enable(True)
+                self.PouInstanceVariablesPanel.SetController(self.Controler)
+                if self.EnableDebug:
+                    self.DebugVariablePanel.SetDataProducer(self.CTR)
+                self.RefreshAfterLoad()
+            else:
+                self.ResetView()
+                self.ShowErrorMessage(result)
+            self.RefreshAll()
+            self.SearchResultPanel.ResetSearchResults()
+        else:
+            self.ShowErrorMessage(_("\"%s\" folder is not a valid Beremiz project\n") % projectpath)
+            err = True
+        self.RefreshConfigRecentProjects(projectpath, err)
+        self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
+
+    def OnCloseProjectMenu(self, event):
+        if self.CTR is not None and not self.CheckSaveBeforeClosing():
+            return
+
+        self.ResetView()
+        self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU)
+        self.RefreshAll()
+
+    def RefreshAfterLoad(self):
+        self._Refresh(PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
+
+    def RefreshAfterSave(self):
+        self.RefreshAll()
+        self._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES)
+
+    def OnSaveProjectMenu(self, event):
+        selected = self.TabsOpened.GetSelection()
+        if selected != -1:
+            window = self.TabsOpened.GetPage(selected)
+            window.Save()
+        if self.CTR is not None:
+            self.CTR.SaveProject()
+            self.RefreshAfterSave()
+
+    def OnSaveProjectAsMenu(self, event):
+        selected = self.TabsOpened.GetSelection()
+        if selected != -1:
+            window = self.TabsOpened.GetPage(selected)
+            window.SaveAs()
+        if self.CTR is not None:
+            self.CTR.SaveProjectAs()
+            self.RefreshAfterSave()
+            self.RefreshConfigRecentProjects(self.CTR.ProjectPath)
+
+    def OnQuitMenu(self, event):
+        self.Close()
+
+    def OnAboutMenu(self, event):
+        info = version.GetAboutDialogInfo()
+        ShowAboutDialog(self, info)
+
+    def OnProjectTreeItemBeginEdit(self, event):
+        selected = event.GetItem()
+        if self.ProjectTree.GetPyData(selected)["type"] == ITEM_CONFNODE:
+            event.Veto()
+        else:
+            IDEFrame.OnProjectTreeItemBeginEdit(self, event)
+
+    def OnProjectTreeRightUp(self, event):
+        item = event.GetItem()
+        item_infos = self.ProjectTree.GetPyData(item)
+
+        if item_infos["type"] == ITEM_CONFNODE:
+            confnode_menu = wx.Menu(title='')
+
+            confnode = item_infos["confnode"]
+            if confnode is not None:
+                menu_items = confnode.GetContextualMenuItems()
+                if menu_items is not None:
+                    for text, help, callback in menu_items:
+                        new_id = wx.NewId()
+                        confnode_menu.Append(help=help, id=new_id, kind=wx.ITEM_NORMAL, text=text)
+                        self.Bind(wx.EVT_MENU, callback, id=new_id)
+                else:
+                    for name, XSDClass, help in confnode.CTNChildrenTypes:
+                        if not hasattr(XSDClass, 'CTNMaxCount') or not confnode.Children.get(name) \
+                                or len(confnode.Children[name]) < XSDClass.CTNMaxCount:
+                            new_id = wx.NewId()
+                            confnode_menu.Append(help=help, id=new_id, kind=wx.ITEM_NORMAL, text=_("Add") + " " + name)
+                            self.Bind(wx.EVT_MENU, self.GetAddConfNodeFunction(name, confnode), id=new_id)
+            new_id = wx.NewId()
+            AppendMenu(confnode_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Delete"))
+            self.Bind(wx.EVT_MENU, self.GetDeleteMenuFunction(confnode), id=new_id)
+
+            self.PopupMenu(confnode_menu)
+            confnode_menu.Destroy()
+
+            event.Skip()
+        elif item_infos["type"] == ITEM_RESOURCE:
+            # prevent last resource to be delted
+            parent = self.ProjectTree.GetItemParent(item)
+            parent_name = self.ProjectTree.GetItemText(parent)
+            if parent_name == _("Resources"):
+                IDEFrame.OnProjectTreeRightUp(self, event)
+        else:
+            IDEFrame.OnProjectTreeRightUp(self, event)
+
+    def OnProjectTreeItemActivated(self, event):
+        selected = event.GetItem()
+        item_infos = self.ProjectTree.GetPyData(selected)
+        if item_infos["type"] == ITEM_CONFNODE:
+            item_infos["confnode"]._OpenView()
+            event.Skip()
+        elif item_infos["type"] == ITEM_PROJECT:
+            self.CTR._OpenView()
+        else:
+            IDEFrame.OnProjectTreeItemActivated(self, event)
+
+    def ProjectTreeItemSelect(self, select_item):
+        if select_item is not None and select_item.IsOk():
+            item_infos = self.ProjectTree.GetPyData(select_item)
+            if item_infos["type"] == ITEM_CONFNODE:
+                item_infos["confnode"]._OpenView(onlyopened=True)
+            elif item_infos["type"] == ITEM_PROJECT:
+                self.CTR._OpenView(onlyopened=True)
+            else:
+                IDEFrame.ProjectTreeItemSelect(self, select_item)
+
+    def SelectProjectTreeItem(self, tagname):
+        if self.ProjectTree is not None:
+            root = self.ProjectTree.GetRootItem()
+            if root.IsOk():
+                words = tagname.split("::")
+                if len(words) == 1:
+                    if tagname == "Project":
+                        self.SelectedItem = root
+                        self.ProjectTree.SelectItem(root)
+                        self.ResetSelectedItem()
+                    else:
+                        return self.RecursiveProjectTreeItemSelection(
+                            root,
+                            [(word, ITEM_CONFNODE) for word in tagname.split(".")])
+                elif words[0] == "R":
+                    return self.RecursiveProjectTreeItemSelection(root, [(words[2], ITEM_RESOURCE)])
+                elif not os.path.exists(words[0]):
+                    IDEFrame.SelectProjectTreeItem(self, tagname)
+
+    def GetAddConfNodeFunction(self, name, confnode=None):
+        def AddConfNodeMenuFunction(event):
+            wx.CallAfter(self.AddConfNode, name, confnode)
+        return AddConfNodeMenuFunction
+
+    def GetDeleteMenuFunction(self, confnode):
+        def DeleteMenuFunction(event):
+            wx.CallAfter(self.DeleteConfNode, confnode)
+        return DeleteMenuFunction
+
+    def AddConfNode(self, ConfNodeType, confnode=None):
+        if self.CTR.CheckProjectPathPerm():
+            ConfNodeName = "%s_0" % ConfNodeType
+            if confnode is not None:
+                confnode.CTNAddChild(ConfNodeName, ConfNodeType)
+            else:
+                self.CTR.CTNAddChild(ConfNodeName, ConfNodeType)
+            self._Refresh(TITLE, FILEMENU, PROJECTTREE)
+
+    def DeleteConfNode(self, confnode):
+        if self.CTR.CheckProjectPathPerm():
+            dialog = wx.MessageDialog(
+                self,
+                _("Really delete node '%s'?") % confnode.CTNName(),
+                _("Remove %s node") % confnode.CTNType,
+                wx.YES_NO | wx.NO_DEFAULT)
+            if dialog.ShowModal() == wx.ID_YES:
+                confnode.CTNRemove()
+                del confnode
+                self._Refresh(TITLE, FILEMENU, PROJECTTREE)
+            dialog.Destroy()
+
+# -------------------------------------------------------------------------------
+#                        Highlights showing functions
+# -------------------------------------------------------------------------------
+
+    def ShowHighlight(self, infos, start, end, highlight_type):
+        config_name = self.Controler.GetProjectMainConfigurationName()
+        if config_name is not None and infos[0] == ComputeConfigurationName(config_name):
+            self.CTR._OpenView()
+            selected = self.TabsOpened.GetSelection()
+            if selected != -1:
+                viewer = self.TabsOpened.GetPage(selected)
+                viewer.AddHighlight(infos[1:], start, end, highlight_type)
+        else:
+            IDEFrame.ShowHighlight(self, infos, start, end, highlight_type)
--- a/Beremiz_service.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/Beremiz_service.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -22,40 +23,67 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import os, sys, getopt
-from threading import Thread
+
+from __future__ import absolute_import
+from __future__ import print_function
+import os
+import sys
+import getopt
+import threading
+from threading import Thread, Semaphore, Lock
+import __builtin__
+from builtins import str as text
+from past.builtins import execfile
+from six.moves import builtins
+
+import runtime
+from runtime.PyroServer import PyroServer
+from runtime.xenomai import TryPreloadXenomai
+from runtime import LogMessageAndException
+from runtime import PlcStatus
+import util.paths as paths
+
+
+def version():
+    from version import app_version
+    print("Beremiz_service: ", app_version)
+
 
 def usage():
-    print """
+    version()
+    print("""
 Usage of Beremiz PLC execution service :\n
 %s {[-n servicename] [-i IP] [-p port] [-x enabletaskbar] [-a autostart]|-h|--help} working_dir
-           -n        - zeroconf service name (default:disabled)
-           -i        - IP address of interface to bind to (default:localhost)
-           -p        - port number default:3000
-           -h        - print this help text and quit
-           -a        - autostart PLC (0:disable 1:enable) (default:0)
-           -x        - enable/disable wxTaskbarIcon (0:disable 1:enable) (default:1)
-           -t        - enable/disable Twisted web interface (0:disable 1:enable) (default:1)
-           -w        - web server port or "off" (default:8009)
-           -c        - WAMP client config file or "off" (default:wampconf.json)
-           -e        - python extension (absolute path .py)
+  -n  service name (default:None, zeroconf discovery disabled)
+  -i  IP address of interface to bind to (default:localhost)
+  -p  port number default:3000
+  -h  print this help text and quit
+  -a  autostart PLC (0:disable 1:enable) (default:0)
+  -x  enable/disable wxTaskbarIcon (0:disable 1:enable) (default:1)
+  -t  enable/disable Twisted web interface (0:disable 1:enable) (default:1)
+  -w  web server port or "off" to disable web server (default:8009)
+  -c  WAMP client config file (can be overriden by wampconf.json in project)
+  -s  PSK secret path (default:PSK disabled)
+  -e  python extension (absolute path .py)
 
            working_dir - directory where are stored PLC files
-"""%sys.argv[0]
+""" % sys.argv[0])
+
 
 try:
-    opts, argv = getopt.getopt(sys.argv[1:], "i:p:n:x:t:a:w:c:e:h")
-except getopt.GetoptError, err:
+    opts, argv = getopt.getopt(sys.argv[1:], "i:p:n:x:t:a:w:c:e:s:h", ["help", "version"])
+except getopt.GetoptError as err:
     # print help information and exit:
-    print str(err) # will print something like "option -a not recognized"
+    print(str(err))  # will print something like "option -a not recognized"
     usage()
     sys.exit(2)
 
 # default values
-given_ip = None
+interface = ''
 port = 3000
 webport = 8009
-wampconf = "wampconf.json"
+PSKpath = None
+wampconf = None
 servicename = None
 autostart = False
 enablewx = True
@@ -63,15 +91,20 @@
 enabletwisted = True
 havetwisted = False
 
-extensions=[]
+extensions = []
 
 for o, a in opts:
-    if o == "-h":
+    if o == "-h" or o == "--help":
         usage()
         sys.exit()
+    if o == "--version":
+        version()
+        sys.exit()
     elif o == "-i":
-        if len(a.split(".")) == 4 or a == "localhost":
-            given_ip = a
+        if len(a.split(".")) == 4:
+            interface = a
+        elif a == "localhost":
+            interface = '127.0.0.1'
         else:
             usage()
             sys.exit()
@@ -90,13 +123,18 @@
         webport = None if a == "off" else int(a)
     elif o == "-c":
         wampconf = None if a == "off" else a
+    elif o == "-s":
+        PSKpath = None if a == "off" else a
     elif o == "-e":
-        extensions.append(a)
+        fnameanddirname = list(os.path.split(os.path.realpath(a)))
+        fnameanddirname.reverse()
+        extensions.append(fnameanddirname)
     else:
         usage()
         sys.exit()
 
-beremiz_dir = os.path.dirname(os.path.realpath(__file__))
+
+beremiz_dir = paths.AbsDir(__file__)
 
 if len(argv) > 1:
     usage()
@@ -106,42 +144,42 @@
     os.chdir(WorkingDir)
 elif len(argv) == 0:
     WorkingDir = os.getcwd()
-    argv=[WorkingDir]
-
-import __builtin__
-if __name__ == '__main__':
-    __builtin__.__dict__['_'] = lambda x: x
+    argv = [WorkingDir]
+
+builtins.__dict__['_'] = lambda x: x
+# TODO: add a cmdline parameter if Trying Preloading Xenomai makes problem
+TryPreloadXenomai()
+version()
+
 
 def Bpath(*args):
-    return os.path.join(beremiz_dir,*args)
+    return os.path.join(beremiz_dir, *args)
+
 
 def SetupI18n():
-    # Import module for internationalization
-    import gettext
-
     # Get folder containing translation files
-    localedir = os.path.join(beremiz_dir,"locale")
+    localedir = os.path.join(beremiz_dir, "locale")
     # Get the default language
     langid = wx.LANGUAGE_DEFAULT
     # Define translation domain (name of translation files)
     domain = "Beremiz"
 
     # Define locale for wx
-    loc = __builtin__.__dict__.get('loc', None)
+    loc = builtins.__dict__.get('loc', None)
     if loc is None:
+        wx.LogGui.EnableLogging(False)
         loc = wx.Locale(langid)
-        __builtin__.__dict__['loc'] = loc
+        wx.LogGui.EnableLogging(True)
+        builtins.__dict__['loc'] = loc
         # Define location for searching translation files
     loc.AddCatalogLookupPathPrefix(localedir)
     # Define locale domain
     loc.AddCatalog(domain)
 
-
     import locale
     global default_locale
     default_locale = locale.getdefaultlocale()[1]
 
-
     # sys.stdout.encoding = default_locale
     # if Beremiz_service is started from Beremiz IDE
     # sys.stdout.encoding is None (that means 'ascii' encoding').
@@ -150,24 +188,22 @@
     def unicode_translation(message):
         return wx.GetTranslation(message).encode(default_locale)
 
-    if __name__ == '__main__':
-        __builtin__.__dict__['_'] = unicode_translation
-        # __builtin__.__dict__['_'] = wx.GetTranslation
-
+    builtins.__dict__['_'] = unicode_translation
+    # builtins.__dict__['_'] = wx.GetTranslation
+
+
+# Life is hard... have a candy.
+# pylint: disable=wrong-import-position,wrong-import-order
 if enablewx:
     try:
-        import wxversion
-        wxversion.select(['2.8', '3.0'])
         import wx
         havewx = True
-    except:
-        print "Wx unavailable !"
+    except ImportError:
+        print("Wx unavailable !")
         havewx = False
 
     if havewx:
         import re
-        from threading import Thread, currentThread
-        from types import *
 
         if wx.VERSION >= (3, 0, 0):
             app = wx.App(redirect=False)
@@ -183,32 +219,20 @@
         stopicon = wx.Image(Bpath("images", "icostop24.png"))
 
         class ParamsEntryDialog(wx.TextEntryDialog):
-            if wx.VERSION < (2, 6, 0):
-                def Bind(self, event, function, id = None):
-                    if id is not None:
-                        event(self, id, function)
-                    else:
-                        event(self, function)
-
-
-            def __init__(self, parent, message, caption = _("Please enter text"), defaultValue = "",
-                               style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
+
+            def __init__(self, parent, message, caption=_("Please enter text"), defaultValue="",
+                         style=wx.OK | wx.CANCEL | wx.CENTRE, pos=wx.DefaultPosition):
                 wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
 
                 self.Tests = []
-                if wx.VERSION >= (2, 8, 0):
-                    self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
-                elif wx.VERSION >= (2, 6, 0):
-                    self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetAffirmativeButton().GetId())
-                else:
-                    self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetSizer().GetItem(3).GetSizer().GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
+                self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.GetAffirmativeId())
 
             def OnOK(self, event):
                 value = self.GetValue()
-                texts = {"value" : value}
+                texts = {"value": value}
                 for function, message in self.Tests:
                     if not function(value):
-                        message = wx.MessageDialog(self, message%texts, _("Error"), wx.OK|wx.ICON_ERROR)
+                        message = wx.MessageDialog(self, message % texts, _("Error"), wx.OK | wx.ICON_ERROR)
                         message.ShowModal()
                         message.Destroy()
                         return
@@ -232,12 +256,11 @@
             TBMENU_CHANGE_WD = wx.NewId()
             TBMENU_QUIT = wx.NewId()
 
-            def __init__(self, pyroserver, level):
+            def __init__(self, pyroserver):
                 wx.TaskBarIcon.__init__(self)
                 self.pyroserver = pyroserver
                 # Set the image
                 self.UpdateIcon(None)
-                self.level = level
 
                 # bind some events
                 self.Bind(wx.EVT_MENU, self.OnTaskBarStartPLC, id=self.TBMENU_START)
@@ -260,15 +283,14 @@
                 menu = wx.Menu()
                 menu.Append(self.TBMENU_START, _("Start PLC"))
                 menu.Append(self.TBMENU_STOP, _("Stop PLC"))
-                if self.level==1:
-                    menu.AppendSeparator()
-                    menu.Append(self.TBMENU_CHANGE_NAME, _("Change Name"))
-                    menu.Append(self.TBMENU_CHANGE_INTERFACE, _("Change IP of interface to bind"))
-                    menu.Append(self.TBMENU_CHANGE_PORT, _("Change Port Number"))
-                    menu.Append(self.TBMENU_CHANGE_WD, _("Change working directory"))
-                    menu.AppendSeparator()
-                    menu.Append(self.TBMENU_LIVE_SHELL, _("Launch a live Python shell"))
-                    menu.Append(self.TBMENU_WXINSPECTOR, _("Launch WX GUI inspector"))
+                menu.AppendSeparator()
+                menu.Append(self.TBMENU_CHANGE_NAME, _("Change Name"))
+                menu.Append(self.TBMENU_CHANGE_INTERFACE, _("Change IP of interface to bind"))
+                menu.Append(self.TBMENU_CHANGE_PORT, _("Change Port Number"))
+                menu.Append(self.TBMENU_CHANGE_WD, _("Change working directory"))
+                menu.AppendSeparator()
+                menu.Append(self.TBMENU_LIVE_SHELL, _("Launch a live Python shell"))
+                menu.Append(self.TBMENU_WXINSPECTOR, _("Launch WX GUI inspector"))
                 menu.AppendSeparator()
                 menu.Append(self.TBMENU_QUIT, _("Quit"))
                 return menu
@@ -283,62 +305,50 @@
                 elif "wxGTK" in wx.PlatformInfo:
                     img = img.Scale(22, 22)
                 # wxMac can be any size upto 128x128, so leave the source img alone....
-                icon = wx.IconFromBitmap(img.ConvertToBitmap() )
+                icon = wx.IconFromBitmap(img.ConvertToBitmap())
                 return icon
 
             def OnTaskBarStartPLC(self, evt):
-                if self.pyroserver.plcobj is not None:
-                    plcstatus = self.pyroserver.plcobj.GetPLCstatus()[0]
-                    if  plcstatus is "Stopped":
-                        self.pyroserver.plcobj.StartPLC()
-                    else:
-                        print _("PLC is empty or already started.")
+                runtime.GetPLCObjectSingleton().StartPLC()
 
             def OnTaskBarStopPLC(self, evt):
-                if self.pyroserver.plcobj is not None:
-                    if self.pyroserver.plcobj.GetPLCstatus()[0] == "Started":
-                        Thread(target=self.pyroserver.plcobj.StopPLC).start()
-                    else:
-                        print _("PLC is not started.")
+                runtime.GetPLCObjectSingleton().StopPLC()
 
             def OnTaskBarChangeInterface(self, evt):
                 ip_addr = self.pyroserver.ip_addr
                 ip_addr = '' if ip_addr is None else ip_addr
-                dlg = ParamsEntryDialog(None, _("Enter the IP of the interface to bind"), defaultValue=ip_addr)                
-                dlg.SetTests([(re.compile('\d{1,3}(?:\.\d{1,3}){3}$').match, _("IP is not valid!")),
-                               ( lambda x :len([x for x in x.split(".") if 0 <= int(x) <= 255]) == 4, _("IP is not valid!"))
-                               ])
+                dlg = ParamsEntryDialog(None, _("Enter the IP of the interface to bind"), defaultValue=ip_addr)
+                dlg.SetTests([(re.compile(r'\d{1,3}(?:\.\d{1,3}){3}$').match, _("IP is not valid!")),
+                              (lambda x:len([x for x in x.split(".") if 0 <= int(x) <= 255]) == 4,
+                               _("IP is not valid!"))])
                 if dlg.ShowModal() == wx.ID_OK:
                     self.pyroserver.ip_addr = dlg.GetValue()
-                    self.pyroserver.Stop()
+                    self.pyroserver.Restart()
 
             def OnTaskBarChangePort(self, evt):
                 dlg = ParamsEntryDialog(None, _("Enter a port number "), defaultValue=str(self.pyroserver.port))
-                dlg.SetTests([(UnicodeType.isdigit, _("Port number must be an integer!")), (lambda port : 0 <= int(port) <= 65535 , _("Port number must be 0 <= port <= 65535!"))])
+                dlg.SetTests([(text.isdigit, _("Port number must be an integer!")), (lambda port: 0 <= int(port) <= 65535, _("Port number must be 0 <= port <= 65535!"))])
                 if dlg.ShowModal() == wx.ID_OK:
                     self.pyroserver.port = int(dlg.GetValue())
-                    self.pyroserver.Stop()
+                    self.pyroserver.Restart()
 
             def OnTaskBarChangeWorkingDir(self, evt):
                 dlg = wx.DirDialog(None, _("Choose a working directory "), self.pyroserver.workdir, wx.DD_NEW_DIR_BUTTON)
                 if dlg.ShowModal() == wx.ID_OK:
                     self.pyroserver.workdir = dlg.GetPath()
-                    self.pyroserver.Stop()
+                    self.pyroserver.Restart()
 
             def OnTaskBarChangeName(self, evt):
-                servicename = self.pyroserver.servicename
-                servicename = '' if servicename is None else servicename
-                dlg = ParamsEntryDialog(None, _("Enter a name "), defaultValue=servicename)
-                dlg.SetTests([(lambda name : len(name) is not 0 , _("Name must not be null!"))])
+                _servicename = self.pyroserver.servicename
+                _servicename = '' if _servicename is None else _servicename
+                dlg = ParamsEntryDialog(None, _("Enter a name "), defaultValue=_servicename)
+                dlg.SetTests([(lambda name: len(name) is not 0, _("Name must not be null!"))])
                 if dlg.ShowModal() == wx.ID_OK:
                     self.pyroserver.servicename = dlg.GetValue()
                     self.pyroserver.Restart()
 
             def _LiveShellLocals(self):
-                if self.pyroserver.plcobj is not None:
-                    return {"locals":self.pyroserver.plcobj.python_runtime_vars}
-                else:
-                    return {}
+                return {"locals": runtime.GetPLCObjectSingleton().python_runtime_vars}
 
             def OnTaskBarLiveShell(self, evt):
                 from wx import py
@@ -361,243 +371,213 @@
                 wx.CallAfter(wx.GetApp().ExitMainLoop)
 
             def UpdateIcon(self, plcstatus):
-                if plcstatus is "Started" :
+                if plcstatus is PlcStatus.Started:
                     currenticon = self.MakeIcon(starticon)
-                elif plcstatus is "Stopped":
+                elif plcstatus is PlcStatus.Stopped:
                     currenticon = self.MakeIcon(stopicon)
                 else:
                     currenticon = self.MakeIcon(defaulticon)
                 self.SetIcon(currenticon, "Beremiz Service")
 
-from runtime import PLCObject, PLCprint, ServicePublisher
-import Pyro.core as pyro
 
 if not os.path.isdir(WorkingDir):
     os.mkdir(WorkingDir)
 
+
 def default_evaluator(tocall, *args, **kwargs):
     try:
-        res=(tocall(*args,**kwargs), None)
+        res = (tocall(*args, **kwargs), None)
     except Exception:
-        res=(None, sys.exc_info())
+        res = (None, sys.exc_info())
     return res
 
-class Server():
-    def __init__(self, servicename, ip_addr, port,
-                 workdir, argv, autostart=False,
-                 statuschange=None, evaluator=default_evaluator,
-                 pyruntimevars=None):
-        self.continueloop = True
-        self.daemon = None
-        self.servicename = servicename
-        self.ip_addr = ip_addr
-        self.port = port
-        self.workdir = workdir
-        self.argv = argv
-        self.plcobj = None
-        self.servicepublisher = None
-        self.autostart = autostart
-        self.statuschange = statuschange
-        self.evaluator = evaluator
-        self.pyruntimevars = pyruntimevars
-
-    def Loop(self):
-        while self.continueloop:
-            self.Start()
-
-    def Restart(self):
-        self.Stop()
-
-    def Quit(self):
-        self.continueloop = False
-        if self.plcobj is not None:
-            self.plcobj.StopPLC()
-            self.plcobj.UnLoadPLC()
-        self.Stop()
-
-    def Start(self):
-        pyro.initServer()
-        self.daemon=pyro.Daemon(host=self.ip_addr, port=self.port)
-        self.plcobj = PLCObject(self.workdir, self.daemon, self.argv,
-                                self.statuschange, self.evaluator,
-                                self.pyruntimevars)
-        uri = self.daemon.connect(self.plcobj,"PLCObject")
-
-        print _("Pyro port :"), self.port
-        print _("Pyro object's uri :"), uri
-
-        # Beremiz IDE detects daemon start by looking
-        # for self.workdir in the daemon's stdout.
-        # Therefore don't delete the following line
-        print _("Current working directory :"), self.workdir
-
-        # Configure and publish service
-        # Not publish service if localhost in address params
-        if (self.servicename is not None and
-            self.ip_addr is not None and
-            self.ip_addr != "localhost" and
-            self.ip_addr != "127.0.0.1"):
-            print _("Publishing service on local network")
-            self.servicepublisher = ServicePublisher.ServicePublisher()
-            self.servicepublisher.RegisterService(self.servicename, self.ip_addr, self.port)
-
-        self.plcobj.AutoLoad()
-        if self.plcobj.GetPLCstatus()[0] != "Empty":
-            if self.autostart :
-                self.plcobj.StartPLC()
-        self.plcobj.StatusChange()
-
-        sys.stdout.flush()
-
-        self.daemon.requestLoop()
-        self.daemon.sock.close()
-
-    def Stop(self):
-        if self.plcobj is not None:
-            self.plcobj.StopPLC()
-        if self.servicepublisher is not None:
-            self.servicepublisher.UnRegisterService()
-            self.servicepublisher = None
-        self.daemon.shutdown(True)
 
 if enabletwisted:
     import warnings
     with warnings.catch_warnings():
         warnings.simplefilter("ignore")
         try:
-            from threading import Thread, currentThread
             if havewx:
                 from twisted.internet import wxreactor
                 wxreactor.install()
             from twisted.internet import reactor
 
             havetwisted = True
-        except:
-            print _("Twisted unavailable.")
+        except ImportError:
+            print(_("Twisted unavailable."))
             havetwisted = False
 
 pyruntimevars = {}
 statuschange = []
 
 if havetwisted:
-
     if havewx:
         reactor.registerWxApp(app)
 
 if havewx:
-    from threading import Semaphore
     wx_eval_lock = Semaphore(0)
-    main_thread = currentThread()
+    # FIXME : beware wx mainloop is _not_ running in main thread
+    # main_thread = currentThread()
 
     def statuschangeTskBar(status):
-        wx.CallAfter(taskbar_instance.UpdateIcon,status)
+        wx.CallAfter(taskbar_instance.UpdateIcon, status)
 
     statuschange.append(statuschangeTskBar)
 
     def wx_evaluator(obj, *args, **kwargs):
-        tocall,args,kwargs = obj.call
+        tocall, args, kwargs = obj.call
         obj.res = default_evaluator(tocall, *args, **kwargs)
         wx_eval_lock.release()
 
     def evaluator(tocall, *args, **kwargs):
-        global main_thread
-        if(main_thread == currentThread()):
-            # avoid dead lock if called from the wx mainloop
-            return default_evaluator(tocall, *args, **kwargs)
-        else:
-            o=type('',(object,),dict(call=(tocall, args, kwargs), res=None))
-            wx.CallAfter(wx_evaluator,o)
-            wx_eval_lock.acquire()
-            return o.res
-
-    pyroserver = Server(servicename, given_ip, port,
-                        WorkingDir, argv, autostart,
-                        statuschange, evaluator, pyruntimevars)
-
-    taskbar_instance = BeremizTaskBarIcon(pyroserver, enablewx)
+        # FIXME : should implement anti-deadlock
+        # if main_thread == currentThread():
+        #     # avoid dead lock if called from the wx mainloop
+        #     return default_evaluator(tocall, *args, **kwargs)
+        # else:
+        o = type('', (object,), dict(call=(tocall, args, kwargs), res=None))
+        wx.CallAfter(wx_evaluator, o)
+        wx_eval_lock.acquire()
+        return o.res
 else:
-    pyroserver = Server(servicename, given_ip, port,
-                        WorkingDir, argv, autostart,
-                        statuschange, pyruntimevars=pyruntimevars)
-
-
-# Exception hooks s
-import threading, traceback
+    evaluator = default_evaluator
+
+# Exception hooks
+
+
 def LogException(*exp):
-    if pyroserver.plcobj is not None:
-        pyroserver.plcobj.LogMessage(0,'\n'.join(traceback.format_exception(*exp)))
-    else:
-        traceback.print_exception(*exp)
+    LogMessageAndException("", exp)
+
 
 sys.excepthook = LogException
+
+
 def installThreadExcepthook():
     init_old = threading.Thread.__init__
+
     def init(self, *args, **kwargs):
         init_old(self, *args, **kwargs)
         run_old = self.run
+
         def run_with_except_hook(*args, **kw):
             try:
                 run_old(*args, **kw)
             except (KeyboardInterrupt, SystemExit):
                 raise
-            except:
+            except Exception:
                 sys.excepthook(*sys.exc_info())
         self.run = run_with_except_hook
     threading.Thread.__init__ = init
+
+
 installThreadExcepthook()
+havewamp = False
 
 if havetwisted:
-    if webport is not None :
+    if webport is not None:
         try:
-            import runtime.NevowServer as NS
-        except Exception, e:
-            print _("Nevow/Athena import failed :"), e
+            import runtime.NevowServer as NS  # pylint: disable=ungrouped-imports
+        except Exception:
+            LogMessageAndException(_("Nevow/Athena import failed :"))
             webport = None
         NS.WorkingDir = WorkingDir
 
-    if wampconf is not None :
+    try:
+        import runtime.WampClient as WC  # pylint: disable=ungrouped-imports
+        WC.WorkingDir = WorkingDir
+        havewamp = True
+    except Exception:
+        LogMessageAndException(_("WAMP import failed :"))
+
+# Load extensions
+for extention_file, extension_folder in extensions:
+    sys.path.append(extension_folder)
+    execfile(os.path.join(extension_folder, extention_file), locals())
+
+# Service name is used as an ID for stunnel's PSK
+# Some extension may set 'servicename' to a computed ID or Serial Number
+# instead of using commandline '-n'
+if servicename is not None and PSKpath is not None:
+    from runtime.Stunnel import ensurePSK
+    ensurePSK(servicename, PSKpath)
+
+runtime.CreatePLCObjectSingleton(
+    WorkingDir, argv, statuschange, evaluator, pyruntimevars)
+
+pyroserver = PyroServer(servicename, interface, port)
+
+if havewx:
+    taskbar_instance = BeremizTaskBarIcon(pyroserver)
+
+if havetwisted:
+    if webport is not None:
         try:
-            import runtime.WampClient as WC
-        except Exception, e:
-            print _("WAMP import failed :"), e
-            wampconf = None
-
-# Load extensions
-for extfilename in extensions:
-    extension_folder = os.path.split(os.path.realpath(extfilename))[0]
-    sys.path.append(extension_folder)
-    execfile(extfilename, locals())
-
-if havetwisted:
-    if webport is not None :
+            website = NS.RegisterWebsite(interface, webport)
+            pyruntimevars["website"] = website
+            NS.SetServer(pyroserver)
+            statuschange.append(NS.website_statuslistener_factory(website))
+        except Exception:
+            LogMessageAndException(_("Nevow Web service failed. "))
+
+    if havewamp:
         try:
-            website = NS.RegisterWebsite(webport)
-            pyruntimevars["website"] = website
-            statuschange.append(NS.website_statuslistener_factory(website))
-        except Exception, e:
-            print _("Nevow Web service failed. "), e
-
-    if wampconf is not None :
-        try:
-            WC.RegisterWampClient(wampconf)
-            pyruntimevars["wampsession"] = WC.GetSession
             WC.SetServer(pyroserver)
-        except Exception, e:
-            print _("WAMP client startup failed. "), e
-
+            WC.RegisterWampClient(wampconf, PSKpath)
+            WC.RegisterWebSettings(NS)
+        except Exception:
+            LogMessageAndException(_("WAMP client startup failed. "))
+
+pyro_thread_started = Lock()
+pyro_thread_started.acquire()
+pyro_thread = Thread(target=pyroserver.PyroLoop,
+                     kwargs=dict(when_ready=pyro_thread_started.release))
+pyro_thread.start()
+
+# Wait for pyro thread to be effective
+pyro_thread_started.acquire()
+
+pyroserver.PrintServerInfo()
+
+# Beremiz IDE detects LOCAL:// runtime is ready by looking
+# for self.workdir in the daemon's stdout.
+sys.stdout.write(_("Current working directory :") + WorkingDir + "\n")
+sys.stdout.flush()
 
 if havetwisted or havewx:
-    pyro_thread=Thread(target=pyroserver.Loop)
-    pyro_thread.start()
-
+    ui_thread_started = Lock()
+    ui_thread_started.acquire()
     if havetwisted:
-        reactor.run()
-    elif havewx:
-        app.MainLoop()
-else:
-    try :
-        pyroserver.Loop()
-    except KeyboardInterrupt,e:
-        pass
+        # reactor._installSignalHandlersAgain()
+        def ui_thread_target():
+            # FIXME: had to disable SignaHandlers install because
+            # signal not working in non-main thread
+            reactor.run(installSignalHandlers=False)
+    else:
+        ui_thread_target = app.MainLoop
+
+    ui_thread = Thread(target=ui_thread_target)
+    ui_thread.start()
+
+    # This order ui loop to unblock main thread when ready.
+    if havetwisted:
+        reactor.callLater(0, ui_thread_started.release)
+    else:
+        wx.CallAfter(ui_thread_started.release)
+
+    # Wait for ui thread to be effective
+    ui_thread_started.acquire()
+    print("UI thread started successfully.")
+
+try:
+    runtime.MainWorker.runloop(
+        runtime.GetPLCObjectSingleton().AutoLoad, autostart)
+except KeyboardInterrupt:
+    pass
+
 pyroserver.Quit()
+
+plcobj = runtime.GetPLCObjectSingleton()
+plcobj.StopPLC()
+plcobj.UnLoadPLC()
+
 sys.exit(0)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CONTRIBUTING.md	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,31 @@
+How Do I Submit A Good Pull Request?
+----------------------------------
+
+It's highly recommended to write nice and clean python code. Beremiz
+project tries to follows most of PEP-8 recommendations. They are
+automatically checked on every push and merge by Bitbucket pipelines.
+
+To avoid pushing "unclean" code, i's recommended to add one of the following
+commands to pre commit Mercurial hook into .hg/hgrc configuration file.
+
+Unfortunately script can't distinguish between real commit and shelve. If you
+are using shelve (or maybe some other affected commands), it's recommended to
+use pre-<command> and post-<command> hooks to create flags to skip checks on
+some operations.
+
+
+```
+[hooks]
+pre-shelve.linter = touch .hg/skiphook
+post-shelve.linter = rm .hg/skiphook
+pretxncommit.linter = ./tests/tools/check_source.sh --only-changes
+```
+or the same done using Docker container, so result will be the same as
+on Bitbucket pipeline.
+
+```
+[hooks]
+pre-shelve.linter = touch .hg/skiphook
+post-shelve.linter = rm .hg/skiphook
+pretxncommit.linter = hg status -m -n -a -n -I '**.py' --change $HG_NODE > files.lst && docker run --volume=$PWD:/beremiz --workdir="/beremiz" --volume=$PWD/../CanFestival-3:/CanFestival-3 --memory=1g --entrypoint=/beremiz/tests/tools/check_source.sh skvorl/beremiz-requirements --files-to-check files.lst
+```
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/COPYING.Runtime	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,502 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
--- a/CodeFileTreeNode.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/CodeFileTreeNode.py	Mon Jan 07 13:50:39 2019 +0100
@@ -23,9 +23,13 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 
-import os, re, traceback
-
+from __future__ import absolute_import
+import os
+import re
+import traceback
+from builtins import str as text
 from copy import deepcopy
+
 from lxml import etree
 from xmlclass import GenerateParserFromXSDstring
 
@@ -80,11 +84,12 @@
 
 SECTION_TAG_ELEMENT = "<xsd:element name=\"%s\" type=\"CodeText\"/>"
 
-class CodeFile:
-    
+
+class CodeFile(object):
+
     CODEFILE_NAME = "CodeFile"
     SECTIONS_NAMES = []
-    
+
     def __init__(self):
         sections_str = {"codefile_name": self.CODEFILE_NAME}
         if "includes" in self.SECTIONS_NAMES:
@@ -94,36 +99,36 @@
         sections_str["sections"] = "\n".join(
             [SECTION_TAG_ELEMENT % name
              for name in self.SECTIONS_NAMES if name != "includes"])
-        
+
         self.CodeFileParser = GenerateParserFromXSDstring(
             CODEFILE_XSD % sections_str)
         self.CodeFileVariables = etree.XPath("variables/variable")
-        
+
         filepath = self.CodeFileName()
-        
         if os.path.isfile(filepath):
             xmlfile = open(filepath, 'r')
             codefile_xml = xmlfile.read()
             xmlfile.close()
-            
+
             codefile_xml = codefile_xml.replace(
-                '<%s>' % self.CODEFILE_NAME, 
+                '<%s>' % self.CODEFILE_NAME,
                 '<%s xmlns:xhtml="http://www.w3.org/1999/xhtml">' % self.CODEFILE_NAME)
             for cre, repl in [
-                (re.compile("(?<!<xhtml:p>)(?:<!\[CDATA\[)"), "<xhtml:p><![CDATA["),
-                (re.compile("(?:]]>)(?!</xhtml:p>)"), "]]></xhtml:p>")]:
+                    (re.compile(r"(?<!<xhtml:p>)(?:<!\[CDATA\[)"), "<xhtml:p><![CDATA["),
+                    (re.compile(r"(?:]]>)(?!</xhtml:p>)"), "]]></xhtml:p>")]:
                 codefile_xml = cre.sub(repl, codefile_xml)
-            
+
             try:
                 self.CodeFile, error = self.CodeFileParser.LoadXMLString(codefile_xml)
                 if error is not None:
                     (fname, lnum, src) = ((self.CODEFILE_NAME,) + error)
-                    self.GetCTRoot().logger.write_warning(XSDSchemaErrorMessage.format(a1 = fname, a2 = lnum, a3 = src))
+                    self.GetCTRoot().logger.write_warning(XSDSchemaErrorMessage.format(a1=fname, a2=lnum, a3=src))
                 self.CreateCodeFileBuffer(True)
-            except Exception, exc:
-                msg = _("Couldn't load confnode parameters {a1} :\n {a2}").format(a1 = CTNName, a2 = unicode(exc))
+            except Exception as exc:
+                msg = _("Couldn't load confnode parameters {a1} :\n {a2}").format(a1=self.CTNName(), a2=text(exc))
                 self.GetCTRoot().logger.write_error(msg)
                 self.GetCTRoot().logger.write_error(traceback.format_exc())
+                raise Exception
         else:
             self.CodeFile = self.CodeFileParser.CreateRoot()
             self.CreateCodeFileBuffer(False)
@@ -132,14 +137,14 @@
     def GetBaseTypes(self):
         return self.GetCTRoot().GetBaseTypes()
 
-    def GetDataTypes(self, basetypes = False):
+    def GetDataTypes(self, basetypes=False):
         return self.GetCTRoot().GetDataTypes(basetypes=basetypes)
 
-    def GenerateNewName(self, format, start_idx):
+    def GenerateNewName(self, name, format):
         return self.GetCTRoot().GenerateNewName(
-            None, None, format, start_idx,
-            dict([(var.getname().upper(), True) 
-                  for var in self.CodeFile.variables.getvariable()]))
+            None, name, format,
+            exclude=dict([(var.getname().upper(), True)
+                          for var in self.CodeFile.variables.getvariable()]))
 
     def SetVariables(self, variables):
         self.CodeFile.variables.setvariable([])
@@ -152,17 +157,18 @@
             variable.setonchange(var["OnChange"])
             variable.setopts(var["Options"])
             self.CodeFile.variables.appendvariable(variable)
-    
+
     def GetVariables(self):
         datas = []
         for var in self.CodeFileVariables(self.CodeFile):
-            datas.append({"Name" : var.getname(), 
-                          "Type" : var.gettype(), 
-                          "Initial" : var.getinitial(),
-                          "Description" : var.getdesc(),
-                          "OnChange"    : var.getonchange(),
-                          "Options"     : var.getopts(),
-                         })
+            datas.append({
+                "Name":        var.getname(),
+                "Type":        var.gettype(),
+                "Initial":     var.getinitial(),
+                "Description": var.getdesc(),
+                "OnChange":    var.getonchange(),
+                "Options":     var.getopts(),
+            })
         return datas
 
     def SetTextParts(self, parts):
@@ -170,47 +176,47 @@
             section_code = parts.get(section)
             if section_code is not None:
                 getattr(self.CodeFile, section).setanyText(section_code)
-    
+
     def GetTextParts(self):
         return dict([(section, getattr(self.CodeFile, section).getanyText())
                      for section in self.SECTIONS_NAMES])
-            
+
     def CTNTestModified(self):
-        return self.ChangesToSave or not self.CodeFileIsSaved()    
+        return self.ChangesToSave or not self.CodeFileIsSaved()
 
     def OnCTNSave(self, from_project_path=None):
         filepath = self.CodeFileName()
-        
-        xmlfile = open(filepath,"w")
+
+        xmlfile = open(filepath, "w")
         xmlfile.write(etree.tostring(
-            self.CodeFile, 
-            pretty_print=True, 
-            xml_declaration=True, 
+            self.CodeFile,
+            pretty_print=True,
+            xml_declaration=True,
             encoding='utf-8'))
         xmlfile.close()
-        
+
         self.MarkCodeFileAsSaved()
         return True
 
     def CTNGlobalInstances(self):
         variables = self.CodeFileVariables(self.CodeFile)
-        ret =  [(variable.getname(),
-                 variable.gettype(),
-                 variable.getinitial()) 
-                for variable in variables]
+        ret = [(variable.getname(),
+                variable.gettype(),
+                variable.getinitial())
+               for variable in variables]
         ret.extend([("On"+variable.getname()+"Change", "python_poll", "")
-                for variable in variables
-                if variable.getonchange()])
+                    for variable in variables
+                    if variable.getonchange()])
         return ret
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                      Current Buffering Management Functions
-#-------------------------------------------------------------------------------
-
-    """
-    Return a copy of the codefile model
-    """
+# -------------------------------------------------------------------------------
+
     def Copy(self, model):
+        """
+        Return a copy of the codefile model
+        """
         return deepcopy(model)
 
     def CreateCodeFileBuffer(self, saved):
@@ -219,31 +225,30 @@
 
     def BufferCodeFile(self):
         self.CodeFileBuffer.Buffering(self.CodeFileParser.Dumps(self.CodeFile))
-    
+
     def StartBuffering(self):
         self.Buffering = True
-        
+
     def EndBuffering(self):
         if self.Buffering:
             self.CodeFileBuffer.Buffering(self.CodeFileParser.Dumps(self.CodeFile))
             self.Buffering = False
-    
+
     def MarkCodeFileAsSaved(self):
         self.EndBuffering()
         self.CodeFileBuffer.CurrentSaved()
-    
+
     def CodeFileIsSaved(self):
         return self.CodeFileBuffer.IsCurrentSaved() and not self.Buffering
-        
+
     def LoadPrevious(self):
         self.EndBuffering()
         self.CodeFile = self.CodeFileParser.Loads(self.CodeFileBuffer.Previous())
-    
+
     def LoadNext(self):
         self.CodeFile = self.CodeFileParser.Loads(self.CodeFileBuffer.Next())
-    
+
     def GetBufferState(self):
         first = self.CodeFileBuffer.IsFirst() and not self.Buffering
         last = self.CodeFileBuffer.IsLast()
         return not first, not last
-
--- a/ConfigTreeNode.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/ConfigTreeNode.py	Mon Jan 07 13:50:39 2019 +0100
@@ -31,14 +31,18 @@
 - ... TODO : document
 """
 
-import os,traceback,types
+from __future__ import absolute_import
+import os
+import traceback
+import types
 import shutil
+from builtins import str as text
+from past.builtins import execfile
+
 from lxml import etree
 
 from xmlclass import GenerateParserFromXSDstring
-from util.misc import GetClassImporter
-
-from PLCControler import PLCControler, LOCATION_CONFNODE
+from PLCControler import LOCATION_CONFNODE
 from editors.ConfTreeNodeEditor import ConfTreeNodeEditor
 
 _BaseParamsParser = GenerateParserFromXSDstring("""<?xml version="1.0" encoding="ISO-8859-1" ?>
@@ -53,9 +57,10 @@
         </xsd:schema>""")
 
 NameTypeSeparator = '@'
-XSDSchemaErrorMessage = _("{a1} XML file doesn't follow XSD schema at line %{a2}:\n{a3}")
-
-class ConfigTreeNode:
+XSDSchemaErrorMessage = _("{a1} XML file doesn't follow XSD schema at line {a2}:\n{a3}")
+
+
+class ConfigTreeNode(object):
     """
     This class is the one that define confnodes.
     """
@@ -67,7 +72,7 @@
     LibraryControler = None
     EditorType = ConfTreeNodeEditor
     IconPath = None
-    
+
     def _AddParamsMembers(self):
         self.CTNParams = None
         if self.XSD:
@@ -78,7 +83,7 @@
             setattr(self, name, obj)
 
     def __init__(self):
-        # Create BaseParam 
+        # Create BaseParam
         self.BaseParams = _BaseParamsParser.CreateRoot()
         self.MandatoryParams = ("BaseParams", self.BaseParams)
         self._AddParamsMembers()
@@ -86,39 +91,39 @@
         self._View = None
         # copy ConfNodeMethods so that it can be later customized
         self.ConfNodeMethods = [dic.copy() for dic in self.ConfNodeMethods]
-        
+
     def ConfNodeBaseXmlFilePath(self, CTNName=None):
         return os.path.join(self.CTNPath(CTNName), "baseconfnode.xml")
-    
+
     def ConfNodeXmlFilePath(self, CTNName=None):
         return os.path.join(self.CTNPath(CTNName), "confnode.xml")
 
     def ConfNodePath(self):
         return os.path.join(self.CTNParent.ConfNodePath(), self.CTNType)
 
-    def CTNPath(self,CTNName=None,project_path=None):
+    def CTNPath(self, CTNName=None, project_path=None):
         if not CTNName:
             CTNName = self.CTNName()
         if not project_path:
             project_path = self.CTNParent.CTNPath()
         return os.path.join(project_path,
                             CTNName + NameTypeSeparator + self.CTNType)
-    
+
     def CTNName(self):
         return self.BaseParams.getName()
-    
+
     def CTNEnabled(self):
         return self.BaseParams.getEnabled()
-    
+
     def CTNFullName(self):
         parent = self.CTNParent.CTNFullName()
         if parent != "":
             return parent + "." + self.CTNName()
         return self.BaseParams.getName()
-    
+
     def GetIconName(self):
         return None
-    
+
     def CTNTestModified(self):
         return self.ChangesToSave
 
@@ -134,15 +139,15 @@
                 return True
 
         return False
-    
+
     def RemoteExec(self, script, **kwargs):
         return self.CTNParent.RemoteExec(script, **kwargs)
-    
+
     def OnCTNSave(self, from_project_path=None):
-        #Default, do nothing and return success
+        """Default, do nothing and return success"""
         return True
 
-    def GetParamsAttributes(self, path = None):
+    def GetParamsAttributes(self, path=None):
         if path:
             parts = path.split(".", 1)
             if self.MandatoryParams and parts[0] == self.MandatoryParams[0]:
@@ -154,7 +159,7 @@
             if self.CTNParams:
                 params.append(self.CTNParams[1].getElementInfos(self.CTNParams[0]))
             return params
-        
+
     def SetParamsAttribute(self, path, value):
         self.ChangesToSave = True
         # Filter IEC_Channel and Name, that have specific behavior
@@ -169,7 +174,7 @@
             res = self.FindNewName(value)
             self.CTNRequestSave()
             return res, True
-        
+
         parts = path.split(".", 1)
         if self.MandatoryParams and parts[0] == self.MandatoryParams[0]:
             self.MandatoryParams[1].setElementValue(parts[1], value)
@@ -189,32 +194,32 @@
             if not os.path.isdir(ctnpath):
                 # Create it
                 os.mkdir(ctnpath)
-    
+
             # generate XML for base XML parameters controller of the confnode
             if self.MandatoryParams:
-                BaseXMLFile = open(self.ConfNodeBaseXmlFilePath(),'w')
+                BaseXMLFile = open(self.ConfNodeBaseXmlFilePath(), 'w')
                 BaseXMLFile.write(etree.tostring(
-                    self.MandatoryParams[1], 
-                    pretty_print=True, 
-                    xml_declaration=True, 
+                    self.MandatoryParams[1],
+                    pretty_print=True,
+                    xml_declaration=True,
                     encoding='utf-8'))
                 BaseXMLFile.close()
-            
+
             # generate XML for XML parameters controller of the confnode
             if self.CTNParams:
-                XMLFile = open(self.ConfNodeXmlFilePath(),'w')
+                XMLFile = open(self.ConfNodeXmlFilePath(), 'w')
                 XMLFile.write(etree.tostring(
-                    self.CTNParams[1], 
-                    pretty_print=True, 
-                    xml_declaration=True, 
+                    self.CTNParams[1],
+                    pretty_print=True,
+                    xml_declaration=True,
                     encoding='utf-8'))
                 XMLFile.close()
-            
+
             # Call the confnode specific OnCTNSave method
             result = self.OnCTNSave(from_project_path)
             if not result:
-                return _("Error while saving \"%s\"\n")%self.CTNPath()
-    
+                return _("Error while saving \"%s\"\n") % self.CTNPath()
+
             # mark confnode as saved
             self.ChangesToSave = False
             # go through all children and do the same
@@ -226,7 +231,7 @@
                 if result:
                     return result
         return None
-    
+
     def CTNImport(self, src_CTNPath):
         shutil.copytree(src_CTNPath, self.CTNPath)
         return True
@@ -236,13 +241,13 @@
         @return: [(instance_name, instance_type),...]
         """
         return []
-    
+
     def _GlobalInstances(self):
         instances = self.CTNGlobalInstances()
         for CTNChild in self.IECSortedChildren():
             instances.extend(CTNChild._GlobalInstances())
         return instances
-    
+
     def CTNGenerate_C(self, buildpath, locations):
         """
         Generate C code
@@ -255,9 +260,9 @@
             }, ...]
         @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
         """
-        self.GetCTRoot().logger.write_warning(".".join(map(lambda x:str(x), self.GetCurrentLocation())) + " -> Nothing to do\n")
-        return [],"",False
-    
+        self.GetCTRoot().logger.write_warning(".".join(map(str, self.GetCurrentLocation())) + " -> Nothing to do\n")
+        return [], "", False
+
     def _Generate_C(self, buildpath, locations):
         # Generate confnodes [(Cfiles, CFLAGS)], LDFLAGS, DoCalls, extra_files
         # extra_files = [(fname,fobject), ...]
@@ -271,48 +276,47 @@
             LocationCFilesAndCFLAGS = []
 
         # confnode asks for some LDFLAGS
-        if CTNLDFLAGS:
+        LDFLAGS = []
+        if CTNLDFLAGS is not None:
             # LDFLAGS can be either string
-            if type(CTNLDFLAGS)==type(str()):
-                LDFLAGS=[CTNLDFLAGS]
-            #or list of strings
-            elif type(CTNLDFLAGS)==type(list()):
-                LDFLAGS=CTNLDFLAGS[:]
-        else:
-            LDFLAGS=[]
-        
+            if isinstance(CTNLDFLAGS, (str, text)):
+                LDFLAGS += [CTNLDFLAGS]
+            # or list of strings
+            elif isinstance(CTNLDFLAGS, list):
+                LDFLAGS += CTNLDFLAGS
+
         # recurse through all children, and stack their results
         for CTNChild in self.IECSortedChildren():
             new_location = CTNChild.GetCurrentLocation()
             # How deep are we in the tree ?
-            depth=len(new_location)
+            depth = len(new_location)
             _LocationCFilesAndCFLAGS, _LDFLAGS, _extra_files = \
                 CTNChild._Generate_C(
-                    #keep the same path
+                    # keep the same path
                     buildpath,
                     # filter locations that start with current IEC location
-                    [loc for loc in locations if loc["LOC"][0:depth] == new_location ])
+                    [loc for loc in locations if loc["LOC"][0:depth] == new_location])
             # stack the result
             LocationCFilesAndCFLAGS += _LocationCFilesAndCFLAGS
             LDFLAGS += _LDFLAGS
             extra_files += _extra_files
-        
+
         return LocationCFilesAndCFLAGS, LDFLAGS, extra_files
 
     def IterChildren(self):
-        for CTNType, Children in self.Children.items():
+        for _CTNType, Children in self.Children.items():
             for CTNInstance in Children:
                 yield CTNInstance
-    
+
     def IECSortedChildren(self):
         # reorder children by IEC_channels
-        ordered = [(chld.BaseParams.getIEC_Channel(),chld) for chld in self.IterChildren()]
+        ordered = [(chld.BaseParams.getIEC_Channel(), chld) for chld in self.IterChildren()]
         if ordered:
             ordered.sort()
             return zip(*ordered)[1]
         else:
             return []
-    
+
     def _GetChildBySomething(self, something, toks):
         for CTNInstance in self.IterChildren():
             # if match component of the name
@@ -320,7 +324,7 @@
                 # if Name have other components
                 if len(toks) >= 2:
                     # Recurse in order to find the latest object
-                    return CTNInstance._GetChildBySomething( something, toks[1:])
+                    return CTNInstance._GetChildBySomething(something, toks[1:])
                 # No sub name -> found
                 return CTNInstance
         # Not found
@@ -338,7 +342,7 @@
             return self._GetChildBySomething("IEC_Channel", Location)
         else:
             return self
-    
+
     def GetCurrentLocation(self):
         """
         @return:  Tupple containing confnode IEC location of current confnode : %I0.0.4.5 => (0,0,4,5)
@@ -349,13 +353,13 @@
         """
         @return:  String "ParentParentName.ParentName.Name"
         """
-        return  self.CTNParent._GetCurrentName() + self.BaseParams.getName()
+        return self.CTNParent._GetCurrentName() + self.BaseParams.getName()
 
     def _GetCurrentName(self):
         """
         @return:  String "ParentParentName.ParentName.Name."
         """
-        return  self.CTNParent._GetCurrentName() + self.BaseParams.getName() + "."
+        return self.CTNParent._GetCurrentName() + self.BaseParams.getName() + "."
 
     def GetCTRoot(self):
         return self.CTNParent.GetCTRoot()
@@ -372,7 +376,7 @@
         This function is meant to be overridden by confnodes.
 
         It should returns an list of dictionaries
-        
+
         - IEC_type is an IEC type like BOOL/BYTE/SINT/...
         - location is a string of this variable's location, like "%IX0.0.0"
         '''
@@ -389,12 +393,9 @@
         Changes Name to DesiredName if available, Name-N if not.
         @param DesiredName: The desired Name (string)
         """
-        # Get Current Name
-        CurrentName = self.BaseParams.getName()
-        # Do nothing if no change
-        #if CurrentName == DesiredName: return CurrentName
+
         # Build a list of used Name out of parent's Children
-        AllNames=[]
+        AllNames = []
         for CTNInstance in self.CTNParent.IterChildren():
             if CTNInstance != self:
                 AllNames.append(CTNInstance.BaseParams.getName())
@@ -407,26 +408,27 @@
             BaseDesiredName = DesiredName
         suffix = 1
         while res in AllNames:
-            res = "%s_%d"%(BaseDesiredName, suffix)
+            res = "%s_%d" % (BaseDesiredName, suffix)
             suffix += 1
-        
-        # Get old path
-        oldname = self.CTNPath()
+
         # Check previous confnode existance
         dontexist = self.BaseParams.getName() == "__unnamed__"
+        if not dontexist:
+            # Get old path
+            oldpath = self.CTNPath()
         # Set the new name
         self.BaseParams.setName(res)
         # Rename confnode dir if exist
         if not dontexist:
-            shutil.move(oldname, self.CTNPath())
+            shutil.move(oldpath, self.CTNPath())
         # warn user he has two left hands
         if DesiredName != res:
-            msg = _("A child named \"{a1}\" already exists -> \"{a2}\"\n").format(a1 = DesiredName, a2 = res)
+            msg = _("A child named \"{a1}\" already exists -> \"{a2}\"\n").format(a1=DesiredName, a2=res)
             self.GetCTRoot().logger.write_warning(msg)
         return res
 
     def GetAllChannels(self):
-        AllChannels=[]
+        AllChannels = []
         for CTNInstance in self.CTNParent.IterChildren():
             if CTNInstance != self:
                 AllChannels.append(CTNInstance.BaseParams.getIEC_Channel())
@@ -441,20 +443,20 @@
         # Get Current IEC channel
         CurrentChannel = self.BaseParams.getIEC_Channel()
         # Do nothing if no change
-        #if CurrentChannel == DesiredChannel: return CurrentChannel
+        # if CurrentChannel == DesiredChannel: return CurrentChannel
         # Build a list of used Channels out of parent's Children
         AllChannels = self.GetAllChannels()
-        
+
         # Now, try to guess the nearest available channel
         res = DesiredChannel
-        while res in AllChannels: # While channel not free
-            if res < CurrentChannel: # Want to go down ?
-                res -=  1 # Test for n-1
-                if res < 0 :
-                    self.GetCTRoot().logger.write_warning(_("Cannot find lower free IEC channel than %d\n")%CurrentChannel)
-                    return CurrentChannel # Can't go bellow 0, do nothing
-            else : # Want to go up ?
-                res +=  1 # Test for n-1
+        while res in AllChannels:  # While channel not free
+            if res < CurrentChannel:  # Want to go down ?
+                res -= 1  # Test for n-1
+                if res < 0:
+                    self.GetCTRoot().logger.write_warning(_("Cannot find lower free IEC channel than %d\n") % CurrentChannel)
+                    return CurrentChannel  # Can't go bellow 0, do nothing
+            else:  # Want to go up ?
+                res += 1  # Test for n-1
         # Finally set IEC Channel
         self.BaseParams.setIEC_Channel(res)
         return res
@@ -466,14 +468,14 @@
         if self.EditorType is not None:
             app_frame = self.GetCTRoot().AppFrame
             if self._View is None and not onlyopened:
-                
+
                 self._View = self.EditorType(app_frame.TabsOpened, self, app_frame)
-            
+
             if self._View is not None:
                 if name is None:
                     name = self.CTNFullName()
                 app_frame.EditProjectElement(self._View, name)
-            
+
             return self._View
         return None
 
@@ -499,7 +501,10 @@
         # Call the OnCloseMethod
         CTNInstance.OnCTNClose()
         # Delete confnode dir
-        shutil.rmtree(CTNInstance.CTNPath())
+        try:
+            shutil.rmtree(CTNInstance.CTNPath())
+        except Exception:
+            pass
         # Remove child of Children
         self.Children[CTNInstance.CTNType].remove(CTNInstance)
         if len(self.Children[CTNInstance.CTNType]) == 0:
@@ -508,7 +513,7 @@
 
     def CTNRemove(self):
         # Fetch the confnode
-        #CTNInstance = self.GetChildByName(CTNName)
+        # CTNInstance = self.GetChildByName(CTNName)
         # Ask to his parent to remove it
         self.CTNParent._doRemoveChild(self)
 
@@ -521,97 +526,98 @@
         # reorganize self.CTNChildrenTypes tuples from (name, CTNClass, Help)
         # to ( name, (CTNClass, Help)), an make a dict
         transpose = zip(*self.CTNChildrenTypes)
-        CTNChildrenTypes = dict(zip(transpose[0],zip(transpose[1],transpose[2])))
+        CTNChildrenTypes = dict(zip(transpose[0], zip(transpose[1], transpose[2])))
         # Check that adding this confnode is allowed
         try:
             CTNClass, CTNHelp = CTNChildrenTypes[CTNType]
         except KeyError:
-            raise Exception, _("Cannot create child {a1} of type {a2} ").format(a1 = CTNName, a2 = CTNType)
-        
+            raise Exception(_("Cannot create child {a1} of type {a2} ").
+                            format(a1=CTNName, a2=CTNType))
+
         # if CTNClass is a class factory, call it. (prevent unneeded imports)
-        if type(CTNClass) == types.FunctionType:
+        if isinstance(CTNClass, types.FunctionType):
             CTNClass = CTNClass()
-        
+
         # Eventualy Initialize child instance list for this class of confnode
         ChildrenWithSameClass = self.Children.setdefault(CTNType, list())
         # Check count
         if getattr(CTNClass, "CTNMaxCount", None) and len(ChildrenWithSameClass) >= CTNClass.CTNMaxCount:
-            msg = _("Max count ({a1}) reached for this confnode of type {a2} ").format(a1 = CTNClass.CTNMaxCount, a2 = CTNType)
-            raise Exception, msg
-        
+            raise Exception(
+                _("Max count ({a1}) reached for this confnode of type {a2} ").
+                format(a1=CTNClass.CTNMaxCount, a2=CTNType))
+
         # create the final class, derived of provided confnode and template
         class FinalCTNClass(CTNClass, ConfigTreeNode):
             """
             ConfNode class is derivated into FinalCTNClass before being instanciated
-            This way __init__ is overloaded to ensure ConfigTreeNode.__init__ is called 
+            This way __init__ is overloaded to ensure ConfigTreeNode.__init__ is called
             before CTNClass.__init__, and to do the file related stuff.
             """
-            def __init__(_self):
-                # self is the parent
-                _self.CTNParent = self
+            def __init__(self, parent):
+                self.CTNParent = parent
                 # Keep track of the confnode type name
-                _self.CTNType = CTNType
+                self.CTNType = CTNType
                 # remind the help string, for more fancy display
-                _self.CTNHelp = CTNHelp
+                self.CTNHelp = CTNHelp
                 # Call the base confnode template init - change XSD into class members
-                ConfigTreeNode.__init__(_self)
+                ConfigTreeNode.__init__(self)
                 # check name is unique
-                NewCTNName = _self.FindNewName(CTNName)
+                NewCTNName = self.FindNewName(CTNName)
                 # If dir have already be made, and file exist
-                if os.path.isdir(_self.CTNPath(NewCTNName)): #and os.path.isfile(_self.ConfNodeXmlFilePath(CTNName)):
-                    #Load the confnode.xml file into parameters members
-                    _self.LoadXMLParams(NewCTNName)
+                if os.path.isdir(self.CTNPath(NewCTNName)):  # and os.path.isfile(self.ConfNodeXmlFilePath(CTNName)):
+                    # Load the confnode.xml file into parameters members
+                    self.LoadXMLParams(NewCTNName)
                     # Basic check. Better to fail immediately.
-                    if (_self.BaseParams.getName() != NewCTNName):
-                        msg = _("Project tree layout do not match confnode.xml {a1}!={a2} ").\
-                              format(a1 = NewCTNName, a2 = _self.BaseParams.getName())
-                        raise Exception, msg
+                    if self.BaseParams.getName() != NewCTNName:
+                        raise Exception(
+                            _("Project tree layout do not match confnode.xml {a1}!={a2} ").
+                            format(a1=NewCTNName, a2=self.BaseParams.getName()))
 
                     # Now, self.CTNPath() should be OK
-                    
+
                     # Check that IEC_Channel is not already in use.
-                    _self.FindNewIEC_Channel(_self.BaseParams.getIEC_Channel())
+                    self.FindNewIEC_Channel(self.BaseParams.getIEC_Channel())
                     # Call the confnode real __init__
                     if getattr(CTNClass, "__init__", None):
-                        CTNClass.__init__(_self)
-                    #Load and init all the children
-                    _self.LoadChildren()
-                    #just loaded, nothing to saved
-                    _self.ChangesToSave = False
+                        CTNClass.__init__(self)
+                    # Load and init all the children
+                    self.LoadChildren()
+                    # just loaded, nothing to saved
+                    self.ChangesToSave = False
                 else:
                     # If confnode do not have corresponding file/dirs - they will be created on Save
-                    _self.CTNMakeDir()
+                    self.CTNMakeDir()
                     # Find an IEC number
-                    _self.FindNewIEC_Channel(IEC_Channel)
+                    self.FindNewIEC_Channel(IEC_Channel)
                     # Call the confnode real __init__
                     if getattr(CTNClass, "__init__", None):
-                        CTNClass.__init__(_self)
-                    _self.CTNRequestSave()
-                    #just created, must be saved
-                    _self.ChangesToSave = True
-                
-            def _getBuildPath(_self):
-                return self._getBuildPath()
-            
+                        CTNClass.__init__(self)
+                    self.CTNRequestSave()
+                    # just created, must be saved
+                    self.ChangesToSave = True
+
+            def _getBuildPath(self):
+                return self.CTNParent._getBuildPath()
+
         # Create the object out of the resulting class
-        newConfNodeOpj = FinalCTNClass()
+        newConfNodeOpj = FinalCTNClass(self)
         # Store it in CTNgedChils
         ChildrenWithSameClass.append(newConfNodeOpj)
-        
+
         return newConfNodeOpj
-    
+
     def ClearChildren(self):
         for child in self.IterChildren():
             child.ClearChildren()
         self.Children = {}
-    
-    def LoadXMLParams(self, CTNName = None):
+
+    def LoadXMLParams(self, CTNName=None):
         methode_name = os.path.join(self.CTNPath(CTNName), "methods.py")
         if os.path.isfile(methode_name):
             execfile(methode_name)
-        
+
         ConfNodeName = CTNName if CTNName is not None else self.CTNName()
-        
+
         # Get the base xml tree
         if self.MandatoryParams:
             try:
@@ -619,14 +625,14 @@
                 self.BaseParams, error = _BaseParamsParser.LoadXMLString(basexmlfile.read())
                 if error is not None:
                     (fname, lnum, src) = ((ConfNodeName + " BaseParams",) + error)
-                    self.GetCTRoot().logger.write_warning(XSDSchemaErrorMessage.format(a1 = fname, a2 = lnum, a3 = src))
+                    self.GetCTRoot().logger.write_warning(XSDSchemaErrorMessage.format(a1=fname, a2=lnum, a3=src))
                 self.MandatoryParams = ("BaseParams", self.BaseParams)
                 basexmlfile.close()
-            except Exception, exc:
-                msg = _("Couldn't load confnode base parameters {a1} :\n {a2}").format(a1 =  ConfNodeName, a2 = unicode(exc))
+            except Exception as exc:
+                msg = _("Couldn't load confnode base parameters {a1} :\n {a2}").format(a1=ConfNodeName, a2=text(exc))
                 self.GetCTRoot().logger.write_error(msg)
                 self.GetCTRoot().logger.write_error(traceback.format_exc())
-        
+
         # Get the xml tree
         if self.CTNParams:
             try:
@@ -634,16 +640,16 @@
                 obj, error = self.Parser.LoadXMLString(xmlfile.read())
                 if error is not None:
                     (fname, lnum, src) = ((ConfNodeName,) + error)
-                    self.GetCTRoot().logger.write_warning(XSDSchemaErrorMessage.format(a1 = fname, a2 = lnum, a3 = src))
+                    self.GetCTRoot().logger.write_warning(XSDSchemaErrorMessage.format(a1=fname, a2=lnum, a3=src))
                 name = obj.getLocalTag()
                 setattr(self, name, obj)
                 self.CTNParams = (name, obj)
                 xmlfile.close()
-            except Exception, exc:
-                msg = _("Couldn't load confnode parameters {a1} :\n {a2}").format(a1 = ConfNodeName, a2 = unicode(exc))
+            except Exception as exc:
+                msg = _("Couldn't load confnode parameters {a1} :\n {a2}").format(a1=ConfNodeName, a2=text(exc))
                 self.GetCTRoot().logger.write_error(msg)
                 self.GetCTRoot().logger.write_error(traceback.format_exc())
-        
+
     def LoadChildren(self):
         # Iterate over all CTNName@CTNType in confnode directory, and try to open them
         for CTNDir in os.listdir(self.CTNPath()):
@@ -652,8 +658,7 @@
                 pname, ptype = CTNDir.split(NameTypeSeparator)
                 try:
                     self.CTNAddChild(pname, ptype)
-                except Exception, exc:
-                    msg = _("Could not add child \"{a1}\", type {a2} :\n{a3}\n").format(a1 = pname, a2 = ptype, a3 = unicode(exc))
+                except Exception as exc:
+                    msg = _("Could not add child \"{a1}\", type {a2} :\n{a3}\n").format(a1=pname, a2=ptype, a3=text(exc))
                     self.GetCTRoot().logger.write_error(msg)
                     self.GetCTRoot().logger.write_error(traceback.format_exc())
-
--- a/IDEFrame.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/IDEFrame.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,12 +22,18 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import os, sys
-import cPickle
-from types import TupleType
-
-import wx, wx.grid
+from __future__ import absolute_import
+from __future__ import division
+import sys
+import base64
+from future.builtins import \
+    round, \
+    str as text
+
+import wx
+import wx.grid
 import wx.aui
+from six.moves import cPickle, xrange
 
 from editors.EditorPanel import EditorPanel
 from editors.SFCViewer import SFC_Viewer
@@ -41,155 +47,59 @@
 from controls.DebugVariablePanel import DebugVariablePanel
 from dialogs import ProjectDialog, PouDialog, PouTransitionDialog, PouActionDialog, FindInPouDialog, SearchInProjectDialog
 from util.BitmapLibrary import GetBitmap
+from plcopen.types_enums import *
 
 # Define PLCOpenEditor controls id
-[ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK,
- ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK,
- ID_PLCOPENEDITORPROJECTTREE, ID_PLCOPENEDITORMAINSPLITTER,
- ID_PLCOPENEDITORSECONDSPLITTER, ID_PLCOPENEDITORTHIRDSPLITTER,
- ID_PLCOPENEDITORLIBRARYPANEL, ID_PLCOPENEDITORLIBRARYSEARCHCTRL,
- ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT,
- ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTABSOPENED,
- ID_PLCOPENEDITOREDITORMENUTOOLBAR, ID_PLCOPENEDITOREDITORTOOLBAR,
- ID_PLCOPENEDITORPROJECTPANEL,
+[
+    ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK,
+    ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK,
+    ID_PLCOPENEDITORPROJECTTREE, ID_PLCOPENEDITORMAINSPLITTER,
+    ID_PLCOPENEDITORSECONDSPLITTER, ID_PLCOPENEDITORTHIRDSPLITTER,
+    ID_PLCOPENEDITORLIBRARYPANEL, ID_PLCOPENEDITORLIBRARYSEARCHCTRL,
+    ID_PLCOPENEDITORLIBRARYTREE, ID_PLCOPENEDITORLIBRARYCOMMENT,
+    ID_PLCOPENEDITORTABSOPENED, ID_PLCOPENEDITORTABSOPENED,
+    ID_PLCOPENEDITOREDITORMENUTOOLBAR, ID_PLCOPENEDITOREDITORTOOLBAR,
+    ID_PLCOPENEDITORPROJECTPANEL,
 ] = [wx.NewId() for _init_ctrls in range(17)]
 
 # Define PLCOpenEditor EditMenu extra items id
-[ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, ID_PLCOPENEDITOREDITMENUADDDATATYPE,
- ID_PLCOPENEDITOREDITMENUADDFUNCTION, ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
- ID_PLCOPENEDITOREDITMENUADDPROGRAM, ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
- ID_PLCOPENEDITOREDITMENUFINDNEXT, ID_PLCOPENEDITOREDITMENUFINDPREVIOUS,
- ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, ID_PLCOPENEDITOREDITMENUADDRESOURCE
+[
+    ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, ID_PLCOPENEDITOREDITMENUADDDATATYPE,
+    ID_PLCOPENEDITOREDITMENUADDFUNCTION, ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
+    ID_PLCOPENEDITOREDITMENUADDPROGRAM, ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
+    ID_PLCOPENEDITOREDITMENUFINDNEXT, ID_PLCOPENEDITOREDITMENUFINDPREVIOUS,
+    ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, ID_PLCOPENEDITOREDITMENUADDRESOURCE
 ] = [wx.NewId() for _init_coll_EditMenu_Items in range(10)]
 
 # Define PLCOpenEditor DisplayMenu extra items id
-[ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE,
- ID_PLCOPENEDITORDISPLAYMENUSWITCHPERSPECTIVE,
-] = [wx.NewId() for _init_coll_DisplayMenu_Items in range(2)]
-
-#-------------------------------------------------------------------------------
+[
+    ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE,
+    ID_PLCOPENEDITORDISPLAYMENUSWITCHPERSPECTIVE,
+    ID_PLCOPENEDITORDISPLAYMENUFULLSCREEN,
+] = [wx.NewId() for _init_coll_DisplayMenu_Items in range(3)]
+
+# -------------------------------------------------------------------------------
 #                            EditorToolBar definitions
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 # Define PLCOpenEditor Toolbar items id
-[ID_PLCOPENEDITOREDITORTOOLBARSELECTION, ID_PLCOPENEDITOREDITORTOOLBARCOMMENT,
- ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, ID_PLCOPENEDITOREDITORTOOLBARBLOCK,
- ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, ID_PLCOPENEDITOREDITORTOOLBARWIRE,
- ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL, ID_PLCOPENEDITOREDITORTOOLBARRUNG,
- ID_PLCOPENEDITOREDITORTOOLBARCOIL, ID_PLCOPENEDITOREDITORTOOLBARCONTACT,
- ID_PLCOPENEDITOREDITORTOOLBARBRANCH, ID_PLCOPENEDITOREDITORTOOLBARINITIALSTEP,
- ID_PLCOPENEDITOREDITORTOOLBARSTEP, ID_PLCOPENEDITOREDITORTOOLBARTRANSITION,
- ID_PLCOPENEDITOREDITORTOOLBARACTIONBLOCK, ID_PLCOPENEDITOREDITORTOOLBARDIVERGENCE,
- ID_PLCOPENEDITOREDITORTOOLBARJUMP, ID_PLCOPENEDITOREDITORTOOLBARMOTION,
+[
+    ID_PLCOPENEDITOREDITORTOOLBARSELECTION, ID_PLCOPENEDITOREDITORTOOLBARCOMMENT,
+    ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, ID_PLCOPENEDITOREDITORTOOLBARBLOCK,
+    ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, ID_PLCOPENEDITOREDITORTOOLBARWIRE,
+    ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL, ID_PLCOPENEDITOREDITORTOOLBARRUNG,
+    ID_PLCOPENEDITOREDITORTOOLBARCOIL, ID_PLCOPENEDITOREDITORTOOLBARCONTACT,
+    ID_PLCOPENEDITOREDITORTOOLBARBRANCH, ID_PLCOPENEDITOREDITORTOOLBARINITIALSTEP,
+    ID_PLCOPENEDITOREDITORTOOLBARSTEP, ID_PLCOPENEDITOREDITORTOOLBARTRANSITION,
+    ID_PLCOPENEDITOREDITORTOOLBARACTIONBLOCK, ID_PLCOPENEDITOREDITORTOOLBARDIVERGENCE,
+    ID_PLCOPENEDITOREDITORTOOLBARJUMP, ID_PLCOPENEDITOREDITORTOOLBARMOTION,
 ] = [wx.NewId() for _init_coll_DefaultEditorToolBar_Items in range(18)]
 
 
-
-# Define behaviour of each Toolbar item according to current POU body type
-# Informations meaning are in this order:
-#  - Item is toggled
-#  - PLCOpenEditor mode where item is displayed (could be more then one)
-#  - Item id
-#  - Item callback function name
-#  - Item icon filename
-#  - Item tooltip text
-EditorToolBarItems = {
-    "FBD" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
-              "move", _("Move the view")),
-             (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARCOMMENT, "OnCommentTool",
-              "add_comment", _("Create a new comment")),
-             (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, "OnVariableTool",
-              "add_variable", _("Create a new variable")),
-             (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARBLOCK, "OnBlockTool",
-              "add_block", _("Create a new block")),
-             (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, "OnConnectionTool",
-              "add_connection", _("Create a new connection"))],
-    "LD"  : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
-              "move", _("Move the view")),
-             (True, FREEDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARCOMMENT, "OnCommentTool",
-              "add_comment", _("Create a new comment")),
-             (True, FREEDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL, "OnPowerRailTool",
-              "add_powerrail", _("Create a new power rail")),
-             (False, DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARRUNG, "OnRungTool",
-              "add_rung", _("Create a new rung")),
-             (True, FREEDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARCOIL, "OnCoilTool",
-              "add_coil", _("Create a new coil")),
-             (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARCONTACT, "OnContactTool",
-              "add_contact", _("Create a new contact")),
-             (False, DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARBRANCH, "OnBranchTool",
-              "add_branch", _("Create a new branch")),
-             (True, FREEDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, "OnVariableTool",
-              "add_variable", _("Create a new variable")),
-             (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARBLOCK, "OnBlockTool",
-              "add_block", _("Create a new block")),
-             (True, FREEDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, "OnConnectionTool",
-              "add_connection", _("Create a new connection"))],
-    "SFC" : [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
-              "move", _("Move the view")),
-             (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARCOMMENT, "OnCommentTool",
-              "add_comment", _("Create a new comment")),
-             (True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARINITIALSTEP, "OnInitialStepTool",
-              "add_initial_step", _("Create a new initial step")),
-             (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARSTEP, "OnStepTool",
-              "add_step", _("Create a new step")),
-             (True, FREEDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARTRANSITION, "OnTransitionTool",
-              "add_transition", _("Create a new transition")),
-             (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARACTIONBLOCK, "OnActionBlockTool",
-              "add_action", _("Create a new action block")),
-             (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARDIVERGENCE, "OnDivergenceTool",
-              "add_divergence", _("Create a new divergence")),
-             (False, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARJUMP, "OnJumpTool",
-              "add_jump", _("Create a new jump")),
-             (True, FREEDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, "OnVariableTool",
-              "add_variable", _("Create a new variable")),
-             (True, FREEDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARBLOCK, "OnBlockTool",
-              "add_block", _("Create a new block")),
-             (True, FREEDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, "OnConnectionTool",
-              "add_connection", _("Create a new connection")),
-             (True, FREEDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL, "OnPowerRailTool",
-              "add_powerrail", _("Create a new power rail")),
-             (True, FREEDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARCONTACT, "OnContactTool",
-              "add_contact", _("Create a new contact"))],
-    "ST"  : [],
-    "IL"  : [],
-    "debug": [(True, FREEDRAWING_MODE|DRIVENDRAWING_MODE,
-              ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
-              "move", _("Move the view"))],
-}
-
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                               Helper Functions
-#-------------------------------------------------------------------------------
-
-import base64
+# -------------------------------------------------------------------------------
+
 
 def EncodeFileSystemPath(path, use_base64=True):
     path = path.encode(sys.getfilesystemencoding())
@@ -197,22 +107,23 @@
         return base64.encodestring(path)
     return path
 
+
 def DecodeFileSystemPath(path, is_base64=True):
     if is_base64:
         path = base64.decodestring(path)
-    return unicode(path, sys.getfilesystemencoding())
-
-# Compatibility function for wx versions < 2.6
+    return text(path, sys.getfilesystemencoding())
+
+
 def AppendMenu(parent, help, id, kind, text):
-    if wx.VERSION >= (2, 6, 0):
-        parent.Append(help=help, id=id, kind=kind, text=text)
-    else:
-        parent.Append(helpString=help, id=id, kind=kind, item=text)
-
-[TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE,
- POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES
+    parent.Append(help=help, id=id, kind=kind, text=text)
+
+
+[
+    TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE,
+    POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES
 ] = range(10)
 
+
 def GetShortcutKeyCallbackFunction(viewer_function):
     def ShortcutKeyFunction(self, event):
         control = self.FindFocus()
@@ -224,6 +135,7 @@
             control.ProcessEvent(event)
     return ShortcutKeyFunction
 
+
 def GetDeleteElementFunction(remove_function, parent_type=None, check_function=None):
     def DeleteElementFunction(self, selected):
         name = self.ProjectTree.GetItemText(selected)
@@ -236,6 +148,7 @@
                 remove_function(self.Controler, name)
     return DeleteElementFunction
 
+
 if wx.Platform == '__WXMSW__':
     TAB_BORDER = 6
     NOTEBOOK_BORDER = 6
@@ -243,15 +156,16 @@
     TAB_BORDER = 7
     NOTEBOOK_BORDER = 2
 
+
 def SimplifyTabLayout(tabs, rect):
     for tab in tabs:
         if tab["pos"][0] == rect.x:
             others = [t for t in tabs if t != tab]
-            others.sort(lambda x,y: cmp(x["pos"][0], y["pos"][0]))
+            others.sort(lambda x, y: cmp(x["pos"][0], y["pos"][0]))
             for other in others:
-                if (other["pos"][1] == tab["pos"][1] and
-                    other["size"][1] == tab["size"][1] and
-                    other["pos"][0] == tab["pos"][0] + tab["size"][0] + TAB_BORDER):
+                if other["pos"][1] == tab["pos"][1] and \
+                   other["size"][1] == tab["size"][1] and \
+                   other["pos"][0] == tab["pos"][0] + tab["size"][0] + TAB_BORDER:
 
                     tab["size"] = (tab["size"][0] + other["size"][0] + TAB_BORDER, tab["size"][1])
                     tab["pages"].extend(other["pages"])
@@ -262,11 +176,11 @@
 
         elif tab["pos"][1] == rect.y:
             others = [t for t in tabs if t != tab]
-            others.sort(lambda x,y: cmp(x["pos"][1], y["pos"][1]))
+            others.sort(lambda x, y: cmp(x["pos"][1], y["pos"][1]))
             for other in others:
-                if (other["pos"][0] == tab["pos"][0] and
-                    other["size"][0] == tab["size"][0] and
-                    other["pos"][1] == tab["pos"][1] + tab["size"][1] + TAB_BORDER):
+                if other["pos"][0] == tab["pos"][0] and \
+                   other["size"][0] == tab["size"][0] and \
+                   other["pos"][1] == tab["pos"][1] + tab["size"][1] + TAB_BORDER:
 
                     tab["size"] = (tab["size"][0], tab["size"][1] + other["size"][1] + TAB_BORDER)
                     tab["pages"].extend(other["pages"])
@@ -276,37 +190,41 @@
                         return True
     return False
 
+
 def ComputeTabsLayout(tabs, rect):
     if len(tabs) == 0:
         return tabs
     if len(tabs) == 1:
         return tabs[0]
     split = None
+    split_id = None
     for idx, tab in enumerate(tabs):
         if len(tab["pages"]) == 0:
-            raise ValueError, "Not possible"
+            raise ValueError("Not possible")
         if tab["size"][0] == rect.width:
             if tab["pos"][1] == rect.y:
-                split = (wx.TOP, float(tab["size"][1]) / float(rect.height))
+                split = (wx.TOP, tab["size"][1] / rect.height)
                 split_rect = wx.Rect(rect.x, rect.y + tab["size"][1] + TAB_BORDER,
                                      rect.width, rect.height - tab["size"][1] - TAB_BORDER)
             elif tab["pos"][1] == rect.height + 1 - tab["size"][1]:
-                split = (wx.BOTTOM, 1.0 - float(tab["size"][1]) / float(rect.height))
+                split = (wx.BOTTOM, 1.0 - tab["size"][1] / rect.height)
                 split_rect = wx.Rect(rect.x, rect.y,
                                      rect.width, rect.height - tab["size"][1] - TAB_BORDER)
+            split_id = idx
             break
         elif tab["size"][1] == rect.height:
             if tab["pos"][0] == rect.x:
-                split = (wx.LEFT, float(tab["size"][0]) / float(rect.width))
+                split = (wx.LEFT, tab["size"][0] / rect.width)
                 split_rect = wx.Rect(rect.x + tab["size"][0] + TAB_BORDER, rect.y,
                                      rect.width - tab["size"][0] - TAB_BORDER, rect.height)
             elif tab["pos"][0] == rect.width + 1 - tab["size"][0]:
-                split = (wx.RIGHT, 1.0 - float(tab["size"][0]) / float(rect.width))
+                split = (wx.RIGHT, 1.0 - tab["size"][0] / rect.width)
                 split_rect = wx.Rect(rect.x, rect.y,
                                      rect.width - tab["size"][0] - TAB_BORDER, rect.height)
+            split_id = idx
             break
-    if split != None:
-        split_tab = tabs.pop(idx)
+    if split is not None:
+        split_tab = tabs.pop(split_id)
         return {"split": split,
                 "tab": split_tab,
                 "others": ComputeTabsLayout(tabs, split_rect)}
@@ -315,21 +233,114 @@
             return ComputeTabsLayout(tabs, rect)
     return tabs
 
-#-------------------------------------------------------------------------------
-#                              IDEFrame Base Class
-#-------------------------------------------------------------------------------
-
-UNEDITABLE_NAMES_DICT = dict([(_(name), name) for name in UNEDITABLE_NAMES])
 
 class IDEFrame(wx.Frame):
-
-    # Compatibility function for wx versions < 2.6
-    if wx.VERSION < (2, 6, 0):
-        def Bind(self, event, function, id = None):
-            if id is not None:
-                event(self, id, function)
-            else:
-                event(self, function)
+    """IDEFrame Base Class"""
+
+    def InitEditorToolbarItems(self):
+        """
+        Initialize dictionary with lists of elements that need to be shown
+        if POU in particular programming language is edited.
+        """
+        # Define behaviour of each Toolbar item according to current POU body type
+        # Informations meaning are in this order:
+        #  - Item is toggled
+        #  - PLCOpenEditor mode where item is displayed (could be more then one)
+        #  - Item id
+        #  - Item callback function name
+        #  - Item icon filename
+        #  - Item tooltip text
+        self.EditorToolBarItems = {
+            "FBD":   [(True, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
+                       "move", _("Move the view")),
+                      (True, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARCOMMENT, "OnCommentTool",
+                       "add_comment", _("Create a new comment")),
+                      (True, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, "OnVariableTool",
+                       "add_variable", _("Create a new variable")),
+                      (True, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARBLOCK, "OnBlockTool",
+                       "add_block", _("Create a new block")),
+                      (True, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, "OnConnectionTool",
+                       "add_connection", _("Create a new connection"))],
+            "LD":    [(True, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
+                       "move", _("Move the view")),
+                      (True, FREEDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARCOMMENT, "OnCommentTool",
+                       "add_comment", _("Create a new comment")),
+                      (True, FREEDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL, "OnPowerRailTool",
+                       "add_powerrail", _("Create a new power rail")),
+                      (False, DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARRUNG, "OnRungTool",
+                       "add_rung", _("Create a new rung")),
+                      (True, FREEDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARCOIL, "OnCoilTool",
+                       "add_coil", _("Create a new coil")),
+                      (False, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARCONTACT, "OnContactTool",
+                       "add_contact", _("Create a new contact")),
+                      (False, DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARBRANCH, "OnBranchTool",
+                       "add_branch", _("Create a new branch")),
+                      (True, FREEDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, "OnVariableTool",
+                       "add_variable", _("Create a new variable")),
+                      (False, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARBLOCK, "OnBlockTool",
+                       "add_block", _("Create a new block")),
+                      (True, FREEDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, "OnConnectionTool",
+                       "add_connection", _("Create a new connection"))],
+            "SFC":   [(True, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
+                       "move", _("Move the view")),
+                      (True, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARCOMMENT, "OnCommentTool",
+                       "add_comment", _("Create a new comment")),
+                      (True, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARINITIALSTEP, "OnInitialStepTool",
+                       "add_initial_step", _("Create a new initial step")),
+                      (False, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARSTEP, "OnStepTool",
+                       "add_step", _("Create a new step")),
+                      (True, FREEDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARTRANSITION, "OnTransitionTool",
+                       "add_transition", _("Create a new transition")),
+                      (False, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARACTIONBLOCK, "OnActionBlockTool",
+                       "add_action", _("Create a new action block")),
+                      (False, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARDIVERGENCE, "OnDivergenceTool",
+                       "add_divergence", _("Create a new divergence")),
+                      (False, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARJUMP, "OnJumpTool",
+                       "add_jump", _("Create a new jump")),
+                      (True, FREEDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARVARIABLE, "OnVariableTool",
+                       "add_variable", _("Create a new variable")),
+                      (True, FREEDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARBLOCK, "OnBlockTool",
+                       "add_block", _("Create a new block")),
+                      (True, FREEDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARCONNECTION, "OnConnectionTool",
+                       "add_connection", _("Create a new connection")),
+                      (True, FREEDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARPOWERRAIL, "OnPowerRailTool",
+                       "add_powerrail", _("Create a new power rail")),
+                      (True, FREEDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARCONTACT, "OnContactTool",
+                       "add_contact", _("Create a new contact"))],
+            "ST":    [],
+            "IL":    [],
+            "debug": [(True, FREEDRAWING_MODE | DRIVENDRAWING_MODE,
+                       ID_PLCOPENEDITOREDITORTOOLBARMOTION, "OnMotionTool",
+                       "move", _("Move the view"))],
+        }
 
     def _init_coll_MenuBar_Menus(self, parent):
         parent.Append(menu=self.FileMenu, title=_(u'&File'))
@@ -342,79 +353,74 @@
 
     def _init_coll_AddMenu_Items(self, parent, add_config=True):
         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
-              kind=wx.ITEM_NORMAL, text=_(u'&Data Type'))
+                   kind=wx.ITEM_NORMAL, text=_(u'&Data Type'))
         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
-              kind=wx.ITEM_NORMAL, text=_(u'&Function'))
+                   kind=wx.ITEM_NORMAL, text=_(u'&Function'))
         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK,
-              kind=wx.ITEM_NORMAL, text=_(u'Function &Block'))
+                   kind=wx.ITEM_NORMAL, text=_(u'Function &Block'))
         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDPROGRAM,
-              kind=wx.ITEM_NORMAL, text=_(u'&Program'))
+                   kind=wx.ITEM_NORMAL, text=_(u'&Program'))
         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDRESOURCE,
-                  kind=wx.ITEM_NORMAL, text=_(u'&Resource'))
+                   kind=wx.ITEM_NORMAL, text=_(u'&Resource'))
         if add_config:
             AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
-                  kind=wx.ITEM_NORMAL, text=_(u'&Configuration'))
+                       kind=wx.ITEM_NORMAL, text=_(u'&Configuration'))
 
     def _init_coll_EditMenu_Items(self, parent):
         AppendMenu(parent, help='', id=wx.ID_UNDO,
-              kind=wx.ITEM_NORMAL, text=_(u'Undo') + '\tCTRL+Z')
+                   kind=wx.ITEM_NORMAL, text=_(u'Undo') + '\tCTRL+Z')
         AppendMenu(parent, help='', id=wx.ID_REDO,
-              kind=wx.ITEM_NORMAL, text=_(u'Redo') + '\tCTRL+Y')
-        #AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO,
-        #      kind=wx.ITEM_CHECK, text=_(u'Enable Undo/Redo'))
-        enable_undo_redo = _(u'Enable Undo/Redo') # Keeping text in translations for possible menu reactivation
+                   kind=wx.ITEM_NORMAL, text=_(u'Redo') + '\tCTRL+Y')
         parent.AppendSeparator()
         AppendMenu(parent, help='', id=wx.ID_CUT,
-              kind=wx.ITEM_NORMAL, text=_(u'Cut') + '\tCTRL+X')
+                   kind=wx.ITEM_NORMAL, text=_(u'Cut') + '\tCTRL+X')
         AppendMenu(parent, help='', id=wx.ID_COPY,
-              kind=wx.ITEM_NORMAL, text=_(u'Copy') + '\tCTRL+C')
+                   kind=wx.ITEM_NORMAL, text=_(u'Copy') + '\tCTRL+C')
         AppendMenu(parent, help='', id=wx.ID_PASTE,
-              kind=wx.ITEM_NORMAL, text=_(u'Paste') + '\tCTRL+V')
+                   kind=wx.ITEM_NORMAL, text=_(u'Paste') + '\tCTRL+V')
         parent.AppendSeparator()
         AppendMenu(parent, help='', id=wx.ID_FIND,
-              kind=wx.ITEM_NORMAL, text=_(u'Find') + '\tCTRL+F')
+                   kind=wx.ITEM_NORMAL, text=_(u'Find') + '\tCTRL+F')
         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUFINDNEXT,
-              kind=wx.ITEM_NORMAL, text=_(u'Find Next') + '\tCTRL+K')
+                   kind=wx.ITEM_NORMAL, text=_(u'Find Next') + '\tCTRL+K')
         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUFINDPREVIOUS,
-              kind=wx.ITEM_NORMAL, text=_(u'Find Previous') + '\tCTRL+SHIFT+K')
+                   kind=wx.ITEM_NORMAL, text=_(u'Find Previous') + '\tCTRL+SHIFT+K')
         parent.AppendSeparator()
         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT,
-              kind=wx.ITEM_NORMAL, text=_(u'Search in Project') + '\tCTRL+SHIFT+F')
+                   kind=wx.ITEM_NORMAL, text=_(u'Search in Project') + '\tCTRL+SHIFT+F')
         parent.AppendSeparator()
         add_menu = wx.Menu(title='')
         self._init_coll_AddMenu_Items(add_menu)
         parent.AppendMenu(wx.ID_ADD, _(u"&Add Element"), add_menu)
         AppendMenu(parent, help='', id=wx.ID_SELECTALL,
-              kind=wx.ITEM_NORMAL, text=_(u'Select All') + '\tCTRL+A')
+                   kind=wx.ITEM_NORMAL, text=_(u'Select All') + '\tCTRL+A')
         AppendMenu(parent, help='', id=wx.ID_DELETE,
-              kind=wx.ITEM_NORMAL, text=_(u'&Delete'))
+                   kind=wx.ITEM_NORMAL, text=_(u'&Delete'))
         self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
         self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
-        #self.Bind(wx.EVT_MENU, self.OnEnableUndoRedoMenu, id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO)
+        # self.Bind(wx.EVT_MENU, self.OnEnableUndoRedoMenu, id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO)
         self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
         self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY)
         self.Bind(wx.EVT_MENU, self.OnPasteMenu, id=wx.ID_PASTE)
         self.Bind(wx.EVT_MENU, self.OnFindMenu, id=wx.ID_FIND)
         self.Bind(wx.EVT_MENU, self.OnFindNextMenu,
-              id=ID_PLCOPENEDITOREDITMENUFINDNEXT)
+                  id=ID_PLCOPENEDITOREDITMENUFINDNEXT)
         self.Bind(wx.EVT_MENU, self.OnFindPreviousMenu,
-              id=ID_PLCOPENEDITOREDITMENUFINDPREVIOUS)
+                  id=ID_PLCOPENEDITOREDITMENUFINDPREVIOUS)
         self.Bind(wx.EVT_MENU, self.OnSearchInProjectMenu,
-              id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT)
-        self.Bind(wx.EVT_MENU, self.OnSearchInProjectMenu,
-              id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT)
+                  id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT)
         self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu,
-              id=ID_PLCOPENEDITOREDITMENUADDDATATYPE)
+                  id=ID_PLCOPENEDITOREDITMENUADDDATATYPE)
         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("function"),
-              id=ID_PLCOPENEDITOREDITMENUADDFUNCTION)
+                  id=ID_PLCOPENEDITOREDITMENUADDFUNCTION)
         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("functionBlock"),
-              id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK)
+                  id=ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK)
         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("program"),
-              id=ID_PLCOPENEDITOREDITMENUADDPROGRAM)
+                  id=ID_PLCOPENEDITOREDITMENUADDPROGRAM)
         self.Bind(wx.EVT_MENU, self.AddResourceMenu,
-              id=ID_PLCOPENEDITOREDITMENUADDRESOURCE)
+                  id=ID_PLCOPENEDITOREDITMENUADDRESOURCE)
         self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu,
-              id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION)
+                  id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION)
         self.Bind(wx.EVT_MENU, self.OnSelectAllMenu, id=wx.ID_SELECTALL)
         self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=wx.ID_DELETE)
 
@@ -425,30 +431,35 @@
                                (wx.ID_COPY, "copy", _(u'Copy'), None),
                                (wx.ID_PASTE, "paste", _(u'Paste'), None),
                                None,
-                               (ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, "find", _(u'Search in Project'), None)])
+                               (ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, "find", _(u'Search in Project'), None),
+                               (ID_PLCOPENEDITORDISPLAYMENUFULLSCREEN, "fullscreen", _(u'Toggle fullscreen mode'), None)])
 
     def _init_coll_DisplayMenu_Items(self, parent):
         AppendMenu(parent, help='', id=wx.ID_REFRESH,
-              kind=wx.ITEM_NORMAL, text=_(u'Refresh') + '\tCTRL+R')
+                   kind=wx.ITEM_NORMAL, text=_(u'Refresh') + '\tCTRL+R')
         if self.EnableDebug:
             AppendMenu(parent, help='', id=wx.ID_CLEAR,
-                  kind=wx.ITEM_NORMAL, text=_(u'Clear Errors') + '\tCTRL+K')
+                       kind=wx.ITEM_NORMAL, text=_(u'Clear Errors') + '\tCTRL+K')
         parent.AppendSeparator()
         zoommenu = wx.Menu(title='')
         parent.AppendMenu(wx.ID_ZOOM_FIT, _("Zoom"), zoommenu)
         for idx, value in enumerate(ZOOM_FACTORS):
             new_id = wx.NewId()
             AppendMenu(zoommenu, help='', id=new_id,
-                  kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
+                       kind=wx.ITEM_RADIO, text=str(int(round(value * 100))) + "%")
             self.Bind(wx.EVT_MENU, self.GenerateZoomFunction(idx), id=new_id)
 
         parent.AppendSeparator()
         AppendMenu(parent, help='', id=ID_PLCOPENEDITORDISPLAYMENUSWITCHPERSPECTIVE,
                    kind=wx.ITEM_NORMAL, text=_(u'Switch perspective') + '\tF12')
-        self.Bind(wx.EVT_MENU, self.SwitchFullScrMode, id=ID_PLCOPENEDITORDISPLAYMENUSWITCHPERSPECTIVE)
+        self.Bind(wx.EVT_MENU, self.SwitchPerspective, id=ID_PLCOPENEDITORDISPLAYMENUSWITCHPERSPECTIVE)
+
+        AppendMenu(parent, help='', id=ID_PLCOPENEDITORDISPLAYMENUFULLSCREEN,
+                   kind=wx.ITEM_NORMAL, text=_(u'Full screen') + '\tShift-F12')
+        self.Bind(wx.EVT_MENU, self.SwitchFullScrMode, id=ID_PLCOPENEDITORDISPLAYMENUFULLSCREEN)
 
         AppendMenu(parent, help='', id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE,
-              kind=wx.ITEM_NORMAL, text=_(u'Reset Perspective'))
+                   kind=wx.ITEM_NORMAL, text=_(u'Reset Perspective'))
         self.Bind(wx.EVT_MENU, self.OnResetPerspective, id=ID_PLCOPENEDITORDISPLAYMENURESETPERSPECTIVE)
 
         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
@@ -474,14 +485,11 @@
 
     def _init_icon(self, parent):
         if self.icon:
-            self.SetIcon(self.icon)                            
+            self.SetIcon(self.icon)
         elif parent and parent.icon:
-            self.SetIcon(parent.icon)                
-        
+            self.SetIcon(parent.icon)
+
     def _init_ctrls(self, prnt):
-        wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame',
-              parent=prnt, pos=wx.DefaultPosition, size=wx.Size(1000, 600),
-              style=wx.DEFAULT_FRAME_STYLE)
         self._init_icon(prnt)
         self.SetClientSize(wx.Size(1000, 600))
         self.Bind(wx.EVT_ACTIVATE, self.OnActivated)
@@ -489,95 +497,113 @@
         self.TabsImageList = wx.ImageList(31, 16)
         self.TabsImageListIndexes = {}
 
-        #-----------------------------------------------------------------------
+        # -----------------------------------------------------------------------
         #                          Creating main structure
-        #-----------------------------------------------------------------------
+        # -----------------------------------------------------------------------
 
         self.AUIManager = wx.aui.AuiManager(self)
         self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
         self.Panes = {}
 
-        self.LeftNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORLEFTNOTEBOOK,
-              style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
-                    wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
+        self.LeftNoteBook = wx.aui.AuiNotebook(
+            self, ID_PLCOPENEDITORLEFTNOTEBOOK,
+            style=(wx.aui.AUI_NB_TOP |
+                   wx.aui.AUI_NB_TAB_SPLIT |
+                   wx.aui.AUI_NB_TAB_MOVE |
+                   wx.aui.AUI_NB_SCROLL_BUTTONS |
+                   wx.aui.AUI_NB_TAB_EXTERNAL_MOVE))
         self.LeftNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND,
-                self.OnAllowNotebookDnD)
-        self.AUIManager.AddPane(self.LeftNoteBook,
-              wx.aui.AuiPaneInfo().Name("ProjectPane").
-              Left().Layer(1).
-              BestSize(wx.Size(300, 500)).CloseButton(False))
-
-        self.BottomNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORBOTTOMNOTEBOOK,
-              style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
-                    wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
+                               self.OnAllowNotebookDnD)
+        self.AUIManager.AddPane(
+            self.LeftNoteBook,
+            wx.aui.AuiPaneInfo().Name("ProjectPane").Left().Layer(1).
+            BestSize(wx.Size(300, 500)).CloseButton(False))
+
+        self.BottomNoteBook = wx.aui.AuiNotebook(
+            self, ID_PLCOPENEDITORBOTTOMNOTEBOOK,
+            style=(wx.aui.AUI_NB_TOP |
+                   wx.aui.AUI_NB_TAB_SPLIT |
+                   wx.aui.AUI_NB_TAB_MOVE |
+                   wx.aui.AUI_NB_SCROLL_BUTTONS |
+                   wx.aui.AUI_NB_TAB_EXTERNAL_MOVE))
         self.BottomNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND,
-                self.OnAllowNotebookDnD)
-        self.AUIManager.AddPane(self.BottomNoteBook,
-              wx.aui.AuiPaneInfo().Name("ResultPane").
-              Bottom().Layer(0).
-              BestSize(wx.Size(800, 300)).CloseButton(False))
-
-        self.RightNoteBook = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORRIGHTNOTEBOOK,
-              style=wx.aui.AUI_NB_TOP|wx.aui.AUI_NB_TAB_SPLIT|wx.aui.AUI_NB_TAB_MOVE|
-                    wx.aui.AUI_NB_SCROLL_BUTTONS|wx.aui.AUI_NB_TAB_EXTERNAL_MOVE)
+                                 self.OnAllowNotebookDnD)
+        self.AUIManager.AddPane(
+            self.BottomNoteBook,
+            wx.aui.AuiPaneInfo().Name("ResultPane").Bottom().Layer(0).
+            BestSize(wx.Size(800, 300)).CloseButton(False))
+
+        self.RightNoteBook = wx.aui.AuiNotebook(
+            self, ID_PLCOPENEDITORRIGHTNOTEBOOK,
+            style=(wx.aui.AUI_NB_TOP |
+                   wx.aui.AUI_NB_TAB_SPLIT |
+                   wx.aui.AUI_NB_TAB_MOVE |
+                   wx.aui.AUI_NB_SCROLL_BUTTONS |
+                   wx.aui.AUI_NB_TAB_EXTERNAL_MOVE))
         self.RightNoteBook.Bind(wx.aui.EVT_AUINOTEBOOK_ALLOW_DND,
-                self.OnAllowNotebookDnD)
-        self.AUIManager.AddPane(self.RightNoteBook,
-              wx.aui.AuiPaneInfo().Name("LibraryPane").
-              Right().Layer(0).
-              BestSize(wx.Size(250, 400)).CloseButton(False))
-
-        self.TabsOpened = wx.aui.AuiNotebook(self, ID_PLCOPENEDITORTABSOPENED,
-              style=wx.aui.AUI_NB_DEFAULT_STYLE|wx.aui.AUI_NB_WINDOWLIST_BUTTON)
+                                self.OnAllowNotebookDnD)
+        self.AUIManager.AddPane(
+            self.RightNoteBook,
+            wx.aui.AuiPaneInfo().Name("LibraryPane").Right().Layer(0).
+            BestSize(wx.Size(250, 400)).CloseButton(False))
+
+        self.TabsOpened = wx.aui.AuiNotebook(
+            self, ID_PLCOPENEDITORTABSOPENED,
+            style=(wx.aui.AUI_NB_DEFAULT_STYLE |
+                   wx.aui.AUI_NB_WINDOWLIST_BUTTON))
         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGING,
-              self.OnPouSelectedChanging)
+                             self.OnPouSelectedChanging)
         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CHANGED,
-              self.OnPouSelectedChanged)
+                             self.OnPouSelectedChanged)
         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_PAGE_CLOSE,
-              self.OnPageClose)
+                             self.OnPageClose)
         self.TabsOpened.Bind(wx.aui.EVT_AUINOTEBOOK_END_DRAG,
-              self.OnPageDragged)
+                             self.OnPageDragged)
         self.AUIManager.AddPane(self.TabsOpened,
-              wx.aui.AuiPaneInfo().CentrePane().Name("TabsPane"))
-
-        #-----------------------------------------------------------------------
+                                wx.aui.AuiPaneInfo().CentrePane().Name("TabsPane"))
+
+        # -----------------------------------------------------------------------
         #                    Creating PLCopen Project Types Tree
-        #-----------------------------------------------------------------------
+        # -----------------------------------------------------------------------
 
         self.MainTabs = {}
 
-        self.ProjectPanel = wx.SplitterWindow(id=ID_PLCOPENEDITORPROJECTPANEL,
-                  name='ProjectPanel', parent=self.LeftNoteBook, point=wx.Point(0, 0),
-                  size=wx.Size(0, 0), style=wx.SP_3D)
+        self.ProjectPanel = wx.SplitterWindow(
+            id=ID_PLCOPENEDITORPROJECTPANEL,
+            name='ProjectPanel', parent=self.LeftNoteBook, point=wx.Point(0, 0),
+            size=wx.Size(0, 0), style=wx.SP_3D)
 
         self.ProjectTree = CustomTree(id=ID_PLCOPENEDITORPROJECTTREE,
-                  name='ProjectTree', parent=self.ProjectPanel,
-                  pos=wx.Point(0, 0), size=wx.Size(0, 0),
-                  style=wx.SUNKEN_BORDER,
-                  agwStyle=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.TR_EDIT_LABELS)
+                                      name='ProjectTree',
+                                      parent=self.ProjectPanel,
+                                      pos=wx.Point(0, 0), size=wx.Size(0, 0),
+                                      style=wx.SUNKEN_BORDER,
+                                      agwStyle=(wx.TR_HAS_BUTTONS |
+                                                wx.TR_SINGLE |
+                                                wx.TR_EDIT_LABELS))
         self.ProjectTree.SetBackgroundBitmap(GetBitmap("custom_tree_background"),
-                                             wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM)
+                                             wx.ALIGN_RIGHT | wx.ALIGN_BOTTOM)
         add_menu = wx.Menu()
         self._init_coll_AddMenu_Items(add_menu)
         self.ProjectTree.SetAddMenu(add_menu)
         self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnProjectTreeRightUp,
-              id=ID_PLCOPENEDITORPROJECTTREE)
+                  id=ID_PLCOPENEDITORPROJECTTREE)
         self.ProjectTree.Bind(wx.EVT_LEFT_UP, self.OnProjectTreeLeftUp)
         self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnProjectTreeItemChanging,
-              id=ID_PLCOPENEDITORPROJECTTREE)
+                  id=ID_PLCOPENEDITORPROJECTTREE)
         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnProjectTreeBeginDrag,
-              id=ID_PLCOPENEDITORPROJECTTREE)
+                  id=ID_PLCOPENEDITORPROJECTTREE)
         self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnProjectTreeItemBeginEdit,
-              id=ID_PLCOPENEDITORPROJECTTREE)
+                  id=ID_PLCOPENEDITORPROJECTTREE)
         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnProjectTreeItemEndEdit,
-              id=ID_PLCOPENEDITORPROJECTTREE)
+                  id=ID_PLCOPENEDITORPROJECTTREE)
         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnProjectTreeItemActivated,
-              id=ID_PLCOPENEDITORPROJECTTREE)
+                  id=ID_PLCOPENEDITORPROJECTTREE)
         self.ProjectTree.Bind(wx.EVT_MOTION, self.OnProjectTreeMotion)
 
-        #-----------------------------------------------------------------------
+        # -----------------------------------------------------------------------
         #        Creating PLCopen Project POU Instance Variables Panel
-        #-----------------------------------------------------------------------
+        # -----------------------------------------------------------------------
 
         self.PouInstanceVariablesPanel = PouInstanceVariablesPanel(self.ProjectPanel, self, self.Controler, self.EnableDebug)
 
@@ -586,46 +612,50 @@
 
         self.ProjectPanel.SplitHorizontally(self.ProjectTree, self.PouInstanceVariablesPanel, 300)
 
-        #-----------------------------------------------------------------------
+        # -----------------------------------------------------------------------
         #                            Creating Tool Bar
-        #-----------------------------------------------------------------------
-
-        MenuToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORMENUTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
-                wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
+        # -----------------------------------------------------------------------
+
+        MenuToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORMENUTOOLBAR,
+                                 wx.DefaultPosition, wx.DefaultSize,
+                                 wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
         MenuToolBar.SetToolBitmapSize(wx.Size(25, 25))
         MenuToolBar.Realize()
         self.Panes["MenuToolBar"] = MenuToolBar
         self.AUIManager.AddPane(MenuToolBar, wx.aui.AuiPaneInfo().
-                  Name("MenuToolBar").Caption(_("Menu ToolBar")).
-                  ToolbarPane().Top().
-                  LeftDockable(False).RightDockable(False))
-
-        EditorToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORTOOLBAR, wx.DefaultPosition, wx.DefaultSize,
-                wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
+                                Name("MenuToolBar").Caption(_("Menu ToolBar")).
+                                ToolbarPane().Top().
+                                LeftDockable(False).RightDockable(False))
+
+        EditorToolBar = wx.ToolBar(self, ID_PLCOPENEDITOREDITORTOOLBAR,
+                                   wx.DefaultPosition, wx.DefaultSize,
+                                   wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER)
         EditorToolBar.SetToolBitmapSize(wx.Size(25, 25))
         EditorToolBar.AddRadioTool(ID_PLCOPENEDITOREDITORTOOLBARSELECTION,
-              GetBitmap("select"), wx.NullBitmap, _("Select an object"))
+                                   GetBitmap("select"),
+                                   wx.NullBitmap,
+                                   _("Select an object"))
         EditorToolBar.Realize()
         self.Panes["EditorToolBar"] = EditorToolBar
         self.AUIManager.AddPane(EditorToolBar, wx.aui.AuiPaneInfo().
-                  Name("EditorToolBar").Caption(_("Editor ToolBar")).
-                  ToolbarPane().Top().Position(1).
-                  LeftDockable(False).RightDockable(False))
+                                Name("EditorToolBar").Caption(_("Editor ToolBar")).
+                                ToolbarPane().Top().Position(1).
+                                LeftDockable(False).RightDockable(False))
 
         self.Bind(wx.EVT_MENU, self.OnSelectionTool,
-              id=ID_PLCOPENEDITOREDITORTOOLBARSELECTION)
-
-        #-----------------------------------------------------------------------
+                  id=ID_PLCOPENEDITOREDITORTOOLBARSELECTION)
+
+        # -----------------------------------------------------------------------
         #                            Creating Search Panel
-        #-----------------------------------------------------------------------
+        # -----------------------------------------------------------------------
 
         self.SearchResultPanel = SearchResultPanel(self.BottomNoteBook, self)
         self.MainTabs["SearchResultPanel"] = (self.SearchResultPanel, _("Search"))
         self.BottomNoteBook.AddPage(*self.MainTabs["SearchResultPanel"])
 
-        #-----------------------------------------------------------------------
+        # -----------------------------------------------------------------------
         #                            Creating Library Panel
-        #-----------------------------------------------------------------------
+        # -----------------------------------------------------------------------
 
         self.LibraryPanel = LibraryPanel(self, True)
         self.MainTabs["LibraryPanel"] = (self.LibraryPanel, _("Library"))
@@ -641,19 +671,19 @@
 
         self.AUIManager.Update()
 
-        self.FindDialog = FindInPouDialog(self)
-        self.FindDialog.Hide()
-
-    ## Constructor of the PLCOpenEditor class.
-    #  @param parent The parent window.
-    #  @param controler The controler been used by PLCOpenEditor (default: None).
-    #  @param fileOpen The filepath to open if no controler defined (default: None).
-    #  @param debug The filepath to open if no controler defined (default: False).
-    def __init__(self, parent, enable_debug = False):
+    def __init__(self, parent, enable_debug=False):
+        wx.Frame.__init__(self, id=ID_PLCOPENEDITOR, name='IDEFrame',
+                          parent=parent, pos=wx.DefaultPosition,
+                          size=wx.Size(1000, 600),
+                          style=wx.DEFAULT_FRAME_STYLE)
+
+        self.UNEDITABLE_NAMES_DICT = dict([(_(n), n) for n in UNEDITABLE_NAMES])
+
         self.Controler = None
         self.Config = wx.ConfigBase.Get()
         self.EnableDebug = enable_debug
 
+        self.InitEditorToolbarItems()
         self._init_ctrls(parent)
 
         # Define Tree item icon list
@@ -666,32 +696,32 @@
 
         # Icons for other items
         for imgname, itemtype in [
-            #editables
-            ("PROJECT",        ITEM_PROJECT),
-            #("POU",            ITEM_POU),
-            #("VARIABLE",       ITEM_VARIABLE),
-            ("TRANSITION",     ITEM_TRANSITION),
-            ("ACTION",         ITEM_ACTION),
-            ("CONFIGURATION",  ITEM_CONFIGURATION),
-            ("RESOURCE",       ITEM_RESOURCE),
-            ("DATATYPE",       ITEM_DATATYPE),
-            # uneditables
-            ("DATATYPES",      ITEM_DATATYPES),
-            ("FUNCTION",       ITEM_FUNCTION),
-            ("FUNCTIONBLOCK",  ITEM_FUNCTIONBLOCK),
-            ("PROGRAM",        ITEM_PROGRAM),
-            ("VAR_LOCAL",      ITEM_VAR_LOCAL),
-            ("VAR_LOCAL",      ITEM_VAR_GLOBAL),
-            ("VAR_LOCAL",      ITEM_VAR_EXTERNAL),
-            ("VAR_LOCAL",      ITEM_VAR_TEMP),
-            ("VAR_INPUT",      ITEM_VAR_INPUT),
-            ("VAR_OUTPUT",     ITEM_VAR_OUTPUT),
-            ("VAR_INOUT",      ITEM_VAR_INOUT),
-            ("TRANSITIONS",    ITEM_TRANSITIONS),
-            ("ACTIONS",        ITEM_ACTIONS),
-            ("CONFIGURATIONS", ITEM_CONFIGURATIONS),
-            ("RESOURCES",      ITEM_RESOURCES),
-            ("PROPERTIES",     ITEM_PROPERTIES)]:
+                # editables
+                ("PROJECT",        ITEM_PROJECT),
+                # ("POU",          ITEM_POU),
+                # ("VARIABLE",     ITEM_VARIABLE),
+                ("TRANSITION",     ITEM_TRANSITION),
+                ("ACTION",         ITEM_ACTION),
+                ("CONFIGURATION",  ITEM_CONFIGURATION),
+                ("RESOURCE",       ITEM_RESOURCE),
+                ("DATATYPE",       ITEM_DATATYPE),
+                # uneditables
+                ("DATATYPES",      ITEM_DATATYPES),
+                ("FUNCTION",       ITEM_FUNCTION),
+                ("FUNCTIONBLOCK",  ITEM_FUNCTIONBLOCK),
+                ("PROGRAM",        ITEM_PROGRAM),
+                ("VAR_LOCAL",      ITEM_VAR_LOCAL),
+                ("VAR_LOCAL",      ITEM_VAR_GLOBAL),
+                ("VAR_LOCAL",      ITEM_VAR_EXTERNAL),
+                ("VAR_LOCAL",      ITEM_VAR_TEMP),
+                ("VAR_INPUT",      ITEM_VAR_INPUT),
+                ("VAR_OUTPUT",     ITEM_VAR_OUTPUT),
+                ("VAR_INOUT",      ITEM_VAR_INOUT),
+                ("TRANSITIONS",    ITEM_TRANSITIONS),
+                ("ACTIONS",        ITEM_ACTIONS),
+                ("CONFIGURATIONS", ITEM_CONFIGURATIONS),
+                ("RESOURCES",      ITEM_RESOURCES),
+                ("PROPERTIES",     ITEM_PROPERTIES)]:
             self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(imgname))
 
         # Assign icon list to TreeCtrls
@@ -705,7 +735,7 @@
         self.SearchParams = None
         self.Highlights = {}
         self.DrawingMode = FREEDRAWING_MODE
-        #self.DrawingMode = DRIVENDRAWING_MODE
+        # self.DrawingMode = DRIVENDRAWING_MODE
         self.AuiTabCtrl = []
 
         # Save default perspective
@@ -719,7 +749,6 @@
             "notebooks": notebooks,
         }
 
-
         # Initialize Printing configuring elements
         self.PrintData = wx.PrintData()
         self.PrintData.SetPaperId(wx.PAPER_A4)
@@ -731,9 +760,15 @@
         self.SetRefreshFunctions()
         self.SetDeleteFunctions()
 
+        wx.CallAfter(self.InitFindDialog)
+
     def __del__(self):
         self.FindDialog.Destroy()
 
+    def InitFindDialog(self):
+        self.FindDialog = FindInPouDialog(self)
+        self.FindDialog.Hide()
+
     def Show(self):
         wx.Frame.Show(self)
         wx.CallAfter(self.RestoreLastState)
@@ -750,12 +785,12 @@
                 notebook.SetSelection(idx)
                 return
 
-#-------------------------------------------------------------------------------
-#                Saving and restoring frame organization functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                Saving and restoring frame organization functions
+    # -------------------------------------------------------------------------------
 
     def GetTabInfos(self, tab):
-        for page_name, (page_ref, page_title) in self.MainTabs.iteritems():
+        for page_name, (page_ref, _page_title) in self.MainTabs.iteritems():
             if page_ref == tab:
                 return ("main", page_name)
         return None
@@ -770,7 +805,7 @@
                     tab_size = child.GetSize()
                     for page_idx in xrange(child.GetPageCount()):
                         page = child.GetWindowFromIdx(page_idx)
-                        if not tab.has_key("size"):
+                        if "size" not in tab:
                             tab["size"] = (tab_size[0], tab_size[1] + page.GetSize()[1])
                         tab_infos = self.GetTabInfos(page)
                         if tab_infos is not None:
@@ -789,7 +824,7 @@
                 return notebook.GetPageIndex(page_ref)
         elif page_infos[0] == "editor":
             tagname = page_infos[1]
-            page_ref = self.EditProjectElement(self.Controler.GetElementType(tagname), tagname)
+            page_ref = self.EditProjectElement(GetElementType(tagname), tagname)
             if page_ref is not None:
                 page_ref.RefreshView()
                 return notebook.GetPageIndex(page_ref)
@@ -801,15 +836,15 @@
         return None
 
     def LoadTabLayout(self, notebook, tabs, mode="all", first_index=None):
-        if isinstance(tabs, ListType):
+        if isinstance(tabs, list):
             if len(tabs) == 0:
                 return
-            raise ValueError, "Not supported"
-
-        if tabs.has_key("split"):
+            raise ValueError("Not supported")
+
+        if "split" in tabs:
             self.LoadTabLayout(notebook, tabs["others"])
 
-            split_dir, split_ratio = tabs["split"]
+            split_dir, _split_ratio = tabs["split"]
             first_index = self.LoadTabLayout(notebook, tabs["tab"], mode="first")
             notebook.Split(first_index, split_dir)
             self.LoadTabLayout(notebook, tabs["tab"], mode="others", first_index=first_index)
@@ -834,7 +869,7 @@
             self.AUIManager.LoadPerspective(self.DefaultPerspective["perspective"])
 
             for notebook in [self.LeftNoteBook, self.BottomNoteBook, self.RightNoteBook]:
-                for idx in xrange(notebook.GetPageCount()):
+                for dummy in xrange(notebook.GetPageCount()):
                     notebook.RemovePage(0)
 
             notebooks = self.DefaultPerspective["notebooks"]
@@ -863,26 +898,28 @@
 
         self.Config.Flush()
 
-#-------------------------------------------------------------------------------
-#                               General Functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                               General Functions
+    # -------------------------------------------------------------------------------
 
     def SetRefreshFunctions(self):
         self.RefreshFunctions = {
-            TITLE : self.RefreshTitle,
-            EDITORTOOLBAR : self.RefreshEditorToolBar,
-            FILEMENU : self.RefreshFileMenu,
-            EDITMENU : self.RefreshEditMenu,
-            DISPLAYMENU : self.RefreshDisplayMenu,
-            PROJECTTREE : self.RefreshProjectTree,
-            POUINSTANCEVARIABLESPANEL : self.RefreshPouInstanceVariablesPanel,
-            LIBRARYTREE : self.RefreshLibraryPanel,
-            SCALING : self.RefreshScaling,
+            TITLE: self.RefreshTitle,
+            EDITORTOOLBAR: self.RefreshEditorToolBar,
+            FILEMENU: self.RefreshFileMenu,
+            EDITMENU: self.RefreshEditMenu,
+            DISPLAYMENU: self.RefreshDisplayMenu,
+            PROJECTTREE: self.RefreshProjectTree,
+            POUINSTANCEVARIABLESPANEL: self.RefreshPouInstanceVariablesPanel,
+            LIBRARYTREE: self.RefreshLibraryPanel,
+            SCALING: self.RefreshScaling,
             PAGETITLES: self.RefreshPageTitles}
 
-    ## Call PLCOpenEditor refresh functions.
-    #  @param elements List of elements to refresh.
     def _Refresh(self, *elements):
+        """Call Editor refresh functions.
+
+        :param elements: List of elements to refresh.
+        """
         try:
             for element in elements:
                 self.RefreshFunctions[element]()
@@ -890,9 +927,11 @@
             # ignore exceptions caused by refresh while quitting
             pass
 
-    ## Callback function when AUINotebook Page closed with CloseButton
-    #  @param event AUINotebook Event.
     def OnPageClose(self, event):
+        """Callback function when AUINotebook Page closed with CloseButton
+
+        :param event: AUINotebook Event.
+        """
         selected = self.TabsOpened.GetSelection()
         if selected > -1:
             window = self.TabsOpened.GetPage(selected)
@@ -907,18 +946,24 @@
             else:
                 event.Veto()
 
-
     def GetCopyBuffer(self, primary_selection=False):
         data = None
         if primary_selection and wx.Platform == '__WXMSW__':
             return data
         else:
             wx.TheClipboard.UsePrimarySelection(primary_selection)
-        if wx.TheClipboard.Open():
+
+        if not wx.TheClipboard.IsOpened():
             dataobj = wx.TextDataObject()
-            if wx.TheClipboard.GetData(dataobj):
-                data = dataobj.GetText()
-            wx.TheClipboard.Close()
+            if wx.TheClipboard.Open():
+                success = False
+                try:
+                    success = wx.TheClipboard.GetData(dataobj)
+                except wx._core.PyAssertionError:
+                    pass
+                wx.TheClipboard.Close()
+                if success:
+                    data = dataobj.GetText()
         return data
 
     def SetCopyBuffer(self, text, primary_selection=False):
@@ -926,13 +971,14 @@
             return
         else:
             wx.TheClipboard.UsePrimarySelection(primary_selection)
-        if wx.TheClipboard.Open():
+        if not wx.TheClipboard.IsOpened():
             data = wx.TextDataObject()
             data.SetText(text)
-            wx.TheClipboard.SetData(data)
-            wx.TheClipboard.Flush()
-            wx.TheClipboard.Close()
-        self.RefreshEditMenu()
+            if wx.TheClipboard.Open():
+                wx.TheClipboard.SetData(data)
+                wx.TheClipboard.Flush()
+                wx.TheClipboard.Close()
+        wx.CallAfter(self.RefreshEditMenu)
 
     def GetDrawingMode(self):
         return self.DrawingMode
@@ -955,22 +1001,20 @@
                               PROJECTTREE, POUINSTANCEVARIABLESPANEL, SCALING)
         dialog.Destroy()
 
-#-------------------------------------------------------------------------------
-#                            Notebook Unified Functions
-#-------------------------------------------------------------------------------
-
-    ## Function that add a tab in Notebook, calling refresh for tab DClick event
-    # for wx.aui.AUINotebook.
-    #  @param window Panel to display in tab.
-    #  @param text title for the tab ctrl.
+    # -------------------------------------------------------------------------------
+    #                            Notebook Unified Functions
+    # -------------------------------------------------------------------------------
+
     def AddPage(self, window, text):
+        """Function that add a tab in Notebook, calling refresh for tab DClick event
+        for wx.aui.AUINotebook.
+
+        :param window: Panel to display in tab.
+        :param text: title for the tab ctrl.
+        """
         self.TabsOpened.AddPage(window, text)
         self.RefreshTabCtrlEvent()
 
-    ## Function that add a tab in Notebook, calling refresh for tab DClick event
-    # for wx.aui.AUINotebook.
-    #  @param window Panel to display in tab.
-    #  @param text title for the tab ctrl.
     def DeletePage(self, window):
         for idx in xrange(self.TabsOpened.GetPageCount()):
             if self.TabsOpened.GetPage(idx) == window:
@@ -978,37 +1022,44 @@
                 self.RefreshTabCtrlEvent()
                 return
 
-    ## Function that fix difference in deleting all tabs between
-    # wx.Notebook and wx.aui.AUINotebook.
     def DeleteAllPages(self):
-        for idx in xrange(self.TabsOpened.GetPageCount()):
+        """Function that fix difference in deleting all tabs between
+        wx.Notebook and wx.aui.AUINotebook.
+        """
+        for dummy in xrange(self.TabsOpened.GetPageCount()):
             self.TabsOpened.DeletePage(0)
         self.RefreshTabCtrlEvent()
 
-    ## Function that fix difference in setting picture on tab between
-    # wx.Notebook and wx.aui.AUINotebook.
-    #  @param idx Tab index.
-    #  @param bitmap wx.Bitmap to define on tab.
-    #  @return True if operation succeeded
     def SetPageBitmap(self, idx, bitmap):
+        """Function that fix difference in setting picture on tab between
+        wx.Notebook and wx.aui.AUINotebook.
+
+        :param idx: Tab index.
+        :param bitmap: wx.Bitmap to define on tab.
+        :returns: True if operation succeeded
+        """
         return self.TabsOpened.SetPageBitmap(idx, bitmap)
 
-#-------------------------------------------------------------------------------
-#                         Dialog Message Functions
-#-------------------------------------------------------------------------------
-
-    ## Function displaying an Error dialog in PLCOpenEditor.
-    #  @param message The message to display.
+    # -------------------------------------------------------------------------------
+    #                         Dialog Message Functions
+    # -------------------------------------------------------------------------------
+
     def ShowErrorMessage(self, message):
-        dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
+        """Function displaying an Error dialog in editor.
+
+        :param message: The message to display.
+        """
+        dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
         dialog.ShowModal()
         dialog.Destroy()
 
-    ## Function displaying an Error dialog in PLCOpenEditor.
-    #  @return False if closing cancelled.
     def CheckSaveBeforeClosing(self, title=_("Close Project")):
+        """Function displaying an question dialog if project is not saved"
+
+        :returns: False if closing cancelled.
+        """
         if not self.Controler.ProjectIsSaved():
-            dialog = wx.MessageDialog(self, _("There are changes, do you want to save?"), title, wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
+            dialog = wx.MessageDialog(self, _("There are changes, do you want to save?"), title, wx.YES_NO | wx.CANCEL | wx.ICON_QUESTION)
             answer = dialog.ShowModal()
             dialog.Destroy()
             if answer == wx.ID_YES:
@@ -1023,9 +1074,9 @@
 
         return True
 
-#-------------------------------------------------------------------------------
-#                            File Menu Functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                            File Menu Functions
+    # -------------------------------------------------------------------------------
 
     def RefreshFileMenu(self):
         pass
@@ -1072,7 +1123,7 @@
             preview = wx.PrintPreview(printout, printout2, data)
 
             if preview.Ok():
-                preview_frame = wx.PreviewFrame(preview, self, _("Print preview"), style=wx.DEFAULT_FRAME_STYLE|wx.FRAME_FLOAT_ON_PARENT)
+                preview_frame = wx.PreviewFrame(preview, self, _("Print preview"), style=wx.DEFAULT_FRAME_STYLE | wx.FRAME_FLOAT_ON_PARENT)
 
                 preview_frame.Initialize()
 
@@ -1104,9 +1155,9 @@
     def OnQuitMenu(self, event):
         self.Close()
 
-#-------------------------------------------------------------------------------
-#                            Edit Menu Functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                            Edit Menu Functions
+    # -------------------------------------------------------------------------------
 
     def RefreshEditMenu(self):
         MenuToolBar = self.Panes["MenuToolBar"]
@@ -1121,14 +1172,14 @@
             MenuToolBar.EnableTool(wx.ID_UNDO, undo)
             self.EditMenu.Enable(wx.ID_REDO, redo)
             MenuToolBar.EnableTool(wx.ID_REDO, redo)
-            #self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, True)
-            #self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO,
+            # self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, True)
+            # self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO,
             #                self.Controler.IsProjectBufferEnabled())
             self.EditMenu.Enable(wx.ID_FIND, selected > -1)
             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUFINDNEXT,
-                  selected > -1 and self.SearchParams is not None)
+                                 selected > -1 and self.SearchParams is not None)
             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUFINDPREVIOUS,
-                  selected > -1 and self.SearchParams is not None)
+                                 selected > -1 and self.SearchParams is not None)
             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, True)
             MenuToolBar.EnableTool(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, True)
             self.EditMenu.Enable(wx.ID_ADD, True)
@@ -1158,7 +1209,7 @@
             MenuToolBar.EnableTool(wx.ID_UNDO, False)
             self.EditMenu.Enable(wx.ID_REDO, False)
             MenuToolBar.EnableTool(wx.ID_REDO, False)
-            #self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, False)
+            # self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, False)
             self.EditMenu.Enable(wx.ID_CUT, False)
             MenuToolBar.EnableTool(wx.ID_CUT, False)
             self.EditMenu.Enable(wx.ID_COPY, False)
@@ -1226,19 +1277,19 @@
     def SetDeleteFunctions(self):
         self.DeleteFunctions = {
             ITEM_DATATYPE: GetDeleteElementFunction(
-                    PLCControler.ProjectRemoveDataType,
-                    check_function=self.CheckDataTypeIsUsedBeforeDeletion),
+                PLCControler.ProjectRemoveDataType,
+                check_function=self.CheckDataTypeIsUsedBeforeDeletion),
             ITEM_POU: GetDeleteElementFunction(
-                    PLCControler.ProjectRemovePou,
-                    check_function=self.CheckPouIsUsedBeforeDeletion),
+                PLCControler.ProjectRemovePou,
+                check_function=self.CheckPouIsUsedBeforeDeletion),
             ITEM_TRANSITION: GetDeleteElementFunction(
-                    PLCControler.ProjectRemovePouTransition, ITEM_POU),
+                PLCControler.ProjectRemovePouTransition, ITEM_POU),
             ITEM_ACTION: GetDeleteElementFunction(
-                    PLCControler.ProjectRemovePouAction, ITEM_POU),
+                PLCControler.ProjectRemovePouAction, ITEM_POU),
             ITEM_CONFIGURATION: GetDeleteElementFunction(
-                    PLCControler.ProjectRemoveConfiguration),
+                PLCControler.ProjectRemoveConfiguration),
             ITEM_RESOURCE: GetDeleteElementFunction(
-                    PLCControler.ProjectRemoveConfigurationResource, ITEM_CONFIGURATION)
+                PLCControler.ProjectRemoveConfigurationResource, ITEM_CONFIGURATION)
         }
 
     def OnDeleteMenu(self, event):
@@ -1291,9 +1342,9 @@
                 self.SearchResultPanel.SetSearchResults(criteria, result)
                 self.SelectTab(self.SearchResultPanel)
 
-#-------------------------------------------------------------------------------
-#                             Display Menu Functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                             Display Menu Functions
+    # -------------------------------------------------------------------------------
 
     def RefreshDisplayMenu(self):
         if self.Controler is not None:
@@ -1342,9 +1393,9 @@
     def OnResetPerspective(self, event):
         self.ResetPerspective()
 
-#-------------------------------------------------------------------------------
-#                      Project Editor Panels Management Functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                      Project Editor Panels Management Functions
+    # -------------------------------------------------------------------------------
 
     def OnPageDragged(self, event):
         wx.CallAfter(self.RefreshTabCtrlEvent)
@@ -1445,11 +1496,11 @@
         def OnTabsOpenedDClick(event):
             pos = event.GetPosition()
             if tabctrl.TabHitTest(pos.x, pos.y, None):
-                self.SwitchFullScrMode(event)
+                self.SwitchPerspective(event)
             event.Skip()
         return OnTabsOpenedDClick
 
-    def SwitchFullScrMode(self,evt):
+    def SwitchPerspective(self, evt):
         pane = self.AUIManager.GetPane(self.TabsOpened)
         if pane.IsMaximized():
             self.AUIManager.RestorePane(pane)
@@ -1457,9 +1508,13 @@
             self.AUIManager.MaximizePane(pane)
         self.AUIManager.Update()
 
-#-------------------------------------------------------------------------------
-#                         Types Tree Management Functions
-#-------------------------------------------------------------------------------
+    def SwitchFullScrMode(self, evt):
+        show = not self.IsFullScreen()
+        self.ShowFullScreen(show)
+
+    # -------------------------------------------------------------------------------
+    #                         Types Tree Management Functions
+    # -------------------------------------------------------------------------------
 
     def RefreshProjectTree(self):
         # Extract current selected item tagname
@@ -1471,12 +1526,13 @@
             tagname = None
 
         # Refresh treectrl items according to project infos
-        infos = self.Controler.GetProjectInfos()
-        root = self.ProjectTree.GetRootItem()
-        if root is None or not root.IsOk():
-            root = self.ProjectTree.AddRoot(infos["name"])
-        self.GenerateProjectTreeBranch(root, infos)
-        self.ProjectTree.Expand(root)
+        if self.Controler:
+            infos = self.Controler.GetProjectInfos()
+            root = self.ProjectTree.GetRootItem()
+            if root is None or not root.IsOk():
+                root = self.ProjectTree.AddRoot(infos["name"])
+            self.GenerateProjectTreeBranch(root, infos)
+            self.ProjectTree.Expand(root)
 
         # Select new item corresponding to previous selected item
         if tagname is not None:
@@ -1492,19 +1548,20 @@
         self.ProjectTree.SetItemText(root, item_name)
         self.ProjectTree.SetPyData(root, infos)
         highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.Colour(255, 255, 255, 0), wx.BLACK))
+        self.ProjectTree.SetItemBackgroundColour(root, highlight_colours[0])
         self.ProjectTree.SetItemTextColour(root, highlight_colours[1])
         self.ProjectTree.SetItemExtraImage(root, None)
         if infos["type"] == ITEM_POU:
-            self.ProjectTree.SetItemImage(root,
-                self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
+            self.ProjectTree.SetItemImage(
+                root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
             if item_alone:
                 self.ProjectTree.SetItemExtraImage(root, self.Controler.GetPouType(infos["name"]))
-        elif infos.has_key("icon") and infos["icon"] is not None:
+        elif "icon" in infos and infos["icon"] is not None:
             icon_name = infos["icon"]
-            if not self.TreeImageDict.has_key(icon_name):
+            if icon_name not in self.TreeImageDict:
                 self.TreeImageDict[icon_name] = self.TreeImageList.Add(GetBitmap(icon_name))
             self.ProjectTree.SetItemImage(root, self.TreeImageDict[icon_name])
-        elif self.TreeImageDict.has_key(infos["type"]):
+        elif infos["type"] in self.TreeImageDict:
             self.ProjectTree.SetItemImage(root, self.TreeImageDict[infos["type"]])
 
         item, root_cookie = self.ProjectTree.GetFirstChild(root)
@@ -1535,8 +1592,8 @@
             root = self.ProjectTree.GetRootItem()
             if root is not None and root.IsOk():
                 words = tagname.split("::")
-                result = self.RecursiveProjectTreeItemSelection(root,
-                    zip(words[1:], self.TagNamePartsItemTypes.get(words[0], [])))
+                result = self.RecursiveProjectTreeItemSelection(
+                    root, zip(words[1:], self.TagNamePartsItemTypes.get(words[0], [])))
         return result
 
     def RecursiveProjectTreeItemSelection(self, root, items):
@@ -1587,103 +1644,103 @@
         new_name = event.GetLabel()
         if new_name != "":
             if not TestIdentifier(new_name):
-                message = _("\"%s\" is not a valid identifier!")%new_name
+                message = _("\"%s\" is not a valid identifier!") % new_name
             elif new_name.upper() in IEC_KEYWORDS:
-                message = _("\"%s\" is a keyword. It can't be used!")%new_name
+                message = _("\"%s\" is a keyword. It can't be used!") % new_name
             else:
                 item = event.GetItem()
                 old_name = self.ProjectTree.GetItemText(item)
                 item_infos = self.ProjectTree.GetPyData(item)
                 if item_infos["type"] == ITEM_PROJECT:
-                    self.Controler.SetProjectProperties(name = new_name)
+                    self.Controler.SetProjectProperties(name=new_name)
                 elif item_infos["type"] == ITEM_DATATYPE:
                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectDataTypeNames() if name != old_name]:
-                        message = _("\"%s\" data type already exists!")%new_name
+                        message = _("\"%s\" data type already exists!") % new_name
                         abort = True
                     if not abort:
                         self.Controler.ChangeDataTypeName(old_name, new_name)
-                        self.RefreshEditorNames(self.Controler.ComputeDataTypeName(old_name),
-                                                self.Controler.ComputeDataTypeName(new_name))
+                        self.RefreshEditorNames(ComputeDataTypeName(old_name),
+                                                ComputeDataTypeName(new_name))
                         self.RefreshPageTitles()
                 elif item_infos["type"] == ITEM_POU:
                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames() if name != old_name]:
-                        message = _("\"%s\" pou already exists!")%new_name
+                        message = _("\"%s\" pou already exists!") % new_name
                         abort = True
                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames()]:
-                        messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
+                        messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?") % new_name, _("Error"), wx.YES_NO | wx.ICON_QUESTION)
                         if messageDialog.ShowModal() == wx.ID_NO:
                             abort = True
                         messageDialog.Destroy()
                     if not abort:
                         self.Controler.ChangePouName(old_name, new_name)
-                        self.RefreshEditorNames(self.Controler.ComputePouName(old_name),
-                                                self.Controler.ComputePouName(new_name))
+                        self.RefreshEditorNames(ComputePouName(old_name),
+                                                ComputePouName(new_name))
                         self.RefreshLibraryPanel()
                         self.RefreshPageTitles()
                 elif item_infos["type"] == ITEM_TRANSITION:
                     pou_item = self.ProjectTree.GetItemParent(event.GetItem())
-                    pou_name = self.ProjectTree.GetItemText(pou_item)                    
+                    pou_name = self.ProjectTree.GetItemText(pou_item)
                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
-                        message = _("A POU named \"%s\" already exists!")%new_name
+                        message = _("A POU named \"%s\" already exists!") % new_name
                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames(pou_name) if name != old_name]:
-                        message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
+                        message = _("A variable with \"%s\" as name already exists in this pou!") % new_name
                     else:
                         words = item_infos["tagname"].split("::")
                         self.Controler.ChangePouTransitionName(words[1], old_name, new_name)
-                        self.RefreshEditorNames(self.Controler.ComputePouTransitionName(words[1], old_name),
-                                                self.Controler.ComputePouTransitionName(words[1], new_name))
+                        self.RefreshEditorNames(ComputePouTransitionName(words[1], old_name),
+                                                ComputePouTransitionName(words[1], new_name))
                         self.RefreshPageTitles()
                 elif item_infos["type"] == ITEM_ACTION:
                     pou_item = self.ProjectTree.GetItemParent(event.GetItem())
                     pou_name = self.ProjectTree.GetItemText(pou_item)
                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
-                        message = _("A POU named \"%s\" already exists!")%new_name
+                        message = _("A POU named \"%s\" already exists!") % new_name
                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames(pou_name) if name != old_name]:
-                        message = _("A variable with \"%s\" as name already exists in this pou!")%new_name
+                        message = _("A variable with \"%s\" as name already exists in this pou!") % new_name
                     else:
                         words = item_infos["tagname"].split("::")
                         self.Controler.ChangePouActionName(words[1], old_name, new_name)
-                        self.RefreshEditorNames(self.Controler.ComputePouActionName(words[1], old_name),
-                                                self.Controler.ComputePouActionName(words[1], new_name))
+                        self.RefreshEditorNames(ComputePouActionName(words[1], old_name),
+                                                ComputePouActionName(words[1], new_name))
                         self.RefreshPageTitles()
                 elif item_infos["type"] == ITEM_CONFIGURATION:
                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames() if name != old_name]:
-                        message = _("\"%s\" config already exists!")%new_name
+                        message = _("\"%s\" config already exists!") % new_name
                         abort = True
                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
-                        messageDialog = wx.MessageDialog(self, _("There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
+                        messageDialog = wx.MessageDialog(self, _("There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?") % new_name, _("Error"), wx.YES_NO | wx.ICON_QUESTION)
                         if messageDialog.ShowModal() == wx.ID_NO:
                             abort = True
                         messageDialog.Destroy()
                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames()]:
-                        messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
+                        messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?") % new_name, _("Error"), wx.YES_NO | wx.ICON_QUESTION)
                         if messageDialog.ShowModal() == wx.ID_NO:
                             abort = True
                         messageDialog.Destroy()
                     if not abort:
                         self.Controler.ChangeConfigurationName(old_name, new_name)
-                        self.RefreshEditorNames(self.Controler.ComputeConfigurationName(old_name),
-                                                self.Controler.ComputeConfigurationName(new_name))
+                        self.RefreshEditorNames(ComputeConfigurationName(old_name),
+                                                ComputeConfigurationName(new_name))
                         self.RefreshPageTitles()
                 elif item_infos["type"] == ITEM_RESOURCE:
                     if new_name.upper() in [name.upper() for name in self.Controler.GetProjectConfigNames()]:
-                        message = _("\"%s\" config already exists!")%new_name
+                        message = _("\"%s\" config already exists!") % new_name
                         abort = True
                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames()]:
-                        messageDialog = wx.MessageDialog(self, _("There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
+                        messageDialog = wx.MessageDialog(self, _("There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?") % new_name, _("Error"), wx.YES_NO | wx.ICON_QUESTION)
                         if messageDialog.ShowModal() == wx.ID_NO:
                             abort = True
                         messageDialog.Destroy()
                     elif new_name.upper() in [name.upper() for name in self.Controler.GetProjectPouVariableNames()]:
-                        messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?")%new_name, _("Error"), wx.YES_NO|wx.ICON_QUESTION)
+                        messageDialog = wx.MessageDialog(self, _("A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?") % new_name, _("Error"), wx.YES_NO | wx.ICON_QUESTION)
                         if messageDialog.ShowModal() == wx.ID_NO:
                             abort = True
                         messageDialog.Destroy()
                     if not abort:
                         words = item_infos["tagname"].split("::")
                         self.Controler.ChangeConfigurationResourceName(words[1], old_name, new_name)
-                        self.RefreshEditorNames(self.Controler.ComputeConfigurationResourceName(words[1], old_name),
-                                                self.Controler.ComputeConfigurationResourceName(words[1], new_name))
+                        self.RefreshEditorNames(ComputeConfigurationResourceName(words[1], old_name),
+                                                ComputeConfigurationResourceName(words[1], new_name))
                         self.RefreshPageTitles()
             if message or abort:
                 if message:
@@ -1697,20 +1754,18 @@
 
     def OnProjectTreeItemActivated(self, event):
         selected = event.GetItem()
-        name = self.ProjectTree.GetItemText(selected)
         item_infos = self.ProjectTree.GetPyData(selected)
         if item_infos["type"] == ITEM_PROJECT:
             self.EditProjectSettings()
         else:
             if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
-                                    ITEM_CONFIGURATION, ITEM_RESOURCE,
-                                    ITEM_TRANSITION, ITEM_ACTION]:
+                                      ITEM_CONFIGURATION, ITEM_RESOURCE,
+                                      ITEM_TRANSITION, ITEM_ACTION]:
                 self.EditProjectElement(item_infos["type"], item_infos["tagname"])
             event.Skip()
 
     def ProjectTreeItemSelect(self, select_item):
         if select_item is not None and select_item.IsOk():
-            name = self.ProjectTree.GetItemText(select_item)
             item_infos = self.ProjectTree.GetPyData(select_item)
             if item_infos["type"] in [ITEM_DATATYPE, ITEM_POU,
                                       ITEM_CONFIGURATION, ITEM_RESOURCE,
@@ -1734,10 +1789,10 @@
                 if item != self.LastToolTipItem and self.LastToolTipItem is not None:
                     self.ProjectTree.SetToolTip(None)
                     self.LastToolTipItem = None
-                if (self.LastToolTipItem != item and
-                    item_infos["type"] in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]):
+                if self.LastToolTipItem != item and \
+                   item_infos["type"] in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
                     bodytype = self.Controler.GetEditedElementBodyType(
-                            item_infos["tagname"])
+                        item_infos["tagname"])
                     if item_infos["type"] == ITEM_POU:
                         block_type = {
                             "program": _("Program"),
@@ -1750,8 +1805,8 @@
                         block_type = "Action"
                     self.LastToolTipItem = item
                     wx.CallAfter(self.ProjectTree.SetToolTipString,
-                        "%s : %s : %s" % (
-                            block_type, bodytype, item_infos["name"]))
+                                 "%s : %s : %s" % (
+                                     block_type, bodytype, item_infos["name"]))
             elif self.LastToolTipItem is not None:
                 self.ProjectTree.SetToolTip(None)
                 self.LastToolTipItem = None
@@ -1764,7 +1819,7 @@
         else:
             event.Skip()
 
-    def EditProjectElement(self, element, tagname, onlyopened = False):
+    def EditProjectElement(self, element, tagname, onlyopened=False):
         openedidx = self.IsOpened(tagname)
         if openedidx is not None:
             old_selected = self.TabsOpened.GetSelection()
@@ -1844,7 +1899,7 @@
             if item_infos["type"] == ITEM_PROJECT:
                 name = "Project"
             else:
-                name = UNEDITABLE_NAMES_DICT[name]
+                name = self.UNEDITABLE_NAMES_DICT[name]
 
             if name == "Data Types":
                 menu = wx.Menu(title='')
@@ -1858,7 +1913,7 @@
                 if name != "Project":
                     new_id = wx.NewId()
                     AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Add POU"))
-                    self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction({"Functions" : "function", "Function Blocks" : "functionBlock", "Programs" : "program"}[name]), id=new_id)
+                    self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction({"Functions": "function", "Function Blocks": "functionBlock", "Programs": "program"}[name]), id=new_id)
 
                 new_id = wx.NewId()
                 AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Paste POU"))
@@ -1966,10 +2021,9 @@
 
         event.Skip()
 
-
-#-------------------------------------------------------------------------------
-#                         Instances Tree Management Functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                         Instances Tree Management Functions
+    # -------------------------------------------------------------------------------
 
     def GetTreeImage(self, var_class):
         return self.TreeImageDict[var_class]
@@ -2043,7 +2097,7 @@
                         self.TabsOpened.DeletePage(idx)
                     else:
                         editor.SubscribeAllDataConsumers()
-                elif editor.IsDebugging():
+                elif editor.IsDebugging() and hasattr(editor, 'SubscribeAllDataConsumers'):
                     editor.SubscribeAllDataConsumers()
             self.DebugVariablePanel.SubscribeAllDataConsumers()
 
@@ -2052,16 +2106,16 @@
             self.DebugVariablePanel.InsertValue(iec_path, force=force, graph=graph)
             self.EnsureTabVisible(self.DebugVariablePanel)
 
-#-------------------------------------------------------------------------------
-#                         Library Panel Management Function
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                         Library Panel Management Function
+    # -------------------------------------------------------------------------------
 
     def RefreshLibraryPanel(self):
         self.LibraryPanel.RefreshTree()
 
-#-------------------------------------------------------------------------------
-#                          ToolBars Management Functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          ToolBars Management Functions
+    # -------------------------------------------------------------------------------
 
     def AddToMenuToolBar(self, items):
         MenuToolBar = self.Panes["MenuToolBar"]
@@ -2082,10 +2136,7 @@
         EditorToolBar = self.Panes["EditorToolBar"]
 
         for item in self.CurrentEditorToolBar:
-            if wx.VERSION >= (2, 6, 0):
-                self.Unbind(wx.EVT_MENU, id=item)
-            else:
-                self.Disconnect(id=item, eventType=wx.wxEVT_COMMAND_MENU_SELECTED)
+            self.Unbind(wx.EVT_MENU, id=item)
 
             if EditorToolBar:
                 EditorToolBar.DeleteTool(item)
@@ -2112,7 +2163,7 @@
             self.CurrentEditorToolBar = []
             EditorToolBar = self.Panes["EditorToolBar"]
             if EditorToolBar:
-                for radio, modes, id, method, picture, help in EditorToolBarItems[menu]:
+                for radio, modes, id, method, picture, help in self.EditorToolBarItems[menu]:
                     if modes & self.DrawingMode:
                         if radio or self.DrawingMode == FREEDRAWING_MODE:
                             EditorToolBar.AddRadioTool(id, GetBitmap(picture), wx.NullBitmap, help)
@@ -2121,18 +2172,18 @@
                         self.Bind(wx.EVT_MENU, getattr(self, method), id=id)
                         self.CurrentEditorToolBar.append(id)
                 EditorToolBar.Realize()
+                self.AUIManager.GetPane("EditorToolBar").Show()
+                self.AUIManager.Update()
                 self.AUIManager.GetPane("EditorToolBar").BestSize(EditorToolBar.GetBestSize())
-                self.AUIManager.GetPane("EditorToolBar").Show()
                 self.AUIManager.Update()
         elif menu is None:
             self.ResetEditorToolBar()
             self.CurrentMenu = menu
         self.ResetCurrentMode()
 
-
-#-------------------------------------------------------------------------------
-#                           EditorToolBar Items Functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                           EditorToolBar Items Functions
+    # -------------------------------------------------------------------------------
 
     def ResetCurrentMode(self):
         selected = self.TabsOpened.GetSelection()
@@ -2268,10 +2319,16 @@
             else:
                 self.TabsOpened.GetPage(selected).AddJump()
 
-
-#-------------------------------------------------------------------------------
-#                         Add Project Elements Functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                         Add Project Elements Functions
+    # -------------------------------------------------------------------------------
+
+    def OnAddNewProject(self, event):
+        # Asks user to create main program after creating new project
+        AddProgramDialog = self.GenerateAddPouFunction('program', True)
+        # Checks that user created main program
+        if AddProgramDialog(event):
+            self.Controler.SetProjectDefaultConfiguration()
 
     def OnAddDataTypeMenu(self, event):
         tagname = self.Controler.ProjectAddDataType()
@@ -2279,19 +2336,23 @@
             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE)
             self.EditProjectElement(ITEM_DATATYPE, tagname)
 
-    def GenerateAddPouFunction(self, pou_type):
+    def GenerateAddPouFunction(self, pou_type, type_readonly=False):
         def OnAddPouMenu(event):
-            dialog = PouDialog(self, pou_type)
+            dialog = PouDialog(self, pou_type, type_readonly)
             dialog.SetPouNames(self.Controler.GetProjectPouNames())
             dialog.SetPouElementNames(self.Controler.GetProjectPouVariableNames())
             dialog.SetValues({"pouName": self.Controler.GenerateNewName(None, None, "%s%%d" % pou_type)})
+            pou_created = False
             if dialog.ShowModal() == wx.ID_OK:
                 values = dialog.GetValues()
                 tagname = self.Controler.ProjectAddPou(values["pouName"], values["pouType"], values["language"])
                 if tagname is not None:
                     self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE)
                     self.EditProjectElement(ITEM_POU, tagname)
+                    dialog.Destroy()
+                    pou_created = True
             dialog.Destroy()
+            return pou_created
         return OnAddPouMenu
 
     def GenerateAddTransitionFunction(self, pou_name):
@@ -2368,7 +2429,7 @@
 
         if self.ProjectTree.GetPyData(selected)["type"] != ITEM_PROJECT:
             pou_type = self.ProjectTree.GetItemText(selected)
-            pou_type = UNEDITABLE_NAMES_DICT[pou_type] # one of 'Functions', 'Function Blocks' or 'Programs'
+            pou_type = self.UNEDITABLE_NAMES_DICT[pou_type]  # one of 'Functions', 'Function Blocks' or 'Programs'
             pou_type = {'Functions': 'function', 'Function Blocks': 'functionBlock', 'Programs': 'program'}[pou_type]
         else:
             pou_type = None
@@ -2377,23 +2438,24 @@
 
         result = self.Controler.PastePou(pou_type, pou_xml)
 
-        if not isinstance(result, TupleType):
+        if not isinstance(result, tuple):
             self.ShowErrorMessage(result)
         else:
             self._Refresh(TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, PROJECTTREE, LIBRARYTREE)
             self.EditProjectElement(ITEM_POU, result[0])
 
-#-------------------------------------------------------------------------------
-#                        Remove Project Elements Functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                        Remove Project Elements Functions
+    # -------------------------------------------------------------------------------
 
     def CheckElementIsUsedBeforeDeletion(self, check_function, title, name):
         if not check_function(name):
             return True
 
-        dialog = wx.MessageDialog(self,
+        dialog = wx.MessageDialog(
+            self,
             _("\"%s\" is used by one or more POUs. Do you wish to continue?") % name,
-            title, wx.YES_NO|wx.ICON_QUESTION)
+            title, wx.YES_NO | wx.ICON_QUESTION)
         answer = dialog.ShowModal()
         dialog.Destroy()
         return answer == wx.ID_YES
@@ -2414,7 +2476,7 @@
             name = self.ProjectTree.GetItemText(selected)
             if self.CheckDataTypeIsUsedBeforeDeletion(name):
                 self.Controler.ProjectRemoveDataType(name)
-                tagname = self.Controler.ComputeDataTypeName(name)
+                tagname = ComputeDataTypeName(name)
                 idx = self.IsOpened(tagname)
                 if idx is not None:
                     self.TabsOpened.DeletePage(idx)
@@ -2431,7 +2493,7 @@
             name = self.ProjectTree.GetItemText(selected)
             if self.CheckPouIsUsedBeforeDeletion(name):
                 self.Controler.ProjectRemovePou(name)
-                tagname = self.Controler.ComputePouName(name)
+                tagname = ComputePouName(name)
                 idx = self.IsOpened(tagname)
                 if idx is not None:
                     self.TabsOpened.DeletePage(idx)
@@ -2444,7 +2506,7 @@
             transition = self.ProjectTree.GetItemText(selected)
             pou_name = item_infos["tagname"].split("::")[1]
             self.Controler.ProjectRemovePouTransition(pou_name, transition)
-            tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
+            tagname = ComputePouTransitionName(pou_name, transition)
             idx = self.IsOpened(tagname)
             if idx is not None:
                 self.TabsOpened.DeletePage(idx)
@@ -2457,7 +2519,7 @@
             action = self.ProjectTree.GetItemText(selected)
             pou_name = item_infos["tagname"].split("::")[1]
             self.Controler.ProjectRemovePouAction(pou_name, action)
-            tagname = self.Controler.ComputePouActionName(pou_name, action)
+            tagname = ComputePouActionName(pou_name, action)
             idx = self.IsOpened(tagname)
             if idx is not None:
                 self.TabsOpened.DeletePage(idx)
@@ -2468,7 +2530,7 @@
         if self.ProjectTree.GetPyData(selected)["type"] == ITEM_CONFIGURATION:
             name = self.ProjectTree.GetItemText(selected)
             self.Controler.ProjectRemoveConfiguration(name)
-            tagname = self.Controler.ComputeConfigurationName(name)
+            tagname = ComputeConfigurationName(name)
             idx = self.IsOpened(tagname)
             if idx is not None:
                 self.TabsOpened.DeletePage(idx)
@@ -2481,15 +2543,15 @@
             resource = self.ProjectTree.GetItemText(selected)
             config_name = item_infos["tagname"].split("::")[1]
             self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
-            tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
+            tagname = ComputeConfigurationResourceName(config_name, selected)
             idx = self.IsOpened(tagname)
             if idx is not None:
                 self.TabsOpened.DeletePage(idx)
             self._Refresh(TITLE, FILEMENU, EDITMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL)
 
-#-------------------------------------------------------------------------------
-#                        Highlights showing functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                        Highlights showing functions
+    # -------------------------------------------------------------------------------
 
     def ShowHighlight(self, infos, start, end, highlight_type):
         self.SelectProjectTreeItem(infos[0])
@@ -2498,7 +2560,7 @@
             self.RefreshProjectTree()
             self.ProjectTree.Unselect()
         else:
-            self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
+            self.EditProjectElement(GetElementType(infos[0]), infos[0])
             selected = self.TabsOpened.GetSelection()
             if selected != -1:
                 viewer = self.TabsOpened.GetPage(selected)
@@ -2526,14 +2588,17 @@
     def ClearSearchResults(self):
         self.ClearHighlights(SEARCH_RESULT_HIGHLIGHT)
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                               Viewer Printout
-#-------------------------------------------------------------------------------
-
-UPPER_DIV = lambda x, y: (x / y) + {True : 0, False : 1}[(x % y) == 0]
+# -------------------------------------------------------------------------------
+
+
+def UPPER_DIV(x, y):
+    return (x // y) + {True: 0, False: 1}[(x % y) == 0]
+
 
 class GraphicPrintout(wx.Printout):
-    def __init__(self, viewer, page_size, margins, preview = False):
+    def __init__(self, viewer, page_size, margins, preview=False):
         wx.Printout.__init__(self)
         self.Viewer = viewer
         self.PageSize = page_size
@@ -2566,20 +2631,20 @@
 
     def OnPrintPage(self, page):
         dc = self.GetDC()
+        dc.SetBackground(wx.WHITE_BRUSH)
+        dc.Clear()
         dc.SetUserScale(1.0, 1.0)
         dc.SetDeviceOrigin(0, 0)
         dc.printing = not self.Preview
 
         # Get the size of the DC in pixels
         ppiPrinterX, ppiPrinterY = self.GetPPIPrinter()
-        ppiScreenX, ppiScreenY = self.GetPPIScreen()
         pw, ph = self.GetPageSizePixels()
         dw, dh = dc.GetSizeTuple()
-        Xscale = (float(dw) * float(ppiPrinterX)) / (float(pw) * 25.4)
-        Yscale = (float(dh) * float(ppiPrinterY)) / (float(ph) * 25.4)
+        Xscale = (dw * ppiPrinterX) / (pw * 25.4)
+        Yscale = (dh * ppiPrinterY) / (ph * 25.4)
 
         fontsize = self.FontSize * Yscale
-        text_margin = self.TextMargin * Yscale
 
         margin_left = self.Margins[0].x * Xscale
         margin_top = self.Margins[0].y * Yscale
@@ -2593,16 +2658,16 @@
         dc.SetFont(wx.Font(fontsize, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
         dc.SetTextForeground(wx.BLACK)
         block_name = " - ".join(self.Viewer.GetTagName().split("::")[1:])
-        text_width, text_height = dc.GetTextExtent(block_name)
+        _text_width, text_height = dc.GetTextExtent(block_name)
         dc.DrawText(block_name, margin_left, margin_top - text_height - self.TextMargin)
         dc.DrawText(_("Page: %d") % page, margin_left, margin_top + area_height + self.TextMargin)
 
         # Calculate the position on the DC for centering the graphic
         posX = area_width * ((page - 1) % self.PageGrid[0])
-        posY = area_height * ((page - 1) / self.PageGrid[0])
-
-        scaleX = float(area_width) / float(self.PageSize[0])
-        scaleY = float(area_height) / float(self.PageSize[1])
+        posY = area_height * ((page - 1) // self.PageGrid[0])
+
+        scaleX = area_width / self.PageSize[0]
+        scaleY = area_height / self.PageSize[1]
         scale = min(scaleX, scaleY)
 
         # Set the scale and origin
@@ -2610,9 +2675,6 @@
         dc.SetClippingRegion(posX, posY, self.PageSize[0] * scale, self.PageSize[1] * scale)
         dc.SetUserScale(scale, scale)
 
-        #-------------------------------------------
-
         self.Viewer.DoDrawing(dc, True)
 
         return True
-
--- a/NativeLib.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/NativeLib.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -22,10 +23,10 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import os
-from POULibrary import POULibrary
 
-class NativeLibrary(POULibrary):
-    def GetLibraryPath(self):
-        return os.path.join(os.path.split(__file__)[0], "NativeLib.xml") 
+from __future__ import absolute_import
+import util.paths as paths
+from POULibrary import SimplePOULibraryFactory
 
+NativeLibrary = SimplePOULibraryFactory(
+    paths.AbsNeighbourFile(__file__, "NativeLib.xml"))
--- a/PLCControler.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/PLCControler.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -22,425 +23,47 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-from xml.dom import minidom
-from types import StringType, UnicodeType, TupleType
-from lxml import etree
+
+from __future__ import absolute_import
+from __future__ import division
 from copy import deepcopy
-import os,sys,re
+import os
+import re
 import datetime
 from time import localtime
-from collections import OrderedDict, namedtuple
-
+from functools import reduce
+from future.builtins import round
+
+import util.paths as paths
 from plcopen import *
+from plcopen.types_enums import *
+from plcopen.InstancesPathCollector import InstancesPathCollector
+from plcopen.POUVariablesCollector import POUVariablesCollector
+from plcopen.InstanceTagnameCollector import InstanceTagnameCollector
+from plcopen.BlockInstanceCollector import BlockInstanceCollector
+from plcopen.VariableInfoCollector import VariableInfoCollector
 from graphics.GraphicCommons import *
 from PLCGenerator import *
 
-duration_model = re.compile("(?:([0-9]{1,2})h)?(?:([0-9]{1,2})m(?!s))?(?:([0-9]{1,2})s)?(?:([0-9]{1,3}(?:\.[0-9]*)?)ms)?")
-
-ITEMS_EDITABLE = [ITEM_PROJECT,
-                  ITEM_POU,
-                  ITEM_VARIABLE,
-                  ITEM_TRANSITION,
-                  ITEM_ACTION,
-                  ITEM_CONFIGURATION,
-                  ITEM_RESOURCE,
-                  ITEM_DATATYPE
-                 ] = range(8)
-
-ITEMS_UNEDITABLE = [ITEM_DATATYPES,
-                    ITEM_FUNCTION,
-                    ITEM_FUNCTIONBLOCK,
-                    ITEM_PROGRAM,
-                    ITEM_TRANSITIONS,
-                    ITEM_ACTIONS,
-                    ITEM_CONFIGURATIONS,
-                    ITEM_RESOURCES,
-                    ITEM_PROPERTIES
-                   ] = range(8, 17)
-
-ITEMS_VARIABLE = [ITEM_VAR_LOCAL,
-                  ITEM_VAR_GLOBAL,
-                  ITEM_VAR_EXTERNAL,
-                  ITEM_VAR_TEMP,
-                  ITEM_VAR_INPUT,
-                  ITEM_VAR_OUTPUT,
-                  ITEM_VAR_INOUT
-                 ] = range(17, 24)
-
-VAR_CLASS_INFOS = {
-    "Local":    ("localVars",    ITEM_VAR_LOCAL),
-    "Global":   ("globalVars",   ITEM_VAR_GLOBAL),
-    "External": ("externalVars", ITEM_VAR_EXTERNAL),
-    "Temp":     ("tempVars",     ITEM_VAR_TEMP),
-    "Input":    ("inputVars",    ITEM_VAR_INPUT),
-    "Output":   ("outputVars",   ITEM_VAR_OUTPUT),
-    "InOut":    ("inOutVars",    ITEM_VAR_INOUT)}
-
-POU_TYPES = {"program": ITEM_PROGRAM,
-             "functionBlock": ITEM_FUNCTIONBLOCK,
-             "function": ITEM_FUNCTION,
-            }
-
-LOCATIONS_ITEMS = [LOCATION_CONFNODE,
-                   LOCATION_MODULE,
-                   LOCATION_GROUP,
-                   LOCATION_VAR_INPUT,
-                   LOCATION_VAR_OUTPUT,
-                   LOCATION_VAR_MEMORY] = range(6)
-
-ScriptDirectory = os.path.split(os.path.realpath(__file__))[0]
-
-def GetUneditableNames():
-    _ = lambda x:x
-    return [_("User-defined POUs"), _("Functions"), _("Function Blocks"),
-            _("Programs"), _("Data Types"), _("Transitions"), _("Actions"),
-            _("Configurations"), _("Resources"), _("Properties")]
-UNEDITABLE_NAMES = GetUneditableNames()
-[USER_DEFINED_POUS, FUNCTIONS, FUNCTION_BLOCKS, PROGRAMS,
- DATA_TYPES, TRANSITIONS, ACTIONS, CONFIGURATIONS,
- RESOURCES, PROPERTIES] = UNEDITABLE_NAMES
-
-#-------------------------------------------------------------------------------
-#                 Helper object for loading library in xslt stylesheets
-#-------------------------------------------------------------------------------
-
-class LibraryResolver(etree.Resolver):
-
-    def __init__(self, controller, debug=False):
-        self.Controller = controller
-        self.Debug = debug
-
-    def resolve(self, url, pubid, context):
-        lib_name = os.path.basename(url)
-        if lib_name in ["project", "stdlib", "extensions"]:
-            lib_el = etree.Element(lib_name)
-            if lib_name == "project":
-                lib_el.append(deepcopy(self.Controller.GetProject(self.Debug)))
-            elif lib_name == "stdlib":
-                for lib in StdBlckLibs.values():
-                    lib_el.append(deepcopy(lib))
-            else:
-                for ctn in self.Controller.ConfNodeTypes:
-                    lib_el.append(deepcopy(ctn["types"]))
-            return self.resolve_string(etree.tostring(lib_el), context)
-
-#-------------------------------------------------------------------------------
-#           Helpers functions for translating list of arguments
-#                       from xslt to valid arguments
-#-------------------------------------------------------------------------------
-
-_StringValue = lambda x: x
-_BoolValue = lambda x: x in ["true", "0"]
-
-def _translate_args(translations, args):
-    return [translate(arg[0]) if len(arg) > 0 else None
-            for translate, arg in
-            zip(translations, args)]
-
-#-------------------------------------------------------------------------------
-#                 Helpers object for generating pou var list
-#-------------------------------------------------------------------------------
-
-class _VariableInfos(object):
-    __slots__ = ["Name", "Class", "Option", "Location", "InitialValue",
-                 "Edit", "Documentation", "Type", "Tree", "Number"]
-    def __init__(self, *args):
-        for attr, value in zip(self.__slots__, args):
-            setattr(self, attr, value if value is not None else "")
-    def copy(self):
-        return _VariableInfos(*[getattr(self, attr) for attr in self.__slots__])
-
-class VariablesInfosFactory:
-
-    def __init__(self, variables):
-        self.Variables = variables
-        self.TreeStack = []
-        self.Type = None
-        self.Dimensions = None
-
-    def SetType(self, context, *args):
-        self.Type = args[0][0]
-
-    def GetType(self):
-        if len(self.Dimensions) > 0:
-            return ("array", self.Type, self.Dimensions)
-        return self.Type
-
-    def GetTree(self):
-        return (self.TreeStack.pop(-1), self.Dimensions)
-
-    def AddDimension(self, context, *args):
-        self.Dimensions.append(tuple(
-            _translate_args([_StringValue] * 2, args)))
-
-    def AddTree(self, context, *args):
-        self.TreeStack.append([])
-        self.Dimensions = []
-
-    def AddVarToTree(self, context, *args):
-        var = (args[0][0], self.Type, self.GetTree())
-        self.TreeStack[-1].append(var)
-
-    def AddVariable(self, context, *args):
-        self.Variables.append(_VariableInfos(*(_translate_args(
-            [_StringValue] * 5 + [_BoolValue] + [_StringValue], args) +
-            [self.GetType(), self.GetTree()])))
-
-#-------------------------------------------------------------------------------
-#            Helpers object for generating pou variable instance list
-#-------------------------------------------------------------------------------
-
-def class_extraction(value):
-    class_type = {
-        "configuration": ITEM_CONFIGURATION,
-        "resource": ITEM_RESOURCE,
-        "action": ITEM_ACTION,
-        "transition": ITEM_TRANSITION,
-        "program": ITEM_PROGRAM}.get(value)
-    if class_type is not None:
-        return class_type
-
-    pou_type = POU_TYPES.get(value)
-    if pou_type is not None:
-        return pou_type
-
-    var_type = VAR_CLASS_INFOS.get(value)
-    if var_type is not None:
-        return var_type[1]
-
-    return None
-
-class _VariablesTreeItemInfos(object):
-    __slots__ = ["name", "var_class", "type", "edit", "debug", "variables"]
-    def __init__(self, *args):
-        for attr, value in zip(self.__slots__, args):
-            setattr(self, attr, value if value is not None else "")
-    def copy(self):
-        return _VariableTreeItem(*[getattr(self, attr) for attr in self.__slots__])
-
-class VariablesTreeInfosFactory:
-
-    def __init__(self):
-        self.Root = None
-
-    def GetRoot(self):
-        return self.Root
-
-    def SetRoot(self, context, *args):
-        self.Root = _VariablesTreeItemInfos(
-            *([''] + _translate_args(
-                [class_extraction, _StringValue] + [_BoolValue] * 2,
-                args) + [[]]))
-
-    def AddVariable(self, context, *args):
-        if self.Root is not None:
-            self.Root.variables.append(_VariablesTreeItemInfos(
-                *(_translate_args(
-                    [_StringValue, class_extraction, _StringValue] +
-                    [_BoolValue] * 2, args) + [[]])))
-
-#-------------------------------------------------------------------------------
-#            Helpers object for generating instances path list
-#-------------------------------------------------------------------------------
-
-class InstancesPathFactory:
-
-    def __init__(self, instances):
-        self.Instances = instances
-
-    def AddInstance(self, context, *args):
-        self.Instances.append(args[0][0])
-
-#-------------------------------------------------------------------------------
-#            Helpers object for generating instance tagname
-#-------------------------------------------------------------------------------
-
-class InstanceTagName:
-
-    def __init__(self, controller):
-        self.Controller = controller
-        self.TagName = None
-
-    def GetTagName(self):
-        return self.TagName
-
-    def ConfigTagName(self, context, *args):
-        self.TagName = self.Controller.ComputeConfigurationName(args[0][0])
-
-    def ResourceTagName(self, context, *args):
-        self.TagName = self.Controller.ComputeConfigurationResourceName(args[0][0], args[1][0])
-
-    def PouTagName(self, context, *args):
-        self.TagName = self.Controller.ComputePouName(args[0][0])
-
-    def ActionTagName(self, context, *args):
-        self.TagName = self.Controller.ComputePouActionName(args[0][0], args[0][1])
-
-    def TransitionTagName(self, context, *args):
-        self.TagName = self.Controller.ComputePouTransitionName(args[0][0], args[0][1])
-
-#-------------------------------------------------------------------------------
-#           Helpers object for generating pou block instances list
-#-------------------------------------------------------------------------------
-
-_Point = namedtuple("Point", ["x", "y"])
-
-_BlockInstanceInfos = namedtuple("BlockInstanceInfos",
-    ["type", "id", "x", "y", "width", "height", "specific_values", "inputs", "outputs"])
-
-_BlockSpecificValues = (
-    namedtuple("BlockSpecificValues",
-               ["name", "execution_order"]),
-    [_StringValue, int])
-_VariableSpecificValues = (
-    namedtuple("VariableSpecificValues",
-               ["name", "value_type", "execution_order"]),
-    [_StringValue, _StringValue, int])
-_ConnectionSpecificValues = (
-    namedtuple("ConnectionSpecificValues", ["name"]),
-    [_StringValue])
-
-_PowerRailSpecificValues = (
-    namedtuple("PowerRailSpecificValues", ["connectors"]),
-    [int])
-
-_LDElementSpecificValues = (
-    namedtuple("LDElementSpecificValues",
-               ["name", "negated", "edge", "storage", "execution_order"]),
-    [_StringValue, _BoolValue, _StringValue, _StringValue, int])
-
-_DivergenceSpecificValues = (
-    namedtuple("DivergenceSpecificValues", ["connectors"]),
-    [int])
-
-_SpecificValuesTuples = {
-    "comment": (
-        namedtuple("CommentSpecificValues", ["content"]),
-        [_StringValue]),
-    "input": _VariableSpecificValues,
-    "output": _VariableSpecificValues,
-    "inout": _VariableSpecificValues,
-    "connector": _ConnectionSpecificValues,
-    "continuation": _ConnectionSpecificValues,
-    "leftPowerRail": _PowerRailSpecificValues,
-    "rightPowerRail": _PowerRailSpecificValues,
-    "contact": _LDElementSpecificValues,
-    "coil": _LDElementSpecificValues,
-    "step": (
-        namedtuple("StepSpecificValues", ["name", "initial", "action"]),
-        [_StringValue, _BoolValue, lambda x: x]),
-    "transition": (
-        namedtuple("TransitionSpecificValues",
-                   ["priority", "condition_type", "condition", "connection"]),
-        [int, _StringValue, _StringValue, lambda x: x]),
-    "selectionDivergence": _DivergenceSpecificValues,
-    "selectionConvergence": _DivergenceSpecificValues,
-    "simultaneousDivergence": _DivergenceSpecificValues,
-    "simultaneousConvergence": _DivergenceSpecificValues,
-    "jump": (
-        namedtuple("JumpSpecificValues", ["target"]),
-        [_StringValue]),
-    "actionBlock": (
-        namedtuple("ActionBlockSpecificValues", ["actions"]),
-        [lambda x: x]),
-}
-
-_InstanceConnectionInfos = namedtuple("InstanceConnectionInfos",
-    ["name", "negated", "edge", "position", "links"])
-
-_ConnectionLinkInfos = namedtuple("ConnectionLinkInfos",
-    ["refLocalId", "formalParameter", "points"])
-
-class _ActionInfos(object):
-    __slots__ = ["qualifier", "type", "value", "duration", "indicator"]
-    def __init__(self, *args):
-        for attr, value in zip(self.__slots__, args):
-            setattr(self, attr, value if value is not None else "")
-    def copy(self):
-        return _ActionInfos(*[getattr(self, attr) for attr in self.__slots__])
-
-class BlockInstanceFactory:
-
-    def __init__(self, block_instances):
-        self.BlockInstances = block_instances
-        self.CurrentInstance = None
-        self.SpecificValues = None
-        self.CurrentConnection = None
-        self.CurrentLink = None
-
-    def SetSpecificValues(self, context, *args):
-        self.SpecificValues = list(args)
-        self.CurrentInstance = None
-        self.CurrentConnection = None
-        self.CurrentLink = None
-
-    def AddBlockInstance(self, context, *args):
-        specific_values_tuple, specific_values_translation = \
-            _SpecificValuesTuples.get(args[0][0], _BlockSpecificValues)
-
-        if (args[0][0] == "step" and len(self.SpecificValues) < 3 or
-            args[0][0] == "transition" and len(self.SpecificValues) < 4):
-            self.SpecificValues.append([None])
-        elif args[0][0] == "actionBlock" and len(self.SpecificValues) < 1:
-            self.SpecificValues.append([[]])
-        specific_values = specific_values_tuple(*_translate_args(
-            specific_values_translation, self.SpecificValues))
-        self.SpecificValues = None
-
-        self.CurrentInstance = _BlockInstanceInfos(
-            *(_translate_args([_StringValue, int] + [float] * 4, args) +
-              [specific_values, [], []]))
-
-        self.BlockInstances[self.CurrentInstance.id] = self.CurrentInstance
-
-    def AddInstanceConnection(self, context, *args):
-        connection_args = _translate_args(
-            [_StringValue] * 2 + [_BoolValue, _StringValue] + [float] * 2, args)
-
-        self.CurrentConnection = _InstanceConnectionInfos(
-            *(connection_args[1:4] + [
-                _Point(*connection_args[4:6]), []]))
-
-        if self.CurrentInstance is not None:
-            if connection_args[0] == "input":
-                self.CurrentInstance.inputs.append(self.CurrentConnection)
-            else:
-                self.CurrentInstance.outputs.append(self.CurrentConnection)
-        else:
-            self.SpecificValues.append([self.CurrentConnection])
-
-    def AddConnectionLink(self, context, *args):
-        self.CurrentLink = _ConnectionLinkInfos(
-            *(_translate_args([int, _StringValue], args) + [[]]))
-        self.CurrentConnection.links.append(self.CurrentLink)
-
-    def AddLinkPoint(self, context, *args):
-        self.CurrentLink.points.append(_Point(
-            *_translate_args([float] * 2, args)))
-
-    def AddAction(self, context, *args):
-        if len(self.SpecificValues) == 0:
-            self.SpecificValues.append([[]])
-        translated_args = _translate_args([_StringValue] * 5, args)
-        self.SpecificValues[0][0].append(_ActionInfos(*translated_args))
-
-pou_block_instances_xslt = etree.parse(
-    os.path.join(ScriptDirectory, "plcopen", "pou_block_instances.xslt"))
-
-#-------------------------------------------------------------------------------
-#                         Undo Buffer for PLCOpenEditor
-#-------------------------------------------------------------------------------
+duration_model = re.compile(r"(?:([0-9]{1,2})h)?(?:([0-9]{1,2})m(?!s))?(?:([0-9]{1,2})s)?(?:([0-9]{1,3}(?:\.[0-9]*)?)ms)?")
+VARIABLE_NAME_SUFFIX_MODEL = re.compile(r'(\d+)$')
+
+ScriptDirectory = paths.AbsDir(__file__)
 
 # Length of the buffer
 UNDO_BUFFER_LENGTH = 20
 
-"""
-Class implementing a buffer of changes made on the current editing model
-"""
-class UndoBuffer:
-
-    # Constructor initialising buffer
-    def __init__(self, currentstate, issaved = False):
+
+class UndoBuffer(object):
+    """
+    Undo Buffer for PLCOpenEditor
+    Class implementing a buffer of changes made on the current editing model
+    """
+
+    def __init__(self, currentstate, issaved=False):
+        """
+        Constructor initialising buffer
+        """
         self.Buffer = []
         self.CurrentIndex = -1
         self.MinIndex = -1
@@ -462,8 +85,10 @@
         else:
             self.LastSave = -1
 
-    # Add a new state in buffer
     def Buffering(self, currentstate):
+        """
+        Add a new state in buffer
+        """
         self.CurrentIndex = (self.CurrentIndex + 1) % UNDO_BUFFER_LENGTH
         self.Buffer[self.CurrentIndex] = currentstate
         # Actualising buffer limits
@@ -475,8 +100,10 @@
             self.MinIndex = (self.MinIndex + 1) % UNDO_BUFFER_LENGTH
         self.MinIndex = max(self.MinIndex, 0)
 
-    # Return current state of buffer
     def Current(self):
+        """
+        Return current state of buffer
+        """
         return self.Buffer[self.CurrentIndex]
 
     # Change current state to previous in buffer and return new current state
@@ -510,19 +137,21 @@
         return self.LastSave == self.CurrentIndex
 
 
-#-------------------------------------------------------------------------------
-#                           Controler for PLCOpenEditor
-#-------------------------------------------------------------------------------
-
-"""
-Class which controls the operations made on the plcopen model and answers to view requests
-"""
-class PLCControler:
+class PLCControler(object):
+    """
+    Controler for PLCOpenEditor
+    Class which controls the operations made on the plcopen model and answers to view requests
+    """
 
     # Create a new PLCControler
     def __init__(self):
         self.LastNewIndex = 0
         self.Reset()
+        self.InstancesPathCollector = InstancesPathCollector(self)
+        self.POUVariablesCollector = POUVariablesCollector(self)
+        self.InstanceTagnameCollector = InstanceTagnameCollector(self)
+        self.BlockInstanceCollector = BlockInstanceCollector(self)
+        self.VariableInfoCollector = VariableInfoCollector(self)
 
     # Reset PLCControler internal variables
     def Reset(self):
@@ -545,15 +174,15 @@
     def GetQualifierTypes(self):
         return QualifierList
 
-    def GetProject(self, debug = False):
+    def GetProject(self, debug=False):
         if debug and self.CurrentCompiledProject is not None:
             return self.CurrentCompiledProject
         else:
             return self.Project
 
-#-------------------------------------------------------------------------------
-#                         Project management functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                         Project management functions
+    # -------------------------------------------------------------------------------
 
     # Return if a project is opened
     def HasOpenedProject(self):
@@ -577,28 +206,28 @@
         self.Buffering = False
 
     # Return project data type names
-    def GetProjectDataTypeNames(self, debug = False):
+    def GetProjectDataTypeNames(self, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             return [datatype.getname() for datatype in project.getdataTypes()]
         return []
 
     # Return project pou names
-    def GetProjectPouNames(self, debug = False):
+    def GetProjectPouNames(self, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             return [pou.getname() for pou in project.getpous()]
         return []
 
     # Return project pou names
-    def GetProjectConfigNames(self, debug = False):
+    def GetProjectConfigNames(self, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             return [config.getname() for config in project.getconfigurations()]
         return []
 
     # Return project pou variable names
-    def GetProjectPouVariableNames(self, pou_name = None, debug = False):
+    def GetProjectPouVariableNames(self, pou_name=None, debug=False):
         variables = []
         project = self.GetProject(debug)
         if project is not None:
@@ -625,7 +254,7 @@
             if self.ProjectIsSaved():
                 return self.FileName
             else:
-                return "~%s~"%self.FileName
+                return "~%s~" % self.FileName
         return ""
 
     # Change file path and save file name or create a default one if file path not defined
@@ -633,12 +262,12 @@
         self.FilePath = filepath
         if filepath == "":
             self.LastNewIndex += 1
-            self.FileName = _("Unnamed%d")%self.LastNewIndex
+            self.FileName = _("Unnamed%d") % self.LastNewIndex
         else:
             self.FileName = os.path.splitext(os.path.basename(filepath))[0]
 
     # Change project properties
-    def SetProjectProperties(self, name = None, properties = None, buffer = True):
+    def SetProjectProperties(self, name=None, properties=None, buffer=True):
         if self.Project is not None:
             if name is not None:
                 self.Project.setname(name)
@@ -656,7 +285,7 @@
         return None
 
     # Return project properties
-    def GetProjectProperties(self, debug = False):
+    def GetProjectProperties(self, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             properties = project.getfileHeader()
@@ -665,33 +294,54 @@
         return None
 
     # Return project informations
-    def GetProjectInfos(self, debug = False):
+    def GetProjectInfos(self, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             infos = {"name": project.getname(), "type": ITEM_PROJECT}
-            datatypes = {"name": DATA_TYPES, "type": ITEM_DATATYPES, "values":[]}
+            datatypes = {"name": DATA_TYPES, "type": ITEM_DATATYPES, "values": []}
             for datatype in project.getdataTypes():
-                datatypes["values"].append({"name": datatype.getname(), "type": ITEM_DATATYPE,
-                    "tagname": self.ComputeDataTypeName(datatype.getname()), "values": []})
-            pou_types = {"function": {"name": FUNCTIONS, "type": ITEM_FUNCTION, "values":[]},
-                         "functionBlock": {"name": FUNCTION_BLOCKS, "type": ITEM_FUNCTIONBLOCK, "values":[]},
-                         "program": {"name": PROGRAMS, "type": ITEM_PROGRAM, "values":[]}}
+                datatypes["values"].append({
+                    "name": datatype.getname(),
+                    "type": ITEM_DATATYPE,
+                    "tagname": ComputeDataTypeName(datatype.getname()),
+                    "values": []})
+            pou_types = {
+                "function": {
+                    "name":   FUNCTIONS,
+                    "type":   ITEM_FUNCTION,
+                    "values": []
+                },
+                "functionBlock": {
+                    "name":   FUNCTION_BLOCKS,
+                    "type":   ITEM_FUNCTIONBLOCK,
+                    "values": []
+                },
+                "program": {
+                    "name":   PROGRAMS,
+                    "type":   ITEM_PROGRAM,
+                    "values": []
+                }
+            }
             for pou in project.getpous():
                 pou_type = pou.getpouType()
                 pou_infos = {"name": pou.getname(), "type": ITEM_POU,
-                             "tagname": self.ComputePouName(pou.getname())}
+                             "tagname": ComputePouName(pou.getname())}
                 pou_values = []
                 if pou.getbodyType() == "SFC":
                     transitions = []
                     for transition in pou.gettransitionList():
-                        transitions.append({"name": transition.getname(), "type": ITEM_TRANSITION,
-                            "tagname": self.ComputePouTransitionName(pou.getname(), transition.getname()),
+                        transitions.append({
+                            "name": transition.getname(),
+                            "type": ITEM_TRANSITION,
+                            "tagname": ComputePouTransitionName(pou.getname(), transition.getname()),
                             "values": []})
                     pou_values.append({"name": TRANSITIONS, "type": ITEM_TRANSITIONS, "values": transitions})
                     actions = []
                     for action in pou.getactionList():
-                        actions.append({"name": action.getname(), "type": ITEM_ACTION,
-                            "tagname": self.ComputePouActionName(pou.getname(), action.getname()),
+                        actions.append({
+                            "name": action.getname(),
+                            "type": ITEM_ACTION,
+                            "tagname": ComputePouActionName(pou.getname(), action.getname()),
                             "values": []})
                     pou_values.append({"name": ACTIONS, "type": ITEM_ACTIONS, "values": actions})
                 if pou_type in pou_types:
@@ -700,14 +350,18 @@
             configurations = {"name": CONFIGURATIONS, "type": ITEM_CONFIGURATIONS, "values": []}
             for config in project.getconfigurations():
                 config_name = config.getname()
-                config_infos = {"name": config_name, "type": ITEM_CONFIGURATION,
-                    "tagname": self.ComputeConfigurationName(config.getname()),
+                config_infos = {
+                    "name": config_name,
+                    "type": ITEM_CONFIGURATION,
+                    "tagname": ComputeConfigurationName(config.getname()),
                     "values": []}
                 resources = {"name": RESOURCES, "type": ITEM_RESOURCES, "values": []}
                 for resource in config.getresource():
                     resource_name = resource.getname()
-                    resource_infos = {"name": resource_name, "type": ITEM_RESOURCE,
-                        "tagname": self.ComputeConfigurationResourceName(config.getname(), resource.getname()),
+                    resource_infos = {
+                        "name": resource_name,
+                        "type": ITEM_RESOURCE,
+                        "tagname": ComputeConfigurationResourceName(config.getname(), resource.getname()),
                         "values": []}
                     resources["values"].append(resource_infos)
                 config_infos["values"] = [resources]
@@ -717,22 +371,9 @@
             return infos
         return None
 
-    def GetPouVariables(self, tagname, debug = False):
-        pou_type = None
-        project = self.GetProject(debug)
-        if project is not None:
-            factory = VariablesTreeInfosFactory()
-
-            parser = etree.XMLParser()
-            parser.resolvers.add(LibraryResolver(self, debug))
-
-            pou_variable_xslt_tree = etree.XSLT(
-                etree.parse(
-                    os.path.join(ScriptDirectory, "plcopen", "pou_variables.xslt"),
-                    parser),
-                extensions = {("pou_vars_ns", name): getattr(factory, name)
-                              for name in ["SetRoot", "AddVariable"]})
-
+    def GetPouVariables(self, tagname, debug=False):
+        project = self.GetProject(debug)
+        if project is not None:
             obj = None
             words = tagname.split("::")
             if words[0] == "P":
@@ -740,33 +381,14 @@
             elif words[0] != "D":
                 obj = self.GetEditedElement(tagname, debug)
             if obj is not None:
-                pou_variable_xslt_tree(obj)
-                return factory.GetRoot()
-
-        return None
-
-    def GetInstanceList(self, root, name, debug = False):
-        instances = []
-        project = self.GetProject(debug)
-        if project is not None:
-            factory = InstancesPathFactory(instances)
-
-            parser = etree.XMLParser()
-            parser.resolvers.add(LibraryResolver(self, debug))
-
-            instances_path_xslt_tree = etree.XSLT(
-                etree.parse(
-                    os.path.join(ScriptDirectory, "plcopen", "instances_path.xslt"),
-                    parser),
-                extensions = {
-                    ("instances_ns", "AddInstance"): factory.AddInstance})
-
-            instances_path_xslt_tree(root,
-                instance_type=etree.XSLT.strparam(name))
-
-        return instances
-
-    def SearchPouInstances(self, tagname, debug = False):
+                return self.POUVariablesCollector.Collect(obj, debug)
+
+        return None
+
+    def GetInstanceList(self, root, name, debug=False):
+        return self.InstancesPathCollector.Collect(root, name, debug)
+
+    def SearchPouInstances(self, tagname, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             words = tagname.split("::")
@@ -779,31 +401,17 @@
             elif words[0] in ['T', 'A']:
                 return ["%s.%s" % (instance, words[2])
                         for instance in self.SearchPouInstances(
-                            self.ComputePouName(words[1]), debug)]
+                            ComputePouName(words[1]), debug)]
         return []
 
-    def GetPouInstanceTagName(self, instance_path, debug = False):
-        project = self.GetProject(debug)
-        factory = InstanceTagName(self)
-
-        parser = etree.XMLParser()
-        parser.resolvers.add(LibraryResolver(self, debug))
-
-        instance_tagname_xslt_tree = etree.XSLT(
-            etree.parse(
-                os.path.join(ScriptDirectory, "plcopen", "instance_tagname.xslt"),
-                parser),
-            extensions = {("instance_tagname_ns", name): getattr(factory, name)
-                          for name in ["ConfigTagName", "ResourceTagName",
-                                       "PouTagName", "ActionTagName",
-                                       "TransitionTagName"]})
-
-        instance_tagname_xslt_tree(project,
-            instance_path=etree.XSLT.strparam(instance_path))
-
-        return factory.GetTagName()
-
-    def GetInstanceInfos(self, instance_path, debug = False):
+    def GetPouInstanceTagName(self, instance_path, debug=False):
+        project = self.GetProject(debug)
+        if project is not None:
+            return self.InstanceTagnameCollector.Collect(project,
+                                                         debug,
+                                                         instance_path)
+
+    def GetInstanceInfos(self, instance_path, debug=False):
         tagname = self.GetPouInstanceTagName(instance_path)
         if tagname is not None:
             infos = self.GetPouVariables(tagname, debug)
@@ -820,21 +428,21 @@
         return None
 
     # Return if data type given by name is used by another data type or pou
-    def DataTypeIsUsed(self, name, debug = False):
+    def DataTypeIsUsed(self, name, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             return len(self.GetInstanceList(project, name, debug)) > 0
         return False
 
     # Return if pou given by name is used by another pou
-    def PouIsUsed(self, name, debug = False):
+    def PouIsUsed(self, name, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             return len(self.GetInstanceList(project, name, debug)) > 0
         return False
 
     # Return if pou given by name is directly or undirectly used by the reference pou
-    def PouIsUsedBy(self, name, reference, debug = False):
+    def PouIsUsedBy(self, name, reference, debug=False):
         pou_infos = self.GetPou(reference, debug)
         if pou_infos is not None:
             return len(self.GetInstanceList(pou_infos, name, debug)) > 0
@@ -854,8 +462,8 @@
                     programfile.close()
                     self.ProgramFilePath = filepath
                 return program_text, errors, warnings
-            except PLCGenException, e:
-                errors.append(e.message)
+            except PLCGenException as ex:
+                errors.append(str(ex))
         else:
             errors.append("No project opened")
         return "", errors, warnings
@@ -888,9 +496,9 @@
             row, col = next_row, next_col
         return infos
 
-#-------------------------------------------------------------------------------
-#                        Project Pous management functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                        Project Pous management functions
+    # -------------------------------------------------------------------------------
 
     # Add a Data Type to Project
     def ProjectAddDataType(self, datatype_name=None):
@@ -900,7 +508,7 @@
             # Add the datatype to project
             self.Project.appenddataType(datatype_name)
             self.BufferProject()
-            return self.ComputeDataTypeName(datatype_name)
+            return ComputeDataTypeName(datatype_name)
         return None
 
     # Remove a Data Type from project
@@ -917,7 +525,7 @@
             if pou_type == "function":
                 self.SetPouInterfaceReturnType(pou_name, "BOOL")
             self.BufferProject()
-            return self.ComputePouName(pou_name)
+            return ComputePouName(pou_name)
         return None
 
     def ProjectChangePouType(self, name, pou_type):
@@ -940,7 +548,7 @@
         '''
         try:
             new_pou, error = LoadPou(pou_xml)
-        except:
+        except Exception:
             error = ""
         if error is not None:
             return _("Couldn't paste non-POU object.")
@@ -967,7 +575,7 @@
             # programs cannot be pasted as functions or function blocks
             if orig_type == 'functionBlock' and pou_type == 'function' or \
                orig_type == 'program' and pou_type in ['function', 'functionBlock']:
-                msg = _('''{a1} "{a2}" can't be pasted as a {a3}.''').format(a1 = orig_type, a2 = name, a3 = pou_type)
+                msg = _('''{a1} "{a2}" can't be pasted as a {a3}.''').format(a1=orig_type, a2=name, a3=pou_type)
                 return msg
 
             new_pou.setpouType(pou_type)
@@ -975,7 +583,7 @@
         self.Project.insertpou(0, new_pou)
         self.BufferProject()
 
-        return self.ComputePouName(new_name),
+        return ComputePouName(new_name),
 
     # Remove a Pou from project
     def ProjectRemovePou(self, pou_name):
@@ -999,7 +607,7 @@
                 config_name = self.GenerateNewName(None, None, "configuration%d")
             self.Project.addconfiguration(config_name)
             self.BufferProject()
-            return self.ComputeConfigurationName(config_name)
+            return ComputeConfigurationName(config_name)
         return None
 
     # Remove a configuration from project
@@ -1015,7 +623,7 @@
                 resource_name = self.GenerateNewName(None, None, "resource%d")
             self.Project.addconfigurationResource(config_name, resource_name)
             self.BufferProject()
-            return self.ComputeConfigurationResourceName(config_name, resource_name)
+            return ComputeConfigurationResourceName(config_name, resource_name)
         return None
 
     # Remove a resource from a configuration of the project
@@ -1031,7 +639,7 @@
             if pou is not None:
                 pou.addtransition(transition_name, transition_type)
                 self.BufferProject()
-                return self.ComputePouTransitionName(pou_name, transition_name)
+                return ComputePouTransitionName(pou_name, transition_name)
         return None
 
     # Remove a Transition from a Project Pou
@@ -1050,7 +658,7 @@
             if pou is not None:
                 pou.addaction(action_name, action_type)
                 self.BufferProject()
-                return self.ComputePouActionName(pou_name, action_name)
+                return ComputePouActionName(pou_name, action_name)
         return None
 
     # Remove an Action from a Project Pou
@@ -1112,7 +720,7 @@
             # Found the pou action corresponding to old name and change its name to new name
             pou = self.Project.getpou(pou_name)
             if pou is not None:
-                for type, varlist in pou.getvars():
+                for _type, varlist in pou.getvars():
                     for var in varlist.getvariable():
                         if var.getname() == old_name:
                             var.setname(new_name)
@@ -1137,7 +745,7 @@
                 self.BufferProject()
 
     # Return the description of the pou given by its name
-    def GetPouDescription(self, name, debug = False):
+    def GetPouDescription(self, name, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             # Found the pou correponding to name and return its type
@@ -1147,7 +755,7 @@
         return ""
 
     # Return the description of the pou given by its name
-    def SetPouDescription(self, name, description, debug = False):
+    def SetPouDescription(self, name, description, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             # Found the pou correponding to name and return its type
@@ -1157,7 +765,7 @@
                 self.BufferProject()
 
     # Return the type of the pou given by its name
-    def GetPouType(self, name, debug = False):
+    def GetPouType(self, name, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             # Found the pou correponding to name and return its type
@@ -1167,7 +775,7 @@
         return None
 
     # Return pous with SFC language
-    def GetSFCPous(self, debug = False):
+    def GetSFCPous(self, debug=False):
         list = []
         project = self.GetProject(debug)
         if project is not None:
@@ -1177,7 +785,7 @@
         return list
 
     # Return the body language of the pou given by its name
-    def GetPouBodyType(self, name, debug = False):
+    def GetPouBodyType(self, name, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             # Found the pou correponding to name and return its body language
@@ -1187,7 +795,7 @@
         return None
 
     # Return the actions of a pou
-    def GetPouTransitions(self, pou_name, debug = False):
+    def GetPouTransitions(self, pou_name, debug=False):
         transitions = []
         project = self.GetProject(debug)
         if project is not None:
@@ -1199,7 +807,7 @@
         return transitions
 
     # Return the body language of the transition given by its name
-    def GetTransitionBodyType(self, pou_name, pou_transition, debug = False):
+    def GetTransitionBodyType(self, pou_name, pou_transition, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             # Found the pou correponding to name
@@ -1212,7 +820,7 @@
         return None
 
     # Return the actions of a pou
-    def GetPouActions(self, pou_name, debug = False):
+    def GetPouActions(self, pou_name, debug=False):
         actions = []
         project = self.GetProject(debug)
         if project is not None:
@@ -1224,7 +832,7 @@
         return actions
 
     # Return the body language of the pou given by its name
-    def GetActionBodyType(self, pou_name, pou_action, debug = False):
+    def GetActionBodyType(self, pou_name, pou_action, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             # Found the pou correponding to name and return its body language
@@ -1267,9 +875,9 @@
             tempvar.setname(var.Name)
 
             var_type = PLCOpenParser.CreateElement("type", "variable")
-            if isinstance(var.Type, TupleType):
+            if isinstance(var.Type, tuple):
                 if var.Type[0] == "array":
-                    array_type, base_type_name, dimensions = var.Type
+                    _array_type, base_type_name, dimensions = var.Type
                     array = PLCOpenParser.CreateElement("array", "dataType")
                     baseType = PLCOpenParser.CreateElement("baseType", "array")
                     array.setbaseType(baseType)
@@ -1321,26 +929,13 @@
 
     def GetVariableDictionary(self, object_with_vars, tree=False, debug=False):
         variables = []
-        factory = VariablesInfosFactory(variables)
-
-        parser = etree.XMLParser()
-        parser.resolvers.add(LibraryResolver(self, debug))
-
-        variables_infos_xslt_tree = etree.XSLT(
-            etree.parse(
-                os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"),
-                parser),
-            extensions = {("var_infos_ns", name): getattr(factory, name)
-                for name in ["SetType", "AddDimension", "AddTree",
-                             "AddVarToTree", "AddVariable"]})
-        variables_infos_xslt_tree(object_with_vars,
-            tree=etree.XSLT.strparam(str(tree)))
-
+        self.VariableInfoCollector.Collect(object_with_vars,
+                                           debug, variables, tree)
         return variables
 
     # Add a global var to configuration to configuration
     def AddConfigurationGlobalVar(self, config_name, var_type, var_name,
-                                           location="", description=""):
+                                  location="", description=""):
         if self.Project is not None:
             # Found the configuration corresponding to name
             configuration = self.Project.getconfiguration(config_name)
@@ -1358,11 +953,11 @@
             if configuration is not None:
                 # Set configuration global vars
                 configuration.setglobalVars([
-                    varlist for vartype, varlist
+                    varlist for _vartype, varlist
                     in self.ExtractVarLists(vars)])
 
     # Return the configuration globalvars
-    def GetConfigurationGlobalVars(self, name, debug = False):
+    def GetConfigurationGlobalVars(self, name, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             # Found the configuration corresponding to name
@@ -1374,7 +969,7 @@
         return []
 
     # Return configuration variable names
-    def GetConfigurationVariableNames(self, config_name = None, debug = False):
+    def GetConfigurationVariableNames(self, config_name=None, debug=False):
         variables = []
         project = self.GetProject(debug)
         if project is not None:
@@ -1382,7 +977,8 @@
                 if config_name is None or config_name == configuration.getname():
                     variables.extend(
                         [var.getname() for var in reduce(
-                            lambda x, y: x + y, [varlist.getvariable()
+                            lambda x, y: x + y, [
+                                varlist.getvariable()
                                 for varlist in configuration.globalVars],
                             [])])
         return variables
@@ -1395,11 +991,11 @@
             # Set resource global vars
             if resource is not None:
                 resource.setglobalVars([
-                    varlist for vartype, varlist
+                    varlist for _vartype, varlist
                     in self.ExtractVarLists(vars)])
 
     # Return the resource globalvars
-    def GetConfigurationResourceGlobalVars(self, config_name, name, debug = False):
+    def GetConfigurationResourceGlobalVars(self, config_name, name, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             # Found the resource corresponding to name
@@ -1411,8 +1007,8 @@
         return []
 
     # Return resource variable names
-    def GetConfigurationResourceVariableNames(self,
-                config_name = None, resource_name = None, debug = False):
+    def GetConfigurationResourceVariableNames(
+            self, config_name=None, resource_name=None, debug=False):
         variables = []
         project = self.GetProject(debug)
         if project is not None:
@@ -1422,13 +1018,14 @@
                         if resource_name is None or resource.getname() == resource_name:
                             variables.extend(
                                 [var.getname() for var in reduce(
-                                    lambda x, y: x + y, [varlist.getvariable()
+                                    lambda x, y: x + y, [
+                                        varlist.getvariable()
                                         for varlist in resource.globalVars],
                                     [])])
         return variables
 
     # Return the interface for the given pou
-    def GetPouInterfaceVars(self, pou, tree=False, debug = False):
+    def GetPouInterfaceVars(self, pou, tree=False, debug=False):
         interface = pou.interface
         # Verify that the pou has an interface
         if interface is not None:
@@ -1445,7 +1042,7 @@
                 if pou.interface is None:
                     pou.interface = PLCOpenParser.CreateElement("interface", "pou")
                 # Set Pou interface
-                pou.setvars([varlist for varlist_type, varlist in self.ExtractVarLists(vars)])
+                pou.setvars([varlist for _varlist_type, varlist in self.ExtractVarLists(vars)])
 
     # Replace the return type of the pou given by its name (only for functions)
     def SetPouInterfaceReturnType(self, name, return_type):
@@ -1486,20 +1083,8 @@
             # Return the return type if there is one
             return_type = pou.interface.getreturnType()
             if return_type is not None:
-                factory = VariablesInfosFactory([])
-
-                parser = etree.XMLParser()
-                parser.resolvers.add(LibraryResolver(self))
-
-                return_type_infos_xslt_tree = etree.XSLT(
-                    etree.parse(
-                        os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"),
-                        parser),
-                    extensions = {("var_infos_ns", name): getattr(factory, name)
-                                  for name in ["SetType", "AddDimension",
-                                               "AddTree", "AddVarToTree"]})
-                return_type_infos_xslt_tree(return_type,
-                    tree=etree.XSLT.strparam(str(tree)))
+                factory = self.VariableInfoCollector.Collect(return_type,
+                                                             debug, [], tree)
                 if tree:
                     return [factory.GetType(), factory.GetTree()]
                 return factory.GetType()
@@ -1514,11 +1099,11 @@
         addedcat = [{"name": _("%s POUs") % confnodetypes["name"],
                      "list": [pou.getblockInfos()
                               for pou in confnodetypes["types"].getpous()]}
-                     for confnodetypes in typeslist]
+                    for confnodetypes in typeslist]
         self.TotalTypes.extend(addedcat)
         for cat in addedcat:
             for desc in cat["list"]:
-                BlkLst = self.TotalTypesDict.setdefault(desc["name"],[])
+                BlkLst = self.TotalTypesDict.setdefault(desc["name"], [])
                 BlkLst.append((section["name"], desc))
 
     # Function that clear the confnode list
@@ -1527,12 +1112,12 @@
         self.TotalTypesDict = StdBlckDct.copy()
         self.TotalTypes = StdBlckLst[:]
 
-    def GetConfNodeDataTypes(self, exclude = None, only_locatables = False):
+    def GetConfNodeDataTypes(self, exclude=None, only_locatables=False):
         return [{"name": _("%s Data Types") % confnodetypes["name"],
                  "list": [
-                    datatype.getname()
-                    for datatype in confnodetypes["types"].getdataTypes()
-                    if not only_locatables or self.IsLocatableDataType(datatype, debug)]}
+                     datatype.getname()
+                     for datatype in confnodetypes["types"].getdataTypes()
+                     if not only_locatables or self.IsLocatableDataType(datatype)]}
                 for confnodetypes in self.ConfNodeTypes]
 
     def GetVariableLocationTree(self):
@@ -1568,15 +1153,15 @@
         return global_vars
 
     # Function that returns the block definition associated to the block type given
-    def GetBlockType(self, typename, inputs = None, debug = False):
-        result_blocktype = None
-        for sectioname, blocktype in self.TotalTypesDict.get(typename,[]):
+    def GetBlockType(self, typename, inputs=None, debug=False):
+        result_blocktype = {}
+        for _sectioname, blocktype in self.TotalTypesDict.get(typename, []):
             if inputs is not None and inputs != "undefined":
-                block_inputs = tuple([var_type for name, var_type, modifier in blocktype["inputs"]])
+                block_inputs = tuple([var_type for _name, var_type, _modifier in blocktype["inputs"]])
                 if reduce(lambda x, y: x and y, map(lambda x: x[0] == "ANY" or self.IsOfType(*x), zip(inputs, block_inputs)), True):
                     return blocktype
             else:
-                if result_blocktype is not None:
+                if result_blocktype:
                     if inputs == "undefined":
                         return None
                     else:
@@ -1584,7 +1169,7 @@
                         result_blocktype["outputs"] = [(o[0], "ANY", o[2]) for o in result_blocktype["outputs"]]
                         return result_blocktype
                 result_blocktype = blocktype.copy()
-        if result_blocktype is not None:
+        if result_blocktype:
             return result_blocktype
         project = self.GetProject(debug)
         if project is not None:
@@ -1595,20 +1180,19 @@
                     return blocktype_infos
 
                 if inputs == tuple([var_type
-                    for name, var_type, modifier in blocktype_infos["inputs"]]):
+                                    for _name, var_type, _modifier in blocktype_infos["inputs"]]):
                     return blocktype_infos
 
         return None
 
     # Return Block types checking for recursion
-    def GetBlockTypes(self, tagname = "", debug = False):
-        typename = None
+    def GetBlockTypes(self, tagname="", debug=False):
         words = tagname.split("::")
         name = None
         project = self.GetProject(debug)
         if project is not None:
             pou_type = None
-            if words[0] in ["P","T","A"]:
+            if words[0] in ["P", "T", "A"]:
                 name = words[1]
                 pou_type = self.GetPouType(name, debug)
             filter = (["function"]
@@ -1619,35 +1203,38 @@
                  "list": [block for block in category["list"]
                           if block["type"] in filter]}
                 for category in self.TotalTypes]
-            blocktypes.append({"name" : USER_DEFINED_POUS,
+            blocktypes.append({
+                "name": USER_DEFINED_POUS,
                 "list": [pou.getblockInfos()
                          for pou in project.getpous(name, filter)
                          if (name is None or
-                             len(self.GetInstanceList(pou, name, debug)) == 0)]})
+                             len(self.GetInstanceList(pou, name, debug)) == 0)]
+            })
             return blocktypes
         return self.TotalTypes
 
     # Return Function Block types checking for recursion
-    def GetFunctionBlockTypes(self, tagname = "", debug = False):
+    def GetFunctionBlockTypes(self, tagname="", debug=False):
         project = self.GetProject(debug)
         words = tagname.split("::")
         name = None
-        if project is not None and words[0] in ["P","T","A"]:
+        if project is not None and words[0] in ["P", "T", "A"]:
             name = words[1]
         blocktypes = []
         for blocks in self.TotalTypesDict.itervalues():
-            for sectioname,block in blocks:
+            for _sectioname, block in blocks:
                 if block["type"] == "functionBlock":
                     blocktypes.append(block["name"])
         if project is not None:
-            blocktypes.extend([pou.getname()
+            blocktypes.extend([
+                pou.getname()
                 for pou in project.getpous(name, ["functionBlock"])
                 if (name is None or
                     len(self.GetInstanceList(pou, name, debug)) == 0)])
         return blocktypes
 
     # Return Block types checking for recursion
-    def GetBlockResource(self, debug = False):
+    def GetBlockResource(self, debug=False):
         blocktypes = []
         for category in StdBlckLst[:-1]:
             for blocktype in category["list"]:
@@ -1661,7 +1248,7 @@
         return blocktypes
 
     # Return Data Types checking for recursion
-    def GetDataTypes(self, tagname = "", basetypes = True, confnodetypes = True, only_locatables = False, debug = False):
+    def GetDataTypes(self, tagname="", basetypes=True, confnodetypes=True, only_locatables=False, debug=False):
         if basetypes:
             datatypes = self.GetBaseTypes()
         else:
@@ -1675,16 +1262,15 @@
             datatypes.extend([
                 datatype.getname()
                 for datatype in project.getdataTypes(name)
-                if (not only_locatables or self.IsLocatableDataType(datatype, debug))
-                    and (name is None or
-                         len(self.GetInstanceList(datatype, name, debug)) == 0)])
+                if ((not only_locatables or self.IsLocatableDataType(datatype, debug)) and
+                    (name is None or len(self.GetInstanceList(datatype, name, debug)) == 0))])
         if confnodetypes:
             for category in self.GetConfNodeDataTypes(name, only_locatables):
                 datatypes.extend(category["list"])
         return datatypes
 
     # Return Data Type Object
-    def GetPou(self, typename, debug = False):
+    def GetPou(self, typename, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             result = project.getpou(typename)
@@ -1700,9 +1286,8 @@
                 return result
         return None
 
-
     # Return Data Type Object
-    def GetDataType(self, typename, debug = False):
+    def GetDataType(self, typename, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             result = project.getdataType(typename)
@@ -1725,11 +1310,10 @@
                     else basetype_type.upper())
         return (basetype_content.getname() if basetype_content_type == "derived"
                 else basetype_content_type.upper())
-        return None
 
     # Return Base Type of given possible derived type
-    def GetBaseType(self, typename, debug = False):
-        if TypeHierarchy.has_key(typename):
+    def GetBaseType(self, typename, debug=False):
+        if typename in TypeHierarchy:
             return typename
 
         datatype = self.GetDataType(typename, debug)
@@ -1747,9 +1331,9 @@
         TypeHierarchy_list has a rough order to it (e.g. SINT, INT, DINT, ...),
         which makes it easy for a user to find a type in a menu.
         '''
-        return [x for x,y in TypeHierarchy_list if not x.startswith("ANY")]
-
-    def IsOfType(self, typename, reference, debug = False):
+        return [x for x, _y in TypeHierarchy_list if not x.startswith("ANY")]
+
+    def IsOfType(self, typename, reference, debug=False):
         if reference is None or typename == reference:
             return True
 
@@ -1770,7 +1354,7 @@
             return not typename.startswith("ANY")
         return True
 
-    def IsLocatableDataType(self, datatype, debug = False):
+    def IsLocatableDataType(self, datatype, debug=False):
         basetype_content = datatype.baseType.getcontent()
         basetype_content_type = basetype_content.getLocalTag()
         if basetype_content_type in ["enum", "struct"]:
@@ -1783,8 +1367,12 @@
                 return self.IsLocatableType(array_base_type.getname(), debug)
         return True
 
-    def IsLocatableType(self, typename, debug = False):
-        if isinstance(typename, TupleType) or self.GetBlockType(typename) is not None:
+    def IsLocatableType(self, typename, debug=False):
+        if isinstance(typename, tuple) or self.GetBlockType(typename) is not None:
+            return False
+
+        # the size of these types is implementation dependend
+        if typename in ["TIME", "DATE", "DT", "TOD"]:
             return False
 
         datatype = self.GetDataType(typename, debug)
@@ -1792,8 +1380,8 @@
             return self.IsLocatableDataType(datatype)
         return True
 
-    def IsEnumeratedType(self, typename, debug = False):
-        if isinstance(typename, TupleType):
+    def IsEnumeratedType(self, typename, debug=False):
+        if isinstance(typename, tuple):
             typename = typename[1]
         datatype = self.GetDataType(typename, debug)
         if datatype is not None:
@@ -1804,10 +1392,10 @@
             return basetype_content_type == "enum"
         return False
 
-    def IsSubrangeType(self, typename, exclude=None, debug = False):
+    def IsSubrangeType(self, typename, exclude=None, debug=False):
         if typename == exclude:
             return False
-        if isinstance(typename, TupleType):
+        if isinstance(typename, tuple):
             typename = typename[1]
         datatype = self.GetDataType(typename, debug)
         if datatype is not None:
@@ -1820,11 +1408,11 @@
                     self.GetDataTypeBaseType(datatype), exclude)
         return False
 
-    def IsNumType(self, typename, debug = False):
+    def IsNumType(self, typename, debug=False):
         return self.IsOfType(typename, "ANY_NUM", debug) or\
                self.IsOfType(typename, "ANY_BIT", debug)
 
-    def GetDataTypeRange(self, typename, debug = False):
+    def GetDataTypeRange(self, typename, debug=False):
         range = DataTypeRange.get(typename)
         if range is not None:
             return range
@@ -1840,7 +1428,7 @@
         return None
 
     # Return Subrange types
-    def GetSubrangeBaseTypes(self, exclude, debug = False):
+    def GetSubrangeBaseTypes(self, exclude, debug=False):
         subrange_basetypes = DataTypeRange.keys()
         project = self.GetProject(debug)
         if project is not None:
@@ -1854,7 +1442,7 @@
         return subrange_basetypes
 
     # Return Enumerated Values
-    def GetEnumeratedDataValues(self, typename = None, debug = False):
+    def GetEnumeratedDataValues(self, typename=None, debug=False):
         values = []
         if typename is not None:
             datatype_obj = self.GetDataType(typename, debug)
@@ -1876,46 +1464,12 @@
                 values.extend(confnodetype["types"].GetEnumeratedDataTypeValues())
         return values
 
-#-------------------------------------------------------------------------------
-#                   Project Element tag name computation functions
-#-------------------------------------------------------------------------------
-
-    # Compute a data type name
-    def ComputeDataTypeName(self, datatype):
-        return "D::%s" % datatype
-
-    # Compute a pou name
-    def ComputePouName(self, pou):
-        return "P::%s" % pou
-
-    # Compute a pou transition name
-    def ComputePouTransitionName(self, pou, transition):
-        return "T::%s::%s" % (pou, transition)
-
-    # Compute a pou action name
-    def ComputePouActionName(self, pou, action):
-        return "A::%s::%s" % (pou, action)
-
-    # Compute a pou  name
-    def ComputeConfigurationName(self, config):
-        return "C::%s" % config
-
-    # Compute a pou  name
-    def ComputeConfigurationResourceName(self, config, resource):
-        return "R::%s::%s" % (config, resource)
-
-    def GetElementType(self, tagname):
-        words = tagname.split("::")
-        return {"D" : ITEM_DATATYPE, "P" : ITEM_POU,
-                "T" : ITEM_TRANSITION, "A" : ITEM_ACTION,
-                "C" : ITEM_CONFIGURATION, "R" : ITEM_RESOURCE}[words[0]]
-
-#-------------------------------------------------------------------------------
-#                    Project opened Data types management functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                    Project opened Data types management functions
+    # -------------------------------------------------------------------------------
 
     # Return the data type informations
-    def GetDataTypeInfos(self, tagname, debug = False):
+    def GetDataTypeInfos(self, tagname, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             words = tagname.split("::")
@@ -1933,8 +1487,8 @@
                     base_type = basetype_content.baseType.getcontent()
                     base_type_type = base_type.getLocalTag()
                     infos["base_type"] = (base_type.getname()
-                        if base_type_type == "derived"
-                        else base_type_type)
+                                          if base_type_type == "derived"
+                                          else base_type_type)
                 elif basetype_content_type == "enum":
                     infos["type"] = "Enumerated"
                     infos["values"] = []
@@ -1948,8 +1502,8 @@
                     base_type = basetype_content.baseType.getcontent()
                     base_type_type = base_type.getLocalTag()
                     infos["base_type"] = (base_type.getname()
-                        if base_type_type == "derived"
-                        else base_type_type.upper())
+                                          if base_type_type == "derived"
+                                          else base_type_type.upper())
                 elif basetype_content_type == "struct":
                     infos["type"] = "Structure"
                     infos["elements"] = []
@@ -1965,9 +1519,10 @@
                             base_type = element_type.baseType.getcontent()
                             base_type_type = base_type.getLocalTag()
                             element_infos["Type"] = ("array",
-                                base_type.getname()
-                                if base_type_type == "derived"
-                                else base_type_type.upper(), dimensions)
+                                                     base_type.getname()
+                                                     if base_type_type == "derived"
+                                                     else base_type_type.upper(),
+                                                     dimensions)
                         elif element_type_type == "derived":
                             element_infos["Type"] = element_type.getname()
                         else:
@@ -1980,8 +1535,8 @@
                 else:
                     infos["type"] = "Directly"
                     infos["base_type"] = (basetype_content.getname()
-                        if basetype_content_type == "derived"
-                        else basetype_content_type.upper())
+                                          if basetype_content_type == "derived"
+                                          else basetype_content_type.upper())
 
                 if datatype.initialValue is not None:
                     infos["initial"] = datatype.initialValue.getvalue()
@@ -2059,9 +1614,9 @@
                     element = PLCOpenParser.CreateElement("variable", "struct")
                     element.setname(element_infos["Name"])
                     element_type = PLCOpenParser.CreateElement("type", "variable")
-                    if isinstance(element_infos["Type"], TupleType):
+                    if isinstance(element_infos["Type"], tuple):
                         if element_infos["Type"][0] == "array":
-                            array_type, base_type_name, dimensions = element_infos["Type"]
+                            _array_type, base_type_name, dimensions = element_infos["Type"]
                             array = PLCOpenParser.CreateElement("array", "dataType")
                             baseType = PLCOpenParser.CreateElement("baseType", "array")
                             array.setbaseType(baseType)
@@ -2110,12 +1665,12 @@
                 datatype.initialValue = None
             self.BufferProject()
 
-#-------------------------------------------------------------------------------
-#                       Project opened Pous management functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                       Project opened Pous management functions
+    # -------------------------------------------------------------------------------
 
     # Return edited element
-    def GetEditedElement(self, tagname, debug = False):
+    def GetEditedElement(self, tagname, debug=False):
         project = self.GetProject(debug)
         if project is not None:
             words = tagname.split("::")
@@ -2139,21 +1694,21 @@
     # Return edited element name
     def GetEditedElementName(self, tagname):
         words = tagname.split("::")
-        if words[0] in ["P","C","D"]:
+        if words[0] in ["P", "C", "D"]:
             return words[1]
         else:
             return words[2]
         return None
 
     # Return edited element name and type
-    def GetEditedElementType(self, tagname, debug = False):
+    def GetEditedElementType(self, tagname, debug=False):
         words = tagname.split("::")
-        if words[0] in ["P","T","A"]:
+        if words[0] in ["P", "T", "A"]:
             return words[1], self.GetPouType(words[1], debug)
         return None, None
 
     # Return language in which edited element is written
-    def GetEditedElementBodyType(self, tagname, debug = False):
+    def GetEditedElementBodyType(self, tagname, debug=False):
         words = tagname.split("::")
         if words[0] == "P":
             return self.GetPouBodyType(words[1], debug)
@@ -2164,9 +1719,9 @@
         return None
 
     # Return the edited element variables
-    def GetEditedElementInterfaceVars(self, tagname, tree=False, debug = False):
+    def GetEditedElementInterfaceVars(self, tagname, tree=False, debug=False):
         words = tagname.split("::")
-        if words[0] in ["P","T","A"]:
+        if words[0] in ["P", "T", "A"]:
             project = self.GetProject(debug)
             if project is not None:
                 pou = project.getpou(words[1])
@@ -2175,7 +1730,7 @@
         return []
 
     # Return the edited element return type
-    def GetEditedElementInterfaceReturnType(self, tagname, tree=False, debug = False):
+    def GetEditedElementInterfaceReturnType(self, tagname, tree=False, debug=False):
         words = tagname.split("::")
         if words[0] == "P":
             project = self.GetProject(debug)
@@ -2195,14 +1750,14 @@
                 element.settext(text)
 
     # Return the edited element text
-    def GetEditedElementText(self, tagname, debug = False):
+    def GetEditedElementText(self, tagname, debug=False):
         element = self.GetEditedElement(tagname, debug)
         if element is not None:
             return element.gettext()
         return ""
 
     # Return the edited element transitions
-    def GetEditedElementTransitions(self, tagname, debug = False):
+    def GetEditedElementTransitions(self, tagname, debug=False):
         pou = self.GetEditedElement(tagname, debug)
         if pou is not None and pou.getbodyType() == "SFC":
             transitions = []
@@ -2212,7 +1767,7 @@
         return []
 
     # Return edited element transitions
-    def GetEditedElementActions(self, tagname, debug = False):
+    def GetEditedElementActions(self, tagname, debug=False):
         pou = self.GetEditedElement(tagname, debug)
         if pou is not None and pou.getbodyType() == "SFC":
             actions = []
@@ -2222,9 +1777,9 @@
         return []
 
     # Return the names of the pou elements
-    def GetEditedElementVariables(self, tagname, debug = False):
+    def GetEditedElementVariables(self, tagname, debug=False):
         words = tagname.split("::")
-        if words[0] in ["P","T","A"]:
+        if words[0] in ["P", "T", "A"]:
             return self.GetProjectPouVariableNames(words[1], debug)
         elif words[0] in ["C", "R"]:
             names = self.GetConfigurationVariableNames(words[1], debug)
@@ -2234,13 +1789,13 @@
             return names
         return []
 
-    def GetEditedElementCopy(self, tagname, debug = False):
+    def GetEditedElementCopy(self, tagname, debug=False):
         element = self.GetEditedElement(tagname, debug)
         if element is not None:
             return element.tostring()
         return ""
 
-    def GetEditedElementInstancesCopy(self, tagname, blocks_id = None, wires = None, debug = False):
+    def GetEditedElementInstancesCopy(self, tagname, blocks_id=None, wires=None, debug=False):
         element = self.GetEditedElement(tagname, debug)
         text = ""
         if element is not None:
@@ -2261,21 +1816,38 @@
             element.remove(copy_body)
         return text
 
-    def GenerateNewName(self, tagname, name, format, start_idx=0, exclude={}, debug=False):
-        names = exclude.copy()
+    def GenerateNewName(self, tagname, name, format, start_idx=0, exclude=None, debug=False):
+        if name is not None:
+            result = re.search(VARIABLE_NAME_SUFFIX_MODEL, name)
+            if result is not None:
+                format = name[:result.start(1)] + '%d'
+                start_idx = int(result.group(1))
+            else:
+                format = name + '%d'
+
+        names = {} if exclude is None else exclude.copy()
         if tagname is not None:
             names.update(dict([(varname.upper(), True)
                                for varname in self.GetEditedElementVariables(tagname, debug)]))
             words = tagname.split("::")
-            if words[0] in ["P","T","A"]:
+            if words[0] in ["P", "T", "A"]:
                 element = self.GetEditedElement(tagname, debug)
                 if element is not None and element.getbodyType() not in ["ST", "IL"]:
                     for instance in element.getinstances():
-                        if isinstance(instance,
-                            (PLCOpenParser.GetElementClass("step", "sfcObjects"),
-                             PLCOpenParser.GetElementClass("connector", "commonObjects"),
-                             PLCOpenParser.GetElementClass("continuation", "commonObjects"))):
+                        if isinstance(
+                                instance,
+                                (PLCOpenParser.GetElementClass("step",         "sfcObjects"),
+                                 PLCOpenParser.GetElementClass("connector",    "commonObjects"),
+                                 PLCOpenParser.GetElementClass("continuation", "commonObjects"))):
                             names[instance.getname().upper()] = True
+            elif words[0] == 'R':
+                element = self.GetEditedElement(tagname, debug)
+                for task in element.gettask():
+                    names[task.getname().upper()] = True
+                    for instance in task.getpouInstance():
+                        names[instance.getname().upper()] = True
+                for instance in element.getpouInstance():
+                    names[instance.getname().upper()] = True
         else:
             project = self.GetProject(debug)
             if project is not None:
@@ -2296,13 +1868,13 @@
 
         i = start_idx
         while name is None or names.get(name.upper(), False):
-            name = (format%i)
+            name = (format % i)
             i += 1
         return name
 
     def PasteEditedElementInstances(self, tagname, text, new_pos, middle=False, debug=False):
         element = self.GetEditedElement(tagname, debug)
-        element_name, element_type = self.GetEditedElementType(tagname, debug)
+        _element_name, element_type = self.GetEditedElementType(tagname, debug)
         if element is not None:
             bodytype = element.getbodyType()
 
@@ -2319,7 +1891,7 @@
 
             try:
                 instances, error = LoadPouInstances(text, bodytype)
-            except:
+            except Exception:
                 instances, error = [], ""
             if error is not None or len(instances) == 0:
                 return _("Invalid plcopen element(s)!!!")
@@ -2334,10 +1906,10 @@
                     blockname = instance.getinstanceName()
                     if blocktype_infos["type"] != "function" and blockname is not None:
                         if element_type == "function":
-                            return _("FunctionBlock \"%s\" can't be pasted in a Function!!!")%blocktype
+                            return _("FunctionBlock \"%s\" can't be pasted in a Function!!!") % blocktype
                         blockname = self.GenerateNewName(tagname,
                                                          blockname,
-                                                         "%s%%d"%blocktype,
+                                                         "%s%%d" % blocktype,
                                                          debug=debug)
                         exclude[blockname] = True
                         instance.setinstanceName(blockname)
@@ -2351,7 +1923,7 @@
                     exclude[stepname] = True
                     instance.setname(stepname)
                 localid = instance.getlocalId()
-                if not used_id.has_key(localid):
+                if localid not in used_id:
                     new_id[localid] = True
 
             idx = 1
@@ -2360,8 +1932,8 @@
             for instance in instances:
                 localId = instance.getlocalId()
                 bbox.union(instance.getBoundingBox())
-                if used_id.has_key(localId):
-                    while used_id.has_key(idx) or new_id.has_key(idx):
+                if localId in used_id:
+                    while (idx in used_id) or (idx in new_id):
                         idx += 1
                     new_id[idx] = True
                     instance.setlocalId(idx)
@@ -2369,8 +1941,8 @@
 
             x, y, width, height = bbox.bounding_box()
             if middle:
-                new_pos[0] -= width / 2
-                new_pos[1] -= height / 2
+                new_pos[0] -= width // 2
+                new_pos[1] -= height // 2
             else:
                 new_pos = map(lambda x: x + 30, new_pos)
             if scaling[0] != 0 and scaling[1] != 0:
@@ -2398,22 +1970,11 @@
 
             return new_id, connections
 
-    def GetEditedElementInstancesInfos(self, tagname, debug = False):
-        element_instances = OrderedDict()
+    def GetEditedElementInstancesInfos(self, tagname, debug=False):
         element = self.GetEditedElement(tagname, debug)
         if element is not None:
-            factory = BlockInstanceFactory(element_instances)
-
-            pou_block_instances_xslt_tree = etree.XSLT(
-                pou_block_instances_xslt,
-                extensions = {
-                    ("pou_block_instances_ns", name): getattr(factory, name)
-                    for name in ["AddBlockInstance", "SetSpecificValues",
-                                 "AddInstanceConnection", "AddConnectionLink",
-                                 "AddLinkPoint", "AddAction"]})
-
-            pou_block_instances_xslt_tree(element)
-        return element_instances
+            return self.BlockInstanceCollector.Collect(element, debug)
+        return {}
 
     def ClearEditedElementExecutionOrder(self, tagname):
         element = self.GetEditedElement(tagname)
@@ -2434,7 +1995,7 @@
                 result = wire.GetConnectedInfos(-1)
             else:
                 result = wire.GetConnectedInfos(0)
-            if result != None:
+            if result is not None:
                 refLocalId, formalParameter = result
                 connections = connection.getconnections()
                 if connections is None or len(connection.getconnections()) <= idx:
@@ -2459,7 +2020,7 @@
             var_type_obj.setcontent(derived_type)
         return var_type_obj
 
-    def AddEditedElementPouVar(self, tagname, var_type, name,**args):
+    def AddEditedElementPouVar(self, tagname, var_type, name, **args):
         if self.Project is not None:
             words = tagname.split("::")
             if words[0] in ['P', 'T', 'A']:
@@ -2494,7 +2055,7 @@
                 if pou is not None:
                     pou.removepouVar(type, name)
 
-    def AddEditedElementBlock(self, tagname, id, blocktype, blockname = None):
+    def AddEditedElementBlock(self, tagname, id, blocktype, blockname=None):
         element = self.GetEditedElement(tagname)
         if element is not None:
             block = PLCOpenParser.CreateElement("block", "fbdObjects")
@@ -2919,7 +2480,7 @@
                  SELECTION_CONVERGENCE: "selectionConvergence",
                  SIMULTANEOUS_DIVERGENCE: "simultaneousDivergence",
                  SIMULTANEOUS_CONVERGENCE: "simultaneousConvergence"}.get(
-                    divergence_type), "sfcObjects")
+                     divergence_type), "sfcObjects")
             divergence.setlocalId(id)
             element.addinstance(divergence)
 
@@ -3047,7 +2608,7 @@
                 self.RemoveEditedElementPouVar(tagname, instance.gettypeName(), instance.getinstanceName())
             element.removeinstance(id)
 
-    def GetEditedResourceVariables(self, tagname, debug = False):
+    def GetEditedResourceVariables(self, tagname, debug=False):
         varlist = []
         words = tagname.split("::")
         for var in self.GetConfigurationGlobalVars(words[1], debug):
@@ -3070,17 +2631,17 @@
                 new_task.setname(task["Name"])
                 if task["Triggering"] == "Interrupt":
                     new_task.setsingle(task["Single"])
-##                result = duration_model.match(task["Interval"]).groups()
-##                if reduce(lambda x, y: x or y != None, result):
-##                    values = []
-##                    for value in result[:-1]:
-##                        if value != None:
-##                            values.append(int(value))
-##                        else:
-##                            values.append(0)
-##                    if result[-1] is not None:
-##                        values.append(int(float(result[-1]) * 1000))
-##                    new_task.setinterval(datetime.time(*values))
+#                result = duration_model.match(task["Interval"]).groups()
+#                if reduce(lambda x, y: x or y != None, result):
+#                    values = []
+#                    for value in result[:-1]:
+#                        if value != None:
+#                            values.append(int(value))
+#                        else:
+#                            values.append(0)
+#                    if result[-1] is not None:
+#                        values.append(int(float(result[-1]) * 1000))
+#                    new_task.setinterval(datetime.time(*values))
                 if task["Triggering"] == "Cyclic":
                     new_task.setinterval(task["Interval"])
                 new_task.setpriority(int(task["Priority"]))
@@ -3097,7 +2658,7 @@
                 new_instance.setname(instance["Name"])
                 new_instance.settypeName(instance["Type"])
 
-    def GetEditedResourceInfos(self, tagname, debug = False):
+    def GetEditedResourceInfos(self, tagname, debug=False):
         resource = self.GetEditedElement(tagname, debug)
         if resource is not None:
             tasks = resource.gettask()
@@ -3114,19 +2675,19 @@
                     new_task["Single"] = ""
                 interval = task.getinterval()
                 if interval is not None:
-##                    text = ""
-##                    if interval.hour != 0:
-##                        text += "%dh"%interval.hour
-##                    if interval.minute != 0:
-##                        text += "%dm"%interval.minute
-##                    if interval.second != 0:
-##                        text += "%ds"%interval.second
-##                    if interval.microsecond != 0:
-##                        if interval.microsecond % 1000 != 0:
-##                            text += "%.3fms"%(float(interval.microsecond) / 1000)
-##                        else:
-##                            text += "%dms"%(interval.microsecond / 1000)
-##                    new_task["Interval"] = text
+                    # text = ""
+                    # if interval.hour != 0:
+                    #     text += "%dh"%interval.hour
+                    # if interval.minute != 0:
+                    #     text += "%dm"%interval.minute
+                    # if interval.second != 0:
+                    #     text += "%ds"%interval.second
+                    # if interval.microsecond != 0:
+                    #     if interval.microsecond % 1000 != 0:
+                    #         text += "%.3fms"%(float(interval.microsecond) / 1000)
+                    #     else:
+                    #         text += "%dms"%(interval.microsecond / 1000)
+                    # new_task["Interval"] = text
                     new_task["Interval"] = interval
                 else:
                     new_task["Interval"] = ""
@@ -3166,7 +2727,7 @@
         self.CurrentElementEditing = None
         return error
 
-    def SaveXMLFile(self, filepath = None):
+    def SaveXMLFile(self, filepath=None):
         if not filepath and self.FilePath == "":
             return False
         else:
@@ -3183,9 +2744,9 @@
                 self.SetFilePath(filepath)
             return True
 
-#-------------------------------------------------------------------------------
-#                       Search in Current Project Functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                       Search in Current Project Functions
+    # -------------------------------------------------------------------------------
 
     def SearchInProject(self, criteria):
         return self.Project.Search(criteria)
@@ -3203,14 +2764,12 @@
             return search_results
         return []
 
-#-------------------------------------------------------------------------------
-#                      Current Buffering Management Functions
-#-------------------------------------------------------------------------------
-
-    """
-    Return a copy of the project
-    """
+    # -------------------------------------------------------------------------------
+    #                      Current Buffering Management Functions
+    # -------------------------------------------------------------------------------
+
     def Copy(self, model):
+        """Return a copy of the project"""
         return deepcopy(model)
 
     def CreateProjectBuffer(self, saved):
--- a/PLCGenerator.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/PLCGenerator.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,21 +22,27 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+import re
+from functools import reduce
+from six.moves import xrange
+
 from plcopen import PLCOpenParser
 from plcopen.structures import *
-from types import *
-import re
+from plcopen.types_enums import *
+
 
 # Dictionary associating PLCOpen variable categories to the corresponding
 # IEC 61131-3 variable categories
-varTypeNames = {"localVars" : "VAR", "tempVars" : "VAR_TEMP", "inputVars" : "VAR_INPUT",
-                "outputVars" : "VAR_OUTPUT", "inOutVars" : "VAR_IN_OUT", "externalVars" : "VAR_EXTERNAL",
-                "globalVars" : "VAR_GLOBAL", "accessVars" : "VAR_ACCESS"}
+varTypeNames = {"localVars": "VAR", "tempVars": "VAR_TEMP", "inputVars": "VAR_INPUT",
+                "outputVars": "VAR_OUTPUT", "inOutVars": "VAR_IN_OUT", "externalVars": "VAR_EXTERNAL",
+                "globalVars": "VAR_GLOBAL", "accessVars": "VAR_ACCESS"}
 
 
 # Dictionary associating PLCOpen POU categories to the corresponding
 # IEC 61131-3 POU categories
-pouTypeNames = {"function" : "FUNCTION", "functionBlock" : "FUNCTION_BLOCK", "program" : "PROGRAM"}
+pouTypeNames = {"function": "FUNCTION", "functionBlock": "FUNCTION_BLOCK", "program": "PROGRAM"}
 
 
 errorVarTypes = {
@@ -45,8 +51,9 @@
     "VAR_INOUT": "var_inout",
 }
 
-# Helper function for reindenting text
+
 def ReIndentText(text, nb_spaces):
+    """ Helper function for reindenting text """
     compute = ""
     lines = text.splitlines()
     if len(lines) > 0:
@@ -58,15 +65,16 @@
             while lines[line_num][spaces] == " ":
                 spaces += 1
             indent = ""
-            for i in xrange(spaces, nb_spaces):
+            for dummy in xrange(spaces, nb_spaces):
                 indent += " "
             for line in lines:
                 if line != "":
-                    compute += "%s%s\n"%(indent, line)
+                    compute += "%s%s\n" % (indent, line)
                 else:
                     compute += "\n"
     return compute
 
+
 def SortInstances(a, b):
     ax, ay = int(a.getx()), int(a.gety())
     bx, by = int(b.getx()), int(b.gety())
@@ -75,28 +83,29 @@
     else:
         return cmp(ay, by)
 
-# Helper for emulate join on element list
+
 def JoinList(separator, mylist):
-    if len(mylist) > 0 :
+    """ Helper for emulate join on element list """
+    if len(mylist) > 0:
         return reduce(lambda x, y: x + separator + y, mylist)
-    else :
+    else:
         return mylist
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                  Specific exception for PLC generating errors
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 
 class PLCGenException(Exception):
     pass
 
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                           Generator of PLC program
-#-------------------------------------------------------------------------------
-
-
-class ProgramGenerator:
+# -------------------------------------------------------------------------------
+
+
+class ProgramGenerator(object):
 
     # Create a new PCL program generator
     def __init__(self, controler, project, errors, warnings):
@@ -114,9 +123,9 @@
     def ComputeValue(self, value, var_type):
         base_type = self.Controler.GetBaseType(var_type)
         if base_type == "STRING" and not value.startswith("'") and not value.endswith("'"):
-            return "'%s'"%value
+            return "'%s'" % value
         elif base_type == "WSTRING" and not value.startswith('"') and not value.endswith('"'):
-            return "\"%s\""%value
+            return "\"%s\"" % value
         return value
 
     # Generate a data type from its name
@@ -128,7 +137,7 @@
 
             # Getting datatype model from project
             datatype = self.Project.getdataType(datatype_name)
-            tagname = self.Controler.ComputeDataTypeName(datatype.getname())
+            tagname = ComputeDataTypeName(datatype.getname())
             datatype_def = [("  ", ()),
                             (datatype.getname(), (tagname, "name")),
                             (" : ", ())]
@@ -154,16 +163,16 @@
                 max_value = basetype_content.range.getupper()
                 datatype_def += [(basetype_name, (tagname, "base")),
                                  (" (", ()),
-                                 ("%s"%min_value, (tagname, "lower")),
+                                 ("%s" % min_value, (tagname, "lower")),
                                  ("..", ()),
-                                 ("%s"%max_value, (tagname, "upper")),
-                                 (")",())]
+                                 ("%s" % max_value, (tagname, "upper")),
+                                 (")", ())]
             # Data type is an enumerated type
             elif basetype_content_type == "enum":
                 values = [[(value.getname(), (tagname, "value", i))]
                           for i, value in enumerate(
                               basetype_content.xpath("ppx:values/ppx:value",
-                                  namespaces=PLCOpenParser.NSMAP))]
+                                                     namespaces=PLCOpenParser.NSMAP))]
                 datatype_def += [("(", ())]
                 datatype_def += JoinList([(", ", ())], values)
                 datatype_def += [(")", ())]
@@ -178,13 +187,13 @@
                 # Array derived directly from an elementary type
                 else:
                     basetype_name = base_type_type.upper()
-                dimensions = [[("%s"%dimension.getlower(), (tagname, "range", i, "lower")),
+                dimensions = [[("%s" % dimension.getlower(), (tagname, "range", i, "lower")),
                                ("..", ()),
-                               ("%s"%dimension.getupper(), (tagname, "range", i, "upper"))]
+                               ("%s" % dimension.getupper(), (tagname, "range", i, "upper"))]
                               for i, dimension in enumerate(basetype_content.getdimension())]
                 datatype_def += [("ARRAY [", ())]
                 datatype_def += JoinList([(",", ())], dimensions)
-                datatype_def += [("] OF " , ()),
+                datatype_def += [("] OF ", ()),
                                  (basetype_name, (tagname, "base"))]
             # Data type is a structure
             elif basetype_content_type == "struct":
@@ -245,24 +254,24 @@
             pou = self.Project.getpou(pou_name)
             pou_type = pou.getpouType()
             # Verify that POU type exists
-            if pouTypeNames.has_key(pou_type):
+            if pou_type in pouTypeNames:
                 # Create a POU program generator
                 pou_program = PouProgramGenerator(self, pou.getname(), pouTypeNames[pou_type], self.Errors, self.Warnings)
                 program = pou_program.GenerateProgram(pou)
                 self.Program += program
             else:
-                raise PLCGenException, _("Undefined pou type \"%s\"")%pou_type
+                raise PLCGenException(_("Undefined pou type \"%s\"") % pou_type)
 
     # Generate a POU defined and used in text
     def GeneratePouProgramInText(self, text):
         for pou_name in self.PouComputed.keys():
-            model = re.compile("(?:^|[^0-9^A-Z])%s(?:$|[^0-9^A-Z])"%pou_name.upper())
+            model = re.compile("(?:^|[^0-9^A-Z])%s(?:$|[^0-9^A-Z])" % pou_name.upper())
             if model.search(text) is not None:
                 self.GeneratePouProgram(pou_name)
 
     # Generate a configuration from its model
     def GenerateConfiguration(self, configuration):
-        tagname = self.Controler.ComputeConfigurationName(configuration.getname())
+        tagname = ComputeConfigurationName(configuration.getname())
         config = [("\nCONFIGURATION ", ()),
                   (configuration.getname(), (tagname, "name")),
                   ("\n", ())]
@@ -336,7 +345,7 @@
 
     # Generate a resource from its model
     def GenerateResource(self, resource, config_name):
-        tagname = self.Controler.ComputeConfigurationResourceName(config_name, resource.getname())
+        tagname = ComputeConfigurationResourceName(config_name, resource.getname())
         resrce = [("\n  RESOURCE ", ()),
                   (resource.getname(), (tagname, "name")),
                   (" ON PLC\n", ())]
@@ -389,16 +398,15 @@
             resrce += [("    TASK ", ()),
                        (task.getname(), (tagname, "task", task_number, "name")),
                        ("(", ())]
-            args = []
             single = task.getsingle()
             # Single argument if exists
             if single is not None:
                 if len(single) == 0:
-                    msg = _("Source signal has to be defined for single task '{a1}' in resource '{a2}.{a3}'.").\
-                          format(a1 = task.getname(), a2 = config_name, a3 = resource.getname())
-                    raise PLCGenException, msg
-
-                if single[0]=='[' and single[-1]==']' :
+                    raise PLCGenException(
+                        _("Source signal has to be defined for single task '{a1}' in resource '{a2}.{a3}'.").
+                        format(a1=task.getname(), a2=config_name, a3=resource.getname()))
+
+                if single[0] == '[' and single[-1] == ']':
                     SNGLKW = "MULTI"
                 else:
                     SNGLKW = "SINGLE"
@@ -411,19 +419,19 @@
                 resrce += [("INTERVAL := ", ()),
                            (interval, (tagname, "task", task_number, "interval")),
                            (",", ())]
-##                resrce += [("INTERVAL := t#", ())]
-##                if interval.hour != 0:
-##                    resrce += [("%dh"%interval.hour, (tagname, "task", task_number, "interval", "hour"))]
-##                if interval.minute != 0:
-##                    resrce += [("%dm"%interval.minute, (tagname, "task", task_number, "interval", "minute"))]
-##                if interval.second != 0:
-##                    resrce += [("%ds"%interval.second, (tagname, "task", task_number, "interval", "second"))]
-##                if interval.microsecond != 0:
-##                    resrce += [("%dms"%(interval.microsecond / 1000), (tagname, "task", task_number, "interval", "millisecond"))]
-##                resrce += [(",", ())]
+#                resrce += [("INTERVAL := t#", ())]
+#                if interval.hour != 0:
+#                    resrce += [("%dh"%interval.hour, (tagname, "task", task_number, "interval", "hour"))]
+#                if interval.minute != 0:
+#                    resrce += [("%dm"%interval.minute, (tagname, "task", task_number, "interval", "minute"))]
+#                if interval.second != 0:
+#                    resrce += [("%ds"%interval.second, (tagname, "task", task_number, "interval", "second"))]
+#                if interval.microsecond != 0:
+#                    resrce += [("%dms"%(interval.microsecond / 1000), (tagname, "task", task_number, "interval", "millisecond"))]
+#                resrce += [(",", ())]
             # Priority argument
             resrce += [("PRIORITY := ", ()),
-                       ("%d"%task.getpriority(), (tagname, "task", task_number, "priority")),
+                       ("%d" % task.getpriority(), (tagname, "task", task_number, "priority")),
                        (");\n", ())]
             task_number += 1
         instance_number = 0
@@ -441,10 +449,10 @@
         # Generate any program assign to no task
         for instance in resource.getpouInstance():
             resrce += [("    PROGRAM ", ()),
-                           (instance.getname(), (tagname, "instance", instance_number, "name")),
-                           (" : ", ()),
-                           (instance.gettypeName(), (tagname, "instance", instance_number, "type")),
-                           (";\n", ())]
+                       (instance.getname(),     (tagname, "instance", instance_number, "name")),
+                       (" : ", ()),
+                       (instance.gettypeName(), (tagname, "instance", instance_number, "type")),
+                       (";\n", ())]
             instance_number += 1
         resrce += [("  END_RESOURCE\n", ())]
         return resrce
@@ -477,9 +485,9 @@
         return self.Program
 
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                           Generator of POU programs
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 [ConnectorClass, ContinuationClass, ActionBlockClass] = [
     PLCOpenParser.GetElementClass(instance_name, "commonObjects")
@@ -493,14 +501,19 @@
 [StepClass, TransitionClass, JumpStepClass,
  SelectionConvergenceClass, SelectionDivergenceClass,
  SimultaneousConvergenceClass, SimultaneousDivergenceClass] = [
-    PLCOpenParser.GetElementClass(instance_name, "sfcObjects")
-    for instance_name in ["step", "transition", "jumpStep",
-        "selectionConvergence", "selectionDivergence",
-        "simultaneousConvergence", "simultaneousDivergence"]]
+     PLCOpenParser.GetElementClass(instance_name, "sfcObjects")
+     for instance_name in ["step",
+                           "transition",
+                           "jumpStep",
+                           "selectionConvergence",
+                           "selectionDivergence",
+                           "simultaneousConvergence",
+                           "simultaneousDivergence"]]
 TransitionObjClass = PLCOpenParser.GetElementClass("transition", "transitions")
 ActionObjClass = PLCOpenParser.GetElementClass("action", "actions")
 
-class PouProgramGenerator:
+
+class PouProgramGenerator(object):
 
     # Create a new POU program generator
     def __init__(self, parent, name, type, errors, warnings):
@@ -508,7 +521,7 @@
         self.ParentGenerator = parent
         self.Name = name
         self.Type = type
-        self.TagName = self.ParentGenerator.Controler.ComputePouName(name)
+        self.TagName = ComputePouName(name)
         self.CurrentIndent = "  "
         self.ReturnType = None
         self.Interface = []
@@ -517,7 +530,7 @@
         self.ComputedConnectors = {}
         self.ConnectionTypes = {}
         self.RelatedConnections = []
-        self.SFCNetworks = {"Steps":{}, "Transitions":{}, "Actions":{}}
+        self.SFCNetworks = {"Steps": {}, "Transitions": {}, "Actions": {}}
         self.SFCComputedBlocks = []
         self.ActionNumber = 0
         self.Program = []
@@ -541,8 +554,8 @@
 
     # Test if a variable has already been defined
     def IsAlreadyDefined(self, name):
-        for list_type, option, located, vars in self.Interface:
-            for var_type, var_name, var_address, var_initial in vars:
+        for _list_type, _option, _located, vars in self.Interface:
+            for _var_type, var_name, _var_address, _var_initial in vars:
                 if name == var_name:
                     return True
         return False
@@ -553,8 +566,8 @@
         current_type = None
         if len(parts) > 0:
             name = parts.pop(0)
-            for list_type, option, located, vars in self.Interface:
-                for var_type, var_name, var_address, var_initial in vars:
+            for _list_type, _option, _located, vars in self.Interface:
+                for var_type, var_name, _var_address, _var_initial in vars:
                     if name == var_name:
                         current_type = var_type
                         break
@@ -563,12 +576,12 @@
                 if blocktype is not None:
                     name = parts.pop(0)
                     current_type = None
-                    for var_name, var_type, var_modifier in blocktype["inputs"] + blocktype["outputs"]:
+                    for var_name, var_type, _var_modifier in blocktype["inputs"] + blocktype["outputs"]:
                         if var_name == name:
                             current_type = var_type
                             break
                 else:
-                    tagname = self.ParentGenerator.Controler.ComputeDataTypeName(current_type)
+                    tagname = ComputeDataTypeName(current_type)
                     infos = self.ParentGenerator.Controler.GetDataTypeInfos(tagname)
                     if infos is not None and infos["type"] == "Structure":
                         name = parts.pop(0)
@@ -590,7 +603,7 @@
         parameter = link.getformalParameter()
         instance = body.getcontentInstance(link.getrefLocalId())
         if isinstance(instance, (InVariableClass, InOutVariableClass,
-             ContinuationClass, ContactClass, CoilClass)):
+                                 ContinuationClass, ContactClass, CoilClass)):
             return instance.connectionPointOut
         elif isinstance(instance, BlockClass):
             outputvariables = instance.outputVariables.getvariable()
@@ -629,11 +642,6 @@
     def ComputeInterface(self, pou):
         interface = pou.getinterface()
         if interface is not None:
-            body = pou.getbody()
-            if isinstance(body, ListType):
-                body = body[0]
-            body_content = body.getcontent()
-            body_type = body_content.getLocalTag()
             if self.Type == "FUNCTION":
                 returntype_content = interface.getreturnType()[0]
                 returntype_content_type = returntype_content.getLocalTag()
@@ -691,17 +699,18 @@
                     self.Interface.append((varTypeNames[varlist_type], option, True, located))
 
     LITERAL_TYPES = {
-        "T": "TIME",
-        "D": "DATE",
+        "T":   "TIME",
+        "D":   "DATE",
         "TOD": "TIME_OF_DAY",
-        "DT": "DATE_AND_TIME",
-        "2": None,
-        "8": None,
-        "16": None,
+        "DT":  "DATE_AND_TIME",
+        "2":    None,
+        "8":    None,
+        "16":   None,
     }
+
     def ComputeConnectionTypes(self, pou):
         body = pou.getbody()
-        if isinstance(body, ListType):
+        if isinstance(body, list):
             body = body[0]
         body_content = body.getcontent()
         body_type = body_content.getLocalTag()
@@ -712,8 +721,7 @@
                                          InOutVariableClass)):
                     expression = instance.getexpression()
                     var_type = self.GetVariableType(expression)
-                    if (isinstance(pou, TransitionObjClass)
-                        and expression == pou.getname()):
+                    if isinstance(pou, TransitionObjClass) and expression == pou.getname():
                         var_type = "BOOL"
                     elif (not isinstance(pou, (TransitionObjClass, ActionObjClass)) and
                           pou.getpouType() == "function" and expression == pou.getname()):
@@ -740,7 +748,7 @@
                         if isinstance(instance, (OutVariableClass, InOutVariableClass)):
                             self.ConnectionTypes[instance.connectionPointIn] = var_type
                             connected = self.GetConnectedConnector(instance.connectionPointIn, body)
-                            if connected is not None and not self.ConnectionTypes.has_key(connected):
+                            if connected is not None and connected not in self.ConnectionTypes:
                                 for related in self.ExtractRelatedConnections(connected):
                                     self.ConnectionTypes[related] = var_type
                 elif isinstance(instance, (ContactClass, CoilClass)):
@@ -749,7 +757,7 @@
                     self.ConnectionTypes[instance.connectionPointIn] = "BOOL"
                     for link in instance.connectionPointIn.getconnections():
                         connected = self.GetLinkedConnector(link, body)
-                        if connected is not None and not self.ConnectionTypes.has_key(connected):
+                        if connected is not None and connected not in self.ConnectionTypes:
                             for related in self.ExtractRelatedConnections(connected):
                                 self.ConnectionTypes[related] = "BOOL"
                 elif isinstance(instance, LeftPowerRailClass):
@@ -761,7 +769,7 @@
                         self.ConnectionTypes[connection] = "BOOL"
                         for link in connection.getconnections():
                             connected = self.GetLinkedConnector(link, body)
-                            if connected is not None and not self.ConnectionTypes.has_key(connected):
+                            if connected is not None and connected not in self.ConnectionTypes:
                                 for related in self.ExtractRelatedConnections(connected):
                                     self.ConnectionTypes[related] = "BOOL"
                 elif isinstance(instance, TransitionClass):
@@ -770,10 +778,12 @@
                         self.ConnectionTypes[content["value"]] = "BOOL"
                         connections = content["value"].getconnections()
                         if not connections:
-                            raise PLCGenException, _("SFC transition in POU \"%s\" must be connected.") % self.Name
-                        for link in connections:                        
+                            raise PLCGenException(
+                                _("SFC transition in POU \"%s\" must be connected.") % self.Name)
+
+                        for link in connections:
                             connected = self.GetLinkedConnector(link, body)
-                            if connected is not None and not self.ConnectionTypes.has_key(connected):
+                            if connected is not None and connected not in self.ConnectionTypes:
                                 for related in self.ExtractRelatedConnections(connected):
                                     self.ConnectionTypes[related] = "BOOL"
                 elif isinstance(instance, ContinuationClass):
@@ -783,8 +793,9 @@
                     for element in body.getcontentInstances():
                         if isinstance(element, ConnectorClass) and element.getname() == name:
                             if connector is not None:
-                                msg = _("More than one connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU").format(a1 = name, a2 = self.Name)
-                                raise PLCGenException, msg
+                                raise PLCGenException(
+                                    _("More than one connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU").
+                                    format(a1=name, a2=self.Name))
                             connector = element
                     if connector is not None:
                         undefined = [instance.connectionPointOut, connector.connectionPointIn]
@@ -793,7 +804,7 @@
                             undefined.append(connected)
                         related = []
                         for connection in undefined:
-                            if self.ConnectionTypes.has_key(connection):
+                            if connection in self.ConnectionTypes:
                                 var_type = self.ConnectionTypes[connection]
                             else:
                                 related.extend(self.ExtractRelatedConnections(connection))
@@ -803,8 +814,10 @@
                             for connection in related:
                                 self.ConnectionTypes[connection] = var_type
                     else:
-                        msg = _("No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU").format(a1 = name, a2 = self.Name)
-                        raise PLCGenException, msg
+                        raise PLCGenException(
+                            _("No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU").
+                            format(a1=name, a2=self.Name))
+
                 elif isinstance(instance, BlockClass):
                     block_infos = self.GetBlockType(instance.gettypeName(), "undefined")
                     if block_infos is not None:
@@ -826,14 +839,15 @@
                 if block_infos is not None:
                     self.ComputeBlockInputTypes(instance, block_infos, body)
                 else:
-                    raise PLCGenException, _("No informations found for \"%s\" block")%(instance.gettypeName())
+                    raise PLCGenException(
+                        _("No informations found for \"%s\" block") % (instance.gettypeName()))
             if body_type == "SFC":
                 previous_tagname = self.TagName
                 for action in pou.getactionList():
-                    self.TagName = self.ParentGenerator.Controler.ComputePouActionName(self.Name, action.getname())
+                    self.TagName = ComputePouActionName(self.Name, action.getname())
                     self.ComputeConnectionTypes(action)
                 for transition in pou.gettransitionList():
-                    self.TagName = self.ParentGenerator.Controler.ComputePouTransitionName(self.Name, transition.getname())
+                    self.TagName = ComputePouTransitionName(self.Name, transition.getname())
                     self.ComputeConnectionTypes(transition)
                 self.TagName = previous_tagname
 
@@ -845,13 +859,13 @@
                 for connection in self.ExtractRelatedConnections(variable.connectionPointOut):
                     self.ConnectionTypes[connection] = "BOOL"
             else:
-                for oname, otype, oqualifier in block_infos["outputs"]:
+                for oname, otype, _oqualifier in block_infos["outputs"]:
                     if output_name == oname:
                         if otype.startswith("ANY"):
-                            if not undefined.has_key(otype):
+                            if otype not in undefined:
                                 undefined[otype] = []
                             undefined[otype].append(variable.connectionPointOut)
-                        elif not self.ConnectionTypes.has_key(variable.connectionPointOut):
+                        elif variable.connectionPointOut not in self.ConnectionTypes:
                             for connection in self.ExtractRelatedConnections(variable.connectionPointOut):
                                 self.ConnectionTypes[connection] = otype
         for variable in instance.inputVariables.getvariable():
@@ -860,18 +874,18 @@
                 for connection in self.ExtractRelatedConnections(variable.connectionPointIn):
                     self.ConnectionTypes[connection] = "BOOL"
             else:
-                for iname, itype, iqualifier in block_infos["inputs"]:
+                for iname, itype, _iqualifier in block_infos["inputs"]:
                     if input_name == iname:
                         connected = self.GetConnectedConnector(variable.connectionPointIn, body)
                         if itype.startswith("ANY"):
-                            if not undefined.has_key(itype):
+                            if itype not in undefined:
                                 undefined[itype] = []
                             undefined[itype].append(variable.connectionPointIn)
                             if connected is not None:
                                 undefined[itype].append(connected)
                         else:
                             self.ConnectionTypes[variable.connectionPointIn] = itype
-                            if connected is not None and not self.ConnectionTypes.has_key(connected):
+                            if connected is not None and connected not in self.ConnectionTypes:
                                 for connection in self.ExtractRelatedConnections(connected):
                                     self.ConnectionTypes[connection] = itype
         for var_type, connections in undefined.items():
@@ -888,17 +902,56 @@
                 for connection in related:
                     self.ConnectionTypes[connection] = var_type
 
+    def GetUsedEno(self, body, connections):
+        """
+            Function checks whether value on given connection
+            comes from block, that has used EN input and
+            returns variable name for ENO output.
+
+            This is needed to avoid value propagation from blocks
+            with false signal on EN input.
+
+        :param body:
+            body of the block for that program is currently generated
+        :param connections:
+            connection, that's source is checked for EN/ENO usage
+        :return:
+            if EN/ENO are not used, then None is returned
+            Otherwise BOOL variable corresponding to ENO
+            output is returned.
+        """
+
+        if len(connections) != 1:
+            return None
+        ref_local_id = connections[0].getrefLocalId()
+        blk = body.getcontentInstance(ref_local_id)
+        if blk is None:
+            return None
+
+        if not hasattr(blk, "inputVariables"):
+            return None
+
+        for invar in blk.inputVariables.getvariable():
+            if invar.getformalParameter() == "EN":
+                if len(invar.getconnectionPointIn().getconnections()) > 0:
+                    if blk.getinstanceName() is None:
+                        var_name = "%s%d_ENO" % (blk.gettypeName(), blk.getlocalId())
+                    else:
+                        var_name = "%s.ENO" % blk.getinstanceName()
+                    return var_name
+        return None
+
     def ComputeProgram(self, pou):
         body = pou.getbody()
-        if isinstance(body, ListType):
+        if isinstance(body, list):
             body = body[0]
         body_content = body.getcontent()
         body_type = body_content.getLocalTag()
-        if body_type in ["IL","ST"]:
+        if body_type in ["IL", "ST"]:
             text = body_content.getanyText()
             self.ParentGenerator.GeneratePouProgramInText(text.upper())
             self.Program = [(ReIndentText(text, len(self.CurrentIndent)),
-                            (self.TagName, "body", len(self.CurrentIndent)))]
+                             (self.TagName, "body", len(self.CurrentIndent)))]
         elif body_type == "SFC":
             self.IndentRight()
             for instance in body.getcontentInstances():
@@ -912,7 +965,7 @@
                     self.GenerateSFCJump(instance, pou)
             if len(self.InitialSteps) > 0 and len(self.SFCComputedBlocks) > 0:
                 action_name = "COMPUTE_FUNCTION_BLOCKS"
-                action_infos = {"qualifier" : "S", "content" : action_name}
+                action_infos = {"qualifier": "S", "content": action_name}
                 self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos)
                 self.SFCNetworks["Actions"][action_name] = (self.SFCComputedBlocks, ())
                 self.Program = []
@@ -920,7 +973,7 @@
             for initialstep in self.InitialSteps:
                 self.ComputeSFCStep(initialstep)
         else:
-            otherInstances = {"outVariables&coils" : [], "blocks" : [], "connectors" : []}
+            otherInstances = {"outVariables&coils": [], "blocks": [], "connectors": []}
             orderedInstances = []
             for instance in body.getcontentInstances():
                 if isinstance(instance, (OutVariableClass, InOutVariableClass, BlockClass)):
@@ -946,11 +999,21 @@
                     if connections is not None:
                         expression = self.ComputeExpression(body, connections)
                         if expression is not None:
+                            eno_var = self.GetUsedEno(body, connections)
+                            if eno_var is not None:
+                                self.Program += [(self.CurrentIndent + "IF %s" % eno_var, ())]
+                                self.Program += [(" THEN\n  ", ())]
+                                self.IndentRight()
+
                             self.Program += [(self.CurrentIndent, ()),
                                              (instance.getexpression(), (self.TagName, "io_variable", instance.getlocalId(), "expression")),
                                              (" := ", ())]
                             self.Program += expression
                             self.Program += [(";\n", ())]
+
+                            if eno_var is not None:
+                                self.IndentLeft()
+                                self.Program += [(self.CurrentIndent + "END_IF;\n", ())]
                 elif isinstance(instance, BlockClass):
                     block_type = instance.gettypeName()
                     self.ParentGenerator.GeneratePouProgram(block_type)
@@ -958,11 +1021,13 @@
                     if block_infos is None:
                         block_infos = self.GetBlockType(block_type)
                     if block_infos is None:
-                        raise PLCGenException, _("Undefined block type \"{a1}\" in \"{a2}\" POU").format(a1 = block_type, a2 = self.Name)
+                        raise PLCGenException(
+                            _("Undefined block type \"{a1}\" in \"{a2}\" POU").
+                            format(a1=block_type, a2=self.Name))
                     try:
                         self.GenerateBlock(instance, block_infos, body, None)
-                    except ValueError, e:
-                        raise PLCGenException, e.message
+                    except ValueError as e:
+                        raise PLCGenException(str(e))
                 elif isinstance(instance, ConnectorClass):
                     connector = instance.getname()
                     if self.ComputedConnectors.get(connector, None):
@@ -986,7 +1051,7 @@
         uncomputed_index = range(len(paths))
         factorized_paths = []
         for num, path in enumerate(paths):
-            if type(path) == ListType:
+            if isinstance(path, list):
                 if len(path) > 1:
                     str_path = str(path[-1:])
                     same_paths.setdefault(str_path, [])
@@ -1009,7 +1074,23 @@
         return factorized_paths
 
     def GenerateBlock(self, block, block_infos, body, link, order=False, to_inout=False):
-        body_type = body.getcontent().getLocalTag()
+
+        def _GetBlockName(name, type):
+            """function returns name of function or function block instance"""
+            if name:
+                # function blocks
+                blockname = "{a1}({a2})".format(a1=name, a2=type)
+            else:
+                # functions
+                blockname = type
+            return blockname
+
+        def _RaiseUnconnectedInOutError(name, type, parameter, place):
+            blockname = _GetBlockName(name, type)
+            raise ValueError(
+                _("InOut variable {a1} in block {a2} in POU {a3} must be connected.").
+                format(a1=parameter, a2=blockname, a3=place))
+
         name = block.getinstanceName()
         type = block.gettypeName()
         executionOrderId = block.getexecutionOrderId()
@@ -1031,7 +1112,7 @@
                                            [(input_name, None) for input_name in input_names])
                     for variable in input_variables:
                         parameter = variable.getformalParameter()
-                        if input_connected.has_key(parameter):
+                        if parameter in input_connected:
                             input_connected[parameter] = variable
                     if input_connected["EN"] is None:
                         input_connected.pop("EN")
@@ -1053,10 +1134,12 @@
                         if connections is not None:
                             if parameter != "EN":
                                 one_input_connected = True
-                            if inout_variables.has_key(parameter):
+                            if parameter in inout_variables:
                                 expression = self.ComputeExpression(body, connections, executionOrderId > 0, True)
                                 if expression is not None:
-                                    inout_variables[parameter] = value
+                                    inout_variables[parameter] = expression
+                                else:
+                                    _RaiseUnconnectedInOutError(name, type, parameter, self.Name)
                             else:
                                 expression = self.ComputeExpression(body, connections, executionOrderId > 0)
                             if expression is not None:
@@ -1073,11 +1156,11 @@
                 if one_input_connected:
                     for i, variable in enumerate(output_variables):
                         parameter = variable.getformalParameter()
-                        if not inout_variables.has_key(parameter) and parameter in output_names + ["", "ENO"]:
+                        if parameter not in inout_variables and parameter in output_names + ["", "ENO"]:
                             if variable.getformalParameter() == "":
-                                variable_name = "%s%d"%(type, block.getlocalId())
+                                variable_name = "%s%d" % (type, block.getlocalId())
                             else:
-                                variable_name = "%s%d_%s"%(type, block.getlocalId(), parameter)
+                                variable_name = "%s%d_%s" % (type, block.getlocalId(), parameter)
                             if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]:
                                 self.Interface.append(("VAR", None, False, []))
                             if variable.connectionPointOut in self.ConnectionTypes:
@@ -1086,7 +1169,7 @@
                                 self.Interface[-1][3].append(("ANY", variable_name, None, None))
                             if len(output_variables) > 1 and parameter not in ["", "OUT"]:
                                 vars.append([(parameter, (self.TagName, "block", block.getlocalId(), "output", i)),
-                                             (" => %s"%variable_name, ())])
+                                             (" => %s" % variable_name, ())])
                             else:
                                 output_info = (self.TagName, "block", block.getlocalId(), "output", i)
                                 output_name = variable_name
@@ -1098,7 +1181,7 @@
                     self.Program += JoinList([(", ", ())], vars)
                     self.Program += [(");\n", ())]
                 else:
-                    msg = _("\"{a1}\" function cancelled in \"{a2}\" POU: No input connected").format(a1 = type, a2 = self.TagName.split("::")[-1])
+                    msg = _("\"{a1}\" function cancelled in \"{a2}\" POU: No input connected").format(a1=type, a2=self.TagName.split("::")[-1])
                     self.Warnings.append(msg)
         elif block_infos["type"] == "functionBlock":
             if not self.ComputedBlocks.get(block, False) and not order:
@@ -1116,10 +1199,12 @@
                         input_info = (self.TagName, "block", block.getlocalId(), "input", input_idx)
                         connections = variable.connectionPointIn.getconnections()
                         if connections is not None:
-                            expression = self.ComputeExpression(body, connections, executionOrderId > 0, inout_variables.has_key(parameter))
+                            expression = self.ComputeExpression(body, connections, executionOrderId > 0, parameter in inout_variables)
                             if expression is not None:
                                 vars.append([(parameter, input_info),
                                              (" := ", ())] + self.ExtractModifier(variable, expression, input_info))
+                            elif parameter in inout_variables:
+                                _RaiseUnconnectedInOutError(name, type, parameter, self.Name)
                 self.Program += [(self.CurrentIndent, ()),
                                  (name, (self.TagName, "block", block.getlocalId(), "name")),
                                  ("(", ())]
@@ -1145,9 +1230,9 @@
         else:
             for i, variable in enumerate(output_variables):
                 blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY()
-                if (connectionPoint is None or
-                    block.getx() + blockPointx == connectionPoint.getx() and
-                    block.gety() + blockPointy == connectionPoint.gety()):
+                if connectionPoint is None or \
+                   block.getx() + blockPointx == connectionPoint.getx() and \
+                   block.gety() + blockPointy == connectionPoint.gety():
                     output_variable = variable
                     output_parameter = variable.getformalParameter()
                     output_idx = i
@@ -1155,21 +1240,27 @@
         if output_variable is not None:
             if block_infos["type"] == "function":
                 output_info = (self.TagName, "block", block.getlocalId(), "output", output_idx)
-                if inout_variables.has_key(output_parameter):
-                    output_value = inout_variables[output_parameter]
+                if output_parameter in inout_variables:
+                    for variable in input_variables:
+                        if variable.getformalParameter() == output_parameter:
+                            connections = variable.connectionPointIn.getconnections()
+                            if connections is not None:
+                                expression = self.ComputeExpression(
+                                    body, connections, executionOrderId > 0, True)
+                                output_value = expression
+                                break
                 else:
                     if output_parameter == "":
-                        output_name = "%s%d"%(type, block.getlocalId())
+                        output_name = "%s%d" % (type, block.getlocalId())
                     else:
-                        output_name = "%s%d_%s"%(type, block.getlocalId(), output_parameter)
+                        output_name = "%s%d_%s" % (type, block.getlocalId(), output_parameter)
                     output_value = [(output_name, output_info)]
                 return self.ExtractModifier(output_variable, output_value, output_info)
-
             if block_infos["type"] == "functionBlock":
                 output_info = (self.TagName, "block", block.getlocalId(), "output", output_idx)
-                output_name = self.ExtractModifier(output_variable, [("%s.%s"%(name, output_parameter), output_info)], output_info)
+                output_name = self.ExtractModifier(output_variable, [("%s.%s" % (name, output_parameter), output_info)], output_info)
                 if to_inout:
-                    variable_name = "%s_%s"%(name, output_parameter)
+                    variable_name = "%s_%s" % (name, output_parameter)
                     if not self.IsAlreadyDefined(variable_name):
                         if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]:
                             self.Interface.append(("VAR", None, False, []))
@@ -1179,7 +1270,7 @@
                         else:
                             self.Interface[-1][3].append(("ANY", variable_name, None, None))
                         self.Program += [(self.CurrentIndent, ()),
-                                         ("%s := "%variable_name, ())]
+                                         ("%s := " % variable_name, ())]
                         self.Program += output_name
                         self.Program += [(";\n", ())]
                     return [(variable_name, ())]
@@ -1187,15 +1278,12 @@
         if link is not None:
             if output_parameter is None:
                 output_parameter = ""
-            if name:
-                blockname = "{a1}({a2})".format(a1 = name, a2 = type)
-            else:
-                blockname = type
-            msg = _("No output {a1} variable found in block {a2} in POU {a3}. Connection must be broken").\
-                              format(a1 = output_parameter, a2 = blockname, a3 = self.Name)
-            raise ValueError, msg
-
-    def GeneratePaths(self, connections, body, order = False, to_inout = False):
+            blockname = _GetBlockName(name, type)
+            raise ValueError(
+                _("No output {a1} variable found in block {a2} in POU {a3}. Connection must be broken").
+                format(a1=output_parameter, a2=blockname, a3=self.Name))
+
+    def GeneratePaths(self, connections, body, order=False, to_inout=False):
         paths = []
         for connection in connections:
             localId = connection.getrefLocalId()
@@ -1211,24 +1299,26 @@
                 if block_infos is None:
                     block_infos = self.GetBlockType(block_type)
                 if block_infos is None:
-                    msg = _("Undefined block type \"{a1}\" in \"{a2}\" POU").format(a1 = block_type, a2 = self.Name)
-                    raise PLCGenException, msg
+                    raise PLCGenException(
+                        _("Undefined block type \"{a1}\" in \"{a2}\" POU").
+                        format(a1=block_type, a2=self.Name))
                 try:
                     paths.append(str(self.GenerateBlock(next, block_infos, body, connection, order, to_inout)))
-                except ValueError, e:
-                    raise PLCGenException, e.message
+                except ValueError as e:
+                    raise PLCGenException(str(e))
             elif isinstance(next, ContinuationClass):
                 name = next.getname()
                 computed_value = self.ComputedConnectors.get(name, None)
-                if computed_value != None:
+                if computed_value is not None:
                     paths.append(str(computed_value))
                 else:
                     connector = None
                     for instance in body.getcontentInstances():
                         if isinstance(instance, ConnectorClass) and instance.getname() == name:
                             if connector is not None:
-                                msg = _("More than one connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU").format(a1 = name, a2 = self.Name)
-                                raise PLCGenException, msg
+                                raise PLCGenException(
+                                    _("More than one connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU").
+                                    format(a1=name, a2=self.Name))
                             connector = instance
                     if connector is not None:
                         connections = connector.connectionPointIn.getconnections()
@@ -1238,8 +1328,9 @@
                                 self.ComputedConnectors[name] = expression
                                 paths.append(str(expression))
                     else:
-                        msg = _("No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU").format(a1 = name, a2 = self.Name)
-                        raise PLCGenException, msg
+                        raise PLCGenException(
+                            _("No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU").
+                            format(a1=name, a2=self.Name))
             elif isinstance(next, ContactClass):
                 contact_info = (self.TagName, "contact", next.getlocalId())
                 variable = str(self.ExtractModifier(next, [(next.getvariable(), contact_info + ("reference",))], contact_info))
@@ -1250,18 +1341,18 @@
                         paths.append([variable, tuple(factorized_paths)])
                     else:
                         paths.append([variable] + factorized_paths)
-                elif type(result[0]) == ListType:
+                elif isinstance(result[0], list):
                     paths.append([variable] + result[0])
                 elif result[0] is not None:
                     paths.append([variable, result[0]])
                 else:
                     paths.append(variable)
             elif isinstance(next, CoilClass):
-                paths.append(str(self.GeneratePaths(next.connectionPointIn.getconnections(), body, order)))
+                paths.append(self.GeneratePaths(next.connectionPointIn.getconnections(), body, order))
         return paths
 
-    def ComputePaths(self, paths, first = False):
-        if type(paths) == TupleType:
+    def ComputePaths(self, paths, first=False):
+        if isinstance(paths, tuple):
             if None in paths:
                 return [("TRUE", ())]
             else:
@@ -1270,7 +1361,7 @@
                     return JoinList([(" OR ", ())], vars)
                 else:
                     return [("(", ())] + JoinList([(" OR ", ())], vars) + [(")", ())]
-        elif type(paths) == ListType:
+        elif isinstance(paths, list):
             vars = [self.ComputePaths(path) for path in paths]
             return JoinList([(" AND ", ())], vars)
         elif paths is None:
@@ -1278,7 +1369,7 @@
         else:
             return eval(paths)
 
-    def ComputeExpression(self, body, connections, order = False, to_inout = False):
+    def ComputeExpression(self, body, connections, order=False, to_inout=False):
         paths = self.GeneratePaths(connections, body, order, to_inout)
         if len(paths) == 0:
             return None
@@ -1315,15 +1406,15 @@
         if self.Interface[-1][0] != "VAR" or self.Interface[-1][1] is not None or self.Interface[-1][2]:
             self.Interface.append(("VAR", None, False, []))
         i = 1
-        name = "%s%d"%(edge, i)
+        name = "%s%d" % (edge, i)
         while self.IsAlreadyDefined(name):
             i += 1
-            name = "%s%d"%(edge, i)
+            name = "%s%d" % (edge, i)
         self.Interface[-1][3].append((edge, name, None, None))
         self.Program += [(self.CurrentIndent, ()), (name, var_info), ("(CLK := ", ())]
         self.Program += expression
         self.Program += [(");\n", ())]
-        return [("%s.Q"%name, var_info)]
+        return [("%s.Q" % name, var_info)]
 
     def ExtractDivergenceInput(self, divergence, pou):
         connectionPointIn = divergence.getconnectionPointIn()
@@ -1332,7 +1423,7 @@
             if connections is not None and len(connections) == 1:
                 instanceLocalId = connections[0].getrefLocalId()
                 body = pou.getbody()
-                if isinstance(body, ListType):
+                if isinstance(body, list):
                     body = body[0]
                 return body.getcontentInstance(instanceLocalId)
         return None
@@ -1344,7 +1435,7 @@
             if connections is not None and len(connections) == 1:
                 instanceLocalId = connections[0].getrefLocalId()
                 body = pou.getbody()
-                if isinstance(body, ListType):
+                if isinstance(body, list):
                     body = body[0]
                 instances.append(body.getcontentInstance(instanceLocalId))
         return instances
@@ -1354,10 +1445,10 @@
         if step_name not in self.SFCNetworks["Steps"].keys():
             if step.getinitialStep():
                 self.InitialSteps.append(step_name)
-            step_infos = {"id" : step.getlocalId(),
-                          "initial" : step.getinitialStep(),
-                          "transitions" : [],
-                          "actions" : []}
+            step_infos = {"id":          step.getlocalId(),
+                          "initial":     step.getinitialStep(),
+                          "transitions": [],
+                          "actions":     []}
             self.SFCNetworks["Steps"][step_name] = step_infos
             if step.connectionPointIn is not None:
                 instances = []
@@ -1365,7 +1456,7 @@
                 if connections is not None and len(connections) == 1:
                     instanceLocalId = connections[0].getrefLocalId()
                     body = pou.getbody()
-                    if isinstance(body, ListType):
+                    if isinstance(body, list):
                         body = body[0]
                     instance = body.getcontentInstance(instanceLocalId)
                     if isinstance(instance, TransitionClass):
@@ -1389,15 +1480,17 @@
         jump_target = jump.gettargetName()
         if not pou.hasstep(jump_target):
             pname = pou.getname()
-            msg = _("SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\"").format( a1 = pname, a2 = jump_target)
-            raise PLCGenException, msg
+            raise PLCGenException(
+                _("SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\"").
+                format(a1=pname, a2=jump_target))
+
         if jump.connectionPointIn is not None:
             instances = []
             connections = jump.connectionPointIn.getconnections()
             if connections is not None and len(connections) == 1:
                 instanceLocalId = connections[0].getrefLocalId()
                 body = pou.getbody()
-                if isinstance(body, ListType):
+                if isinstance(body, list):
                     body = body[0]
                 instance = body.getcontentInstance(instanceLocalId)
                 if isinstance(instance, TransitionClass):
@@ -1422,7 +1515,7 @@
         if connections is not None and len(connections) == 1:
             stepLocalId = connections[0].getrefLocalId()
             body = pou.getbody()
-            if isinstance(body, ListType):
+            if isinstance(body, list):
                 body = body[0]
             step = body.getcontentInstance(stepLocalId)
             self.GenerateSFCStep(step, pou)
@@ -1430,10 +1523,10 @@
             if step_name in self.SFCNetworks["Steps"].keys():
                 actions = actionBlock.getactions()
                 for i, action in enumerate(actions):
-                    action_infos = {"id" : actionBlock.getlocalId(),
-                                    "qualifier" : action["qualifier"],
-                                    "content" : action["value"],
-                                    "num" : i}
+                    action_infos = {"id":        actionBlock.getlocalId(),
+                                    "qualifier": action["qualifier"],
+                                    "content":   action["value"],
+                                    "num":       i}
                     if "duration" in action:
                         action_infos["duration"] = action["duration"]
                     if "indicator" in action:
@@ -1441,9 +1534,12 @@
                     if action["type"] == "reference":
                         self.GenerateSFCAction(action["value"], pou)
                     else:
-                        action_name = "%s_INLINE%d"%(step_name.upper(), self.GetActionNumber())
-                        self.SFCNetworks["Actions"][action_name] = ([(self.CurrentIndent, ()),
-                            (action["value"], (self.TagName, "action_block", action_infos["id"], "action", i, "inline")),
+                        action_name = "%s_INLINE%d" % (step_name.upper(), self.GetActionNumber())
+                        self.SFCNetworks["Actions"][action_name] = ([
+                            (self.CurrentIndent, ()),
+                            (action["value"], (
+                                self.TagName, "action_block", action_infos["id"],
+                                "action", i, "inline")),
                             ("\n", ())], ())
                         action_infos["content"] = action_name
                     self.SFCNetworks["Steps"][step_name]["actions"].append(action_infos)
@@ -1453,7 +1549,7 @@
             actionContent = pou.getaction(action_name)
             if actionContent is not None:
                 previous_tagname = self.TagName
-                self.TagName = self.ParentGenerator.Controler.ComputePouActionName(self.Name, action_name)
+                self.TagName = ComputePouActionName(self.Name, action_name)
                 self.ComputeProgram(actionContent)
                 self.SFCNetworks["Actions"][action_name] = (self.Program, (self.TagName, "name"))
                 self.Program = []
@@ -1466,7 +1562,7 @@
             if connections is not None and len(connections) == 1:
                 instanceLocalId = connections[0].getrefLocalId()
                 body = pou.getbody()
-                if isinstance(body, ListType):
+                if isinstance(body, list):
                     body = body[0]
                 instance = body.getcontentInstance(instanceLocalId)
                 if isinstance(instance, StepClass):
@@ -1480,15 +1576,15 @@
                             steps.extend(self.ExtractConvergenceInputs(step, pou))
                 elif isinstance(instance, SimultaneousConvergenceClass):
                     steps.extend(self.ExtractConvergenceInputs(instance, pou))
-            transition_infos = {"id" : transition.getlocalId(),
+            transition_infos = {"id":       transition.getlocalId(),
                                 "priority": transition.getpriority(),
-                                "from": [],
-                                "to" : [],
-                                "content": []}
+                                "from":     [],
+                                "to":       [],
+                                "content":  []}
             self.SFCNetworks["Transitions"][transition] = transition_infos
             transitionValues = transition.getconditionContent()
             if transitionValues["type"] == "inline":
-                transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ()),
+                transition_infos["content"] = [("\n%s:= " % self.CurrentIndent, ()),
                                                (transitionValues["value"], (self.TagName, "transition", transition.getlocalId(), "inline")),
                                                (";\n", ())]
             elif transitionValues["type"] == "reference":
@@ -1496,7 +1592,7 @@
                 transitionType = transitionContent.getbodyType()
                 transitionBody = transitionContent.getbody()
                 previous_tagname = self.TagName
-                self.TagName = self.ParentGenerator.Controler.ComputePouTransitionName(self.Name, transitionValues["value"])
+                self.TagName = ComputePouTransitionName(self.Name, transitionValues["value"])
                 if transitionType == "IL":
                     transition_infos["content"] = [(":\n", ()),
                                                    (ReIndentText(transitionBody.getcontent().getanyText(), len(self.CurrentIndent)), (self.TagName, "body", len(self.CurrentIndent)))]
@@ -1505,27 +1601,29 @@
                                                    (ReIndentText(transitionBody.getcontent().getanyText(), len(self.CurrentIndent)), (self.TagName, "body", len(self.CurrentIndent)))]
                 else:
                     for instance in transitionBody.getcontentInstances():
-                        if isinstance(instance, OutVariableClass) and instance.getexpression() == transitionValues["value"]\
-                            or isinstance(instance, CoilClass) and instance.getvariable() == transitionValues["value"]:
+                        if isinstance(instance, OutVariableClass) and instance.getexpression() == transitionValues["value"] or \
+                           isinstance(instance, CoilClass) and instance.getvariable() == transitionValues["value"]:
                             connections = instance.connectionPointIn.getconnections()
                             if connections is not None:
                                 expression = self.ComputeExpression(transitionBody, connections)
                                 if expression is not None:
-                                    transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ())] + expression + [(";\n", ())]
+                                    transition_infos["content"] = [("\n%s:= " % self.CurrentIndent, ())] + expression + [(";\n", ())]
                                     self.SFCComputedBlocks += self.Program
                                     self.Program = []
-                    if not transition_infos.has_key("content"):
-                        raise PLCGenException, _("Transition \"%s\" body must contain an output variable or coil referring to its name") % transitionValues["value"]
+                    if "content" not in transition_infos:
+                        raise PLCGenException(
+                            _("Transition \"%s\" body must contain an output variable or coil referring to its name")
+                            % transitionValues["value"])
                 self.TagName = previous_tagname
             elif transitionValues["type"] == "connection":
                 body = pou.getbody()
-                if isinstance(body, ListType):
+                if isinstance(body, list):
                     body = body[0]
                 connections = transitionValues["value"].getconnections()
                 if connections is not None:
                     expression = self.ComputeExpression(body, connections)
                     if expression is not None:
-                        transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ())] + expression + [(";\n", ())]
+                        transition_infos["content"] = [("\n%s:= " % self.CurrentIndent, ())] + expression + [(";\n", ())]
                         self.SFCComputedBlocks += self.Program
                         self.Program = []
             for step in steps:
@@ -1564,7 +1662,7 @@
                                      (action_infos["indicator"], action_info + ("indicator",))]
                 self.Program += [(");\n", ())]
             self.IndentLeft()
-            self.Program += [("%sEND_STEP\n\n"%self.CurrentIndent, ())]
+            self.Program += [("%sEND_STEP\n\n" % self.CurrentIndent, ())]
             for action in actions:
                 self.ComputeSFCAction(action)
             for transition in step_infos["transitions"]:
@@ -1573,19 +1671,19 @@
     def ComputeSFCAction(self, action_name):
         if action_name in self.SFCNetworks["Actions"].keys():
             action_content, action_info = self.SFCNetworks["Actions"].pop(action_name)
-            self.Program += [("%sACTION "%self.CurrentIndent, ()),
+            self.Program += [("%sACTION " % self.CurrentIndent, ()),
                              (action_name, action_info),
                              (":\n", ())]
             self.Program += action_content
-            self.Program += [("%sEND_ACTION\n\n"%self.CurrentIndent, ())]
+            self.Program += [("%sEND_ACTION\n\n" % self.CurrentIndent, ())]
 
     def ComputeSFCTransition(self, transition):
         if transition in self.SFCNetworks["Transitions"].keys():
             transition_infos = self.SFCNetworks["Transitions"].pop(transition)
-            self.Program += [("%sTRANSITION"%self.CurrentIndent, ())]
-            if transition_infos["priority"] != None:
+            self.Program += [("%sTRANSITION" % self.CurrentIndent, ())]
+            if transition_infos["priority"] is not None:
                 self.Program += [(" (PRIORITY := ", ()),
-                                 ("%d"%transition_infos["priority"], (self.TagName, "transition", transition_infos["id"], "priority")),
+                                 ("%d" % transition_infos["priority"], (self.TagName, "transition", transition_infos["id"], "priority")),
                                  (")", ())]
             self.Program += [(" FROM ", ())]
             if len(transition_infos["from"]) > 1:
@@ -1595,9 +1693,9 @@
             elif len(transition_infos["from"]) == 1:
                 self.Program += transition_infos["from"][0]
             else:
-                msg = _("Transition with content \"{a1}\" not connected to a previous step in \"{a2}\" POU").\
-                      format(a1 = transition_infos["content"], a2 = self.Name)
-                raise PLCGenException, msg
+                raise PLCGenException(
+                    _("Transition with content \"{a1}\" not connected to a previous step in \"{a2}\" POU").
+                    format(a1=transition_infos["content"], a2=self.Name))
             self.Program += [(" TO ", ())]
             if len(transition_infos["to"]) > 1:
                 self.Program += [("(", ())]
@@ -1606,12 +1704,12 @@
             elif len(transition_infos["to"]) == 1:
                 self.Program += transition_infos["to"][0]
             else:
-                msg = _("Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU").\
-                      format(a1 = transition_infos["content"], a2 = self.Name)
-                raise PLCGenException, msg
+                raise PLCGenException(
+                    _("Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU").
+                    format(a1=transition_infos["content"], a2=self.Name))
             self.Program += transition_infos["content"]
-            self.Program += [("%sEND_TRANSITION\n\n"%self.CurrentIndent, ())]
-            for [(step_name, step_infos)] in transition_infos["to"]:
+            self.Program += [("%sEND_TRANSITION\n\n" % self.CurrentIndent, ())]
+            for [(step_name, _step_infos)] in transition_infos["to"]:
                 self.ComputeSFCStep(step_name)
 
     def GenerateProgram(self, pou):
@@ -1619,35 +1717,35 @@
         self.ComputeConnectionTypes(pou)
         self.ComputeProgram(pou)
 
-        program = [("%s "%self.Type, ()),
+        program = [("%s " % self.Type, ()),
                    (self.Name, (self.TagName, "name"))]
         if self.ReturnType is not None:
             program += [(" : ", ()),
                         (self.ReturnType, (self.TagName, "return"))]
         program += [("\n", ())]
         if len(self.Interface) == 0:
-            raise PLCGenException, _("No variable defined in \"%s\" POU")%self.Name
-        if len(self.Program) == 0 :
-            raise PLCGenException, _("No body defined in \"%s\" POU")%self.Name
+            raise PLCGenException(_("No variable defined in \"%s\" POU") % self.Name)
+        if len(self.Program) == 0:
+            raise PLCGenException(_("No body defined in \"%s\" POU") % self.Name)
         var_number = 0
-        for list_type, option, located, variables in self.Interface:
+        for list_type, option, _located, variables in self.Interface:
             variable_type = errorVarTypes.get(list_type, "var_local")
-            program += [("  %s"%list_type, ())]
+            program += [("  %s" % list_type, ())]
             if option is not None:
-                program += [(" %s"%option, (self.TagName, variable_type, (var_number, var_number + len(variables)), option.lower()))]
+                program += [(" %s" % option, (self.TagName, variable_type, (var_number, var_number + len(variables)), option.lower()))]
             program += [("\n", ())]
             for var_type, var_name, var_address, var_initial in variables:
                 program += [("    ", ())]
                 if var_name:
                     program += [(var_name, (self.TagName, variable_type, var_number, "name")),
                                 (" ", ())]
-                if var_address != None:
+                if var_address is not None:
                     program += [("AT ", ()),
                                 (var_address, (self.TagName, variable_type, var_number, "location")),
                                 (" ", ())]
                 program += [(": ", ()),
                             (var_type, (self.TagName, variable_type, var_number, "type"))]
-                if var_initial != None:
+                if var_initial is not None:
                     program += [(" := ", ()),
                                 (self.ParentGenerator.ComputeValue(var_initial, var_type), (self.TagName, variable_type, var_number, "initial value"))]
                 program += [(";\n", ())]
@@ -1655,11 +1753,11 @@
             program += [("  END_VAR\n", ())]
         program += [("\n", ())]
         program += self.Program
-        program += [("END_%s\n\n"%self.Type, ())]
+        program += [("END_%s\n\n" % self.Type, ())]
         return program
 
+
 def GenerateCurrentProgram(controler, project, errors, warnings):
     generator = ProgramGenerator(controler, project, errors, warnings)
     generator.GenerateProgram()
     return generator.GetGeneratedProgram()
-
--- a/PLCOpenEditor.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/PLCOpenEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -22,110 +23,82 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import print_function
+import os
+import sys
+import getopt
+
 import wx
-import os, sys, platform, time, traceback, getopt
+
 import version
-
-beremiz_dir = os.path.dirname(os.path.realpath(__file__))
-
-__version__ = "$Revision: 1.130 $"
-
-if __name__ == '__main__':
-    # Usage message displayed when help request or when error detected in
-    # command line
-    def usage():
-        print "\nUsage of PLCOpenEditor.py :"
-        print "\n   %s [Filepath]\n"%sys.argv[0]
-
-    # Parse options given to PLCOpenEditor in command line
-    try:
-        opts, args = getopt.getopt(sys.argv[1:], "h", ["help"])
-    except getopt.GetoptError:
-        # print help information and exit:
-        usage()
-        sys.exit(2)
-
-    # Extract if help has been requested
-    for o, a in opts:
-        if o in ("-h", "--help"):
-            usage()
-            sys.exit()
-
-    # Extract the optional filename to open
-    fileOpen = None
-    if len(args) > 1:
-        usage()
-        sys.exit()
-    elif len(args) == 1:
-        fileOpen = args[0]
-
-    # Create wxApp (Need to create App before internationalization because of
-    # Windows)
-    if wx.VERSION >= (3, 0, 0):
-        app = wx.App()
-    else:
-        app = wx.PySimpleApp()
-
-
-    from util.misc import InstallLocalRessources
-    InstallLocalRessources(beremiz_dir)
-
-from docutil import *
+import util.paths as paths
+import util.ExceptionHandler
+from util.misc import InstallLocalRessources
+from docutil.docpdf import open_pdf
 from IDEFrame import IDEFrame, AppendMenu
-from IDEFrame import TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE, POUINSTANCEVARIABLESPANEL, LIBRARYTREE, PAGETITLES
-from IDEFrame import EncodeFileSystemPath, DecodeFileSystemPath
+from IDEFrame import \
+    TITLE, \
+    EDITORTOOLBAR, \
+    FILEMENU, \
+    EDITMENU, \
+    DISPLAYMENU, \
+    PROJECTTREE, \
+    POUINSTANCEVARIABLESPANEL, \
+    LIBRARYTREE, \
+    PAGETITLES, \
+    DecodeFileSystemPath
 from editors.Viewer import Viewer
 from PLCControler import PLCControler
 from dialogs import ProjectDialog
 from dialogs.AboutDialog import ShowAboutDialog
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                            PLCOpenEditor Main Class
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 # Define PLCOpenEditor FileMenu extra items id
-[ID_PLCOPENEDITORFILEMENUGENERATE,
+[
+    ID_PLCOPENEDITORFILEMENUGENERATE,
 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)]
 
+
+beremiz_dir = paths.AbsDir(__file__)
+
+
 class PLCOpenEditor(IDEFrame):
 
-    # Compatibility function for wx versions < 2.6
-    if wx.VERSION < (2, 6, 0):
-        def Bind(self, event, function, id = None):
-            if id is not None:
-                event(self, id, function)
-            else:
-                event(self, function)
-
     def _init_coll_FileMenu_Items(self, parent):
         AppendMenu(parent, help='', id=wx.ID_NEW,
-              kind=wx.ITEM_NORMAL, text=_(u'New') +'\tCTRL+N')
+                   kind=wx.ITEM_NORMAL, text=_(u'New') + '\tCTRL+N')
         AppendMenu(parent, help='', id=wx.ID_OPEN,
-              kind=wx.ITEM_NORMAL, text=_(u'Open') + '\tCTRL+O')
+                   kind=wx.ITEM_NORMAL, text=_(u'Open') + '\tCTRL+O')
         AppendMenu(parent, help='', id=wx.ID_CLOSE,
-              kind=wx.ITEM_NORMAL, text=_(u'Close Tab') + '\tCTRL+W')
+                   kind=wx.ITEM_NORMAL, text=_(u'Close Tab') + '\tCTRL+W')
         AppendMenu(parent, help='', id=wx.ID_CLOSE_ALL,
-              kind=wx.ITEM_NORMAL, text=_(u'Close Project') + '\tCTRL+SHIFT+W')
+                   kind=wx.ITEM_NORMAL, text=_(u'Close Project') + '\tCTRL+SHIFT+W')
         parent.AppendSeparator()
         AppendMenu(parent, help='', id=wx.ID_SAVE,
-              kind=wx.ITEM_NORMAL, text=_(u'Save') + '\tCTRL+S')
+                   kind=wx.ITEM_NORMAL, text=_(u'Save') + '\tCTRL+S')
         AppendMenu(parent, help='', id=wx.ID_SAVEAS,
-              kind=wx.ITEM_NORMAL, text=_(u'Save As...') + '\tCTRL+SHIFT+S')
+                   kind=wx.ITEM_NORMAL, text=_(u'Save As...') + '\tCTRL+SHIFT+S')
         AppendMenu(parent, help='', id=ID_PLCOPENEDITORFILEMENUGENERATE,
-              kind=wx.ITEM_NORMAL, text=_(u'Generate Program') + '\tCTRL+G')
+                   kind=wx.ITEM_NORMAL, text=_(u'Generate Program') + '\tCTRL+G')
         parent.AppendSeparator()
         AppendMenu(parent, help='', id=wx.ID_PAGE_SETUP,
-              kind=wx.ITEM_NORMAL, text=_(u'Page Setup') + '\tCTRL+ALT+P')
+                   kind=wx.ITEM_NORMAL, text=_(u'Page Setup') + '\tCTRL+ALT+P')
         AppendMenu(parent, help='', id=wx.ID_PREVIEW,
-              kind=wx.ITEM_NORMAL, text=_(u'Preview') + '\tCTRL+SHIFT+P')
+                   kind=wx.ITEM_NORMAL, text=_(u'Preview') + '\tCTRL+SHIFT+P')
         AppendMenu(parent, help='', id=wx.ID_PRINT,
-              kind=wx.ITEM_NORMAL, text=_(u'Print') + '\tCTRL+P')
+                   kind=wx.ITEM_NORMAL, text=_(u'Print') + '\tCTRL+P')
         parent.AppendSeparator()
         AppendMenu(parent, help='', id=wx.ID_PROPERTIES,
-              kind=wx.ITEM_NORMAL, text=_(u'&Properties'))
+                   kind=wx.ITEM_NORMAL, text=_(u'&Properties'))
         parent.AppendSeparator()
         AppendMenu(parent, help='', id=wx.ID_EXIT,
-              kind=wx.ITEM_NORMAL, text=_(u'Quit') + '\tCTRL+Q')
+                   kind=wx.ITEM_NORMAL, text=_(u'Quit') + '\tCTRL+Q')
 
         self.Bind(wx.EVT_MENU, self.OnNewProjectMenu, id=wx.ID_NEW)
         self.Bind(wx.EVT_MENU, self.OnOpenProjectMenu, id=wx.ID_OPEN)
@@ -134,7 +107,7 @@
         self.Bind(wx.EVT_MENU, self.OnSaveProjectMenu, id=wx.ID_SAVE)
         self.Bind(wx.EVT_MENU, self.OnSaveProjectAsMenu, id=wx.ID_SAVEAS)
         self.Bind(wx.EVT_MENU, self.OnGenerateProgramMenu,
-              id=ID_PLCOPENEDITORFILEMENUGENERATE)
+                  id=ID_PLCOPENEDITORFILEMENUGENERATE)
         self.Bind(wx.EVT_MENU, self.OnPageSetupMenu, id=wx.ID_PAGE_SETUP)
         self.Bind(wx.EVT_MENU, self.OnPreviewMenu, id=wx.ID_PREVIEW)
         self.Bind(wx.EVT_MENU, self.OnPrintMenu, id=wx.ID_PRINT)
@@ -149,23 +122,34 @@
 
     def _init_coll_HelpMenu_Items(self, parent):
         AppendMenu(parent, help='', id=wx.ID_HELP,
-            kind=wx.ITEM_NORMAL, text=_(u'PLCOpenEditor') + '\tF1')
-        #AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS,
+                   kind=wx.ITEM_NORMAL, text=_(u'PLCOpenEditor') + '\tF1')
+        # AppendMenu(parent, help='', id=wx.ID_HELP_CONTENTS,
         #      kind=wx.ITEM_NORMAL, text=u'PLCOpen\tF2')
-        #AppendMenu(parent, help='', id=wx.ID_HELP_CONTEXT,
+        # AppendMenu(parent, help='', id=wx.ID_HELP_CONTEXT,
         #      kind=wx.ITEM_NORMAL, text=u'IEC 61131-3\tF3')
+
+        def handler(event):
+            return wx.MessageBox(
+                version.GetCommunityHelpMsg(),
+                _(u'Community support'),
+                wx.OK | wx.ICON_INFORMATION)
+
+        id = wx.NewId()
+        parent.Append(help='', id=id, kind=wx.ITEM_NORMAL, text=_(u'Community support'))
+        self.Bind(wx.EVT_MENU, handler, id=id)
+
         AppendMenu(parent, help='', id=wx.ID_ABOUT,
-            kind=wx.ITEM_NORMAL, text=_(u'About'))
+                   kind=wx.ITEM_NORMAL, text=_(u'About'))
         self.Bind(wx.EVT_MENU, self.OnPLCOpenEditorMenu, id=wx.ID_HELP)
-        #self.Bind(wx.EVT_MENU, self.OnPLCOpenMenu, id=wx.ID_HELP_CONTENTS)
+        # self.Bind(wx.EVT_MENU, self.OnPLCOpenMenu, id=wx.ID_HELP_CONTENTS)
         self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)
 
-    ## Constructor of the PLCOpenEditor class.
-    #  @param parent The parent window.
-    #  @param controler The controler been used by PLCOpenEditor (default: None).
-    #  @param fileOpen The filepath to open if no controler defined (default: None).
-    #  @param debug The filepath to open if no controler defined (default: False).
-    def __init__(self, parent, fileOpen = None):
+    def __init__(self, parent, fileOpen=None):
+        """ Constructor of the PLCOpenEditor class.
+
+        :param parent: The parent window.
+        :param fileOpen: The filepath to open if no controler defined (default: None).
+        """
         self.icon = wx.Icon(os.path.join(beremiz_dir, "images", "poe.ico"), wx.BITMAP_TYPE_ICO)
         IDEFrame.__init__(self, parent)
 
@@ -193,7 +177,7 @@
 
         if result is not None:
             (num, line) = result
-            self.ShowErrorMessage(_("PLC syntax error at line {a1}:\n{a2}").format(a1 = num, a2 = line))
+            self.ShowErrorMessage(_("PLC syntax error at line {a1}:\n{a2}").format(a1=num, a2=line))
 
     def OnCloseFrame(self, event):
         if self.Controler is None or self.CheckSaveBeforeClosing(_("Close Application")):
@@ -208,13 +192,13 @@
     def RefreshTitle(self):
         name = _("PLCOpenEditor")
         if self.Controler is not None:
-            self.SetTitle("%s - %s"%(name, self.Controler.GetFilename()))
+            self.SetTitle("%s - %s" % (name, self.Controler.GetFilename()))
         else:
             self.SetTitle(name)
 
-#-------------------------------------------------------------------------------
-#                            File Menu Functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                            File Menu Functions
+    # -------------------------------------------------------------------------------
 
     def RefreshFileMenu(self):
         MenuToolBar = self.Panes["MenuToolBar"]
@@ -306,7 +290,7 @@
 
         if result is not None:
             (num, line) = result
-            self.ShowErrorMessage(_("PLC syntax error at line {a1}:\n{a2}").format(a1 = num, a2 = line))
+            self.ShowErrorMessage(_("PLC syntax error at line {a1}:\n{a2}").format(a1=num, a2=line))
 
     def OnCloseProjectMenu(self, event):
         if not self.CheckSaveBeforeClosing():
@@ -321,24 +305,24 @@
         self.SaveProjectAs()
 
     def OnGenerateProgramMenu(self, event):
-        dialog = wx.FileDialog(self, _("Choose a file"), os.getcwd(), self.Controler.GetProgramFilePath(),  _("ST files (*.st)|*.st|All files|*.*"), wx.SAVE|wx.CHANGE_DIR)
+        dialog = wx.FileDialog(self, _("Choose a file"), os.getcwd(), self.Controler.GetProgramFilePath(),  _("ST files (*.st)|*.st|All files|*.*"), wx.SAVE | wx.CHANGE_DIR)
         if dialog.ShowModal() == wx.ID_OK:
             filepath = dialog.GetPath()
             message_text = ""
             header, icon = _("Done"), wx.ICON_INFORMATION
             if os.path.isdir(os.path.dirname(filepath)):
-                program, errors, warnings = self.Controler.GenerateProgram(filepath)
+                _program, errors, warnings = self.Controler.GenerateProgram(filepath)
                 message_text += "".join([_("warning: %s\n") % warning for warning in warnings])
                 if len(errors) > 0:
                     message_text += "".join([_("error: %s\n") % error for error in errors])
-                    message_text += _("Can't generate program to file %s!")%filepath
+                    message_text += _("Can't generate program to file %s!") % filepath
                     header, icon = _("Error"), wx.ICON_ERROR
                 else:
                     message_text += _("Program was successfully generated!")
             else:
-                message_text += _("\"%s\" is not a valid folder!")%os.path.dirname(filepath)
+                message_text += _("\"%s\" is not a valid folder!") % os.path.dirname(filepath)
                 header, icon = _("Error"), wx.ICON_ERROR
-            message = wx.MessageDialog(self, message_text, header, wx.OK|icon)
+            message = wx.MessageDialog(self, message_text, header, wx.OK | icon)
             message.ShowModal()
             message.Destroy()
         dialog.Destroy()
@@ -369,130 +353,65 @@
         if filepath != "":
             directory, filename = os.path.split(filepath)
         else:
-            directory, filename = os.getcwd(), "%(projectName)s.xml"%self.Controler.GetProjectProperties()
-        dialog = wx.FileDialog(self, _("Choose a file"), directory, filename,  _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.SAVE|wx.OVERWRITE_PROMPT)
+            directory, filename = os.getcwd(), "%(projectName)s.xml" % self.Controler.GetProjectProperties()
+        dialog = wx.FileDialog(self, _("Choose a file"), directory, filename,  _("PLCOpen files (*.xml)|*.xml|All files|*.*"), wx.SAVE | wx.OVERWRITE_PROMPT)
         if dialog.ShowModal() == wx.ID_OK:
             filepath = dialog.GetPath()
             if os.path.isdir(os.path.dirname(filepath)):
                 result = self.Controler.SaveXMLFile(filepath)
                 if not result:
-                    self.ShowErrorMessage(_("Can't save project to file %s!")%filepath)
+                    self.ShowErrorMessage(_("Can't save project to file %s!") % filepath)
             else:
-                self.ShowErrorMessage(_("\"%s\" is not a valid folder!")%os.path.dirname(filepath))
+                self.ShowErrorMessage(_("\"%s\" is not a valid folder!") % os.path.dirname(filepath))
             self._Refresh(TITLE, FILEMENU, PAGETITLES)
         dialog.Destroy()
 
-#-------------------------------------------------------------------------------
-#                               Exception Handler
-#-------------------------------------------------------------------------------
-
-Max_Traceback_List_Size = 20
-
-def Display_Exception_Dialog(e_type,e_value,e_tb):
-    trcbck_lst = []
-    for i,line in enumerate(traceback.extract_tb(e_tb)):
-        trcbck = " " + str(i+1) + _(". ")
-        if line[0].find(os.getcwd()) == -1:
-            trcbck += _("file : ") + str(line[0]) + _(",   ")
-        else:
-            trcbck += _("file : ") + str(line[0][len(os.getcwd()):]) + _(",   ")
-        trcbck += _("line : ") + str(line[1]) + _(",   ") + _("function : ") + str(line[2])
-        trcbck_lst.append(trcbck)
-
-    # Allow clicking....
-    cap = wx.Window_GetCapture()
-    if cap:
-        cap.ReleaseMouse()
-
-    dlg = wx.SingleChoiceDialog(None,
-        _("""
-An unhandled exception (bug) occured. Bug report saved at :
-(%s)
-
-Please be kind enough to send this file to:
-beremiz-devel@lists.sourceforge.net
-
-You should now restart program.
-
-Traceback:
-""") % bug_report_path +
-        repr(e_type) + " : " + repr(e_value),
-        _("Error"),
-        trcbck_lst)
-    try:
-        res = (dlg.ShowModal() == wx.ID_OK)
-    finally:
-        dlg.Destroy()
-
-    return res
-
-def Display_Error_Dialog(e_value):
-    message = wx.MessageDialog(None, str(e_value), _("Error"), wx.OK|wx.ICON_ERROR)
-    message.ShowModal()
-    message.Destroy()
-
-def get_last_traceback(tb):
-    while tb.tb_next:
-        tb = tb.tb_next
-    return tb
-
-
-def format_namespace(d, indent='    '):
-    return '\n'.join(['%s%s: %s' % (indent, k, repr(v)[:10000]) for k, v in d.iteritems()])
-
-
-ignored_exceptions = [] # a problem with a line in a module is only reported once per session
-
-def AddExceptHook(path, app_version='[No version]'):#, ignored_exceptions=[]):
-
-    def handle_exception(e_type, e_value, e_traceback):
-        traceback.print_exception(e_type, e_value, e_traceback) # this is very helpful when there's an exception in the rest of this func
-        last_tb = get_last_traceback(e_traceback)
-        ex = (last_tb.tb_frame.f_code.co_filename, last_tb.tb_frame.f_lineno)
-        if str(e_value).startswith("!!!"):
-            Display_Error_Dialog(e_value)
-        elif ex not in ignored_exceptions:
-            result = Display_Exception_Dialog(e_type,e_value,e_traceback)
-            if result:
-                ignored_exceptions.append(ex)
-                info = {
-                    'app-title' : wx.GetApp().GetAppName(), # app_title
-                    'app-version' : app_version,
-                    'wx-version' : wx.VERSION_STRING,
-                    'wx-platform' : wx.Platform,
-                    'python-version' : platform.python_version(), #sys.version.split()[0],
-                    'platform' : platform.platform(),
-                    'e-type' : e_type,
-                    'e-value' : e_value,
-                    'date' : time.ctime(),
-                    'cwd' : os.getcwd(),
-                    }
-                if e_traceback:
-                    info['traceback'] = ''.join(traceback.format_tb(e_traceback)) + '%s: %s' % (e_type, e_value)
-                    last_tb = get_last_traceback(e_traceback)
-                    exception_locals = last_tb.tb_frame.f_locals # the locals at the level of the stack trace where the exception actually occurred
-                    info['locals'] = format_namespace(exception_locals)
-                    if 'self' in exception_locals:
-                        info['self'] = format_namespace(exception_locals['self'].__dict__)
-
-                output = open(path+os.sep+"bug_report_"+info['date'].replace(':','-').replace(' ','_')+".txt",'w')
-                lst = info.keys()
-                lst.sort()
-                for a in lst:
-                    output.write(a+":\n"+str(info[a])+"\n\n")
-
-    #sys.excepthook = lambda *args: wx.CallAfter(handle_exception, *args)
-    sys.excepthook = handle_exception
+
+class PLCOpenEditorApp(wx.App):
+    # def SetOpenFile(
+
+    def PrintUsage(self):
+        print("\nUsage of PLCOpenEditor.py :")
+        print("\n   %s [Filepath]\n" % sys.argv[0])
+
+    def ParseCommandLine(self):
+        # Parse options given to PLCOpenEditor in command line
+        try:
+            opts, args = getopt.getopt(sys.argv[1:], "h", ["help"])
+        except getopt.GetoptError:
+            # print help information and exit:
+            self.PrintUsage()
+            sys.exit(2)
+
+        # Extract if help has been requested
+        for o, _a in opts:
+            if o in ("-h", "--help"):
+                self.PrintUsage()
+                sys.exit()
+
+        # Extract the optional filename to open
+        self.fileOpen = None
+        if len(args) > 1:
+            self.PrintUsage()
+            sys.exit()
+        elif len(args) == 1:
+            self.fileOpen = args[0]
+
+    def OnInit(self):
+        self.SetAppName('plcopeneditor')
+        self.ParseCommandLine()
+        InstallLocalRessources(beremiz_dir)
+        if wx.VERSION < (3, 0, 0):
+            wx.InitAllImageHandlers()
+        util.ExceptionHandler.AddExceptHook(version.app_version)
+        self.frame = PLCOpenEditor(None, fileOpen=self.fileOpen)
+        return True
+
+    def Show(self):
+        self.frame.Show()
+
 
 if __name__ == '__main__':
-    if wx.VERSION < (3, 0, 0):
-        wx.InitAllImageHandlers()
-
-    # Install a exception handle for bug reports
-    AddExceptHook(os.getcwd(), version.app_version)
-
-    frame = PLCOpenEditor(None, fileOpen=fileOpen)
-
-    frame.Show()
+    app = PLCOpenEditorApp()
+    app.Show()
     app.MainLoop()
-
--- a/POULibrary.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/POULibrary.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,9 +22,12 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 from weakref import ref
 
-class POULibrary:
+
+class POULibrary(object):
     def __init__(self, CTR, LibName, TypeStack):
         from PLCControler import PLCControler
         self.CTR = ref(CTR)
@@ -33,21 +36,21 @@
         self.LibraryControler.OpenXMLFile(self.GetLibraryPath())
         self.LibraryControler.ClearConfNodeTypes()
         self.LibraryControler.AddConfNodeTypesList(TypeStack)
-        self.program = None;
+        self.program = None
 
     def GetSTCode(self):
         if not self.program:
             self.program = self.LibraryControler.GenerateProgram()[0]+"\n"
-        return self.program 
+        return self.program
 
     def GetName(self):
         return self.LibName
 
     def GetCTR(self):
         return self.CTR()
-        
+
     def GetTypes(self):
-        return {"name" : self.GetName(), "types": self.LibraryControler.Project}
+        return {"name": self.GetName(), "types": self.LibraryControler.Project}
 
     def GetLibraryPath(self):
         raise Exception("Not implemented")
@@ -55,3 +58,10 @@
     def Generate_C(self, buildpath, varlist, IECCFLAGS):
         # Pure python or IEC libs doesn't produce C code
         return ((""), [], False), ""
+
+
+def SimplePOULibraryFactory(path):
+    class SimplePOULibrary(POULibrary):
+        def GetLibraryPath(self):
+            return path
+    return SimplePOULibrary
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PSKManagement.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,149 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+import os
+import time
+import json
+from zipfile import ZipFile
+
+# PSK Management Data model :
+# [[ID,Desc, LastKnownURI, LastConnect]]
+COL_ID, COL_URI, COL_DESC, COL_LAST = range(4)
+REPLACE, REPLACE_ALL, KEEP, KEEP_ALL, CANCEL = range(5)
+
+def _pskpath(project_path):
+    return os.path.join(project_path, 'psk')
+
+def _mgtpath(project_path):
+    return os.path.join(_pskpath(project_path), 'management.json')
+
+def _ensurePSKdir(project_path):
+    pskpath = _pskpath(project_path)
+    if not os.path.exists(pskpath):
+        os.mkdir(pskpath)
+    return pskpath
+
+def _default(ID):
+    return [ID,
+            '', # default description
+            None, # last known URI
+            None]  # last connection date
+
+def _dataByID(data):
+    return {row[COL_ID]:row for row in data}
+
+def _LoadData(project_path):
+    """ load known keys metadata """
+    if os.path.isdir(_pskpath(project_path)):
+        _path = _mgtpath(project_path)
+        if os.path.exists(_path):
+            return json.loads(open(_path).read())
+    return []
+
+def _filterData(psk_files, data_input):
+    input_by_ID = _dataByID(data_input)
+    output = []
+    # go through all secret files available an build data
+    # out of data recoverd from json and list of secret.
+    # this implicitly filters IDs out of metadata who's
+    # secret is missing
+    for filename in psk_files:
+       if filename.endswith('.secret'):
+           ID = filename[:-7]  # strip filename extension
+           output.append(input_by_ID.get(ID,_default(ID)))
+    return output
+
+def GetData(project_path):
+    loaded_data = _LoadData(project_path)
+    if loaded_data:
+        psk_files = os.listdir(_pskpath(project_path))
+        return _filterData(psk_files, loaded_data)
+    return []
+
+def DeleteID(project_path, ID):
+    secret_path = os.path.join(_pskpath(project_path), ID+'.secret')
+    os.remove(secret_path)
+
+def SaveData(project_path, data):
+    _ensurePSKdir(project_path)
+    with open(_mgtpath(project_path), 'w') as f:
+        f.write(json.dumps(data))
+
+def UpdateID(project_path, ID, secret, URI):
+    pskpath = _ensurePSKdir(project_path)
+    if not os.path.exists(pskpath):
+        os.mkdir(pskpath)
+
+    secpath = os.path.join(pskpath, ID+'.secret')
+    with open(secpath, 'w') as f:
+        f.write(ID+":"+secret)
+
+    # here we directly use _LoadData, avoiding filtering that could be long
+    data = _LoadData(project_path)
+    idata = _dataByID(data)
+    dataForID = idata.get(ID, None) if data else None
+
+    _is_new_ID = dataForID is None
+    if _is_new_ID:
+       dataForID = _default(ID)
+
+    dataForID[COL_URI] = URI
+    # FIXME : could store time instead os a string and use DVC model's cmp 
+    # then date display could be smarter, etc - sortable sting hack for now
+    dataForID[COL_LAST] = time.strftime('%y/%M/%d-%H:%M:%S')
+
+    if _is_new_ID:
+        data.append(dataForID)
+
+    SaveData(project_path, data)
+
+def ExportIDs(project_path, export_zip):
+    with ZipFile(export_zip, 'w') as zf:
+        path = _pskpath(project_path)
+        for nm in os.listdir(path):
+            if nm.endswith('.secret') or nm == 'management.json':
+                zf.write(os.path.join(path, nm), nm)
+
+def ImportIDs(project_path, import_zip, should_I_replace_callback):
+    zf = ZipFile(import_zip, 'r')
+    data = GetData(project_path)
+
+    zip_loaded_data = json.loads(zf.open('management.json').read())
+    name_list = zf.namelist()
+    zip_filtered_data = _filterData(name_list, zip_loaded_data)
+
+    idata = _dataByID(data)
+
+    keys_to_import = []
+    result = None
+
+    for imported_row in zip_filtered_data:
+        ID = imported_row[COL_ID]
+        existing_row = idata.get(ID, None)
+        if existing_row is None:
+            data.append(imported_row)
+        else:
+            # callback returns the selected list for merge or none if canceled
+            if result not in [REPLACE_ALL, KEEP_ALL]:
+                result = should_I_replace_callback(existing_row, imported_row)
+
+            if result == CANCEL:
+                return
+            
+            if result in [REPLACE_ALL, REPLACE]:
+                # replace with imported
+                existing_row[:] = imported_row
+                # copy the key of selected
+                keys_to_import.append(ID)
+    
+    for ID in keys_to_import:
+        zf.extract(ID+".secret", _pskpath(project_path))
+
+    SaveData(project_path, data)
+
+    return data
+
+
--- a/ProjectController.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/ProjectController.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -25,22 +26,27 @@
 """
 Beremiz Project Controller
 """
-import os,sys,traceback
+
+
+from __future__ import absolute_import
+import os
+import traceback
 import time
-import features
+from time import localtime
 import shutil
-import wx
-import re, tempfile
-from math import ceil
-from types import ListType
-from threading import Timer, Lock, Thread
-from time import localtime
+import re
+import tempfile
+from threading import Timer
 from datetime import datetime
 from weakref import WeakKeyDictionary
-from itertools import izip
-
-import targets
+from functools import reduce
+from six.moves import xrange
+
+import wx
+
+import features
 import connectors
+import util.paths as paths
 from util.misc import CheckPathPerm, GetClassImporter
 from util.MiniTextControler import MiniTextControler
 from util.ProcessLogger import ProcessLogger
@@ -49,70 +55,108 @@
 from editors.ProjectNodeEditor import ProjectNodeEditor
 from editors.IECCodeViewer import IECCodeViewer
 from editors.DebugViewer import DebugViewer, REFRESH_PERIOD
-from dialogs import DiscoveryDialog
+from dialogs import UriEditor, IDManager
 from PLCControler import PLCControler
 from plcopen.structures import IEC_KEYWORDS
-from targets.typemapping import DebugTypesSize, LogLevelsCount, LogLevels
-from targets.typemapping import UnpackDebugBuffer
+from plcopen.types_enums import ComputeConfigurationResourceName, ITEM_CONFNODE
+import targets
+from runtime.typemapping import DebugTypesSize, UnpackDebugBuffer
+from runtime import PlcStatus
 from ConfigTreeNode import ConfigTreeNode, XSDSchemaErrorMessage
 
-base_folder = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0]
-
-MATIEC_ERROR_MODEL = re.compile(".*\.st:(\d+)-(\d+)\.\.(\d+)-(\d+): (?:error)|(?:warning) : (.*)$")
-
-ITEM_CONFNODE = 25
+base_folder = paths.AbsParentDir(__file__)
+
+MATIEC_ERROR_MODEL = re.compile(
+    r".*\.st:(\d+)-(\d+)\.\.(\d+)-(\d+): (?:error)|(?:warning) : (.*)$")
+
 
 def ExtractChildrenTypesFromCatalog(catalog):
     children_types = []
-    for n,d,h,c in catalog:
-        if isinstance(c, ListType):
+    for n, d, _h, c in catalog:
+        if isinstance(c, list):
             children_types.extend(ExtractChildrenTypesFromCatalog(c))
         else:
             children_types.append((n, GetClassImporter(c), d))
     return children_types
 
+
 def ExtractMenuItemsFromCatalog(catalog):
     menu_items = []
-    for n,d,h,c in catalog:
-        if isinstance(c, ListType):
+    for n, d, h, c in catalog:
+        if isinstance(c, list):
             children = ExtractMenuItemsFromCatalog(c)
         else:
             children = []
         menu_items.append((n, d, h, children))
     return menu_items
 
+
 def GetAddMenuItems():
     return ExtractMenuItemsFromCatalog(features.catalog)
 
-class Iec2CSettings():
+
+class Iec2CSettings(object):
+
     def __init__(self):
-        self.iec2c = os.path.join(base_folder, "matiec", "iec2c"+(".exe" if wx.Platform == '__WXMSW__' else ""))
+        self.iec2c = None
         self.iec2c_buildopts = None
-        self.ieclib_path   = os.path.join(base_folder, "matiec", "lib")
-        self.ieclib_c_path = None
-
-    def findLibCPath(self):
-        path=""
-        paths=[
-            os.path.join(base_folder, "matiec", "lib", "C"),
-            os.path.join(base_folder, "matiec", "lib") ]
+        self.ieclib_path = self.findLibPath()
+        self.ieclib_c_path = self.findLibCPath()
+
+    def findObject(self, paths, test):
+        path = None
         for p in paths:
-            filename=os.path.join(p, "iec_types.h")
-            if (os.path.isfile(filename)):
+            if test(p):
                 path = p
                 break
         return path
 
+    def findCmd(self):
+        cmd = "iec2c" + (".exe" if wx.Platform == '__WXMSW__' else "")
+        paths = [
+            os.path.join(base_folder, "matiec")
+        ]
+        path = self.findObject(
+            paths, lambda p: os.path.isfile(os.path.join(p, cmd)))
+
+        # otherwise use iec2c from PATH
+        if path is not None:
+            cmd = os.path.join(path, cmd)
+
+        return cmd
+
+    def findLibPath(self):
+        paths = [
+            os.path.join(base_folder, "matiec", "lib"),
+            "/usr/lib/matiec"
+        ]
+        path = self.findObject(
+            paths, lambda p: os.path.isfile(os.path.join(p, "ieclib.txt")))
+        return path
+
+    def findLibCPath(self):
+        path = None
+        if self.ieclib_path is not None:
+            paths = [
+                os.path.join(self.ieclib_path, "C"),
+                self.ieclib_path]
+            path = self.findObject(
+                paths,
+                lambda p: os.path.isfile(os.path.join(p, "iec_types.h")))
+        return path
+
     def findSupportedOptions(self):
-        buildcmd = "\"%s\" -h"%(self.iec2c)
-        options =["-f", "-l", "-p"]
+        buildcmd = "\"%s\" -h" % (self.getCmd())
+        options = ["-f", "-l", "-p"]
 
         buildopt = ""
         try:
-            # Invoke compiler. Output files are listed to stdout, errors to stderr
-            status, result, err_result = ProcessLogger(self.logger, buildcmd,
-                no_stdout=True, no_stderr=True).spin()
-        except Exception,e:
+            # Invoke compiler.
+            # Output files are listed to stdout, errors to stderr
+            _status, result, _err_result = ProcessLogger(None, buildcmd,
+                                                         no_stdout=True,
+                                                         no_stderr=True).spin()
+        except Exception:
             return buildopt
 
         for opt in options:
@@ -121,6 +165,8 @@
         return buildopt
 
     def getCmd(self):
+        if self.iec2c is None:
+            self.iec2c = self.findCmd()
         return self.iec2c
 
     def getOptions(self):
@@ -136,9 +182,41 @@
             self.ieclib_c_path = self.findLibCPath()
         return self.ieclib_c_path
 
-iec2c_cfg = Iec2CSettings()
+
+def GetProjectControllerXSD():
+    XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
+    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+      <xsd:element name="BeremizRoot">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="TargetType">
+              <xsd:complexType>
+                <xsd:choice minOccurs="0">
+                """ + targets.GetTargetChoices() + """
+                </xsd:choice>
+              </xsd:complexType>
+            </xsd:element>""" + (("""
+            <xsd:element name="Libraries" minOccurs="0">
+              <xsd:complexType>
+              """ + "\n".join(['<xsd:attribute name=' +
+                               '"Enable_' + libname + '_Library" ' +
+                               'type="xsd:boolean" use="optional" default="' +
+                               ('true' if default else 'false') + '"/>'
+                               for libname, _lib, default in features.libraries]) + """
+              </xsd:complexType>
+            </xsd:element>""") if len(features.libraries) > 0 else '') + """
+          </xsd:sequence>
+          <xsd:attribute name="URI_location" type="xsd:string" use="optional" default=""/>
+          <xsd:attribute name="Disable_Extensions" type="xsd:boolean" use="optional" default="false"/>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:schema>
+    """
+    return XSD
+
 
 class ProjectController(ConfigTreeNode, PLCControler):
+
     """
     This class define Root object of the confnode tree.
     It is responsible of :
@@ -149,41 +227,19 @@
     - ...
 
     """
-
-    # For root object, available Children Types are modules of the confnode packages.
+    # For root object, available Children Types are modules of the confnode
+    # packages.
     CTNChildrenTypes = ExtractChildrenTypesFromCatalog(features.catalog)
-
-    XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
-    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-      <xsd:element name="BeremizRoot">
-        <xsd:complexType>
-          <xsd:sequence>
-            <xsd:element name="TargetType">
-              <xsd:complexType>
-                <xsd:choice minOccurs="0">
-                """+targets.GetTargetChoices()+"""
-                </xsd:choice>
-              </xsd:complexType>
-            </xsd:element>"""+(("""
-            <xsd:element name="Libraries" minOccurs="0">
-              <xsd:complexType>
-              """+"\n".join(['<xsd:attribute name='+
-                             '"Enable_'+ libname + '_Library" '+
-                             'type="xsd:boolean" use="optional" default="true"/>'
-                             for libname,lib in features.libraries])+"""
-              </xsd:complexType>
-            </xsd:element>""") if len(features.libraries)>0 else '') + """
-          </xsd:sequence>
-          <xsd:attribute name="URI_location" type="xsd:string" use="optional" default=""/>
-          <xsd:attribute name="Disable_Extensions" type="xsd:boolean" use="optional" default="false"/>
-        </xsd:complexType>
-      </xsd:element>
-    </xsd:schema>
-    """
+    XSD = GetProjectControllerXSD()
     EditorType = ProjectNodeEditor
+    iec2c_cfg = None
 
     def __init__(self, frame, logger):
         PLCControler.__init__(self)
+        ConfigTreeNode.__init__(self)
+
+        if ProjectController.iec2c_cfg is None:
+            ProjectController.iec2c_cfg = Iec2CSettings()
 
         self.MandatoryParams = None
         self._builder = None
@@ -195,9 +251,8 @@
 
         # Setup debug information
         self.IECdebug_datas = {}
-        self.IECdebug_lock = Lock()
-
-        self.DebugTimer=None
+
+        self.DebugTimer = None
         self.ResetIECProgramsAndVariables()
 
         # In both new or load scenario, no need to save
@@ -211,10 +266,9 @@
         # After __init__ root confnode is not valid
         self.ProjectPath = None
         self._setBuildPath(None)
-        self.DebugThread = None
         self.debug_break = False
         self.previous_plcstate = None
-        # copy ConfNodeMethods so that it can be later customized
+        # copy StatusMethods so that it can be later customized
         self.StatusMethods = [dic.copy() for dic in self.StatusMethods]
 
     def __del__(self):
@@ -224,9 +278,15 @@
 
     def LoadLibraries(self):
         self.Libraries = []
-        TypeStack=[]
-        for libname,clsname in features.libraries:
-            if self.BeremizRoot.Libraries is None or getattr(self.BeremizRoot.Libraries, "Enable_"+libname+"_Library"):
+        TypeStack = []
+        for libname, clsname, lib_enabled in features.libraries:
+            if self.BeremizRoot.Libraries is not None:
+                enable_attr = getattr(self.BeremizRoot.Libraries,
+                                      "Enable_" + libname + "_Library")
+                if enable_attr is not None:
+                    lib_enabled = enable_attr
+
+            if lib_enabled:
                 Lib = GetClassImporter(clsname)()(self, libname, TypeStack)
                 TypeStack.append(Lib.GetTypes())
                 self.Libraries.append(Lib)
@@ -244,7 +304,8 @@
             # Timer to pull PLC status
             self.StatusTimer = wx.Timer(self.AppFrame, -1)
             self.AppFrame.Bind(wx.EVT_TIMER,
-                self.PullPLCStatusProc, self.StatusTimer)
+                               self.PullPLCStatusProc,
+                               self.StatusTimer)
 
             if self._connector is not None:
                 frame.LogViewer.SetLogSource(self._connector)
@@ -253,7 +314,8 @@
             # Timer to dispatch debug values to consumers
             self.DispatchDebugValuesTimer = wx.Timer(self.AppFrame, -1)
             self.AppFrame.Bind(wx.EVT_TIMER,
-                self.DispatchDebugValuesProc, self.DispatchDebugValuesTimer)
+                               self.DispatchDebugValuesProc,
+                               self.DispatchDebugValuesTimer)
 
             self.RefreshConfNodesBlockLists()
 
@@ -262,14 +324,14 @@
             self.AppFrame.Unbind(wx.EVT_TIMER, self.StatusTimer)
             self.StatusTimer = None
             self.AppFrame = None
-
+            self.KillDebugThread()
         self.logger = logger
 
     def CTNName(self):
         return "Project"
 
     def CTNTestModified(self):
-         return self.ChangesToSave or not self.ProjectIsSaved()
+        return self.ChangesToSave or not self.ProjectIsSaved()
 
     def CTNFullName(self):
         return ""
@@ -278,10 +340,10 @@
         return self
 
     def GetIECLibPath(self):
-        return iec2c_cfg.getLibCPath()
+        return self.iec2c_cfg.getLibCPath()
 
     def GetIEC2cPath(self):
-        return iec2c_cfg.getCmd()
+        return self.iec2c_cfg.getCmd()
 
     def GetCurrentLocation(self):
         return ()
@@ -314,15 +376,17 @@
             target = self.Parser.CreateElement("TargetType", "BeremizRoot")
             temp_root.setTargetType(target)
             target_name = self.GetDefaultTargetName()
-            target.setcontent(self.Parser.CreateElement(target_name, "TargetType"))
+            target.setcontent(
+                self.Parser.CreateElement(target_name, "TargetType"))
         return target
 
-    def GetParamsAttributes(self, path = None):
+    def GetParamsAttributes(self, path=None):
         params = ConfigTreeNode.GetParamsAttributes(self, path)
         if params[0]["name"] == "BeremizRoot":
             for child in params[0]["children"]:
                 if child["name"] == "TargetType" and child["value"] == '':
-                    child.update(self.GetTarget().getElementInfos("TargetType"))
+                    child.update(
+                        self.GetTarget().getElementInfos("TargetType"))
         return params
 
     def SetParamsAttribute(self, path, value):
@@ -338,10 +402,11 @@
         if CheckPathPerm(self.ProjectPath):
             return True
         if self.AppFrame is not None:
-            dialog = wx.MessageDialog(self.AppFrame,
-                        _('You must have permission to work on the project\nWork on a project copy ?'),
-                        _('Error'),
-                        wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
+            dialog = wx.MessageDialog(
+                self.AppFrame,
+                _('You must have permission to work on the project\nWork on a project copy ?'),
+                _('Error'),
+                wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
             answer = dialog.ShowModal()
             dialog.Destroy()
             if answer == wx.ID_YES:
@@ -355,7 +420,8 @@
     def _getProjectFilesPath(self, project_path=None):
         if project_path is not None:
             return os.path.join(project_path, "project_files")
-        projectfiles_path = os.path.join(self.GetProjectPath(), "project_files")
+        projectfiles_path = os.path.join(
+            self.GetProjectPath(), "project_files")
         if not os.path.exists(projectfiles_path):
             os.mkdir(projectfiles_path)
         return projectfiles_path
@@ -364,6 +430,19 @@
         self.ProjectAddConfiguration(config_name)
         self.ProjectAddConfigurationResource(config_name, res_name)
 
+    def SetProjectDefaultConfiguration(self):
+        # Sets default task and instance for new project
+        config = self.Project.getconfiguration(
+            self.GetProjectMainConfigurationName())
+        resource = config.getresource()[0].getname()
+        config = config.getname()
+        resource_tagname = ComputeConfigurationResourceName(config, resource)
+        def_task = [
+            {'Priority': '0', 'Single': '', 'Interval': 'T#20ms', 'Name': 'task0', 'Triggering': 'Cyclic'}]
+        def_instance = [
+            {'Task': def_task[0].get('Name'), 'Type': self.GetProjectPouNames()[0], 'Name': 'instance0'}]
+        self.SetEditedResourceInfos(resource_tagname, def_task, def_instance)
+
     def NewProject(self, ProjectPath, BuildPath=None):
         """
         Create a new project in an empty folder
@@ -411,7 +490,8 @@
         if error is not None:
             if self.Project is not None:
                 (fname_err, lnum, src) = (("PLC",) + error)
-                self.logger.write_warning(XSDSchemaErrorMessage.format(a1 = fname_err, a2 = lnum, a3 = src))
+                self.logger.write_warning(
+                    XSDSchemaErrorMessage.format(a1=fname_err, a2=lnum, a3=src))
             else:
                 return error, False
         if len(self.GetProjectConfigNames()) == 0:
@@ -424,11 +504,11 @@
         self._setBuildPath(BuildPath)
         # If dir have already be made, and file exist
         if os.path.isdir(self.CTNPath()) and os.path.isfile(self.ConfNodeXmlFilePath()):
-            #Load the confnode.xml file into parameters members
+            # Load the confnode.xml file into parameters members
             result = self.LoadXMLParams()
             if result:
                 return result, False
-            #Load and init all the children
+            # Load and init all the children
             self.LoadChildren()
         self.RefreshConfNodesBlockLists()
         self.UpdateButtons()
@@ -468,14 +548,17 @@
     def CheckNewProjectPath(self, old_project_path, new_project_path):
         if old_project_path == new_project_path:
             message = (_("Save path is the same as path of a project! \n"))
-            dialog = wx.MessageDialog(self.AppFrame, message, _("Error"), wx.OK | wx.ICON_ERROR)
+            dialog = wx.MessageDialog(
+                self.AppFrame, message, _("Error"), wx.OK | wx.ICON_ERROR)
             dialog.ShowModal()
             return False
         else:
             plc_file = os.path.join(new_project_path, "plc.xml")
             if os.path.isfile(plc_file):
-                message = (_("Selected directory already contains another project. Overwrite? \n"))
-                dialog = wx.MessageDialog(self.AppFrame, message, _("Error"), wx.YES_NO | wx.ICON_ERROR)
+                message = (
+                    _("Selected directory already contains another project. Overwrite? \n"))
+                dialog = wx.MessageDialog(
+                    self.AppFrame, message, _("Error"), wx.YES_NO | wx.ICON_ERROR)
                 answer = dialog.ShowModal()
                 return answer == wx.ID_YES
         return True
@@ -483,7 +566,8 @@
     def SaveProject(self, from_project_path=None):
         if self.CheckProjectPathPerm(False):
             if from_project_path is not None:
-                old_projectfiles_path = self._getProjectFilesPath(from_project_path)
+                old_projectfiles_path = self._getProjectFilesPath(
+                    from_project_path)
                 if os.path.isdir(old_projectfiles_path):
                     shutil.copytree(old_projectfiles_path,
                                     self._getProjectFilesPath(self.ProjectPath))
@@ -498,7 +582,8 @@
             path = os.getenv("USERPROFILE")
         else:
             path = os.getenv("HOME")
-        dirdialog = wx.DirDialog(self.AppFrame , _("Choose a directory to save project"), path, wx.DD_NEW_DIR_BUTTON)
+        dirdialog = wx.DirDialog(
+            self.AppFrame, _("Choose a directory to save project"), path, wx.DD_NEW_DIR_BUTTON)
         answer = dirdialog.ShowModal()
         dirdialog.Destroy()
         if answer == wx.ID_OK:
@@ -513,24 +598,25 @@
 
     def GetLibrariesTypes(self):
         self.LoadLibraries()
-        return [ lib.GetTypes() for lib in self.Libraries ]
+        return [lib.GetTypes() for lib in self.Libraries]
 
     def GetLibrariesSTCode(self):
-        return "\n".join([ lib.GetSTCode() for lib in self.Libraries ])
+        return "\n".join([lib.GetSTCode() for lib in self.Libraries])
 
     def GetLibrariesCCode(self, buildpath):
-        if len(self.Libraries)==0:
-            return [],[],()
+        if len(self.Libraries) == 0:
+            return [], [], ()
         self.GetIECProgramsAndVariables()
-        LibIECCflags = '"-I%s" -Wno-unused-function'%os.path.abspath(self.GetIECLibPath())
-        LocatedCCodeAndFlags=[]
-        Extras=[]
+        LibIECCflags = '"-I%s" -Wno-unused-function' % os.path.abspath(
+            self.GetIECLibPath())
+        LocatedCCodeAndFlags = []
+        Extras = []
         for lib in self.Libraries:
-            res=lib.Generate_C(buildpath,self._VariablesList,LibIECCflags)
+            res = lib.Generate_C(buildpath, self._VariablesList, LibIECCflags)
             LocatedCCodeAndFlags.append(res[:2])
-            if len(res)>2:
+            if len(res) > 2:
                 Extras.extend(res[2:])
-        return map(list,zip(*LocatedCCodeAndFlags))+[tuple(Extras)]
+        return map(list, zip(*LocatedCCodeAndFlags)) + [tuple(Extras)]
 
     # Update PLCOpenEditor ConfNode Block types from loaded confnodes
     def RefreshConfNodesBlockLists(self):
@@ -567,7 +653,7 @@
         return children
 
     def ConfNodePath(self):
-        return os.path.split(__file__)[0]
+        return paths.AbsDir(__file__)
 
     def CTNPath(self, CTNName=None):
         return self.ProjectPath
@@ -596,7 +682,8 @@
             self.DefaultBuildPath = os.path.join(self.ProjectPath, "build")
         # Create a build path in temp folder
         else:
-            self.DefaultBuildPath = os.path.join(tempfile.mkdtemp(), os.path.basename(self.ProjectPath), "build")
+            self.DefaultBuildPath = os.path.join(
+                tempfile.mkdtemp(), os.path.basename(self.ProjectPath), "build")
 
         if not os.path.exists(self.DefaultBuildPath):
             os.makedirs(self.DefaultBuildPath)
@@ -619,22 +706,26 @@
 
     def GetLocations(self):
         locations = []
-        filepath = os.path.join(self._getBuildPath(),"LOCATED_VARIABLES.h")
+        filepath = os.path.join(self._getBuildPath(), "LOCATED_VARIABLES.h")
         if os.path.isfile(filepath):
-            # IEC2C compiler generate a list of located variables : LOCATED_VARIABLES.h
-            location_file = open(os.path.join(self._getBuildPath(),"LOCATED_VARIABLES.h"))
+            # IEC2C compiler generate a list of located variables :
+            # LOCATED_VARIABLES.h
+            location_file = open(
+                os.path.join(self._getBuildPath(), "LOCATED_VARIABLES.h"))
             # each line of LOCATED_VARIABLES.h declares a located variable
             lines = [line.strip() for line in location_file.readlines()]
             # This regular expression parses the lines genereated by IEC2C
-            LOCATED_MODEL = re.compile("__LOCATED_VAR\((?P<IEC_TYPE>[A-Z]*),(?P<NAME>[_A-Za-z0-9]*),(?P<DIR>[QMI])(?:,(?P<SIZE>[XBWDL]))?,(?P<LOC>[,0-9]*)\)")
+            LOCATED_MODEL = re.compile(
+                r"__LOCATED_VAR\((?P<IEC_TYPE>[A-Z]*),(?P<NAME>[_A-Za-z0-9]*),(?P<DIR>[QMI])(?:,(?P<SIZE>[XBWDL]))?,(?P<LOC>[,0-9]*)\)")
             for line in lines:
                 # If line match RE,
                 result = LOCATED_MODEL.match(line)
                 if result:
                     # Get the resulting dict
                     resdict = result.groupdict()
-                    # rewrite string for variadic location as a tuple of integers
-                    resdict['LOC'] = tuple(map(int,resdict['LOC'].split(',')))
+                    # rewrite string for variadic location as a tuple of
+                    # integers
+                    resdict['LOC'] = tuple(map(int, resdict['LOC'].split(',')))
                     # set located size to 'X' if not given
                     if not resdict['SIZE']:
                         resdict['SIZE'] = 'X'
@@ -659,16 +750,20 @@
         # Update PLCOpenEditor ConfNode Block types before generate ST code
         self.RefreshConfNodesBlockLists()
 
-        self.logger.write(_("Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"))
+        self.logger.write(
+            _("Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"))
         # ask PLCOpenEditor controller to write ST/IL/SFC code file
-        program, errors, warnings = self.GenerateProgram(self._getIECgeneratedcodepath())
+        _program, errors, warnings = self.GenerateProgram(
+            self._getIECgeneratedcodepath())
         if len(warnings) > 0:
-            self.logger.write_warning(_("Warnings in ST/IL/SFC code generator :\n"))
+            self.logger.write_warning(
+                _("Warnings in ST/IL/SFC code generator :\n"))
             for warning in warnings:
-                self.logger.write_warning("%s\n"%warning)
+                self.logger.write_warning("%s\n" % warning)
         if len(errors) > 0:
             # Failed !
-            self.logger.write_error(_("Error in ST/IL/SFC code generator :\n%s\n")%errors[0])
+            self.logger.write_error(
+                _("Error in ST/IL/SFC code generator :\n%s\n") % errors[0])
             return False
         plc_file = open(self._getIECcodepath(), "w")
         # Add ST Library from confnodes
@@ -679,7 +774,7 @@
         plc_file.close()
         plc_file = open(self._getIECcodepath(), "r")
         self.ProgramOffset = 0
-        for line in plc_file.xreadlines():
+        for dummy in plc_file.readlines():
             self.ProgramOffset += 1
         plc_file.close()
         plc_file = open(self._getIECcodepath(), "a")
@@ -687,23 +782,28 @@
         plc_file.close()
         return True
 
-
-
     def _Compile_ST_to_SoftPLC(self):
+        iec2c_libpath = self.iec2c_cfg.getLibPath()
+        if iec2c_libpath is None:
+            self.logger.write_error(_("matiec installation is not found\n"))
+            return False
+
         self.logger.write(_("Compiling IEC Program into C code...\n"))
         buildpath = self._getBuildPath()
-        buildcmd = "\"%s\" %s -I \"%s\" -T \"%s\" \"%s\""%(
-                         iec2c_cfg.getCmd(),
-                         iec2c_cfg.getOptions(),
-                         iec2c_cfg.getLibPath(),
-                         buildpath,
-                         self._getIECcodepath())
+        buildcmd = "\"%s\" %s -I \"%s\" -T \"%s\" \"%s\"" % (
+            self.iec2c_cfg.getCmd(),
+            self.iec2c_cfg.getOptions(),
+            iec2c_libpath,
+            buildpath,
+            self._getIECcodepath())
 
         try:
-            # Invoke compiler. Output files are listed to stdout, errors to stderr
+            # Invoke compiler.
+            # Output files are listed to stdout, errors to stderr
             status, result, err_result = ProcessLogger(self.logger, buildcmd,
-                no_stdout=True, no_stderr=True).spin()
-        except Exception,e:
+                                                       no_stdout=True,
+                                                       no_stderr=True).spin()
+        except Exception as e:
             self.logger.write_error(buildcmd + "\n")
             self.logger.write_error(repr(e) + "\n")
             return False
@@ -718,7 +818,7 @@
 
                 m_result = MATIEC_ERROR_MODEL.match(err_line)
                 if m_result is not None:
-                    first_line, first_column, last_line, last_column, error = m_result.groups()
+                    first_line, _first_column, last_line, _last_column, _error = m_result.groups()
                     first_line, last_line = int(first_line), int(last_line)
 
                     last_section = None
@@ -731,40 +831,50 @@
 
                         if first_line <= i <= last_line:
                             if last_section is not None:
-                                self.logger.write_warning("In section: " + last_section)
-                                last_section = None # only write section once
+                                self.logger.write_warning(
+                                    "In section: " + last_section)
+                                last_section = None  # only write section once
                             self.logger.write_warning("%04d: %s" % (i, line))
 
                     f.close()
 
-            self.logger.write_error(_("Error : IEC to C compiler returned %d\n")%status)
+            self.logger.write_error(
+                _("Error : IEC to C compiler returned %d\n") % status)
             return False
 
         # Now extract C files of stdout
-        C_files = [ fname for fname in result.splitlines() if fname[-2:]==".c" or fname[-2:]==".C" ]
+        C_files = [fname for fname in result.splitlines() if fname[
+            -2:] == ".c" or fname[-2:] == ".C"]
         # remove those that are not to be compiled because included by others
         C_files.remove("POUS.c")
         if not C_files:
-            self.logger.write_error(_("Error : At least one configuration and one resource must be declared in PLC !\n"))
+            self.logger.write_error(
+                _("Error : At least one configuration and one resource must be declared in PLC !\n"))
             return False
         # transform those base names to full names with path
-        C_files = map(lambda filename:os.path.join(buildpath, filename), C_files)
+        C_files = map(
+            lambda filename: os.path.join(buildpath, filename), C_files)
 
         # prepend beremiz include to configuration header
-        H_files = [ fname for fname in result.splitlines() if fname[-2:]==".h" or fname[-2:]==".H" ]
+        H_files = [fname for fname in result.splitlines() if fname[
+            -2:] == ".h" or fname[-2:] == ".H"]
         H_files.remove("LOCATED_VARIABLES.h")
-        H_files = map(lambda filename:os.path.join(buildpath, filename), H_files)
+        H_files = map(
+            lambda filename: os.path.join(buildpath, filename), H_files)
         for H_file in H_files:
-            with file(H_file, 'r') as original: data = original.read()
-            with file(H_file, 'w') as modified: modified.write('#include "beremiz.h"\n' + data)
+            with open(H_file, 'r') as original:
+                data = original.read()
+            with open(H_file, 'w') as modified:
+                modified.write('#include "beremiz.h"\n' + data)
 
         self.logger.write(_("Extracting Located Variables...\n"))
-        # Keep track of generated located variables for later use by self._Generate_C
+        # Keep track of generated located variables for later use by
+        # self._Generate_C
         self.PLCGeneratedLocatedVars = self.GetLocations()
         # Keep track of generated C files for later use by self.CTNGenerate_C
         self.PLCGeneratedCFiles = C_files
         # compute CFLAGS for plc
-        self.plcCFLAGS = '"-I%s" -Wno-unused-function'%iec2c_cfg.getLibCPath()
+        self.plcCFLAGS = '"-I%s" -Wno-unused-function' % self.iec2c_cfg.getLibCPath()
         return True
 
     def GetBuilder(self):
@@ -776,29 +886,16 @@
         targetclass = targets.GetBuilder(targetname)
 
         # if target already
-        if self._builder is None or not isinstance(self._builder,targetclass):
+        if self._builder is None or not isinstance(self._builder, targetclass):
             # Get classname instance
             self._builder = targetclass(self)
         return self._builder
 
-    def ResetBuildMD5(self):
-        builder=self.GetBuilder()
-        if builder is not None:
-            builder.ResetBinaryCodeMD5()
-        self.EnableMethod("_Transfer", False)
-
-    def GetLastBuildMD5(self):
-        builder=self.GetBuilder()
-        if builder is not None:
-            return builder.GetBinaryCodeMD5()
-        else:
-            return None
-
-    #######################################################################
+    #
     #
     #                C CODE GENERATION METHODS
     #
-    #######################################################################
+    #
 
     def CTNGenerate_C(self, buildpath, locations):
         """
@@ -809,9 +906,9 @@
         """
 
         return ([(C_file_name, self.plcCFLAGS)
-                for C_file_name in self.PLCGeneratedCFiles ],
-               "", # no ldflags
-               False) # do not expose retreive/publish calls
+                 for C_file_name in self.PLCGeneratedCFiles],
+                "",  # no ldflags
+                False)  # do not expose retreive/publish calls
 
     def ResetIECProgramsAndVariables(self):
         """
@@ -834,10 +931,11 @@
         """
         if self._ProgramList is None or self._VariablesList is None:
             try:
-                csvfile = os.path.join(self._getBuildPath(),"VARIABLES.csv")
+                csvfile = os.path.join(self._getBuildPath(), "VARIABLES.csv")
                 # describes CSV columns
                 ProgramsListAttributeName = ["num", "C_path", "type"]
-                VariablesListAttributeName = ["num", "vartype", "IEC_path", "C_path", "type"]
+                VariablesListAttributeName = [
+                    "num", "vartype", "IEC_path", "C_path", "type"]
                 self._ProgramList = []
                 self._VariablesList = []
                 self._DbgVariablesList = []
@@ -845,7 +943,7 @@
 
                 # Separate sections
                 ListGroup = []
-                for line in open(csvfile,'r').xreadlines():
+                for line in open(csvfile, 'r').readlines():
                     strippedline = line.strip()
                     if strippedline.startswith("//"):
                         # Start new section
@@ -857,9 +955,11 @@
                 # first section contains programs
                 for line in ListGroup[0]:
                     # Split and Maps each field to dictionnary entries
-                    attrs = dict(zip(ProgramsListAttributeName,line.strip().split(';')))
-                    # Truncate "C_path" to remove conf an ressources names
-                    attrs["C_path"] = '__'.join(attrs["C_path"].split(".",2)[1:])
+                    attrs = dict(
+                        zip(ProgramsListAttributeName, line.strip().split(';')))
+                    # Truncate "C_path" to remove conf an resources names
+                    attrs["C_path"] = '__'.join(
+                        attrs["C_path"].split(".", 2)[1:])
                     # Push this dictionnary into result.
                     self._ProgramList.append(attrs)
 
@@ -868,9 +968,10 @@
                 Idx = 0
                 for line in ListGroup[1]:
                     # Split and Maps each field to dictionnary entries
-                    attrs = dict(zip(VariablesListAttributeName,line.strip().split(';')))
-                    # Truncate "C_path" to remove conf an ressources names
-                    parts = attrs["C_path"].split(".",2)
+                    attrs = dict(
+                        zip(VariablesListAttributeName, line.strip().split(';')))
+                    # Truncate "C_path" to remove conf an resources names
+                    parts = attrs["C_path"].split(".", 2)
                     if len(parts) > 2:
                         config_FB = config_FBs.get(tuple(parts[:2]))
                         if config_FB:
@@ -886,20 +987,21 @@
                         # Push this dictionnary into result.
                         self._DbgVariablesList.append(attrs)
                         # Fill in IEC<->C translation dicts
-                        IEC_path=attrs["IEC_path"]
-                        self._IECPathToIdx[IEC_path]=(Idx, attrs["type"])
+                        IEC_path = attrs["IEC_path"]
+                        self._IECPathToIdx[IEC_path] = (Idx, attrs["type"])
                         # Ignores numbers given in CSV file
                         # Idx=int(attrs["num"])
                         # Count variables only, ignore FBs
-                        Idx+=1
+                        Idx += 1
                     self._VariablesList.append(attrs)
 
                 # third section contains ticktime
                 if len(ListGroup) > 2:
                     self._Ticktime = int(ListGroup[2][0])
 
-            except Exception,e:
-                self.logger.write_error(_("Cannot open/parse VARIABLES.csv!\n"))
+            except Exception:
+                self.logger.write_error(
+                    _("Cannot open/parse VARIABLES.csv!\n"))
                 self.logger.write_error(traceback.format_exc())
                 self.ResetIECProgramsAndVariables()
                 return False
@@ -915,31 +1017,35 @@
         # prepare debug code
         variable_decl_array = []
         bofs = 0
-        for v in self._DbgVariablesList :
+        for v in self._DbgVariablesList:
             sz = DebugTypesSize.get(v["type"], 0)
             variable_decl_array += [
-                "{&(%(C_path)s), "%v+
-                {"EXT":"%(type)s_P_ENUM",
-                 "IN":"%(type)s_P_ENUM",
-                 "MEM":"%(type)s_O_ENUM",
-                 "OUT":"%(type)s_O_ENUM",
-                 "VAR":"%(type)s_ENUM"}[v["vartype"]]%v +
-                 "}"]
+                "{&(%(C_path)s), " % v +
+                {
+                    "EXT": "%(type)s_P_ENUM",
+                    "IN":  "%(type)s_P_ENUM",
+                    "MEM": "%(type)s_O_ENUM",
+                    "OUT": "%(type)s_O_ENUM",
+                    "VAR": "%(type)s_ENUM"
+                }[v["vartype"]] % v +
+                "}"]
             bofs += sz
         debug_code = targets.GetCode("plc_debug.c") % {
-           "buffer_size":bofs,
-           "programs_declarations":
-               "\n".join(["extern %(type)s %(C_path)s;"%p for p in self._ProgramList]),
-           "extern_variables_declarations":"\n".join([
-              {"EXT":"extern __IEC_%(type)s_p %(C_path)s;",
-               "IN":"extern __IEC_%(type)s_p %(C_path)s;",
-               "MEM":"extern __IEC_%(type)s_p %(C_path)s;",
-               "OUT":"extern __IEC_%(type)s_p %(C_path)s;",
-               "VAR":"extern __IEC_%(type)s_t %(C_path)s;",
-               "FB":"extern %(type)s %(C_path)s;"}[v["vartype"]]%v
-               for v in self._VariablesList if v["C_path"].find('.')<0]),
-           "variable_decl_array": ",\n".join(variable_decl_array)
-           }
+            "buffer_size": bofs,
+            "programs_declarations": "\n".join(["extern %(type)s %(C_path)s;" %
+                                                p for p in self._ProgramList]),
+            "extern_variables_declarations": "\n".join([
+                {
+                    "EXT": "extern __IEC_%(type)s_p %(C_path)s;",
+                    "IN":  "extern __IEC_%(type)s_p %(C_path)s;",
+                    "MEM": "extern __IEC_%(type)s_p %(C_path)s;",
+                    "OUT": "extern __IEC_%(type)s_p %(C_path)s;",
+                    "VAR": "extern __IEC_%(type)s_t %(C_path)s;",
+                    "FB":  "extern       %(type)s   %(C_path)s;"
+                }[v["vartype"]] % v
+                for v in self._VariablesList if v["C_path"].find('.') < 0]),
+            "variable_decl_array": ",\n".join(variable_decl_array)
+        }
 
         return debug_code
 
@@ -950,43 +1056,44 @@
         """
         # filter location that are related to code that will be called
         # in retreive, publish, init, cleanup
-        locstrs = map(lambda x:"_".join(map(str,x)),
-           [loc for loc,Cfiles,DoCalls in self.LocationCFilesAndCFLAGS if loc and DoCalls])
+        locstrs = map(lambda x: "_".join(map(str, x)),
+                      [loc for loc, _Cfiles, DoCalls in
+                       self.LocationCFilesAndCFLAGS if loc and DoCalls])
 
         # Generate main, based on template
         if not self.BeremizRoot.getDisable_Extensions():
             plc_main_code = targets.GetCode("plc_main_head.c") % {
-                "calls_prototypes":"\n".join([(
-                      "int __init_%(s)s(int argc,char **argv);\n"+
-                      "void __cleanup_%(s)s(void);\n"+
-                      "void __retrieve_%(s)s(void);\n"+
-                      "void __publish_%(s)s(void);")%{'s':locstr} for locstr in locstrs]),
-                "retrieve_calls":"\n    ".join([
-                      "__retrieve_%s();"%locstr for locstr in locstrs]),
-                "publish_calls":"\n    ".join([ #Call publish in reverse order
-                      "__publish_%s();"%locstrs[i-1] for i in xrange(len(locstrs), 0, -1)]),
-                "init_calls":"\n    ".join([
-                      "init_level=%d; "%(i+1)+
-                      "if((res = __init_%s(argc,argv))){"%locstr +
-                      #"printf(\"%s\"); "%locstr + #for debug
-                      "return res;}" for i,locstr in enumerate(locstrs)]),
-                "cleanup_calls":"\n    ".join([
-                      "if(init_level >= %d) "%i+
-                      "__cleanup_%s();"%locstrs[i-1] for i in xrange(len(locstrs), 0, -1)])
-                }
+                "calls_prototypes": "\n".join([(
+                    "int __init_%(s)s(int argc,char **argv);\n" +
+                    "void __cleanup_%(s)s(void);\n" +
+                    "void __retrieve_%(s)s(void);\n" +
+                    "void __publish_%(s)s(void);") % {'s': locstr} for locstr in locstrs]),
+                "retrieve_calls": "\n    ".join([
+                    "__retrieve_%s();" % locstr for locstr in locstrs]),
+                "publish_calls": "\n    ".join([  # Call publish in reverse order
+                    "__publish_%s();" % locstrs[i - 1] for i in xrange(len(locstrs), 0, -1)]),
+                "init_calls": "\n    ".join([
+                    "init_level=%d; " % (i + 1) +
+                    "if((res = __init_%s(argc,argv))){" % locstr +
+                    # "printf(\"%s\"); "%locstr + #for debug
+                    "return res;}" for i, locstr in enumerate(locstrs)]),
+                "cleanup_calls": "\n    ".join([
+                    "if(init_level >= %d) " % i +
+                    "__cleanup_%s();" % locstrs[i - 1] for i in xrange(len(locstrs), 0, -1)])
+            }
         else:
             plc_main_code = targets.GetCode("plc_main_head.c") % {
-                "calls_prototypes":"\n",
-                "retrieve_calls":"\n",
-                "publish_calls":"\n",
-                "init_calls":"\n",
-                "cleanup_calls":"\n"
-                }
-        plc_main_code += targets.GetTargetCode(self.GetTarget().getcontent().getLocalTag())
+                "calls_prototypes": "\n",
+                "retrieve_calls":   "\n",
+                "publish_calls":    "\n",
+                "init_calls":       "\n",
+                "cleanup_calls":    "\n"
+            }
+        plc_main_code += targets.GetTargetCode(
+            self.GetTarget().getcontent().getLocalTag())
         plc_main_code += targets.GetCode("plc_main_tail.c")
         return plc_main_code
 
-
     def _Build(self):
         """
         Method called by user to (re)build SoftPLC and confnode tree
@@ -1011,7 +1118,6 @@
         # If IEC code gen fail, bail out.
         if not IECGenRes:
             self.logger.write_error(_("PLC code generation failed !\n"))
-            self.ResetBuildMD5()
             return False
 
         # Reset variable and program list that are parsed from
@@ -1027,18 +1133,17 @@
         builder = self.GetBuilder()
         if builder is None:
             self.logger.write_error(_("Fatal : cannot get builder.\n"))
-            self.ResetBuildMD5()
             return False
 
         # Build
         try:
-            if not builder.build() :
+            if not builder.build():
                 self.logger.write_error(_("C Build failed.\n"))
                 return False
-        except Exception, exc:
+        except Exception:
+            builder.ResetBinaryMD5()
             self.logger.write_error(_("C Build crashed !\n"))
             self.logger.write_error(traceback.format_exc())
-            self.ResetBuildMD5()
             return False
 
         self.logger.write(_("Successfully built.\n"))
@@ -1054,22 +1159,24 @@
             CTNLocationCFilesAndCFLAGS, CTNLDFLAGS, CTNExtraFiles = self._Generate_C(
                 buildpath,
                 self.PLCGeneratedLocatedVars)
-        except Exception, exc:
-            self.logger.write_error(_("Runtime IO extensions C code generation failed !\n"))
+        except Exception:
+            self.logger.write_error(
+                _("Runtime IO extensions C code generation failed !\n"))
             self.logger.write_error(traceback.format_exc())
-            self.ResetBuildMD5()
             return False
 
         # Generate C code and compilation params from liraries
         try:
-            LibCFilesAndCFLAGS, LibLDFLAGS, LibExtraFiles = self.GetLibrariesCCode(buildpath)
-        except Exception, exc:
-            self.logger.write_error(_("Runtime library extensions C code generation failed !\n"))
+            LibCFilesAndCFLAGS, LibLDFLAGS, LibExtraFiles = self.GetLibrariesCCode(
+                buildpath)
+        except Exception:
+            self.logger.write_error(
+                _("Runtime library extensions C code generation failed !\n"))
             self.logger.write_error(traceback.format_exc())
-            self.ResetBuildMD5()
             return False
 
-        self.LocationCFilesAndCFLAGS =  LibCFilesAndCFLAGS + CTNLocationCFilesAndCFLAGS
+        self.LocationCFilesAndCFLAGS = LibCFilesAndCFLAGS + \
+            CTNLocationCFilesAndCFLAGS
         self.LDFLAGS = CTNLDFLAGS + LibLDFLAGS
         ExtraFiles = CTNExtraFiles + LibExtraFiles
 
@@ -1081,35 +1188,40 @@
         # Recreate directory
         os.mkdir(extrafilespath)
         # Then write the files
-        for fname,fobject in ExtraFiles:
-            fpath = os.path.join(extrafilespath,fname)
+        for fname, fobject in ExtraFiles:
+            fpath = os.path.join(extrafilespath, fname)
             open(fpath, "wb").write(fobject.read())
         # Now we can forget ExtraFiles (will close files object)
         del ExtraFiles
 
         # Header file for extensions
-        open(os.path.join(buildpath,"beremiz.h"), "w").write(targets.GetHeader())
+        open(os.path.join(buildpath, "beremiz.h"), "w").write(
+            targets.GetHeader())
 
         # Template based part of C code generation
         # files are stacked at the beginning, as files of confnode tree root
-        for generator, filename, name in [
-           # debugger code
-           (self.Generate_plc_debugger, "plc_debugger.c", "Debugger"),
-           # init/cleanup/retrieve/publish, run and align code
-           (self.Generate_plc_main,"plc_main.c","Common runtime")]:
+        c_source = [
+            #  debugger code
+            (self.Generate_plc_debugger, "plc_debugger.c", "Debugger"),
+            # init/cleanup/retrieve/publish, run and align code
+            (self.Generate_plc_main, "plc_main.c", "Common runtime")
+        ]
+
+        for generator, filename, name in c_source:
             try:
                 # Do generate
                 code = generator()
                 if code is None:
-                     raise
-                code_path = os.path.join(buildpath,filename)
+                    raise Exception
+                code_path = os.path.join(buildpath, filename)
                 open(code_path, "w").write(code)
-                # Insert this file as first file to be compiled at root confnode
-                self.LocationCFilesAndCFLAGS[0][1].insert(0,(code_path, self.plcCFLAGS))
-            except Exception, exc:
-                self.logger.write_error(name+_(" generation failed !\n"))
+                # Insert this file as first file to be compiled at root
+                # confnode
+                self.LocationCFilesAndCFLAGS[0][1].insert(
+                    0, (code_path, self.plcCFLAGS))
+            except Exception:
+                self.logger.write_error(name + _(" generation failed !\n"))
                 self.logger.write_error(traceback.format_exc())
-                self.ResetBuildMD5()
                 return False
         self.logger.write(_("C code generated successfully.\n"))
         return True
@@ -1117,30 +1229,43 @@
     def ShowError(self, logger, from_location, to_location):
         chunk_infos = self.GetChunkInfos(from_location, to_location)
         for infos, (start_row, start_col) in chunk_infos:
-            row = 1 if from_location[0] < start_row else (from_location[0] - start_row)            
-            col = 1 if (start_row != from_location[0]) else (from_location[1] - start_col)
+            row = 1 if from_location[0] < start_row else (
+                from_location[0] - start_row)
+            col = 1 if (start_row != from_location[0]) else (
+                from_location[1] - start_col)
             start = (row, col)
 
-            row = 1 if to_location[0] < start_row else (to_location[0] - start_row)            
-            col = 1 if (start_row != to_location[0]) else (to_location[1] - start_col)
+            row = 1 if to_location[0] < start_row else (
+                to_location[0] - start_row)
+            col = 1 if (start_row != to_location[0]) else (
+                to_location[1] - start_col)
             end = (row, col)
-            
+
             if self.AppFrame is not None:
                 self.AppFrame.ShowError(infos, start, end)
 
     _IECCodeView = None
+
+    def _showIDManager(self):
+        dlg = IDManager(self.AppFrame, self)
+        dlg.ShowModal()
+        dlg.Destroy()
+
     def _showIECcode(self):
         self._OpenView("IEC code")
 
     _IECRawCodeView = None
+
     def _editIECrawcode(self):
         self._OpenView("IEC raw code")
 
     _ProjectFilesView = None
+
     def _OpenProjectFiles(self):
         self._OpenView("Project Files")
 
     _FileEditors = {}
+
     def _OpenFileEditor(self, filepath):
         self._OpenView(filepath)
 
@@ -1149,15 +1274,16 @@
             if self._IECCodeView is None:
                 plc_file = self._getIECcodepath()
 
-                self._IECCodeView = IECCodeViewer(self.AppFrame.TabsOpened, "", self.AppFrame, None, instancepath=name)
+                self._IECCodeView = IECCodeViewer(
+                    self.AppFrame.TabsOpened, "", self.AppFrame, None, instancepath=name)
                 self._IECCodeView.SetTextSyntax("ALL")
                 self._IECCodeView.SetKeywords(IEC_KEYWORDS)
                 try:
-                    text = file(plc_file).read()
-                except:
+                    text = open(plc_file).read()
+                except Exception:
                     text = '(* No IEC code have been generated at that time ! *)'
-                self._IECCodeView.SetText(text = text)
-                self._IECCodeView.Editor.SetReadOnly(True)                                
+                self._IECCodeView.SetText(text=text)
+                self._IECCodeView.Editor.SetReadOnly(True)
                 self._IECCodeView.SetIcon(GetBitmap("ST"))
                 setattr(self._IECCodeView, "_OnClose", self.OnCloseEditor)
 
@@ -1170,7 +1296,8 @@
             if self._IECRawCodeView is None:
                 controler = MiniTextControler(self._getIECrawcodepath(), self)
 
-                self._IECRawCodeView = IECCodeViewer(self.AppFrame.TabsOpened, "", self.AppFrame, controler, instancepath=name)
+                self._IECRawCodeView = IECCodeViewer(
+                    self.AppFrame.TabsOpened, "", self.AppFrame, controler, instancepath=name)
                 self._IECRawCodeView.SetTextSyntax("ALL")
                 self._IECRawCodeView.SetKeywords(IEC_KEYWORDS)
                 self._IECRawCodeView.RefreshView()
@@ -1184,10 +1311,11 @@
 
         elif name == "Project Files":
             if self._ProjectFilesView is None:
-                self._ProjectFilesView = FileManagementPanel(self.AppFrame.TabsOpened, self, name, self._getProjectFilesPath(), True)
+                self._ProjectFilesView = FileManagementPanel(
+                    self.AppFrame.TabsOpened, self, name, self._getProjectFilesPath(), True)
 
                 extensions = []
-                for extension, name, editor in features.file_editors:
+                for extension, _name, _editor in features.file_editors:
                     if extension not in extensions:
                         extensions.append(extension)
                 self._ProjectFilesView.SetEditableFileExtensions(extensions)
@@ -1199,7 +1327,7 @@
 
         elif name is not None and name.find("::") != -1:
             filepath, editor_name = name.split("::")
-            if not self._FileEditors.has_key(filepath):
+            if filepath not in self._FileEditors:
                 if os.path.isfile(filepath):
                     file_extension = os.path.splitext(filepath)[1]
 
@@ -1212,9 +1340,12 @@
                             editor_name = editors.keys()[0]
                         elif len(editors) > 0:
                             names = editors.keys()
-                            dialog = wx.SingleChoiceDialog(self.AppFrame,
-                                  _("Select an editor:"), _("Editor selection"),
-                                  names, wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
+                            dialog = wx.SingleChoiceDialog(
+                                self.AppFrame,
+                                _("Select an editor:"),
+                                _("Editor selection"),
+                                names,
+                                wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
                             if dialog.ShowModal() == wx.ID_OK:
                                 editor_name = names[dialog.GetSelection()]
                             dialog.Destroy()
@@ -1223,12 +1354,13 @@
                         name = "::".join([filepath, editor_name])
 
                         editor = editors[editor_name]()
-                        self._FileEditors[filepath] = editor(self.AppFrame.TabsOpened, self, name, self.AppFrame)
+                        self._FileEditors[filepath] = editor(
+                            self.AppFrame.TabsOpened, self, name, self.AppFrame)
                         self._FileEditors[filepath].SetIcon(GetBitmap("FILE"))
                         if isinstance(self._FileEditors[filepath], DebugViewer):
                             self._FileEditors[filepath].SetDataProducer(self)
 
-            if self._FileEditors.has_key(filepath):
+            if filepath in self._FileEditors:
                 editor = self._FileEditors[filepath]
                 self.AppFrame.EditProjectElement(editor, editor.GetTagName())
 
@@ -1264,16 +1396,40 @@
         self.ShowMethod("_showIECcode", os.path.isfile(self._getIECcodepath()))
         if self.AppFrame is not None and not self.UpdateMethodsFromPLCStatus():
             self.AppFrame.RefreshStatusToolBar()
-        
+
     def UpdateButtons(self):
         wx.CallAfter(self._UpdateButtons)
 
-        
     def UpdatePLCLog(self, log_count):
         if log_count:
             if self.AppFrame is not None:
                 self.AppFrame.LogViewer.SetLogCounters(log_count)
 
+    DefaultMethods = {
+        "_Run": False,
+        "_Stop": False,
+        "_Transfer": False,
+        "_Connect": True,
+        "_Disconnect": False
+    }
+
+    MethodsFromStatus = {
+        PlcStatus.Started:      {"_Stop": True,
+                                 "_Transfer": True,
+                                 "_Connect": False,
+                                 "_Disconnect": True},
+        PlcStatus.Stopped:      {"_Run": True,
+                                 "_Transfer": True,
+                                 "_Connect": False,
+                                 "_Disconnect": True},
+        PlcStatus.Empty:        {"_Transfer": True,
+                                 "_Connect": False,
+                                 "_Disconnect": True},
+        PlcStatus.Broken:       {"_Connect": False,
+                                 "_Disconnect": True},
+        PlcStatus.Disconnected: {},
+    }
+
     def UpdateMethodsFromPLCStatus(self):
         updated = False
         status = None
@@ -1284,49 +1440,32 @@
                 self.UpdatePLCLog(log_count)
         if status is None:
             self._SetConnector(None, False)
-            status = "Disconnected"
-        if(self.previous_plcstate != status):
-            for args in {
-                     "Started" :     [("_Run", False),
-                                      ("_Stop", True)],
-                     "Stopped" :     [("_Run", True),
-                                      ("_Stop", False)],
-                     "Empty" :       [("_Run", False),
-                                      ("_Stop", False)],
-                     "Broken" :      [],
-                     "Disconnected" :[("_Run", False),
-                                      ("_Stop", False),
-                                      ("_Transfer", False),
-                                      ("_Connect", True),
-                                      ("_Disconnect", False)],
-                   }.get(status,[]):
-                self.ShowMethod(*args)
+            status = PlcStatus.Disconnected
+        if self.previous_plcstate != status:
+            allmethods = self.DefaultMethods.copy()
+            allmethods.update(
+                self.MethodsFromStatus.get(status, {}))
+            for method, active in allmethods.items():
+                self.ShowMethod(method, active)
             self.previous_plcstate = status
             if self.AppFrame is not None:
                 updated = True
                 self.AppFrame.RefreshStatusToolBar()
-                if status == "Disconnected":
-                    self.AppFrame.ConnectionStatusBar.SetStatusText(self.GetTextStatus(status), 1)
+                if status == PlcStatus.Disconnected:
+                    self.AppFrame.ConnectionStatusBar.SetStatusText(
+                        _(status), 1)
                     self.AppFrame.ConnectionStatusBar.SetStatusText('', 2)
                 else:
                     self.AppFrame.ConnectionStatusBar.SetStatusText(
                         _("Connected to URI: %s") % self.BeremizRoot.getURI_location().strip(), 1)
-                    self.AppFrame.ConnectionStatusBar.SetStatusText(self.GetTextStatus(status), 2)
+                    self.AppFrame.ConnectionStatusBar.SetStatusText(
+                        _(status), 2)
         return updated
 
-    def GetTextStatus(self, status):
-        msgs = {
-            "Started":      _("Started"),
-            "Stopped":      _("Stopped"),
-            "Empty":        _("Empty"),
-            "Broken":       _("Broken"),
-            "Disconnected": _("Disconnected")
-            }
-        return msgs.get(status, status)
-    
-    def ShowPLCProgress(self, status = "", progress = 0):
+    def ShowPLCProgress(self, status="", progress=0):
         self.AppFrame.ProgressStatusBar.Show()
-        self.AppFrame.ConnectionStatusBar.SetStatusText(self.GetTextStatus(status), 1)
+        self.AppFrame.ConnectionStatusBar.SetStatusText(
+            _(status), 1)
         self.AppFrame.ProgressStatusBar.SetValue(progress)
 
     def HidePLCProgress(self):
@@ -1335,40 +1474,69 @@
         self.previous_plcstate = ""
         self.AppFrame.ProgressStatusBar.Hide()
         self.UpdateMethodsFromPLCStatus()
-            
+
     def PullPLCStatusProc(self, event):
         self.UpdateMethodsFromPLCStatus()
 
     def SnapshotAndResetDebugValuesBuffers(self):
+        if self._connector is not None:
+            plc_status, Traces = self._connector.GetTraceVariables()
+            # print [dict.keys() for IECPath, (dict, log, status, fvalue) in
+            # self.IECdebug_datas.items()]
+            if plc_status == PlcStatus.Started:
+                if len(Traces) > 0:
+                    for debug_tick, debug_buff in Traces:
+                        debug_vars = UnpackDebugBuffer(
+                            debug_buff, self.TracedIECTypes)
+                        if debug_vars is not None and len(debug_vars) == len(self.TracedIECPath):
+                            for IECPath, values_buffer, value in zip(
+                                    self.TracedIECPath,
+                                    self.DebugValuesBuffers,
+                                    debug_vars):
+                                IECdebug_data = self.IECdebug_datas.get(
+                                    IECPath, None)
+                                if IECdebug_data is not None and value is not None:
+                                    forced = IECdebug_data[2:4] == [
+                                        "Forced", value]
+                                    if not IECdebug_data[4] and len(values_buffer) > 0:
+                                        values_buffer[-1] = (value, forced)
+                                    else:
+                                        values_buffer.append((value, forced))
+                            self.DebugTicks.append(debug_tick)
+
         buffers, self.DebugValuesBuffers = (self.DebugValuesBuffers,
-            [list() for n in xrange(len(self.TracedIECPath))])
+                                            [list() for dummy in xrange(len(self.TracedIECPath))])
+
         ticks, self.DebugTicks = self.DebugTicks, []
+
         return ticks, buffers
 
     def RegisterDebugVarToConnector(self):
-        self.DebugTimer=None
+        self.DebugTimer = None
         Idxs = []
         self.TracedIECPath = []
         self.TracedIECTypes = []
         if self._connector is not None:
-            self.IECdebug_lock.acquire()
             IECPathsToPop = []
-            for IECPath,data_tuple in self.IECdebug_datas.iteritems():
-                WeakCallableDict, data_log, status, fvalue, buffer_list = data_tuple
+            for IECPath, data_tuple in self.IECdebug_datas.iteritems():
+                WeakCallableDict, _data_log, _status, fvalue, _buffer_list = data_tuple
                 if len(WeakCallableDict) == 0:
                     # Callable Dict is empty.
                     # This variable is not needed anymore!
                     IECPathsToPop.append(IECPath)
                 elif IECPath != "__tick__":
                     # Convert
-                    Idx, IEC_Type = self._IECPathToIdx.get(IECPath,(None,None))
+                    Idx, IEC_Type = self._IECPathToIdx.get(
+                        IECPath, (None, None))
                     if Idx is not None:
                         if IEC_Type in DebugTypesSize:
                             Idxs.append((Idx, IEC_Type, fvalue, IECPath))
                         else:
-                            self.logger.write_warning(_("Debug: Unsupported type to debug '%s'\n")%IEC_Type)
+                            self.logger.write_warning(
+                                _("Debug: Unsupported type to debug '%s'\n") % IEC_Type)
                     else:
-                        self.logger.write_warning(_("Debug: Unknown variable '%s'\n")%IECPath)
+                        self.logger.write_warning(
+                            _("Debug: Unknown variable '%s'\n") % IECPath)
             for IECPathToPop in IECPathsToPop:
                 self.IECdebug_datas.pop(IECPathToPop)
 
@@ -1382,10 +1550,9 @@
                 self.TracedIECPath = []
                 self._connector.SetTraceVariablesList([])
             self.SnapshotAndResetDebugValuesBuffers()
-            self.IECdebug_lock.release()
 
     def IsPLCStarted(self):
-        return self.previous_plcstate == "Started"
+        return self.previous_plcstate == PlcStatus.Started
 
     def ReArmDebugRegisterTimer(self):
         if self.DebugTimer is not None:
@@ -1396,13 +1563,15 @@
         # Links between PLC located variables and real variables are not ready
         if self.IsPLCStarted():
             # Timer to prevent rapid-fire when registering many variables
-            # use wx.CallAfter use keep using same thread. TODO : use wx.Timer instead
-            self.DebugTimer=Timer(0.5,wx.CallAfter,args = [self.RegisterDebugVarToConnector])
+            # use wx.CallAfter use keep using same thread. TODO : use wx.Timer
+            # instead
+            self.DebugTimer = Timer(
+                0.5, wx.CallAfter, args=[self.RegisterDebugVarToConnector])
             # Rearm anti-rapid-fire timer
             self.DebugTimer.start()
 
     def GetDebugIECVariableType(self, IECPath):
-        Idx, IEC_Type = self._IECPathToIdx.get(IECPath,(None,None))
+        _Idx, IEC_Type = self._IECPathToIdx.get(IECPath, (None, None))
         return IEC_Type
 
     def SubscribeDebugIECVariable(self, IECPath, callableobj, buffer_list=False):
@@ -1411,90 +1580,75 @@
         to a WeakKeyDictionary linking
         weakly referenced callables
         """
-        if IECPath != "__tick__" and not self._IECPathToIdx.has_key(IECPath):
+        if IECPath != "__tick__" and IECPath not in self._IECPathToIdx:
             return None
 
-        self.IECdebug_lock.acquire()
         # If no entry exist, create a new one with a fresh WeakKeyDictionary
         IECdebug_data = self.IECdebug_datas.get(IECPath, None)
         if IECdebug_data is None:
-            IECdebug_data  = [
-                    WeakKeyDictionary(), # Callables
-                    [],                  # Data storage [(tick, data),...]
-                    "Registered",        # Variable status
-                    None,
-                    buffer_list]                # Forced value
+            IECdebug_data = [
+                WeakKeyDictionary(),  # Callables
+                [],                   # Data storage [(tick, data),...]
+                "Registered",         # Variable status
+                None,
+                buffer_list]                # Forced value
             self.IECdebug_datas[IECPath] = IECdebug_data
         else:
             IECdebug_data[4] |= buffer_list
 
-        IECdebug_data[0][callableobj]=buffer_list
-
-        self.IECdebug_lock.release()
+        IECdebug_data[0][callableobj] = buffer_list
 
         self.ReArmDebugRegisterTimer()
 
         return IECdebug_data[1]
 
     def UnsubscribeDebugIECVariable(self, IECPath, callableobj):
-        self.IECdebug_lock.acquire()
         IECdebug_data = self.IECdebug_datas.get(IECPath, None)
         if IECdebug_data is not None:
-            IECdebug_data[0].pop(callableobj,None)
+            IECdebug_data[0].pop(callableobj, None)
             if len(IECdebug_data[0]) == 0:
                 self.IECdebug_datas.pop(IECPath)
             else:
                 IECdebug_data[4] = reduce(
-                    lambda x, y: x|y,
+                    lambda x, y: x | y,
                     IECdebug_data[0].itervalues(),
                     False)
-        self.IECdebug_lock.release()
 
         self.ReArmDebugRegisterTimer()
 
     def UnsubscribeAllDebugIECVariable(self):
-        self.IECdebug_lock.acquire()
         self.IECdebug_datas = {}
-        self.IECdebug_lock.release()
 
         self.ReArmDebugRegisterTimer()
 
     def ForceDebugIECVariable(self, IECPath, fvalue):
-        if not self.IECdebug_datas.has_key(IECPath):
+        if IECPath not in self.IECdebug_datas:
             return
 
-        self.IECdebug_lock.acquire()
-
         # If no entry exist, create a new one with a fresh WeakKeyDictionary
         IECdebug_data = self.IECdebug_datas.get(IECPath, None)
         IECdebug_data[2] = "Forced"
         IECdebug_data[3] = fvalue
 
-        self.IECdebug_lock.release()
-
         self.ReArmDebugRegisterTimer()
 
     def ReleaseDebugIECVariable(self, IECPath):
-        if not self.IECdebug_datas.has_key(IECPath):
+        if IECPath not in self.IECdebug_datas:
             return
 
-        self.IECdebug_lock.acquire()
-
         # If no entry exist, create a new one with a fresh WeakKeyDictionary
         IECdebug_data = self.IECdebug_datas.get(IECPath, None)
         IECdebug_data[2] = "Registered"
         IECdebug_data[3] = None
 
-        self.IECdebug_lock.release()
-
         self.ReArmDebugRegisterTimer()
 
     def CallWeakcallables(self, IECPath, function_name, *cargs):
         data_tuple = self.IECdebug_datas.get(IECPath, None)
         if data_tuple is not None:
-            WeakCallableDict, data_log, status, fvalue, buffer_list = data_tuple
-            #data_log.append((debug_tick, value))
-            for weakcallable,buffer_list in WeakCallableDict.iteritems():
+            WeakCallableDict, _data_log, _status, _fvalue, buffer_list = data_tuple
+            # data_log.append((debug_tick, value))
+            for weakcallable, buffer_list in WeakCallableDict.iteritems():
                 function = getattr(weakcallable, function_name, None)
                 if function is not None:
                     if buffer_list:
@@ -1510,79 +1664,26 @@
             return -1, "No runtime connected!"
         return self._connector.RemoteExec(script, **kwargs)
 
-    def DebugThreadProc(self):
-        """
-        This thread waid PLC debug data, and dispatch them to subscribers
-        """
-        self.debug_break = False
-        debug_getvar_retry = 0
-        while (not self.debug_break) and (self._connector is not None):
-            plc_status, Traces = self._connector.GetTraceVariables()
-            debug_getvar_retry += 1
-            #print [dict.keys() for IECPath, (dict, log, status, fvalue) in self.IECdebug_datas.items()]
-            if plc_status == "Started" :
-                if len(Traces) > 0:
-                    Failed = False
-                    self.IECdebug_lock.acquire()
-                    for debug_tick, debug_buff in Traces :
-                        debug_vars = UnpackDebugBuffer(debug_buff, self.TracedIECTypes)
-                        if (debug_vars is not None and
-                            len(debug_vars) == len(self.TracedIECPath)):
-                            for IECPath, values_buffer, value in izip(
-                                    self.TracedIECPath,
-                                    self.DebugValuesBuffers,
-                                    debug_vars):
-                                IECdebug_data = self.IECdebug_datas.get(IECPath, None) #FIXME get
-                                if IECdebug_data is not None and value is not None:
-                                    forced = IECdebug_data[2:4] == ["Forced", value]
-                                    if not IECdebug_data[4] and len(values_buffer) > 0:
-                                        values_buffer[-1] = (value, forced)
-                                    else:
-                                        values_buffer.append((value, forced))
-                            self.DebugTicks.append(debug_tick)
-                            debug_getvar_retry = 0
-                    self.IECdebug_lock.release()
-
-                if debug_getvar_retry != 0:
-                    # Be patient, tollerate PLC to come with fresh samples
-                    time.sleep(0.1)
-            else:
-                self.debug_break = True
-        self.logger.write(_("Debugger disabled\n"))
-        self.DebugThread = None
-        if self.DispatchDebugValuesTimer is not None:
-            self.DispatchDebugValuesTimer.Stop()
-
     def DispatchDebugValuesProc(self, event):
-        self.IECdebug_lock.acquire()
         debug_ticks, buffers = self.SnapshotAndResetDebugValuesBuffers()
-        self.IECdebug_lock.release()
         start_time = time.time()
         if len(self.TracedIECPath) == len(buffers):
-            for IECPath, values in izip(self.TracedIECPath, buffers):
+            for IECPath, values in zip(self.TracedIECPath, buffers):
                 if len(values) > 0:
-                    self.CallWeakcallables(IECPath, "NewValues", debug_ticks, values)
+                    self.CallWeakcallables(
+                        IECPath, "NewValues", debug_ticks, values)
             if len(debug_ticks) > 0:
-                self.CallWeakcallables("__tick__", "NewDataAvailable", debug_ticks)
+                self.CallWeakcallables(
+                    "__tick__", "NewDataAvailable", debug_ticks)
 
         delay = time.time() - start_time
         next_refresh = max(REFRESH_PERIOD - delay, 0.2 * delay)
-        if self.DispatchDebugValuesTimer is not None and self.DebugThread is not None:
+        if self.DispatchDebugValuesTimer is not None:
             self.DispatchDebugValuesTimer.Start(
                 int(next_refresh * 1000), oneShot=True)
         event.Skip()
 
     def KillDebugThread(self):
-        tmp_debugthread = self.DebugThread
-        self.debug_break = True
-        if tmp_debugthread is not None:
-            self.logger.writeyield(_("Stopping debugger...\n"))
-            tmp_debugthread.join(timeout=5)
-            if tmp_debugthread.isAlive() and self.logger:
-                self.logger.write_warning(_("Couldn't stop debugger.\n"))
-            else:
-                self.logger.write(_("Debugger stopped.\n"))
-        self.DebugThread = None
         if self.DispatchDebugValuesTimer is not None:
             self.DispatchDebugValuesTimer.Stop()
 
@@ -1594,9 +1695,6 @@
         if self.DispatchDebugValuesTimer is not None:
             self.DispatchDebugValuesTimer.Start(
                 int(REFRESH_PERIOD * 1000), oneShot=True)
-        if self.DebugThread is None:
-            self.DebugThread = Thread(target=self.DebugThreadProc)
-            self.DebugThread.start()
 
     def _Run(self):
         """
@@ -1618,7 +1716,7 @@
             self.logger.write_error(_("Couldn't stop PLC !\n"))
 
         # debugthread should die on his own
-        #self.KillDebugThread()
+        # self.KillDebugThread()
 
         wx.CallAfter(self.UpdateMethodsFromPLCStatus)
 
@@ -1641,24 +1739,22 @@
     def _Connect(self):
         # don't accept re-connetion if already connected
         if self._connector is not None:
-            self.logger.write_error(_("Already connected. Please disconnect\n"))
+            self.logger.write_error(
+                _("Already connected. Please disconnect\n"))
             return
 
         # Get connector uri
-        uri = self.\
-              BeremizRoot.\
-              getURI_location().\
-              strip()
+        uri = self.BeremizRoot.getURI_location().strip()
 
         # if uri is empty launch discovery dialog
         if uri == "":
             try:
                 # Launch Service Discovery dialog
-                dialog = DiscoveryDialog(self.AppFrame)
+                dialog = UriEditor(self.AppFrame, self)
                 answer = dialog.ShowModal()
                 uri = dialog.GetURI()
                 dialog.Destroy()
-            except:
+            except Exception:
                 self.logger.write_error(_("Local service discovery failed!\n"))
                 self.logger.write_error(traceback.format_exc())
                 uri = None
@@ -1668,9 +1764,7 @@
                 self.logger.write_error(_("Connection canceled!\n"))
                 return
             else:
-                self.\
-                BeremizRoot.\
-                setURI_location(uri)
+                self.BeremizRoot.setURI_location(uri)
                 self.ChangesToSave = True
                 if self._View is not None:
                     self._View.RefreshView()
@@ -1683,71 +1777,72 @@
         # Get connector from uri
         try:
             self._SetConnector(connectors.ConnectorFactory(uri, self))
-        except Exception, msg:
-            self.logger.write_error(_("Exception while connecting %s!\n")%uri)
-            self.logger.write_error(traceback.format_exc())
+        except Exception as e:
+            self.logger.write_error(
+                _("Exception while connecting to '%s': %s\n") % (uri, str(e)))
+            #self.logger.write_error(traceback.format_exc())
 
         # Did connection success ?
         if self._connector is None:
             # Oups.
-            self.logger.write_error(_("Connection failed to %s!\n")%uri)
+            self.logger.write_error(_("Connection failed to %s!\n") % uri)
         else:
-            self.ShowMethod("_Connect", False)
-            self.ShowMethod("_Disconnect", True)
-            self.ShowMethod("_Transfer", True)
-
             self.CompareLocalAndRemotePLC()
 
             # Init with actual PLC status and print it
             self.UpdateMethodsFromPLCStatus()
-            if self.previous_plcstate is not None:
-                status = _(self.previous_plcstate)
-            else:
-                status = ""
-
-            #self.logger.write(_("PLC is %s\n")%status)
-
-            if self.previous_plcstate in ["Started","Stopped"]:
+            if self.previous_plcstate in [PlcStatus.Started, PlcStatus.Stopped]:
                 if self.DebugAvailable() and self.GetIECProgramsAndVariables():
                     self.logger.write(_("Debugger ready\n"))
                     self._connect_debug()
                 else:
-                    self.logger.write_warning(_("Debug does not match PLC - stop/transfert/start to re-enable\n"))
+                    self.logger.write_warning(
+                        _("Debug does not match PLC - stop/transfert/start to re-enable\n"))
 
     def CompareLocalAndRemotePLC(self):
         if self._connector is None:
             return
-        # We are now connected. Update button status
-        MD5 = self.GetLastBuildMD5()
+        builder = self.GetBuilder()
+        if builder is None :
+            return
+        MD5 = builder.GetBinaryMD5()
+        if MD5 is None:
+            return
         # Check remote target PLC correspondance to that md5
-        if MD5 is not None:
-            if not self._connector.MatchMD5(MD5):
-#                self.logger.write_warning(
-#                   _("Latest build does not match with target, please transfer.\n"))
-                self.EnableMethod("_Transfer", True)
-            else:
-#                self.logger.write(
-#                   _("Latest build matches target, no transfer needed.\n"))
-                self.EnableMethod("_Transfer", True)
-                # warns controller that program match
-                self.ProgramTransferred()
-                #self.EnableMethod("_Transfer", False)
+        if self._connector.MatchMD5(MD5):
+            self.logger.write(
+                _("Latest build matches with connected target.\n"))
+            self.ProgramTransferred()
         else:
-#            self.logger.write_warning(
-#                _("Cannot compare latest build to target. Please build.\n"))
-            self.EnableMethod("_Transfer", False)
-
+            self.logger.write(
+                _("Latest build does not match with connected target.\n"))
 
     def _Disconnect(self):
         self._SetConnector(None)
 
     def _Transfer(self):
-        # Get the last build PLC's
-        MD5 = self.GetLastBuildMD5()
+        if self.IsPLCStarted():
+            dialog = wx.MessageDialog(
+                self.AppFrame,
+                _("Cannot transfer while PLC is running. Stop it now?"),
+                style=wx.YES_NO | wx.CENTRE)
+            if dialog.ShowModal() == wx.ID_YES:
+                self._Stop()
+            else:
+                return
+
+        builder = self.GetBuilder()
+        if builder is None:
+            self.logger.write_error(_("Fatal : cannot get builder.\n"))
+            return False
+
+        # recover md5 from last build 
+        MD5 = builder.GetBinaryMD5()
 
         # Check if md5 file is empty : ask user to build PLC
-        if MD5 is None :
-            self.logger.write_error(_("Failed : Must build before transfer.\n"))
+        if MD5 is None:
+            self.logger.write_error(
+                _("Failed : Must build before transfer.\n"))
             return False
 
         # Compare PLC project with PLC on target
@@ -1755,104 +1850,137 @@
             self.logger.write(
                 _("Latest build already matches current target. Transfering anyway...\n"))
 
-        # Get temprary directory path
+        # purge any non-finished transfer
+        # note: this would abord any runing transfer with error
+        self._connector.PurgeBlobs()
+
+        # transfer extra files
         extrafiles = []
         for extrafilespath in [self._getExtraFilesPath(),
                                self._getProjectFilesPath()]:
 
-            extrafiles.extend(
-                     [(name, open(os.path.join(extrafilespath, name),
-                                  'rb').read()) \
-                      for name in os.listdir(extrafilespath)])
+            for name in os.listdir(extrafilespath):
+                extrafiles.append((
+                    name, 
+                    self._connector.BlobFromFile(
+                        os.path.join(extrafilespath, name))))
 
         # Send PLC on target
-        builder = self.GetBuilder()
-        if builder is not None:
-            data = builder.GetBinaryCode()
-            if data is not None :
-                if self._connector.NewPLC(MD5, data, extrafiles) and self.GetIECProgramsAndVariables():
-                    self.UnsubscribeAllDebugIECVariable()
-                    self.ProgramTransferred()
-                    if self.AppFrame is not None:
-                        self.AppFrame.CloseObsoleteDebugTabs()
-                        self.AppFrame.RefreshPouInstanceVariablesPanel()
-                    self.logger.write(_("Transfer completed successfully.\n"))
-                else:
-                    self.logger.write_error(_("Transfer failed\n"))
-                self.HidePLCProgress()                    
+        object_path = builder.GetBinaryPath()
+        object_blob = self._connector.BlobFromFile(object_path)
+
+        self.HidePLCProgress()
+
+        self.logger.write(_("PLC data transfered successfully.\n"))
+
+        if self._connector.NewPLC(MD5, object_blob, extrafiles):
+            if self.GetIECProgramsAndVariables():
+                self.UnsubscribeAllDebugIECVariable()
+                self.ProgramTransferred()
+                self.AppFrame.CloseObsoleteDebugTabs()
+                self.AppFrame.RefreshPouInstanceVariablesPanel()
+                self.AppFrame.LogViewer.ResetLogCounters()
+                self.logger.write(_("PLC installed successfully.\n"))
             else:
-                self.logger.write_error(_("No PLC to transfer (did build succeed ?)\n"))
+                self.logger.write_error(_("Missing debug data\n"))
+        else:
+            self.logger.write_error(_("PLC couldn't be installed\n"))
 
         wx.CallAfter(self.UpdateMethodsFromPLCStatus)
 
     StatusMethods = [
-        {"bitmap" : "Build",
-         "name" : _("Build"),
-         "tooltip" : _("Build project into build folder"),
-         "method" : "_Build"},
-        {"bitmap" : "Clean",
-         "name" : _("Clean"),
-         "enabled" : False,
-         "tooltip" : _("Clean project build folder"),
-         "method" : "_Clean"},
-        {"bitmap" : "Run",
-         "name" : _("Run"),
-         "shown" : False,
-         "tooltip" : _("Start PLC"),
-         "method" : "_Run"},
-        {"bitmap" : "Stop",
-         "name" : _("Stop"),
-         "shown" : False,
-         "tooltip" : _("Stop Running PLC"),
-         "method" : "_Stop"},
-        {"bitmap" : "Connect",
-         "name" : _("Connect"),
-         "tooltip" : _("Connect to the target PLC"),
-         "method" : "_Connect"},
-        {"bitmap" : "Transfer",
-         "name" : _("Transfer"),
-         "shown" : False,
-         "tooltip" : _("Transfer PLC"),
-         "method" : "_Transfer"},
-        {"bitmap" : "Disconnect",
-         "name" : _("Disconnect"),
-         "shown" : False,
-         "tooltip" : _("Disconnect from PLC"),
-         "method" : "_Disconnect"},
-        {"bitmap" : "ShowIECcode",
-         "name" : _("Show code"),
-         "shown" : False,
-         "tooltip" : _("Show IEC code generated by PLCGenerator"),
-         "method" : "_showIECcode"},
+        {
+            "bitmap":    "Build",
+            "name":    _("Build"),
+            "tooltip": _("Build project into build folder"),
+            "method":   "_Build"
+        },
+        {
+            "bitmap":    "Clean",
+            "name":    _("Clean"),
+            "tooltip": _("Clean project build folder"),
+            "method":   "_Clean",
+            "enabled":    False,
+        },
+        {
+            "bitmap":    "Run",
+            "name":    _("Run"),
+            "tooltip": _("Start PLC"),
+            "method":   "_Run",
+            "shown":      False,
+        },
+        {
+            "bitmap":    "Stop",
+            "name":    _("Stop"),
+            "tooltip": _("Stop Running PLC"),
+            "method":   "_Stop",
+            "shown":      False,
+        },
+        {
+            "bitmap":    "Connect",
+            "name":    _("Connect"),
+            "tooltip": _("Connect to the target PLC"),
+            "method":   "_Connect"
+        },
+        {
+            "bitmap":    "Transfer",
+            "name":    _("Transfer"),
+            "tooltip": _("Transfer PLC"),
+            "method":   "_Transfer",
+            "shown":      False,
+        },
+        {
+            "bitmap":    "Disconnect",
+            "name":    _("Disconnect"),
+            "tooltip": _("Disconnect from PLC"),
+            "method":   "_Disconnect",
+            "shown":      False,
+        },
+        {
+            "bitmap":    "IDManager",
+            "name":    _("ID Manager"),
+            "tooltip": _("Manage secure connection identities"),
+            "method":   "_showIDManager",
+        },
+        {
+            "bitmap":    "ShowIECcode",
+            "name":    _("Show code"),
+            "tooltip": _("Show IEC code generated by PLCGenerator"),
+            "method":   "_showIECcode",
+            "shown":      False,
+        },
     ]
 
     ConfNodeMethods = [
-        {"bitmap" : "editIECrawcode",
-         "name" : _("Raw IEC code"),
-         "tooltip" : _("Edit raw IEC code added to code generated by PLCGenerator"),
-         "method" : "_editIECrawcode"},
-        {"bitmap" : "ManageFolder",
-         "name" : _("Project Files"),
-         "tooltip" : _("Open a file explorer to manage project files"),
-         "method" : "_OpenProjectFiles"},
+        {
+            "bitmap":    "editIECrawcode",
+            "name":    _("Raw IEC code"),
+            "tooltip": _("Edit raw IEC code added to code generated by PLCGenerator"),
+            "method":   "_editIECrawcode"
+        },
+        {
+            "bitmap":    "ManageFolder",
+            "name":    _("Project Files"),
+            "tooltip": _("Open a file explorer to manage project files"),
+            "method":   "_OpenProjectFiles"
+        },
     ]
 
-
     def EnableMethod(self, method, value):
         for d in self.StatusMethods:
-            if d["method"]==method:
-                d["enabled"]=value
+            if d["method"] == method:
+                d["enabled"] = value
                 return True
         return False
 
     def ShowMethod(self, method, value):
         for d in self.StatusMethods:
-            if d["method"]==method:
-                d["shown"]=value
+            if d["method"] == method:
+                d["shown"] = value
                 return True
         return False
 
     def CallMethod(self, method):
         for d in self.StatusMethods:
-            if d["method"]==method and d.get("enabled", True) and d.get("shown", True):
+            if d["method"] == method and d.get("enabled", True) and d.get("shown", True):
                 getattr(self, method)()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,133 @@
+[![docs](https://readthedocs.org/projects/beremiz/badge/?version=latest)](https://beremiz.readthedocs.io)
+
+# Beremiz #
+
+Beremiz is an integrated development environment for machine automation. It is Free Software, conforming to IEC-61131 among other standards.
+
+It relies on open standards to be independent of the targeted device, and let you turn any processor into a PLC. Beremiz includes tools to create HMI, and to connect your PLC programs to existing supervisions, databases, or fieldbuses.
+
+With Beremiz, you conform to standards, avoid vendor lock, and contribute to the better future of Automation. 
+
+Beremiz consists of two components:
+
+* Integrated Development Environment (IDE), [Beremiz.py](https://bitbucket.org/automforge/beremiz/src/tip/Beremiz.py?at=default). It's running on user's computer and is used to write/compile/debug PLC programs and control PLC runtime.
+* Reference runtime implementation in python, [Beremiz_service.py](https://bitbucket.org/automforge/beremiz/src/tip/Beremiz_service.py?at=default). It's running on target platform, communicates with I/O and executes PLC program.
+
+See official [Beremiz website](http://www.beremiz.org/) for more information.
+
+## Build on Linux ##
+
+* Prerequisites
+
+		# Ubuntu/Debian :
+		sudo apt-get install build-essential bison flex autoconf
+		sudo apt-get install python-wxgtk3.0 pyro mercurial
+		sudo apt-get install python-nevow python-matplotlib python-lxml python-zeroconf python-cycler
+		sudo apt-get install python-autobahn python-u-msgpack
+
+* Prepare
+
+		mkdir ~/Beremiz
+		cd ~/Beremiz
+
+* Get Source Code
+
+		cd ~/Beremiz
+		hg clone https://bitbucket.org/skvorl/beremiz
+		hg clone https://bitbucket.org/mjsousa/matiec
+
+* Build MatIEC compiler
+
+		cd ~/Beremiz/matiec
+		autoreconf -i
+		./configure
+		make
+
+* Build CanFestival (optional)  
+  Only needed for CANopen support. Please read CanFestival manual to choose CAN interface other than 'virtual'.
+
+		cd ~/Beremiz
+		hg clone http://dev.automforge.net/CanFestival-3
+		cd ~/Beremiz/CanFestival-3
+		./configure --can=virtual
+		make
+
+* Build Modbus library (optional)
+  Only needed for Modbus support.
+
+		cd ~/Beremiz
+		hg clone https://bitbucket.org/mjsousa/modbus Modbus
+		cd ~/Beremiz/Modbus
+		make
+
+* Build BACnet (optional)
+  Only needed for BACnet support.
+
+		cd ~/Beremiz
+		svn checkout https://svn.code.sf.net/p/bacnet/code/trunk/bacnet-stack/ BACnet
+		cd BACnet
+		make MAKE_DEFINE='-fPIC' all
+
+* Launch Beremiz IDE
+
+		cd ~/Beremiz/beremiz
+		python Beremiz.py
+
+## Run standalone Beremiz runtime ##
+
+Runtime implementation can be different on different platforms.
+For example, PLC used Cortex-M most likely would have C-based runtime. Beremiz project contains reference implementation in python, that can be easily run on GNU/Linux, Windows and Mac OS X.
+This section will describe how to run it.
+
+If project's URL is 'LOCAL://', then IDE launches temprorary instance of Beremiz python runtime (Beremiz_service.py) localy as user tries to connect to PLC. This allows to debug programs localy without PLC.
+
+If you want to run Beremiz_service.py as standalone service, then follow these instructions:
+
+* Start standalone Beremiz service
+
+		cd ~/Beremiz
+		mkdir beremiz_workdir
+		cd ~/beremiz
+		python Beremiz_service.py -p 61194 -i localhost -x 0 -a 1 ~/Beremiz/beremiz_workdir
+
+* Launch Beremiz IDE
+
+		cd ~/Beremiz/beremiz
+		python Beremiz.py
+
+* Open/Create PLC project in Beremiz IDE.  
+  Enter target location URI in project's settings (project->Config->BeremizRoot/URI_location) pointed to your running Beremiz service (For example, PYRO://127.0.0.1:61194).
+  Save project and connect to running Beremiz service.
+
+## Examples ##
+
+Almost for all functionality exists example in ['tests'](https://bitbucket.org/automforge/beremiz/src/tip/tests/?at=default) directory.
+Most of examples are shown on [Beremiz youtube channel](https://www.youtube.com/channel/UCcE4KYI0p1f6CmSwtzyg-ZA).
+
+## Documentation ##
+
+ * See [Beremiz youtube channel](https://www.youtube.com/channel/UCcE4KYI0p1f6CmSwtzyg-ZA) to get quick information how to use Beremiz IDE.
+ 
+ * [Official user manual](http://beremiz.readthedocs.io/) is built from sources in doc directory.
+   Documentation does not cover all aspects of Beremiz use yet.
+   Contribution are very welcome!
+   
+ * [User manual](http://www.sm1820.ru/files/beremiz/beremiz_manual.pdf) from INEUM (Russian).
+   Be aware that it contains some information about functions available only in INEUM's fork of Beremiz.
+
+ * [User manual](http://www.beremiz.org/LpcManager_UserManual.pdf) from Smarteh (English).
+   Be aware that it contains some information about functions available only in Smarteh's fork of Beremiz.
+
+ * Outdated short [user manual](https://www.scribd.com/document/76101511/Manual-Beremiz#scribd) from LOLI Tech (English).
+
+ * See official [Beremiz website](http://www.beremiz.org/) for more information.
+
+## Support and development ##
+
+Main community support channel is [mailing list](https://sourceforge.net/p/beremiz/mailman/beremiz-devel/) (beremiz-devel@lists.sourceforge.net).
+
+The list is moderated and requires subscription for posting to it.
+
+To subscribe to the mailing list go [here](https://sourceforge.net/p/beremiz/mailman/beremiz-devel/).
+
+Searchable archive using search engine of your choice is available [here](http://beremiz-devel.2374573.n4.nabble.com/).
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/BacnetSlaveEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,1043 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard.
+# This files implements the bacnet plugin for Beremiz, adding BACnet server support.
+#
+# Copyright (C) 2017: Mario de Sousa (msousa@fe.up.pt)
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+from __future__ import absolute_import
+from collections import Counter
+
+import wx
+
+# Import some libraries on Beremiz code
+from util.BitmapLibrary import GetBitmap
+from controls.CustomGrid import CustomGrid
+from controls.CustomTable import CustomTable
+from editors.ConfTreeNodeEditor import ConfTreeNodeEditor
+from graphics.GraphicCommons import ERROR_HIGHLIGHT
+
+
+# BACnet Engineering units taken from: ASHRAE 135-2016, clause/chapter 21
+BACnetEngineeringUnits = [
+    ('(Acceleration) meters-per-second-per-second (166)',              166),
+    ('(Area) square-meters (0)',                                       0),
+    ('(Area) square-centimeters (116)',                                116),
+    ('(Area) square-feet (1)',                                         1),
+    ('(Area) square-inches (115)',                                     115),
+    ('(Currency) currency1 (105)',                                     105),
+    ('(Currency) currency2 (106)',                                     106),
+    ('(Currency) currency3 (107)',                                     107),
+    ('(Currency) currency4 (108)',                                     108),
+    ('(Currency) currency5 (109)',                                     109),
+    ('(Currency) currency6 (110)',                                     110),
+    ('(Currency) currency7 (111)',                                     111),
+    ('(Currency) currency8 (112)',                                     112),
+    ('(Currency) currency9 (113)',                                     113),
+    ('(Currency) currency10 (114)',                                    114),
+    ('(Electrical) milliamperes (2)',                                  2),
+    ('(Electrical) amperes (3)',                                       3),
+    ('(Electrical) amperes-per-meter (167)',                           167),
+    ('(Electrical) amperes-per-square-meter (168)',                    168),
+    ('(Electrical) ampere-square-meters (169)',                        169),
+    ('(Electrical) decibels (199)',                                    199),
+    ('(Electrical) decibels-millivolt (200)',                          200),
+    ('(Electrical) decibels-volt (201)',                               201),
+    ('(Electrical) farads (170)',                                      170),
+    ('(Electrical) henrys (171)',                                      171),
+    ('(Electrical) ohms (4)',                                          4),
+    ('(Electrical) ohm-meter-squared-per-meter (237)',                 237),
+    ('(Electrical) ohm-meters (172)',                                  172),
+    ('(Electrical) milliohms (145)',                                   145),
+    ('(Electrical) kilohms (122)',                                     122),
+    ('(Electrical) megohms (123)',                                     123),
+    ('(Electrical) microsiemens (190)',                                190),
+    ('(Electrical) millisiemens (202)',                                202),
+    ('(Electrical) siemens (173)',                                     173),
+    ('(Electrical) siemens-per-meter (174)',                           174),
+    ('(Electrical) teslas (175)',                                      175),
+    ('(Electrical) volts (5)',                                         5),
+    ('(Electrical) millivolts (124)',                                  124),
+    ('(Electrical) kilovolts (6)',                                     6),
+    ('(Electrical) megavolts (7)',                                     7),
+    ('(Electrical) volt-amperes (8)',                                  8),
+    ('(Electrical) kilovolt-amperes (9)',                              9),
+    ('(Electrical) megavolt-amperes (10)',                             10),
+    ('(Electrical) volt-amperes-reactive (11)',                        11),
+    ('(Electrical) kilovolt-amperes-reactive (12)',                    12),
+    ('(Electrical) megavolt-amperes-reactive (13)',                    13),
+    ('(Electrical) volts-per-degree-kelvin (176)',                     176),
+    ('(Electrical) volts-per-meter (177)',                             177),
+    ('(Electrical) degrees-phase (14)',                                14),
+    ('(Electrical) power-factor (15)',                                 15),
+    ('(Electrical) webers (178)',                                      178),
+    ('(Energy) ampere-seconds (238)',                                  238),
+    ('(Energy) volt-ampere-hours (239)',                               239),
+    ('(Energy) kilovolt-ampere-hours (240)',                           240),
+    ('(Energy) megavolt-ampere-hours (241)',                           241),
+    ('(Energy) volt-ampere-hours-reactive (242)',                      242),
+    ('(Energy) kilovolt-ampere-hours-reactive (243)',                  243),
+    ('(Energy) megavolt-ampere-hours-reactive (244)',                  244),
+    ('(Energy) volt-square-hours (245)',                               245),
+    ('(Energy) ampere-square-hours (246)',                             246),
+    ('(Energy) joules (16)',                                           16),
+    ('(Energy) kilojoules (17)',                                       17),
+    ('(Energy) kilojoules-per-kilogram (125)',                         125),
+    ('(Energy) megajoules (126)',                                      126),
+    ('(Energy) watt-hours (18)',                                       18),
+    ('(Energy) kilowatt-hours (19)',                                   19),
+    ('(Energy) megawatt-hours (146)',                                  146),
+    ('(Energy) watt-hours-reactive (203)',                             203),
+    ('(Energy) kilowatt-hours-reactive (204)',                         204),
+    ('(Energy) megawatt-hours-reactive (205)',                         205),
+    ('(Energy) btus (20)',                                             20),
+    ('(Energy) kilo-btus (147)',                                       147),
+    ('(Energy) mega-btus (148)',                                       148),
+    ('(Energy) therms (21)',                                           21),
+    ('(Energy) ton-hours (22)',                                        22),
+    ('(Enthalpy) joules-per-kilogram-dry-air (23)',                    23),
+    ('(Enthalpy) kilojoules-per-kilogram-dry-air (149)',               149),
+    ('(Enthalpy) megajoules-per-kilogram-dry-air (150)',               150),
+    ('(Enthalpy) btus-per-pound-dry-air (24)',                         24),
+    ('(Enthalpy) btus-per-pound (117)',                                117),
+    ('(Entropy) joules-per-degree-kelvin (127)',                       127),
+    ('(Entropy) kilojoules-per-degree-kelvin (151)',                   151),
+    ('(Entropy) megajoules-per-degree-kelvin (152)',                   152),
+    ('(Entropy) joules-per-kilogram-degree-kelvin (128)',              128),
+    ('(Force) newton (153)',                                           153),
+    ('(Frequency) cycles-per-hour (25)',                               25),
+    ('(Frequency) cycles-per-minute (26)',                             26),
+    ('(Frequency) hertz (27)',                                         27),
+    ('(Frequency) kilohertz (129)',                                    129),
+    ('(Frequency) megahertz (130)',                                    130),
+    ('(Frequency) per-hour (131)',                                     131),
+    ('(Humidity) grams-of-water-per-kilogram-dry-air (28)',            28),
+    ('(Humidity) percent-relative-humidity (29)',                      29),
+    ('(Length) micrometers (194)',                                     194),
+    ('(Length) millimeters (30)',                                      30),
+    ('(Length) centimeters (118)',                                     118),
+    ('(Length) kilometers (193)',                                      193),
+    ('(Length) meters (31)',                                           31),
+    ('(Length) inches (32)',                                           32),
+    ('(Length) feet (33)',                                             33),
+    ('(Light) candelas (179)',                                         179),
+    ('(Light) candelas-per-square-meter (180)',                        180),
+    ('(Light) watts-per-square-foot (34)',                             34),
+    ('(Light) watts-per-square-meter (35)',                            35),
+    ('(Light) lumens (36)',                                            36),
+    ('(Light) luxes (37)',                                             37),
+    ('(Light) foot-candles (38)',                                      38),
+    ('(Mass) milligrams (196)',                                        196),
+    ('(Mass) grams (195)',                                             195),
+    ('(Mass) kilograms (39)',                                          39),
+    ('(Mass) pounds-mass (40)',                                        40),
+    ('(Mass) tons (41)',                                               41),
+    ('(Mass Flow) grams-per-second (154)',                             154),
+    ('(Mass Flow) grams-per-minute (155)',                             155),
+    ('(Mass Flow) kilograms-per-second (42)',                          42),
+    ('(Mass Flow) kilograms-per-minute (43)',                          43),
+    ('(Mass Flow) kilograms-per-hour (44)',                            44),
+    ('(Mass Flow) pounds-mass-per-second (119)',                       119),
+    ('(Mass Flow) pounds-mass-per-minute (45)',                        45),
+    ('(Mass Flow) pounds-mass-per-hour (46)',                          46),
+    ('(Mass Flow) tons-per-hour (156)',                                156),
+    ('(Power) milliwatts (132)',                                       132),
+    ('(Power) watts (47)',                                             47),
+    ('(Power) kilowatts (48)',                                         48),
+    ('(Power) megawatts (49)',                                         49),
+    ('(Power) btus-per-hour (50)',                                     50),
+    ('(Power) kilo-btus-per-hour (157)',                               157),
+    ('(Power) joule-per-hours (247)',                                  247),
+    ('(Power) horsepower (51)',                                        51),
+    ('(Power) tons-refrigeration (52)',                                52),
+    ('(Pressure) pascals (53)',                                        53),
+    ('(Pressure) hectopascals (133)',                                  133),
+    ('(Pressure) kilopascals (54)',                                    54),
+    ('(Pressure) millibars (134)',                                     134),
+    ('(Pressure) bars (55)',                                           55),
+    ('(Pressure) pounds-force-per-square-inch (56)',                   56),
+    ('(Pressure) millimeters-of-water (206)',                          206),
+    ('(Pressure) centimeters-of-water (57)',                           57),
+    ('(Pressure) inches-of-water (58)',                                58),
+    ('(Pressure) millimeters-of-mercury (59)',                         59),
+    ('(Pressure) centimeters-of-mercury (60)',                         60),
+    ('(Pressure) inches-of-mercury (61)',                              61),
+    ('(Temperature) degrees-celsius (62)',                             62),
+    ('(Temperature) degrees-kelvin (63)',                              63),
+    ('(Temperature) degrees-kelvin-per-hour (181)',                    181),
+    ('(Temperature) degrees-kelvin-per-minute (182)',                  182),
+    ('(Temperature) degrees-fahrenheit (64)',                          64),
+    ('(Temperature) degree-days-celsius (65)',                         65),
+    ('(Temperature) degree-days-fahrenheit (66)',                      66),
+    ('(Temperature) delta-degrees-fahrenheit (120)',                   120),
+    ('(Temperature) delta-degrees-kelvin (121)',                       121),
+    ('(Time) years (67)',                                              67),
+    ('(Time) months (68)',                                             68),
+    ('(Time) weeks (69)',                                              69),
+    ('(Time) days (70)',                                               70),
+    ('(Time) hours (71)',                                              71),
+    ('(Time) minutes (72)',                                            72),
+    ('(Time) seconds (73)',                                            73),
+    ('(Time) hundredths-seconds (158)',                                158),
+    ('(Time) milliseconds (159)',                                      159),
+    ('(Torque) newton-meters (160)',                                   160),
+    ('(Velocity) millimeters-per-second (161)',                        161),
+    ('(Velocity) millimeters-per-minute (162)',                        162),
+    ('(Velocity) meters-per-second (74)',                              74),
+    ('(Velocity) meters-per-minute (163)',                             163),
+    ('(Velocity) meters-per-hour (164)',                               164),
+    ('(Velocity) kilometers-per-hour (75)',                            75),
+    ('(Velocity) feet-per-second (76)',                                76),
+    ('(Velocity) feet-per-minute (77)',                                77),
+    ('(Velocity) miles-per-hour (78)',                                 78),
+    ('(Volume) cubic-feet (79)',                                       79),
+    ('(Volume) cubic-meters (80)',                                     80),
+    ('(Volume) imperial-gallons (81)',                                 81),
+    ('(Volume) milliliters (197)',                                     197),
+    ('(Volume) liters (82)',                                           82),
+    ('(Volume) us-gallons (83)',                                       83),
+    ('(Volumetric Flow) cubic-feet-per-second (142)',                  142),
+    ('(Volumetric Flow) cubic-feet-per-minute (84)',                   84),
+    ('(Volumetric Flow) million-standard-cubic-feet-per-minute (254)', 254),
+    ('(Volumetric Flow) cubic-feet-per-hour (191)',                    191),
+    ('(Volumetric Flow) cubic-feet-per-day (248)',                     248),
+    ('(Volumetric Flow) standard-cubic-feet-per-day (47808)',          47808),
+    ('(Volumetric Flow) million-standard-cubic-feet-per-day (47809)',  47809),
+    ('(Volumetric Flow) thousand-cubic-feet-per-day (47810)',          47810),
+    ('(Volumetric Flow) thousand-standard-cubic-feet-per-day (47811)', 47811),
+    ('(Volumetric Flow) pounds-mass-per-day (47812)',                  47812),
+    ('(Volumetric Flow) cubic-meters-per-second (85)',                 85),
+    ('(Volumetric Flow) cubic-meters-per-minute (165)',                165),
+    ('(Volumetric Flow) cubic-meters-per-hour (135)',                  135),
+    ('(Volumetric Flow) cubic-meters-per-day (249)',                   249),
+    ('(Volumetric Flow) imperial-gallons-per-minute (86)',             86),
+    ('(Volumetric Flow) milliliters-per-second (198)',                 198),
+    ('(Volumetric Flow) liters-per-second (87)',                       87),
+    ('(Volumetric Flow) liters-per-minute (88)',                       88),
+    ('(Volumetric Flow) liters-per-hour (136)',                        136),
+    ('(Volumetric Flow) us-gallons-per-minute (89)',                   89),
+    ('(Volumetric Flow) us-gallons-per-hour (192)',                    192),
+    ('(Other) degrees-angular (90)',                                   90),
+    ('(Other) degrees-celsius-per-hour (91)',                          91),
+    ('(Other) degrees-celsius-per-minute (92)',                        92),
+    ('(Other) degrees-fahrenheit-per-hour (93)',                       93),
+    ('(Other) degrees-fahrenheit-per-minute (94)',                     94),
+    ('(Other) joule-seconds (183)',                                    183),
+    ('(Other) kilograms-per-cubic-meter (186)',                        186),
+    ('(Other) kilowatt-hours-per-square-meter (137)',                  137),
+    ('(Other) kilowatt-hours-per-square-foot (138)',                   138),
+    ('(Other) watt-hours-per-cubic-meter (250)',                       250),
+    ('(Other) joules-per-cubic-meter (251)',                           251),
+    ('(Other) megajoules-per-square-meter (139)',                      139),
+    ('(Other) megajoules-per-square-foot (140)',                       140),
+    ('(Other) mole-percent (252)',                                     252),
+    ('(Other) no-units (95)',                                          95),
+    ('(Other) newton-seconds (187)',                                   187),
+    ('(Other) newtons-per-meter (188)',                                188),
+    ('(Other) parts-per-million (96)',                                 96),
+    ('(Other) parts-per-billion (97)',                                 97),
+    ('(Other) pascal-seconds (253)',                                   253),
+    ('(Other) percent (98)',                                           98),
+    ('(Other) percent-obscuration-per-foot (143)',                     143),
+    ('(Other) percent-obscuration-per-meter (144)',                    144),
+    ('(Other) percent-per-second (99)',                                99),
+    ('(Other) per-minute (100)',                                       100),
+    ('(Other) per-second (101)',                                       101),
+    ('(Other) psi-per-degree-fahrenheit (102)',                        102),
+    ('(Other) radians (103)',                                          103),
+    ('(Other) radians-per-second (184)',                               184),
+    ('(Other) revolutions-per-minute (104)',                           104),
+    ('(Other) square-meters-per-newton (185)',                         185),
+    ('(Other) watts-per-meter-per-degree-kelvin (189)',                189),
+    ('(Other) watts-per-square-meter-degree-kelvin (141)',             141),
+    ('(Other) per-mille (207)',                                        207),
+    ('(Other) grams-per-gram (208)',                                   208),
+    ('(Other) kilograms-per-kilogram (209)',                           209),
+    ('(Other) grams-per-kilogram (210)',                               210),
+    ('(Other) milligrams-per-gram (211)',                              211),
+    ('(Other) milligrams-per-kilogram (212)',                          212),
+    ('(Other) grams-per-milliliter (213)',                             213),
+    ('(Other) grams-per-liter (214)',                                  214),
+    ('(Other) milligrams-per-liter (215)',                             215),
+    ('(Other) micrograms-per-liter (216)',                             216),
+    ('(Other) grams-per-cubic-meter (217)',                            217),
+    ('(Other) milligrams-per-cubic-meter (218)',                       218),
+    ('(Other) micrograms-per-cubic-meter (219)',                       219),
+    ('(Other) nanograms-per-cubic-meter (220)',                        220),
+    ('(Other) grams-per-cubic-centimeter (221)',                       221),
+    ('(Other) becquerels (222)',                                       222),
+    ('(Other) kilobecquerels (223)',                                   223),
+    ('(Other) megabecquerels (224)',                                   224),
+    ('(Other) gray (225)',                                             225),
+    ('(Other) milligray (226)',                                        226),
+    ('(Other) microgray (227)',                                        227),
+    ('(Other) sieverts (228)',                                         228),
+    ('(Other) millisieverts (229)',                                    229),
+    ('(Other) microsieverts (230)',                                    230),
+    ('(Other) microsieverts-per-hour (231)',                           231),
+    ('(Other) millirems (47814)',                                      47814),
+    ('(Other) millirems-per-hour (47815)',                             47815),
+    ('(Other) decibels-a (232)',                                       232),
+    ('(Other) nephelometric-turbidity-unit (233)',                     233),
+    ('(Other) pH (234)',                                               234),
+    ('(Other) grams-per-square-meter (235)',                           235),
+    ('(Other) minutes-per-degree-kelvin (236)',                        236)
+]  # BACnetEngineeringUnits
+
+
+# ObjectID (22 bits ID + 10 bits type) => max = 2^22-1 = 4194303
+#  However, ObjectID 4194303 is not allowed!
+#  4194303 is used as a special value when object Id reference is referencing an undefined object
+#  (similar to NULL in C)
+BACnetObjectID_MAX = 4194302
+BACnetObjectID_NUL = 4194303
+
+
+# A base class
+# what would be a purely virtual class in C++
+class ObjectProperties(object):
+    # this __init_() function is currently not beeing used!
+
+    def __init__(self):
+        # nothing to do
+        return
+
+
+class BinaryObject(ObjectProperties):
+    # 'PropertyNames' will be used as the header for each column of the Object Properties grid!
+    # Warning: The rest of the code depends on the existance of an "Object Identifier" and "Object Name"
+    # Be sure to use these exact names for these BACnet object properties!
+    PropertyNames = ["Object Identifier", "Object Name", "Description"]
+    ColumnAlignments = [wx.ALIGN_RIGHT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
+    ColumnSizes = [40, 80, 80]
+    PropertyConfig = {
+        "Object Identifier": {"GridCellEditor": wx.grid.GridCellNumberEditor,
+                              "GridCellRenderer": wx.grid.GridCellNumberRenderer,
+                              # syntax for GridCellNumberEditor -> "min,max"
+                              # ObjectID (22 bits ID + 10 bits type) => max = 2^22-1
+                              "GridCellEditorParam": "0,4194302"},
+        "Object Name": {"GridCellEditor": wx.grid.GridCellTextEditor,
+                        "GridCellRenderer": wx.grid.GridCellStringRenderer},
+        "Description": {"GridCellEditor": wx.grid.GridCellTextEditor,
+                        "GridCellRenderer": wx.grid.GridCellStringRenderer}
+    }
+
+
+class AnalogObject(ObjectProperties):
+    # 'PropertyNames' will be used as the header for each column of the Object Properties grid!
+    # Warning: The rest of the code depends on the existance of an "Object Identifier" and "Object Name"
+    #          Be sure to use these exact names for these BACnet object properties!
+    #
+    # NOTE: Although it is not listed here (so it does not show up in the GUI, this object will also
+    #       keep another entry for a virtual property named "Unit ID". This virtual property
+    #       will store the ID corresponding to the "Engineering Units" currently chosen.
+    #       This virtual property is kept synchronised to the "Engineering Units" property
+    #       by the function PropertyChanged() which should be called by the OnCellChange event handler.
+    PropertyNames = ["Object Identifier", "Object Name",
+                     "Description", "Engineering Units"]  # 'Unit ID'
+    ColumnAlignments = [
+        wx.ALIGN_RIGHT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
+    ColumnSizes = [40, 80, 80, 200]
+    PropertyConfig = {
+        "Object Identifier": {"GridCellEditor": wx.grid.GridCellNumberEditor,
+                              "GridCellRenderer": wx.grid.GridCellNumberRenderer,
+                              "GridCellEditorParam": "0,4194302"},
+        "Object Name": {"GridCellEditor": wx.grid.GridCellTextEditor,
+                        "GridCellRenderer": wx.grid.GridCellStringRenderer},
+        "Description": {"GridCellEditor": wx.grid.GridCellTextEditor,
+                        "GridCellRenderer": wx.grid.GridCellStringRenderer},
+        "Engineering Units": {"GridCellEditor": wx.grid.GridCellChoiceEditor,
+                              # use string renderer with choice editor!
+                              "GridCellRenderer": wx.grid.GridCellStringRenderer,
+                              # syntax for GridCellChoiceEditor -> comma separated values
+                              "GridCellEditorParam": ','.join([x[0] for x in BACnetEngineeringUnits])}
+    }
+
+    # obj_properties should be a dictionary, with keys "Object Identifier",
+    # "Object Name", "Description", ...
+    def UpdateVirtualProperties(self, obj_properties):
+        obj_properties["Unit ID"] = [x[1]
+                                     for x in BACnetEngineeringUnits if x[0] == obj_properties["Engineering Units"]][0]
+
+
+class MultiSObject(ObjectProperties):
+    # 'PropertyNames' will be used as the header for each column of the Object Properties grid!
+    # Warning: The rest of the code depends on the existance of an "Object Identifier" and "Object Name"
+    # Be sure to use these exact names for these BACnet object properties!
+    PropertyNames = [
+        "Object Identifier", "Object Name", "Description", "Number of States"]
+    ColumnAlignments = [
+        wx.ALIGN_RIGHT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_CENTER]
+    ColumnSizes = [40, 80, 80, 120]
+    PropertyConfig = {
+        "Object Identifier": {"GridCellEditor": wx.grid.GridCellNumberEditor,
+                              "GridCellRenderer": wx.grid.GridCellNumberRenderer,
+                              "GridCellEditorParam": "0,4194302"},
+        "Object Name": {"GridCellEditor": wx.grid.GridCellTextEditor,
+                        "GridCellRenderer": wx.grid.GridCellStringRenderer},
+        "Description": {"GridCellEditor": wx.grid.GridCellTextEditor,
+                        "GridCellRenderer": wx.grid.GridCellStringRenderer},
+        # MultiState Values are encoded in unsigned integer
+        # (in BACnet => uint8_t), and can not be 0.
+        # See ASHRAE 135-2016, section 12.20.4
+        "Number of States": {"GridCellEditor": wx.grid.GridCellNumberEditor,
+                             "GridCellRenderer": wx.grid.GridCellNumberRenderer,
+                             # syntax for GridCellNumberEditor -> "min,max"
+                             "GridCellEditorParam": "1,255"}
+    }
+
+
+# The default values to use for each BACnet object type
+#
+# Note that the 'internal plugin parameters' get stored in the data table, but
+# are not visible in the GUI. They are used to generate the
+# EDE files as well as the C code
+class BVObject(BinaryObject):
+    DefaultValues = {"Object Identifier": "",
+                     "Object Name": "Binary Value",
+                     "Description": "",
+                     # internal plugin parameters...
+                     "BACnetObjTypeID": 5,
+                     "Ctype": "uint8_t",
+                     "Settable": "Y"}
+
+
+class BOObject(BinaryObject):
+    DefaultValues = {"Object Identifier": "",
+                     "Object Name": "Binary Output",
+                     "Description": "",
+                     # internal plugin parameters...
+                     "BACnetObjTypeID": 4,
+                     "Ctype": "uint8_t",
+                     "Settable": "Y"}
+
+
+class BIObject(BinaryObject):
+    DefaultValues = {"Object Identifier": "",
+                     "Object Name": "Binary Input",
+                     "Description": "",
+                     # internal plugin parameters...
+                     "BACnetObjTypeID": 3,
+                     "Ctype": "uint8_t",
+                     "Settable": "N"}
+
+
+class AVObject(AnalogObject):
+    DefaultValues = {"Object Identifier": "",
+                     "Object Name": "Analog Value",
+                     "Description": "",
+                     "Engineering Units": '(Other) no-units (95)',
+                     # internal plugin parameters...
+                     "Unit ID": 95,   # the ID of the engineering unit
+                     # will get updated by
+                     # UpdateVirtualProperties()
+                     "BACnetObjTypeID": 2,
+                     "Ctype": "float",
+                     "Settable": "Y"}
+
+
+class AOObject(AnalogObject):
+    DefaultValues = {"Object Identifier": "",
+                     "Object Name": "Analog Output",
+                     "Description": "",
+                     "Engineering Units": '(Other) no-units (95)',
+                     # internal plugin parameters...
+                     "Unit ID": 95,   # the ID of the engineering unit
+                     # will get updated by
+                     # UpdateVirtualProperties()
+                     "BACnetObjTypeID": 1,
+                     "Ctype": "float",
+                     "Settable": "Y"}
+
+
+class AIObject(AnalogObject):
+    DefaultValues = {"Object Identifier": "",
+                     "Object Name": "Analog Input",
+                     "Description": "",
+                     "Engineering Units": '(Other) no-units (95)',
+                     # internal plugin parameters...
+                     "Unit ID": 95,   # the ID of the engineering unit
+                     # will get updated by
+                     # UpdateVirtualProperties()
+                     "BACnetObjTypeID": 0,
+                     "Ctype": "float",
+                     "Settable": "N"}
+
+
+class MSVObject(MultiSObject):
+    DefaultValues = {"Object Identifier": "",
+                     "Object Name": "Multi-state Value",
+                     "Description": "",
+                     "Number of States": "255",
+                     # internal plugin parameters...
+                     "BACnetObjTypeID": 19,
+                     "Ctype": "uint8_t",
+                     "Settable": "Y"}
+
+
+class MSOObject(MultiSObject):
+    DefaultValues = {"Object Identifier": "",
+                     "Object Name": "Multi-state Output",
+                     "Description": "",
+                     "Number of States": "255",
+                     # internal plugin parameters...
+                     "BACnetObjTypeID": 14,
+                     "Ctype": "uint8_t",
+                     "Settable": "Y"}
+
+
+class MSIObject(MultiSObject):
+    DefaultValues = {"Object Identifier": "",
+                     "Object Name": "Multi-state Input",
+                     "Description": "",
+                     "Number of States": "255",
+                     # internal plugin parameters...
+                     "BACnetObjTypeID": 13,
+                     "Ctype": "uint8_t",
+                     "Settable": "N"}
+
+
+class ObjectTable(CustomTable):
+    #  A custom wx.grid.PyGridTableBase using user supplied data
+    #
+    #  This will basically store a list of BACnet objects that the slave will support/implement.
+    #  There will be one instance of this ObjectTable class for each BACnet object type
+    #  (e.g. Binary Value, Analog Input, Multi State Output, ...)
+    #
+    #  The list of BACnet objects will actually be stored within the self.data variable
+    #  (declared in CustomTable). Self.data will be a list of dictionaries (one entry per BACnet
+    #  object). All of these dictionaries in the self.data list will have entries whose keys actually
+    #  depend on the BACnet type object being handled. The keys in the dictionary will be
+    #  the entries in the PropertyNames list of one of the following classes:
+    #  (BVObject, BOObject, BIObject, AVObject, AOObject, AIObject, MSVObject, MSOObject, MSIObject).
+    #
+    #  For example, when handling Binary Value BACnet objects,
+    #   self.data will be a list of dictionaries (one entry per row)
+    #     self.data[n] will be a dictionary, with keys "Object Identifier", "Object Name", "Description"
+    #     for example: self.data[n] = {"Object Identifier":33, "Object Name":"room1", "Description":"xx"}
+    #
+    #  Note that this ObjectTable class merely stores the configuration data.
+    #  It does not control the display nor the editing of this data.
+    #  This data is typically displayed within a grid, that is controlled by the ObjectGrid class.
+    #
+
+    def __init__(self, parent, data, BACnetObjectType):
+        #   parent          : the _BacnetSlavePlug object that is instantiating this ObjectTable
+        #   data            : a list with the data to be shown on the grid
+        #                       (i.e., a list containing the BACnet object properties)
+        #                       Instantiated in _BacnetSlavePlug
+        #   BACnetObjectType: one of BinaryObject, AnalogObject, MultiSObject
+        #                     (or a class that derives from them).
+        #                     This is actually the class itself, and not a variable!!!
+        #                     However, self.BACnetObjectType will be an instance
+        #                     of said class as we later need to call methods from this class.
+        #                     (in particular, the UpdateVirtualProperties() method)
+        #
+        # The base class must be initialized *first*
+        CustomTable.__init__(
+            self, parent, data, BACnetObjectType.PropertyNames)
+        self.BACnetObjectType = BACnetObjectType()
+        self.ChangesToSave = False
+
+    # def _GetRowEdit(self, row):
+        # row_edit = self.GetValueByName(row, "Edit")
+        # var_type = self.Parent.GetTagName()
+        # bodytype = self.Parent.Controler.GetEditedElementBodyType(var_type)
+        # if bodytype in ["ST", "IL"]:
+        #     row_edit = True;
+        # return row_edit
+
+    def _updateColAttrs(self, grid):
+        #  wx.grid.Grid -> update the column attributes to add the
+        #  appropriate renderer given the column name.
+        #
+        #  Otherwise default to the default renderer.
+        # print "ObjectTable._updateColAttrs() called!!!"
+        for row in range(self.GetNumberRows()):
+            for col in range(self.GetNumberCols()):
+                PropertyName = self.BACnetObjectType.PropertyNames[col]
+                PropertyConfig = self.BACnetObjectType.PropertyConfig[PropertyName]
+                grid.SetReadOnly(row, col, False)
+                grid.SetCellEditor(row, col, PropertyConfig["GridCellEditor"]())
+                grid.SetCellRenderer(row, col, PropertyConfig["GridCellRenderer"]())
+                grid.SetCellBackgroundColour(row, col, wx.WHITE)
+                grid.SetCellTextColour(row, col, wx.BLACK)
+                if "GridCellEditorParam" in PropertyConfig:
+                    grid.GetCellEditor(row, col).SetParameters(
+                        PropertyConfig["GridCellEditorParam"])
+            self.ResizeRow(grid, row)
+
+    def FindValueByName(self, PropertyName, PropertyValue):
+        # find the row whose property named PropertyName has the value PropertyValue
+        # Returns: row number
+        # for example, find the row where PropertyName "Object Identifier" has value 1002
+        #              FindValueByName("Object Identifier", 1002).
+        for row in range(self.GetNumberRows()):
+            if int(self.GetValueByName(row, PropertyName)) == PropertyValue:
+                return row
+        return None
+
+    # Return a list containing all the values under the column named 'colname'
+    def GetAllValuesByName(self, colname):
+        values = []
+        for row in range(self.GetNumberRows()):
+            values.append(self.data[row].get(colname))
+        return values
+
+    # Returns a dictionary with:
+    #      keys: IDs    of BACnet objects
+    #     value: number of BACnet objects using this same Id
+    #            (values larger than 1 indicates an error as BACnet requires unique
+    #             object IDs for objects of the same type)
+    def GetObjectIDCount(self):
+        # The dictionary is built by first creating a list containing the IDs
+        # of all BACnet objects
+        ObjectIDs = self.GetAllValuesByName("Object Identifier")
+        # list of integers instead of strings...
+        ObjectIDs_as_int = [int(x) for x in ObjectIDs]
+        # This list is then transformed into a collections.Counter class
+        # Which is then transformed into a dictionary using dict()
+        return dict(Counter(ObjectIDs_as_int))
+
+    # Check whether any object ID is used more than once (not valid in BACnet)
+    # (returns True or False)
+    def HasDuplicateObjectIDs(self):
+        ObjectIDsCount = self.GetObjectIDCount()
+        for ObjName in ObjectIDsCount:
+            if ObjectIDsCount[ObjName] > 1:
+                return True
+        return False
+
+    # Update the virtual properties of the objects of the classes derived from ObjectProperties
+    #  (currently only the AnalogObject class had virtua properties, i.e. a property
+    #   that is determined/calculated based on the other properties)
+    def UpdateAllVirtualProperties(self):
+        if hasattr(self.BACnetObjectType, 'UpdateVirtualProperties'):
+            for ObjProp in self.data:
+                self.BACnetObjectType.UpdateVirtualProperties(ObjProp)
+
+
+class ObjectGrid(CustomGrid):
+    # A custom wx.grid.Grid (CustomGrid derives from wx.grid.Grid)
+    #
+    # Needed mostly to customise the initial values of newly added rows, and to
+    # validate if the inserted data follows BACnet rules.
+    #
+    #
+    # This ObjectGrid class:
+    #   Creates and controls the GUI __grid__ for configuring all the BACnet objects of one
+    #   (generic) BACnet object type (e.g. Binary Value, Analog Input, Multi State Output, ...)
+    #   This grid is currently displayed within one 'window' controlled by a ObjectEditor
+    #   object (this organization is not likely to change in the future).
+    #
+    #   The grid uses one line/row per BACnet object, and one column for each property of the BACnet
+    #   object. The column titles change depending on the specific type of BACnet object being edited
+    #   (BVObject, BOObject, BIObject, AVObject, AOObject, AIObject, MSVObject, MSOObject, MSIObject).
+    #   The editor to use for each column is also obtained from that class (e.g. TextEditor,
+    #   NumberEditor, ...)
+    #
+    #   This class does NOT store the data in the grid. It merely controls its display and editing.
+    #   The data in the grid is stored within an object of class ObjectTable
+    #
+
+    def __init__(self, *args, **kwargs):
+        CustomGrid.__init__(self, *args, **kwargs)
+
+    # Called when a new row is added by clicking Add button
+    # call graph: CustomGrid.OnAddButton() --> CustomGrid.AddRow() -->
+    # ObjectGrid._AddRow()
+    def _AddRow(self, new_row):
+        if new_row > 0:
+            self.Table.InsertRow(new_row, self.Table.GetRow(new_row - 1).copy())
+        else:
+            self.Table.InsertRow(new_row, self.DefaultValue.copy())
+        # start off with invalid object ID
+        self.Table.SetValueByName(new_row, "Object Identifier", BACnetObjectID_NUL)
+        # Find an apropriate BACnet object ID for the new object.
+        # We choose a first attempt (based on object ID of previous line + 1)
+        new_object_id = 0
+        if new_row > 0:
+            new_object_id = int(
+                self.Table.GetValueByName(new_row - 1, "Object Identifier"))
+            new_object_id += 1
+        # Check whether the chosen object ID is not already in use.
+        # If in use, add 1 to the attempted object ID and recheck...
+        while self.Table.FindValueByName("Object Identifier", new_object_id) is not None:
+            new_object_id += 1
+            # if reached end of object IDs, cycle back to 0
+            # (remember, we may have started at any inital object ID > 0, so it makes sense to cyclce back to 0)
+            # warning: We risk entering an inifinite loop if all object IDs are already used.
+            #          The likelyhood of this happening is extremely low, (we would need 2^22 elements in the table!)
+            #          so don't worry about it for now.
+            if new_object_id > BACnetObjectID_MAX:
+                new_object_id = 0
+        # Set the object ID of the new object to the apropriate value
+        # ... and append the ID to the default object name (so the name becomes unique)
+        new_object_name = self.DefaultValue.get(
+            "Object Name") + " " + str(new_object_id)
+        self.Table.SetValueByName(
+            new_row, "Object Name", new_object_name)
+        self.Table.SetValueByName(new_row, "Object Identifier", new_object_id)
+        self.Table.ResetView(self)
+        return new_row
+
+    # Called when a object ID is changed
+    #    call graph: ObjectEditor.OnVariablesGridCellChange() --> this method
+    # Will check whether there is a duplicate object ID, and highlight it if so.
+    def HighlightDuplicateObjectIDs(self):
+        if self.Table.GetNumberRows() < 2:
+            # Less than 2 rows. No duplicates are possible!
+            return
+        IDsCount = self.Table.GetObjectIDCount()
+        # check ALL object IDs for duplicates...
+        for row in range(self.Table.GetNumberRows()):
+            obj_id1 = int(self.Table.GetValueByName(row, "Object Identifier"))
+            if IDsCount[obj_id1] > 1:
+                # More than 1 BACnet object using this ID! Let us Highlight this row with errors...
+                # TODO: change the hardcoded column number '0' to a number obtained at runtime
+                #       that is guaranteed to match the column titled "Object Identifier"
+                self.SetCellBackgroundColour(row, 0, ERROR_HIGHLIGHT[0])
+                self.SetCellTextColour(row, 0, ERROR_HIGHLIGHT[1])
+            else:
+                self.SetCellBackgroundColour(row, 0, wx.WHITE)
+                self.SetCellTextColour(row, 0, wx.BLACK)
+        # Refresh the graphical display to take into account any changes we may
+        # have made
+        self.ForceRefresh()
+        return None
+
+    # Called when the user changes the name of BACnet object (using the GUI grid)
+    #    call graph: ObjectEditor.OnVariablesGridCellChange() -->
+    #                --> BacnetSlaveEditorPlug.HighlightAllDuplicateObjectNames() -->
+    #                --> ObjectEditor.HighlightDuplicateObjectNames() -->
+    #                -->   (this method)
+    # Will check whether there is a duplicate BACnet object name, and highlight it if so.
+    #
+    # Since the names of BACnet objects must be unique within the whole bacnet server (and
+    # not just among the BACnet objects of the same class (e.g. Analog Value, Binary Input, ...)
+    # to work properly this method must be passed a list of the names of all BACnet objects
+    # currently configured.
+    #
+    # AllObjectNamesFreq: a dictionary using as key the names of all currently configured BACnet
+    #                     objects, and value the number of objects using this same name.
+    def HighlightDuplicateObjectNames(self, AllObjectNamesFreq):
+        for row in range(self.Table.GetNumberRows()):
+            # TODO: change the hardcoded column number '1' to a number obtained at runtime
+            #       that is guaranteed to match the column titled "Object Name"
+            if AllObjectNamesFreq[self.Table.GetValueByName(row, "Object Name")] > 1:
+                # This is an error! Highlight it...
+                self.SetCellBackgroundColour(row, 1, ERROR_HIGHLIGHT[0])
+                self.SetCellTextColour(row, 1, ERROR_HIGHLIGHT[1])
+            else:
+                self.SetCellBackgroundColour(row, 1, wx.WHITE)
+                self.SetCellTextColour(row, 1, wx.BLACK)
+        # Refresh the graphical display to take into account any changes we may
+        # have made
+        self.ForceRefresh()
+        return None
+
+
+class ObjectEditor(wx.Panel):
+    # This ObjectEditor class:
+    #   Creates and controls the GUI window for configuring all the BACnet objects of one
+    #   (generic) BACnet object type (e.g. Binary Value, Analog Input, Multi State Output, ...)
+    #   This 'window' is currenty displayed within one tab of the bacnet plugin, but this
+    #   may change in the future!
+    #
+    #   It includes a grid to display all the BACnet objects of its type , as well as the buttons
+    #   to insert, delete and move (up/down) a BACnet object in the grid.
+    #   It also includes the sizers and spacers required to lay out the grid and buttons
+    #   in the wndow.
+    #
+
+    def __init__(self, parent, window, controller, ObjTable):
+        # window:  the window in which the editor will open.
+        # controller: The ConfigTreeNode object that controlls the data presented by
+        #             this 'config tree node editor'
+        #
+        # parent:  wx._controls.Notebook
+        # window:  BacnetSlaveEditorPlug (i.e. beremiz.bacnet.BacnetSlaveEditor.BacnetSlaveEditorPlug)
+        # controller: controller will be an object of class
+        #            FinalCTNClass         (i.e. beremiz.ConfigTreeNode.FinalCTNClass )
+        #            (FinalCTNClass inherits from: ConfigTreeNode and _BacnetSlavePlug)
+        #            (For the BACnet plugin, it is easier to think of controller as a _BacnetSlavePlug,
+        #             as the other classes are generic to all plugins!!)
+        #
+        # ObjTable: The object of class ObjectTable that stores the data displayed in the grid.
+        #           This object is instantiated and managed by the _BacnetSlavePlug class.
+        #
+        self.window = window
+        self.controller = controller
+        self.ObjTable = ObjTable
+
+        wx.Panel.__init__(self, parent)
+
+        # The main sizer, 2 rows: top row for buttons, bottom row for 2D grid
+        self.MainSizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=0)
+        self.MainSizer.AddGrowableCol(0)
+        self.MainSizer.AddGrowableRow(1)
+
+        # sizer placed on top row of main sizer:
+        #   1 row; 6 columns: 1 static text, one stretchable spacer, 4 buttons
+        controls_sizer = wx.FlexGridSizer(cols=6, hgap=4, rows=1, vgap=5)
+        controls_sizer.AddGrowableCol(0)
+        controls_sizer.AddGrowableRow(0)
+        self.MainSizer.Add(controls_sizer, border=5, flag=wx.GROW | wx.ALL)
+
+        # the buttons that populate the controls sizer (itself in top row of the main sizer)
+        # NOTE: the _("string") function will translate the "string" to the local language
+        controls_sizer.Add(
+            wx.StaticText(self, label=_('Object Properties:')), flag=wx.ALIGN_BOTTOM)
+        controls_sizer.AddStretchSpacer()
+        for name, bitmap, help in [
+                ("AddButton", "add_element", _("Add variable")),
+                ("DeleteButton", "remove_element", _("Remove variable")),
+                ("UpButton", "up", _("Move variable up")),
+                ("DownButton", "down", _("Move variable down"))]:
+            button = wx.lib.buttons.GenBitmapButton(
+                self, bitmap=GetBitmap(bitmap),
+                size=wx.Size(28, 28),
+                style=wx.NO_BORDER)
+            button.SetToolTipString(help)
+            setattr(self, name, button)
+            controls_sizer.Add(button)
+
+        # the variable grid that will populate the bottom row of the main sizer
+        panel = self
+        self.VariablesGrid = ObjectGrid(panel, style=wx.VSCROLL)
+        # use only to enable drag'n'drop
+        # self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
+        self.VariablesGrid.Bind(
+            wx.grid.EVT_GRID_CELL_CHANGE,     self.OnVariablesGridCellChange)
+        # self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick)
+        # self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,    self.OnVariablesGridEditorShown)
+        self.MainSizer.Add(self.VariablesGrid, flag=wx.GROW)
+
+        # Configure the Variables Grid...
+        # do not include a leftmost column containing the 'row label'
+        self.VariablesGrid.SetRowLabelSize(0)
+        self.VariablesGrid.SetButtons({"Add":    self.AddButton,
+                                       "Delete": self.DeleteButton,
+                                       "Up":     self.UpButton,
+                                       "Down":   self.DownButton})
+        # The custom grid needs to know the default values to use when 'AddButton' creates a new row
+        # NOTE: ObjTable.BACnetObjectType will contain the class name of one of the following classes
+        # (BVObject, BIObject, BOObject, AVObject, AIObject, AOObject, MSVObject, MSIObject, MSOObject)
+        # which inherit from one of (BinaryObject, AnalogObject, MultiSObject)
+        self.VariablesGrid.SetDefaultValue(
+            self.ObjTable.BACnetObjectType.DefaultValues)
+
+        # self.ObjTable: The table that contains the data displayed in the grid
+        # This table was instantiated/created in the initializer for class _BacnetSlavePlug
+        self.VariablesGrid.SetTable(self.ObjTable)
+        self.VariablesGrid.SetEditable(True)
+        # set the column attributes (width, alignment)
+        # NOTE: ObjTable.BACnetObjectType will contain the class name of one of the following classes
+        # (BVObject, BIObject, BOObject, AVObject, AIObject, AOObject, MSVObject, MSIObject, MSOObject)
+        # which inherit from one of (BinaryObject, AnalogObject, MultiSObject)
+        ColumnAlignments = self.ObjTable.BACnetObjectType.ColumnAlignments
+        ColumnSizes = self.ObjTable.BACnetObjectType.ColumnSizes
+        for col in range(self.ObjTable.GetNumberCols()):
+            attr = wx.grid.GridCellAttr()
+            attr.SetAlignment(ColumnAlignments[col], wx.ALIGN_CENTRE)
+            self.VariablesGrid.SetColAttr(col, attr)
+            self.VariablesGrid.SetColMinimalWidth(col, ColumnSizes[col])
+            self.VariablesGrid.AutoSizeColumn(col, False)
+
+        # layout the items in all sizers, and show them too.
+        self.SetSizer(self.MainSizer)    # Have the wondow 'own' the sizer...
+        # self.MainSizer.ShowItems(True)  # not needed once the window 'owns' the sizer (SetSizer())
+        # self.MainSizer.Layout()         # not needed once the window 'owns' the sizer (SetSizer())
+
+        # Refresh the view of the grid...
+        #   We ask the table to do that, who in turn will configure the grid for us!!
+        #   It will configure the CellRenderers and CellEditors taking into account the type of
+        #   BACnet object being shown in the grid!!
+        #
+        #   Yes, I (Mario de Sousa) know this architecture does not seem to make much sense.
+        #   It seems to me that the cell renderers etc. should all be configured right here.
+        #   Unfortunately we inherit from the customTable and customGrid classes in Beremiz
+        #   (in order to maintain GUI consistency), so we have to adopt their way of doing things.
+        #
+        # NOTE: ObjectTable.ResetView() (remember, ObjTable is of class ObjectTable)
+        #         calls ObjectTable._updateColAttrs(), who will do the configuring.
+        self.ObjTable.ResetView(self.VariablesGrid)
+
+    def RefreshView(self):
+        # print "ObjectEditor.RefreshView() called!!!"
+        # Check for Duplicate Object IDs is only done within same BACnet object type (ID is unique by type).
+        # The VariablesGrid class can handle it by itself.
+        self.VariablesGrid.HighlightDuplicateObjectIDs()
+        # Check for Duplicate Object Names must be done globally (Object Name is unique within bacnet server)
+        # Only the BacnetSlaveEditorPlug can and will handle this.
+        # self.window.HighlightAllDuplicateObjectNames()
+
+    #
+    # Event handlers for the Variables Grid #
+    #
+    def OnVariablesGridCellChange(self, event):
+        col = event.GetCol()
+        # print "ObjectEditor.OnVariablesGridCellChange(row=%s, col=%s)
+        # called!!!" % (row, col)
+        self.ObjTable.ChangesToSave = True
+        if self.ObjTable.GetColLabelValue(col) == "Object Identifier":
+            # an Object ID was changed => must check duplicate object IDs.
+            self.VariablesGrid.HighlightDuplicateObjectIDs()
+        if self.ObjTable.GetColLabelValue(col) == "Object Name":
+            # an Object Name was changed => must check duplicate object names.
+            # Note that this must be done to _all_ BACnet objects, and not just the objects
+            # of the same BACnet class (Binary Value, Analog Input, ...)
+            # So we have the BacnetSlaveEditorPlug class do it...
+            self.window.HighlightAllDuplicateObjectNames()
+        # There are changes to save =>
+        # udate the enabled/disabled state of the 'save' option in the 'file' menu
+        self.window.RefreshBeremizWindow()
+        event.Skip()
+
+    def OnVariablesGridCellLeftClick(self, event):
+        pass
+
+    def OnVariablesGridEditorShown(self, event):
+        pass
+
+    def HighlightDuplicateObjectNames(self, AllObjectNamesFreq):
+        return self.VariablesGrid.HighlightDuplicateObjectNames(AllObjectNamesFreq)
+
+
+class BacnetSlaveEditorPlug(ConfTreeNodeEditor):
+    # inheritance tree
+    #  wx.SplitterWindow-->EditorPanel-->ConfTreeNodeEditor-->BacnetSlaveEditorPlug
+    #
+    # self.Controller -> The object that controls the data displayed in this editor
+    #                    In our case, the object of class _BacnetSlavePlug
+
+    CONFNODEEDITOR_TABS = [
+        (_("Analog Value Objects"),       "_create_AV_ObjectEditor"),
+        (_("Analog Output Objects"),      "_create_AO_ObjectEditor"),
+        (_("Analog Input Objects"),       "_create_AI_ObjectEditor"),
+        (_("Binary Value Objects"),       "_create_BV_ObjectEditor"),
+        (_("Binary Output Objects"),      "_create_BO_ObjectEditor"),
+        (_("Binary Input Objects"),       "_create_BI_ObjectEditor"),
+        (_("Multi-State Value Objects"),  "_create_MSV_ObjectEditor"),
+        (_("Multi-State Output Objects"), "_create_MSO_ObjectEditor"),
+        (_("Multi-State Input Objects"), "_create_MSI_ObjectEditor")]
+
+    def _create_AV_ObjectEditor(self, parent):
+        self.AV_ObjectEditor = ObjectEditor(
+            parent, self, self.Controler, self.Controler.ObjTables["AV_Obj"])
+        return self.AV_ObjectEditor
+
+    def _create_AO_ObjectEditor(self, parent):
+        self.AO_ObjectEditor = ObjectEditor(
+            parent, self, self.Controler, self.Controler.ObjTables["AO_Obj"])
+        return self.AO_ObjectEditor
+
+    def _create_AI_ObjectEditor(self, parent):
+        self.AI_ObjectEditor = ObjectEditor(
+            parent, self, self.Controler, self.Controler.ObjTables["AI_Obj"])
+        return self.AI_ObjectEditor
+
+    def _create_BV_ObjectEditor(self, parent):
+        self.BV_ObjectEditor = ObjectEditor(
+            parent, self, self.Controler, self.Controler.ObjTables["BV_Obj"])
+        return self.BV_ObjectEditor
+
+    def _create_BO_ObjectEditor(self, parent):
+        self.BO_ObjectEditor = ObjectEditor(
+            parent, self, self.Controler, self.Controler.ObjTables["BO_Obj"])
+        return self.BO_ObjectEditor
+
+    def _create_BI_ObjectEditor(self, parent):
+        self.BI_ObjectEditor = ObjectEditor(
+            parent, self, self.Controler, self.Controler.ObjTables["BI_Obj"])
+        return self.BI_ObjectEditor
+
+    def _create_MSV_ObjectEditor(self, parent):
+        self.MSV_ObjectEditor = ObjectEditor(
+            parent, self, self.Controler, self.Controler.ObjTables["MSV_Obj"])
+        return self.MSV_ObjectEditor
+
+    def _create_MSO_ObjectEditor(self, parent):
+        self.MSO_ObjectEditor = ObjectEditor(
+            parent, self, self.Controler, self.Controler.ObjTables["MSO_Obj"])
+        return self.MSO_ObjectEditor
+
+    def _create_MSI_ObjectEditor(self, parent):
+        self.MSI_ObjectEditor = ObjectEditor(
+            parent, self, self.Controler, self.Controler.ObjTables["MSI_Obj"])
+        return self.MSI_ObjectEditor
+
+    def __init__(self, parent, controler, window, editable=True):
+        self.Editable = editable
+        ConfTreeNodeEditor.__init__(self, parent, controler, window)
+
+    def __del__(self):
+        self.Controler.OnCloseEditor(self)
+
+    def GetConfNodeMenuItems(self):
+        return []
+
+    def RefreshConfNodeMenu(self, confnode_menu):
+        return
+
+    def RefreshView(self):
+        self.HighlightAllDuplicateObjectNames()
+        ConfTreeNodeEditor.RefreshView(self)
+        self. AV_ObjectEditor.RefreshView()
+        self. AO_ObjectEditor.RefreshView()
+        self. AI_ObjectEditor.RefreshView()
+        self. BV_ObjectEditor.RefreshView()
+        self. BO_ObjectEditor.RefreshView()
+        self. BI_ObjectEditor.RefreshView()
+        self.MSV_ObjectEditor.RefreshView()
+        self.MSO_ObjectEditor.RefreshView()
+        self.MSI_ObjectEditor.RefreshView()
+
+    def HighlightAllDuplicateObjectNames(self):
+        ObjectNamesCount = self.Controler.GetObjectNamesCount()
+        self. AV_ObjectEditor.HighlightDuplicateObjectNames(ObjectNamesCount)
+        self. AO_ObjectEditor.HighlightDuplicateObjectNames(ObjectNamesCount)
+        self. AI_ObjectEditor.HighlightDuplicateObjectNames(ObjectNamesCount)
+        self. BV_ObjectEditor.HighlightDuplicateObjectNames(ObjectNamesCount)
+        self. BO_ObjectEditor.HighlightDuplicateObjectNames(ObjectNamesCount)
+        self. BI_ObjectEditor.HighlightDuplicateObjectNames(ObjectNamesCount)
+        self.MSV_ObjectEditor.HighlightDuplicateObjectNames(ObjectNamesCount)
+        self.MSO_ObjectEditor.HighlightDuplicateObjectNames(ObjectNamesCount)
+        self.MSI_ObjectEditor.HighlightDuplicateObjectNames(ObjectNamesCount)
+        return None
+
+    def RefreshBeremizWindow(self):
+        # self.ParentWindow is the top level Beremiz class (object) that
+        #                   handles the beremiz window and layout
+
+        # Refresh the title of the Beremiz window
+        #  (it changes depending on whether there are
+        #   changes to save!! )
+        self.ParentWindow.RefreshTitle()
+
+        # Refresh the enabled/disabled state of the
+        #  entries in the main 'file' menu.
+        #  ('Save' sub-menu should become enabled
+        #   if there are changes to save! )
+        self.ParentWindow.RefreshFileMenu()
+
+        # self.ParentWindow.RefreshEditMenu()
+        # self.ParentWindow.RefreshPageTitles()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (c) 2017 Mario de Sousa (msousa@fe.up.pt)
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# This code is made available on the understanding that it will not be
+# used in safety-critical situations without a full and competent review.
+
+
+from __future__ import absolute_import
+
+from bacnet.bacnet import *
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/bacnet.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,729 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard.
+# This files implements the bacnet plugin for Beremiz, adding BACnet server support.
+#
+# Copyright (c) 2017 Mario de Sousa (msousa@fe.up.pt)
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# This code is made available on the understanding that it will not be
+# used in safety-critical situations without a full and competent review.
+
+from __future__ import absolute_import
+
+import os
+from collections import Counter
+from datetime import datetime
+import pickle
+
+import wx
+
+from bacnet.BacnetSlaveEditor import *
+from bacnet.BacnetSlaveEditor import ObjectProperties
+from PLCControler import LOCATION_CONFNODE, LOCATION_VAR_MEMORY
+
+base_folder = os.path.split(
+    os.path.dirname(os.path.realpath(__file__)))[0]
+base_folder = os.path.join(base_folder, "..")
+BacnetPath = os.path.join(base_folder, "BACnet")
+BacnetLibraryPath = os.path.join(BacnetPath, "lib")
+BacnetIncludePath = os.path.join(BacnetPath, "include")
+BacnetIncludePortPath = os.path.join(BacnetPath, "ports")
+BacnetIncludePortPath = os.path.join(BacnetIncludePortPath, "linux")
+
+# Parameters to be monkey patched in beremiz customizations
+BACNET_VENDOR_ID = 9999
+BACNET_VENDOR_NAME = "Beremiz.org"
+BACNET_DEVICE_MODEL_NAME = "Beremiz PLC"
+
+#
+#
+#
+# S L A V E    D E V I C E              #
+#
+#
+#
+
+# NOTE: Objects of class _BacnetSlavePlug are never instantiated directly.
+#       The objects are instead instantiated from class FinalCTNClass
+#       FinalCTNClass inherits from: - ConfigTreeNode
+#                                    - The tree node plug (in our case _BacnetSlavePlug)
+# class _BacnetSlavePlug:
+
+
+class RootClass(object):
+    XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
+    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+      <xsd:element name="BACnetServerNode">
+        <xsd:complexType>
+          <xsd:attribute name="Network_Interface"      type="xsd:string"  use="optional" default="eth0"/>
+          <xsd:attribute name="UDP_Port_Number"                           use="optional" default="47808">
+            <xsd:simpleType>
+                <xsd:restriction base="xsd:integer">
+                    <xsd:minInclusive value="0"/>
+                    <xsd:maxInclusive value="65535"/>
+                </xsd:restriction>
+            </xsd:simpleType>
+          </xsd:attribute>
+          <xsd:attribute name="BACnet_Communication_Control_Password"
+                                                       type="xsd:string"  use="optional" default="Malba Tahan"/>
+          <xsd:attribute name="BACnet_Device_ID"                          use="optional" default="0">
+            <xsd:simpleType>
+                <xsd:restriction base="xsd:integer">
+                    <xsd:minInclusive value="0"/>
+                    <xsd:maxInclusive value="4194302"/>
+                </xsd:restriction>
+            </xsd:simpleType>
+          </xsd:attribute>
+          <xsd:attribute name="BACnet_Device_Name"        type="xsd:string"  use="optional" default="Beremiz device 0"/>
+          <xsd:attribute name="BACnet_Device_Location"    type="xsd:string"  use="optional" default=""/>
+          <xsd:attribute name="BACnet_Device_Description" type="xsd:string"  use="optional" default="Beremiz device 0"/>
+          <xsd:attribute name="BACnet_Device_Application_Software_Version" type="xsd:string"  use="optional" default="1.0"/>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:schema>
+    """
+    # NOTE: BACnet device (object) IDs are 22 bits long (not counting the 10 bits for the type ID)
+    #       so the Device instance ID is limited from 0 to 22^2-1 = 4194303
+    #       However, 4194303 is reserved for special use (similar to NULL pointer), so last
+    #       valid ID becomes 4194302
+
+    # The class/object that will render the graphical interface to edit the
+    #    BacnetSlavePlug's configuration parameters. The object of class BacnetSlaveEditorPlug
+    #    will be instantiated by the ConfigTreeNode class.
+    #    This BacnetSlaveEditorPlug object can be accessed from _BacnetSlavePlug as
+    #    'self._View'
+    #    See the following note to understand how this is possible!
+    #
+    # NOTE: Objects of class _BacnetSlavePlug are never instantiated directly.
+    #       The objects are instead instantiated from class FinalCTNClass
+    #       FinalCTNClass inherits from: - ConfigTreeNode
+    #                                    - The tree node plug (in our case _BacnetSlavePlug)
+    #
+    #       This means that objects of class _BacnetSlavePlug may safely access all the members
+    #       of classes ConfigTreeNode as well as FinalCTNClass (since they are always instantiated
+    #       as a FinalCTNClass)
+    EditorType = BacnetSlaveEditorPlug
+
+    # The following classes follow the model/viewer design pattern
+    #
+    # _BacnetSlavePlug       - contains the model (i.e. configuration parameters)
+    # BacnetSlaveEditorPlug  - contains the viewer (and editor, so it includes the 'controller' part of the
+    #                                    design pattern which in this case is not separated from the viewer)
+    #
+    # The _BacnetSlavePlug      object is 'permanent', i.e. it exists as long as the beremiz project is open
+    # The BacnetSlaveEditorPlug object is 'transient', i.e. it exists only while the editor is visible/open
+    #                                                         in the editing panel. It is destoryed whenever
+    #                                                         the user closes the corresponding tab in the
+    #                                                         editing panel, and a new object is created when
+    #                                                         the editor is re-opened.
+    #
+    # _BacnetSlavePlug contains:  AV_ObjTable, ...
+    #                             (these are the objects that actually store the config parameters or 'model'
+    #                              and are therefore stored to a file)
+    #
+    # _BacnetSlavePlug contains:  AV_VarEditor, ...
+    #                             (these are the objects that implement a grid table to edit/view the
+    #                              corresponding mode parameters)
+    #
+    #  Logic:
+    #    - The xx_VarEditor classes inherit from wx.grid.Grid
+    #    - The xx_ObjTable  classes inherit from wx.grid.PyGridTableBase
+    #  To be more precise, the inheritance tree is actually:
+    #    xx_VarEditor -> ObjectGrid -> CustomGrid   -> wx.grid.Grid
+    #    xx_ObjTable  -> ObjectTable -> CustomTable -> wx.grid.PyGridTableBase)
+    #
+    #  Note that wx.grid.Grid is prepared to work with wx.grid.PyGridTableBase as the container of
+    #  data that is displayed and edited in the Grid.
+
+    ConfNodeMethods = [
+        {"bitmap": "ExportSlave",
+         "name": _("Export slave"),
+         "tooltip": _("Export BACnet slave to EDE file"),
+         "method": "_ExportBacnetSlave"},
+    ]
+
+    def __init__(self):
+        # Initialize the dictionary that stores the current configuration for the Analog/Digital/MultiValued Variables
+        #   in this BACnet server.
+        self.ObjTablesData = {}
+
+        # Each list will contain an entry for each row in the xxxxVar grid!!
+        #   Each entry/row will be a dictionary
+        #     Each dictionary will contain all entries/data
+        # for one row in the grid.
+
+        self.ObjTablesData["AV_Obj"] = []
+        self.ObjTablesData["AO_Obj"] = []
+        self.ObjTablesData["AI_Obj"] = []
+        self.ObjTablesData["BV_Obj"] = []
+        self.ObjTablesData["BO_Obj"] = []
+        self.ObjTablesData["BI_Obj"] = []
+        self.ObjTablesData["MSV_Obj"] = []
+        self.ObjTablesData["MSO_Obj"] = []
+        self.ObjTablesData["MSI_Obj"] = []
+
+        self.ObjTablesData["EDEfile_parm"] = {"next_EDE_file_version": 1}
+
+        # EDE files inlcude extra parameters (ex. file version)
+        # We would like to save the parameters the user configures
+        # so they are available the next time the user opens the project.
+        # Since this plugin is only storing the ObjTablesData[] dict
+        # to file, we add that info to this dictionary too.
+        # Yes, I know this is kind of a
+        # hack.
+
+        filepath = self.GetFileName()
+        if os.path.isfile(filepath):
+            self.LoadFromFile(filepath)
+
+        self.ObjTables = {}
+        self.ObjTables["AV_Obj"] = ObjectTable(
+            self, self.ObjTablesData["AV_Obj"],  AVObject)
+        self.ObjTables["AO_Obj"] = ObjectTable(
+            self, self.ObjTablesData["AO_Obj"],  AOObject)
+        self.ObjTables["AI_Obj"] = ObjectTable(
+            self, self.ObjTablesData["AI_Obj"],  AIObject)
+        self.ObjTables["BV_Obj"] = ObjectTable(
+            self, self.ObjTablesData["BV_Obj"],  BVObject)
+        self.ObjTables["BO_Obj"] = ObjectTable(
+            self, self.ObjTablesData["BO_Obj"],  BOObject)
+        self.ObjTables["BI_Obj"] = ObjectTable(
+            self, self.ObjTablesData["BI_Obj"],  BIObject)
+        self.ObjTables["MSV_Obj"] = ObjectTable(
+            self, self.ObjTablesData["MSV_Obj"], MSVObject)
+        self.ObjTables["MSO_Obj"] = ObjectTable(
+            self, self.ObjTablesData["MSO_Obj"], MSOObject)
+        self.ObjTables["MSI_Obj"] = ObjectTable(
+            self, self.ObjTablesData["MSI_Obj"], MSIObject)
+
+    #
+    # Functions to be called by CTNClass #
+    #
+    # The following functions would be somewhat equvalent to virtual functions/methods in C++ classes
+    # They will be called by the base class (CTNClass) from which this
+    # _BacnetSlavePlug class derives.
+
+    def GetCurrentNodeName(self):
+        return self.CTNName()
+
+    def GetFileName(self):
+        return os.path.join(self.CTNPath(), 'bacnet_slave')
+
+    def OnCTNSave(self, from_project_path=None):
+        return self.SaveToFile(self.GetFileName())
+
+    def CTNTestModified(self):
+        # self.ChangesToSave: Check whether any of the parameters, defined in the XSD above, were changed.
+        #                     This is handled by the ConfigTreeNode class
+        #                     (Remember that no objects are ever instantiated from _BacnetSlavePlug.
+        #                      Objects are instead created from FinalCTNClass, which derives from
+        #                      _BacnetSlavePlug and ConfigTreeNode. This means that we can exceptionally
+        # consider that all objects of type _BacnetSlavePlug will also be a
+        # ConfigTreeNode).
+        result = self.ChangesToSave \
+            or self.ObjTables["AV_Obj"].ChangesToSave \
+            or self.ObjTables["AO_Obj"].ChangesToSave \
+            or self.ObjTables["AI_Obj"].ChangesToSave \
+            or self.ObjTables["BV_Obj"].ChangesToSave \
+            or self.ObjTables["BO_Obj"].ChangesToSave \
+            or self.ObjTables["BI_Obj"].ChangesToSave \
+            or self.ObjTables["MSV_Obj"].ChangesToSave \
+            or self.ObjTables["MSO_Obj"].ChangesToSave \
+            or self.ObjTables["MSI_Obj"].ChangesToSave
+        return result
+
+    # Currently not needed. Override _OpenView() in case we need to do some special stuff whenever the editor is opened!
+    # def _OpenView(self, name=None, onlyopened=False):
+        # print "_BacnetSlavePlug._OpenView() Called!!!"
+        # ConfigTreeNode._OpenView(self, name, onlyopened)
+        # print self._View
+        # if self._View is not None:
+        #     self._View.SetBusId(self.GetCurrentLocation())
+        # return self._View
+
+    def GetVariableLocationTree(self):
+        current_location = self.GetCurrentLocation()
+        # see comment in CTNGenerate_C regarding identical line of code!
+        locstr = ".".join(map(str, current_location))
+
+        # IDs used by BACnet to identify object types/class.
+        #     OBJECT_ANALOG_INPUT       =  0,
+        #     OBJECT_ANALOG_OUTPUT      =  1,
+        #     OBJECT_ANALOG_VALUE       =  2,
+        #     OBJECT_BINARY_INPUT       =  3,
+        #     OBJECT_BINARY_OUTPUT      =  4,
+        #     OBJECT_BINARY_VALUE       =  5,
+        #     OBJECT_MULTI_STATE_INPUT  = 13,
+        #     OBJECT_MULTI_STATE_OUTPUT = 14,
+        #     OBJECT_MULTI_STATE_VALUE  = 19,
+        #
+        #  Since Binary Value, Analog Value, etc. objects may use the same
+        # object ID (since they have distinct class IDs), we must also distinguish them in some way in
+        # the %MX0.3.4 IEC 61131-3 syntax.
+        #
+        # For this reason we add the BACnet class identifier to the %MX0.5.3 location.
+        # For example, for a BACnet plugin in location '0' of the Beremiz configuration tree,
+        #  all      Binary Values will be mapped onto: %MX0.5.xxx    (xxx is object ID)
+        #  all Multi State Values will be mapped onto: %MB0.19.xxx   (xxx is object ID)
+        #  all      Analog Values will be mapped onto: %MD0.2.xxx    (xxx is object ID)
+        #  etc..
+        #
+        #   Value objects will be mapped onto %M
+        #   Input objects will be mapped onto %I
+        #  Output objects will be mapped onto %Q
+
+        BACnetEntries = []
+        BACnetEntries.append(self.GetSlaveLocationTree(
+            self.ObjTablesData["AV_Obj"], 32, 'REAL', 'D', locstr + '.2', 'Analog Values'))
+        BACnetEntries.append(self.GetSlaveLocationTree(
+            self.ObjTablesData["AO_Obj"], 32, 'REAL', 'D', locstr + '.1', 'Analog Outputs'))
+        BACnetEntries.append(self.GetSlaveLocationTree(
+            self.ObjTablesData["AI_Obj"], 32, 'REAL', 'D', locstr + '.0', 'Analog Inputs'))
+        BACnetEntries.append(self.GetSlaveLocationTree(
+            self.ObjTablesData["BV_Obj"],  1, 'BOOL', 'X', locstr + '.5', 'Binary Values'))
+        BACnetEntries.append(self.GetSlaveLocationTree(
+            self.ObjTablesData["BO_Obj"],  1, 'BOOL', 'X', locstr + '.4', 'Binary Outputs'))
+        BACnetEntries.append(self.GetSlaveLocationTree(
+            self.ObjTablesData["BI_Obj"],  1, 'BOOL', 'X', locstr + '.3', 'Binary Inputs'))
+        BACnetEntries.append(self.GetSlaveLocationTree(
+            self.ObjTablesData["MSV_Obj"],  8, 'BYTE', 'B', locstr + '.19', 'Multi State Values'))
+        BACnetEntries.append(self.GetSlaveLocationTree(
+            self.ObjTablesData["MSO_Obj"],  8, 'BYTE', 'B', locstr + '.14', 'Multi State Outputs'))
+        BACnetEntries.append(self.GetSlaveLocationTree(
+            self.ObjTablesData["MSI_Obj"],  8, 'BYTE', 'B', locstr + '.13', 'Multi State Inputs'))
+
+        return {"name": self.BaseParams.getName(),
+                "type": LOCATION_CONFNODE,
+                "location": locstr + ".x",
+                "children": BACnetEntries}
+
+    #
+    # Helper functions/methods #
+    #
+    # a helper function to GetVariableLocationTree()
+    def GetSlaveLocationTree(self, ObjTablesData, size_in_bits, IECdatatype, location_size, location_str, name):
+        BACnetObjectEntries = []
+        for xx_ObjProp in ObjTablesData:
+            BACnetObjectEntries.append({
+                "name": str(xx_ObjProp["Object Identifier"]) + ': ' + xx_ObjProp["Object Name"],
+                "type": LOCATION_VAR_MEMORY,  # LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, or LOCATION_VAR_MEMORY
+                "size": size_in_bits,  # 1 or 16
+                "IEC_type": IECdatatype,  # 'BOOL', 'WORD', ...
+                "var_name": "var_name",  # seems to be ignored??
+                "location": location_size + location_str + "." + str(xx_ObjProp["Object Identifier"]),
+                "description": "description",  # seems to be ignored?
+                "children": []})
+
+        return {"name": name,
+                "type": LOCATION_CONFNODE,
+                "location": location_str + ".x",
+                "children": BACnetObjectEntries}
+
+    # Returns a dictionary with:
+    #      keys: names  of BACnet objects
+    #     value: number of BACnet objects using this same name
+    #            (values larger than 1 indicates an error as BACnet requires unique names)
+    def GetObjectNamesCount(self):
+        # The dictionary is built by first creating a list containing the names of _ALL_
+        # BACnet objects currently configured by the user (using the GUI)
+        ObjectNames = []
+        ObjectNames.extend(
+            self.ObjTables["AV_Obj"].GetAllValuesByName("Object Name"))
+        ObjectNames.extend(
+            self.ObjTables["AO_Obj"].GetAllValuesByName("Object Name"))
+        ObjectNames.extend(
+            self.ObjTables["AI_Obj"].GetAllValuesByName("Object Name"))
+        ObjectNames.extend(
+            self.ObjTables["BV_Obj"].GetAllValuesByName("Object Name"))
+        ObjectNames.extend(
+            self.ObjTables["BO_Obj"].GetAllValuesByName("Object Name"))
+        ObjectNames.extend(
+            self.ObjTables["BI_Obj"].GetAllValuesByName("Object Name"))
+        ObjectNames.extend(
+            self.ObjTables["MSV_Obj"].GetAllValuesByName("Object Name"))
+        ObjectNames.extend(
+            self.ObjTables["MSO_Obj"].GetAllValuesByName("Object Name"))
+        ObjectNames.extend(
+            self.ObjTables["MSI_Obj"].GetAllValuesByName("Object Name"))
+        # This list is then transformed into a collections.Counter class
+        # Which is then transformed into a dictionary using dict()
+        return dict(Counter(ObjectNames))
+
+    # Check whether the current configuration contains BACnet objects configured
+    # with the same identical object name  (returns True or False)
+    def HasDuplicateObjectNames(self):
+        ObjectNamesCount = self.GetObjectNamesCount()
+        for ObjName in ObjectNamesCount:
+            if ObjectNamesCount[ObjName] > 1:
+                return True
+        return False
+
+    # Check whether any object ID is used more than once (not valid in BACnet)
+    # (returns True or False)
+    def HasDuplicateObjectIDs(self):
+        res = self.ObjTables["AV_Obj"].HasDuplicateObjectIDs()
+        res = res or self.ObjTables["AO_Obj"].HasDuplicateObjectIDs()
+        res = res or self.ObjTables["AI_Obj"].HasDuplicateObjectIDs()
+        res = res or self.ObjTables["BV_Obj"].HasDuplicateObjectIDs()
+        res = res or self.ObjTables["BO_Obj"].HasDuplicateObjectIDs()
+        res = res or self.ObjTables["BI_Obj"].HasDuplicateObjectIDs()
+        res = res or self.ObjTables["MSV_Obj"].HasDuplicateObjectIDs()
+        res = res or self.ObjTables["MSO_Obj"].HasDuplicateObjectIDs()
+        res = res or self.ObjTables["MSI_Obj"].HasDuplicateObjectIDs()
+        return res
+
+    #
+    # Methods related to files (saving/loading/exporting) #
+    #
+    def SaveToFile(self, filepath):
+        # Save node data in file
+        # The configuration data declared in the XSD string will be saved by the ConfigTreeNode class,
+        # so we only need to save the data that is stored in ObjTablesData objects
+        # Note that we do not store the ObjTables objects. ObjTables is of a class that
+        # contains more stuff we do not need to store. Actually it is a bad idea to store
+        # this extra stuff (as we would make the files we generate dependent on the actual
+        # version of the wx library we are using!!! Remember that ObjTables evetually
+        # derives/inherits from wx.grid.PyGridTableBase). Another reason not to store the whole
+        # object is because it is not pickable (i.e. pickle.dump() cannot handle it)!!
+        try:
+            fd = open(filepath,   "w")
+            pickle.dump(self.ObjTablesData, fd)
+            fd.close()
+            # On successfull save, reset flags to indicate no more changes that
+            # need saving
+            self.ObjTables["AV_Obj"].ChangesToSave = False
+            self.ObjTables["AO_Obj"].ChangesToSave = False
+            self.ObjTables["AI_Obj"].ChangesToSave = False
+            self.ObjTables["BV_Obj"].ChangesToSave = False
+            self.ObjTables["BO_Obj"].ChangesToSave = False
+            self.ObjTables["BI_Obj"].ChangesToSave = False
+            self.ObjTables["MSV_Obj"].ChangesToSave = False
+            self.ObjTables["MSO_Obj"].ChangesToSave = False
+            self.ObjTables["MSI_Obj"].ChangesToSave = False
+            return True
+        except Exception:
+            return _("Unable to save to file \"%s\"!") % filepath
+
+    def LoadFromFile(self, filepath):
+        # Load the data that is saved in SaveToFile()
+        try:
+            fd = open(filepath,   "r")
+            self.ObjTablesData = pickle.load(fd)
+            fd.close()
+            return True
+        except Exception:
+            return _("Unable to load file \"%s\"!") % filepath
+
+    def _ExportBacnetSlave(self):
+        dialog = wx.FileDialog(self.GetCTRoot().AppFrame,
+                               _("Choose a file"),
+                               os.path.expanduser("~"),
+                               "%s_EDE.csv" % self.CTNName(),
+                               _("EDE files (*_EDE.csv)|*_EDE.csv|All files|*.*"),
+                               wx.SAVE | wx.OVERWRITE_PROMPT)
+        if dialog.ShowModal() == wx.ID_OK:
+            result = self.GenerateEDEFile(dialog.GetPath())
+            result = False
+            if result:
+                self.GetCTRoot().logger.write_error(
+                    _("Error: Export slave failed\n"))
+        dialog.Destroy()
+
+    def GenerateEDEFile(self, filename):
+        template_file_dir = os.path.join(
+            os.path.split(__file__)[0], "ede_files")
+
+        # The BACnetServerNode attribute is added dynamically by ConfigTreeNode._AddParamsMembers()
+        # It will be an XML parser object created by
+        # GenerateParserFromXSDstring(self.XSD).CreateRoot()
+        BACnet_Device_ID = self.BACnetServerNode.getBACnet_Device_ID()
+
+        # The EDE file contains a header that includes general project data (name, author, ...)
+        # Instead of asking the user for this data, we get it from the configuration
+        # of the Beremiz project itself.
+        # We ask the root Config Tree Node for the data...
+        ProjProp = {}
+        FileProp = {}
+
+        # this should be an object of class ProjectController
+        CTN_Root = self.GetCTRoot()
+
+        # this should be an object capable of parsing
+        # PLCopen XML files. The parser is created automatically
+        # (i.e. using GenerateParserFromXSD() from xmlclass module)
+        # using the PLCopen XSD file defining the format of the XML.
+        # See the file plcopen/plcopen.py
+        Project = CTN_Root.Project
+        if Project is not None:
+            # getcontentHeader() and getfileHeader() are functions that are conditionally defined in
+            # plcopn/plcopen.py    We cannot rely on their existance
+            if getattr(Project, "getcontentHeader", None) is not None:
+                ProjProp = Project.getcontentHeader()
+                # getcontentHeader() returns a dictionary. Available keys are:
+                # "projectName", "projectVersion", "modificationDateTime",
+                # "organization", "authorName", "language", "pageSize", "scaling"
+            if getattr(Project, "getfileHeader", None) is not None:
+                FileProp = Project.getfileHeader()
+                # getfileHeader() returns a dictionary. Available keys are:
+                # "companyName", "companyURL", "productName", "productVersion",
+                # "productRelease", "creationDateTime", "contentDescription"
+
+        ProjName = ""
+        if "projectName" in ProjProp:
+            ProjName = ProjProp["projectName"]
+        ProjAuthor = ""
+        if "companyName" in FileProp:
+            ProjAuthor += "(" + FileProp["companyName"] + ")"
+        if "authorName" in ProjProp:
+            ProjAuthor = ProjProp["authorName"] + " " + ProjAuthor
+
+        projdata_dict = {}
+        projdata_dict["Project Name"] = ProjName
+        projdata_dict["Project Author"] = ProjAuthor
+        projdata_dict["Current Time"] = datetime.now().strftime(
+            '%Y-%m-%d %H:%M:%S')
+        projdata_dict["EDE file version"] = self.ObjTablesData[
+            "EDEfile_parm"]["next_EDE_file_version"]
+
+        # Next time we generate an EDE file, use another version!
+        self.ObjTablesData["EDEfile_parm"]["next_EDE_file_version"] += 1
+
+        AX_params_format = "%(Object Name)s;" + str(BACnet_Device_ID) + \
+            ";%(Object Name)s;%(BACnetObjTypeID)s;%(Object Identifier)s;%(Description)s;0;;;%(Settable)s;N;;;;%(Unit ID)s;"
+
+        BX_params_format = "%(Object Name)s;" + str(BACnet_Device_ID) + \
+            ";%(Object Name)s;%(BACnetObjTypeID)s;%(Object Identifier)s;%(Description)s;0;0;1;%(Settable)s;N;;;;;"
+
+        MSX_params_format = "%(Object Name)s;" + str(BACnet_Device_ID) + \
+            ";%(Object Name)s;%(BACnetObjTypeID)s;%(Object Identifier)s;%(Description)s;1;1;%(Number of States)s;%(Settable)s;N;;;;;"
+
+        Objects_List = []
+        for ObjType, params_format in [("AV",  AX_params_format),
+                                       ("AO",  AX_params_format),
+                                       ("AI",  AX_params_format),
+                                       ("BV",  BX_params_format),
+                                       ("BO",  BX_params_format),
+                                       ("BI",  BX_params_format),
+                                       ("MSV", MSX_params_format),
+                                       ("MSO", MSX_params_format),
+                                       ("MSI", MSX_params_format)]:
+            self.ObjTables[ObjType + "_Obj"].UpdateAllVirtualProperties()
+            for ObjProp in self.ObjTablesData[ObjType + "_Obj"]:
+                Objects_List.append(params_format % ObjProp)
+
+        # Normalize filename
+        for extension in ["_EDE.csv", "_ObjTypes.csv", "_StateTexts.csv", "_Units.csv"]:
+            if filename.lower().endswith(extension.lower()):
+                filename = filename[:-len(extension)]
+
+        # EDE_header
+        generate_file_name = filename + "_EDE.csv"
+        template_file_name = os.path.join(
+            template_file_dir, "template_EDE.csv")
+        generate_file_content = open(template_file_name).read() % projdata_dict
+        generate_file_handle = open(generate_file_name, 'w')
+        generate_file_handle  .write(generate_file_content)
+        generate_file_handle  .write("\n".join(Objects_List))
+        generate_file_handle  .close()
+
+        # templates of remaining files do not need changes. They are simply
+        # copied unchanged!
+        for extension in ["_ObjTypes.csv", "_StateTexts.csv", "_Units.csv"]:
+            generate_file_name = filename + extension
+            template_file_name = os.path.join(
+                template_file_dir, "template" + extension)
+            generate_file_content = open(template_file_name).read()
+            generate_file_handle = open(generate_file_name, 'w')
+            generate_file_handle  .write(generate_file_content)
+            generate_file_handle  .close()
+
+    #
+    # Generate the source files #
+    #
+    def CTNGenerate_C(self, buildpath, locations):
+        # Determine the current location in Beremiz's project configuration
+        # tree
+        current_location = self.GetCurrentLocation()
+        # The current location of this plugin in Beremiz's configuration tree, separated by underscores
+        #  NOTE: Since BACnet plugin currently does not use sub-branches in the tree (in other words, this
+        #        _BacnetSlavePlug class was actually renamed as the RootClass), the current_location_dots
+        #        will actually be a single number (e.g.: 0 or 3 or 6, corresponding to the location
+        #        in which the plugin was inserted in the Beremiz configuration tree on Beremiz's left panel).
+        locstr = "_".join(map(str, current_location))
+
+        # First check whether all the current parameters (inserted by user in
+        # the GUI) are valid...
+        if self.HasDuplicateObjectNames():
+            self.GetCTRoot().logger.write_warning(
+                _("Error: BACnet server '{a1}.x:{a2}' contains objects with duplicate object names.\n").
+                format(a1=locstr, a2=self.CTNName()))
+            raise Exception(False)
+            # TODO: return an error code instead of raising an exception
+            # (currently unsupported by Beremiz)
+
+        if self.HasDuplicateObjectIDs():
+            self.GetCTRoot().logger.write_warning(
+                _("Error: BACnet server '{a1}.x: {a2}' contains objects with duplicate object identifiers.\n").
+                format(a1=locstr, a2=self.CTNName()))
+            raise Exception(False)
+            # TODO: return an error code instead of raising an exception
+            # (currently unsupported by Beremiz)
+
+        # -------------------------------------------------------------------------------
+        # Create and populate the loc_dict dictionary with all parameters needed to configure
+        #  the generated source code (.c and .h files)
+        # ----------------------------------------------------------------------
+
+        # 1) Create the dictionary (loc_dict = {})
+        loc_dict = {}
+        loc_dict["locstr"] = locstr
+
+        # The BACnetServerNode attribute is added dynamically by ConfigTreeNode._AddParamsMembers()
+        # It will be an XML parser object created by
+        # GenerateParserFromXSDstring(self.XSD).CreateRoot()
+        loc_dict["network_interface"] = self.BACnetServerNode.getNetwork_Interface()
+        loc_dict["port_number"] = self.BACnetServerNode.getUDP_Port_Number()
+        loc_dict["BACnet_Device_ID"] = self.BACnetServerNode.getBACnet_Device_ID()
+        loc_dict["BACnet_Device_Name"] = self.BACnetServerNode.getBACnet_Device_Name()
+        loc_dict["BACnet_Comm_Control_Password"] = self.BACnetServerNode.getBACnet_Communication_Control_Password()
+        loc_dict["BACnet_Device_Location"] = self.BACnetServerNode.getBACnet_Device_Location()
+        loc_dict["BACnet_Device_Description"] = self.BACnetServerNode.getBACnet_Device_Description()
+        loc_dict["BACnet_Device_AppSoft_Version"] = self.BACnetServerNode.getBACnet_Device_Application_Software_Version()
+        loc_dict["BACnet_Vendor_ID"] = BACNET_VENDOR_ID
+        loc_dict["BACnet_Vendor_Name"] = BACNET_VENDOR_NAME
+        loc_dict["BACnet_Model_Name"] = BACNET_DEVICE_MODEL_NAME
+
+        # 2) Add the data specific to each BACnet object type
+        # For each BACnet object type, start off by creating some intermediate helpful lists
+        #  a) parameters_list containing the strings that will
+        #     be included in the C source code, and which will initialize the struct with the
+        #     object (Analog Value, Binary Value, or Multi State Value) parameters
+        #  b) locatedvar_list containing the strings that will
+        #     declare the memory to store the located variables, as well as the
+        #     pointers (required by matiec) that point to that memory.
+
+        # format for delaring IEC 61131-3 variable (and pointer) onto which
+        # BACnet object is mapped
+        locvar_format = '%(Ctype)s ___%(loc)s_%(Object Identifier)s; ' + \
+                        '%(Ctype)s *__%(loc)s_%(Object Identifier)s = &___%(loc)s_%(Object Identifier)s;'
+
+        # format for initializing a ANALOG_VALUE_DESCR struct in C code
+        #    also valid for ANALOG_INPUT and ANALOG_OUTPUT
+        AX_params_format = '{&___%(loc)s_%(Object Identifier)s, ' + \
+            '%(Object Identifier)s, "%(Object Name)s", "%(Description)s", %(Unit ID)d}'
+        # format for initializing a BINARY_VALUE_DESCR struct in C code
+        #    also valid for BINARY_INPUT and BINARY_OUTPUT
+        BX_params_format = '{&___%(loc)s_%(Object Identifier)s, ' + \
+            '%(Object Identifier)s, "%(Object Name)s", "%(Description)s"}'
+
+        # format for initializing a MULTISTATE_VALUE_DESCR struct in C code
+        #    also valid for MULTISTATE_INPUT and MULTISTATE_OUTPUT
+        MSX_params_format = '{&___%(loc)s_%(Object Identifier)s, ' + \
+            '%(Object Identifier)s, "%(Object Name)s", "%(Description)s", %(Number of States)s}'
+
+        # see the comment in GetVariableLocationTree()
+        AV_locstr = 'MD' + locstr + '_2'
+        AO_locstr = 'QD' + locstr + '_1'
+        AI_locstr = 'ID' + locstr + '_0'
+        BV_locstr = 'MX' + locstr + '_5'
+        BO_locstr = 'QX' + locstr + '_4'
+        BI_locstr = 'IX' + locstr + '_3'
+        MSV_locstr = 'MB' + locstr + '_19'
+        MSO_locstr = 'QB' + locstr + '_14'
+        MSI_locstr = 'IB' + locstr + '_13'
+
+        for ObjType,  ObjLocStr,     params_format in [
+                ("AV",  AV_locstr,  AX_params_format),
+                ("AO",  AO_locstr,  AX_params_format),
+                ("AI",  AI_locstr,  AX_params_format),
+                ("BV",  BV_locstr,  BX_params_format),
+                ("BO",  BO_locstr,  BX_params_format),
+                ("BI",  BI_locstr,  BX_params_format),
+                ("MSV", MSV_locstr, MSX_params_format),
+                ("MSO", MSO_locstr, MSX_params_format),
+                ("MSI", MSI_locstr, MSX_params_format)]:
+            parameters_list = []
+            locatedvar_list = []
+            self.ObjTables[ObjType + "_Obj"].UpdateAllVirtualProperties()
+            for ObjProp in self.ObjTablesData[ObjType + "_Obj"]:
+                ObjProp["loc"] = ObjLocStr
+                parameters_list.append(params_format % ObjProp)
+                locatedvar_list.append(locvar_format % ObjProp)
+            loc_dict[ObjType + "_count"] = len(parameters_list)
+            loc_dict[ObjType + "_param"] = ",\n".join(parameters_list)
+            loc_dict[ObjType + "_lvars"] = "\n".join(locatedvar_list)
+
+        # ----------------------------------------------------------------------
+        # Create the C source files that implement the BACnet server
+        # ----------------------------------------------------------------------
+
+        # Names of the .c files that will be generated, based on a template file with same name
+        #   (names without '.c'  --> this will be added later)
+        #   main server.c file is handled separately
+        Generated_BACnet_c_mainfile = "server"
+        Generated_BACnet_c_files = [
+            "ai", "ao", "av", "bi", "bo", "bv", "msi", "mso", "msv", "device"]
+
+        # Names of the .h files that will be generated, based on a template file with same name
+        #   (names without '.h'  --> this will be added later)
+        Generated_BACnet_h_files = [
+            "server", "device", "config_bacnet_for_beremiz",
+            "ai", "ao", "av", "bi", "bo", "bv", "msi", "mso", "msv"
+        ]
+
+        # Generate the files with the source code
+        postfix = "_".join(map(str, current_location))
+        template_file_dir = os.path.join(
+            os.path.split(__file__)[0], "runtime")
+
+        def generate_file(file_name, extension):
+            generate_file_name = os.path.join(
+                buildpath, "%s_%s.%s" % (file_name, postfix, extension))
+            template_file_name = os.path.join(
+                template_file_dir, "%s.%s" % (file_name, extension))
+            generate_file_content = open(template_file_name).read() % loc_dict
+            generate_file_handle = open(generate_file_name, 'w')
+            generate_file_handle.write(generate_file_content)
+            generate_file_handle.close()
+
+        for file_name in Generated_BACnet_c_files:
+            generate_file(file_name, "c")
+        for file_name in Generated_BACnet_h_files:
+            generate_file(file_name, "h")
+        generate_file(Generated_BACnet_c_mainfile, "c")
+        Generated_BACnet_c_mainfile_name = \
+            os.path.join(buildpath, "%s_%s.%s" %
+                         (Generated_BACnet_c_mainfile, postfix, "c"))
+
+        # ----------------------------------------------------------------------
+        # Finally, define the compilation and linking commands and flags
+        # ----------------------------------------------------------------------
+
+        LDFLAGS = []
+        # when using dynamically linked library...
+        # LDFLAGS.append(' -lbacnet')
+        # LDFLAGS.append(' -L"'+BacnetLibraryPath+'"')
+        # LDFLAGS.append(' "-Wl,-rpath,' + BacnetLibraryPath + '"')
+        # when using static library:
+        LDFLAGS.append(
+            ' "' + os.path.join(BacnetLibraryPath, "libbacnet.a") + '"')
+
+        CFLAGS = ' -I"' + BacnetIncludePath + '"'
+        CFLAGS += ' -I"' + BacnetIncludePortPath + '"'
+
+        return [(Generated_BACnet_c_mainfile_name, CFLAGS)], LDFLAGS, True
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/ede_files/template_EDE.csv	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,8 @@
+#EDE (Engineering-Data-Exchange) - generated by Beremiz BACnet plugin;;;;;;;;;;;;;;;
+PROJECT_NAME;%(Project Name)s;;;;;;;;;;;;;;
+VERSION_OF_REFERENCEFILE;%(EDE file version)d;;;;;;;;;;;;;;
+TIMESTAMP_OF_LAST_CHANGE;%(Current Time)s;;;;;;;;;;;;;;
+AUTHOR_OF_LAST_CHANGE;%(Project Author)s;;;;;;;;;;;;;;
+VERSION_OF_LAYOUT;2.1;;;;;;;;;;;;;;
+#mandatory;mandatory;mandatory;mandatory;mandatory;optional;optional;optional;optional;optional;optional;optional;optional;optional;optional;optional
+#keyname;device obj.-instance;object-name;object-type;object-instance;description;present-value-default;min-present-value;max-present-value;settable;supports COV;hi-limit;low-limit;state-text-reference;unit-code;vendor-specific-address
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/ede_files/template_ObjTypes.csv	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,27 @@
+#Encoding of BACnet Object Types;;;
+#Code;Object Type;;
+0;Analog Input;;
+1;Analog Output;;
+2;Analog Value;;
+3;Binary Input ;;
+4;Binary Output;;
+5;Binary Value;;
+6;Calendar;;
+7;Command;;
+8;Device;;
+9;Event-Enrollment;;
+10;File;;
+11;Group;;
+12;Loop;;
+13;Multistate Input;;
+14;Multistate Output
+15;Notification Class
+16;Program
+17;Schedule
+18;Averaging
+19;Multistate Value
+20;Trend Log
+21;Life Safety Point
+22;Life Safety Zone
+23;Accumulator
+24;Pulse Converter
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/ede_files/template_StateTexts.csv	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+#State Text Reference;;;;;;;
+#Reference Number;Text 1;Text 2;Text 3;Text 4;Text 5;...;Text n
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/ede_files/template_Units.csv	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,264 @@
+#Encoding of BACnet Engineering Units;
+#Code;Unit Text
+166;METERS-PER-SECOND-PER-SECOND
+0;SQUARE-METERS
+116;SQUARE-CENTIMETERS
+1;SQUARE-FEET
+115;SQUARE-INCHES
+105;CURRENCY1
+106;CURRENCY2
+107;CURRENCY3
+108;CURRENCY4
+109;CURRENCY5
+110;CURRENCY6
+111;CURRENCY7
+112;CURRENCY8
+113;CURRENCY9
+114;CURRENCY10
+2;MILLIAMPERES
+3;AMPERES
+167;AMPERES-PER-METER
+168;AMPERES-PER-SQUARE-METER
+169;AMPERE-SQUARE-METERS
+199;DECIBELS
+200;DECIBELS-MILLIVOLT
+201;DECIBELS-VOLT
+170;FARADS
+171;HENRYS
+4;OHMS
+237;OHM-METER-SQUARED-PER-METER
+172;OHM-METERS
+145;MILLIOHMS
+122;KILOHMS
+123;MEGOHMS
+190;MICROSIEMENS
+202;MILLISIEMENS
+173;SIEMENS
+174;SIEMENS-PER-METER
+175;TESLAS
+5;VOLTS
+124;MILLIVOLTS
+6;KILOVOLTS
+7;MEGAVOLTS
+8;VOLT-AMPERES
+9;KILOVOLT-AMPERES
+10;MEGAVOLT-AMPERES
+11;VOLT-AMPERES-REACTIVE
+12;KILOVOLT-AMPERES-REACTIVE
+13;MEGAVOLT-AMPERES-REACTIVE
+176;VOLTS-PER-DEGREE-KELVIN
+177;VOLTS-PER-METER
+14;DEGREES-PHASE
+15;POWER-FACTOR
+178;WEBERS
+238;AMPERE-SECONDS
+239;VOLT-AMPERE-HOURS
+240;KILOVOLT-AMPERE-HOURS
+241;MEGAVOLT-AMPERE-HOURS
+242;VOLT-AMPERE-HOURS-REACTIVE
+243;KILOVOLT-AMPERE-HOURS-REACTIVE
+244;MEGAVOLT-AMPERE-HOURS-REACTIVE
+245;VOLT-SQUARE-HOURS
+246;AMPERE-SQUARE-HOURS
+16;JOULES
+17;KILOJOULES
+125;KILOJOULES-PER-KILOGRAM
+126;MEGAJOULES
+18;WATT-HOURS
+19;KILOWATT-HOURS
+146;MEGAWATT-HOURS
+203;WATT-HOURS-REACTIVE
+204;KILOWATT-HOURS-REACTIVE
+205;MEGAWATT-HOURS-REACTIVE
+20;BTUS
+147;KILO-BTUS
+148;MEGA-BTUS
+21;THERMS
+22;TON-HOURS
+23;JOULES-PER-KILOGRAM-DRY-AIR
+149;KILOJOULES-PER-KILOGRAM-DRY-AIR
+150;MEGAJOULES-PER-KILOGRAM-DRY-AIR
+24;BTUS-PER-POUND-DRY-AIR
+117;BTUS-PER-POUND
+127;JOULES-PER-DEGREE-KELVIN
+151;KILOJOULES-PER-DEGREE-KELVIN
+152;MEGAJOULES-PER-DEGREE-KELVIN
+128;JOULES-PER-KILOGRAM-DEGREE-KELVIN
+153;NEWTON
+25;CYCLES-PER-HOUR
+26;CYCLES-PER-MINUTE
+27;HERTZ
+129;KILOHERTZ
+130;MEGAHERTZ
+131;PER-HOUR
+28;GRAMS-OF-WATER-PER-KILOGRAM-DRY-AIR
+29;PERCENT-RELATIVE-HUMIDITY
+194;MICROMETERS
+30;MILLIMETERS
+118;CENTIMETERS
+193;KILOMETERS
+31;METERS
+32;INCHES
+33;FEET
+179;CANDELAS
+180;CANDELAS-PER-SQUARE-METER
+34;WATTS-PER-SQUARE-FOOT
+35;WATTS-PER-SQUARE-METER
+36;LUMENS
+37;LUXES
+38;FOOT-CANDLES
+196;MILLIGRAMS
+195;GRAMS
+39;KILOGRAMS
+40;POUNDS-MASS
+41;TONS
+154;GRAMS-PER-SECOND
+155;GRAMS-PER-MINUTE
+42;KILOGRAMS-PER-SECOND
+43;KILOGRAMS-PER-MINUTE
+44;KILOGRAMS-PER-HOUR
+119;POUNDS-MASS-PER-SECOND
+45;POUNDS-MASS-PER-MINUTE
+46;POUNDS-MASS-PER-HOUR
+156;TONS-PER-HOUR
+132;MILLIWATTS
+47;WATTS
+48;KILOWATTS
+49;MEGAWATTS
+50;BTUS-PER-HOUR
+157;KILO-BTUS-PER-HOUR
+247;JOULE-PER-HOURS
+51;HORSEPOWER
+52;TONS-REFRIGERATION
+53;PASCALS
+133;HECTOPASCALS
+54;KILOPASCALS
+134;MILLIBARS
+55;BARS
+56;POUNDS-FORCE-PER-SQUARE-INCH
+206;MILLIMETERS-OF-WATER
+57;CENTIMETERS-OF-WATER
+58;INCHES-OF-WATER
+59;MILLIMETERS-OF-MERCURY
+60;CENTIMETERS-OF-MERCURY
+61;INCHES-OF-MERCURY
+62;DEGREES-CELSIUS
+63;DEGREES-KELVIN
+181;DEGREES-KELVIN-PER-HOUR
+182;DEGREES-KELVIN-PER-MINUTE
+64;DEGREES-FAHRENHEIT
+65;DEGREE-DAYS-CELSIUS
+66;DEGREE-DAYS-FAHRENHEIT
+120;DELTA-DEGREES-FAHRENHEIT
+121;DELTA-DEGREES-KELVIN
+67;YEARS
+68;MONTHS
+69;WEEKS
+70;DAYS
+71;HOURS
+72;MINUTES
+73;SECONDS
+158;HUNDREDTHS-SECONDS
+159;MILLISECONDS
+160;NEWTON-METERS
+161;MILLIMETERS-PER-SECOND
+162;MILLIMETERS-PER-MINUTE
+74;METERS-PER-SECOND
+163;METERS-PER-MINUTE
+164;METERS-PER-HOUR
+75;KILOMETERS-PER-HOUR
+76;FEET-PER-SECOND
+77;FEET-PER-MINUTE
+78;MILES-PER-HOUR
+79;CUBIC-FEET
+80;CUBIC-METERS
+81;IMPERIAL-GALLONS
+197;MILLILITERS
+82;LITERS
+83;US-GALLONS
+142;CUBIC-FEET-PER-SECOND
+84;CUBIC-FEET-PER-MINUTE
+254;MILLION-STANDARD-CUBIC-FEET-PER-MINUTE
+191;CUBIC-FEET-PER-HOUR
+248;CUBIC-FEET-PER-DAY
+47808;STANDARD-CUBIC-FEET-PER-DAY
+47809;MILLION-STANDARD-CUBIC-FEET-PER-DAY
+47810;THOUSAND-CUBIC-FEET-PER-DAY
+47811;THOUSAND-STANDARD-CUBIC-FEET-PER-DAY
+47812;POUNDS-MASS-PER-DAY
+85;CUBIC-METERS-PER-SECOND
+165;CUBIC-METERS-PER-MINUTE
+135;CUBIC-METERS-PER-HOUR
+249;CUBIC-METERS-PER-DAY
+86;IMPERIAL-GALLONS-PER-MINUTE
+198;MILLILITERS-PER-SECOND
+87;LITERS-PER-SECOND
+88;LITERS-PER-MINUTE
+136;LITERS-PER-HOUR
+89;US-GALLONS-PER-MINUTE
+192;US-GALLONS-PER-HOUR
+90;DEGREES-ANGULAR
+91;DEGREES-CELSIUS-PER-HOUR
+92;DEGREES-CELSIUS-PER-MINUTE
+93;DEGREES-FAHRENHEIT-PER-HOUR
+94;DEGREES-FAHRENHEIT-PER-MINUTE
+183;JOULE-SECONDS
+186;KILOGRAMS-PER-CUBIC-METER
+137;KILOWATT-HOURS-PER-SQUARE-METER
+138;KILOWATT-HOURS-PER-SQUARE-FOOT
+250;WATT-HOURS-PER-CUBIC-METER
+251;JOULES-PER-CUBIC-METER
+139;MEGAJOULES-PER-SQUARE-METER
+140;MEGAJOULES-PER-SQUARE-FOOT
+252;MOLE-PERCENT
+95;NO-UNITS
+187;NEWTON-SECONDS
+188;NEWTONS-PER-METER
+96;PARTS-PER-MILLION
+97;PARTS-PER-BILLION
+253;PASCAL-SECONDS
+98;PERCENT
+143;PERCENT-OBSCURATION-PER-FOOT
+144;PERCENT-OBSCURATION-PER-METER
+99;PERCENT-PER-SECOND
+100;PER-MINUTE
+101;PER-SECOND
+102;PSI-PER-DEGREE-FAHRENHEIT
+103;RADIANS
+184;RADIANS-PER-SECOND
+104;REVOLUTIONS-PER-MINUTE
+185;SQUARE-METERS-PER-NEWTON
+189;WATTS-PER-METER-PER-DEGREE-KELVIN
+141;WATTS-PER-SQUARE-METER-DEGREE-KELVIN
+207;PER-MILLE
+208;GRAMS-PER-GRAM
+209;KILOGRAMS-PER-KILOGRAM
+210;GRAMS-PER-KILOGRAM
+211;MILLIGRAMS-PER-GRAM
+212;MILLIGRAMS-PER-KILOGRAM
+213;GRAMS-PER-MILLILITER
+214;GRAMS-PER-LITER
+215;MILLIGRAMS-PER-LITER
+216;MICROGRAMS-PER-LITER
+217;GRAMS-PER-CUBIC-METER
+218;MILLIGRAMS-PER-CUBIC-METER
+219;MICROGRAMS-PER-CUBIC-METER
+220;NANOGRAMS-PER-CUBIC-METER
+221;GRAMS-PER-CUBIC-CENTIMETER
+222;BECQUERELS
+223;KILOBECQUERELS
+224;MEGABECQUERELS
+225;GRAY
+226;MILLIGRAY
+227;MICROGRAY
+228;SIEVERTS
+229;MILLISIEVERTS
+230;MICROSIEVERTS
+231;MICROSIEVERTS-PER-HOUR
+47814;MILLIREMS
+47815;MILLIREMS-PER-HOUR
+232;DECIBELS-A
+233;NEPHELOMETRIC-TURBIDITY-UNIT
+234;PH
+235;GRAMS-PER-SQUARE-METER
+236;MINUTES-PER-DEGREE-KELVIN
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/ai.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,497 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2011 Krzysztof Malorny <malornykrzysztof@gmail.com>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+
+/* Analog Input Objects - customize for your use */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>     /* NAN maro */
+
+#include "config_bacnet_for_beremiz_%(locstr)s.h"     /* the custom configuration for beremiz plugin */
+#include "bacdef.h"
+#include "bacdcode.h"
+#include "bacenum.h"
+#include "bacapp.h"
+#include "bactext.h"
+#include "device_%(locstr)s.h"
+#include "handlers.h"
+#include "ai_%(locstr)s.h"
+
+
+
+/* initial value for present_value property of each object */ 
+#define AI_VALUE_INIT (0)
+
+/* The IEC 61131-3 located variables mapped onto the Analog Input objects of BACnet protocol */
+%(AI_lvars)s
+
+
+/* The array where we keep all the state related to the Analog Input Objects */
+#define MAX_ANALOG_INPUTS %(AI_count)s
+static ANALOG_INPUT_DESCR AI_Descr[MAX_ANALOG_INPUTS] = {
+%(AI_param)s
+};
+
+
+
+/* These three arrays are used by the ReadPropertyMultiple handler,
+ * as well as to initialize the XXX_Property_List used by the 
+ * Property List (PROP_PROPERTY_LIST) property.
+ */
+static const int Analog_Input_Properties_Required[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                              /*(1)(2)      */
+    PROP_OBJECT_IDENTIFIER,   /* R  R ( 75) */
+    PROP_OBJECT_NAME,         /* R  R ( 77) */
+    PROP_OBJECT_TYPE,         /* R  R ( 79) */
+    PROP_PRESENT_VALUE,       /* W  R ( 85) */
+    PROP_STATUS_FLAGS,        /* R  R (111) */
+    PROP_EVENT_STATE,         /* R  R ( 36) */
+    PROP_OUT_OF_SERVICE,      /* W  R ( 81) */
+    PROP_UNITS,               /* W  R (117) */
+//  PROP_PROPERTY_LIST,       /* R  R (371) */
+    -1
+};
+
+static const int Analog_Input_Properties_Optional[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                              /*(1)(2)      */
+    PROP_DESCRIPTION,         /* R  O ( 28) */
+    -1
+};
+
+static const int Analog_Input_Properties_Proprietary[] = {
+    -1
+};
+
+/* This array stores the PROPERTY_LIST which may be read by clients.
+ * End of list is marked by following the last element with the value '-1'
+ * 
+ * It is initialized by Analog_Inputs_Init() based off the values
+ * stored in Analog_Input_Properties_Required 
+ *           Analog_Input_Properties_Optional
+ *           Analog_Input_Properties_Proprietary
+ */
+/* TODO: Allocate memory for this array with malloc() at startup */
+static int Analog_Input_Properties_List[64];
+
+
+
+/********************************************************/
+/**                  Callback functions.               **/
+/** Functions required by BACnet devie implementation. **/
+/********************************************************/
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Analog_Input_Property_Lists(
+    const int **pRequired,
+    const int **pOptional,
+    const int **pProprietary)
+{
+    if (pRequired)
+        *pRequired = Analog_Input_Properties_Required;
+    if (pOptional)
+        *pOptional = Analog_Input_Properties_Optional;
+    if (pProprietary)
+        *pProprietary = Analog_Input_Properties_Proprietary;
+
+    return;
+}
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Analog_Input_Init(
+    void)
+{
+    unsigned i, j;
+    static bool initialized = false;
+
+    if (!initialized) {
+        initialized = true;
+
+        /* initialize the Analog_Input_Properties_List array */
+        int len = 0;
+        len += BACnet_Init_Properties_List(Analog_Input_Properties_List + len,
+                                           Analog_Input_Properties_Required);
+        len += BACnet_Init_Properties_List(Analog_Input_Properties_List + len,
+                                           Analog_Input_Properties_Optional);
+        len += BACnet_Init_Properties_List(Analog_Input_Properties_List + len,
+                                           Analog_Input_Properties_Proprietary);
+
+        for (i = 0; i < MAX_ANALOG_INPUTS; i++) {
+            // MJS: the following line in th original demo code was commented out so we do not
+            //      overwrite the initial values configured by the user in beremiz IDE
+            // memset(&AI_Descr[i], 0x00, sizeof(ANALOG_INPUT_DESCR));
+            AI_Descr[i].Present_Value  = AI_VALUE_INIT;
+            AI_Descr[i].Out_Of_Service = 0;
+            AI_Descr[i].Event_State    = 0;
+//          AI_Descr[i].Units = UNITS_NO_UNITS;
+        }
+    }
+}
+
+
+
+
+/* validate that the given instance exists */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Analog_Input_Valid_Instance(
+    uint32_t object_instance)
+{
+    return (Analog_Input_Instance_To_Index(object_instance) < MAX_ANALOG_INPUTS);
+}
+
+/* the number of Analog Input Objects */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+unsigned Analog_Input_Count(void) {return MAX_ANALOG_INPUTS;}
+
+
+/* returns the instance (i.e. Object Identifier) that correlates to the correct index */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+uint32_t Analog_Input_Index_To_Instance(unsigned index) {return AI_Descr[index].Object_Identifier;}
+
+
+
+/* returns the index that correlates to the correct instance number (Object Identifier) */
+unsigned Analog_Input_Instance_To_Index(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+  
+    for (index = 0; index < MAX_ANALOG_INPUTS; index++)
+        if (object_instance == AI_Descr[index].Object_Identifier)
+            return index;
+
+    /* error, this object ID is not in our list! */
+    return MAX_ANALOG_INPUTS;
+}
+
+
+
+
+float Analog_Input_Present_Value(
+    uint32_t object_instance)
+{
+    float value = AI_VALUE_INIT;
+    unsigned index = 0;
+    unsigned i = 0;
+
+    index = Analog_Input_Instance_To_Index(object_instance);
+    if (index < MAX_ANALOG_INPUTS)
+        value = AI_Descr[index].Present_Value;
+
+    return value;
+}
+
+
+
+
+/* note: the object name must be unique within this device */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Analog_Input_Object_Name(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool    status = false;
+    unsigned index = Analog_Input_Instance_To_Index(object_instance);
+
+    if (index < MAX_ANALOG_INPUTS)
+        status = characterstring_init_ansi(object_name, AI_Descr[index].Object_Name);
+    
+    return status;
+}
+
+
+
+bool Analog_Input_Object_Description(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool    status = false;
+    unsigned index = Analog_Input_Instance_To_Index(object_instance);
+
+    if (index < MAX_ANALOG_INPUTS)
+        status = characterstring_init_ansi(object_name, AI_Descr[index].Description);
+    
+    return status;    
+}
+
+
+
+/* return apdu len, or BACNET_STATUS_ERROR on error */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+int Analog_Input_Read_Property(
+    BACNET_READ_PROPERTY_DATA * rpdata)
+{
+    int apdu_len = 0;   /* return value */
+    BACNET_BIT_STRING bit_string;
+    BACNET_CHARACTER_STRING char_string;
+    float real_value = (float) 1.414;
+    unsigned object_index = 0;
+    bool state = false;
+    uint8_t *apdu = NULL;
+
+    if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
+        (rpdata->application_data_len == 0)) {
+        return 0;
+    }
+
+    apdu = rpdata->application_data;
+
+    object_index = Analog_Input_Instance_To_Index(rpdata->object_instance);
+    if (object_index >= MAX_ANALOG_INPUTS) {
+        rpdata->error_class = ERROR_CLASS_OBJECT;
+        rpdata->error_code  = ERROR_CODE_UNKNOWN_OBJECT;
+        return BACNET_STATUS_ERROR;
+    }
+
+    switch (rpdata->object_property) {
+        case PROP_OBJECT_IDENTIFIER:
+            apdu_len =
+                encode_application_object_id(&apdu[0], OBJECT_ANALOG_INPUT,
+                rpdata->object_instance);
+            break;
+
+        case PROP_OBJECT_NAME:
+            Analog_Input_Object_Name(rpdata->object_instance, &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+
+        case PROP_DESCRIPTION:
+            Analog_Input_Object_Description(rpdata->object_instance, &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+
+        case PROP_OBJECT_TYPE:
+            apdu_len =
+                encode_application_enumerated(&apdu[0], OBJECT_ANALOG_INPUT);
+            break;
+
+        case PROP_PRESENT_VALUE:
+            real_value = Analog_Input_Present_Value(rpdata->object_instance);
+            apdu_len = encode_application_real(&apdu[0], real_value);
+            break;
+
+        case PROP_STATUS_FLAGS:
+            bitstring_init(&bit_string);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_IN_ALARM, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_FAULT, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OVERRIDDEN, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE,
+                AI_Descr[object_index].Out_Of_Service);
+
+            apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
+            break;
+
+        case PROP_EVENT_STATE:
+            apdu_len =
+                encode_application_enumerated(&apdu[0], EVENT_STATE_NORMAL);
+            break;
+
+        case PROP_OUT_OF_SERVICE:
+            state = AI_Descr[object_index].Out_Of_Service;
+            apdu_len = encode_application_boolean(&apdu[0], state);
+            break;
+
+        case PROP_UNITS:
+            apdu_len =
+                encode_application_enumerated(&apdu[0], AI_Descr[object_index].Units);
+            break;
+
+//      case PROP_PROPERTY_LIST:
+//          BACnet_encode_array(Analog_Input_Properties_List,
+//                              property_list_count(Analog_Input_Properties_List),
+//                              retfalse, encode_application_enumerated);
+//          break;
+        default:
+            rpdata->error_class = ERROR_CLASS_PROPERTY;
+            rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            apdu_len = BACNET_STATUS_ERROR;
+            break;
+    }
+    /*  only array properties can have array options */
+    if ((apdu_len >= 0) &&
+        (rpdata->object_property != PROP_EVENT_TIME_STAMPS) &&
+//      (rpdata->object_property != PROP_PROPERTY_LIST) &&
+        (rpdata->array_index != BACNET_ARRAY_ALL)) {
+        rpdata->error_class = ERROR_CLASS_PROPERTY;
+        rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        apdu_len = BACNET_STATUS_ERROR;
+    }
+
+    return apdu_len;
+}
+
+
+
+
+/* returns true if successful */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Analog_Input_Write_Property(
+    BACNET_WRITE_PROPERTY_DATA * wp_data)
+{
+    bool status = false;        /* return value */
+    unsigned int object_index = 0;
+    int len = 0;
+    BACNET_APPLICATION_DATA_VALUE value;
+    ANALOG_INPUT_DESCR *CurrentAI;
+
+    /* decode the some of the request */
+    len =
+        bacapp_decode_application_data(wp_data->application_data,
+        wp_data->application_data_len, &value);
+    /* FIXME: len < application_data_len: more data? */
+    if (len < 0) {
+        /* error while decoding - a value larger than we can handle */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+        return false;
+    }
+    if ((wp_data->object_property != PROP_EVENT_TIME_STAMPS) &&
+        (wp_data->array_index != BACNET_ARRAY_ALL)) {
+        /*  only array properties can have array options */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        return false;
+    }
+    object_index = Analog_Input_Instance_To_Index(wp_data->object_instance);
+    if (object_index < MAX_ANALOG_INPUTS)
+        CurrentAI = &AI_Descr[object_index];
+    else
+        return false;
+
+    switch (wp_data->object_property) {
+        case PROP_PRESENT_VALUE:
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_REAL,
+                &wp_data->error_class, &wp_data->error_code);
+            if (!status) {
+                wp_data->error_class = ERROR_CLASS_PROPERTY;
+                wp_data->error_code  = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                status = false; // not really necessary here.
+            } else {
+                if (!AI_Descr[object_index].Out_Of_Service) {
+                    /* input objects can only be written to when Out_Of_Service is true! */
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code  = ERROR_CODE_WRITE_ACCESS_DENIED;
+                    status = false;
+                } else {
+                    AI_Descr[object_index].Present_Value = value.type.Real;
+                    status = true;
+                }
+            }
+            break;
+      
+        case PROP_OUT_OF_SERVICE:
+        {
+            bool Previous_Out_Of_Service = CurrentAI->Out_Of_Service;
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                CurrentAI->Out_Of_Service = value.type.Boolean;
+                if (Previous_Out_Of_Service && !CurrentAI->Out_Of_Service)
+                    /* We have just changed from Out_of_Service -> In Service */
+                    /* We need to update the Present_Value to the value
+                     * currently in the PLC...
+                     */
+                    CurrentAI->Present_Value = *(CurrentAI->Located_Var_ptr);
+            }
+            break;
+        }
+
+        case PROP_UNITS:
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                CurrentAI->Units = value.type.Enumerated;
+            }
+            break;
+
+        case PROP_OBJECT_IDENTIFIER:
+        case PROP_OBJECT_NAME:
+        case PROP_OBJECT_TYPE:
+        case PROP_STATUS_FLAGS:
+        case PROP_EVENT_STATE:
+        case PROP_DESCRIPTION:
+//      case PROP_PROPERTY_LIST:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+            break;
+        default:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            break;
+    }
+
+    return status;
+}
+
+
+
+
+
+
+
+/********************************************/
+/** Functions required for Beremiz plugin  **/
+/********************************************/
+
+void  Analog_Input_Copy_Present_Value_to_Located_Var(void) {
+    unsigned i;
+    for (i = 0; i < MAX_ANALOG_INPUTS; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (AI_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        *(AI_Descr[i].Located_Var_ptr) = Analog_Input_Present_Value(AI_Descr[i].Object_Identifier);
+    }
+}
+
+
+
+void  Analog_Input_Copy_Located_Var_to_Present_Value(void) {
+    unsigned i;
+    for (i = 0; i < MAX_ANALOG_INPUTS; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (AI_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        AI_Descr[i].Present_Value = *(AI_Descr[i].Located_Var_ptr);
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/ai.h	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,102 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2011 Krzysztof Malorny <malornykrzysztof@gmail.com>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+#ifndef AI_H
+#define AI_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include "bacdef.h"
+#include "bacerror.h"
+#include "wp.h"
+#include "rp.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+    typedef struct Analog_Input_descr {
+        /* pointer to IEC 61131-3 located variable that is mapped onto this BACnet object */
+        float   *Located_Var_ptr;
+        uint32_t Object_Identifier;  /* called object 'Instance' in the source code! */
+        char    *Object_Name;   
+        char    *Description;
+        uint16_t Units;
+      
+        /* stores the current value */
+        /* one entry per priority value */
+        float Present_Value;
+        unsigned Event_State:3;
+        bool Out_Of_Service;
+    } ANALOG_INPUT_DESCR;
+
+
+    void Analog_Input_Property_Lists(
+        const int **pRequired,
+        const int **pOptional,
+        const int **pProprietary);
+    bool Analog_Input_Valid_Instance(
+        uint32_t object_instance);
+    unsigned Analog_Input_Count(
+        void);
+    uint32_t Analog_Input_Index_To_Instance(
+        unsigned index);
+    unsigned Analog_Input_Instance_To_Index(
+        uint32_t object_instance);
+
+    bool Analog_Input_Object_Name(
+        uint32_t object_instance,
+        BACNET_CHARACTER_STRING * object_name);
+
+    int Analog_Input_Read_Property(
+        BACNET_READ_PROPERTY_DATA * rpdata);
+
+    bool Analog_Input_Write_Property(
+        BACNET_WRITE_PROPERTY_DATA * wp_data);
+
+    float Analog_Input_Present_Value(
+        uint32_t object_instance);
+
+    char *Analog_Input_Description(
+        uint32_t instance);
+
+    uint16_t Analog_Input_Units(
+        uint32_t instance);
+
+    bool Analog_Input_Out_Of_Service(
+        uint32_t instance);
+    void Analog_Input_Out_Of_Service_Set(
+        uint32_t instance,
+        bool oos_flag);
+
+    void Analog_Input_Init(
+        void);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/ao.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,620 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2011 Krzysztof Malorny <malornykrzysztof@gmail.com>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+
+/* Analog Output Objects - customize for your use */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>     /* NAN maro */
+
+#include "config_bacnet_for_beremiz_%(locstr)s.h"     /* the custom configuration for beremiz plugin */
+#include "bacdef.h"
+#include "bacdcode.h"
+#include "bacenum.h"
+#include "bacapp.h"
+#include "bactext.h"
+#include "device_%(locstr)s.h"
+#include "handlers.h"
+#include "ao_%(locstr)s.h"
+
+/* we choose to have a NULL level in our system represented by */
+/* a particular value.  When the priorities are not in use, they */
+/* will be relinquished (i.e. set to the NULL level). */
+/* Since the values are floats, we use NAN (Not A Number) as our NULL value. */
+/* WARNING: Never use comparisons like 'if (value == AO_LEVEL_NULL)'
+ *           as it will always return false, even if both values are NAN.
+ *          Use instead the negated version 'if (value != AO_LEVEL_NULL)'
+ *           and add an 'else' to the 'if' condition if necessary.
+ *         However, some compilers may screw this up if they do not
+ *         implement IEEE 754 properly. It is probably best to stick with
+ *         the isnan() macro if available.
+ */
+#define AO_VALUE_NULL NAN
+#define AO_VALUE_IS_NULL(x)  (isnan(x))
+/* When all the priorities are level null, the present value returns */
+/* the Relinquish Default value */
+#define AO_VALUE_RELINQUISH_DEFAULT (0.0)
+
+
+/* The IEC 61131-3 located variables mapped onto the Analog Output objects of BACnet protocol */
+%(AO_lvars)s
+
+
+/* The array where we keep all the state related to the Analog Output Objects */
+#define MAX_ANALOG_OUTPUTS %(AO_count)s
+static ANALOG_OUTPUT_DESCR AO_Descr[MAX_ANALOG_OUTPUTS] = {
+%(AO_param)s
+};
+
+
+/* These three arrays are used by the ReadPropertyMultiple handler,
+ * as well as to initialize the XXX_Property_List used by the 
+ * Property List (PROP_PROPERTY_LIST) property.
+ */
+static const int Analog_Output_Properties_Required[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                                  /*(1)(2)      */
+    PROP_OBJECT_IDENTIFIER,       /* R  R ( 75) */
+    PROP_OBJECT_NAME,             /* R  R ( 77) */
+    PROP_OBJECT_TYPE,             /* R  R ( 79) */
+    PROP_PRESENT_VALUE,           /* W  W ( 85) */
+    PROP_STATUS_FLAGS,            /* R  R (111) */
+    PROP_EVENT_STATE,             /* R  R ( 36) */
+    PROP_OUT_OF_SERVICE,          /* W  R ( 81) */
+    PROP_UNITS,                   /* W  R (117) */
+    PROP_PRIORITY_ARRAY,          /* R  R ( 87) */
+    PROP_RELINQUISH_DEFAULT,      /* R  R (104) */    
+//  PROP_PROPERTY_LIST,           /* R  R (371) */
+//  PROP_CURRENT_COMMAND_PRIORITY,/* R  R (431) */   
+    -1
+};
+
+static const int Analog_Output_Properties_Optional[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                                  /*(1)(2)      */
+    PROP_DESCRIPTION,             /* R  O ( 28) */
+    -1
+};
+
+static const int Analog_Output_Properties_Proprietary[] = {
+    -1
+};
+
+/* This array stores the PROPERTY_LIST which may be read by clients.
+ * End of list is marked by following the last element with the value '-1'
+ * 
+ * It is initialized by Analog_Outputs_Init() based off the values
+ * stored in Analog_Output_Properties_Required 
+ *           Analog_Output_Properties_Optional
+ *           Analog_Output_Properties_Proprietary
+ */
+/* TODO: Allocate memory for this array with malloc() at startup */
+static int Analog_Output_Properties_List[64];
+
+
+
+/********************************************************/
+/**                  Callback functions.               **/
+/** Functions required by BACnet devie implementation. **/
+/********************************************************/
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Analog_Output_Property_Lists(
+    const int **pRequired,
+    const int **pOptional,
+    const int **pProprietary)
+{
+    if (pRequired)
+        *pRequired = Analog_Output_Properties_Required;
+    if (pOptional)
+        *pOptional = Analog_Output_Properties_Optional;
+    if (pProprietary)
+        *pProprietary = Analog_Output_Properties_Proprietary;
+
+    return;
+}
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Analog_Output_Init(
+    void)
+{
+    unsigned i, j;
+    static bool initialized = false;
+
+    if (!initialized) {
+        initialized = true;
+
+        /* initialize the Analog_Output_Properties_List array */
+        int len = 0;
+        len += BACnet_Init_Properties_List(Analog_Output_Properties_List + len,
+                                           Analog_Output_Properties_Required);
+        len += BACnet_Init_Properties_List(Analog_Output_Properties_List + len,
+                                           Analog_Output_Properties_Optional);
+        len += BACnet_Init_Properties_List(Analog_Output_Properties_List + len,
+                                           Analog_Output_Properties_Proprietary);
+
+        for (i = 0; i < MAX_ANALOG_OUTPUTS; i++) {
+            // MJS: the following line in th original demo code was commented out so we do not
+            //      overwrite the initial values configured by the user in beremiz IDE
+            // memset(&AO_Descr[i], 0x00, sizeof(ANALOG_OUTPUT_DESCR));
+            for (j = 0; j < BACNET_MAX_PRIORITY; j++) {
+                AO_Descr[i].Present_Value[j]  = AO_VALUE_NULL;
+            }
+            AO_Descr[i].Out_Of_Service = 0;
+            AO_Descr[i].Event_State    = 0;
+//          AO_Descr[i].Units = UNITS_NO_UNITS;
+        }
+    }
+}
+
+
+
+
+/* validate that the given instance exists */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Analog_Output_Valid_Instance(
+    uint32_t object_instance)
+{
+    return (Analog_Output_Instance_To_Index(object_instance) < MAX_ANALOG_OUTPUTS);
+}
+
+/* the number of Analog Output Objects */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+unsigned Analog_Output_Count(void) {return MAX_ANALOG_OUTPUTS;}
+
+
+/* returns the instance (i.e. Object Identifier) that correlates to the correct index */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+uint32_t Analog_Output_Index_To_Instance(unsigned index) {return AO_Descr[index].Object_Identifier;}
+
+
+
+/* returns the index that correlates to the correct instance number (Object Identifier) */
+unsigned Analog_Output_Instance_To_Index(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+  
+    for (index = 0; index < MAX_ANALOG_OUTPUTS; index++)
+        if (object_instance == AO_Descr[index].Object_Identifier)
+            return index;
+
+    /* error, this object ID is not in our list! */
+    return MAX_ANALOG_OUTPUTS;
+}
+
+
+
+
+float Analog_Output_Present_Value(
+    uint32_t object_instance)
+{
+    float value = AO_VALUE_RELINQUISH_DEFAULT;
+    unsigned index = 0;
+    unsigned i = 0;
+
+    index = Analog_Output_Instance_To_Index(object_instance);
+    if (index < MAX_ANALOG_OUTPUTS) {
+        for (i = 0; i < BACNET_MAX_PRIORITY; i++) {
+            if (!AO_VALUE_IS_NULL(AO_Descr[index].Present_Value[i])) {
+                value = AO_Descr[index].Present_Value[i];
+                break;
+            }
+        }
+    }
+
+    return value;
+}
+
+
+
+/* returns command priority (1..16), or 0 if all priority values are at NULL */
+int Analog_Output_Current_Command_Priority(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+    unsigned i = 0;
+
+    index = Analog_Output_Instance_To_Index(object_instance);
+    if (index < MAX_ANALOG_OUTPUTS) {
+        for (i = 0; i < BACNET_MAX_PRIORITY; i++) {
+            if (!AO_VALUE_IS_NULL(AO_Descr[index].Present_Value[i])) {
+                return i+1; // +1 since priority is 1..16, and not 0..15
+            }
+        }
+    }
+    // command values in all priorities are set to NULL
+    return 0;
+}
+
+
+
+/* For a given object instance-number, sets the present-value at a given
+ * priority 1..16 (except 6, see ASHRAE 135-2016, section 19.2.2)
+ */
+bool Analog_Output_Present_Value_Set(
+    uint32_t object_instance,
+    float value,
+    uint8_t priority)
+{
+    unsigned index = 0;
+
+    index = Analog_Output_Instance_To_Index(object_instance);
+    if (index >= MAX_ANALOG_OUTPUTS) 
+      return false;
+    if ((priority == 0) || (priority > BACNET_MAX_PRIORITY) ||
+        (priority == 6 /* reserved, ASHRAE 135-2016, section 19.2.2 */))
+      return false;
+    
+    priority--;
+    AO_Descr[index].Present_Value[priority] = value;
+    return true;
+}
+
+
+
+bool Analog_Output_Present_Value_Relinquish(
+    uint32_t object_instance,
+    unsigned priority)
+{
+    unsigned index = 0;
+
+    index = Analog_Output_Instance_To_Index(object_instance);
+    if (index >= MAX_ANALOG_OUTPUTS)
+      return false;
+
+    if ((priority == 0) || (priority > BACNET_MAX_PRIORITY) ||
+        (priority == 6 /* reserved, ASHRAE 135-2016, section 19.2.2 */))
+      return false;
+ 
+    priority--;
+    AO_Descr[index].Present_Value[priority] = AO_VALUE_NULL;
+    return true;
+}
+
+
+
+/* note: the object name must be unique within this device */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Analog_Output_Object_Name(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool    status = false;
+    unsigned index = Analog_Output_Instance_To_Index(object_instance);
+
+    if (index < MAX_ANALOG_OUTPUTS)
+        status = characterstring_init_ansi(object_name, AO_Descr[index].Object_Name);
+    
+    return status;
+}
+
+
+
+bool Analog_Output_Object_Description(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool    status = false;
+    unsigned index = Analog_Output_Instance_To_Index(object_instance);
+
+    if (index < MAX_ANALOG_OUTPUTS)
+        status = characterstring_init_ansi(object_name, AO_Descr[index].Description);
+    
+    return status;    
+}
+
+
+
+/* return apdu len, or BACNET_STATUS_ERROR on error */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+int Analog_Output_Read_Property(
+    BACNET_READ_PROPERTY_DATA * rpdata)
+{
+    int apdu_len = 0;   /* return value */
+    BACNET_BIT_STRING bit_string;
+    BACNET_CHARACTER_STRING char_string;
+    float real_value = (float) 1.414;
+    unsigned object_index = 0;
+    bool state = false;
+    uint8_t *apdu = NULL;
+
+    if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
+        (rpdata->application_data_len == 0)) {
+        return 0;
+    }
+
+    apdu = rpdata->application_data;
+
+    object_index = Analog_Output_Instance_To_Index(rpdata->object_instance);
+    if (object_index >= MAX_ANALOG_OUTPUTS) {
+        rpdata->error_class = ERROR_CLASS_OBJECT;
+        rpdata->error_code  = ERROR_CODE_UNKNOWN_OBJECT;
+        return BACNET_STATUS_ERROR;
+    }
+
+    switch (rpdata->object_property) {
+        case PROP_OBJECT_IDENTIFIER:
+            apdu_len =
+                encode_application_object_id(&apdu[0], OBJECT_ANALOG_OUTPUT,
+                rpdata->object_instance);
+            break;
+
+        case PROP_OBJECT_NAME:
+            Analog_Output_Object_Name(rpdata->object_instance, &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+
+        case PROP_DESCRIPTION:
+            Analog_Output_Object_Description(rpdata->object_instance, &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+
+        case PROP_OBJECT_TYPE:
+            apdu_len =
+                encode_application_enumerated(&apdu[0], OBJECT_ANALOG_OUTPUT);
+            break;
+
+        case PROP_PRESENT_VALUE:
+            real_value = Analog_Output_Present_Value(rpdata->object_instance);
+            apdu_len = encode_application_real(&apdu[0], real_value);
+            break;
+
+        case PROP_STATUS_FLAGS:
+            bitstring_init(&bit_string);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_IN_ALARM, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_FAULT, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OVERRIDDEN, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE,
+                AO_Descr[object_index].Out_Of_Service);
+
+            apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
+            break;
+
+        case PROP_EVENT_STATE:
+            apdu_len =
+                encode_application_enumerated(&apdu[0], EVENT_STATE_NORMAL);
+            break;
+
+        case PROP_OUT_OF_SERVICE:
+            state = AO_Descr[object_index].Out_Of_Service;
+            apdu_len = encode_application_boolean(&apdu[0], state);
+            break;
+
+        case PROP_PRIORITY_ARRAY:
+            BACnet_encode_array(AO_Descr[object_index].Present_Value,
+                                BACNET_MAX_PRIORITY,
+                                AO_VALUE_IS_NULL,
+                                encode_application_real)
+            break;
+
+//      case PROP_CURRENT_COMMAND_PRIORITY: {
+//          unsigned i = Analog_Output_Current_Command_Priority(rpdata->object_instance);
+//          if (i == 0)  apdu_len = encode_application_null    (&apdu[0]);
+//          else         apdu_len = encode_application_unsigned(&apdu[0], i);
+//          break;
+//      }
+
+        case PROP_RELINQUISH_DEFAULT:
+            real_value = AO_VALUE_RELINQUISH_DEFAULT;
+            apdu_len = encode_application_real(&apdu[0], real_value);
+            break;
+
+        case PROP_UNITS:
+            apdu_len =
+                encode_application_enumerated(&apdu[0], AO_Descr[object_index].Units);
+            break;
+
+//      case PROP_PROPERTY_LIST:
+//          BACnet_encode_array(Analog_Output_Properties_List,
+//                              property_list_count(Analog_Output_Properties_List),
+//                              retfalse, encode_application_enumerated);
+//          break;
+        default:
+            rpdata->error_class = ERROR_CLASS_PROPERTY;
+            rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            apdu_len = BACNET_STATUS_ERROR;
+            break;
+    }
+    /*  only array properties can have array options */
+    if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) &&
+        (rpdata->object_property != PROP_EVENT_TIME_STAMPS) &&
+//      (rpdata->object_property != PROP_PROPERTY_LIST) &&
+        (rpdata->array_index != BACNET_ARRAY_ALL)) {
+        rpdata->error_class = ERROR_CLASS_PROPERTY;
+        rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        apdu_len = BACNET_STATUS_ERROR;
+    }
+
+    return apdu_len;
+}
+
+
+
+
+/* returns true if successful */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Analog_Output_Write_Property(
+    BACNET_WRITE_PROPERTY_DATA * wp_data)
+{
+    bool status = false;        /* return value */
+    unsigned int object_index = 0;
+    int len = 0;
+    BACNET_APPLICATION_DATA_VALUE value;
+    ANALOG_OUTPUT_DESCR *CurrentAO;
+
+    /* decode the some of the request */
+    len =
+        bacapp_decode_application_data(wp_data->application_data,
+        wp_data->application_data_len, &value);
+    /* FIXME: len < application_data_len: more data? */
+    if (len < 0) {
+        /* error while decoding - a value larger than we can handle */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+        return false;
+    }
+    if ((wp_data->object_property != PROP_PRIORITY_ARRAY) &&
+        (wp_data->object_property != PROP_EVENT_TIME_STAMPS) &&
+        (wp_data->array_index != BACNET_ARRAY_ALL)) {
+        /*  only array properties can have array options */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        return false;
+    }
+    object_index = Analog_Output_Instance_To_Index(wp_data->object_instance);
+    if (object_index < MAX_ANALOG_OUTPUTS)
+        CurrentAO = &AO_Descr[object_index];
+    else
+        return false;
+
+    switch (wp_data->object_property) {
+        case PROP_PRESENT_VALUE:
+            if (value.tag == BACNET_APPLICATION_TAG_REAL) {
+                if (Analog_Output_Present_Value_Set(wp_data->object_instance,
+                        value.type.Real, wp_data->priority)) {
+                    status = true;
+                } else if (wp_data->priority == 6) {
+                    /* Command priority 6 is reserved for use by Minimum On/Off
+                       algorithm and may not be used for other purposes in any
+                       object. */
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+                } else {
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                }
+            } else {
+                status =
+                    WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
+                    &wp_data->error_class, &wp_data->error_code);
+                if (status) {
+                    status =
+                        Analog_Output_Present_Value_Relinquish
+                        (wp_data->object_instance, wp_data->priority);
+                }
+                if (!status) {
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                }
+            }
+            break;
+
+        case PROP_OUT_OF_SERVICE:
+        {
+            bool Previous_Out_Of_Service = CurrentAO->Out_Of_Service;
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                CurrentAO->Out_Of_Service = value.type.Boolean;
+                if (Previous_Out_Of_Service && !CurrentAO->Out_Of_Service)
+                    /* We have just changed from Out_of_Service -> In Service */
+                    /* We need to update the Present_Value to the value
+                     * currently in the PLC...
+                     */
+                    CurrentAO->Present_Value[BACNET_MAX_PRIORITY-1] =
+                                             *(CurrentAO->Located_Var_ptr);
+            }
+            break;
+        }
+
+        case PROP_UNITS:
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                CurrentAO->Units = value.type.Enumerated;
+            }
+            break;
+
+        case PROP_OBJECT_IDENTIFIER:
+        case PROP_OBJECT_NAME:
+        case PROP_OBJECT_TYPE:
+        case PROP_STATUS_FLAGS:
+        case PROP_EVENT_STATE:
+        case PROP_DESCRIPTION:
+        case PROP_RELINQUISH_DEFAULT:
+        case PROP_PRIORITY_ARRAY:
+//      case PROP_PROPERTY_LIST:
+//      case PROP_CURRENT_COMMAND_PRIORITY:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+            break;
+        default:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            break;
+    }
+
+    return status;
+}
+
+
+
+
+
+
+
+/********************************************/
+/** Functions required for Beremiz plugin  **/
+/********************************************/
+
+void  Analog_Output_Copy_Present_Value_to_Located_Var(void) {
+    unsigned i;
+    for (i = 0; i < MAX_ANALOG_OUTPUTS; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (AO_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        *(AO_Descr[i].Located_Var_ptr) = Analog_Output_Present_Value(AO_Descr[i].Object_Identifier);
+    }
+}
+
+
+
+void  Analog_Output_Copy_Located_Var_to_Present_Value(void) {
+    unsigned i;
+    for (i = 0; i < MAX_ANALOG_OUTPUTS; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (AO_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        AO_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1] = *(AO_Descr[i].Located_Var_ptr);
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/ao.h	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,106 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2011 Krzysztof Malorny <malornykrzysztof@gmail.com>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+#ifndef AO_H
+#define AO_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include "bacdef.h"
+#include "bacerror.h"
+#include "wp.h"
+#include "rp.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+    typedef struct Analog_Output_descr {
+        /* pointer to IEC 61131-3 located variable that is mapped onto this BACnet object */
+        float   *Located_Var_ptr;
+        uint32_t Object_Identifier;  /* called object 'Instance' in the source code! */
+        char    *Object_Name;   
+        char    *Description;
+        uint16_t Units;
+      
+        /* stores the current value */
+        /* one entry per priority value */
+        float Present_Value[BACNET_MAX_PRIORITY];
+        unsigned Event_State:3;
+        bool Out_Of_Service;
+    } ANALOG_OUTPUT_DESCR;
+
+
+    void Analog_Output_Property_Lists(
+        const int **pRequired,
+        const int **pOptional,
+        const int **pProprietary);
+    bool Analog_Output_Valid_Instance(
+        uint32_t object_instance);
+    unsigned Analog_Output_Count(
+        void);
+    uint32_t Analog_Output_Index_To_Instance(
+        unsigned index);
+    unsigned Analog_Output_Instance_To_Index(
+        uint32_t object_instance);
+
+    bool Analog_Output_Object_Name(
+        uint32_t object_instance,
+        BACNET_CHARACTER_STRING * object_name);
+
+    int Analog_Output_Read_Property(
+        BACNET_READ_PROPERTY_DATA * rpdata);
+
+    bool Analog_Output_Write_Property(
+        BACNET_WRITE_PROPERTY_DATA * wp_data);
+
+    bool Analog_Output_Present_Value_Set(
+        uint32_t object_instance,
+        float value,
+        uint8_t priority);
+    float Analog_Output_Present_Value(
+        uint32_t object_instance);
+
+    char *Analog_Output_Description(
+        uint32_t instance);
+
+    uint16_t Analog_Output_Units(
+        uint32_t instance);
+
+    bool Analog_Output_Out_Of_Service(
+        uint32_t instance);
+    void Analog_Output_Out_Of_Service_Set(
+        uint32_t instance,
+        bool oos_flag);
+
+    void Analog_Output_Init(
+        void);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/av.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,622 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2011 Krzysztof Malorny <malornykrzysztof@gmail.com>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+
+/* Analog Value Objects - customize for your use */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>     /* NAN maro */
+
+#include "config_bacnet_for_beremiz_%(locstr)s.h"     /* the custom configuration for beremiz plugin */
+#include "bacdef.h"
+#include "bacdcode.h"
+#include "bacenum.h"
+#include "bacapp.h"
+#include "bactext.h"
+#include "device_%(locstr)s.h"
+#include "handlers.h"
+#include "av_%(locstr)s.h"
+
+/* we choose to have a NULL level in our system represented by */
+/* a particular value.  When the priorities are not in use, they */
+/* will be relinquished (i.e. set to the NULL level). */
+/* Since the values are floats, we use NAN (Not A Number) as our NULL value. */
+/* WARNING: Never use comparisons like 'if (value == AO_LEVEL_NULL)'
+ *           as it will always return false, even if both values are NAN.
+ *          Use instead the negated version 'if (value != AO_LEVEL_NULL)'
+ *           and add an 'else' to the 'if' condition if necessary.
+ *         However, some compilers may screw this up if they do not
+ *         implement IEEE 754 properly. It is probably best to stick with
+ *         the isnan() macro if available.
+ */
+#define AV_VALUE_NULL NAN
+#define AV_VALUE_IS_NULL(x)  (isnan(x))
+/* When all the priorities are level null, the present value returns */
+/* the Relinquish Default value */
+#define AV_VALUE_RELINQUISH_DEFAULT (0.0)
+
+
+/* The IEC 61131-3 located variables mapped onto the Analog Value objects of BACnet protocol */
+%(AV_lvars)s
+
+
+/* The array where we keep all the state related to the Analog Value Objects */
+#define MAX_ANALOG_VALUES %(AV_count)s
+static ANALOG_VALUE_DESCR AV_Descr[MAX_ANALOG_VALUES] = {
+%(AV_param)s
+};
+
+
+/* These three arrays are used by the ReadPropertyMultiple handler,
+ * as well as to initialize the XXX_Property_List used by the 
+ * Property List (PROP_PROPERTY_LIST) property.
+ */
+static const int Analog_Value_Properties_Required[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                              /*(1)(2)      */
+    PROP_OBJECT_IDENTIFIER,   /* R  R ( 75) */
+    PROP_OBJECT_NAME,         /* R  R ( 77) */
+    PROP_OBJECT_TYPE,         /* R  R ( 79) */
+    PROP_PRESENT_VALUE,       /* W  R ( 85) */
+    PROP_STATUS_FLAGS,        /* R  R (111) */
+    PROP_EVENT_STATE,         /* R  R ( 36) */
+    PROP_OUT_OF_SERVICE,      /* W  R ( 81) */
+    PROP_UNITS,               /* W  R (117) */
+//  PROP_PROPERTY_LIST,       /* R  R (371) */
+    -1
+};
+
+static const int Analog_Value_Properties_Optional[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                                  /*(1)(2)      */
+    PROP_DESCRIPTION,             /* R  O ( 28) */
+    /* required if Present_Value is writable (which is true in our case!) */
+    PROP_PRIORITY_ARRAY,          /* R  O ( 87) */
+    PROP_RELINQUISH_DEFAULT,      /* R  O (104) */
+//  PROP_CURRENT_COMMAND_PRIORITY,/* R  O (431) */   
+    -1
+};
+
+static const int Analog_Value_Properties_Proprietary[] = {
+    -1
+};
+
+/* This array stores the PROPERTY_LIST which may be read by clients.
+ * End of list is marked by following the last element with the value '-1'
+ * 
+ * It is initialized by Analog_Values_Init() based off the values
+ * stored in Analog_Value_Properties_Required 
+ *           Analog_Value_Properties_Optional
+ *           Analog_Value_Properties_Proprietary
+ */
+/* TODO: Allocate memory for this array with malloc() at startup */
+static int Analog_Value_Properties_List[64];
+
+
+
+/********************************************************/
+/**                  Callback functions.               **/
+/** Functions required by BACnet devie implementation. **/
+/********************************************************/
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Analog_Value_Property_Lists(
+    const int **pRequired,
+    const int **pOptional,
+    const int **pProprietary)
+{
+    if (pRequired)
+        *pRequired = Analog_Value_Properties_Required;
+    if (pOptional)
+        *pOptional = Analog_Value_Properties_Optional;
+    if (pProprietary)
+        *pProprietary = Analog_Value_Properties_Proprietary;
+
+    return;
+}
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Analog_Value_Init(
+    void)
+{
+    unsigned i, j;
+    static bool initialized = false;
+
+    if (!initialized) {
+        initialized = true;
+
+        /* initialize the Analog_Value_Properties_List array */
+        int len = 0;
+        len += BACnet_Init_Properties_List(Analog_Value_Properties_List + len,
+                                           Analog_Value_Properties_Required);
+        len += BACnet_Init_Properties_List(Analog_Value_Properties_List + len,
+                                           Analog_Value_Properties_Optional);
+        len += BACnet_Init_Properties_List(Analog_Value_Properties_List + len,
+                                           Analog_Value_Properties_Proprietary);
+
+        for (i = 0; i < MAX_ANALOG_VALUES; i++) {
+            // MJS: the following line in th original demo code was commented out so we do not
+            //      overwrite the initial values configured by the user in beremiz IDE
+            // memset(&AV_Descr[i], 0x00, sizeof(ANALOG_VALUE_DESCR));
+            for (j = 0; j < BACNET_MAX_PRIORITY; j++) {
+                AV_Descr[i].Present_Value[j]  = AV_VALUE_NULL;
+            }
+            AV_Descr[i].Out_Of_Service = 0;
+            AV_Descr[i].Event_State    = 0;
+//          AV_Descr[i].Units = UNITS_NO_UNITS;
+        }
+    }
+}
+
+
+
+
+/* validate that the given instance exists */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Analog_Value_Valid_Instance(
+    uint32_t object_instance)
+{
+    return (Analog_Value_Instance_To_Index(object_instance) < MAX_ANALOG_VALUES);
+}
+
+/* the number of Analog Value Objects */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+unsigned Analog_Value_Count(void) {return MAX_ANALOG_VALUES;}
+
+
+/* returns the instance (i.e. Object Identifier) that correlates to the correct index */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+uint32_t Analog_Value_Index_To_Instance(unsigned index) {return AV_Descr[index].Object_Identifier;}
+
+
+
+/* returns the index that correlates to the correct instance number (Object Identifier) */
+unsigned Analog_Value_Instance_To_Index(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+  
+    for (index = 0; index < MAX_ANALOG_VALUES; index++)
+        if (object_instance == AV_Descr[index].Object_Identifier)
+            return index;
+
+    /* error, this object ID is not in our list! */
+    return MAX_ANALOG_VALUES;
+}
+
+
+
+
+float Analog_Value_Present_Value(
+    uint32_t object_instance)
+{
+    float value = AV_VALUE_RELINQUISH_DEFAULT;
+    unsigned index = 0;
+    unsigned i = 0;
+
+    index = Analog_Value_Instance_To_Index(object_instance);
+    if (index < MAX_ANALOG_VALUES) {
+        for (i = 0; i < BACNET_MAX_PRIORITY; i++) {
+            if (!AV_VALUE_IS_NULL(AV_Descr[index].Present_Value[i])) {
+                value = AV_Descr[index].Present_Value[i];
+                break;
+            }
+        }
+    }
+
+    return value;
+}
+
+
+
+/* returns command priority (1..16), or 0 if all priority values are at NULL */
+int Analog_Value_Current_Command_Priority(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+    unsigned i = 0;
+
+    index = Analog_Value_Instance_To_Index(object_instance);
+    if (index < MAX_ANALOG_VALUES) {
+        for (i = 0; i < BACNET_MAX_PRIORITY; i++) {
+            if (!AV_VALUE_IS_NULL(AV_Descr[index].Present_Value[i])) {
+                return i+1; // +1 since priority is 1..16, and not 0..15
+            }
+        }
+    }
+    // command values in all priorities are set to NULL
+    return 0;
+}
+
+
+
+/* For a given object instance-number, sets the present-value at a given
+ * priority 1..16 (except 6, see ASHRAE 135-2016, section 19.2.2)
+ */
+bool Analog_Value_Present_Value_Set(
+    uint32_t object_instance,
+    float value,
+    uint8_t priority)
+{
+    unsigned index = 0;
+
+    index = Analog_Value_Instance_To_Index(object_instance);
+    if (index >= MAX_ANALOG_VALUES) 
+      return false;
+    if ((priority == 0) || (priority > BACNET_MAX_PRIORITY) ||
+        (priority == 6 /* reserved, ASHRAE 135-2016, section 19.2.2 */))
+      return false;
+    
+    priority--;
+    AV_Descr[index].Present_Value[priority] = value;
+    return true;
+}
+
+
+
+bool Analog_Value_Present_Value_Relinquish(
+    uint32_t object_instance,
+    unsigned priority)
+{
+    unsigned index = 0;
+
+    index = Analog_Value_Instance_To_Index(object_instance);
+    if (index >= MAX_ANALOG_VALUES)
+      return false;
+
+    if ((priority == 0) || (priority > BACNET_MAX_PRIORITY) ||
+        (priority == 6 /* reserved, ASHRAE 135-2016, section 19.2.2 */))
+      return false;
+ 
+    priority--;
+    AV_Descr[index].Present_Value[priority] = AV_VALUE_NULL;
+    return true;
+}
+
+
+
+/* note: the object name must be unique within this device */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Analog_Value_Object_Name(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool    status = false;
+    unsigned index = Analog_Value_Instance_To_Index(object_instance);
+
+    if (index < MAX_ANALOG_VALUES)
+        status = characterstring_init_ansi(object_name, AV_Descr[index].Object_Name);
+    
+    return status;
+}
+
+
+
+bool Analog_Value_Object_Description(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool    status = false;
+    unsigned index = Analog_Value_Instance_To_Index(object_instance);
+
+    if (index < MAX_ANALOG_VALUES)
+        status = characterstring_init_ansi(object_name, AV_Descr[index].Description);
+    
+    return status;    
+}
+
+
+
+/* return apdu len, or BACNET_STATUS_ERROR on error */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+int Analog_Value_Read_Property(
+    BACNET_READ_PROPERTY_DATA * rpdata)
+{
+    int apdu_len = 0;   /* return value */
+    BACNET_BIT_STRING bit_string;
+    BACNET_CHARACTER_STRING char_string;
+    float real_value = (float) 1.414;
+    unsigned object_index = 0;
+    bool state = false;
+    uint8_t *apdu = NULL;
+    ANALOG_VALUE_DESCR *CurrentAV;
+
+    if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
+        (rpdata->application_data_len == 0)) {
+        return 0;
+    }
+
+    apdu = rpdata->application_data;
+
+    object_index = Analog_Value_Instance_To_Index(rpdata->object_instance);
+    if (object_index >= MAX_ANALOG_VALUES) {
+        rpdata->error_class = ERROR_CLASS_OBJECT;
+        rpdata->error_code  = ERROR_CODE_UNKNOWN_OBJECT;
+        return BACNET_STATUS_ERROR;
+    }
+
+    switch (rpdata->object_property) {
+        case PROP_OBJECT_IDENTIFIER:
+            apdu_len =
+                encode_application_object_id(&apdu[0], OBJECT_ANALOG_VALUE,
+                rpdata->object_instance);
+            break;
+
+        case PROP_OBJECT_NAME:
+            Analog_Value_Object_Name(rpdata->object_instance, &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+
+        case PROP_DESCRIPTION:
+            Analog_Value_Object_Description(rpdata->object_instance, &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+
+        case PROP_OBJECT_TYPE:
+            apdu_len =
+                encode_application_enumerated(&apdu[0], OBJECT_ANALOG_VALUE);
+            break;
+
+        case PROP_PRESENT_VALUE:
+            real_value = Analog_Value_Present_Value(rpdata->object_instance);
+            apdu_len = encode_application_real(&apdu[0], real_value);
+            break;
+
+        case PROP_STATUS_FLAGS:
+            bitstring_init(&bit_string);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_IN_ALARM, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_FAULT, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OVERRIDDEN, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE,
+                AV_Descr[object_index].Out_Of_Service);
+
+            apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
+            break;
+
+        case PROP_EVENT_STATE:
+            apdu_len =
+                encode_application_enumerated(&apdu[0], EVENT_STATE_NORMAL);
+            break;
+
+        case PROP_OUT_OF_SERVICE:
+            state = AV_Descr[object_index].Out_Of_Service;
+            apdu_len = encode_application_boolean(&apdu[0], state);
+            break;
+
+        case PROP_PRIORITY_ARRAY:
+            BACnet_encode_array(AV_Descr[object_index].Present_Value,
+                                BACNET_MAX_PRIORITY,
+                                AV_VALUE_IS_NULL,
+                                encode_application_real)
+            break;
+
+//      case PROP_CURRENT_COMMAND_PRIORITY: {
+//          unsigned i = Analog_Value_Current_Command_Priority(rpdata->object_instance);
+//          if (i == 0)  apdu_len = encode_application_null    (&apdu[0]);
+//          else         apdu_len = encode_application_unsigned(&apdu[0], i);
+//          break;
+//      }
+
+        case PROP_RELINQUISH_DEFAULT:
+            real_value = AV_VALUE_RELINQUISH_DEFAULT;
+            apdu_len = encode_application_real(&apdu[0], real_value);
+            break;
+
+        case PROP_UNITS:
+            apdu_len =
+                encode_application_enumerated(&apdu[0], AV_Descr[object_index].Units);
+            break;
+
+//      case PROP_PROPERTY_LIST:
+//          BACnet_encode_array(Analog_Value_Properties_List,
+//                              property_list_count(Analog_Value_Properties_List),
+//                              retfalse, encode_application_enumerated);
+//          break;
+        default:
+            rpdata->error_class = ERROR_CLASS_PROPERTY;
+            rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            apdu_len = BACNET_STATUS_ERROR;
+            break;
+    }
+    /*  only array properties can have array options */
+    if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) &&
+        (rpdata->object_property != PROP_EVENT_TIME_STAMPS) &&
+//      (rpdata->object_property != PROP_PROPERTY_LIST) &&
+        (rpdata->array_index != BACNET_ARRAY_ALL)) {
+        rpdata->error_class = ERROR_CLASS_PROPERTY;
+        rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        apdu_len = BACNET_STATUS_ERROR;
+    }
+
+    return apdu_len;
+}
+
+
+
+
+/* returns true if successful */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Analog_Value_Write_Property(
+    BACNET_WRITE_PROPERTY_DATA * wp_data)
+{
+    bool status = false;        /* return value */
+    unsigned int object_index = 0;
+    int len = 0;
+    BACNET_APPLICATION_DATA_VALUE value;
+    ANALOG_VALUE_DESCR *CurrentAV;
+
+    /* decode the some of the request */
+    len =
+        bacapp_decode_application_data(wp_data->application_data,
+        wp_data->application_data_len, &value);
+    /* FIXME: len < application_data_len: more data? */
+    if (len < 0) {
+        /* error while decoding - a value larger than we can handle */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+        return false;
+    }
+    if ((wp_data->object_property != PROP_PRIORITY_ARRAY) &&
+        (wp_data->object_property != PROP_EVENT_TIME_STAMPS) &&
+        (wp_data->array_index != BACNET_ARRAY_ALL)) {
+        /*  only array properties can have array options */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        return false;
+    }
+    object_index = Analog_Value_Instance_To_Index(wp_data->object_instance);
+    if (object_index < MAX_ANALOG_VALUES)
+        CurrentAV = &AV_Descr[object_index];
+    else
+        return false;
+
+    switch (wp_data->object_property) {
+        case PROP_PRESENT_VALUE:
+            if (value.tag == BACNET_APPLICATION_TAG_REAL) {
+                if (Analog_Value_Present_Value_Set(wp_data->object_instance,
+                        value.type.Real, wp_data->priority)) {
+                    status = true;
+                } else if (wp_data->priority == 6) {
+                    /* Command priority 6 is reserved for use by Minimum On/Off
+                       algorithm and may not be used for other purposes in any
+                       object. */
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+                } else {
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                }
+            } else {
+                status =
+                    WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
+                    &wp_data->error_class, &wp_data->error_code);
+                if (status) {
+                    status =
+                        Analog_Value_Present_Value_Relinquish
+                        (wp_data->object_instance, wp_data->priority);
+                }
+                if (!status) {
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                }
+            }
+            break;
+
+        case PROP_OUT_OF_SERVICE:
+        {
+            bool Previous_Out_Of_Service = CurrentAV->Out_Of_Service;
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                CurrentAV->Out_Of_Service = value.type.Boolean;
+                if (Previous_Out_Of_Service && !CurrentAV->Out_Of_Service)
+                    /* We have just changed from Out_of_Service -> In Service */
+                    /* We need to update the Present_Value to the value
+                     * currently in the PLC...
+                     */
+                    CurrentAV->Present_Value[BACNET_MAX_PRIORITY-1] =
+                                             *(CurrentAV->Located_Var_ptr);
+            }
+            break;
+        }
+
+        case PROP_UNITS:
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                CurrentAV->Units = value.type.Enumerated;
+            }
+            break;
+
+        case PROP_OBJECT_IDENTIFIER:
+        case PROP_OBJECT_NAME:
+        case PROP_OBJECT_TYPE:
+        case PROP_STATUS_FLAGS:
+        case PROP_EVENT_STATE:
+        case PROP_DESCRIPTION:
+        case PROP_RELINQUISH_DEFAULT:
+        case PROP_PRIORITY_ARRAY:
+//      case PROP_PROPERTY_LIST:
+//      case PROP_CURRENT_COMMAND_PRIORITY:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+            break;
+        default:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            break;
+    }
+
+    return status;
+}
+
+
+
+
+
+
+
+/********************************************/
+/** Functions required for Beremiz plugin  **/
+/********************************************/
+
+void  Analog_Value_Copy_Present_Value_to_Located_Var(void) {
+    unsigned i;
+    for (i = 0; i < MAX_ANALOG_VALUES; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (AV_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        *(AV_Descr[i].Located_Var_ptr) = Analog_Value_Present_Value(AV_Descr[i].Object_Identifier);
+    }
+}
+
+
+
+void  Analog_Value_Copy_Located_Var_to_Present_Value(void) {
+    unsigned i;
+    for (i = 0; i < MAX_ANALOG_VALUES; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (AV_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        AV_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1] = *(AV_Descr[i].Located_Var_ptr);
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/av.h	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,106 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2011 Krzysztof Malorny <malornykrzysztof@gmail.com>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+#ifndef AV_H
+#define AV_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include "bacdef.h"
+#include "bacerror.h"
+#include "wp.h"
+#include "rp.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+    typedef struct analog_value_descr {
+        /* pointer to IEC 61131-3 located variable that is mapped onto this BACnet object */
+        float   *Located_Var_ptr;
+        uint32_t Object_Identifier;  /* called object 'Instance' in the source code! */
+        char    *Object_Name;   
+        char    *Description;
+        uint16_t Units;
+      
+        /* stores the current value */
+        /* one entry per priority value */
+        float Present_Value[BACNET_MAX_PRIORITY];
+        unsigned Event_State:3;
+        bool Out_Of_Service;
+    } ANALOG_VALUE_DESCR;
+
+
+    void Analog_Value_Property_Lists(
+        const int **pRequired,
+        const int **pOptional,
+        const int **pProprietary);
+    bool Analog_Value_Valid_Instance(
+        uint32_t object_instance);
+    unsigned Analog_Value_Count(
+        void);
+    uint32_t Analog_Value_Index_To_Instance(
+        unsigned index);
+    unsigned Analog_Value_Instance_To_Index(
+        uint32_t object_instance);
+
+    bool Analog_Value_Object_Name(
+        uint32_t object_instance,
+        BACNET_CHARACTER_STRING * object_name);
+
+    int Analog_Value_Read_Property(
+        BACNET_READ_PROPERTY_DATA * rpdata);
+
+    bool Analog_Value_Write_Property(
+        BACNET_WRITE_PROPERTY_DATA * wp_data);
+
+    bool Analog_Value_Present_Value_Set(
+        uint32_t object_instance,
+        float value,
+        uint8_t priority);
+    float Analog_Value_Present_Value(
+        uint32_t object_instance);
+
+    char *Analog_Value_Description(
+        uint32_t instance);
+
+    uint16_t Analog_Value_Units(
+        uint32_t instance);
+
+    bool Analog_Value_Out_Of_Service(
+        uint32_t instance);
+    void Analog_Value_Out_Of_Service_Set(
+        uint32_t instance,
+        bool oos_flag);
+
+    void Analog_Value_Init(
+        void);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/bi.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,492 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+
+/* Binary Input Objects - customize for your use */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "config_bacnet_for_beremiz_%(locstr)s.h"     /* the custom configuration for beremiz plugin */
+#include "bacdef.h"
+#include "bacdcode.h"
+#include "bacenum.h"
+#include "bacapp.h"
+#include "wp.h"
+#include "rp.h"
+#include "bi_%(locstr)s.h"
+#include "handlers.h"
+
+
+
+/* initial value for present_value property of each object */ 
+#define BI_VALUE_INIT (0)
+
+
+/* The IEC 61131-3 located variables mapped onto the Binary Input objects of BACnet protocol */
+%(BI_lvars)s
+
+
+/* The array where we keep all the state related to the Binary Input Objects */
+#define MAX_BINARY_INPUTS %(BI_count)s
+static BINARY_INPUT_DESCR BI_Descr[MAX_BINARY_INPUTS] = {
+%(BI_param)s
+};
+
+
+
+
+/* These three arrays are used by the ReadPropertyMultiple handler,
+ * as well as to initialize the XXX_Property_List used by the 
+ * Property List (PROP_PROPERTY_LIST) property.
+ */
+static const int Binary_Input_Properties_Required[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                              /*(1)(2)      */
+    PROP_OBJECT_IDENTIFIER,   /* R  R ( 75) */
+    PROP_OBJECT_NAME,         /* R  R ( 77) */
+    PROP_OBJECT_TYPE,         /* R  R ( 79) */
+    PROP_PRESENT_VALUE,       /* W  R ( 85) */
+    PROP_STATUS_FLAGS,        /* R  R (111) */
+    PROP_EVENT_STATE,         /* R  R ( 36) */
+    PROP_OUT_OF_SERVICE,      /* W  R ( 81) */
+    PROP_POLARITY,            /* R  R ( 84) */
+//  PROP_PROPERTY_LIST,       /* R  R (371) */
+    -1
+};
+
+static const int Binary_Input_Properties_Optional[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                              /*(1)(2)      */
+    PROP_DESCRIPTION,         /* R  O ( 28) */
+    -1
+};
+
+static const int Binary_Input_Properties_Proprietary[] = {
+    -1
+};
+
+
+/* This array stores the PROPERTY_LIST which may be read by clients.
+ * End of list is marked by following the last element with the value '-1'
+ * 
+ * It is initialized by Binary_Input_Init() based off the values
+ * stored in Binary_Input_Properties_Required 
+ *           Binary_Input_Properties_Optional
+ *           Binary_Input_Properties_Proprietary
+ */
+/* TODO: Allocate memory for this array with malloc() at startup */
+static int Binary_Input_Properties_List[64];
+
+
+
+
+
+/********************************************************/
+/**                  Callback functions.               **/
+/** Functions required by BACnet devie implementation. **/
+/********************************************************/
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Binary_Input_Property_Lists(
+    const int **pRequired,
+    const int **pOptional,
+    const int **pProprietary)
+{
+    if (pRequired)
+        *pRequired = Binary_Input_Properties_Required;
+    if (pOptional)
+        *pOptional = Binary_Input_Properties_Optional;
+    if (pProprietary)
+        *pProprietary = Binary_Input_Properties_Proprietary;
+
+    return;
+}
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Binary_Input_Init(
+    void)
+{
+    unsigned i, j;
+    static bool initialized = false;
+
+    // fprintf(stderr, "BACnet plugin: Binary_Input_Init() called!\n");
+    
+    if (!initialized) {
+        initialized = true;
+
+        /* initialize the Binary_Input_Properties_List array */
+        int len = 0;
+        len += BACnet_Init_Properties_List(Binary_Input_Properties_List + len,
+                                           Binary_Input_Properties_Required);
+        len += BACnet_Init_Properties_List(Binary_Input_Properties_List + len,
+                                           Binary_Input_Properties_Optional);
+        len += BACnet_Init_Properties_List(Binary_Input_Properties_List + len,
+                                           Binary_Input_Properties_Proprietary);
+
+        /* initialize all the binary values priority arrays to NULL */
+        for (i = 0; i < MAX_BINARY_INPUTS; i++) {
+            BI_Descr[i].Present_Value = BI_VALUE_INIT;
+            BI_Descr[i].Polarity      = POLARITY_NORMAL;
+        }
+    }
+
+    return;
+}
+
+
+
+/* validate that the given instance (Object ID) exists */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Binary_Input_Valid_Instance(
+    uint32_t object_instance)
+{
+    // fprintf(stderr, "BACnet plugin: Binary_Input_Valid_Instance(obj_ID=%%u) called!\n", object _instance);
+    return (Binary_Input_Instance_To_Index(object_instance) < MAX_BINARY_INPUTS);
+}
+
+
+/* the number of Binary Input Objects */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+unsigned Binary_Input_Count(void)   {return MAX_BINARY_INPUTS;}
+
+
+/* returns the instance (i.e. Object Identifier) that correlates to the correct index */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+uint32_t Binary_Input_Index_To_Instance(unsigned index) {return BI_Descr[index].Object_Identifier;}
+
+
+/* returns the index that correlates to the correct instance number (Object Identifier) */
+unsigned Binary_Input_Instance_To_Index(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+  
+    for (index = 0; index < MAX_BINARY_INPUTS; index++)
+        if (object_instance == BI_Descr[index].Object_Identifier)
+            return index;
+
+    /* error, this object ID is not in our list! */
+    return MAX_BINARY_INPUTS;
+}
+
+
+
+BACNET_BINARY_PV Binary_Input_Present_Value(
+    uint32_t object_instance)
+{
+    BACNET_BINARY_PV value = BI_VALUE_INIT;
+    unsigned index = 0;
+    unsigned i = 0;
+
+    // fprintf(stderr, "BACnet plugin: Binary_Input_Present_Value(obj_ID=%%u) called!\n", object_instance);
+
+    index = Binary_Input_Instance_To_Index(object_instance);
+    if (index < MAX_BINARY_INPUTS)
+        value = BI_Descr[index].Present_Value;
+
+    return value;
+}
+
+
+
+/* note: the object name must be unique within this device */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Binary_Input_Object_Name(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool    status = false;
+    unsigned index = Binary_Input_Instance_To_Index(object_instance);
+
+    if (index < MAX_BINARY_INPUTS)
+        status = characterstring_init_ansi(object_name, BI_Descr[index].Object_Name);
+    
+    return status;
+}
+
+
+
+bool Binary_Input_Object_Description(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool    status = false;
+    unsigned index = Binary_Input_Instance_To_Index(object_instance);
+
+    if (index < MAX_BINARY_INPUTS)
+        status = characterstring_init_ansi(object_name, BI_Descr[index].Description);
+    
+    return status;    
+}
+
+
+
+/* return apdu len, or BACNET_STATUS_ERROR on error */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+int Binary_Input_Read_Property(
+    BACNET_READ_PROPERTY_DATA * rpdata)
+{
+    int len = 0;
+    int apdu_len = 0;   /* return value */
+    BACNET_BIT_STRING bit_string;
+    BACNET_CHARACTER_STRING char_string;
+    BACNET_BINARY_PV present_value = BINARY_INACTIVE;
+    unsigned object_index = 0;
+    unsigned i = 0;
+    bool state = false;
+    uint8_t *apdu = NULL;
+
+    // fprintf(stderr, "BACnet plugin: Binary_Input_Read_Property() called!\n");
+
+    if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
+        (rpdata->application_data_len == 0)) {
+        return 0;
+    }
+    
+    object_index = Binary_Input_Instance_To_Index(rpdata->object_instance);
+    if (object_index >= MAX_BINARY_INPUTS) {
+        rpdata->error_class = ERROR_CLASS_OBJECT;
+        rpdata->error_code  = ERROR_CODE_UNKNOWN_OBJECT;
+        return BACNET_STATUS_ERROR;
+    }
+    
+    apdu = rpdata->application_data;
+    switch (rpdata->object_property) {
+        case PROP_OBJECT_IDENTIFIER:
+            apdu_len =
+                encode_application_object_id(&apdu[0], OBJECT_BINARY_INPUT,
+                rpdata->object_instance);
+            break;
+        case PROP_OBJECT_NAME:
+            Binary_Input_Object_Name(rpdata->object_instance, &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_DESCRIPTION:
+            Binary_Input_Object_Description(rpdata->object_instance, &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_OBJECT_TYPE:
+            apdu_len =
+                encode_application_enumerated(&apdu[0], OBJECT_BINARY_INPUT);
+            break;
+        case PROP_PRESENT_VALUE:
+            present_value =
+                Binary_Input_Present_Value(rpdata->object_instance);
+            apdu_len = encode_application_enumerated(&apdu[0], present_value);
+            break;
+        case PROP_STATUS_FLAGS:
+            /* note: see the details in the standard on how to use these */
+            bitstring_init(&bit_string);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_IN_ALARM, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_FAULT, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OVERRIDDEN, false);
+            state = BI_Descr[object_index].Out_Of_Service;
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE, state);
+            apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
+            break;
+        case PROP_EVENT_STATE:
+            /* note: see the details in the standard on how to use this */
+            apdu_len =
+                encode_application_enumerated(&apdu[0], EVENT_STATE_NORMAL);
+            break;
+        case PROP_OUT_OF_SERVICE:
+            state = BI_Descr[object_index].Out_Of_Service;
+            apdu_len = encode_application_boolean(&apdu[0], state);
+            break;
+        case PROP_POLARITY:
+            apdu_len = encode_application_enumerated(&apdu[0],
+                                BI_Descr[object_index].Polarity);
+            break;
+//      case PROP_PROPERTY_LIST:
+//          BACnet_encode_array(Binary_Input_Properties_List,
+//                              property_list_count(Binary_Input_Properties_List),
+//                              retfalse, encode_application_enumerated);
+//          break;
+        default:
+            rpdata->error_class = ERROR_CLASS_PROPERTY;
+            rpdata->error_code  = ERROR_CODE_UNKNOWN_PROPERTY;
+            apdu_len = BACNET_STATUS_ERROR;
+            break;
+    }
+    /*  only array properties can have array options */
+    if ((apdu_len >= 0) &&
+//      (rpdata->object_property != PROP_PROPERTY_LIST) &&
+        (rpdata->array_index != BACNET_ARRAY_ALL)) {
+        rpdata->error_class = ERROR_CLASS_PROPERTY;
+        rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        apdu_len = BACNET_STATUS_ERROR;
+    }
+
+    return apdu_len;
+}
+
+
+
+
+/* returns true if successful */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Binary_Input_Write_Property(
+    BACNET_WRITE_PROPERTY_DATA * wp_data)
+{
+    bool status = false;        /* return value */
+    unsigned int object_index = 0;
+    unsigned int priority = 0;
+    BACNET_BINARY_PV level = BINARY_NULL;
+    int len = 0;
+    BACNET_APPLICATION_DATA_VALUE value;
+
+    /* decode the some of the request */
+    len =
+        bacapp_decode_application_data(wp_data->application_data,
+        wp_data->application_data_len, &value);
+    /* FIXME: len < application_data_len: more data? */
+    if (len < 0) {
+        /* error while decoding - a value larger than we can handle */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+        return false;
+    }
+    /*  only array properties can have array options */
+    if (wp_data->array_index != BACNET_ARRAY_ALL) {
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        return false;
+    }
+    /* No need to check whether object_index is within bounds.
+     * Has already been checked before Binary_Input_Write_Property() is called
+     */
+    object_index = Binary_Input_Instance_To_Index(wp_data->object_instance);
+    
+    switch (wp_data->object_property) {
+        case PROP_PRESENT_VALUE:
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
+                &wp_data->error_class, &wp_data->error_code);
+            if (!status) {
+                wp_data->error_class = ERROR_CLASS_PROPERTY;
+                wp_data->error_code  = ERROR_CODE_VALUE_OUT_OF_RANGE;
+            } else {
+                if (!BI_Descr[object_index].Out_Of_Service) {
+                    /* input objects can only be written to when Out_Of_Service is true! */
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code  = ERROR_CODE_WRITE_ACCESS_DENIED;
+                    status = false; // not really necessary here.
+                } else {
+                    if (!(value.type.Enumerated <= MAX_BINARY_PV)) {
+                        wp_data->error_class = ERROR_CLASS_PROPERTY;
+                        wp_data->error_code  = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                        status = false;
+                    } else {
+                        level = (BACNET_BINARY_PV) value.type.Enumerated;
+                        BI_Descr[object_index].Present_Value = level;
+                        status = true;
+                    }
+                }
+            }
+            break;
+        case PROP_OUT_OF_SERVICE:
+        {
+            bool Previous_Out_Of_Service = BI_Descr[object_index].Out_Of_Service;
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                BI_Descr[object_index].Out_Of_Service = value.type.Boolean;
+                if (Previous_Out_Of_Service && !BI_Descr[object_index].Out_Of_Service)
+                    /* We have just changed from Out_of_Service -> In Service */
+                    /* We need to update the Present_Value to the value
+                     * currently in the PLC...
+                     */
+                    BI_Descr[object_index].Present_Value =
+                                           *(BI_Descr[object_index].Located_Var_ptr);
+            }
+            break;
+        }
+        case PROP_OBJECT_IDENTIFIER:
+        case PROP_OBJECT_NAME:
+        case PROP_DESCRIPTION:
+        case PROP_OBJECT_TYPE:
+        case PROP_STATUS_FLAGS:
+        case PROP_EVENT_STATE:
+        case PROP_POLARITY:
+//      case PROP_PROPERTY_LIST:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+            break;
+        default:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            break;
+    }
+
+    return status;
+}
+
+
+
+
+
+/********************************************/
+/** Functions required for Beremiz plugin  **/
+/********************************************/
+
+
+
+void  Binary_Input_Copy_Present_Value_to_Located_Var(void) {
+    unsigned i;
+    for (i = 0; i < MAX_BINARY_INPUTS; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (BI_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        *(BI_Descr[i].Located_Var_ptr) = Binary_Input_Present_Value(BI_Descr[i].Object_Identifier);
+    }
+}
+  
+void  Binary_Input_Copy_Located_Var_to_Present_Value(void) {
+    unsigned i;
+    for (i = 0; i < MAX_BINARY_INPUTS; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (BI_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value (0 is false, all other values are true)
+        if (*(BI_Descr[i].Located_Var_ptr))
+            BI_Descr[i].Present_Value = BINARY_ACTIVE;
+        else
+            BI_Descr[i].Present_Value = BINARY_INACTIVE;
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/bi.h	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,104 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+#ifndef BI_H
+#define BI_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include "bacdef.h"
+#include "bacerror.h"
+#include "rp.h"
+#include "wp.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+    typedef struct Binary_Input_descr {
+        /* pointer to IEC 61131-3 located variable that is mapped onto this BACnet object */
+        uint8_t *Located_Var_ptr;
+        uint32_t Object_Identifier;  /* called object 'Instance' in the source code! */
+        char    *Object_Name;   
+        char    *Description;
+        /* stores the current value */
+        BACNET_BINARY_PV Present_Value;
+        /* Writable out-of-service allows others to play with our Present Value */
+        /* without changing the physical output */
+        bool             Out_Of_Service;
+        BACNET_POLARITY  Polarity;
+    } BINARY_INPUT_DESCR;
+
+
+    void Binary_Input_Property_Lists(
+        const int **pRequired,
+        const int **pOptional,
+        const int **pProprietary);
+    bool Binary_Input_Valid_Instance(
+        uint32_t object_instance);
+    unsigned Binary_Input_Count(
+        void);
+    uint32_t Binary_Input_Index_To_Instance(
+        unsigned index);
+    unsigned Binary_Input_Instance_To_Index(
+        uint32_t object_instance);
+
+    bool Binary_Input_Object_Name(
+        uint32_t object_instance,
+        BACNET_CHARACTER_STRING * object_name);
+
+    char *Binary_Input_Description(
+        uint32_t instance);
+
+    BACNET_BINARY_PV Binary_Input_Present_Value(
+        uint32_t instance);
+    bool Binary_Input_Present_Value_Set(
+        uint32_t instance,
+        BACNET_BINARY_PV value);
+
+    bool Binary_Input_Out_Of_Service(
+        uint32_t instance);
+    void Binary_Input_Out_Of_Service_Set(
+        uint32_t instance,
+        bool value);
+
+    char *Binary_Input_Description(
+        uint32_t instance);
+
+    int Binary_Input_Read_Property(
+        BACNET_READ_PROPERTY_DATA * rpdata);
+
+    bool Binary_Input_Write_Property(
+        BACNET_WRITE_PROPERTY_DATA * wp_data);
+
+    void Binary_Input_Init(
+        void);
+
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/bo.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,567 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+
+/* Binary Output Objects - customize for your use */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "config_bacnet_for_beremiz_%(locstr)s.h"     /* the custom configuration for beremiz plugin */
+#include "bacdef.h"
+#include "bacdcode.h"
+#include "bacenum.h"
+#include "bacapp.h"
+#include "wp.h"
+#include "rp.h"
+#include "bo_%(locstr)s.h"
+#include "handlers.h"
+
+/* we choose to have a NULL level in our system represented by */
+/* a particular value.  When the priorities are not in use, they */
+/* will be relinquished (i.e. set to the NULL level). */
+// BINARY_NULL
+/* test whether value is NULL */
+#define BINARY_OUTPUT_IS_NULL(x) ((x) == BINARY_NULL)
+
+/* When all the priorities are level null, the present value returns
+ * the Relinquish Default value 
+ */
+#define BO_VALUE_RELINQUISH_DEFAULT BINARY_INACTIVE
+
+/* The IEC 61131-3 located variables mapped onto the Binary Output objects of BACnet protocol */
+%(BO_lvars)s
+
+
+/* The array where we keep all the state related to the Binary Output Objects */
+#define MAX_BINARY_OUTPUTS %(BO_count)s
+static BINARY_OUTPUT_DESCR BO_Descr[MAX_BINARY_OUTPUTS] = {
+%(BO_param)s
+};
+
+
+
+
+/* These three arrays are used by the ReadPropertyMultiple handler,
+ * as well as to initialize the XXX_Property_List used by the 
+ * Property List (PROP_PROPERTY_LIST) property.
+ */
+static const int Binary_Output_Properties_Required[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                                  /*(1)(2)      */
+    PROP_OBJECT_IDENTIFIER,       /* R  R ( 75) */
+    PROP_OBJECT_NAME,             /* R  R ( 77) */
+    PROP_OBJECT_TYPE,             /* R  R ( 79) */
+    PROP_PRESENT_VALUE,           /* W  W ( 85) */
+    PROP_STATUS_FLAGS,            /* R  R (111) */
+    PROP_EVENT_STATE,             /* R  R ( 36) */
+    PROP_OUT_OF_SERVICE,          /* W  R ( 81) */
+    PROP_POLARITY,                /* R  R ( 84) */
+    PROP_PRIORITY_ARRAY,          /* R  R ( 87) */
+    PROP_RELINQUISH_DEFAULT,      /* R  R (104) */
+//  PROP_PROPERTY_LIST,           /* R  R (371) */
+//  PROP_CURRENT_COMMAND_PRIORITY,/* R  R (431) */   
+    -1
+};
+
+static const int Binary_Output_Properties_Optional[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                              /*(1)(2)      */
+    PROP_DESCRIPTION,         /* R  O ( 28) */
+    -1
+};
+
+static const int Binary_Output_Properties_Proprietary[] = {
+    -1
+};
+
+
+/* This array stores the PROPERTY_LIST which may be read by clients.
+ * End of list is marked by following the last element with the value '-1'
+ * 
+ * It is initialized by Binary_Output_Init() based off the values
+ * stored in Binary_Output_Properties_Required 
+ *           Binary_Output_Properties_Optional
+ *           Binary_Output_Properties_Proprietary
+ */
+/* TODO: Allocate memory for this array with malloc() at startup */
+static int Binary_Output_Properties_List[64];
+
+
+
+
+
+/********************************************************/
+/**                  Callback functions.               **/
+/** Functions required by BACnet devie implementation. **/
+/********************************************************/
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Binary_Output_Property_Lists(
+    const int **pRequired,
+    const int **pOptional,
+    const int **pProprietary)
+{
+    if (pRequired)
+        *pRequired = Binary_Output_Properties_Required;
+    if (pOptional)
+        *pOptional = Binary_Output_Properties_Optional;
+    if (pProprietary)
+        *pProprietary = Binary_Output_Properties_Proprietary;
+
+    return;
+}
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Binary_Output_Init(
+    void)
+{
+    unsigned i, j;
+    static bool initialized = false;
+
+    // fprintf(stderr, "BACnet plugin: Binary_Output_Init() called!\n");
+    
+    if (!initialized) {
+        initialized = true;
+
+        /* initialize the Binary_Output_Properties_List array */
+        int len = 0;
+        len += BACnet_Init_Properties_List(Binary_Output_Properties_List + len,
+                                           Binary_Output_Properties_Required);
+        len += BACnet_Init_Properties_List(Binary_Output_Properties_List + len,
+                                           Binary_Output_Properties_Optional);
+        len += BACnet_Init_Properties_List(Binary_Output_Properties_List + len,
+                                           Binary_Output_Properties_Proprietary);
+
+        /* initialize all the binary values priority arrays to NULL */
+        for (i = 0; i < MAX_BINARY_OUTPUTS; i++) {
+            for (j = 0; j < BACNET_MAX_PRIORITY; j++) {
+                BO_Descr[i].Present_Value[j] = BINARY_NULL;
+            }
+        }
+    }
+
+    return;
+}
+
+
+
+/* validate that the given instance (Object ID) exists */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Binary_Output_Valid_Instance(
+    uint32_t object_instance)
+{
+    // fprintf(stderr, "BACnet plugin: Binary_Output_Valid_Instance(obj_ID=%%u) called!\n", object _instance);
+    return (Binary_Output_Instance_To_Index(object_instance) < MAX_BINARY_OUTPUTS);
+}
+
+
+/* the number of Binary Output Objects */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+unsigned Binary_Output_Count(void)   {return MAX_BINARY_OUTPUTS;}
+
+
+/* returns the instance (i.e. Object Identifier) that correlates to the correct index */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+uint32_t Binary_Output_Index_To_Instance(unsigned index) {return BO_Descr[index].Object_Identifier;}
+
+
+/* returns the index that correlates to the correct instance number (Object Identifier) */
+unsigned Binary_Output_Instance_To_Index(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+  
+    for (index = 0; index < MAX_BINARY_OUTPUTS; index++)
+        if (object_instance == BO_Descr[index].Object_Identifier)
+            return index;
+
+    /* error, this object ID is not in our list! */
+    return MAX_BINARY_OUTPUTS;
+}
+
+
+
+BACNET_BINARY_PV Binary_Output_Present_Value(
+    uint32_t object_instance)
+{
+    BACNET_BINARY_PV value = BO_VALUE_RELINQUISH_DEFAULT;
+    unsigned index = 0;
+    unsigned i = 0;
+
+    // fprintf(stderr, "BACnet plugin: Binary_Output_Present_Value(obj_ID=%%u) called!\n", object_instance);
+
+    index = Binary_Output_Instance_To_Index(object_instance);
+    if (index < MAX_BINARY_OUTPUTS) {
+        for (i = 0; i < BACNET_MAX_PRIORITY; i++) {
+            if (!BINARY_OUTPUT_IS_NULL(BO_Descr[index].Present_Value[i])) {
+                value = BO_Descr[index].Present_Value[i];
+                break;
+            }
+        }
+    }
+
+    return value;
+}
+
+
+
+/* returns command priority (1..16), or 0 if all priority values are at NULL */
+int Binary_Output_Current_Command_Priority(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+    unsigned i = 0;
+
+    index = Binary_Output_Instance_To_Index(object_instance);
+    if (index < MAX_BINARY_OUTPUTS) {
+        for (i = 0; i < BACNET_MAX_PRIORITY; i++) {
+            if (!BINARY_OUTPUT_IS_NULL(BO_Descr[index].Present_Value[i])) {
+                return i+1; // +1 since priority is 1..16, and not 0..15
+            }
+        }
+    }
+    // command values in all priorities are set to NULL
+    return 0;
+}
+
+
+
+/* note: the object name must be unique within this device */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Binary_Output_Object_Name(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool    status = false;
+    unsigned index = Binary_Output_Instance_To_Index(object_instance);
+
+    if (index < MAX_BINARY_OUTPUTS)
+        status = characterstring_init_ansi(object_name, BO_Descr[index].Object_Name);
+    
+    return status;
+}
+
+
+
+bool Binary_Output_Object_Description(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool    status = false;
+    unsigned index = Binary_Output_Instance_To_Index(object_instance);
+
+    if (index < MAX_BINARY_OUTPUTS)
+        status = characterstring_init_ansi(object_name, BO_Descr[index].Description);
+    
+    return status;    
+}
+
+
+
+/* return apdu len, or BACNET_STATUS_ERROR on error */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+int Binary_Output_Read_Property(
+    BACNET_READ_PROPERTY_DATA * rpdata)
+{
+    int len = 0;
+    int apdu_len = 0;   /* return value */
+    BACNET_BIT_STRING bit_string;
+    BACNET_CHARACTER_STRING char_string;
+    BACNET_BINARY_PV present_value = BINARY_INACTIVE;
+    unsigned object_index = 0;
+    unsigned i = 0;
+    bool state = false;
+    uint8_t *apdu = NULL;
+
+    // fprintf(stderr, "BACnet plugin: Binary_Output_Read_Property() called!\n");
+
+    if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
+        (rpdata->application_data_len == 0)) {
+        return 0;
+    }
+
+    object_index = Binary_Output_Instance_To_Index(rpdata->object_instance);
+    if (object_index >= MAX_BINARY_OUTPUTS) {
+        rpdata->error_class = ERROR_CLASS_OBJECT;
+        rpdata->error_code  = ERROR_CODE_UNKNOWN_OBJECT;
+        return BACNET_STATUS_ERROR;
+    }
+    
+    apdu = rpdata->application_data;
+    switch (rpdata->object_property) {
+        case PROP_OBJECT_IDENTIFIER:
+            apdu_len =
+                encode_application_object_id(&apdu[0], OBJECT_BINARY_OUTPUT,
+                rpdata->object_instance);
+            break;
+        case PROP_OBJECT_NAME:
+            Binary_Output_Object_Name(rpdata->object_instance, &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_DESCRIPTION:
+            Binary_Output_Object_Description(rpdata->object_instance, &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_OBJECT_TYPE:
+            apdu_len =
+                encode_application_enumerated(&apdu[0], OBJECT_BINARY_OUTPUT);
+            break;
+        case PROP_PRESENT_VALUE:
+            present_value =
+                Binary_Output_Present_Value(rpdata->object_instance);
+            apdu_len = encode_application_enumerated(&apdu[0], present_value);
+            break;
+        case PROP_STATUS_FLAGS:
+            /* note: see the details in the standard on how to use these */
+            bitstring_init(&bit_string);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_IN_ALARM, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_FAULT, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OVERRIDDEN, false);
+            state = BO_Descr[object_index].Out_Of_Service;
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE, state);
+            apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
+            break;
+        case PROP_EVENT_STATE:
+            /* note: see the details in the standard on how to use this */
+            apdu_len =
+                encode_application_enumerated(&apdu[0], EVENT_STATE_NORMAL);
+            break;
+        case PROP_OUT_OF_SERVICE:
+            state = BO_Descr[object_index].Out_Of_Service;
+            apdu_len = encode_application_boolean(&apdu[0], state);
+            break;
+        case PROP_PRIORITY_ARRAY:
+            BACnet_encode_array(BO_Descr[object_index].Present_Value,
+                                BACNET_MAX_PRIORITY,
+                                BINARY_OUTPUT_IS_NULL,
+                                encode_application_enumerated)
+            break;
+//      case PROP_CURRENT_COMMAND_PRIORITY: {
+//          unsigned i = Binary_Output_Current_Command_Priority(rpdata->object_instance);
+//          if (i == 0)  apdu_len = encode_application_null    (&apdu[0]);
+//          else         apdu_len = encode_application_unsigned(&apdu[0], i);
+//          break;
+//      }
+
+        case PROP_RELINQUISH_DEFAULT:
+            present_value = BO_VALUE_RELINQUISH_DEFAULT;
+            apdu_len = encode_application_enumerated(&apdu[0], present_value);
+            break;
+        case PROP_POLARITY:
+            apdu_len = encode_application_enumerated(&apdu[0],
+                                BO_Descr[object_index].Polarity);
+            break;
+//      case PROP_PROPERTY_LIST:
+//          BACnet_encode_array(Binary_Output_Properties_List,
+//                              property_list_count(Binary_Output_Properties_List),
+//                              retfalse, encode_application_enumerated);
+//          break;
+        default:
+            rpdata->error_class = ERROR_CLASS_PROPERTY;
+            rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            apdu_len = BACNET_STATUS_ERROR;
+            break;
+    }
+    /*  only array properties can have array options */
+    if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) &&
+//      (rpdata->object_property != PROP_PROPERTY_LIST) &&
+        (rpdata->array_index != BACNET_ARRAY_ALL)) {
+        rpdata->error_class = ERROR_CLASS_PROPERTY;
+        rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        apdu_len = BACNET_STATUS_ERROR;
+    }
+
+    return apdu_len;
+}
+
+
+
+
+/* returns true if successful */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Binary_Output_Write_Property(
+    BACNET_WRITE_PROPERTY_DATA * wp_data)
+{
+    bool status = false;        /* return value */
+    unsigned int object_index = 0;
+    unsigned int priority = 0;
+    BACNET_BINARY_PV level = BINARY_NULL;
+    int len = 0;
+    BACNET_APPLICATION_DATA_VALUE value;
+
+    /* decode the some of the request */
+    len =
+        bacapp_decode_application_data(wp_data->application_data,
+        wp_data->application_data_len, &value);
+    /* FIXME: len < application_data_len: more data? */
+    if (len < 0) {
+        /* error while decoding - a value larger than we can handle */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+        return false;
+    }
+    /*  only array properties can have array options */
+    if ((wp_data->object_property != PROP_PRIORITY_ARRAY) &&
+        (wp_data->array_index != BACNET_ARRAY_ALL)) {
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        return false;
+    }
+    /* No need to check whether object_index is within bounds.
+     * Has already been checked before Binary_Output_Write_Property() is called
+     */
+    object_index = Binary_Output_Instance_To_Index(wp_data->object_instance);
+
+    switch (wp_data->object_property) {
+        case PROP_PRESENT_VALUE:
+            if (value.tag == BACNET_APPLICATION_TAG_ENUMERATED) {
+                priority = wp_data->priority;
+                if (priority && (priority <= BACNET_MAX_PRIORITY) &&
+                    (priority != 6 /* reserved */ ) &&
+                    (value.type.Enumerated <= MAX_BINARY_PV)) {
+                    level = (BACNET_BINARY_PV) value.type.Enumerated;
+                    priority--;
+                    BO_Descr[object_index].Present_Value[priority] = level;
+                    status = true;
+                } else if (priority == 6) {
+                    /* Command priority 6 is reserved for use by Minimum On/Off
+                       algorithm and may not be used for other purposes in any
+                       object. */
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+                } else {
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                }
+            } else {
+                status =
+                    WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
+                    &wp_data->error_class, &wp_data->error_code);
+                if (status) {
+                    level = BINARY_NULL;
+                    priority = wp_data->priority;
+                    if (priority && (priority <= BACNET_MAX_PRIORITY)) {
+                        priority--;
+                        BO_Descr[object_index].Present_Value[priority] = level;
+                    } else {
+                        status = false;
+                        wp_data->error_class = ERROR_CLASS_PROPERTY;
+                        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                    }
+                }
+            }
+            break;
+        case PROP_OUT_OF_SERVICE:
+        {
+            bool Previous_Out_Of_Service = BO_Descr[object_index].Out_Of_Service;
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                BO_Descr[object_index].Out_Of_Service = value.type.Boolean;
+                if (Previous_Out_Of_Service && !BO_Descr[object_index].Out_Of_Service)
+                    /* We have just changed from Out_of_Service -> In Service */
+                    /* We need to update the Present_Value to the value
+                     * currently in the PLC...
+                     */
+                    BO_Descr[object_index].Present_Value[BACNET_MAX_PRIORITY-1] =
+                                           *(BO_Descr[object_index].Located_Var_ptr);
+            }
+            break;
+        }
+        case PROP_OBJECT_IDENTIFIER:
+        case PROP_OBJECT_NAME:
+        case PROP_DESCRIPTION:
+        case PROP_OBJECT_TYPE:
+        case PROP_STATUS_FLAGS:
+        case PROP_EVENT_STATE:
+        case PROP_PRIORITY_ARRAY:
+//      case PROP_CURRENT_COMMAND_PRIORITY:
+        case PROP_RELINQUISH_DEFAULT:
+        case PROP_POLARITY:
+//      case PROP_PROPERTY_LIST:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+            break;
+        default:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            break;
+    }
+
+    return status;
+}
+
+
+
+
+
+/********************************************/
+/** Functions required for Beremiz plugin  **/
+/********************************************/
+
+
+
+void  Binary_Output_Copy_Present_Value_to_Located_Var(void) {
+    unsigned i;
+    for (i = 0; i < MAX_BINARY_OUTPUTS; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (BO_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        *(BO_Descr[i].Located_Var_ptr) = Binary_Output_Present_Value(BO_Descr[i].Object_Identifier);
+    }
+}
+  
+void  Binary_Output_Copy_Located_Var_to_Present_Value(void) {
+    unsigned i;
+    for (i = 0; i < MAX_BINARY_OUTPUTS; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (BO_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        BO_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1] = *(BO_Descr[i].Located_Var_ptr);
+
+        // If the Present_Value was set to an invalid value (i.e. > 1, and < BINARY_NULL)
+        //   then we set it to BINARY_ACTIVE 
+        //   (i.e. we assume 0 is FALSE, all other non NULL values are TRUE)
+        if ((BO_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1] != BINARY_INACTIVE) &&
+            (BO_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1] != BINARY_ACTIVE  ) &&
+            (BO_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1] != BINARY_NULL    ))
+             BO_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1]  = BINARY_ACTIVE;          
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/bo.h	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,105 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+#ifndef BO_H
+#define BO_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include "bacdef.h"
+#include "bacerror.h"
+#include "rp.h"
+#include "wp.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+    typedef struct Binary_Output_descr {
+        /* pointer to IEC 61131-3 located variable that is mapped onto this BACnet object */
+        uint8_t *Located_Var_ptr;
+        uint32_t Object_Identifier;  /* called object 'Instance' in the source code! */
+        char    *Object_Name;   
+        char    *Description;
+        /* stores the current value */
+        /* one entry per priority value */
+        BACNET_BINARY_PV Present_Value[BACNET_MAX_PRIORITY];
+        /* Writable out-of-service allows others to play with our Present Value */
+        /* without changing the physical output */
+        bool             Out_Of_Service;
+        BACNET_POLARITY  Polarity;
+    } BINARY_OUTPUT_DESCR;
+
+
+    void Binary_Output_Property_Lists(
+        const int **pRequired,
+        const int **pOptional,
+        const int **pProprietary);
+    bool Binary_Output_Valid_Instance(
+        uint32_t object_instance);
+    unsigned Binary_Output_Count(
+        void);
+    uint32_t Binary_Output_Index_To_Instance(
+        unsigned index);
+    unsigned Binary_Output_Instance_To_Index(
+        uint32_t object_instance);
+
+    bool Binary_Output_Object_Name(
+        uint32_t object_instance,
+        BACNET_CHARACTER_STRING * object_name);
+
+    char *Binary_Output_Description(
+        uint32_t instance);
+
+    BACNET_BINARY_PV Binary_Output_Present_Value(
+        uint32_t instance);
+    bool Binary_Output_Present_Value_Set(
+        uint32_t instance,
+        BACNET_BINARY_PV value);
+
+    bool Binary_Output_Out_Of_Service(
+        uint32_t instance);
+    void Binary_Output_Out_Of_Service_Set(
+        uint32_t instance,
+        bool value);
+
+    char *Binary_Output_Description(
+        uint32_t instance);
+
+    int Binary_Output_Read_Property(
+        BACNET_READ_PROPERTY_DATA * rpdata);
+
+    bool Binary_Output_Write_Property(
+        BACNET_WRITE_PROPERTY_DATA * wp_data);
+
+    void Binary_Output_Init(
+        void);
+
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/bv.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,562 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+
+/* Binary Value Objects - customize for your use */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "config_bacnet_for_beremiz_%(locstr)s.h"     /* the custom configuration for beremiz plugin */
+#include "bacdef.h"
+#include "bacdcode.h"
+#include "bacenum.h"
+#include "bacapp.h"
+#include "wp.h"
+#include "rp.h"
+#include "bv_%(locstr)s.h"
+#include "handlers.h"
+
+/* we choose to have a NULL level in our system represented by */
+/* a particular value.  When the priorities are not in use, they */
+/* will be relinquished (i.e. set to the NULL level). */
+// BINARY_NULL
+/* test whether value is NULL */
+#define BINARY_VALUE_IS_NULL(x) ((x) == BINARY_NULL)
+
+/* When all the priorities are level null, the present value returns
+ * the Relinquish Default value 
+ */
+#define BV_VALUE_RELINQUISH_DEFAULT BINARY_INACTIVE
+
+/* The IEC 61131-3 located variables mapped onto the Binary Value objects of BACnet protocol */
+%(BV_lvars)s
+
+
+/* The array where we keep all the state related to the Binary Value Objects */
+#define MAX_BINARY_VALUES %(BV_count)s
+static BINARY_VALUE_DESCR BV_Descr[MAX_BINARY_VALUES] = {
+%(BV_param)s
+};
+
+
+
+
+/* These three arrays are used by the ReadPropertyMultiple handler,
+ * as well as to initialize the XXX_Property_List used by the 
+ * Property List (PROP_PROPERTY_LIST) property.
+ */
+static const int Binary_Value_Properties_Required[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                              /*(1)(2)      */
+    PROP_OBJECT_IDENTIFIER,   /* R  R ( 75) */
+    PROP_OBJECT_NAME,         /* R  R ( 77) */
+    PROP_OBJECT_TYPE,         /* R  R ( 79) */
+    PROP_PRESENT_VALUE,       /* W  R ( 85) */
+    PROP_STATUS_FLAGS,        /* R  R (111) */
+    PROP_EVENT_STATE,         /* R  R ( 36) */
+    PROP_OUT_OF_SERVICE,      /* W  R ( 81) */
+//  PROP_PROPERTY_LIST,       /* R  R (371) */
+    -1
+};
+
+static const int Binary_Value_Properties_Optional[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                                  /*(1)(2)      */
+    PROP_DESCRIPTION,             /* R  O ( 28) */
+    /* required if Present_Value is writable (which is true in our case!) */
+    PROP_PRIORITY_ARRAY,          /* R  O ( 87) */
+    PROP_RELINQUISH_DEFAULT,      /* R  O (104) */
+//  PROP_CURRENT_COMMAND_PRIORITY,/* R  O (431) */   
+    -1
+};
+
+static const int Binary_Value_Properties_Proprietary[] = {
+    -1
+};
+
+
+/* This array stores the PROPERTY_LIST which may be read by clients.
+ * End of list is marked by following the last element with the value '-1'
+ * 
+ * It is initialized by Binary_Value_Init() based off the values
+ * stored in Binary_Value_Properties_Required 
+ *           Binary_Value_Properties_Optional
+ *           Binary_Value_Properties_Proprietary
+ */
+/* TODO: Allocate memory for this array with malloc() at startup */
+static int Binary_Value_Properties_List[64];
+
+
+
+
+
+/********************************************************/
+/**                  Callback functions.               **/
+/** Functions required by BACnet devie implementation. **/
+/********************************************************/
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Binary_Value_Property_Lists(
+    const int **pRequired,
+    const int **pOptional,
+    const int **pProprietary)
+{
+    if (pRequired)
+        *pRequired = Binary_Value_Properties_Required;
+    if (pOptional)
+        *pOptional = Binary_Value_Properties_Optional;
+    if (pProprietary)
+        *pProprietary = Binary_Value_Properties_Proprietary;
+
+    return;
+}
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Binary_Value_Init(
+    void)
+{
+    unsigned i, j;
+    static bool initialized = false;
+
+    // fprintf(stderr, "BACnet plugin: Binary_Value_Init() called!\n");
+    
+    if (!initialized) {
+        initialized = true;
+
+        /* initialize the Binary_Value_Properties_List array */
+        int len = 0;
+        len += BACnet_Init_Properties_List(Binary_Value_Properties_List + len,
+                                           Binary_Value_Properties_Required);
+        len += BACnet_Init_Properties_List(Binary_Value_Properties_List + len,
+                                           Binary_Value_Properties_Optional);
+        len += BACnet_Init_Properties_List(Binary_Value_Properties_List + len,
+                                           Binary_Value_Properties_Proprietary);
+
+        /* initialize all the binary values priority arrays to NULL */
+        for (i = 0; i < MAX_BINARY_VALUES; i++) {
+            for (j = 0; j < BACNET_MAX_PRIORITY; j++) {
+                BV_Descr[i].Present_Value[j] = BINARY_NULL;
+            }
+        }
+    }
+
+    return;
+}
+
+
+
+/* validate that the given instance (Object ID) exists */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Binary_Value_Valid_Instance(
+    uint32_t object_instance)
+{
+    // fprintf(stderr, "BACnet plugin: Binary_Value_Valid_Instance(obj_ID=%%u) called!\n", object _instance);
+    return (Binary_Value_Instance_To_Index(object_instance) < MAX_BINARY_VALUES);
+}
+
+
+/* the number of Binary Value Objects */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+unsigned Binary_Value_Count(void)   {return MAX_BINARY_VALUES;}
+
+
+/* returns the instance (i.e. Object Identifier) that correlates to the correct index */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+uint32_t Binary_Value_Index_To_Instance(unsigned index) {return BV_Descr[index].Object_Identifier;}
+
+
+/* returns the index that correlates to the correct instance number (Object Identifier) */
+unsigned Binary_Value_Instance_To_Index(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+  
+    for (index = 0; index < MAX_BINARY_VALUES; index++)
+        if (object_instance == BV_Descr[index].Object_Identifier)
+            return index;
+
+    /* error, this object ID is not in our list! */
+    return MAX_BINARY_VALUES;
+}
+
+
+
+BACNET_BINARY_PV Binary_Value_Present_Value(
+    uint32_t object_instance)
+{
+    BACNET_BINARY_PV value = BV_VALUE_RELINQUISH_DEFAULT;
+    unsigned index = 0;
+    unsigned i = 0;
+
+    // fprintf(stderr, "BACnet plugin: Binary_Value_Present_Value(obj_ID=%%u) called!\n", object_instance);
+
+    index = Binary_Value_Instance_To_Index(object_instance);
+    if (index < MAX_BINARY_VALUES) {
+        for (i = 0; i < BACNET_MAX_PRIORITY; i++) {
+            if (!BINARY_VALUE_IS_NULL(BV_Descr[index].Present_Value[i])) {
+                value = BV_Descr[index].Present_Value[i];
+                break;
+            }
+        }
+    }
+
+    return value;
+}
+
+
+
+/* returns command priority (1..16), or 0 if all priority values are at NULL */
+int Binary_Value_Current_Command_Priority(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+    unsigned i = 0;
+
+    index = Binary_Value_Instance_To_Index(object_instance);
+    if (index < MAX_BINARY_VALUES) {
+        for (i = 0; i < BACNET_MAX_PRIORITY; i++) {
+            if (!BINARY_VALUE_IS_NULL(BV_Descr[index].Present_Value[i])) {
+                return i+1; // +1 since priority is 1..16, and not 0..15
+            }
+        }
+    }
+    // command values in all priorities are set to NULL
+    return 0;
+}
+
+
+
+/* note: the object name must be unique within this device */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Binary_Value_Object_Name(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool    status = false;
+    unsigned index = Binary_Value_Instance_To_Index(object_instance);
+
+    if (index < MAX_BINARY_VALUES)
+        status = characterstring_init_ansi(object_name, BV_Descr[index].Object_Name);
+    
+    return status;
+}
+
+
+
+bool Binary_Value_Object_Description(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool    status = false;
+    unsigned index = Binary_Value_Instance_To_Index(object_instance);
+
+    if (index < MAX_BINARY_VALUES)
+        status = characterstring_init_ansi(object_name, BV_Descr[index].Description);
+    
+    return status;    
+}
+
+
+
+/* return apdu len, or BACNET_STATUS_ERROR on error */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+int Binary_Value_Read_Property(
+    BACNET_READ_PROPERTY_DATA * rpdata)
+{
+    int len = 0;
+    int apdu_len = 0;   /* return value */
+    BACNET_BIT_STRING bit_string;
+    BACNET_CHARACTER_STRING char_string;
+    BACNET_BINARY_PV present_value = BINARY_INACTIVE;
+    unsigned object_index = 0;
+    unsigned i = 0;
+    bool state = false;
+    uint8_t *apdu = NULL;
+
+    // fprintf(stderr, "BACnet plugin: Binary_Value_Read_Property() called!\n");
+
+    if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
+        (rpdata->application_data_len == 0)) {
+        return 0;
+    }
+
+    object_index = Binary_Value_Instance_To_Index(rpdata->object_instance);
+    if (object_index >= MAX_BINARY_VALUES) {
+        rpdata->error_class = ERROR_CLASS_OBJECT;
+        rpdata->error_code  = ERROR_CODE_UNKNOWN_OBJECT;
+        return BACNET_STATUS_ERROR;
+    }
+    
+    apdu = rpdata->application_data;
+    switch (rpdata->object_property) {
+        case PROP_OBJECT_IDENTIFIER:
+            apdu_len =
+                encode_application_object_id(&apdu[0], OBJECT_BINARY_VALUE,
+                rpdata->object_instance);
+            break;
+        case PROP_OBJECT_NAME:
+            Binary_Value_Object_Name(rpdata->object_instance, &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_DESCRIPTION:
+            Binary_Value_Object_Description(rpdata->object_instance, &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_OBJECT_TYPE:
+            apdu_len =
+                encode_application_enumerated(&apdu[0], OBJECT_BINARY_VALUE);
+            break;
+        case PROP_PRESENT_VALUE:
+            present_value =
+                Binary_Value_Present_Value(rpdata->object_instance);
+            apdu_len = encode_application_enumerated(&apdu[0], present_value);
+            break;
+        case PROP_STATUS_FLAGS:
+            /* note: see the details in the standard on how to use these */
+            bitstring_init(&bit_string);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_IN_ALARM, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_FAULT, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OVERRIDDEN, false);
+            state = BV_Descr[object_index].Out_Of_Service;
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE, state);
+            apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
+            break;
+        case PROP_EVENT_STATE:
+            /* note: see the details in the standard on how to use this */
+            apdu_len =
+                encode_application_enumerated(&apdu[0], EVENT_STATE_NORMAL);
+            break;
+        case PROP_OUT_OF_SERVICE:
+            state = BV_Descr[object_index].Out_Of_Service;
+            apdu_len = encode_application_boolean(&apdu[0], state);
+            break;
+        case PROP_PRIORITY_ARRAY:
+            BACnet_encode_array(BV_Descr[object_index].Present_Value,
+                                BACNET_MAX_PRIORITY,
+                                BINARY_VALUE_IS_NULL,
+                                encode_application_enumerated)
+            break;
+//      case PROP_CURRENT_COMMAND_PRIORITY: {
+//          unsigned i = Binary_Value_Current_Command_Priority(rpdata->object_instance);
+//          if (i == 0)  apdu_len = encode_application_null    (&apdu[0]);
+//          else         apdu_len = encode_application_unsigned(&apdu[0], i);
+//          break;
+//      }
+
+        case PROP_RELINQUISH_DEFAULT:
+            present_value = BV_VALUE_RELINQUISH_DEFAULT;
+            apdu_len = encode_application_enumerated(&apdu[0], present_value);
+            break;
+//      case PROP_PROPERTY_LIST:
+//          BACnet_encode_array(Binary_Value_Properties_List,
+//                              property_list_count(Binary_Value_Properties_List),
+//                              retfalse, encode_application_enumerated);
+//          break;
+        default:
+            rpdata->error_class = ERROR_CLASS_PROPERTY;
+            rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            apdu_len = BACNET_STATUS_ERROR;
+            break;
+    }
+    /*  only array properties can have array options */
+    if ((apdu_len >= 0) && (rpdata->object_property != PROP_PRIORITY_ARRAY) &&
+//      (rpdata->object_property != PROP_PROPERTY_LIST) &&
+        (rpdata->array_index != BACNET_ARRAY_ALL)) {
+        rpdata->error_class = ERROR_CLASS_PROPERTY;
+        rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        apdu_len = BACNET_STATUS_ERROR;
+    }
+
+    return apdu_len;
+}
+
+
+
+
+/* returns true if successful */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Binary_Value_Write_Property(
+    BACNET_WRITE_PROPERTY_DATA * wp_data)
+{
+    bool status = false;        /* return value */
+    unsigned int object_index = 0;
+    unsigned int priority = 0;
+    BACNET_BINARY_PV level = BINARY_NULL;
+    int len = 0;
+    BACNET_APPLICATION_DATA_VALUE value;
+
+    /* decode the some of the request */
+    len =
+        bacapp_decode_application_data(wp_data->application_data,
+        wp_data->application_data_len, &value);
+    /* FIXME: len < application_data_len: more data? */
+    if (len < 0) {
+        /* error while decoding - a value larger than we can handle */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+        return false;
+    }
+    /*  only array properties can have array options */
+    if ((wp_data->object_property != PROP_PRIORITY_ARRAY) &&
+        (wp_data->array_index != BACNET_ARRAY_ALL)) {
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        return false;
+    }
+    /* No need to check whether object_index is within bounds.
+     * Has already been checked before Binary_Value_Write_Property() is called
+     */
+    object_index = Binary_Value_Instance_To_Index(wp_data->object_instance);
+
+    switch (wp_data->object_property) {
+        case PROP_PRESENT_VALUE:
+            if (value.tag == BACNET_APPLICATION_TAG_ENUMERATED) {
+                priority = wp_data->priority;
+                if (priority && (priority <= BACNET_MAX_PRIORITY) &&
+                    (priority != 6 /* reserved */ ) &&
+                    (value.type.Enumerated <= MAX_BINARY_PV)) {
+                    level = (BACNET_BINARY_PV) value.type.Enumerated;
+                    priority--;
+                    BV_Descr[object_index].Present_Value[priority] = level;
+                    status = true;
+                } else if (priority == 6) {
+                    /* Command priority 6 is reserved for use by Minimum On/Off
+                       algorithm and may not be used for other purposes in any
+                       object. */
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+                } else {
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                }
+            } else {
+                status =
+                    WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
+                    &wp_data->error_class, &wp_data->error_code);
+                if (status) {
+                    level = BINARY_NULL;
+                    priority = wp_data->priority;
+                    if (priority && (priority <= BACNET_MAX_PRIORITY)) {
+                        priority--;
+                        BV_Descr[object_index].Present_Value[priority] = level;
+                    } else {
+                        status = false;
+                        wp_data->error_class = ERROR_CLASS_PROPERTY;
+                        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                    }
+                }
+            }
+            break;
+        case PROP_OUT_OF_SERVICE:
+        {
+            bool Previous_Out_Of_Service = BV_Descr[object_index].Out_Of_Service;
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                BV_Descr[object_index].Out_Of_Service = value.type.Boolean;
+                if (Previous_Out_Of_Service && !BV_Descr[object_index].Out_Of_Service)
+                    /* We have just changed from Out_of_Service -> In Service */
+                    /* We need to update the Present_Value to the value
+                     * currently in the PLC...
+                     */
+                    BV_Descr[object_index].Present_Value[BACNET_MAX_PRIORITY-1] =
+                                           *(BV_Descr[object_index].Located_Var_ptr);
+            }
+            break;
+        }
+        case PROP_OBJECT_IDENTIFIER:
+        case PROP_OBJECT_NAME:
+        case PROP_DESCRIPTION:
+        case PROP_OBJECT_TYPE:
+        case PROP_STATUS_FLAGS:
+        case PROP_EVENT_STATE:
+        case PROP_PRIORITY_ARRAY:
+//      case PROP_CURRENT_COMMAND_PRIORITY:
+        case PROP_RELINQUISH_DEFAULT:
+//      case PROP_PROPERTY_LIST:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+            break;
+        default:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            break;
+    }
+
+    return status;
+}
+
+
+
+
+
+/********************************************/
+/** Functions required for Beremiz plugin  **/
+/********************************************/
+
+
+
+void  Binary_Value_Copy_Present_Value_to_Located_Var(void) {
+    unsigned i;
+    for (i = 0; i < MAX_BINARY_VALUES; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (BV_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        *(BV_Descr[i].Located_Var_ptr) = Binary_Value_Present_Value(BV_Descr[i].Object_Identifier);
+    }
+}
+  
+void  Binary_Value_Copy_Located_Var_to_Present_Value(void) {
+    unsigned i;
+    for (i = 0; i < MAX_BINARY_VALUES; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (BV_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        BV_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1] = *(BV_Descr[i].Located_Var_ptr);
+
+        // If the Present_Value was set to an invalid value (i.e. > 1, and < BINARY_NULL)
+        //   then we set it to BINARY_ACTIVE 
+        //   (i.e. we assume 0 is FALSE, all other non NULL values are TRUE)
+        if ((BV_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1] != BINARY_INACTIVE) &&
+            (BV_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1] != BINARY_ACTIVE  ) &&
+            (BV_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1] != BINARY_NULL    ))
+             BV_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1]  = BINARY_ACTIVE;          
+    }
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/bv.h	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,104 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+#ifndef BV_H
+#define BV_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include "bacdef.h"
+#include "bacerror.h"
+#include "rp.h"
+#include "wp.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+    typedef struct binary_value_descr {
+        /* pointer to IEC 61131-3 located variable that is mapped onto this BACnet object */
+        uint8_t *Located_Var_ptr;
+        uint32_t Object_Identifier;  /* called object 'Instance' in the source code! */
+        char    *Object_Name;   
+        char    *Description;
+        /* stores the current value */
+        /* one entry per priority value */
+        BACNET_BINARY_PV Present_Value[BACNET_MAX_PRIORITY];
+        /* Writable out-of-service allows others to play with our Present Value */
+        /* without changing the physical output */
+        bool Out_Of_Service;
+    } BINARY_VALUE_DESCR;
+
+
+    void Binary_Value_Property_Lists(
+        const int **pRequired,
+        const int **pOptional,
+        const int **pProprietary);
+    bool Binary_Value_Valid_Instance(
+        uint32_t object_instance);
+    unsigned Binary_Value_Count(
+        void);
+    uint32_t Binary_Value_Index_To_Instance(
+        unsigned index);
+    unsigned Binary_Value_Instance_To_Index(
+        uint32_t object_instance);
+
+    bool Binary_Value_Object_Name(
+        uint32_t object_instance,
+        BACNET_CHARACTER_STRING * object_name);
+
+    char *Binary_Value_Description(
+        uint32_t instance);
+
+    BACNET_BINARY_PV Binary_Value_Present_Value(
+        uint32_t instance);
+    bool Binary_Value_Present_Value_Set(
+        uint32_t instance,
+        BACNET_BINARY_PV value);
+
+    bool Binary_Value_Out_Of_Service(
+        uint32_t instance);
+    void Binary_Value_Out_Of_Service_Set(
+        uint32_t instance,
+        bool value);
+
+    char *Binary_Value_Description(
+        uint32_t instance);
+
+    int Binary_Value_Read_Property(
+        BACNET_READ_PROPERTY_DATA * rpdata);
+
+    bool Binary_Value_Write_Property(
+        BACNET_WRITE_PROPERTY_DATA * wp_data);
+
+    void Binary_Value_Init(
+        void);
+
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/config_bacnet_for_beremiz.h	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,284 @@
+/**************************************************************************
+*
+* Copyright (C) 2004 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+
+
+#ifndef CONFIG_BACNET_FOR_BEREMIZ_H
+#define CONFIG_BACNET_FOR_BEREMIZ_H
+
+#ifdef  CONFIG_H
+#error  "config.h already processed! (config_bacnet_for_beremiz.h should be included before config.h)"
+#endif
+
+/* Compilaton options for BACnet library, configured for the BACnet sserver
+ * running on Beremiz.
+ */
+
+/* declare a single physical layer using your compiler define.
+ * see datalink.h for possible defines. 
+ */
+/* Use BACnet/IP */
+#define BACDL_BIP
+
+/* optional configuration for BACnet/IP datalink layers */
+/* other BIP defines (define as 1 to enable):
+    USE_INADDR - uses INADDR_BROADCAST for broadcast and binds using INADDR_ANY
+    USE_CLASSADDR = uses IN_CLASSx_HOST where x=A,B,C or D for broadcast
+*/
+#define BBMD_ENABLED 1
+
+/* name of file in which BDT table will be stored */
+#define BBMD_BACKUP_FILE beremiz_BACnet_BDT_table
+
+/* Enable the Gateway (Routing) functionality here, if desired. */
+#define MAX_NUM_DEVICES 1       /* Just the one normal BACnet Device Object */
+
+
+/* Define your processor architecture as
+   Big Endian (PowerPC,68K,Sparc) or Little Endian (Intel,AVR)
+   ARM and MIPS can be either - what is your setup? */
+
+/* WARNING: The following files are being included:
+ *              <stdib.h>  -->  <endian.h>  -->  <bits/endian.h>
+ * 
+ *          endian.h defines the following constants as:
+ *            #define __LITTLE_ENDIAN  and LITTLE_ENDIAN  as 1234
+ *            #define    __BIG_ENDIAN  and    BIG_ENDIAN  as 4321
+ *            #define    __PDP_ENDIAN  and    PDP_ENDIAN  as 3412
+ * 
+ *          bits/endian.h defines the constant BYTE_ORDER as:
+ *              #define __BYTE_ORDER as __LITTLE_ENDIAN
+ * 
+ *          endian.h then sets the following constants
+ *          (if __USE_BSD is set, which seems to be true):
+ *            # define LITTLE_ENDIAN    __LITTLE_ENDIAN
+ *            # define BIG_ENDIAN       __BIG_ENDIAN
+ *            # define PDP_ENDIAN       __PDP_ENDIAN
+ *            # define BYTE_ORDER       __BYTE_ORDER
+ * 
+ *         CONCLUSION:
+ *           The bacnet library uses the BIG_ENDIAN constant (set to 0, or anything <>0)
+ *           to indicate whether we are compiling on a little or big endian platform.
+ *           However, <stdlib.h> is defining this same constant as '4321' !!!
+ *           The decision to use BIG_ENDIAN as the constant is a unfortunate 
+ *           on the part of the bacnet coders, but we live with it for now...
+ *           We simply start off by undefining the BIG_ENDIAN constant, and carry
+ *           on from there! 
+ */
+#undef BIG_ENDIAN
+
+#ifndef BIG_ENDIAN
+#if defined(__GNUC__) 
+  /* We have GCC, which should define __LITTLE_ENDIAN__ or __BIG_ENDIAN__ */ 
+#  if   defined(__LITTLE_ENDIAN__)
+/*#    warning "Using gcc to determine platform endianness."*/
+#    define BIG_ENDIAN 0
+#  elif defined(__BIG_ENDIAN__)
+/*#    warning "Using gcc to determine platform endianness."*/
+#    define BIG_ENDIAN 1
+#  endif
+#endif /* __GNUC__   */ 
+#endif /* BIG_ENDIAN */
+
+
+/* If we still don't know byte order, try to get it from <endian.h> */
+#ifndef BIG_ENDIAN
+#include <endian.h>
+#  ifdef BYTE_ORDER
+#    if BYTE_ORDER == LITTLE_ENDIAN
+/*#      warning "Using <endian.h> to determine platform endianness."*/
+#      undef  BIG_ENDIAN 
+#      define BIG_ENDIAN 0
+#    elif BYTE_ORDER == BIG_ENDIAN
+/*#      warning "Using <endian.h> to determine platform endianness."*/
+#      undef  BIG_ENDIAN 
+#      define BIG_ENDIAN 1
+#    else
+#      undef  BIG_ENDIAN
+#    endif
+#  endif /* BYTE_ORDER */
+#endif   /* BIG_ENDIAN */
+
+
+#ifndef BIG_ENDIAN
+#error   "Unable to determine platform's byte order. Aborting compilation."
+#elif   BIG_ENDIAN
+/*#warning "Compiling for BIG endian platform."*/
+#else
+/*#warning "Compiling for LITTLE endian platform."*/
+#endif
+
+
+
+/* Define your Vendor Identifier assigned by ASHRAE */
+#define BACNET_VENDOR_ID %(BACnet_Vendor_ID)s
+#define BACNET_VENDOR_NAME "%(BACnet_Vendor_Name)s"
+#define BACNET_DEVICE_MODEL_NAME "%(BACnet_Model_Name)s"
+#define BACNET_FIRMWARE_REVISION  "Beremiz BACnet Extension, BACnet Stack:" BACNET_VERSION_TEXT
+#define BACNET_DEVICE_LOCATION    "%(BACnet_Device_Location)s"
+#define BACNET_DEVICE_DESCRIPTION "%(BACnet_Device_Description)s"  
+#define BACNET_DEVICE_APPSOFT_VER "%(BACnet_Device_AppSoft_Version)s"
+
+
+/* Max number of bytes in an APDU. */
+/* Typical sizes are 50, 128, 206, 480, 1024, and 1476 octets */
+/* This is used in constructing messages and to tell others our limits */
+/* 50 is the minimum; adjust to your memory and physical layer constraints */
+/* Lon=206, MS/TP=480, ARCNET=480, Ethernet=1476, BACnet/IP=1476 */
+#define MAX_APDU 1476
+/* #define MAX_APDU 128 enable this IP for testing readrange so you get the More Follows flag set */
+
+
+/* for confirmed messages, this is the number of transactions */
+/* that we hold in a queue waiting for timeout. */
+/* Configure to zero if you don't want any confirmed messages */
+/* Configure from 1..255 for number of outstanding confirmed */
+/* requests available. */
+#define MAX_TSM_TRANSACTIONS 255
+
+/* The address cache is used for binding to BACnet devices */
+/* The number of entries corresponds to the number of */
+/* devices that might respond to an I-Am on the network. */
+/* If your device is a simple server and does not need to bind, */
+/* then you don't need to use this. */
+#define MAX_ADDRESS_CACHE 255
+
+/* some modules have debugging enabled using PRINT_ENABLED */
+#define PRINT_ENABLED 0
+
+
+/* BACAPP decodes WriteProperty service requests
+   Choose the datatypes that your application supports */
+#if !(defined(BACAPP_ALL) || \
+    defined(BACAPP_NULL) || \
+    defined(BACAPP_BOOLEAN) || \
+    defined(BACAPP_UNSIGNED) || \
+    defined(BACAPP_SIGNED) || \
+    defined(BACAPP_REAL) || \
+    defined(BACAPP_DOUBLE) || \
+    defined(BACAPP_OCTET_STRING) || \
+    defined(BACAPP_CHARACTER_STRING) || \
+    defined(BACAPP_BIT_STRING) || \
+    defined(BACAPP_ENUMERATED) || \
+    defined(BACAPP_DATE) || \
+    defined(BACAPP_TIME) || \
+    defined(BACAPP_OBJECT_ID) || \
+    defined(BACAPP_DEVICE_OBJECT_PROP_REF))
+#define BACAPP_ALL
+#endif
+
+#if defined (BACAPP_ALL)
+#define BACAPP_NULL
+#define BACAPP_BOOLEAN
+#define BACAPP_UNSIGNED
+#define BACAPP_SIGNED
+#define BACAPP_REAL
+#define BACAPP_DOUBLE
+#define BACAPP_OCTET_STRING
+#define BACAPP_CHARACTER_STRING
+#define BACAPP_BIT_STRING
+#define BACAPP_ENUMERATED
+#define BACAPP_DATE
+#define BACAPP_TIME
+#define BACAPP_OBJECT_ID
+#define BACAPP_DEVICE_OBJECT_PROP_REF
+#endif
+
+/*
+** Set the maximum vector type sizes
+*/
+#define MAX_BITSTRING_BYTES        (15)
+#define MAX_CHARACTER_STRING_BYTES (MAX_APDU-6)
+#define MAX_OCTET_STRING_BYTES     (MAX_APDU-6)
+
+/*
+** Control the selection of services etc to enable code size reduction for those
+** compiler suites which do not handle removing of unused functions in modules
+** so well.
+**
+** We will start with the A type services code first as these are least likely
+** to be required in embedded systems using the stack.
+*/
+
+/*
+** Define the services that may be required.
+**
+**/
+
+/* For the moment enable them all to avoid breaking things */
+#define BACNET_SVC_I_HAVE_A    1   /* Do we send I_Have requests? */
+#define BACNET_SVC_WP_A        1   /* Do we send WriteProperty requests? */
+#define BACNET_SVC_RP_A        1   /* Do we send ReadProperty requests? */
+#define BACNET_SVC_RPM_A       1   /* Do we send ReadPropertyMultiple requests? */
+#define BACNET_SVC_DCC_A       1   /* Do we send DeviceCommunicationControl requests? */
+#define BACNET_SVC_RD_A        1   /* Do we send ReinitialiseDevice requests? */
+#define BACNET_SVC_TS_A        1
+#define BACNET_SVC_SERVER      0   /* Are we a pure server type device? */
+#define BACNET_USE_OCTETSTRING 1   /* Do we need any octet strings? */
+#define BACNET_USE_DOUBLE      1   /* Do we need any doubles? */
+#define BACNET_USE_SIGNED      1   /* Do we need any signed integers */
+
+/* Do them one by one */
+#ifndef BACNET_SVC_I_HAVE_A     /* Do we send I_Have requests? */
+#define BACNET_SVC_I_HAVE_A 0
+#endif
+
+#ifndef BACNET_SVC_WP_A /* Do we send WriteProperty requests? */
+#define BACNET_SVC_WP_A 0
+#endif
+
+#ifndef BACNET_SVC_RP_A /* Do we send ReadProperty requests? */
+#define BACNET_SVC_RP_A 0
+#endif
+
+#ifndef BACNET_SVC_RPM_A        /* Do we send ReadPropertyMultiple requests? */
+#define BACNET_SVC_RPM_A 0
+#endif
+
+#ifndef BACNET_SVC_DCC_A        /* Do we send DeviceCommunicationControl requests? */
+#define BACNET_SVC_DCC_A 0
+#endif
+
+#ifndef BACNET_SVC_RD_A /* Do we send ReinitialiseDevice requests? */
+#define BACNET_SVC_RD_A 0
+#endif
+
+#ifndef BACNET_SVC_SERVER       /* Are we a pure server type device? */
+#define BACNET_SVC_SERVER 1
+#endif
+
+#ifndef BACNET_USE_OCTETSTRING  /* Do we need any octet strings? */
+#define BACNET_USE_OCTETSTRING 0
+#endif
+
+#ifndef BACNET_USE_DOUBLE       /* Do we need any doubles? */
+#define BACNET_USE_DOUBLE 0
+#endif
+
+#ifndef BACNET_USE_SIGNED       /* Do we need any signed integers */
+#define BACNET_USE_SIGNED 0
+#endif
+
+#endif  /* CONFIG_BACNET_FOR_BEREMIZ_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/device.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,1686 @@
+/**************************************************************************
+*
+* Copyright (C) 2005,2006,2009 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+
+/** Base "class" for handling all BACnet objects belonging
+ *  to a BACnet device, as well as Device-specific properties. */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <string.h>     /* for memmove */
+#include <time.h>       /* for timezone, localtime */
+
+#include "config_bacnet_for_beremiz_%(locstr)s.h"     /* the custom configuration for beremiz plugin */
+#include "bacdef.h"
+#include "bacdcode.h"
+#include "bacenum.h"
+#include "bacapp.h"
+#include "apdu.h"
+#include "wp.h" /* WriteProperty handling */
+#include "rp.h" /* ReadProperty handling */
+#include "dcc.h"        /* DeviceCommunicationControl handling */
+#include "version.h"
+#include "device_%(locstr)s.h"     /* me */
+#include "handlers.h"
+#include "datalink.h"
+#include "address.h"
+/* os specfic includes */
+#include "timer.h"
+/* include the device object */
+#include "device_%(locstr)s.h"
+#include "ai_%(locstr)s.h"
+#include "ao_%(locstr)s.h"
+#include "av_%(locstr)s.h"
+#include "bi_%(locstr)s.h"
+#include "bo_%(locstr)s.h"
+#include "bv_%(locstr)s.h"
+#include "msi_%(locstr)s.h"
+#include "mso_%(locstr)s.h"
+#include "msv_%(locstr)s.h"
+
+
+#if defined(__BORLANDC__) || defined(_WIN32)
+/* Not included in time.h as specified by The Open Group */
+/* Difference from UTC and local standard time */
+long int timezone;
+#endif
+
+/* local forward (semi-private) and external prototypes */
+int Device_Read_Property_Local(
+    BACNET_READ_PROPERTY_DATA * rpdata);
+bool Device_Write_Property_Local(
+    BACNET_WRITE_PROPERTY_DATA * wp_data);
+extern int Routed_Device_Read_Property_Local(
+    BACNET_READ_PROPERTY_DATA * rpdata);
+extern bool Routed_Device_Write_Property_Local(
+    BACNET_WRITE_PROPERTY_DATA * wp_data);
+
+/* may be overridden by outside table */
+static object_functions_t *Object_Table;
+
+static object_functions_t My_Object_Table[] = {
+    {OBJECT_DEVICE,
+            NULL /* Init - don't init Device or it will recurse! */ ,
+            Device_Count,
+            Device_Index_To_Instance,
+            Device_Valid_Object_Instance_Number,
+            Device_Object_Name,
+            Device_Read_Property_Local,
+            Device_Write_Property_Local,
+            Device_Property_Lists,
+            DeviceGetRRInfo,
+            NULL /* Iterator */ ,
+            NULL /* Value_Lists */ ,
+            NULL /* COV */ ,
+            NULL /* COV Clear */ ,
+            NULL /* Intrinsic Reporting */ },
+    {OBJECT_ANALOG_INPUT,
+            Analog_Input_Init,
+            Analog_Input_Count,
+            Analog_Input_Index_To_Instance,
+            Analog_Input_Valid_Instance,
+            Analog_Input_Object_Name,
+            Analog_Input_Read_Property,
+            Analog_Input_Write_Property,
+            Analog_Input_Property_Lists,
+            NULL /* ReadRangeInfo */ ,
+            NULL /* Iterator */ ,
+            NULL /* Value_Lists */ ,
+            NULL /* COV */ ,
+            NULL /* COV Clear */ ,
+            NULL /* Intrinsic Reporting */ },
+    {OBJECT_ANALOG_OUTPUT,
+            Analog_Output_Init,
+            Analog_Output_Count,
+            Analog_Output_Index_To_Instance,
+            Analog_Output_Valid_Instance,
+            Analog_Output_Object_Name,
+            Analog_Output_Read_Property,
+            Analog_Output_Write_Property,
+            Analog_Output_Property_Lists,
+            NULL /* ReadRangeInfo */ ,
+            NULL /* Iterator */ ,
+            NULL /* Value_Lists */ ,
+            NULL /* COV */ ,
+            NULL /* COV Clear */ ,
+            NULL /* Intrinsic Reporting */ },
+    {OBJECT_ANALOG_VALUE,
+            Analog_Value_Init,
+            Analog_Value_Count,
+            Analog_Value_Index_To_Instance,
+            Analog_Value_Valid_Instance,
+            Analog_Value_Object_Name,
+            Analog_Value_Read_Property,
+            Analog_Value_Write_Property,
+            Analog_Value_Property_Lists,
+            NULL /* ReadRangeInfo */ ,
+            NULL /* Iterator */ ,
+            NULL /* Value_Lists */ ,
+            NULL /* COV */ ,
+            NULL /* COV Clear */ ,
+            NULL /* Intrinsic Reporting */ },
+    {OBJECT_BINARY_INPUT,
+            Binary_Input_Init,
+            Binary_Input_Count,
+            Binary_Input_Index_To_Instance,
+            Binary_Input_Valid_Instance,
+            Binary_Input_Object_Name,
+            Binary_Input_Read_Property,
+            Binary_Input_Write_Property,
+            Binary_Input_Property_Lists,
+            NULL /* ReadRangeInfo */ ,
+            NULL /* Iterator */ ,
+            NULL /* Value_Lists */ ,
+            NULL /* COV */ ,
+            NULL /* COV Clear */ ,
+            NULL /* Intrinsic Reporting */ },
+    {OBJECT_BINARY_OUTPUT,
+            Binary_Output_Init,
+            Binary_Output_Count,
+            Binary_Output_Index_To_Instance,
+            Binary_Output_Valid_Instance,
+            Binary_Output_Object_Name,
+            Binary_Output_Read_Property,
+            Binary_Output_Write_Property,
+            Binary_Output_Property_Lists,
+            NULL /* ReadRangeInfo */ ,
+            NULL /* Iterator */ ,
+            NULL /* Value_Lists */ ,
+            NULL /* COV */ ,
+            NULL /* COV Clear */ ,
+            NULL /* Intrinsic Reporting */ },
+    {OBJECT_BINARY_VALUE,
+            Binary_Value_Init,
+            Binary_Value_Count,
+            Binary_Value_Index_To_Instance,
+            Binary_Value_Valid_Instance,
+            Binary_Value_Object_Name,
+            Binary_Value_Read_Property,
+            Binary_Value_Write_Property,
+            Binary_Value_Property_Lists,
+            NULL /* ReadRangeInfo */ ,
+            NULL /* Iterator */ ,
+            NULL /* Value_Lists */ ,
+            NULL /* COV */ ,
+            NULL /* COV Clear */ ,
+            NULL /* Intrinsic Reporting */ },
+    {OBJECT_MULTI_STATE_INPUT,
+            Multistate_Input_Init,
+            Multistate_Input_Count,
+            Multistate_Input_Index_To_Instance,
+            Multistate_Input_Valid_Instance,
+            Multistate_Input_Object_Name,
+            Multistate_Input_Read_Property,
+            Multistate_Input_Write_Property,
+            Multistate_Input_Property_Lists,
+            NULL /* ReadRangeInfo */ ,
+            NULL /* Iterator */ ,
+            NULL /* Value_Lists */ ,
+            NULL /* COV */ ,
+            NULL /* COV Clear */ ,
+            NULL /* Intrinsic Reporting */ },
+    {OBJECT_MULTI_STATE_OUTPUT,
+            Multistate_Output_Init,
+            Multistate_Output_Count,
+            Multistate_Output_Index_To_Instance,
+            Multistate_Output_Valid_Instance,
+            Multistate_Output_Object_Name,
+            Multistate_Output_Read_Property,
+            Multistate_Output_Write_Property,
+            Multistate_Output_Property_Lists,
+            NULL /* ReadRangeInfo */ ,
+            NULL /* Iterator */ ,
+            NULL /* Value_Lists */ ,
+            NULL /* COV */ ,
+            NULL /* COV Clear */ ,
+            NULL /* Intrinsic Reporting */ },
+    {OBJECT_MULTI_STATE_VALUE,
+            Multistate_Value_Init,
+            Multistate_Value_Count,
+            Multistate_Value_Index_To_Instance,
+            Multistate_Value_Valid_Instance,
+            Multistate_Value_Object_Name,
+            Multistate_Value_Read_Property,
+            Multistate_Value_Write_Property,
+            Multistate_Value_Property_Lists,
+            NULL /* ReadRangeInfo */ ,
+            NULL /* Iterator */ ,
+            NULL /* Value_Lists */ ,
+            NULL /* COV */ ,
+            NULL /* COV Clear */ ,
+            NULL /* Intrinsic Reporting */ },
+    {MAX_BACNET_OBJECT_TYPE,
+            NULL /* Init */ ,
+            NULL /* Count */ ,
+            NULL /* Index_To_Instance */ ,
+            NULL /* Valid_Instance */ ,
+            NULL /* Object_Name */ ,
+            NULL /* Read_Property */ ,
+            NULL /* Write_Property */ ,
+            NULL /* Property_Lists */ ,
+            NULL /* ReadRangeInfo */ ,
+            NULL /* Iterator */ ,
+            NULL /* Value_Lists */ ,
+            NULL /* COV */ ,
+            NULL /* COV Clear */ ,
+        NULL /* Intrinsic Reporting */ }
+};
+
+/** Glue function to let the Device object, when called by a handler,
+ * lookup which Object type needs to be invoked.
+ * param: Object_Type [in] The type of BACnet Object the handler wants to access.
+ * return: Pointer to the group of object helper functions that implement this
+ *         type of Object.
+ */
+static struct object_functions *Device_Objects_Find_Functions(
+    BACNET_OBJECT_TYPE Object_Type)
+{
+    struct object_functions *pObject = NULL;
+
+    pObject = Object_Table;
+    while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) {
+        /* handle each object type */
+        if (pObject->Object_Type == Object_Type) {
+            return (pObject);
+        }
+        pObject++;
+    }
+
+    return (NULL);
+}
+
+/** Try to find a rr_info_function helper function for the requested object type.
+ *
+ * param: object_type [in] The type of BACnet Object the handler wants to access.
+ * return: Pointer to the object helper function that implements the
+ *         ReadRangeInfo function, Object_RR_Info, for this type of Object on
+ *         success, else a NULL pointer if the type of Object isn't supported
+ *         or doesn't have a ReadRangeInfo function.
+ */
+rr_info_function Device_Objects_RR_Info(
+    BACNET_OBJECT_TYPE object_type)
+{
+    struct object_functions *pObject = NULL;
+
+    pObject = Device_Objects_Find_Functions(object_type);
+    return (pObject != NULL ? pObject->Object_RR_Info : NULL);
+}
+
+/** For a given object type, returns the special property list.
+ * This function is used for ReadPropertyMultiple calls which want
+ * just Required, just Optional, or All properties.
+ *
+ * param: object_type [in] The desired BACNET_OBJECT_TYPE whose properties
+ *            are to be listed.
+ * param: pPropertyList [out] Reference to the structure which will, on return,
+ *            list, separately, the Required, Optional, and Proprietary object
+ *            properties with their counts.
+ */
+void Device_Objects_Property_List(
+    BACNET_OBJECT_TYPE object_type,
+    struct special_property_list_t *pPropertyList)
+{
+    struct object_functions *pObject = NULL;
+
+    pPropertyList->Required.pList = NULL;
+    pPropertyList->Optional.pList = NULL;
+    pPropertyList->Proprietary.pList = NULL;
+
+    /* If we can find an entry for the required object type
+     * and there is an Object_List_RPM fn ptr then call it
+     * to populate the pointers to the individual list counters.
+     */
+
+    pObject = Device_Objects_Find_Functions(object_type);
+    if ((pObject != NULL) && (pObject->Object_RPM_List != NULL)) {
+        pObject->Object_RPM_List(&pPropertyList->Required.pList,
+            &pPropertyList->Optional.pList, &pPropertyList->Proprietary.pList);
+    }
+
+    /* Fetch the counts if available otherwise zero them */
+    pPropertyList->Required.count =
+        pPropertyList->Required.pList ==
+        NULL ? 0 : property_list_count(pPropertyList->Required.pList);
+
+    pPropertyList->Optional.count =
+        pPropertyList->Optional.pList ==
+        NULL ? 0 : property_list_count(pPropertyList->Optional.pList);
+
+    pPropertyList->Proprietary.count =
+        pPropertyList->Proprietary.pList ==
+        NULL ? 0 : property_list_count(pPropertyList->Proprietary.pList);
+
+    return;
+}
+
+/** Commands a Device re-initialization, to a given state.
+ * The request's password must match for the operation to succeed.
+ * This implementation provides a framework, but doesn't
+ * actually *DO* anything.
+ * @note You could use a mix of states and passwords to multiple outcomes.
+ * @note You probably want to restart *after* the simple ack has been sent
+ *       from the return handler, so just set a local flag here.
+ *
+ * param: rd_data [in,out] The information from the RD request.
+ *                         On failure, the error class and code will be set.
+ * return: True if succeeds (password is correct), else False.
+ */
+bool Device_Reinitialize(
+    BACNET_REINITIALIZE_DEVICE_DATA * rd_data)
+{
+    bool status = false;
+
+    if (characterstring_ansi_same(&rd_data->password, "Jesus")) {
+        switch (rd_data->state) {
+            case BACNET_REINIT_COLDSTART:
+            case BACNET_REINIT_WARMSTART:
+                dcc_set_status_duration(COMMUNICATION_ENABLE, 0);
+                break;
+            case BACNET_REINIT_STARTBACKUP:
+                break;
+            case BACNET_REINIT_ENDBACKUP:
+                break;
+            case BACNET_REINIT_STARTRESTORE:
+                break;
+            case BACNET_REINIT_ENDRESTORE:
+                break;
+            case BACNET_REINIT_ABORTRESTORE:
+                break;
+            default:
+                break;
+        }
+        /* Note: you could use a mix of state
+           and password to multiple things */
+        /* note: you probably want to restart *after* the
+           simple ack has been sent from the return handler
+           so just set a flag from here */
+        status = true;
+    } else {
+        rd_data->error_class = ERROR_CLASS_SECURITY;
+        rd_data->error_code = ERROR_CODE_PASSWORD_FAILURE;
+    }
+
+    return status;
+}
+
+/* These three arrays are used by the ReadPropertyMultiple handler,
+ * as well as to initialize the XXX_Property_List used by the 
+ * Property List (PROP_PROPERTY_LIST) property.
+ */
+static const int Device_Properties_Required[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                                           /*(1)(2)      */
+    PROP_OBJECT_IDENTIFIER,                /* W  R ( 75) */
+    PROP_OBJECT_NAME,                      /* W  R ( 77) */
+    PROP_OBJECT_TYPE,                      /* R  R ( 79) */
+    PROP_SYSTEM_STATUS,                    /* R  R (112) */
+    PROP_VENDOR_NAME,                      /* R  R (121) */
+    PROP_VENDOR_IDENTIFIER,                /* R  R (120) */
+    PROP_MODEL_NAME,                       /* W  R ( 70) */
+    PROP_FIRMWARE_REVISION,                /* R  R ( 44) */
+    PROP_APPLICATION_SOFTWARE_VERSION,     /* R  R ( 12) */
+    PROP_PROTOCOL_VERSION,                 /* R  R ( 98) */
+    PROP_PROTOCOL_REVISION,                /* R  R (139) */
+    PROP_PROTOCOL_SERVICES_SUPPORTED,      /* R  R ( 97) */
+    PROP_PROTOCOL_OBJECT_TYPES_SUPPORTED,  /* R  R ( 96) */
+    PROP_OBJECT_LIST,                      /* R  R ( 76) */
+    PROP_MAX_APDU_LENGTH_ACCEPTED,         /* R  R ( 62) */
+    PROP_SEGMENTATION_SUPPORTED,           /* R  R (107) */
+    PROP_APDU_TIMEOUT,                     /* W  R ( 11) */
+    PROP_NUMBER_OF_APDU_RETRIES,           /* W  R ( 73) */
+    PROP_DEVICE_ADDRESS_BINDING,           /* R  R ( 30) */
+    PROP_DATABASE_REVISION,                /* R  R (155) */
+//  PROP_PROPERTY_LIST,                    /* R  R (371) */
+    -1
+};
+
+static const int Device_Properties_Optional[] = {
+    PROP_DESCRIPTION,                      /* W  O ( 28) */
+    PROP_LOCAL_TIME,                       /* R  O ( 57) */
+    PROP_UTC_OFFSET,                       /* R  O (119) */
+    PROP_LOCAL_DATE,                       /* R  O ( 56) */
+    PROP_DAYLIGHT_SAVINGS_STATUS,          /* R  O ( 24) */
+    PROP_LOCATION,                         /* W  O ( 58) */
+    -1
+};
+
+static const int Device_Properties_Proprietary[] = {
+    -1
+};
+
+/* This array stores the PROPERTY_LIST which may be read by clients.
+ * End of list is marked by following the last element with the value '-1'
+ * 
+ * It is initialized by Binary_Value_Init() based off the values
+ * stored in Binary_Value_Properties_Required 
+ *           Binary_Value_Properties_Optional
+ *           Binary_Value_Properties_Proprietary
+ */
+/* TODO: Allocate memory for this array with malloc() at startup */
+static int Device_Properties_List[64];
+
+
+void Device_Property_Lists(
+    const int **pRequired,
+    const int **pOptional,
+    const int **pProprietary)
+{
+    if (pRequired)
+        *pRequired = Device_Properties_Required;
+    if (pOptional)
+        *pOptional = Device_Properties_Optional;
+    if (pProprietary)
+        *pProprietary = Device_Properties_Proprietary;
+
+    return;
+}
+
+
+static BACNET_DEVICE_STATUS System_Status = STATUS_OPERATIONAL;
+
+static BACNET_CHARACTER_STRING My_Object_Name;
+static uint32_t Object_Instance_Number                             = 260001;
+static uint16_t Vendor_Identifier                                  = BACNET_VENDOR_ID;
+static char    *Vendor_Name                                        = BACNET_VENDOR_NAME;
+static char    *Firmware_Revision                                  = BACNET_FIRMWARE_REVISION;
+static char     Model_Name                  [MAX_DEV_MOD_LEN  + 1] = BACNET_DEVICE_MODEL_NAME;
+static char     Application_Software_Version[MAX_DEV_VER_LEN  + 1] = BACNET_DEVICE_APPSOFT_VER;
+static char     Location                    [MAX_DEV_LOC_LEN  + 1] = BACNET_DEVICE_LOCATION;
+static char     Description                 [MAX_DEV_DESC_LEN + 1] = BACNET_DEVICE_DESCRIPTION;
+/* static uint8_t Protocol_Version = 1; - constant, not settable */
+/* static uint8_t Protocol_Revision = 4; - constant, not settable */
+/* Protocol_Services_Supported - dynamically generated */
+/* Protocol_Object_Types_Supported - in RP encoding */
+/* Object_List - dynamically generated */
+/* static BACNET_SEGMENTATION Segmentation_Supported = SEGMENTATION_NONE; */
+/* static uint8_t Max_Segments_Accepted = 0; */
+/* VT_Classes_Supported */
+/* Active_VT_Sessions */
+static BACNET_TIME Local_Time;  /* rely on OS, if there is one */
+static BACNET_DATE Local_Date;  /* rely on OS, if there is one */
+/* NOTE: BACnet UTC Offset is inverse of common practice.
+   If your UTC offset is -5hours of GMT,
+   then BACnet UTC offset is +5hours.
+   BACnet UTC offset is expressed in minutes. */
+static int32_t UTC_Offset = 5 * 60;
+static bool Daylight_Savings_Status = false;    /* rely on OS */
+/* List_Of_Session_Keys */
+/* Time_Synchronization_Recipients */
+/* Max_Master - rely on MS/TP subsystem, if there is one */
+/* Max_Info_Frames - rely on MS/TP subsystem, if there is one */
+/* Device_Address_Binding - required, but relies on binding cache */
+static uint32_t Database_Revision = 0;
+/* Configuration_Files */
+/* Last_Restore_Time */
+/* Backup_Failure_Timeout */
+/* Active_COV_Subscriptions */
+/* Slave_Proxy_Enable */
+/* Manual_Slave_Address_Binding */
+/* Auto_Slave_Discovery */
+/* Slave_Address_Binding */
+/* Profile_Name */
+
+unsigned Device_Count(
+    void)
+{
+    return 1;
+}
+
+uint32_t Device_Index_To_Instance(
+    unsigned index)
+{
+    index = index;
+    return Object_Instance_Number;
+}
+
+/* methods to manipulate the data */
+
+/** Return the Object Instance number for our (single) Device Object.
+ * This is a key function, widely invoked by the handler code, since
+ * it provides "our" (ie, local) address.
+ * return: The Instance number used in the BACNET_OBJECT_ID for the Device.
+ */
+uint32_t Device_Object_Instance_Number(
+    void)
+{
+    return Object_Instance_Number;
+}
+
+bool Device_Set_Object_Instance_Number(
+    uint32_t object_id)
+{
+    bool status = true; /* return value */
+
+    if (object_id <= BACNET_MAX_INSTANCE) {
+        /* Make the change and update the database revision */
+        Object_Instance_Number = object_id;
+        Device_Inc_Database_Revision();
+    } else
+        status = false;
+
+    return status;
+}
+
+bool Device_Valid_Object_Instance_Number(
+    uint32_t object_id)
+{
+    return (Object_Instance_Number == object_id);
+}
+
+bool Device_Object_Name(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool status = false;
+
+    if (object_instance == Object_Instance_Number) {
+        status = characterstring_copy(object_name, &My_Object_Name);
+    }
+
+    return status;
+}
+
+bool Device_Set_Object_Name(
+    BACNET_CHARACTER_STRING * object_name)
+{
+    bool status = false;        /*return value */
+
+    if (!characterstring_same(&My_Object_Name, object_name)) {
+        /* Make the change and update the database revision */
+        status = characterstring_copy(&My_Object_Name, object_name);
+        Device_Inc_Database_Revision();
+    }
+
+    return status;
+}
+
+BACNET_DEVICE_STATUS Device_System_Status(
+    void)
+{
+    return System_Status;
+}
+
+int Device_Set_System_Status(
+    BACNET_DEVICE_STATUS status,
+    bool local)
+{
+    int result = 0;     /*return value - 0 = ok, -1 = bad value, -2 = not allowed */
+
+    /* We limit the options available depending on whether the source is
+     * internal or external. */
+    if (local) {
+        switch (status) {
+            case STATUS_OPERATIONAL:
+            case STATUS_OPERATIONAL_READ_ONLY:
+            case STATUS_DOWNLOAD_REQUIRED:
+            case STATUS_DOWNLOAD_IN_PROGRESS:
+            case STATUS_NON_OPERATIONAL:
+                System_Status = status;
+                break;
+
+                /* Don't support backup at present so don't allow setting */
+            case STATUS_BACKUP_IN_PROGRESS:
+                result = -2;
+                break;
+
+            default:
+                result = -1;
+                break;
+        }
+    } else {
+        switch (status) {
+                /* Allow these for the moment as a way to easily alter
+                 * overall device operation. The lack of password protection
+                 * or other authentication makes allowing writes to this
+                 * property a risky facility to provide.
+                 */
+            case STATUS_OPERATIONAL:
+            case STATUS_OPERATIONAL_READ_ONLY:
+            case STATUS_NON_OPERATIONAL:
+                System_Status = status;
+                break;
+
+                /* Don't allow outsider set this - it should probably
+                 * be set if the device config is incomplete or
+                 * corrupted or perhaps after some sort of operator
+                 * wipe operation.
+                 */
+            case STATUS_DOWNLOAD_REQUIRED:
+                /* Don't allow outsider set this - it should be set
+                 * internally at the start of a multi packet download
+                 * perhaps indirectly via PT or WF to a config file.
+                 */
+            case STATUS_DOWNLOAD_IN_PROGRESS:
+                /* Don't support backup at present so don't allow setting */
+            case STATUS_BACKUP_IN_PROGRESS:
+                result = -2;
+                break;
+
+            default:
+                result = -1;
+                break;
+        }
+    }
+
+    return (result);
+}
+
+const char *Device_Vendor_Name(
+    void)
+{
+    return Vendor_Name;
+}
+
+/** Returns the Vendor ID for this Device.
+ * See the assignments at http://www.bacnet.org/VendorID/BACnet%%20Vendor%%20IDs.htm
+ * return: The Vendor ID of this Device.
+ */
+uint16_t Device_Vendor_Identifier(
+    void)
+{
+    return Vendor_Identifier;
+}
+
+void Device_Set_Vendor_Identifier(
+    uint16_t vendor_id)
+{
+    Vendor_Identifier = vendor_id;
+}
+
+const char *Device_Model_Name(
+    void)
+{
+    return Model_Name;
+}
+
+bool Device_Set_Model_Name(
+    const char *name,
+    size_t length)
+{
+    bool status = false;        /*return value */
+
+    if (length < sizeof(Model_Name)) {
+        memmove(Model_Name, name, length);
+        Model_Name[length] = 0;
+        status = true;
+    }
+
+    return status;
+}
+
+const char *Device_Firmware_Revision(
+    void)
+{
+     return Firmware_Revision;
+}
+
+const char *Device_Application_Software_Version(
+    void)
+{
+    return Application_Software_Version;
+}
+
+bool Device_Set_Application_Software_Version(
+    const char *name,
+    size_t length)
+{
+    bool status = false;        /*return value */
+
+    if (length < sizeof(Application_Software_Version)) {
+        memmove(Application_Software_Version, name, length);
+        Application_Software_Version[length] = 0;
+        status = true;
+    }
+
+    return status;
+}
+
+const char *Device_Description(
+    void)
+{
+    return Description;
+}
+
+bool Device_Set_Description(
+    const char *name,
+    size_t length)
+{
+    bool status = false;        /*return value */
+
+    if (length < sizeof(Description)) {
+        memmove(Description, name, length);
+        Description[length] = 0;
+        status = true;
+    }
+
+    return status;
+}
+
+const char *Device_Location(
+    void)
+{
+    return Location;
+}
+
+bool Device_Set_Location(
+    const char *name,
+    size_t length)
+{
+    bool status = false;        /*return value */
+
+    if (length < sizeof(Location)) {
+        memmove(Location, name, length);
+        Location[length] = 0;
+        status = true;
+    }
+
+    return status;
+}
+
+uint8_t Device_Protocol_Version(
+    void)
+{
+    return BACNET_PROTOCOL_VERSION;
+}
+
+uint8_t Device_Protocol_Revision(
+    void)
+{
+    return BACNET_PROTOCOL_REVISION;
+}
+
+BACNET_SEGMENTATION Device_Segmentation_Supported(
+    void)
+{
+    return SEGMENTATION_NONE;
+}
+
+uint32_t Device_Database_Revision(
+    void)
+{
+    return Database_Revision;
+}
+
+void Device_Set_Database_Revision(
+    uint32_t revision)
+{
+    Database_Revision = revision;
+}
+
+/*
+ * Shortcut for incrementing database revision as this is potentially
+ * the most common operation if changing object names and ids is
+ * implemented.
+ */
+void Device_Inc_Database_Revision(
+    void)
+{
+    Database_Revision++;
+}
+
+/** Get the total count of objects supported by this Device Object.
+ * @note Since many network clients depend on the object list
+ *       for discovery, it must be consistent!
+ * return: The count of objects, for all supported Object types.
+ */
+unsigned Device_Object_List_Count(
+    void)
+{
+    unsigned count = 0; /* number of objects */
+    struct object_functions *pObject = NULL;
+
+    /* initialize the default return values */
+    pObject = Object_Table;
+    while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) {
+        if (pObject->Object_Count) {
+            count += pObject->Object_Count();
+        }
+        pObject++;
+    }
+
+    return count;
+}
+
+/** Lookup the Object at the given array index in the Device's Object List.
+ * Even though we don't keep a single linear array of objects in the Device,
+ * this method acts as though we do and works through a virtual, concatenated
+ * array of all of our object type arrays.
+ *
+ * param: array_index [in] The desired array index (1 to N)
+ * param: object_type [out] The object's type, if found.
+ * param: instance [out] The object's instance number, if found.
+ * return: True if found, else false.
+ */
+bool Device_Object_List_Identifier(
+    unsigned array_index,
+    int *object_type,
+    uint32_t * instance)
+{
+    bool status = false;
+    unsigned count = 0;
+    unsigned object_index = 0;
+    unsigned temp_index = 0;
+    struct object_functions *pObject = NULL;
+
+    /* array index zero is length - so invalid */
+    if (array_index == 0) {
+        return status;
+    }
+    object_index = array_index - 1;
+    /* initialize the default return values */
+    pObject = Object_Table;
+    while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) {
+        if (pObject->Object_Count) {
+            object_index -= count;
+            count = pObject->Object_Count();
+            if (object_index < count) {
+                /* Use the iterator function if available otherwise
+                 * look for the index to instance to get the ID */
+                if (pObject->Object_Iterator) {
+                    /* First find the first object */
+                    temp_index = pObject->Object_Iterator(~(unsigned) 0);
+                    /* Then step through the objects to find the nth */
+                    while (object_index != 0) {
+                        temp_index = pObject->Object_Iterator(temp_index);
+                        object_index--;
+                    }
+                    /* set the object_index up before falling through to next bit */
+                    object_index = temp_index;
+                }
+                if (pObject->Object_Index_To_Instance) {
+                    *object_type = pObject->Object_Type;
+                    *instance =
+                        pObject->Object_Index_To_Instance(object_index);
+                    status = true;
+                    break;
+                }
+            }
+        }
+        pObject++;
+    }
+
+    return status;
+}
+
+/** Determine if we have an object with the given object_name.
+ * If the object_type and object_instance pointers are not null,
+ * and the lookup succeeds, they will be given the resulting values.
+ * param: object_name [in] The desired Object Name to look for.
+ * param: object_type [out] The BACNET_OBJECT_TYPE of the matching Object.
+ * param: object_instance [out] The object instance number of the matching Object.
+ * return: True on success or else False if not found.
+ */
+bool Device_Valid_Object_Name(
+    BACNET_CHARACTER_STRING * object_name1,
+    int *object_type,
+    uint32_t * object_instance)
+{
+    bool found = false;
+    int type = 0;
+    uint32_t instance;
+    unsigned max_objects = 0, i = 0;
+    bool check_id = false;
+    BACNET_CHARACTER_STRING object_name2;
+    struct object_functions *pObject = NULL;
+
+    max_objects = Device_Object_List_Count();
+    for (i = 1; i <= max_objects; i++) {
+        check_id = Device_Object_List_Identifier(i, &type, &instance);
+        if (check_id) {
+            pObject = Device_Objects_Find_Functions(type);
+            if ((pObject != NULL) && (pObject->Object_Name != NULL) &&
+                (pObject->Object_Name(instance, &object_name2) &&
+                    characterstring_same(object_name1, &object_name2))) {
+                found = true;
+                if (object_type) {
+                    *object_type = type;
+                }
+                if (object_instance) {
+                    *object_instance = instance;
+                }
+                break;
+            }
+        }
+    }
+
+    return found;
+}
+
+/** Determine if we have an object of this type and instance number.
+ * param: object_type [in] The desired BACNET_OBJECT_TYPE
+ * param: object_instance [in] The object instance number to be looked up.
+ * return: True if found, else False if no such Object in this device.
+ */
+bool Device_Valid_Object_Id(
+    int object_type,
+    uint32_t object_instance)
+{
+    bool status = false;        /* return value */
+    struct object_functions *pObject = NULL;
+
+    pObject = Device_Objects_Find_Functions(object_type);
+    if ((pObject != NULL) && (pObject->Object_Valid_Instance != NULL)) {
+        status = pObject->Object_Valid_Instance(object_instance);
+    }
+
+    return status;
+}
+
+/** Copy a child object's object_name value, given its ID.
+ * param: object_type [in] The BACNET_OBJECT_TYPE of the child Object.
+ * param: object_instance [in] The object instance number of the child Object.
+ * param: object_name [out] The Object Name found for this child Object.
+ * return: True on success or else False if not found.
+ */
+bool Device_Object_Name_Copy(
+    BACNET_OBJECT_TYPE object_type,
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    struct object_functions *pObject = NULL;
+    bool found = false;
+
+    pObject = Device_Objects_Find_Functions(object_type);
+    if ((pObject != NULL) && (pObject->Object_Name != NULL)) {
+        found = pObject->Object_Name(object_instance, object_name);
+    }
+
+    return found;
+}
+
+static void Device_Update_Current_Time(
+    void)
+{
+    struct tm *tblock = NULL;
+#if defined(_MSC_VER)
+    time_t tTemp;
+#else
+    struct timeval tv;
+#endif
+/*
+struct tm
+
+int    tm_sec   Seconds [0,60].
+int    tm_min   Minutes [0,59].
+int    tm_hour  Hour [0,23].
+int    tm_mday  Day of month [1,31].
+int    tm_mon   Month of year [0,11].
+int    tm_year  Years since 1900.
+int    tm_wday  Day of week [0,6] (Sunday =0).
+int    tm_yday  Day of year [0,365].
+int    tm_isdst Daylight Savings flag.
+*/
+#if defined(_MSC_VER)
+    time(&tTemp);
+    tblock = localtime(&tTemp);
+#else
+    if (gettimeofday(&tv, NULL) == 0) {
+        tblock = localtime(&tv.tv_sec);
+    }
+#endif
+
+    if (tblock) {
+        datetime_set_date(&Local_Date, (uint16_t) tblock->tm_year + 1900,
+            (uint8_t) tblock->tm_mon + 1, (uint8_t) tblock->tm_mday);
+#if !defined(_MSC_VER)
+        datetime_set_time(&Local_Time, (uint8_t) tblock->tm_hour,
+            (uint8_t) tblock->tm_min, (uint8_t) tblock->tm_sec,
+            (uint8_t) (tv.tv_usec / 10000));
+#else
+        datetime_set_time(&Local_Time, (uint8_t) tblock->tm_hour,
+            (uint8_t) tblock->tm_min, (uint8_t) tblock->tm_sec, 0);
+#endif
+        if (tblock->tm_isdst) {
+            Daylight_Savings_Status = true;
+        } else {
+            Daylight_Savings_Status = false;
+        }
+        /* note: timezone is declared in <time.h> stdlib. */
+        UTC_Offset = timezone / 60;
+    } else {
+        datetime_date_wildcard_set(&Local_Date);
+        datetime_time_wildcard_set(&Local_Time);
+        Daylight_Savings_Status = false;
+    }
+}
+
+void Device_getCurrentDateTime(
+    BACNET_DATE_TIME * DateTime)
+{
+    Device_Update_Current_Time();
+
+    DateTime->date = Local_Date;
+    DateTime->time = Local_Time;
+}
+
+int32_t Device_UTC_Offset(void)
+{
+    Device_Update_Current_Time();
+
+    return UTC_Offset;
+}
+
+bool Device_Daylight_Savings_Status(void)
+{
+    return Daylight_Savings_Status;
+}
+
+/* return the length of the apdu encoded or BACNET_STATUS_ERROR for error or
+   BACNET_STATUS_ABORT for abort message */
+int Device_Read_Property_Local(
+    BACNET_READ_PROPERTY_DATA * rpdata)
+{
+    int apdu_len = 0;   /* return value */
+    int len = 0;        /* apdu len intermediate value */
+    BACNET_BIT_STRING bit_string = { 0 };
+    BACNET_CHARACTER_STRING char_string = { 0 };
+    unsigned i = 0;
+    int object_type = 0;
+    uint32_t instance = 0;
+    unsigned count = 0;
+    uint8_t *apdu = NULL;
+    struct object_functions *pObject = NULL;
+    bool found = false;
+
+    if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
+        (rpdata->application_data_len == 0)) {
+        return 0;
+    }
+    apdu = rpdata->application_data;
+    switch (rpdata->object_property) {
+        case PROP_OBJECT_IDENTIFIER:
+            apdu_len =
+                encode_application_object_id(&apdu[0], OBJECT_DEVICE,
+                Object_Instance_Number);
+            break;
+        case PROP_OBJECT_NAME:
+            apdu_len =
+                encode_application_character_string(&apdu[0], &My_Object_Name);
+            break;
+        case PROP_OBJECT_TYPE:
+            apdu_len = encode_application_enumerated(&apdu[0], OBJECT_DEVICE);
+            break;
+        case PROP_DESCRIPTION:
+            characterstring_init_ansi(&char_string, Description);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_SYSTEM_STATUS:
+            apdu_len = encode_application_enumerated(&apdu[0], System_Status);
+            break;
+        case PROP_VENDOR_NAME:
+            characterstring_init_ansi(&char_string, Vendor_Name);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_VENDOR_IDENTIFIER:
+            apdu_len =
+                encode_application_unsigned(&apdu[0], Vendor_Identifier);
+            break;
+        case PROP_MODEL_NAME:
+            characterstring_init_ansi(&char_string, Model_Name);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_FIRMWARE_REVISION:
+            characterstring_init_ansi(&char_string, Firmware_Revision);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_APPLICATION_SOFTWARE_VERSION:
+            characterstring_init_ansi(&char_string,
+                Application_Software_Version);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_LOCATION:
+            characterstring_init_ansi(&char_string, Location);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_LOCAL_TIME:
+            Device_Update_Current_Time();
+            apdu_len = encode_application_time(&apdu[0], &Local_Time);
+            break;
+        case PROP_UTC_OFFSET:
+            Device_Update_Current_Time();
+            apdu_len = encode_application_signed(&apdu[0], UTC_Offset);
+            break;
+        case PROP_LOCAL_DATE:
+            Device_Update_Current_Time();
+            apdu_len = encode_application_date(&apdu[0], &Local_Date);
+            break;
+        case PROP_DAYLIGHT_SAVINGS_STATUS:
+            Device_Update_Current_Time();
+            apdu_len =
+                encode_application_boolean(&apdu[0], Daylight_Savings_Status);
+            break;
+        case PROP_PROTOCOL_VERSION:
+            apdu_len =
+                encode_application_unsigned(&apdu[0],
+                Device_Protocol_Version());
+            break;
+        case PROP_PROTOCOL_REVISION:
+            apdu_len =
+                encode_application_unsigned(&apdu[0],
+                Device_Protocol_Revision());
+            break;
+        case PROP_PROTOCOL_SERVICES_SUPPORTED:
+            /* Note: list of services that are executed, not initiated. */
+            bitstring_init(&bit_string);
+            for (i = 0; i < MAX_BACNET_SERVICES_SUPPORTED; i++) {
+                /* automatic lookup based on handlers set */
+                bitstring_set_bit(&bit_string, (uint8_t) i,
+                    apdu_service_supported((BACNET_SERVICES_SUPPORTED) i));
+            }
+            apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
+            break;
+        case PROP_PROTOCOL_OBJECT_TYPES_SUPPORTED:
+            /* Note: this is the list of objects that can be in this device,
+               not a list of objects that this device can access */
+            bitstring_init(&bit_string);
+            for (i = 0; i < MAX_ASHRAE_OBJECT_TYPE; i++) {
+                /* initialize all the object types to not-supported */
+                bitstring_set_bit(&bit_string, (uint8_t) i, false);
+            }
+            /* set the object types with objects to supported */
+
+            pObject = Object_Table;
+            while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) {
+                if ((pObject->Object_Count) && (pObject->Object_Count() > 0)) {
+                    bitstring_set_bit(&bit_string, pObject->Object_Type, true);
+                }
+                pObject++;
+            }
+            apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
+            break;
+        case PROP_OBJECT_LIST:
+            count = Device_Object_List_Count();
+            /* Array element zero is the number of objects in the list */
+            if (rpdata->array_index == 0)
+                apdu_len = encode_application_unsigned(&apdu[0], count);
+            /* if no index was specified, then try to encode the entire list */
+            /* into one packet.  Note that more than likely you will have */
+            /* to return an error if the number of encoded objects exceeds */
+            /* your maximum APDU size. */
+            else if (rpdata->array_index == BACNET_ARRAY_ALL) {
+                for (i = 1; i <= count; i++) {
+                    found =
+                        Device_Object_List_Identifier(i, &object_type,
+                        &instance);
+                    if (found) {
+                        len =
+                            encode_application_object_id(&apdu[apdu_len],
+                            object_type, instance);
+                        apdu_len += len;
+                        /* assume next one is the same size as this one */
+                        /* can we all fit into the APDU? Don't check for last entry */
+                        if ((i != count) && (apdu_len + len) >= MAX_APDU) {
+                            /* Abort response */
+                            rpdata->error_code =
+                                ERROR_CODE_ABORT_SEGMENTATION_NOT_SUPPORTED;
+                            apdu_len = BACNET_STATUS_ABORT;
+                            break;
+                        }
+                    } else {
+                        /* error: internal error? */
+                        rpdata->error_class = ERROR_CLASS_SERVICES;
+                        rpdata->error_code = ERROR_CODE_OTHER;
+                        apdu_len = BACNET_STATUS_ERROR;
+                        break;
+                    }
+                }
+            } else {
+                found =
+                    Device_Object_List_Identifier(rpdata->array_index,
+                    &object_type, &instance);
+                if (found) {
+                    apdu_len =
+                        encode_application_object_id(&apdu[0], object_type,
+                        instance);
+                } else {
+                    rpdata->error_class = ERROR_CLASS_PROPERTY;
+                    rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX;
+                    apdu_len = BACNET_STATUS_ERROR;
+                }
+            }
+            break;
+        case PROP_MAX_APDU_LENGTH_ACCEPTED:
+            apdu_len = encode_application_unsigned(&apdu[0], MAX_APDU);
+            break;
+        case PROP_SEGMENTATION_SUPPORTED:
+            apdu_len =
+                encode_application_enumerated(&apdu[0],
+                Device_Segmentation_Supported());
+            break;
+        case PROP_APDU_TIMEOUT:
+            apdu_len = encode_application_unsigned(&apdu[0], apdu_timeout());
+            break;
+        case PROP_NUMBER_OF_APDU_RETRIES:
+            apdu_len = encode_application_unsigned(&apdu[0], apdu_retries());
+            break;
+        case PROP_DEVICE_ADDRESS_BINDING:
+            /* FIXME: the real max apdu remaining should be passed into function */
+            apdu_len = address_list_encode(&apdu[0], MAX_APDU);
+            break;
+        case PROP_DATABASE_REVISION:
+            apdu_len =
+                encode_application_unsigned(&apdu[0], Database_Revision);
+            break;
+//      case PROP_PROPERTY_LIST:
+//          BACnet_encode_array(Device_Properties_List,
+//                              property_list_count(Device_Properties_List),
+//                              retfalse, encode_application_enumerated);
+//          break;
+        default:
+            rpdata->error_class = ERROR_CLASS_PROPERTY;
+            rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            apdu_len = BACNET_STATUS_ERROR;
+            break;
+    }
+    /*  only array properties can have array options */
+    if ((apdu_len >= 0) && (rpdata->object_property != PROP_OBJECT_LIST) &&
+//      (rpdata->object_property != PROP_PROPERTY_LIST) &&
+        (rpdata->array_index != BACNET_ARRAY_ALL)) {
+        rpdata->error_class = ERROR_CLASS_PROPERTY;
+        rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        apdu_len = BACNET_STATUS_ERROR;
+    }
+
+    return apdu_len;
+}
+
+/** Looks up the requested Object and Property, and encodes its Value in an APDU.
+ * If the Object or Property can't be found, sets the error class and code.
+ *
+ * param: rpdata [in,out] Structure with the desired Object and Property info
+ *                 on entry, and APDU message on return.
+ * return: The length of the APDU on success, else BACNET_STATUS_ERROR
+ */
+int Device_Read_Property(
+    BACNET_READ_PROPERTY_DATA * rpdata)
+{
+    int apdu_len = BACNET_STATUS_ERROR;
+    struct object_functions *pObject = NULL;
+
+    /* initialize the default return values */
+    rpdata->error_class = ERROR_CLASS_OBJECT;
+    rpdata->error_code = ERROR_CODE_UNKNOWN_OBJECT;
+    pObject = Device_Objects_Find_Functions(rpdata->object_type);
+    if (pObject != NULL) {
+        if (pObject->Object_Valid_Instance &&
+            pObject->Object_Valid_Instance(rpdata->object_instance)) {
+            if (pObject->Object_Read_Property) {
+                apdu_len = pObject->Object_Read_Property(rpdata);
+            }
+        }
+    }
+
+    return apdu_len;
+}
+
+/* returns true if successful */
+bool Device_Write_Property_Local(
+    BACNET_WRITE_PROPERTY_DATA * wp_data)
+{
+    bool status = false;        /* return value */
+    int len = 0;
+    BACNET_APPLICATION_DATA_VALUE value;
+    int object_type = 0;
+    uint32_t object_instance = 0;
+    int temp;
+
+    /* decode the some of the request */
+    len =
+        bacapp_decode_application_data(wp_data->application_data,
+        wp_data->application_data_len, &value);
+    if (len < 0) {
+        /* error while decoding - a value larger than we can handle */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+        return false;
+    }
+    if ((wp_data->object_property != PROP_OBJECT_LIST) &&
+        (wp_data->array_index != BACNET_ARRAY_ALL)) {
+        /*  only array properties can have array options */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        return false;
+    }
+    /* FIXME: len < application_data_len: more data? */
+    switch (wp_data->object_property) {
+        case PROP_OBJECT_IDENTIFIER:
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_OBJECT_ID,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                if ((value.type.Object_Id.type == OBJECT_DEVICE) &&
+                    (Device_Set_Object_Instance_Number(value.type.
+                            Object_Id.instance))) {
+                    /* FIXME: we could send an I-Am broadcast to let the world know */
+                } else {
+                    status = false;
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                }
+            }
+            break;
+        case PROP_NUMBER_OF_APDU_RETRIES:
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                /* FIXME: bounds check? */
+                apdu_retries_set((uint8_t) value.type.Unsigned_Int);
+            }
+            break;
+        case PROP_APDU_TIMEOUT:
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                /* FIXME: bounds check? */
+                apdu_timeout_set((uint16_t) value.type.Unsigned_Int);
+            }
+            break;
+//         case PROP_VENDOR_IDENTIFIER:
+//             status =
+//                 WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
+//                 &wp_data->error_class, &wp_data->error_code);
+//             if (status) {
+//                 /* FIXME: bounds check? */
+//                 Device_Set_Vendor_Identifier((uint16_t) value.
+//                     type.Unsigned_Int);
+//             }
+//             break;
+//       case PROP_SYSTEM_STATUS:
+//           status =
+//               WPValidateArgType(&value, BACNET_APPLICATION_TAG_ENUMERATED,
+//               &wp_data->error_class, &wp_data->error_code);
+//           if (status) {
+//               temp = Device_Set_System_Status((BACNET_DEVICE_STATUS)
+//                   value.type.Enumerated, false);
+//               if (temp != 0) {
+//                   status = false;
+//                   wp_data->error_class = ERROR_CLASS_PROPERTY;
+//                   if (temp == -1) {
+//                       wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+//                   } else {
+//                       wp_data->error_code =
+//                           ERROR_CODE_OPTIONAL_FUNCTIONALITY_NOT_SUPPORTED;
+//                   }
+//               }
+//           }
+//           break;
+        case PROP_OBJECT_NAME:
+            status =
+                WPValidateString(&value,
+                characterstring_capacity(&My_Object_Name), false,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                /* All the object names in a device must be unique */
+                if (Device_Valid_Object_Name(&value.type.Character_String,
+                        &object_type, &object_instance)) {
+                    if ((object_type == wp_data->object_type) &&
+                        (object_instance == wp_data->object_instance)) {
+                        /* writing same name to same object */
+                        status = true;
+                    } else {
+                        status = false;
+                        wp_data->error_class = ERROR_CLASS_PROPERTY;
+                        wp_data->error_code = ERROR_CODE_DUPLICATE_NAME;
+                    }
+                } else {
+                    Device_Set_Object_Name(&value.type.Character_String);
+                }
+            }
+            break;
+        case PROP_LOCATION:
+            status =
+                WPValidateString(&value, MAX_DEV_LOC_LEN, true,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                Device_Set_Location(characterstring_value(&value.
+                        type.Character_String),
+                    characterstring_length(&value.type.Character_String));
+            }
+            break;
+
+        case PROP_DESCRIPTION:
+            status =
+                WPValidateString(&value, MAX_DEV_DESC_LEN, true,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                Device_Set_Description(characterstring_value(&value.
+                        type.Character_String),
+                    characterstring_length(&value.type.Character_String));
+            }
+            break;
+        case PROP_MODEL_NAME:
+            status =
+                WPValidateString(&value, MAX_DEV_MOD_LEN, true,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                Device_Set_Model_Name(characterstring_value(&value.
+                        type.Character_String),
+                    characterstring_length(&value.type.Character_String));
+            }
+            break;
+
+        case PROP_OBJECT_TYPE:
+        case PROP_SYSTEM_STATUS:
+        case PROP_VENDOR_NAME:
+        case PROP_VENDOR_IDENTIFIER:
+        case PROP_FIRMWARE_REVISION:
+        case PROP_APPLICATION_SOFTWARE_VERSION:
+        case PROP_LOCAL_TIME:
+        case PROP_UTC_OFFSET:
+        case PROP_LOCAL_DATE:
+        case PROP_DAYLIGHT_SAVINGS_STATUS:
+        case PROP_PROTOCOL_VERSION:
+        case PROP_PROTOCOL_REVISION:
+        case PROP_PROTOCOL_SERVICES_SUPPORTED:
+        case PROP_PROTOCOL_OBJECT_TYPES_SUPPORTED:
+        case PROP_OBJECT_LIST:
+        case PROP_MAX_APDU_LENGTH_ACCEPTED:
+        case PROP_SEGMENTATION_SUPPORTED:
+        case PROP_DEVICE_ADDRESS_BINDING:
+        case PROP_DATABASE_REVISION:
+//      case PROP_PROPERTY_LIST:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+            break;
+        default:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            break;
+    }
+
+    return status;
+}
+
+/** Looks up the requested Object and Property, and set the new Value in it,
+ *  if allowed.
+ * If the Object or Property can't be found, sets the error class and code.
+ *
+ * param: wp_data [in,out] Structure with the desired Object and Property info
+ *              and new Value on entry, and APDU message on return.
+ * return: True on success, else False if there is an error.
+ */
+bool Device_Write_Property(
+    BACNET_WRITE_PROPERTY_DATA * wp_data)
+{
+    bool status = false;        /* Ever the pessamist! */
+    struct object_functions *pObject = NULL;
+
+    /* initialize the default return values */
+    wp_data->error_class = ERROR_CLASS_OBJECT;
+    wp_data->error_code = ERROR_CODE_UNKNOWN_OBJECT;
+    pObject = Device_Objects_Find_Functions(wp_data->object_type);
+    if (pObject != NULL) {
+        if (pObject->Object_Valid_Instance &&
+            pObject->Object_Valid_Instance(wp_data->object_instance)) {
+            if (pObject->Object_Write_Property) {
+                status = pObject->Object_Write_Property(wp_data);
+            } else {
+                wp_data->error_class = ERROR_CLASS_PROPERTY;
+                wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+            }
+        } else {
+            wp_data->error_class = ERROR_CLASS_OBJECT;
+            wp_data->error_code = ERROR_CODE_UNKNOWN_OBJECT;
+        }
+    } else {
+        wp_data->error_class = ERROR_CLASS_OBJECT;
+        wp_data->error_code = ERROR_CODE_UNKNOWN_OBJECT;
+    }
+
+    return (status);
+}
+
+/** Looks up the requested Object, and fills the Property Value list.
+ * If the Object or Property can't be found, returns false.
+ * param: [in] The object type to be looked up.
+ * param: [in] The object instance number to be looked up.
+ * param: [out] The value list
+ * return: True if the object instance supports this feature and value changed.
+ */
+bool Device_Encode_Value_List(
+    BACNET_OBJECT_TYPE object_type,
+    uint32_t object_instance,
+    BACNET_PROPERTY_VALUE * value_list)
+{
+    bool status = false;        /* Ever the pessamist! */
+    struct object_functions *pObject = NULL;
+
+    pObject = Device_Objects_Find_Functions(object_type);
+    if (pObject != NULL) {
+        if (pObject->Object_Valid_Instance &&
+            pObject->Object_Valid_Instance(object_instance)) {
+            if (pObject->Object_Value_List) {
+                status =
+                    pObject->Object_Value_List(object_instance, value_list);
+            }
+        }
+    }
+
+    return (status);
+}
+
+/** Checks the COV flag in the requested Object
+ * param: [in] The object type to be looked up.
+ * param: [in] The object instance to be looked up.
+ * return: True if the COV flag is set
+ */
+bool Device_COV(
+    BACNET_OBJECT_TYPE object_type,
+    uint32_t object_instance)
+{
+    bool status = false;        /* Ever the pessamist! */
+    struct object_functions *pObject = NULL;
+
+    pObject = Device_Objects_Find_Functions(object_type);
+    if (pObject != NULL) {
+        if (pObject->Object_Valid_Instance &&
+            pObject->Object_Valid_Instance(object_instance)) {
+            if (pObject->Object_COV) {
+                status = pObject->Object_COV(object_instance);
+            }
+        }
+    }
+
+    return (status);
+}
+
+/** Clears the COV flag in the requested Object
+ * param: [in] The object type to be looked up.
+ * param: [in] The object instance to be looked up.
+ */
+void Device_COV_Clear(
+    BACNET_OBJECT_TYPE object_type,
+    uint32_t object_instance)
+{
+    struct object_functions *pObject = NULL;
+
+    pObject = Device_Objects_Find_Functions(object_type);
+    if (pObject != NULL) {
+        if (pObject->Object_Valid_Instance &&
+            pObject->Object_Valid_Instance(object_instance)) {
+            if (pObject->Object_COV_Clear) {
+                pObject->Object_COV_Clear(object_instance);
+            }
+        }
+    }
+}
+
+
+/** Looks up the requested Object to see if the functionality is supported.
+ * param: [in] The object type to be looked up.
+ * return: True if the object instance supports this feature.
+ */
+bool Device_Value_List_Supported(
+    BACNET_OBJECT_TYPE object_type)
+{
+    bool status = false;        /* Ever the pessamist! */
+    struct object_functions *pObject = NULL;
+
+    pObject = Device_Objects_Find_Functions(object_type);
+    if (pObject != NULL) {
+        if (pObject->Object_Value_List) {
+            status = true;
+        }
+    }
+
+    return (status);
+}
+
+/** Initialize the Device Object.
+ Initialize the group of object helper functions for any supported Object.
+ Initialize each of the Device Object child Object instances.
+ * param: The BACnet Object Name of the bacnet server
+ */
+void Device_Init(
+    const char * Device_Object_Name)
+{
+    struct object_functions *pObject = NULL;
+
+    /* initialize the Device_Properties_List array */
+    int len = 0;
+    len += BACnet_Init_Properties_List(Device_Properties_List + len,
+                                       Device_Properties_Required);
+    len += BACnet_Init_Properties_List(Device_Properties_List + len,
+                                       Device_Properties_Optional);
+    len += BACnet_Init_Properties_List(Device_Properties_List + len,
+                                       Device_Properties_Proprietary);
+
+    characterstring_init_ansi(&My_Object_Name, Device_Object_Name);
+    Object_Table = &My_Object_Table[0]; // sets glogbal variable!
+    pObject = Object_Table;
+    while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) {
+        if (pObject->Object_Init) {
+            pObject->Object_Init();
+        }
+        pObject++;
+    }
+}
+
+bool DeviceGetRRInfo(
+    BACNET_READ_RANGE_DATA * pRequest,  /* Info on the request */
+    RR_PROP_INFO * pInfo)
+{       /* Where to put the response */
+    bool status = false;        /* return value */
+
+    switch (pRequest->object_property) {
+        case PROP_VT_CLASSES_SUPPORTED:
+        case PROP_ACTIVE_VT_SESSIONS:
+        case PROP_LIST_OF_SESSION_KEYS:
+        case PROP_TIME_SYNCHRONIZATION_RECIPIENTS:
+        case PROP_MANUAL_SLAVE_ADDRESS_BINDING:
+        case PROP_SLAVE_ADDRESS_BINDING:
+        case PROP_RESTART_NOTIFICATION_RECIPIENTS:
+        case PROP_UTC_TIME_SYNCHRONIZATION_RECIPIENTS:
+            pInfo->RequestTypes = RR_BY_POSITION;
+            pRequest->error_class = ERROR_CLASS_PROPERTY;
+            pRequest->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            break;
+
+        case PROP_DEVICE_ADDRESS_BINDING:
+            pInfo->RequestTypes = RR_BY_POSITION;
+            pInfo->Handler = rr_address_list_encode;
+            status = true;
+            break;
+
+        default:
+            pRequest->error_class = ERROR_CLASS_SERVICES;
+            pRequest->error_code = ERROR_CODE_PROPERTY_IS_NOT_A_LIST;
+            break;
+    }
+
+    return status;
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/device.h	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,369 @@
+/**************************************************************************
+*
+* Copyright (C) 2005 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+
+/** device.h Defines functions for handling all BACnet objects belonging
+ *                 to a BACnet device, as well as Device-specific properties. */
+
+#ifndef DEVICE_H
+#define DEVICE_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include "bacdef.h"
+#include "bacenum.h"
+#include "wp.h"
+#include "rd.h"
+#include "rp.h"
+#include "rpm.h"
+#include "readrange.h"
+
+/** Called so a BACnet object can perform any necessary initialization.
+ */
+typedef void (
+    *object_init_function) (
+    void);
+
+/** Counts the number of objects of this type.
+ * return: Count of implemented objects of this type.
+ */
+typedef unsigned (
+    *object_count_function) (
+    void);
+
+/** Maps an object index position to its corresponding BACnet object instance number.
+ * param: index [in] The index of the object, in the array of objects of its type.
+ * return: The BACnet object instance number to be used in a BACNET_OBJECT_ID.
+ */
+typedef uint32_t(
+    *object_index_to_instance_function)
+        (
+    unsigned index);
+
+/** Provides the BACnet Object_Name for a given object instance of this type.
+ * param: object_instance [in] The object instance number to be looked up.
+ * param: object_name [in,out] Pointer to a character_string structure that
+ *         will hold a copy of the object name if this is a valid object_instance.
+ * return: True if the object_instance is valid and object_name has been
+ *         filled with a copy of the Object's name.
+ */
+typedef bool(
+    *object_name_function)
+        (
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name);
+
+/** Look in the table of objects of this type, and see if this is a valid
+ *  instance number.
+ * param: [in] The object instance number to be looked up.
+ * return: True if the object instance refers to a valid object of this type.
+ */
+typedef bool(
+    *object_valid_instance_function) (
+    uint32_t object_instance);
+
+/** Helper function to step through an array of objects and find either the
+ * first one or the next one of a given type. Used to step through an array
+ * of objects which is not necessarily contiguious for each type i.e. the
+ * index for the 'n'th object of a given type is not necessarily 'n'.
+ * param: [in] The index of the current object or a value of ~0 to indicate
+ * start at the beginning.
+ * return: The index of the next object of the required type or ~0 (all bits
+ * == 1) to indicate no more objects found.
+ */
+typedef unsigned (
+    *object_iterate_function) (
+    unsigned current_index);
+
+/** Look in the table of objects of this type, and get the COV Value List.
+ * param: [in] The object instance number to be looked up.
+ * param: [out] The value list
+ * return: True if the object instance supports this feature, and has changed.
+ */
+typedef bool(
+    *object_value_list_function) (
+    uint32_t object_instance,
+    BACNET_PROPERTY_VALUE * value_list);
+
+/** Look in the table of objects for this instance to see if value changed.
+ * param: [in] The object instance number to be looked up.
+ * return: True if the object instance has changed.
+ */
+typedef bool(
+    *object_cov_function) (
+    uint32_t object_instance);
+
+/** Look in the table of objects for this instance to clear the changed flag.
+ * param: [in] The object instance number to be looked up.
+ */
+typedef void (
+    *object_cov_clear_function) (
+    uint32_t object_instance);
+
+/** Intrinsic Reporting funcionality.
+ * param: [in] Object instance.
+ */
+typedef void (
+    *object_intrinsic_reporting_function) (
+    uint32_t object_instance);
+
+
+/** Defines the group of object helper functions for any supported Object.
+ * Each Object must provide some implementation of each of these helpers
+ * in order to properly support the handlers.  Eg, the ReadProperty handler
+ * handler_read_property() relies on the instance of Object_Read_Property
+ * for each Object type, or configure the function as NULL.
+ * In both appearance and operation, this group of functions acts like
+ * they are member functions of a C++ Object base class.
+ */
+typedef struct object_functions {
+    BACNET_OBJECT_TYPE Object_Type;
+    object_init_function Object_Init;
+    object_count_function Object_Count;
+    object_index_to_instance_function Object_Index_To_Instance;
+    object_valid_instance_function Object_Valid_Instance;
+    object_name_function Object_Name;
+    read_property_function Object_Read_Property;
+    write_property_function Object_Write_Property;
+    rpm_property_lists_function Object_RPM_List;
+    rr_info_function Object_RR_Info;
+    object_iterate_function Object_Iterator;
+    object_value_list_function Object_Value_List;
+    object_cov_function Object_COV;
+    object_cov_clear_function Object_COV_Clear;
+    object_intrinsic_reporting_function Object_Intrinsic_Reporting;
+} object_functions_t;
+
+/* String Lengths for Device Object properties that may be changed
+ * (written to) over the BACnet network.
+ * Maximum sizes excluding nul terminator .
+ */
+#define STRLEN_X(minlen, str)  (((minlen)>sizeof(str))?(minlen):sizeof(str))
+#define MAX_DEV_NAME_LEN STRLEN_X(32, "%(BACnet_Device_Name)s")     /* Device name         */
+#define MAX_DEV_LOC_LEN  STRLEN_X(64, BACNET_DEVICE_LOCATION)       /* Device location     */
+#define MAX_DEV_MOD_LEN  STRLEN_X(32, BACNET_DEVICE_MODEL_NAME)     /* Device model name   */
+#define MAX_DEV_VER_LEN  STRLEN_X(16, BACNET_DEVICE_APPSOFT_VER)    /* Device application software version */
+#define MAX_DEV_DESC_LEN STRLEN_X(64, BACNET_DEVICE_DESCRIPTION)    /* Device description  */
+
+/** Structure to define the Object Properties common to all Objects. */
+typedef struct commonBacObj_s {
+
+    /** The BACnet type of this object (ie, what class is this object from?).
+     * This property, of type BACnetObjectType, indicates membership in a
+     * particular object type class. Each inherited class will be of one type.
+     */
+    BACNET_OBJECT_TYPE mObject_Type;
+
+    /** The instance number for this class instance. */
+    uint32_t Object_Instance_Number;
+
+    /** Object Name; must be unique.
+     * This property, of type CharacterString, shall represent a name for
+     * the object that is unique within the BACnet Device that maintains it.
+     */
+    char Object_Name[MAX_DEV_NAME_LEN];
+
+} COMMON_BAC_OBJECT;
+
+
+/** Structure to define the Properties of Device Objects which distinguish
+ *  one instance from another.
+ *  This structure only defines fields for properties that are unique to
+ *  a given Device object.  The rest may be fixed in device.c or hard-coded
+ *  into the read-property encoding.
+ *  This may be useful for implementations which manage multiple Devices,
+ *  eg, a Gateway.
+ */
+typedef struct devObj_s {
+    /** The BACnet Device Address for this device; ->len depends on DLL type. */
+    BACNET_ADDRESS bacDevAddr;
+
+    /** Structure for the Object Properties common to all Objects. */
+    COMMON_BAC_OBJECT bacObj;
+
+    /** Device Description. */
+    char Description[MAX_DEV_DESC_LEN];
+
+    /** The upcounter that shows if the Device ID or object structure has changed. */
+    uint32_t Database_Revision;
+} DEVICE_OBJECT_DATA;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+    void Device_Init(
+        const char * Device_Object_Name);
+
+    bool Device_Reinitialize(
+        BACNET_REINITIALIZE_DEVICE_DATA * rd_data);
+
+    BACNET_REINITIALIZED_STATE Device_Reinitialized_State(
+        void);
+
+    rr_info_function Device_Objects_RR_Info(
+        BACNET_OBJECT_TYPE object_type);
+
+    void Device_getCurrentDateTime(
+        BACNET_DATE_TIME * DateTime);
+    int32_t Device_UTC_Offset(void);
+    bool Device_Daylight_Savings_Status(void);
+
+    void Device_Property_Lists(
+        const int **pRequired,
+        const int **pOptional,
+        const int **pProprietary);
+    void Device_Objects_Property_List(
+        BACNET_OBJECT_TYPE object_type,
+        struct special_property_list_t *pPropertyList);
+    /* functions to support COV */
+    bool Device_Encode_Value_List(
+        BACNET_OBJECT_TYPE object_type,
+        uint32_t object_instance,
+        BACNET_PROPERTY_VALUE * value_list);
+    bool Device_Value_List_Supported(
+        BACNET_OBJECT_TYPE object_type);
+    bool Device_COV(
+        BACNET_OBJECT_TYPE object_type,
+        uint32_t object_instance);
+    void Device_COV_Clear(
+        BACNET_OBJECT_TYPE object_type,
+        uint32_t object_instance);
+
+    uint32_t Device_Object_Instance_Number(
+        void);
+    bool Device_Set_Object_Instance_Number(
+        uint32_t object_id);
+    bool Device_Valid_Object_Instance_Number(
+        uint32_t object_id);
+    unsigned Device_Object_List_Count(
+        void);
+    bool Device_Object_List_Identifier(
+        unsigned array_index,
+        int *object_type,
+        uint32_t * instance);
+
+    unsigned Device_Count(
+        void);
+    uint32_t Device_Index_To_Instance(
+        unsigned index);
+
+    bool Device_Object_Name(
+        uint32_t object_instance,
+        BACNET_CHARACTER_STRING * object_name);
+    bool Device_Set_Object_Name(
+        BACNET_CHARACTER_STRING * object_name);
+    /* Copy a child object name, given its ID. */
+    bool Device_Object_Name_Copy(
+        BACNET_OBJECT_TYPE object_type,
+        uint32_t object_instance,
+        BACNET_CHARACTER_STRING * object_name);
+    bool Device_Object_Name_ANSI_Init(const char * value);
+
+    BACNET_DEVICE_STATUS Device_System_Status(
+        void);
+    int Device_Set_System_Status(
+        BACNET_DEVICE_STATUS status,
+        bool local);
+
+    const char *Device_Vendor_Name(
+        void);
+
+    uint16_t Device_Vendor_Identifier(
+        void);
+    void Device_Set_Vendor_Identifier(
+        uint16_t vendor_id);
+
+    const char *Device_Model_Name(
+        void);
+    bool Device_Set_Model_Name(
+        const char *name,
+        size_t length);
+
+    const char *Device_Firmware_Revision(
+        void);
+
+    const char *Device_Application_Software_Version(
+        void);
+    bool Device_Set_Application_Software_Version(
+        const char *name,
+        size_t length);
+
+    const char *Device_Description(
+        void);
+    bool Device_Set_Description(
+        const char *name,
+        size_t length);
+
+    const char *Device_Location(
+        void);
+    bool Device_Set_Location(
+        const char *name,
+        size_t length);
+
+    /* some stack-centric constant values - no set methods */
+    uint8_t Device_Protocol_Version(
+        void);
+    uint8_t Device_Protocol_Revision(
+        void);
+    BACNET_SEGMENTATION Device_Segmentation_Supported(
+        void);
+
+    uint32_t Device_Database_Revision(
+        void);
+    void Device_Set_Database_Revision(
+        uint32_t revision);
+    void Device_Inc_Database_Revision(
+        void);
+
+    bool Device_Valid_Object_Name(
+        BACNET_CHARACTER_STRING * object_name,
+        int *object_type,
+        uint32_t * object_instance);
+    bool Device_Valid_Object_Id(
+        int object_type,
+        uint32_t object_instance);
+
+    int Device_Read_Property(
+        BACNET_READ_PROPERTY_DATA * rpdata);
+    bool Device_Write_Property(
+        BACNET_WRITE_PROPERTY_DATA * wp_data);
+
+    bool DeviceGetRRInfo(
+        BACNET_READ_RANGE_DATA * pRequest,      /* Info on the request */
+        RR_PROP_INFO * pInfo);  /* Where to put the information */
+
+    int Device_Read_Property_Local(
+        BACNET_READ_PROPERTY_DATA * rpdata);
+    bool Device_Write_Property_Local(
+        BACNET_WRITE_PROPERTY_DATA * wp_data);
+
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/msi.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,556 @@
+/**************************************************************************
+*
+* Copyright (C) 2012 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+
+/* Multi-state Input Objects */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "config_bacnet_for_beremiz_%(locstr)s.h"     /* the custom configuration for beremiz pluginh  */
+#include "bacdef.h"
+#include "bacdcode.h"
+#include "bacenum.h"
+#include "bacapp.h"
+#include "rp.h"
+#include "wp.h"
+#include "msi_%(locstr)s.h"
+#include "handlers.h"
+
+
+/* initial value for present_value property of each object */ 
+#define MSI_VALUE_INIT (1)
+
+/* The IEC 61131-3 located variables mapped onto the Multi-state Input objects of BACnet protocol */
+%(MSI_lvars)s
+
+
+/* The array where we keep all the state related to the Multi-state Input Objects */
+#define MAX_MULTISTATE_INPUTS %(MSI_count)s
+static MULTISTATE_INPUT_DESCR MSI_Descr[MAX_MULTISTATE_INPUTS] = {
+%(MSI_param)s
+};
+
+
+
+/* These three arrays are used by the ReadPropertyMultiple handler,
+ * as well as to initialize the XXX_Property_List used by the 
+ * Property List (PROP_PROPERTY_LIST) property.
+ */
+static const int Multistate_Input_Properties_Required[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                              /*(1)(2)      */
+    PROP_OBJECT_IDENTIFIER,   /* R  R ( 75) */
+    PROP_OBJECT_NAME,         /* R  R ( 77) */
+    PROP_OBJECT_TYPE,         /* R  R ( 79) */
+    PROP_PRESENT_VALUE,       /* W  R ( 85) */
+    PROP_STATUS_FLAGS,        /* R  R (111) */
+    PROP_EVENT_STATE,         /* R  R ( 36) */
+    PROP_OUT_OF_SERVICE,      /* W  R ( 81) */
+    PROP_NUMBER_OF_STATES,    /* R  R ( 74) */
+//  PROP_PROPERTY_LIST,       /* R  R (371) */
+    -1
+};
+
+static const int Multistate_Input_Properties_Optional[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                              /*(1)(2)      */
+    PROP_DESCRIPTION,         /* R  O ( 28) */
+    PROP_STATE_TEXT,          /* R  O (110) */
+    -1
+};
+
+static const int Multistate_Input_Properties_Proprietary[] = {
+    -1
+};
+
+
+/* This array stores the PROPERTY_LIST which may be read by clients.
+ * End of list is marked by following the last element with the value '-1'
+ * 
+ * It is initialized by Multistate_Input_Init() based off the values
+ * stored in Multistate_Input_Properties_Required 
+ *           Multistate_Input_Properties_Optional
+ *           Multistate_Input_Properties_Proprietary
+ */
+/* TODO: Allocate memory for this array with malloc() at startup */
+static int Multistate_Input_Properties_List[64];
+
+
+
+
+
+/********************************************************/
+/**                  Callback functions.               **/
+/** Functions required by BACnet devie implementation. **/
+/********************************************************/
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Multistate_Input_Property_Lists(
+    const int **pRequired,
+    const int **pOptional,
+    const int **pProprietary)
+{
+    if (pRequired)
+        *pRequired = Multistate_Input_Properties_Required;
+    if (pOptional)
+        *pOptional = Multistate_Input_Properties_Optional;
+    if (pProprietary)
+        *pProprietary = Multistate_Input_Properties_Proprietary;
+
+    return;
+}
+
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Multistate_Input_Init(
+    void)
+{
+    unsigned int i, j;
+
+    /* initialize the Multistate_Input_Properties_List array */
+    int len = 0;
+    len += BACnet_Init_Properties_List(Multistate_Input_Properties_List + len,
+                                       Multistate_Input_Properties_Required);
+    len += BACnet_Init_Properties_List(Multistate_Input_Properties_List + len,
+                                       Multistate_Input_Properties_Optional);
+    len += BACnet_Init_Properties_List(Multistate_Input_Properties_List + len,
+                                       Multistate_Input_Properties_Proprietary);
+
+    /* initialize all the analog output priority arrays to NULL */
+    for (i = 0; i < MAX_MULTISTATE_INPUTS; i++) {
+        MSI_Descr[i].Present_Value = MSI_VALUE_INIT;
+        for (j = 0; j < MSI_Descr[i].Number_Of_States; j++) {
+            sprintf(MSI_Descr[i].State_Text[j], "State %%d", j+1);
+        }
+    }
+    return;
+}
+
+
+
+/* validate that the given instance exists */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Multistate_Input_Valid_Instance(
+    uint32_t object_instance)
+{
+    // fprintf(stderr, "BACnet plugin: Multistate_Input_Valid_Instance(obj_ID=%%u) called!\n", object _instance);
+    return (Multistate_Input_Instance_To_Index(object_instance) < MAX_MULTISTATE_INPUTS);
+}
+
+
+/* the number of Multistate Value Objects */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+unsigned Multistate_Input_Count(void) {return MAX_MULTISTATE_INPUTS;}
+
+
+/* returns the instance (i.e. Object Identifier) that correlates to the correct index */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+uint32_t Multistate_Input_Index_To_Instance(unsigned index) {return MSI_Descr[index].Object_Identifier;}
+
+
+
+
+
+
+/* returns the index that correlates to the correct instance number (Object Identifier) */
+unsigned Multistate_Input_Instance_To_Index(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+  
+    for (index = 0; index < MAX_MULTISTATE_INPUTS; index++)
+        if (object_instance == MSI_Descr[index].Object_Identifier)
+            return index;
+
+    /* error, this object ID is not in our list! */
+    return MAX_MULTISTATE_INPUTS;
+}
+
+
+
+
+
+uint32_t Multistate_Input_Present_Value(
+    uint32_t object_instance)
+{
+    uint32_t value = MSI_VALUE_INIT;
+    unsigned index = 0; /* offset from instance lookup */
+
+    index = Multistate_Input_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_INPUTS)
+        value = MSI_Descr[index].Present_Value;
+
+    return value;
+}
+
+
+
+bool Multistate_Input_Present_Value_Set(
+    uint32_t object_instance,
+    uint32_t value)
+{
+    unsigned index = 0; /* offset from instance lookup */
+
+    index = Multistate_Input_Instance_To_Index(object_instance);
+    if (index >= MAX_MULTISTATE_INPUTS)
+      return false;
+
+    if ((value == 0) || (value > MSI_Descr[index].Number_Of_States))
+      return false;
+      
+    MSI_Descr[index].Present_Value = (uint8_t) value;
+    return true;
+}
+
+
+
+
+bool Multistate_Input_Out_Of_Service(
+    uint32_t object_instance)
+{
+    bool value = false;
+    unsigned index = 0;
+
+    index = Multistate_Input_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_INPUTS) {
+        value = MSI_Descr[index].Out_Of_Service;
+    }
+
+    return value;
+}
+
+
+
+void Multistate_Input_Out_Of_Service_Set(
+    uint32_t object_instance,
+    bool value)
+{
+    unsigned index = 0;
+
+    index = Multistate_Input_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_INPUTS) {
+        MSI_Descr[index].Out_Of_Service = value;
+    }
+
+    return;
+}
+
+
+
+static char *Multistate_Input_Description(
+    uint32_t object_instance)
+{
+    unsigned index = 0; /* offset from instance lookup */
+    char *pName = NULL; /* return value */
+
+    index = Multistate_Input_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_INPUTS) {
+        pName = MSI_Descr[index].Description;
+    }
+
+    return pName;
+}
+
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Multistate_Input_Object_Name(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    unsigned index = 0; /* offset from instance lookup */
+    bool status = false;
+
+    index = Multistate_Input_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_INPUTS) {
+        status = characterstring_init_ansi(object_name, MSI_Descr[index].Object_Name);
+    }
+
+    return status;
+}
+
+
+
+/* return apdu len, or BACNET_STATUS_ERROR on error */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+int Multistate_Input_Read_Property(
+    BACNET_READ_PROPERTY_DATA * rpdata)
+{
+    int len = 0;
+    int apdu_len = 0;   /* return value */
+    BACNET_BIT_STRING bit_string;
+    BACNET_CHARACTER_STRING char_string;
+    uint32_t present_value = 0;
+    unsigned object_index = 0;
+    unsigned i = 0;
+    bool state = false;
+    uint8_t *apdu = NULL;
+
+    if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
+        (rpdata->application_data_len == 0)) {
+        return 0;
+    }
+
+    object_index = Multistate_Input_Instance_To_Index(rpdata->object_instance);
+    if (object_index >= MAX_MULTISTATE_INPUTS) {
+        rpdata->error_class = ERROR_CLASS_OBJECT;
+        rpdata->error_code  = ERROR_CODE_UNKNOWN_OBJECT;
+        return BACNET_STATUS_ERROR;
+    }
+
+    apdu = rpdata->application_data;
+    switch (rpdata->object_property) {
+        case PROP_OBJECT_IDENTIFIER:
+            apdu_len =
+                encode_application_object_id(&apdu[0],
+                OBJECT_MULTI_STATE_INPUT, rpdata->object_instance);
+            break;
+        case PROP_OBJECT_NAME:
+            Multistate_Input_Object_Name(rpdata->object_instance,
+                &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_DESCRIPTION:
+            characterstring_init_ansi(&char_string,
+                Multistate_Input_Description(rpdata->object_instance));
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_OBJECT_TYPE:
+            apdu_len =
+                encode_application_enumerated(&apdu[0],
+                OBJECT_MULTI_STATE_INPUT);
+            break;
+        case PROP_PRESENT_VALUE:
+            present_value =
+                Multistate_Input_Present_Value(rpdata->object_instance);
+            apdu_len = encode_application_unsigned(&apdu[0], present_value);
+            break;
+        case PROP_STATUS_FLAGS:
+            /* note: see the details in the standard on how to use these */
+            bitstring_init(&bit_string);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_IN_ALARM, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_FAULT, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OVERRIDDEN, false);
+            if (Multistate_Input_Out_Of_Service(rpdata->object_instance)) {
+                bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE,
+                    true);
+            } else {
+                bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE,
+                    false);
+            }
+            apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
+            break;
+        case PROP_EVENT_STATE:
+            /* note: see the details in the standard on how to use this */
+            apdu_len =
+                encode_application_enumerated(&apdu[0], EVENT_STATE_NORMAL);
+            break;
+        case PROP_OUT_OF_SERVICE:
+            state = MSI_Descr[object_index].Out_Of_Service;
+            apdu_len = encode_application_boolean(&apdu[0], state);
+            break;
+        case PROP_NUMBER_OF_STATES:
+            apdu_len =
+                encode_application_unsigned(&apdu[apdu_len],
+                MSI_Descr[object_index].Number_Of_States);
+            break;
+        case PROP_STATE_TEXT:
+            BACnet_encode_array(MSI_Descr[object_index].State_Text,
+                                MSI_Descr[object_index].Number_Of_States,
+                                retfalse, BACnet_encode_character_string);
+            break;
+//      case PROP_PROPERTY_LIST:
+//          BACnet_encode_array(Multistate_Input_Properties_List,
+//                              property_list_count(Multistate_Input_Properties_List),
+//                              retfalse, encode_application_enumerated);
+//          break;
+        default:
+            rpdata->error_class = ERROR_CLASS_PROPERTY;
+            rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            apdu_len = BACNET_STATUS_ERROR;
+            break;
+    }
+    /*  only array properties can have array options */
+    if ((apdu_len >= 0) && (rpdata->object_property != PROP_STATE_TEXT) &&
+//      (rpdata->object_property != PROP_PROPERTY_LIST) &&
+        (rpdata->array_index != BACNET_ARRAY_ALL)) {
+        rpdata->error_class = ERROR_CLASS_PROPERTY;
+        rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        apdu_len = BACNET_STATUS_ERROR;
+    }
+
+    return apdu_len;
+}
+
+/* returns true if successful */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Multistate_Input_Write_Property(
+    BACNET_WRITE_PROPERTY_DATA * wp_data)
+{
+    bool status = false;        /* return value */
+    int len = 0;
+    unsigned object_index = 0;
+    BACNET_APPLICATION_DATA_VALUE value;
+
+    /* decode the some of the request */
+    len =
+        bacapp_decode_application_data(wp_data->application_data,
+        wp_data->application_data_len, &value);
+    /* FIXME: len < application_data_len: more data? */
+    if (len < 0) {
+        /* error while decoding - a value larger than we can handle */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+        return false;
+    }
+    if ((wp_data->object_property != PROP_STATE_TEXT) &&
+        (wp_data->array_index != BACNET_ARRAY_ALL)) {
+        /*  only array properties can have array options */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        return false;
+    }
+    /* No need to check whether object_index is within bounds.
+     * Has already been checked before Multistate_Input_Write_Property() is called
+     */
+    object_index = Multistate_Input_Instance_To_Index(wp_data->object_instance);
+
+    switch (wp_data->object_property) {
+        case PROP_PRESENT_VALUE:
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
+                &wp_data->error_class, &wp_data->error_code);
+            if (!status) {
+                wp_data->error_class = ERROR_CLASS_PROPERTY;
+                wp_data->error_code  = ERROR_CODE_INVALID_DATA_TYPE;
+                status = false; // not really necessary here.
+            } else {
+                if (!MSI_Descr[object_index].Out_Of_Service) {
+                    /* input objects can only be written to when Out_Of_Service is true! */
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code  = ERROR_CODE_WRITE_ACCESS_DENIED;
+                    status = false;
+                } else {
+                    status =
+                        Multistate_Input_Present_Value_Set
+                        (wp_data->object_instance, value.type.Unsigned_Int);
+                    if (!status) {
+                        wp_data->error_class = ERROR_CLASS_PROPERTY;
+                        wp_data->error_code  = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                        status = false; // not really necessary here.
+                    }
+                }
+            }
+            break;
+        case PROP_OUT_OF_SERVICE:
+        {
+            bool Previous_Out_Of_Service = MSI_Descr[object_index].Out_Of_Service;
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                MSI_Descr[object_index].Out_Of_Service = value.type.Boolean;
+                if (Previous_Out_Of_Service && !MSI_Descr[object_index].Out_Of_Service)
+                    /* We have just changed from Out_of_Service -> In Service */
+                    /* We need to update the Present_Value to the value
+                     * currently in the PLC...
+                     */
+                    MSI_Descr[object_index].Present_Value =
+                                           *(MSI_Descr[object_index].Located_Var_ptr);
+            }
+            break;
+        }
+        case PROP_OBJECT_IDENTIFIER:
+        case PROP_OBJECT_NAME:
+        case PROP_OBJECT_TYPE:
+        case PROP_STATUS_FLAGS:
+        case PROP_EVENT_STATE:
+        case PROP_NUMBER_OF_STATES:
+        case PROP_DESCRIPTION:
+        case PROP_STATE_TEXT:
+//      case PROP_PROPERTY_LIST:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+            break;
+        default:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            break;
+    }
+
+    return status;
+}
+
+
+
+
+
+/********************************************/
+/** Functions required for Beremiz plugin  **/
+/********************************************/
+
+
+
+void  Multistate_Input_Copy_Present_Value_to_Located_Var(void) {
+    unsigned i;
+    for (i = 0; i < MAX_MULTISTATE_INPUTS; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (MSI_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        *(MSI_Descr[i].Located_Var_ptr) = Multistate_Input_Present_Value(MSI_Descr[i].Object_Identifier);
+    }
+}
+
+
+
+void  Multistate_Input_Copy_Located_Var_to_Present_Value(void) {
+    unsigned i;
+    for (i = 0; i < MAX_MULTISTATE_INPUTS; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (MSI_Descr[i].Out_Of_Service)
+            continue;
+
+        // Make sure local device does not set Present_Value to 0, nor higher than Number_Of_States
+        if ((*(MSI_Descr[i].Located_Var_ptr) >  MSI_Descr[i].Number_Of_States) ||
+            (*(MSI_Descr[i].Located_Var_ptr) == 0))
+            continue;
+
+        // Everything seems to be OK. Copy the value
+        MSI_Descr[i].Present_Value = *(MSI_Descr[i].Located_Var_ptr);
+    }
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/msi.h	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,109 @@
+/**************************************************************************
+*
+* Copyright (C) 2012 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+#ifndef MULTISTATE_INPUT_H
+#define MULTISTATE_INPUT_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include "bacdef.h"
+#include "bacerror.h"
+#include "rp.h"
+#include "wp.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* MultiState Inputs are encoded in unsigned integer
+ * (in BACnet => uint8_t), and can not be 0.
+ * See ASHRAE 135-2016, section 12.20.4
+ */
+#define MULTISTATE_MAX_NUMBER_OF_STATES (255)
+
+
+    typedef struct Multistate_Input_descr {
+        /* pointer to IEC 61131-3 located variable that is mapped onto this BACnet object */
+        uint8_t *Located_Var_ptr;
+        uint32_t Object_Identifier;  /* called object 'Instance' in the source code! */
+        char    *Object_Name;   
+        char    *Description;
+        uint8_t  Number_Of_States;
+
+        /* stores the current value */
+        uint8_t Present_Value;
+        /* Writable out-of-service allows others to manipulate our Present Value */
+        bool Out_Of_Service;
+        char State_Text[MULTISTATE_MAX_NUMBER_OF_STATES][64];
+    } MULTISTATE_INPUT_DESCR;
+
+
+    void Multistate_Input_Property_Lists(
+        const int **pRequired,
+        const int **pOptional,
+        const int **pProprietary);
+
+    bool Multistate_Input_Valid_Instance(
+        uint32_t object_instance);
+    unsigned Multistate_Input_Count(
+        void);
+    uint32_t Multistate_Input_Index_To_Instance(
+        unsigned index);
+    unsigned Multistate_Input_Instance_To_Index(
+        uint32_t instance);
+
+    int Multistate_Input_Read_Property(
+        BACNET_READ_PROPERTY_DATA * rpdata);
+
+    bool Multistate_Input_Write_Property(
+        BACNET_WRITE_PROPERTY_DATA * wp_data);
+
+    /* optional API */
+    bool Multistate_Input_Object_Name(
+        uint32_t object_instance,
+        BACNET_CHARACTER_STRING * object_name);
+
+    uint32_t Multistate_Input_Present_Value(
+        uint32_t object_instance);
+    bool Multistate_Input_Present_Value_Set(
+        uint32_t object_instance,
+        uint32_t value);
+
+    bool Multistate_Input_Out_Of_Service(
+        uint32_t object_instance);
+    void Multistate_Input_Out_Of_Service_Set(
+        uint32_t object_instance,
+        bool value);
+
+    void Multistate_Input_Init(
+        void);
+
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/mso.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,668 @@
+/**************************************************************************
+*
+* Copyright (C) 2012 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+
+/* Multi-state Output Objects */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "config_bacnet_for_beremiz_%(locstr)s.h"     /* the custom configuration for beremiz pluginh  */
+#include "bacdef.h"
+#include "bacdcode.h"
+#include "bacenum.h"
+#include "bacapp.h"
+#include "rp.h"
+#include "wp.h"
+#include "mso_%(locstr)s.h"
+#include "handlers.h"
+
+/* we choose to have a NULL level in our system represented by */
+/* a particular value.  When the priorities are not in use, they */
+/* will be relinquished (i.e. set to the NULL level). */
+/* Since multi state value objects can never take the value 0, we 
+ * use 0 as our NULL value.
+ * See ASHRAE 135-2016, section 12.20.4
+ */
+#define MSO_VALUE_NULL (0)
+#define MSO_VALUE_IS_NULL(x)  ((x) == MSO_VALUE_NULL)
+/* When all the priorities are level null, the present value returns */
+/* the Relinquish Default value */
+#define MSO_VALUE_RELINQUISH_DEFAULT 1
+
+
+
+/* The IEC 61131-3 located variables mapped onto the Multi-state Output objects of BACnet protocol */
+%(MSO_lvars)s
+
+
+/* The array where we keep all the state related to the Multi-state Output Objects */
+#define MAX_MULTISTATE_OUTPUTS %(MSO_count)s
+static MULTISTATE_OUTPUT_DESCR MSO_Descr[MAX_MULTISTATE_OUTPUTS] = {
+%(MSO_param)s
+};
+
+
+
+/* These three arrays are used by the ReadPropertyMultiple handler,
+ * as well as to initialize the XXX_Property_List used by the 
+ * Property List (PROP_PROPERTY_LIST) property.
+ */
+static const int Multistate_Output_Properties_Required[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                                  /*(1)(2)      */
+    PROP_OBJECT_IDENTIFIER,       /* R  R ( 75) */
+    PROP_OBJECT_NAME,             /* R  R ( 77) */
+    PROP_OBJECT_TYPE,             /* R  R ( 79) */
+    PROP_PRESENT_VALUE,           /* W  W ( 85) */
+    PROP_STATUS_FLAGS,            /* R  R (111) */
+    PROP_EVENT_STATE,             /* R  R ( 36) */
+    PROP_OUT_OF_SERVICE,          /* W  R ( 81) */
+    PROP_NUMBER_OF_STATES,        /* R  R ( 74) */
+    PROP_PRIORITY_ARRAY,          /* R  R ( 87) */
+    PROP_RELINQUISH_DEFAULT,      /* R  R (104) */
+//  PROP_PROPERTY_LIST,           /* R  R (371) */
+//  PROP_CURRENT_COMMAND_PRIORITY,/* R  R (431) */   
+    -1
+};
+
+static const int Multistate_Output_Properties_Optional[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                                  /*(1)(2)      */
+    PROP_DESCRIPTION,             /* R  O ( 28) */
+    PROP_STATE_TEXT,              /* R  O (110) */
+    -1
+};
+
+static const int Multistate_Output_Properties_Proprietary[] = {
+    -1
+};
+
+
+/* This array stores the PROPERTY_LIST which may be read by clients.
+ * End of list is marked by following the last element with the value '-1'
+ * 
+ * It is initialized by Multistate_Output_Init() based off the values
+ * stored in Multistate_Output_Properties_Required 
+ *           Multistate_Output_Properties_Optional
+ *           Multistate_Output_Properties_Proprietary
+ */
+/* TODO: Allocate memory for this array with malloc() at startup */
+static int Multistate_Output_Properties_List[64];
+
+
+
+
+
+/********************************************************/
+/**                  Callback functions.               **/
+/** Functions required by BACnet devie implementation. **/
+/********************************************************/
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Multistate_Output_Property_Lists(
+    const int **pRequired,
+    const int **pOptional,
+    const int **pProprietary)
+{
+    if (pRequired)
+        *pRequired = Multistate_Output_Properties_Required;
+    if (pOptional)
+        *pOptional = Multistate_Output_Properties_Optional;
+    if (pProprietary)
+        *pProprietary = Multistate_Output_Properties_Proprietary;
+
+    return;
+}
+
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Multistate_Output_Init(
+    void)
+{
+    unsigned int i, j;
+
+    /* initialize the Multistate_Output_Properties_List array */
+    int len = 0;
+    len += BACnet_Init_Properties_List(Multistate_Output_Properties_List + len,
+                                       Multistate_Output_Properties_Required);
+    len += BACnet_Init_Properties_List(Multistate_Output_Properties_List + len,
+                                       Multistate_Output_Properties_Optional);
+    len += BACnet_Init_Properties_List(Multistate_Output_Properties_List + len,
+                                       Multistate_Output_Properties_Proprietary);
+
+    /* initialize all the analog output priority arrays to NULL */
+    for (i = 0; i < MAX_MULTISTATE_OUTPUTS; i++) {
+        for (j = 0; j < BACNET_MAX_PRIORITY; j++) {
+            MSO_Descr[i].Present_Value[j] = MSO_VALUE_NULL;
+        }
+        for (j = 0; j < MSO_Descr[i].Number_Of_States; j++) {
+            sprintf(MSO_Descr[i].State_Text[j], "State %%d", j+1);
+        }
+    }
+    return;
+}
+
+
+
+/* validate that the given instance exists */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Multistate_Output_Valid_Instance(
+    uint32_t object_instance)
+{
+    // fprintf(stderr, "BACnet plugin: Multistate_Output_Valid_Instance(obj_ID=%%u) called!\n", object _instance);
+    return (Multistate_Output_Instance_To_Index(object_instance) < MAX_MULTISTATE_OUTPUTS);
+}
+
+
+/* the number of Multistate Value Objects */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+unsigned Multistate_Output_Count(void) {return MAX_MULTISTATE_OUTPUTS;}
+
+
+/* returns the instance (i.e. Object Identifier) that correlates to the correct index */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+uint32_t Multistate_Output_Index_To_Instance(unsigned index) {return MSO_Descr[index].Object_Identifier;}
+
+
+
+
+
+
+/* returns the index that correlates to the correct instance number (Object Identifier) */
+unsigned Multistate_Output_Instance_To_Index(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+  
+    for (index = 0; index < MAX_MULTISTATE_OUTPUTS; index++)
+        if (object_instance == MSO_Descr[index].Object_Identifier)
+            return index;
+
+    /* error, this object ID is not in our list! */
+    return MAX_MULTISTATE_OUTPUTS;
+}
+
+
+
+
+
+uint32_t Multistate_Output_Present_Value(
+    uint32_t object_instance)
+{
+    uint32_t value = MSO_VALUE_RELINQUISH_DEFAULT;
+    unsigned index = 0; /* offset from instance lookup */
+    unsigned i = 0;
+
+    index = Multistate_Output_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_OUTPUTS) {
+        for (i = 0; i < BACNET_MAX_PRIORITY; i++) {
+            if (!MSO_VALUE_IS_NULL(MSO_Descr[index].Present_Value[i])) {
+                value = MSO_Descr[index].Present_Value[i];
+                break;
+            }
+        }
+    }
+
+    return value;
+}
+
+
+
+bool Multistate_Output_Present_Value_Set(
+    uint32_t object_instance,
+    uint32_t value,
+    uint8_t  priority)
+{
+    unsigned index = 0; /* offset from instance lookup */
+
+    index = Multistate_Output_Instance_To_Index(object_instance);
+    if (index >= MAX_MULTISTATE_OUTPUTS)
+      return false;
+
+    if ((priority == 0) || (priority > BACNET_MAX_PRIORITY) ||
+        (priority == 6 /* reserved, ASHRAE 135-2016, section 19.2.2 */))
+      return false;
+    
+    if ((value == 0) || (value > MSO_Descr[index].Number_Of_States))
+      return false;
+      
+    priority--;
+    MSO_Descr[index].Present_Value[priority] = (uint8_t) value;
+
+    return true;
+}
+
+
+
+/* returns command priority (1..16), or 0 if all priority values are at NULL */
+int Multistate_Output_Current_Command_Priority(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+    unsigned i = 0;
+
+    index = Multistate_Output_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_OUTPUTS) {
+        for (i = 0; i < BACNET_MAX_PRIORITY; i++) {
+            if (!MSO_VALUE_IS_NULL(MSO_Descr[index].Present_Value[i])) {
+                return i+1; // +1 since priority is 1..16, and not 0..15
+            }
+        }
+    }
+    // command values in all priorities are set to NULL
+    return 0;
+}
+
+
+
+
+bool Multistate_Output_Present_Value_Relinquish(
+    uint32_t object_instance,
+    uint8_t  priority)
+{
+    unsigned index = 0; /* offset from instance lookup */
+
+    index = Multistate_Output_Instance_To_Index(object_instance);
+    if (index >= MAX_MULTISTATE_OUTPUTS)
+      return false;
+    
+    if ((priority == 0) || (priority > BACNET_MAX_PRIORITY) ||
+        (priority == 6 /* reserved, ASHRAE 135-2016, section 19.2.2 */))
+      return false;
+    
+    priority--;
+    MSO_Descr[index].Present_Value[priority] = MSO_VALUE_NULL;
+
+    return true;
+}
+
+
+
+bool Multistate_Output_Out_Of_Service(
+    uint32_t object_instance)
+{
+    bool value = false;
+    unsigned index = 0;
+
+    index = Multistate_Output_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_OUTPUTS) {
+        value = MSO_Descr[index].Out_Of_Service;
+    }
+
+    return value;
+}
+
+
+
+void Multistate_Output_Out_Of_Service_Set(
+    uint32_t object_instance,
+    bool value)
+{
+    unsigned index = 0;
+
+    index = Multistate_Output_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_OUTPUTS) {
+        MSO_Descr[index].Out_Of_Service = value;
+    }
+
+    return;
+}
+
+
+
+static char *Multistate_Output_Description(
+    uint32_t object_instance)
+{
+    unsigned index = 0; /* offset from instance lookup */
+    char *pName = NULL; /* return value */
+
+    index = Multistate_Output_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_OUTPUTS) {
+        pName = MSO_Descr[index].Description;
+    }
+
+    return pName;
+}
+
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Multistate_Output_Object_Name(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    unsigned index = 0; /* offset from instance lookup */
+    bool status = false;
+
+    index = Multistate_Output_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_OUTPUTS) {
+        status = characterstring_init_ansi(object_name, MSO_Descr[index].Object_Name);
+    }
+
+    return status;
+}
+
+
+
+/* return apdu len, or BACNET_STATUS_ERROR on error */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+int Multistate_Output_Read_Property(
+    BACNET_READ_PROPERTY_DATA * rpdata)
+{
+    int len = 0;
+    int apdu_len = 0;   /* return value */
+    BACNET_BIT_STRING bit_string;
+    BACNET_CHARACTER_STRING char_string;
+    uint32_t present_value = 0;
+    unsigned object_index = 0;
+    unsigned i = 0;
+    bool state = false;
+    uint8_t *apdu = NULL;
+
+    if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
+        (rpdata->application_data_len == 0)) {
+        return 0;
+    }
+
+    object_index = Multistate_Output_Instance_To_Index(rpdata->object_instance);
+    if (object_index >= MAX_MULTISTATE_OUTPUTS) {
+        rpdata->error_class = ERROR_CLASS_OBJECT;
+        rpdata->error_code  = ERROR_CODE_UNKNOWN_OBJECT;
+        return BACNET_STATUS_ERROR;
+    }
+
+    apdu = rpdata->application_data;
+    switch (rpdata->object_property) {
+        case PROP_OBJECT_IDENTIFIER:
+            apdu_len =
+                encode_application_object_id(&apdu[0],
+                OBJECT_MULTI_STATE_OUTPUT, rpdata->object_instance);
+            break;
+        case PROP_OBJECT_NAME:
+            Multistate_Output_Object_Name(rpdata->object_instance,
+                &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_DESCRIPTION:
+            characterstring_init_ansi(&char_string,
+                Multistate_Output_Description(rpdata->object_instance));
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_OBJECT_TYPE:
+            apdu_len =
+                encode_application_enumerated(&apdu[0],
+                OBJECT_MULTI_STATE_OUTPUT);
+            break;
+        case PROP_PRESENT_VALUE:
+            present_value =
+                Multistate_Output_Present_Value(rpdata->object_instance);
+            apdu_len = encode_application_unsigned(&apdu[0], present_value);
+            break;
+        case PROP_STATUS_FLAGS:
+            /* note: see the details in the standard on how to use these */
+            bitstring_init(&bit_string);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_IN_ALARM, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_FAULT, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OVERRIDDEN, false);
+            if (Multistate_Output_Out_Of_Service(rpdata->object_instance)) {
+                bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE,
+                    true);
+            } else {
+                bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE,
+                    false);
+            }
+            apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
+            break;
+        case PROP_EVENT_STATE:
+            /* note: see the details in the standard on how to use this */
+            apdu_len =
+                encode_application_enumerated(&apdu[0], EVENT_STATE_NORMAL);
+            break;
+        case PROP_OUT_OF_SERVICE:
+            state = MSO_Descr[object_index].Out_Of_Service;
+            apdu_len = encode_application_boolean(&apdu[0], state);
+            break;
+        case PROP_PRIORITY_ARRAY:
+            BACnet_encode_array(MSO_Descr[object_index].Present_Value,
+                                BACNET_MAX_PRIORITY,
+                                MSO_VALUE_IS_NULL,
+                                encode_application_unsigned);
+            break;
+//      case PROP_CURRENT_COMMAND_PRIORITY: {
+//          unsigned i = Multistate_Output_Current_Command_Priority(rpdata->object_instance);
+//          if (i == 0)  apdu_len = encode_application_null    (&apdu[0]);
+//          else         apdu_len = encode_application_unsigned(&apdu[0], i);
+//          break;
+//      }
+
+        case PROP_RELINQUISH_DEFAULT:
+            present_value = MSO_VALUE_RELINQUISH_DEFAULT;
+            apdu_len = encode_application_unsigned(&apdu[0], present_value);
+            break;
+        case PROP_NUMBER_OF_STATES:
+            apdu_len =
+                encode_application_unsigned(&apdu[apdu_len],
+                MSO_Descr[object_index].Number_Of_States);
+            break;
+        case PROP_STATE_TEXT:
+            BACnet_encode_array(MSO_Descr[object_index].State_Text,
+                                MSO_Descr[object_index].Number_Of_States,
+                                retfalse, BACnet_encode_character_string);
+            break;
+//      case PROP_PROPERTY_LIST:
+//          BACnet_encode_array(Multistate_Output_Properties_List,
+//                              property_list_count(Multistate_Output_Properties_List),
+//                              retfalse, encode_application_enumerated);
+//          break;
+        default:
+            rpdata->error_class = ERROR_CLASS_PROPERTY;
+            rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            apdu_len = BACNET_STATUS_ERROR;
+            break;
+    }
+    /*  only array properties can have array options */
+    if ((apdu_len >= 0) && (rpdata->object_property != PROP_STATE_TEXT) &&
+        (rpdata->object_property != PROP_PRIORITY_ARRAY) &&
+//      (rpdata->object_property != PROP_PROPERTY_LIST) &&
+        (rpdata->array_index != BACNET_ARRAY_ALL)) {
+        rpdata->error_class = ERROR_CLASS_PROPERTY;
+        rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        apdu_len = BACNET_STATUS_ERROR;
+    }
+
+    return apdu_len;
+}
+
+/* returns true if successful */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Multistate_Output_Write_Property(
+    BACNET_WRITE_PROPERTY_DATA * wp_data)
+{
+    bool status = false;        /* return value */
+    int len = 0;
+    unsigned object_index = 0;
+    BACNET_APPLICATION_DATA_VALUE value;
+
+    /* decode the some of the request */
+    len =
+        bacapp_decode_application_data(wp_data->application_data,
+        wp_data->application_data_len, &value);
+    /* FIXME: len < application_data_len: more data? */
+    if (len < 0) {
+        /* error while decoding - a value larger than we can handle */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+        return false;
+    }
+    if ((wp_data->object_property != PROP_STATE_TEXT) &&
+        (wp_data->object_property != PROP_PRIORITY_ARRAY) &&
+        (wp_data->array_index != BACNET_ARRAY_ALL)) {
+        /*  only array properties can have array options */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        return false;
+    }
+    /* No need to check whether object_index is within bounds.
+     * Has already been checked before Multistate_Output_Write_Property() is called
+     */
+    object_index = Multistate_Output_Instance_To_Index(wp_data->object_instance);
+
+    switch (wp_data->object_property) {
+        case PROP_PRESENT_VALUE:
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                status =
+                    Multistate_Output_Present_Value_Set
+                    (wp_data->object_instance, value.type.Unsigned_Int, wp_data->priority);
+                if (!status) {
+                    if (wp_data->priority == 6) {
+                        /* Command priority 6 is reserved for use by Minimum On/Off
+                           algorithm and may not be used for other purposes in any
+                           object. */
+                        wp_data->error_class = ERROR_CLASS_PROPERTY;
+                        wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+                    } else {
+                        wp_data->error_class = ERROR_CLASS_PROPERTY;
+                        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                    }
+                }
+            } else {
+                status =
+                    WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
+                    &wp_data->error_class, &wp_data->error_code);
+                if (status) {
+                    status =
+                        Multistate_Output_Present_Value_Relinquish
+                        (wp_data->object_instance, wp_data->priority);
+                }
+                if (!status) {
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
+                }
+            }
+            break;
+        case PROP_OUT_OF_SERVICE:
+        {
+            bool Previous_Out_Of_Service = MSO_Descr[object_index].Out_Of_Service;
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                MSO_Descr[object_index].Out_Of_Service = value.type.Boolean;
+                if (Previous_Out_Of_Service && !MSO_Descr[object_index].Out_Of_Service)
+                    /* We have just changed from Out_of_Service -> In Service */
+                    /* We need to update the Present_Value to the value
+                     * currently in the PLC...
+                     */
+                    MSO_Descr[object_index].Present_Value[BACNET_MAX_PRIORITY-1] =
+                                           *(MSO_Descr[object_index].Located_Var_ptr);
+            }
+            break;
+        }
+        case PROP_OBJECT_IDENTIFIER:
+        case PROP_OBJECT_NAME:
+        case PROP_OBJECT_TYPE:
+        case PROP_STATUS_FLAGS:
+        case PROP_EVENT_STATE:
+        case PROP_NUMBER_OF_STATES:
+        case PROP_PRIORITY_ARRAY:
+//      case PROP_CURRENT_COMMAND_PRIORITY:
+        case PROP_RELINQUISH_DEFAULT:
+        case PROP_DESCRIPTION:
+        case PROP_STATE_TEXT:
+//      case PROP_PROPERTY_LIST:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+            break;
+        default:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            break;
+    }
+
+    return status;
+}
+
+
+
+
+
+/********************************************/
+/** Functions required for Beremiz plugin  **/
+/********************************************/
+
+
+
+void  Multistate_Output_Copy_Present_Value_to_Located_Var(void) {
+    unsigned i;
+    for (i = 0; i < MAX_MULTISTATE_OUTPUTS; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (MSO_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        *(MSO_Descr[i].Located_Var_ptr) = Multistate_Output_Present_Value(MSO_Descr[i].Object_Identifier);
+    }
+}
+
+
+
+void  Multistate_Output_Copy_Located_Var_to_Present_Value(void) {
+    unsigned i;
+    for (i = 0; i < MAX_MULTISTATE_OUTPUTS; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (MSO_Descr[i].Out_Of_Service)
+            continue;
+
+        // Make sure local device does not set Present_Value to a value higher than Number_Of_States
+        /* NOTE: The following comparison (Present_Value > Number_Of_States) is OK as the
+         *       MSO_VALUE_NULL is currently set to 0. This means that the local controller
+         *       can safely relinquish control by setting the Present_Value to 0.
+         *       The comparison would not be safe if for some reason we later change
+         *       MSO_VALUE_NULL to a value that may be higher than Number_Of_States.
+         */
+        #if MSO_VALUE_NULL != 0
+        #error Implementation assumes that MSO_VALUE_NULL is set to 0, which is currently not the case.
+        #endif
+        if (*(MSO_Descr[i].Located_Var_ptr) > MSO_Descr[i].Number_Of_States)
+            continue;
+
+        // Everything seems to be OK. Copy the value
+        MSO_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1] = *(MSO_Descr[i].Located_Var_ptr);
+    }
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/mso.h	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,110 @@
+/**************************************************************************
+*
+* Copyright (C) 2012 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+#ifndef MULTISTATE_OUTPUT_H
+#define MULTISTATE_OUTPUT_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include "bacdef.h"
+#include "bacerror.h"
+#include "rp.h"
+#include "wp.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* MultiState Outputs are encoded in unsigned integer
+ * (in BACnet => uint8_t), and can not be 0.
+ * See ASHRAE 135-2016, section 12.20.4
+ */
+#define MULTISTATE_MAX_NUMBER_OF_STATES (255)
+
+
+    typedef struct Multistate_Output_descr {
+        /* pointer to IEC 61131-3 located variable that is mapped onto this BACnet object */
+        uint8_t *Located_Var_ptr;
+        uint32_t Object_Identifier;  /* called object 'Instance' in the source code! */
+        char    *Object_Name;   
+        char    *Description;
+        uint8_t  Number_Of_States;
+
+        /* stores the current value */
+        /* one entry per priority value */
+        uint8_t Present_Value[BACNET_MAX_PRIORITY];
+        /* Writable out-of-service allows others to manipulate our Present Value */
+        bool Out_Of_Service;
+        char State_Text[MULTISTATE_MAX_NUMBER_OF_STATES][64];
+    } MULTISTATE_OUTPUT_DESCR;
+
+
+    void Multistate_Output_Property_Lists(
+        const int **pRequired,
+        const int **pOptional,
+        const int **pProprietary);
+
+    bool Multistate_Output_Valid_Instance(
+        uint32_t object_instance);
+    unsigned Multistate_Output_Count(
+        void);
+    uint32_t Multistate_Output_Index_To_Instance(
+        unsigned index);
+    unsigned Multistate_Output_Instance_To_Index(
+        uint32_t instance);
+
+    int Multistate_Output_Read_Property(
+        BACNET_READ_PROPERTY_DATA * rpdata);
+
+    bool Multistate_Output_Write_Property(
+        BACNET_WRITE_PROPERTY_DATA * wp_data);
+
+    /* optional API */
+    bool Multistate_Output_Object_Name(
+        uint32_t object_instance,
+        BACNET_CHARACTER_STRING * object_name);
+
+    uint32_t Multistate_Output_Present_Value(
+        uint32_t object_instance);
+    bool Multistate_Output_Present_Value_Set(
+        uint32_t object_instance,
+        uint32_t value,
+        uint8_t  priority);
+
+    bool Multistate_Output_Out_Of_Service(
+        uint32_t object_instance);
+    void Multistate_Output_Out_Of_Service_Set(
+        uint32_t object_instance,
+        bool value);
+
+    void Multistate_Output_Init(
+        void);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/msv.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,666 @@
+/**************************************************************************
+*
+* Copyright (C) 2012 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+
+/* Multi-state Value Objects */
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "config_bacnet_for_beremiz_%(locstr)s.h"     /* the custom configuration for beremiz pluginh  */
+#include "bacdef.h"
+#include "bacdcode.h"
+#include "bacenum.h"
+#include "bacapp.h"
+#include "rp.h"
+#include "wp.h"
+#include "msv_%(locstr)s.h"
+#include "handlers.h"
+
+/* we choose to have a NULL level in our system represented by */
+/* a particular value.  When the priorities are not in use, they */
+/* will be relinquished (i.e. set to the NULL level). */
+/* Since multi state value objects can never take the value 0, we 
+ * use 0 as our NULL value.
+ * See ASHRAE 135-2016, section 12.20.4
+ */
+#define MSV_VALUE_NULL (0)
+#define MSV_VALUE_IS_NULL(x)  ((x) == MSV_VALUE_NULL)
+/* When all the priorities are level null, the present value returns */
+/* the Relinquish Default value */
+#define MSV_VALUE_RELINQUISH_DEFAULT 1
+
+
+
+/* The IEC 61131-3 located variables mapped onto the Multi-state Value objects of BACnet protocol */
+%(MSV_lvars)s
+
+
+/* The array where we keep all the state related to the Multi-state Value Objects */
+#define MAX_MULTISTATE_VALUES %(MSV_count)s
+static MULTISTATE_VALUE_DESCR MSV_Descr[MAX_MULTISTATE_VALUES] = {
+%(MSV_param)s
+};
+
+
+
+/* These three arrays are used by the ReadPropertyMultiple handler,
+ * as well as to initialize the XXX_Property_List used by the 
+ * Property List (PROP_PROPERTY_LIST) property.
+ */
+static const int Multistate_Value_Properties_Required[] = {
+ /* (1) Currently Supported                  */
+ /* (2) Required by standard ASHRAE 135-2016 */
+                                  /*(1)(2)      */
+    PROP_OBJECT_IDENTIFIER,       /* R  R ( 75) */
+    PROP_OBJECT_NAME,             /* R  R ( 77) */
+    PROP_OBJECT_TYPE,             /* R  R ( 79) */
+    PROP_PRESENT_VALUE,           /* W  R ( 85) */
+    PROP_STATUS_FLAGS,            /* R  R (111) */
+    PROP_EVENT_STATE,             /* R  R ( 36) */
+    PROP_OUT_OF_SERVICE,          /* W  R ( 81) */
+    PROP_NUMBER_OF_STATES,        /* R  R ( 74) */
+//  PROP_PROPERTY_LIST,           /* R  R (371) */
+    -1
+};
+
+static const int Multistate_Value_Properties_Optional[] = {
+    PROP_DESCRIPTION,             /* R  O ( 28) */
+    PROP_STATE_TEXT,              /* R  O (110) */
+    /* required if Present_Value is writable (which is true in our case!) */
+    PROP_PRIORITY_ARRAY,          /* R  O ( 87) */
+    PROP_RELINQUISH_DEFAULT,      /* R  O (104) */
+//  PROP_CURRENT_COMMAND_PRIORITY,/* R  O (431) */   
+    -1
+};
+
+static const int Multistate_Value_Properties_Proprietary[] = {
+    -1
+};
+
+
+/* This array stores the PROPERTY_LIST which may be read by clients.
+ * End of list is marked by following the last element with the value '-1'
+ * 
+ * It is initialized by Multistate_Value_Init() based off the values
+ * stored in Multistate_Value_Properties_Required 
+ *           Multistate_Value_Properties_Optional
+ *           Multistate_Value_Properties_Proprietary
+ */
+/* TODO: Allocate memory for this array with malloc() at startup */
+static int Multistate_Value_Properties_List[64];
+
+
+
+
+
+/********************************************************/
+/**                  Callback functions.               **/
+/** Functions required by BACnet devie implementation. **/
+/********************************************************/
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Multistate_Value_Property_Lists(
+    const int **pRequired,
+    const int **pOptional,
+    const int **pProprietary)
+{
+    if (pRequired)
+        *pRequired = Multistate_Value_Properties_Required;
+    if (pOptional)
+        *pOptional = Multistate_Value_Properties_Optional;
+    if (pProprietary)
+        *pProprietary = Multistate_Value_Properties_Proprietary;
+
+    return;
+}
+
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+void Multistate_Value_Init(
+    void)
+{
+    unsigned int i, j;
+
+    /* initialize the Multistate_Value_Properties_List array */
+    int len = 0;
+    len += BACnet_Init_Properties_List(Multistate_Value_Properties_List + len,
+                                       Multistate_Value_Properties_Required);
+    len += BACnet_Init_Properties_List(Multistate_Value_Properties_List + len,
+                                       Multistate_Value_Properties_Optional);
+    len += BACnet_Init_Properties_List(Multistate_Value_Properties_List + len,
+                                       Multistate_Value_Properties_Proprietary);
+
+    /* initialize all the analog output priority arrays to NULL */
+    for (i = 0; i < MAX_MULTISTATE_VALUES; i++) {
+        for (j = 0; j < BACNET_MAX_PRIORITY; j++) {
+            MSV_Descr[i].Present_Value[j] = MSV_VALUE_NULL;
+        }
+        for (j = 0; j < MSV_Descr[i].Number_Of_States; j++) {
+            sprintf(MSV_Descr[i].State_Text[j], "State %%d", j+1);
+        }
+    }
+    return;
+}
+
+
+
+/* validate that the given instance exists */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Multistate_Value_Valid_Instance(
+    uint32_t object_instance)
+{
+    // fprintf(stderr, "BACnet plugin: Multistate_Value_Valid_Instance(obj_ID=%%u) called!\n", object _instance);
+    return (Multistate_Value_Instance_To_Index(object_instance) < MAX_MULTISTATE_VALUES);
+}
+
+
+/* the number of Multistate Value Objects */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+unsigned Multistate_Value_Count(void) {return MAX_MULTISTATE_VALUES;}
+
+
+/* returns the instance (i.e. Object Identifier) that correlates to the correct index */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+uint32_t Multistate_Value_Index_To_Instance(unsigned index) {return MSV_Descr[index].Object_Identifier;}
+
+
+
+
+
+
+/* returns the index that correlates to the correct instance number (Object Identifier) */
+unsigned Multistate_Value_Instance_To_Index(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+  
+    for (index = 0; index < MAX_MULTISTATE_VALUES; index++)
+        if (object_instance == MSV_Descr[index].Object_Identifier)
+            return index;
+
+    /* error, this object ID is not in our list! */
+    return MAX_MULTISTATE_VALUES;
+}
+
+
+
+
+
+uint32_t Multistate_Value_Present_Value(
+    uint32_t object_instance)
+{
+    uint32_t value = MSV_VALUE_RELINQUISH_DEFAULT;
+    unsigned index = 0; /* offset from instance lookup */
+    unsigned i = 0;
+
+    index = Multistate_Value_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_VALUES) {
+        for (i = 0; i < BACNET_MAX_PRIORITY; i++) {
+            if (!MSV_VALUE_IS_NULL(MSV_Descr[index].Present_Value[i])) {
+                value = MSV_Descr[index].Present_Value[i];
+                break;
+            }
+        }
+    }
+
+    return value;
+}
+
+
+
+bool Multistate_Value_Present_Value_Set(
+    uint32_t object_instance,
+    uint32_t value,
+    uint8_t  priority)
+{
+    unsigned index = 0; /* offset from instance lookup */
+
+    index = Multistate_Value_Instance_To_Index(object_instance);
+    if (index >= MAX_MULTISTATE_VALUES)
+      return false;
+
+    if ((priority == 0) || (priority > BACNET_MAX_PRIORITY) ||
+        (priority == 6 /* reserved, ASHRAE 135-2016, section 19.2.2 */))
+      return false;
+    
+    if ((value == 0) || (value > MSV_Descr[index].Number_Of_States))
+      return false;
+      
+    priority--;
+    MSV_Descr[index].Present_Value[priority] = (uint8_t) value;
+
+    return true;
+}
+
+
+
+/* returns command priority (1..16), or 0 if all priority values are at NULL */
+int Multistate_Value_Current_Command_Priority(
+    uint32_t object_instance)
+{
+    unsigned index = 0;
+    unsigned i = 0;
+
+    index = Multistate_Value_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_VALUES) {
+        for (i = 0; i < BACNET_MAX_PRIORITY; i++) {
+            if (!MSV_VALUE_IS_NULL(MSV_Descr[index].Present_Value[i])) {
+                return i+1; // +1 since priority is 1..16, and not 0..15
+            }
+        }
+    }
+    // command values in all priorities are set to NULL
+    return 0;
+}
+
+
+
+
+bool Multistate_Value_Present_Value_Relinquish(
+    uint32_t object_instance,
+    uint8_t  priority)
+{
+    unsigned index = 0; /* offset from instance lookup */
+
+    index = Multistate_Value_Instance_To_Index(object_instance);
+    if (index >= MAX_MULTISTATE_VALUES)
+      return false;
+    
+    if ((priority == 0) || (priority > BACNET_MAX_PRIORITY) ||
+        (priority == 6 /* reserved, ASHRAE 135-2016, section 19.2.2 */))
+      return false;
+    
+    priority--;
+    MSV_Descr[index].Present_Value[priority] = MSV_VALUE_NULL;
+
+    return true;
+}
+
+
+
+bool Multistate_Value_Out_Of_Service(
+    uint32_t object_instance)
+{
+    bool value = false;
+    unsigned index = 0;
+
+    index = Multistate_Value_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_VALUES) {
+        value = MSV_Descr[index].Out_Of_Service;
+    }
+
+    return value;
+}
+
+
+
+void Multistate_Value_Out_Of_Service_Set(
+    uint32_t object_instance,
+    bool value)
+{
+    unsigned index = 0;
+
+    index = Multistate_Value_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_VALUES) {
+        MSV_Descr[index].Out_Of_Service = value;
+    }
+
+    return;
+}
+
+
+
+static char *Multistate_Value_Description(
+    uint32_t object_instance)
+{
+    unsigned index = 0; /* offset from instance lookup */
+    char *pName = NULL; /* return value */
+
+    index = Multistate_Value_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_VALUES) {
+        pName = MSV_Descr[index].Description;
+    }
+
+    return pName;
+}
+
+
+
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Multistate_Value_Object_Name(
+    uint32_t object_instance,
+    BACNET_CHARACTER_STRING * object_name)
+{
+    unsigned index = 0; /* offset from instance lookup */
+    bool status = false;
+
+    index = Multistate_Value_Instance_To_Index(object_instance);
+    if (index < MAX_MULTISTATE_VALUES) {
+        status = characterstring_init_ansi(object_name, MSV_Descr[index].Object_Name);
+    }
+
+    return status;
+}
+
+
+
+/* return apdu len, or BACNET_STATUS_ERROR on error */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+int Multistate_Value_Read_Property(
+    BACNET_READ_PROPERTY_DATA * rpdata)
+{
+    int len = 0;
+    int apdu_len = 0;   /* return value */
+    BACNET_BIT_STRING bit_string;
+    BACNET_CHARACTER_STRING char_string;
+    uint32_t present_value = 0;
+    unsigned object_index = 0;
+    unsigned i = 0;
+    bool state = false;
+    uint8_t *apdu = NULL;
+
+    if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
+        (rpdata->application_data_len == 0)) {
+        return 0;
+    }
+
+    object_index = Multistate_Value_Instance_To_Index(rpdata->object_instance);
+    if (object_index >= MAX_MULTISTATE_VALUES) {
+        rpdata->error_class = ERROR_CLASS_OBJECT;
+        rpdata->error_code  = ERROR_CODE_UNKNOWN_OBJECT;
+        return BACNET_STATUS_ERROR;
+    }
+
+    apdu = rpdata->application_data;
+    switch (rpdata->object_property) {
+        case PROP_OBJECT_IDENTIFIER:
+            apdu_len =
+                encode_application_object_id(&apdu[0],
+                OBJECT_MULTI_STATE_VALUE, rpdata->object_instance);
+            break;
+        case PROP_OBJECT_NAME:
+            Multistate_Value_Object_Name(rpdata->object_instance,
+                &char_string);
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_DESCRIPTION:
+            characterstring_init_ansi(&char_string,
+                Multistate_Value_Description(rpdata->object_instance));
+            apdu_len =
+                encode_application_character_string(&apdu[0], &char_string);
+            break;
+        case PROP_OBJECT_TYPE:
+            apdu_len =
+                encode_application_enumerated(&apdu[0],
+                OBJECT_MULTI_STATE_VALUE);
+            break;
+        case PROP_PRESENT_VALUE:
+            present_value =
+                Multistate_Value_Present_Value(rpdata->object_instance);
+            apdu_len = encode_application_unsigned(&apdu[0], present_value);
+            break;
+        case PROP_STATUS_FLAGS:
+            /* note: see the details in the standard on how to use these */
+            bitstring_init(&bit_string);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_IN_ALARM, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_FAULT, false);
+            bitstring_set_bit(&bit_string, STATUS_FLAG_OVERRIDDEN, false);
+            if (Multistate_Value_Out_Of_Service(rpdata->object_instance)) {
+                bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE,
+                    true);
+            } else {
+                bitstring_set_bit(&bit_string, STATUS_FLAG_OUT_OF_SERVICE,
+                    false);
+            }
+            apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
+            break;
+        case PROP_EVENT_STATE:
+            /* note: see the details in the standard on how to use this */
+            apdu_len =
+                encode_application_enumerated(&apdu[0], EVENT_STATE_NORMAL);
+            break;
+        case PROP_OUT_OF_SERVICE:
+            state = MSV_Descr[object_index].Out_Of_Service;
+            apdu_len = encode_application_boolean(&apdu[0], state);
+            break;
+        case PROP_PRIORITY_ARRAY:
+            BACnet_encode_array(MSV_Descr[object_index].Present_Value,
+                                BACNET_MAX_PRIORITY,
+                                MSV_VALUE_IS_NULL,
+                                encode_application_unsigned);
+            break;
+//      case PROP_CURRENT_COMMAND_PRIORITY: {
+//          unsigned i = Multistate_Value_Current_Command_Priority(rpdata->object_instance);
+//          if (i == 0)  apdu_len = encode_application_null    (&apdu[0]);
+//          else         apdu_len = encode_application_unsigned(&apdu[0], i);
+//          break;
+//      }
+        case PROP_RELINQUISH_DEFAULT:
+            present_value = MSV_VALUE_RELINQUISH_DEFAULT;
+            apdu_len = encode_application_unsigned(&apdu[0], present_value);
+            break;
+        case PROP_NUMBER_OF_STATES:
+            apdu_len =
+                encode_application_unsigned(&apdu[apdu_len],
+                MSV_Descr[object_index].Number_Of_States);
+            break;
+        case PROP_STATE_TEXT:
+            BACnet_encode_array(MSV_Descr[object_index].State_Text,
+                                MSV_Descr[object_index].Number_Of_States,
+                                retfalse, BACnet_encode_character_string);
+            break;
+//      case PROP_PROPERTY_LIST:
+//          BACnet_encode_array(Multistate_Value_Properties_List,
+//                              property_list_count(Multistate_Value_Properties_List),
+//                              retfalse, encode_application_enumerated);
+//          break;
+        default:
+            rpdata->error_class = ERROR_CLASS_PROPERTY;
+            rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            apdu_len = BACNET_STATUS_ERROR;
+            break;
+    }
+    /*  only array properties can have array options */
+    if ((apdu_len >= 0) && (rpdata->object_property != PROP_STATE_TEXT) &&
+        (rpdata->object_property != PROP_PRIORITY_ARRAY) &&
+//      (rpdata->object_property != PROP_PROPERTY_LIST) &&
+        (rpdata->array_index != BACNET_ARRAY_ALL)) {
+        rpdata->error_class = ERROR_CLASS_PROPERTY;
+        rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        apdu_len = BACNET_STATUS_ERROR;
+    }
+
+    return apdu_len;
+}
+
+/* returns true if successful */
+/* This is a callback function. Callback set in My_Object_Table[] array declared in device.c,  */
+bool Multistate_Value_Write_Property(
+    BACNET_WRITE_PROPERTY_DATA * wp_data)
+{
+    bool status = false;        /* return value */
+    int len = 0;
+    unsigned object_index = 0;
+    BACNET_APPLICATION_DATA_VALUE value;
+
+    /* decode the some of the request */
+    len =
+        bacapp_decode_application_data(wp_data->application_data,
+        wp_data->application_data_len, &value);
+    /* FIXME: len < application_data_len: more data? */
+    if (len < 0) {
+        /* error while decoding - a value larger than we can handle */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+        return false;
+    }
+    if ((wp_data->object_property != PROP_STATE_TEXT) &&
+        (wp_data->object_property != PROP_PRIORITY_ARRAY) &&
+        (wp_data->array_index != BACNET_ARRAY_ALL)) {
+        /*  only array properties can have array options */
+        wp_data->error_class = ERROR_CLASS_PROPERTY;
+        wp_data->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
+        return false;
+    }
+    /* No need to check whether object_index is within bounds.
+     * Has already been checked before Multistate_Output_Write_Property() is called
+     */
+    object_index = Multistate_Value_Instance_To_Index(wp_data->object_instance);
+
+    switch (wp_data->object_property) {
+        case PROP_PRESENT_VALUE:
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_UNSIGNED_INT,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                status =
+                    Multistate_Value_Present_Value_Set
+                    (wp_data->object_instance, value.type.Unsigned_Int, wp_data->priority);
+                if (!status) {
+                    if (wp_data->priority == 6) {
+                        /* Command priority 6 is reserved for use by Minimum On/Off
+                           algorithm and may not be used for other purposes in any
+                           object. */
+                        wp_data->error_class = ERROR_CLASS_PROPERTY;
+                        wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+                    } else {
+                        wp_data->error_class = ERROR_CLASS_PROPERTY;
+                        wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
+                    }
+                }
+            } else {
+                status =
+                    WPValidateArgType(&value, BACNET_APPLICATION_TAG_NULL,
+                    &wp_data->error_class, &wp_data->error_code);
+                if (status) {
+                    status =
+                        Multistate_Value_Present_Value_Relinquish
+                        (wp_data->object_instance, wp_data->priority);
+                }
+                if (!status) {
+                    wp_data->error_class = ERROR_CLASS_PROPERTY;
+                    wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
+                }
+            }
+            break;
+        case PROP_OUT_OF_SERVICE:
+        {
+            bool Previous_Out_Of_Service = MSV_Descr[object_index].Out_Of_Service;
+            status =
+                WPValidateArgType(&value, BACNET_APPLICATION_TAG_BOOLEAN,
+                &wp_data->error_class, &wp_data->error_code);
+            if (status) {
+                MSV_Descr[object_index].Out_Of_Service = value.type.Boolean;
+                if (Previous_Out_Of_Service && !MSV_Descr[object_index].Out_Of_Service)
+                    /* We have just changed from Out_of_Service -> In Service */
+                    /* We need to update the Present_Value to the value
+                     * currently in the PLC...
+                     */
+                    MSV_Descr[object_index].Present_Value[BACNET_MAX_PRIORITY-1] =
+                                           *(MSV_Descr[object_index].Located_Var_ptr);
+            }
+            break;
+        }
+        case PROP_OBJECT_IDENTIFIER:
+        case PROP_OBJECT_NAME:
+        case PROP_OBJECT_TYPE:
+        case PROP_STATUS_FLAGS:
+        case PROP_EVENT_STATE:
+        case PROP_NUMBER_OF_STATES:
+        case PROP_PRIORITY_ARRAY:
+//      case PROP_CURRENT_COMMAND_PRIORITY:
+        case PROP_RELINQUISH_DEFAULT:
+        case PROP_DESCRIPTION:
+        case PROP_STATE_TEXT:
+//      case PROP_PROPERTY_LIST:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
+            break;
+        default:
+            wp_data->error_class = ERROR_CLASS_PROPERTY;
+            wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
+            break;
+    }
+
+    return status;
+}
+
+
+
+
+
+/********************************************/
+/** Functions required for Beremiz plugin  **/
+/********************************************/
+
+
+
+void  Multistate_Value_Copy_Present_Value_to_Located_Var(void) {
+    unsigned i;
+    for (i = 0; i < MAX_MULTISTATE_VALUES; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (MSV_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        *(MSV_Descr[i].Located_Var_ptr) = Multistate_Value_Present_Value(MSV_Descr[i].Object_Identifier);
+    }
+}
+
+
+
+void  Multistate_Value_Copy_Located_Var_to_Present_Value(void) {
+    unsigned i;
+    for (i = 0; i < MAX_MULTISTATE_VALUES; i++) {
+        // decouple PLC's Located Variable from Bacnet Object's Present Value if Out_Of_Service is true
+        if (MSV_Descr[i].Out_Of_Service)
+            continue;
+
+        // copy the value
+        // Make sure local device does not set Present_Value to a value higher than Number_Of_States
+        /* NOTE: The following comparison (Present_Value > Number_Of_States) is OK as the
+         *       MSV_VALUE_NULL is currently set to 0. This means that the local controller
+         *       can safely relinquish control by setting the Present_Value to 0.
+         *       The comparison would not be safe if for some reason we later change
+         *       MSV_VALUE_NULL to a value that may be higher than Number_Of_States.
+         */
+        #if MSV_VALUE_NULL != 0
+        #error Implementation assumes that MSV_VALUE_NULL is set to 0, which is currently not the case.
+        #endif
+        if (*(MSV_Descr[i].Located_Var_ptr) > MSV_Descr[i].Number_Of_States)
+            continue;
+
+        // Everything seems to be OK. Copy the value
+        MSV_Descr[i].Present_Value[BACNET_MAX_PRIORITY-1] = *(MSV_Descr[i].Located_Var_ptr);
+    }
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/msv.h	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,110 @@
+/**************************************************************************
+*
+* Copyright (C) 2012 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+#ifndef MULTISTATE_VALUE_H
+#define MULTISTATE_VALUE_H
+
+#include <stdbool.h>
+#include <stdint.h>
+#include "bacdef.h"
+#include "bacerror.h"
+#include "rp.h"
+#include "wp.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* MultiState Values are encoded in unsigned integer
+ * (in BACnet => uint8_t), and can not be 0.
+ * See ASHRAE 135-2016, section 12.20.4
+ */
+#define MULTISTATE_MAX_NUMBER_OF_STATES (255)
+
+
+    typedef struct multistate_value_descr {
+        /* pointer to IEC 61131-3 located variable that is mapped onto this BACnet object */
+        uint8_t *Located_Var_ptr;
+        uint32_t Object_Identifier;  /* called object 'Instance' in the source code! */
+        char    *Object_Name;   
+        char    *Description;
+        uint8_t  Number_Of_States;
+
+        /* stores the current value */
+        /* one entry per priority value */
+        uint8_t Present_Value[BACNET_MAX_PRIORITY];
+        /* Writable out-of-service allows others to manipulate our Present Value */
+        bool Out_Of_Service;
+        char State_Text[MULTISTATE_MAX_NUMBER_OF_STATES][64];
+    } MULTISTATE_VALUE_DESCR;
+
+
+    void Multistate_Value_Property_Lists(
+        const int **pRequired,
+        const int **pOptional,
+        const int **pProprietary);
+
+    bool Multistate_Value_Valid_Instance(
+        uint32_t object_instance);
+    unsigned Multistate_Value_Count(
+        void);
+    uint32_t Multistate_Value_Index_To_Instance(
+        unsigned index);
+    unsigned Multistate_Value_Instance_To_Index(
+        uint32_t instance);
+
+    int Multistate_Value_Read_Property(
+        BACNET_READ_PROPERTY_DATA * rpdata);
+
+    bool Multistate_Value_Write_Property(
+        BACNET_WRITE_PROPERTY_DATA * wp_data);
+
+    /* optional API */
+    bool Multistate_Value_Object_Name(
+        uint32_t object_instance,
+        BACNET_CHARACTER_STRING * object_name);
+
+    uint32_t Multistate_Value_Present_Value(
+        uint32_t object_instance);
+    bool Multistate_Value_Present_Value_Set(
+        uint32_t object_instance,
+        uint32_t value,
+        uint8_t  priority);
+
+    bool Multistate_Value_Out_Of_Service(
+        uint32_t object_instance);
+    void Multistate_Value_Out_Of_Service_Set(
+        uint32_t object_instance,
+        bool value);
+
+    void Multistate_Value_Init(
+        void);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/server.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,663 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <time.h>
+#include <inttypes.h>  // uint32_t, ..., PRIu32, ...
+
+#include "config_bacnet_for_beremiz_%(locstr)s.h"     /* the custom configuration for beremiz pluginh  */
+#include "server_%(locstr)s.h"
+#include "address.h"
+#include "bacdef.h"
+#include "handlers.h"
+#include "client.h"
+#include "dlenv.h"
+#include "bacdcode.h"
+#include "npdu.h"
+#include "apdu.h"
+#include "iam.h"
+#include "tsm.h"
+#include "datalink.h"
+#include "dcc.h"
+#include "getevent.h"
+#include "net.h"
+#include "txbuf.h"
+#include "version.h"
+#include "timesync.h"
+
+
+/* A utility function used by most (all?) implementations of BACnet Objects */
+/* Adds to Prop_List all entries in Prop_List_XX that are not
+ * PROP_OBJECT_IDENTIFIER, PROP_OBJECT_NAME, PROP_OBJECT_TYPE, PROP_PROPERTY_LIST
+ * and returns the number of elements that were added
+ */
+int BACnet_Init_Properties_List(
+          int *Prop_List, 
+    const int *Prop_List_XX) {
+  
+    unsigned int i = 0;
+    unsigned int j = 0;
+    
+    for (j = 0; Prop_List_XX[j] >= 0; j++)
+        // Add any propety, except for the following 4 which should not be included
+        // in the Property_List property array.
+        //  (see ASHRAE 135-2016, for example section 12.4.34)
+        if ((Prop_List_XX[j] != PROP_OBJECT_IDENTIFIER) &&
+            (Prop_List_XX[j] != PROP_OBJECT_NAME)       &&
+            (Prop_List_XX[j] != PROP_OBJECT_TYPE)       &&
+            (Prop_List_XX[j] != PROP_PROPERTY_LIST)) {
+            Prop_List[i] = Prop_List_XX[j];
+            i++;
+        }
+    Prop_List[i] = -1; // marks the end of the list!
+    return i;
+}
+
+
+
+
+
+
+int BACnet_encode_character_string(uint8_t *apdu, const char *str) {
+    BACNET_CHARACTER_STRING   char_string;
+    characterstring_init_ansi(&char_string, str);
+    /* FIXME: this might go beyond MAX_APDU length! */
+    return encode_application_character_string(apdu, &char_string);
+}
+
+/* macro that always returns false.
+ * To be used as the 'test_null' parameter to the BACnet_encode_array macro
+ * in situations where we should never encode_null() values.
+ */
+#define retfalse(x) (false)
+
+#define BACnet_encode_array(array, array_len, test_null, encode_function)                  \
+{                                                                                           \
+    uint8_t *apdu = NULL;                                                                   \
+    apdu = rpdata->application_data;                                                        \
+                                                                                            \
+    switch (rpdata->array_index) {                                                          \
+      case 0: /* Array element zero is the number of elements in the array */               \
+        apdu_len = encode_application_unsigned(&apdu[0], array_len);                        \
+        break;                                                                              \
+      case BACNET_ARRAY_ALL: {                                                              \
+        /* if no index was specified, then try to encode the entire list */                 \
+        unsigned i = 0;                                                                     \
+        apdu_len   = 0;                                                                     \
+        for (i = 0; i < array_len; i++) {                                                   \
+            /* FIXME: this might go beyond MAX_APDU length! */                              \
+            if (!test_null(array[i]))                                                       \
+                  apdu_len += encode_function        (&apdu[apdu_len], array[i]);           \
+            else  apdu_len += encode_application_null(&apdu[apdu_len]);                     \
+            /* return error if it does not fit in the APDU */                               \
+            if (apdu_len >= MAX_APDU) {                                                     \
+                rpdata->error_class = ERROR_CLASS_SERVICES;                                 \
+                rpdata->error_code = ERROR_CODE_NO_SPACE_FOR_OBJECT;                        \
+                apdu_len = BACNET_STATUS_ERROR;                                             \
+                break; /* for(;;) */                                                        \
+            }                                                                               \
+        }                                                                                   \
+        break;                                                                              \
+      }                                                                                     \
+      default:                                                                              \
+        if (rpdata->array_index <= array_len) {                                             \
+            if (!test_null(array[rpdata->array_index - 1]))                                 \
+                  apdu_len += encode_function(&apdu[0], array[rpdata->array_index - 1]);    \
+            else  apdu_len += encode_application_null(&apdu[0]);                            \
+        } else {                                                                            \
+            rpdata->error_class = ERROR_CLASS_PROPERTY;                                     \
+            rpdata->error_code = ERROR_CODE_INVALID_ARRAY_INDEX;                            \
+            apdu_len = BACNET_STATUS_ERROR;                                                 \
+        }                                                                                   \
+        break;                                                                              \
+    } /* switch() */                                                                        \
+}
+
+
+/* include the device object */
+#include "device_%(locstr)s.c"
+#include "ai_%(locstr)s.c"
+#include "ao_%(locstr)s.c"
+#include "av_%(locstr)s.c"
+#include "bi_%(locstr)s.c"
+#include "bo_%(locstr)s.c"
+#include "bv_%(locstr)s.c"
+#include "msi_%(locstr)s.c"
+#include "mso_%(locstr)s.c"
+#include "msv_%(locstr)s.c"
+
+
+/** Buffer used for receiving */
+static uint8_t Rx_Buf[MAX_MPDU] = { 0 };
+
+
+
+
+/*******************************************************/
+/* BACnet Service Handlers taylored to Beremiz plugin  */ 
+/*******************************************************/
+
+static void BACNET_show_date_time(
+    BACNET_DATE * bdate,
+    BACNET_TIME * btime)
+{
+    /* show the date received */
+    fprintf(stderr, "%%u", (unsigned) bdate->year);
+    fprintf(stderr, "/%%u", (unsigned) bdate->month);
+    fprintf(stderr, "/%%u", (unsigned) bdate->day);
+    /* show the time received */
+    fprintf(stderr, " %%02u", (unsigned) btime->hour);
+    fprintf(stderr, ":%%02u", (unsigned) btime->min);
+    fprintf(stderr, ":%%02u", (unsigned) btime->sec);
+    fprintf(stderr, ".%%02u", (unsigned) btime->hundredths);
+    fprintf(stderr, "\r\n");
+}
+
+static time_t __timegm(struct tm *new_time) {
+    time_t     sec =  mktime(new_time);  /* assume new_time is in local time */
+    
+    /* sec will be an aproximation of the correct value. 
+     * We must now fix this with the current difference
+     * between UTC and localtime.
+     * 
+     * WARNING: The following algorithm to determine the current
+     *          difference between local time and UTC will not 
+     *          work if each value (lcl and utc) falls on a different
+     *          side of a change to/from DST.
+     *          For example, assume a change to DST is made at 12h00 
+     *          of day X. The following algorithm does not work if:
+     *            - lcl falls before 12h00 of day X
+     *            - utc falls after  12h00 of day X
+     */
+    struct  tm lcl = *localtime(&sec); // lcl will be == new_time
+    struct  tm utc = *gmtime   (&sec);
+    
+    if (lcl.tm_isdst == 1)  utc.tm_isdst = 1;
+    
+    time_t sec_lcl =  mktime(&lcl);
+    time_t sec_utc =  mktime(&utc);
+
+    /* difference in seconds between localtime and utc */
+    time_t sec_dif = sec_lcl - sec_utc;
+    return sec + sec_dif;
+}
+
+
+static void BACNET_set_date_time(
+    BACNET_DATE * bdate,
+    BACNET_TIME * btime,
+    int utc /* set to > 0 if date & time in UTC */)
+{
+    struct tm       brokendown_time;
+    time_t          seconds = 0;
+    struct timespec ts;
+
+    brokendown_time.tm_sec   = btime->sec;        /* seconds 0..60    */
+    brokendown_time.tm_min   = btime->min;        /* minutes 0..59    */
+    brokendown_time.tm_hour  = btime->hour;       /* hours   0..23    */
+    brokendown_time.tm_mday  = bdate->day;        /* day of the month 1..31 */
+    brokendown_time.tm_mon   = bdate->month-1;    /* month 0..11      */
+    brokendown_time.tm_year  = bdate->year-1900;  /* years since 1900 */
+//  brokendown_time.tm_wday  = ;                  /* day of the week  */
+//  brokendown_time.tm_yday  = ;                  /* day in the year  */
+    brokendown_time.tm_isdst = -1;                /* daylight saving time (-1 => unknown) */
+
+    // Tranform time into format -> 'seconds since epoch'
+    /* WARNING: timegm() is a non standard GNU extension.
+     *          If you do not have it on your build system then consider
+     *          finding the source code for timegm() (it is LGPL) from GNU
+     *          C library and copying it here 
+     *          (e.g. https://code.woboq.org/userspace/glibc/time/timegm.c.html)
+     *          Another alternative is to use the fundion __timegm() above,
+     *          which will mostly work but may have errors when the time being 
+     *          converted is close to the time in the year when changing 
+     *          to/from DST (daylight saving time)
+     */
+    if (utc > 0) seconds = timegm(&brokendown_time);    
+    else         seconds = mktime(&brokendown_time);
+
+    ts.tv_sec  = seconds;
+    ts.tv_nsec = btime->hundredths*10*1000*1000;
+
+//  fprintf(stderr, "clock_settime() s=%%ul,  ns=%%u\n", ts.tv_sec, ts.tv_nsec);
+    clock_settime(CLOCK_REALTIME, &ts); 
+//  clock_gettime(CLOCK_REALTIME, &ts); 
+//  fprintf(stderr, "clock_gettime() s=%%ul,  ns=%%u\n", ts.tv_sec, ts.tv_nsec);
+}
+
+
+
+void BACnet_handler_timesync(
+    uint8_t * service_request,
+    uint16_t service_len,
+    BACNET_ADDRESS * src)
+{
+    int len = 0;
+    BACNET_DATE bdate;
+    BACNET_TIME btime;
+
+    (void) src;
+    (void) service_len;
+    len =
+        timesync_decode_service_request(service_request, service_len, &bdate, &btime);
+    if (len > 0) {
+        fprintf(stderr, "BACnet plugin: Received TimeSyncronization Request -> ");
+        BACNET_show_date_time(&bdate, &btime);
+        /* set the time */
+        BACNET_set_date_time(&bdate, &btime, 0 /* time in local time */);
+    }
+
+    return;
+}
+
+void BACnet_handler_timesync_utc(
+    uint8_t * service_request,
+    uint16_t service_len,
+    BACNET_ADDRESS * src)
+{
+    int len = 0;
+    BACNET_DATE bdate;
+    BACNET_TIME btime;
+
+    (void) src;
+    (void) service_len;
+    len =
+        timesync_decode_service_request(service_request, service_len, &bdate, &btime);
+    if (len > 0) {
+        fprintf(stderr, "BACnet plugin: Received TimeSyncronizationUTC Request -> ");
+        BACNET_show_date_time(&bdate, &btime);
+        /* set the time */
+        BACNET_set_date_time(&bdate, &btime, 1 /* time in UTC */);
+    }
+
+    return;
+}
+
+
+
+/**********************************************/
+/** Initialize the handlers we will utilize. **/
+/**********************************************/
+/*
+ * TLDR: The functions that will create the __Resp.__ messages.
+ * 
+ * The service handlers are the functions that will respond to BACnet requests this device receives.
+ * In essence, the service handlers will create and send the Resp. (Response) messages
+ * of the Req. -> Ind. -> Resp. -> Conf. service sequence defined in OSI
+ * (Request, Indication, Response, Confirmation)
+ * 
+ */
+static int Init_Service_Handlers(
+    void)
+{
+    /* set the handler for all the services we don't implement */
+    /* It is required to send the proper reject message... */
+    apdu_set_unrecognized_service_handler_handler(handler_unrecognized_service);
+
+    /* Set the handlers for any unconfirmed services that we support. */
+    apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_WHO_IS,  // DM-DDB-B - Dynamic Device Binding B (Resp.)
+                                   handler_who_is);           //            (see ASHRAE 135-2016, section K5.1 and K5.2)
+//  apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_I_AM,    // DM-DDB-A - Dynamic Device Binding A (Resp.)
+//                                 handler_i_am_bind);        //            Responding to I_AM requests is for clients (A)!
+//                                                            //            (see ASHRAE 135-2016, section K5.1 and K5.2)
+    apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_WHO_HAS, // DM-DOB-B - Dynamic Object Binding B (Resp.)
+                                   handler_who_has);          //            (see ASHRAE 135-2016, section K5.3 and K5.4)
+//  apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_I_HAVE,  // DM-DOB-A - Dynamic Object Binding A (Resp.)
+//                                 handler_i_have);           //            Responding to I_HAVE requests is for clients (A)!
+//                                                            //            (see ASHRAE 135-2016, section K5.3 and K5.4)
+    apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_UTC_TIME_SYNCHRONIZATION, // DM-UTC-B -UTCTimeSynchronization-B (Resp.)
+                                 BACnet_handler_timesync_utc);                 //            (see ASHRAE 135-2016, section K5.14)
+    apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_TIME_SYNCHRONIZATION,     // DM-TS-B - TimeSynchronization-B (Resp.)
+                                 BACnet_handler_timesync);                     //            (see ASHRAE 135-2016, section K5.12)
+
+    /* Set the handlers for any confirmed services that we support. */
+    apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROPERTY,      // DS-RP-B - Read Property B (Resp.)
+                                 handler_read_property);             //            (see ASHRAE 135-2016, section K1.2)
+//  apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROP_MULTIPLE, // DS-RPM-B -Read Property Multiple-B (Resp.)
+//                               handler_read_property_multiple);    //            (see ASHRAE 135-2016, section K1.4)
+    apdu_set_confirmed_handler(SERVICE_CONFIRMED_WRITE_PROPERTY,     // DS-WP-B - Write Property B (Resp.)
+                                 handler_write_property);            //            (see ASHRAE 135-2016, section K1.8)
+//  apdu_set_confirmed_handler(SERVICE_CONFIRMED_WRITE_PROP_MULTIPLE,// DS-WPM-B -Write Property Multiple B (Resp.)
+//                               handler_write_property_multiple);   //            (see ASHRAE 135-2016, section K1.10)
+//  apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_RANGE,
+//                               handler_read_range);
+//  apdu_set_confirmed_handler(SERVICE_CONFIRMED_REINITIALIZE_DEVICE,
+//                               handler_reinitialize_device);
+    
+//  apdu_set_confirmed_handler(SERVICE_CONFIRMED_SUBSCRIBE_COV,
+//                               handler_cov_subscribe);
+//  apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_COV_NOTIFICATION,
+//                               handler_ucov_notification);
+    /* handle communication so we can shutup when asked */
+    apdu_set_confirmed_handler(SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL, // DM-DCC-B - Device Communication Control B
+                                 handler_device_communication_control);        //            (see ASHRAE 135-2016, section K5.6)
+//  /* handle the data coming back from private requests */
+//  apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_PRIVATE_TRANSFER,
+//                               handler_unconfirmed_private_transfer);
+    
+    // success
+    return 0;
+}
+
+
+
+static int Init_Network_Interface(
+    const char *interface,    // for linux:   /dev/eth0, /dev/eth1, /dev/wlan0, ...
+                              // for windows: 192.168.0.1 (IP addr. of interface)
+                              // NULL => use default!
+    const char *port,         // Port the server will listen on. (NULL => use default)
+    const char *apdu_timeout, // (NULL => use default)
+    const char *apdu_retries  // (NULL => use default)
+   )
+{
+    char datalink_layer[4];
+
+    strcpy(datalink_layer, "BIP"); // datalink_set() does not accpet const char *, so we copy it...
+//  BIP_Debug = true;
+
+    if (port != NULL) {
+        bip_set_port(htons((uint16_t) strtol(port, NULL, 0)));
+    } else {
+            bip_set_port(htons(0xBAC0));
+    }
+    
+    if (apdu_timeout != NULL) {
+        apdu_timeout_set((uint16_t) strtol(apdu_timeout, NULL, 0));
+    }
+
+    if (apdu_retries != NULL) {
+        apdu_retries_set((uint8_t) strtol(apdu_retries, NULL, 0));
+    }
+
+    // datalink_init is a pointer that will actually call bip_init()
+    // datalink_init pointer is set by the call datalink_set("BIP")
+    /* NOTE: current implementation of BACnet stack uses the interface
+     *       only to determine the server's local IP address and broacast address.
+     *       The local IP addr is later used to discard (broadcast) messages
+     *       it receives that were sent by itself.
+     *       The broadcast IP addr is used for broadcast messages.
+     *       WARNING: The socket itself is created to listen on all 
+     *       available interfaces (INADDR_ANY), so this setting may induce
+     *       the user in error as we will accept messages arriving on other
+     *       interfaces (if they exist)
+     *       (see bip_init() in ports/linux/bip-init.c)
+     *       (see bip_****() in src/bip.c)
+     */
+    char *tmp = (char *)malloc(strlen(interface) + 1);
+    if (tmp == NULL) return -1;
+    strncpy(tmp, interface, strlen(interface) + 1);
+    if (!datalink_init(tmp)) {
+        return -1;
+    }
+// #if (MAX_TSM_TRANSACTIONS)
+//     pEnv = getenv("BACNET_INVOKE_ID");
+//     if (pEnv) {
+//         tsm_invokeID_set((uint8_t) strtol(pEnv, NULL, 0));
+//     }
+// #endif
+    dlenv_register_as_foreign_device();
+    
+    // success
+    return 0;
+}
+
+
+// This mutex blocks execution of __init_%(locstr)s() until initialization is done
+static int init_done = 0;
+static pthread_mutex_t init_done_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t init_done_cond = PTHREAD_COND_INITIALIZER;
+
+/** Main function of server demo. **/
+int bn_server_run(server_node_t *server_node) {
+    int res = 0;
+    BACNET_ADDRESS src = {0};  /* address where message came from */
+    uint16_t pdu_len = 0;
+    unsigned timeout = 1000;       /* milliseconds */
+    time_t last_seconds = 0;
+    time_t current_seconds = 0;
+    uint32_t elapsed_seconds = 0;
+    uint32_t elapsed_milliseconds = 0;
+    uint32_t address_binding_tmr = 0;
+    uint32_t recipient_scan_tmr = 0;
+
+    /* allow the device ID to be set */
+    Device_Set_Object_Instance_Number(server_node->device_id);
+    /* load any static address bindings in our device bindings list */
+    address_init();
+    /* load any entries in the BDT table from backup file */
+    bvlc_bdt_restore_local();
+    /* Initiliaze the bacnet server 'device' */    
+    Device_Init(server_node->device_name);
+
+    pthread_mutex_lock(&init_done_lock);
+    init_done = 1;
+    pthread_cond_signal(&init_done_cond);
+    pthread_mutex_unlock(&init_done_lock);
+
+    /* Set the password (max 31 chars) for Device Communication Control request. */
+    /* Default in the BACnet stack is hardcoded as "filister" */
+    /* (char *) cast is to remove the cast. The function is incorrectly declared/defined in the BACnet stack! */
+    /* BACnet stack needs to change demo/handler/h_dcc.c and include/handlers.h                               */
+    handler_dcc_password_set((char *)server_node->comm_control_passwd);
+    /* Set callbacks and configure network interface */
+    res = Init_Service_Handlers();
+    if (res < 0) exit(1);
+    res = Init_Network_Interface(
+            server_node->network_interface, // interface    (NULL => use default (eth0))
+            server_node->port_number,       // Port number  (NULL => use default (0xBAC0))
+            NULL,              // apdu_timeout (NULL => use default)
+            NULL               // apdu_retries (NULL => use default)
+           );
+    if (res < 0) {
+        fprintf(stderr, "BACnet plugin: error initializing bacnet server node %%s!\n", server_node->location);
+        exit(1); // kill the server thread!
+    }
+    /* BACnet stack correcly configured. Give user some feedback! */
+    struct in_addr my_addr, broadcast_addr;
+    my_addr.       s_addr = bip_get_addr();
+    broadcast_addr.s_addr = bip_get_broadcast_addr();
+    printf("BACnet plugin:"
+                         " Local IP addr: %%s" 
+                        ", Broadcast IP addr: %%s" 
+                        ", Port number: 0x%%04X [%%hu]" 
+                        ", BACnet Device ID: %%d"
+                        ", Max APDU: %%d"
+                        ", BACnet Stack Version %%s\n",
+                        inet_ntoa(my_addr),
+                        inet_ntoa(broadcast_addr),
+                        ntohs(bip_get_port()), ntohs(bip_get_port()),
+                        Device_Object_Instance_Number(), 
+                        MAX_APDU,
+                        Device_Firmware_Revision()
+                        );
+    /* configure the timeout values */
+    last_seconds = time(NULL);
+    /* broadcast an I-Am on startup */
+    Send_I_Am(&Handler_Transmit_Buffer[0]);
+    /* loop forever */
+    for (;;) {
+        /* input */
+        current_seconds = time(NULL);
+
+        /* returns 0 bytes on timeout */
+        pdu_len = datalink_receive(&src, &Rx_Buf[0], MAX_MPDU, timeout);
+
+        /* process */
+        if (pdu_len) {
+            npdu_handler(&src, &Rx_Buf[0], pdu_len);
+        }
+        /* at least one second has passed */
+        elapsed_seconds = (uint32_t) (current_seconds - last_seconds);
+        if (elapsed_seconds) {
+            last_seconds = current_seconds;
+            dcc_timer_seconds(elapsed_seconds);
+            //bvlc_maintenance_timer(elapsed_seconds); // already called by dlenv_maintenance_timer() => do _not_ call here!
+            dlenv_maintenance_timer(elapsed_seconds);
+            elapsed_milliseconds = elapsed_seconds * 1000;
+            tsm_timer_milliseconds(elapsed_milliseconds);
+        }
+        handler_cov_task();
+        /* scan cache address */
+        address_binding_tmr += elapsed_seconds;
+        if (address_binding_tmr >= 60) {
+            address_cache_timer(address_binding_tmr);
+            address_binding_tmr = 0;
+        }
+    }
+
+    /* should never occur!! */
+    return 0;
+}
+
+
+
+
+
+#include <pthread.h>
+
+static void *__bn_server_thread(void *_server_node)  {
+	server_node_t *server_node = _server_node;
+
+	// Enable thread cancelation. Enabled is default, but set it anyway to be safe.
+	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+
+	// bn_server_run() should never return!
+	bn_server_run(server_node);
+	fprintf(stderr, "BACnet plugin: bacnet server for node %%s died unexpectedly!\n", server_node->location); /* should never occur */
+	return NULL;
+}
+
+
+int __cleanup_%(locstr)s ();
+
+int __init_%(locstr)s (int argc, char **argv){
+	int index;
+
+    init_done = 0;
+	/* init each local server */
+	/* NOTE: All server_nodes[].init_state are initialised to 0 in the code 
+	 *       generated by the BACnet plugin 
+	 */
+	/* create the BACnet server */
+	server_node.init_state = 1; // we have created the node
+	
+	/* launch a thread to handle this server node */
+	{
+		int res = 0;
+		pthread_attr_t attr;
+		res |= pthread_attr_init(&attr);
+		res |= pthread_create(&(server_node.thread_id), &attr, &__bn_server_thread, (void *)&(server_node));
+		if (res !=  0) {
+			fprintf(stderr, "BACnet plugin: Error starting bacnet server thread for node %%s\n", server_node.location);
+			goto error_exit;
+		}
+	}
+
+    pthread_mutex_lock(&init_done_lock);
+    while (!init_done) {
+        pthread_cond_wait(&init_done_cond, &init_done_lock);
+    }
+    pthread_mutex_unlock(&init_done_lock);
+
+	server_node.init_state = 2; // we have created the node and thread
+
+	return 0;
+	
+error_exit:
+	__cleanup_%(locstr)s ();
+	return -1;
+}
+
+
+
+
+
+void __publish_%(locstr)s (){
+       Analog_Value_Copy_Located_Var_to_Present_Value();
+       Analog_Input_Copy_Located_Var_to_Present_Value();
+      Analog_Output_Copy_Located_Var_to_Present_Value();
+       Binary_Value_Copy_Located_Var_to_Present_Value();
+       Binary_Input_Copy_Located_Var_to_Present_Value();
+      Binary_Output_Copy_Located_Var_to_Present_Value();
+   Multistate_Value_Copy_Located_Var_to_Present_Value();
+   Multistate_Input_Copy_Located_Var_to_Present_Value();
+  Multistate_Output_Copy_Located_Var_to_Present_Value();
+}
+
+
+
+
+
+void __retrieve_%(locstr)s (){
+       Analog_Value_Copy_Present_Value_to_Located_Var();
+       Analog_Input_Copy_Present_Value_to_Located_Var();
+      Analog_Output_Copy_Present_Value_to_Located_Var();
+       Binary_Value_Copy_Present_Value_to_Located_Var();
+       Binary_Input_Copy_Present_Value_to_Located_Var();
+      Binary_Output_Copy_Present_Value_to_Located_Var();
+   Multistate_Value_Copy_Present_Value_to_Located_Var();
+   Multistate_Input_Copy_Present_Value_to_Located_Var();
+  Multistate_Output_Copy_Present_Value_to_Located_Var();
+}
+
+
+
+
+
+int __cleanup_%(locstr)s (){
+	int index, close;
+	int res = 0;
+
+	/* kill thread and close connections of each modbus server node */
+	close = 0;
+	if (server_node.init_state >= 2) {
+		// thread was launched, so we try to cancel it!
+		close  = pthread_cancel(server_node.thread_id);
+		close |= pthread_join  (server_node.thread_id, NULL);
+		if (close < 0)
+			fprintf(stderr, "BACnet plugin: Error closing thread for bacnet server %%s\n", server_node.location);
+	}
+	res |= close;
+
+	close = 0;
+	if (server_node.init_state >= 1) {
+		// bacnet server node was created, so we try to close it!
+		// datalink_cleanup is a pointer that will actually call bip_cleanup()
+		// datalink_cleanup pointer is set by the call datalink_set("BIP")
+		datalink_cleanup();
+	}
+	res |= close;
+	server_node.init_state = 0;
+
+	/* bacnet library close */
+	// Nothing to do ???
+
+	return res;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bacnet/runtime/server.h	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,61 @@
+/**************************************************************************
+*
+* Copyright (C) 2006 Steve Karg <skarg@users.sourceforge.net>
+* Copyright (C) 2017 Mario de Sousa <msousa@fe.up.pt>
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files (the
+* "Software"), to deal in the Software without restriction, including
+* without limitation the rights to use, copy, modify, merge, publish,
+* distribute, sublicense, and/or sell copies of the Software, and to
+* permit persons to whom the Software is furnished to do so, subject to
+* the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*
+*********************************************************************/
+
+#ifndef SERVER_H_
+#define SERVER_H_
+
+
+#include <stddef.h>
+#include <stdint.h>
+
+
+
+typedef struct{
+	    const char *location;
+	    const char *network_interface;
+	    const char *port_number;
+	    const char *device_name;
+	    const char *comm_control_passwd;
+	    uint32_t	device_id; // device ID is 22 bits long! uint16_t is not enough!
+	    int		init_state; // store how far along the server's initialization has progressed
+	    pthread_t	thread_id;  // thread handling this server
+	} server_node_t;
+
+
+
+/*initialization following all parameters given by user in application*/
+static server_node_t server_node = {
+  "%(locstr)s",
+  "%(network_interface)s",           // interface    (NULL => use default (eth0))
+  "%(port_number)s",                 // Port number  (NULL => use default)
+  "%(BACnet_Device_Name)s",          // BACnet server's device (object) name
+  "%(BACnet_Comm_Control_Password)s",// BACnet server's device (object) name
+   %(BACnet_Device_ID)s              // BACnet server's device (object) ID
+};
+
+
+
+#endif /* SERVER_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bitbucket-pipelines.yml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,18 @@
+image: skvorl/beremiz-requirements
+
+pipelines:
+  default:
+    - parallel:
+        - step:
+            name: Codestyle checks
+            script:
+              - ln -s /CanFestival-3 $BITBUCKET_CLONE_DIR/../CanFestival-3
+              - /usr/bin/python --version
+              - ./tests/tools/check_source.sh
+        - step:
+            name: Application tests
+            max-time: 10
+            script:
+              - ln -s /CanFestival-3 $BITBUCKET_CLONE_DIR/../CanFestival-3
+              - ./tests/tools/run_python_tests.sh
+    
\ No newline at end of file
--- a/c_ext/CFileEditor.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/c_ext/CFileEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,27 +22,30 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx.stc as stc
 
 from controls.CustomStyledTextCtrl import faces
 from editors.CodeFileEditor import CodeFileEditor, CodeEditor
 
+
 class CppEditor(CodeEditor):
 
-    KEYWORDS = ["asm", "auto", "bool", "break", "case", "catch", "char", "class", 
-        "const", "const_cast", "continue", "default", "delete", "do", "double", 
-        "dynamic_cast", "else", "enum", "explicit", "export", "extern", "false", 
-        "float", "for", "friend", "goto", "if", "inline", "int", "long", "mutable", 
-        "namespace", "new", "operator", "private", "protected", "public", "register", 
-        "reinterpret_cast", "return", "short", "signed", "sizeof", "static", 
-        "static_cast", "struct", "switch", "template", "this", "throw", "true", "try",
-        "typedef", "typeid", "typename", "union", "unsigned", "using", "virtual", 
-        "void", "volatile", "wchar_t", "while"]
+    KEYWORDS = ["asm", "auto", "bool", "break", "case", "catch", "char", "class",
+                "const", "const_cast", "continue", "default", "delete", "do", "double",
+                "dynamic_cast", "else", "enum", "explicit", "export", "extern", "false",
+                "float", "for", "friend", "goto", "if", "inline", "int", "long", "mutable",
+                "namespace", "new", "operator", "private", "protected", "public", "register",
+                "reinterpret_cast", "return", "short", "signed", "sizeof", "static",
+                "static_cast", "struct", "switch", "template", "this", "throw", "true", "try",
+                "typedef", "typeid", "typename", "union", "unsigned", "using", "virtual",
+                "void", "volatile", "wchar_t", "while"]
     COMMENT_HEADER = "/"
-    
+
     def SetCodeLexer(self):
         self.SetLexer(stc.STC_LEX_CPP)
-        
+
         self.StyleSetSpec(stc.STC_C_COMMENT, 'fore:#408060,size:%(size)d' % faces)
         self.StyleSetSpec(stc.STC_C_COMMENTLINE, 'fore:#408060,size:%(size)d' % faces)
         self.StyleSetSpec(stc.STC_C_COMMENTDOC, 'fore:#408060,size:%(size)d' % faces)
@@ -53,15 +56,12 @@
         self.StyleSetSpec(stc.STC_C_OPERATOR, 'bold,size:%(size)d' % faces)
         self.StyleSetSpec(stc.STC_C_STRINGEOL, 'back:#FFD5FF,size:%(size)d' % faces)
 
-#-------------------------------------------------------------------------------
-#                          CFileEditor Main Frame Class
-#-------------------------------------------------------------------------------
 
 class CFileEditor(CodeFileEditor):
-    
+    """
+    CFileEditor Main Frame Class
+    """
+
     CONFNODEEDITOR_TABS = [
         (_("C code"), "_create_CodePanel")]
     CODE_EDITOR = CppEditor
-
-
-
--- a/c_ext/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/c_ext/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,4 +22,5 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-from c_ext import *
+from __future__ import absolute_import
+from c_ext.c_ext import *
--- a/c_ext/c_ext.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/c_ext/c_ext.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,11 +22,13 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+from __future__ import absolute_import
 import os
 
-from CFileEditor import CFileEditor
+from c_ext.CFileEditor import CFileEditor
 from CodeFileTreeNode import CodeFile
 
+
 class CFile(CodeFile):
     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
@@ -47,13 +49,13 @@
         "retrieveFunction",
         "publishFunction"]
     EditorType = CFileEditor
-    
+
     def GetIconName(self):
         return "Cfile"
 
     def CodeFileName(self):
         return os.path.join(self.CTNPath(), "cfile.xml")
-    
+
     def CTNGenerate_C(self, buildpath, locations):
         """
         Generate C code
@@ -70,17 +72,17 @@
         current_location = self.GetCurrentLocation()
         # define a unique name for the generated C file
         location_str = "_".join(map(str, current_location))
-        
+
         text = "/* Code generated by Beremiz c_ext confnode */\n\n"
         text += "#include <stdio.h>\n\n"
-        
+
         # Adding includes
         text += "/* User includes */\n"
         text += self.CodeFile.includes.getanyText().strip()
         text += "\n"
-        
+
         text += '#include "iec_types_all.h"\n\n'
-        
+
         # Adding variables
         config = self.GetCTRoot().GetProjectConfigNames()[0]
         text += "/* User variables reference */\n"
@@ -93,36 +95,35 @@
             text += "extern %(type)s %(global)s;\n" % var_infos
             text += "#define %(name)s %(global)s.value\n" % var_infos
         text += "\n"
-        
+
         # Adding user global variables and routines
         text += "/* User internal user variables and routines */\n"
         text += self.CodeFile.globals.getanyText().strip()
         text += "\n"
-        
+
         # Adding Beremiz confnode functions
         text += "/* Beremiz confnode functions */\n"
-        text += "int __init_%s(int argc,char **argv)\n{\n"%location_str
+        text += "int __init_%s(int argc,char **argv)\n{\n" % location_str
         text += self.CodeFile.initFunction.getanyText().strip()
         text += "  return 0;\n}\n\n"
-        
-        text += "void __cleanup_%s(void)\n{\n"%location_str
+
+        text += "void __cleanup_%s(void)\n{\n" % location_str
         text += self.CodeFile.cleanUpFunction.getanyText().strip()
         text += "\n}\n\n"
-        
-        text += "void __retrieve_%s(void)\n{\n"%location_str
+
+        text += "void __retrieve_%s(void)\n{\n" % location_str
         text += self.CodeFile.retrieveFunction.getanyText().strip()
         text += "\n}\n\n"
-        
-        text += "void __publish_%s(void)\n{\n"%location_str
+
+        text += "void __publish_%s(void)\n{\n" % location_str
         text += self.CodeFile.publishFunction.getanyText().strip()
         text += "\n}\n\n"
-        
-        Gen_Cfile_path = os.path.join(buildpath, "CFile_%s.c"%location_str)
-        cfile = open(Gen_Cfile_path,'w')
+
+        Gen_Cfile_path = os.path.join(buildpath, "CFile_%s.c" % location_str)
+        cfile = open(Gen_Cfile_path, 'w')
         cfile.write(text)
         cfile.close()
-        
-        matiec_CFLAGS = '"-I%s"'%os.path.abspath(self.GetCTRoot().GetIECLibPath())
-        
-        return [(Gen_Cfile_path, str(self.CExtension.getCFLAGS() + matiec_CFLAGS))],str(self.CExtension.getLDFLAGS()),True
 
+        matiec_CFLAGS = '"-I%s"' % os.path.abspath(self.GetCTRoot().GetIECLibPath())
+
+        return [(Gen_Cfile_path, str(self.CExtension.getCFLAGS() + matiec_CFLAGS))], str(self.CExtension.getLDFLAGS()), True
--- a/canfestival/NetworkEditor.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/canfestival/NetworkEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,61 +22,68 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+from __future__ import absolute_import
 import wx
 
-from subindextable import EditingPanel
 from networkeditortemplate import NetworkEditorTemplate
 from editors.ConfTreeNodeEditor import ConfTreeNodeEditor
 
-[ID_NETWORKEDITOR, 
+[
+    ID_NETWORKEDITOR,
 ] = [wx.NewId() for _init_ctrls in range(1)]
 
-[ID_NETWORKEDITORCONFNODEMENUADDSLAVE, ID_NETWORKEDITORCONFNODEMENUREMOVESLAVE, 
- ID_NETWORKEDITORCONFNODEMENUMASTER, 
+[
+    ID_NETWORKEDITORCONFNODEMENUADDSLAVE,
+    ID_NETWORKEDITORCONFNODEMENUREMOVESLAVE,
+    ID_NETWORKEDITORCONFNODEMENUMASTER,
 ] = [wx.NewId() for _init_coll_ConfNodeMenu_Items in range(3)]
 
-[ID_NETWORKEDITORMASTERMENUNODEINFOS, ID_NETWORKEDITORMASTERMENUDS301PROFILE,
- ID_NETWORKEDITORMASTERMENUDS302PROFILE, ID_NETWORKEDITORMASTERMENUDSOTHERPROFILE,
- ID_NETWORKEDITORMASTERMENUADD, 
+[
+    ID_NETWORKEDITORMASTERMENUNODEINFOS, ID_NETWORKEDITORMASTERMENUDS301PROFILE,
+    ID_NETWORKEDITORMASTERMENUDS302PROFILE, ID_NETWORKEDITORMASTERMENUDSOTHERPROFILE,
+    ID_NETWORKEDITORMASTERMENUADD,
 ] = [wx.NewId() for _init_coll_MasterMenu_Items in range(5)]
 
-[ID_NETWORKEDITORADDMENUSDOSERVER, ID_NETWORKEDITORADDMENUSDOCLIENT,
- ID_NETWORKEDITORADDMENUPDOTRANSMIT, ID_NETWORKEDITORADDMENUPDORECEIVE,
- ID_NETWORKEDITORADDMENUMAPVARIABLE, ID_NETWORKEDITORADDMENUUSERTYPE,
+[
+    ID_NETWORKEDITORADDMENUSDOSERVER, ID_NETWORKEDITORADDMENUSDOCLIENT,
+    ID_NETWORKEDITORADDMENUPDOTRANSMIT, ID_NETWORKEDITORADDMENUPDORECEIVE,
+    ID_NETWORKEDITORADDMENUMAPVARIABLE, ID_NETWORKEDITORADDMENUUSERTYPE,
 ] = [wx.NewId() for _init_coll_AddMenu_Items in range(6)]
 
+
 class NetworkEditor(ConfTreeNodeEditor, NetworkEditorTemplate):
-    
+
     ID = ID_NETWORKEDITOR
     CONFNODEEDITOR_TABS = [
         (_("CANOpen network"), "_create_NetworkEditor")]
-    
+
     def _create_NetworkEditor(self, prnt):
-        self.NetworkEditor = wx.Panel(id=-1, parent=prnt, pos=wx.Point(0, 0), 
-                size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-        
+        self.NetworkEditor = wx.Panel(
+            id=-1, parent=prnt, pos=wx.Point(0, 0),
+            size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+
         NetworkEditorTemplate._init_ctrls(self, self.NetworkEditor)
-        
+
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=1, vgap=0)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(0)
-        
-        main_sizer.AddWindow(self.NetworkNodes, 0, border=5, flag=wx.GROW|wx.ALL)
-    
+
+        main_sizer.AddWindow(self.NetworkNodes, 0, border=5, flag=wx.GROW | wx.ALL)
+
         self.NetworkEditor.SetSizer(main_sizer)
-    
+
         return self.NetworkEditor
-    
+
     def __init__(self, parent, controler, window):
         ConfTreeNodeEditor.__init__(self, parent, controler, window)
         NetworkEditorTemplate.__init__(self, controler, window, False)
-    
+
         self.RefreshNetworkNodes()
         self.RefreshBufferState()
-    
+
     def __del__(self):
         self.Controler.OnCloseEditor(self)
-    
+
     def GetConfNodeMenuItems(self):
         add_menu = [(wx.ITEM_NORMAL, (_('SDO Server'), ID_NETWORKEDITORADDMENUSDOSERVER, '', self.OnAddSDOServerMenu)),
                     (wx.ITEM_NORMAL, (_('SDO Client'), ID_NETWORKEDITORADDMENUSDOCLIENT, '', self.OnAddSDOClientMenu)),
@@ -84,44 +91,44 @@
                     (wx.ITEM_NORMAL, (_('PDO Receive'), ID_NETWORKEDITORADDMENUPDORECEIVE, '', self.OnAddPDOReceiveMenu)),
                     (wx.ITEM_NORMAL, (_('Map Variable'), ID_NETWORKEDITORADDMENUMAPVARIABLE, '', self.OnAddMapVariableMenu)),
                     (wx.ITEM_NORMAL, (_('User Type'), ID_NETWORKEDITORADDMENUUSERTYPE, '', self.OnAddUserTypeMenu))]
-        
+
         profile = self.Manager.GetCurrentProfileName()
         if profile not in ("None", "DS-301"):
             other_profile_text = _("%s Profile") % profile
             add_menu.append((wx.ITEM_SEPARATOR, None))
-            for text, indexes in self.Manager.GetCurrentSpecificMenu():
+            for text, _indexes in self.Manager.GetCurrentSpecificMenu():
                 add_menu.append((wx.ITEM_NORMAL, (text, wx.NewId(), '', self.GetProfileCallBack(text))))
         else:
             other_profile_text = _('Other Profile')
-        
+
         master_menu = [(wx.ITEM_NORMAL, (_('DS-301 Profile'), ID_NETWORKEDITORMASTERMENUDS301PROFILE, '', self.OnCommunicationMenu)),
                        (wx.ITEM_NORMAL, (_('DS-302 Profile'), ID_NETWORKEDITORMASTERMENUDS302PROFILE, '', self.OnOtherCommunicationMenu)),
                        (wx.ITEM_NORMAL, (other_profile_text, ID_NETWORKEDITORMASTERMENUDSOTHERPROFILE, '', self.OnEditProfileMenu)),
                        (wx.ITEM_SEPARATOR, None),
                        (add_menu, (_('Add'), ID_NETWORKEDITORMASTERMENUADD))]
-        
+
         return [(wx.ITEM_NORMAL, (_('Add slave'), ID_NETWORKEDITORCONFNODEMENUADDSLAVE, '', self.OnAddSlaveMenu)),
                 (wx.ITEM_NORMAL, (_('Remove slave'), ID_NETWORKEDITORCONFNODEMENUREMOVESLAVE, '', self.OnRemoveSlaveMenu)),
                 (wx.ITEM_SEPARATOR, None),
                 (master_menu, (_('Master'), ID_NETWORKEDITORCONFNODEMENUMASTER))]
-    
+
     def RefreshMainMenu(self):
         pass
-    
+
     def RefreshConfNodeMenu(self, confnode_menu):
         confnode_menu.Enable(ID_NETWORKEDITORCONFNODEMENUMASTER, self.NetworkNodes.GetSelection() == 0)
-    
+
     def RefreshView(self):
         ConfTreeNodeEditor.RefreshView(self)
         self.RefreshCurrentIndexList()
-    
+
     def RefreshBufferState(self):
         NetworkEditorTemplate.RefreshBufferState(self)
         self.ParentWindow.RefreshTitle()
         self.ParentWindow.RefreshFileMenu()
         self.ParentWindow.RefreshEditMenu()
         self.ParentWindow.RefreshPageTitles()
-    
+
     def OnNodeSelectedChanged(self, event):
         NetworkEditorTemplate.OnNodeSelectedChanged(self, event)
         wx.CallAfter(self.ParentWindow.RefreshEditMenu)
--- a/canfestival/SlaveEditor.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/canfestival/SlaveEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,39 +22,43 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+from __future__ import absolute_import
 import wx
 
 from subindextable import EditingPanel
 from nodeeditortemplate import NodeEditorTemplate
 from editors.ConfTreeNodeEditor import ConfTreeNodeEditor
 
-[ID_SLAVEEDITORCONFNODEMENUNODEINFOS, ID_SLAVEEDITORCONFNODEMENUDS301PROFILE,
- ID_SLAVEEDITORCONFNODEMENUDS302PROFILE, ID_SLAVEEDITORCONFNODEMENUDSOTHERPROFILE,
- ID_SLAVEEDITORCONFNODEMENUADD, 
+[
+    ID_SLAVEEDITORCONFNODEMENUNODEINFOS, ID_SLAVEEDITORCONFNODEMENUDS301PROFILE,
+    ID_SLAVEEDITORCONFNODEMENUDS302PROFILE, ID_SLAVEEDITORCONFNODEMENUDSOTHERPROFILE,
+    ID_SLAVEEDITORCONFNODEMENUADD,
 ] = [wx.NewId() for _init_coll_ConfNodeMenu_Items in range(5)]
 
-[ID_SLAVEEDITORADDMENUSDOSERVER, ID_SLAVEEDITORADDMENUSDOCLIENT,
- ID_SLAVEEDITORADDMENUPDOTRANSMIT, ID_SLAVEEDITORADDMENUPDORECEIVE,
- ID_SLAVEEDITORADDMENUMAPVARIABLE, ID_SLAVEEDITORADDMENUUSERTYPE,
+[
+    ID_SLAVEEDITORADDMENUSDOSERVER, ID_SLAVEEDITORADDMENUSDOCLIENT,
+    ID_SLAVEEDITORADDMENUPDOTRANSMIT, ID_SLAVEEDITORADDMENUPDORECEIVE,
+    ID_SLAVEEDITORADDMENUMAPVARIABLE, ID_SLAVEEDITORADDMENUUSERTYPE,
 ] = [wx.NewId() for _init_coll_AddMenu_Items in range(6)]
 
+
 class SlaveEditor(ConfTreeNodeEditor, NodeEditorTemplate):
-    
+
     CONFNODEEDITOR_TABS = [
         (_("CANOpen slave"), "_create_SlaveNodeEditor")]
-    
+
     def _create_SlaveNodeEditor(self, prnt):
         self.SlaveNodeEditor = EditingPanel(prnt, self, self.Controler, self.Editable)
         return self.SlaveNodeEditor
-        
+
     def __init__(self, parent, controler, window, editable=True):
         self.Editable = editable
         ConfTreeNodeEditor.__init__(self, parent, controler, window)
         NodeEditorTemplate.__init__(self, controler, window, False)
-    
+
     def __del__(self):
         self.Controler.OnCloseEditor(self)
-    
+
     def GetConfNodeMenuItems(self):
         if self.Editable:
             add_menu = [(wx.ITEM_NORMAL, (_('SDO Server'), ID_SLAVEEDITORADDMENUSDOSERVER, '', self.OnAddSDOServerMenu)),
@@ -63,23 +67,23 @@
                         (wx.ITEM_NORMAL, (_('PDO Receive'), ID_SLAVEEDITORADDMENUPDORECEIVE, '', self.OnAddPDOReceiveMenu)),
                         (wx.ITEM_NORMAL, (_('Map Variable'), ID_SLAVEEDITORADDMENUMAPVARIABLE, '', self.OnAddMapVariableMenu)),
                         (wx.ITEM_NORMAL, (_('User Type'), ID_SLAVEEDITORADDMENUUSERTYPE, '', self.OnAddUserTypeMenu))]
-            
+
             profile = self.Controler.GetCurrentProfileName()
             if profile not in ("None", "DS-301"):
                 other_profile_text = _("%s Profile") % profile
                 add_menu.append((wx.ITEM_SEPARATOR, None))
-                for text, indexes in self.Manager.GetCurrentSpecificMenu():
+                for text, _indexes in self.Manager.GetCurrentSpecificMenu():
                     add_menu.append((wx.ITEM_NORMAL, (text, wx.NewId(), '', self.GetProfileCallBack(text))))
             else:
                 other_profile_text = _('Other Profile')
-            
+
             return [(wx.ITEM_NORMAL, (_('DS-301 Profile'), ID_SLAVEEDITORCONFNODEMENUDS301PROFILE, '', self.OnCommunicationMenu)),
                     (wx.ITEM_NORMAL, (_('DS-302 Profile'), ID_SLAVEEDITORCONFNODEMENUDS302PROFILE, '', self.OnOtherCommunicationMenu)),
                     (wx.ITEM_NORMAL, (other_profile_text, ID_SLAVEEDITORCONFNODEMENUDSOTHERPROFILE, '', self.OnEditProfileMenu)),
                     (wx.ITEM_SEPARATOR, None),
                     (add_menu, (_('Add'), ID_SLAVEEDITORCONFNODEMENUADD))]
         return []
-    
+
     def RefreshConfNodeMenu(self, confnode_menu):
         if self.Editable:
             confnode_menu.Enable(ID_SLAVEEDITORCONFNODEMENUDSOTHERPROFILE, False)
@@ -90,37 +94,37 @@
 
     def RefreshCurrentIndexList(self):
         self.RefreshView()
-    
+
     def RefreshBufferState(self):
         self.ParentWindow.RefreshTitle()
         self.ParentWindow.RefreshFileMenu()
         self.ParentWindow.RefreshEditMenu()
         self.ParentWindow.RefreshPageTitles()
 
+
 class MasterViewer(SlaveEditor):
     SHOW_BASE_PARAMS = False
     SHOW_PARAMS = False
-    
+
     def __init__(self, parent, controler, window, tagname):
         SlaveEditor.__init__(self, parent, controler, window, False)
-    
+
         self.TagName = tagname
-    
+
     def GetTagName(self):
         return self.TagName
-    
+
     def GetCurrentNodeId(self):
         return None
-    
+
     def GetInstancePath(self):
         return self.Controler.CTNFullName() + ".generated_master"
-    
+
     def GetTitle(self):
         return self.GetInstancePath()
-        
+
     def IsViewing(self, tagname):
         return self.GetInstancePath() == tagname
 
     def RefreshView(self):
         self.SlaveNodeEditor.RefreshIndexList()
-
--- a/canfestival/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/canfestival/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,4 +22,5 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-from canfestival import *
+from __future__ import absolute_import
+from canfestival.canfestival import *
--- a/canfestival/canfestival.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/canfestival/canfestival.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -22,36 +23,47 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import os, sys, shutil
-
-base_folder = os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
-CanFestivalPath = os.path.join(base_folder, "CanFestival-3")
-sys.path.append(os.path.join(CanFestivalPath, "objdictgen"))
-
+from __future__ import absolute_import
+from __future__ import division
+import os
+import sys
+import shutil
 import wx
-
+from gnosis.xml.pickle import *  # pylint: disable=import-error
+from gnosis.xml.pickle.util import setParanoia  # pylint: disable=import-error
+
+import util.paths as paths
+from util.TranslationCatalogs import AddCatalog
+from ConfigTreeNode import ConfigTreeNode
+from PLCControler import \
+    LOCATION_CONFNODE, \
+    LOCATION_VAR_MEMORY
+
+base_folder = paths.AbsParentDir(__file__, 2)  # noqa
+CanFestivalPath = os.path.join(base_folder, "CanFestival-3")  # noqa
+sys.path.append(os.path.join(CanFestivalPath, "objdictgen"))  # noqa
+
+# pylint: disable=wrong-import-position
 from nodelist import NodeList
 from nodemanager import NodeManager
-import config_utils, gen_cfile, eds_utils
-import canfestival_config as local_canfestival_config
-from ConfigTreeNode import ConfigTreeNode
+import gen_cfile
+import eds_utils
+import canfestival_config as local_canfestival_config  # pylint: disable=import-error
 from commondialogs import CreateNodeDialog
 from subindextable import IECTypeConversion, SizeConversion
-
-from PLCControler import LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY
-from SlaveEditor import SlaveEditor, MasterViewer
-from NetworkEditor import NetworkEditor
-
-from gnosis.xml.pickle import *
-from gnosis.xml.pickle.util import setParanoia
+from canfestival import config_utils
+from canfestival.SlaveEditor import SlaveEditor, MasterViewer
+from canfestival.NetworkEditor import NetworkEditor
+
+
+AddCatalog(os.path.join(CanFestivalPath, "objdictgen", "locale"))
 setParanoia(0)
 
-from util.TranslationCatalogs import AddCatalog
-AddCatalog(os.path.join(CanFestivalPath, "objdictgen", "locale"))
-
-#--------------------------------------------------
+
+# --------------------------------------------------
 #              Location Tree Helper
-#--------------------------------------------------
+# --------------------------------------------------
+
 
 def GetSlaveLocationTree(slave_node, current_location, name):
     entries = []
@@ -65,19 +77,19 @@
                 "size": size,
                 "IEC_type": IECTypeConversion.get(typeinfos["name"]),
                 "var_name": "%s_%4.4x_%2.2x" % ("_".join(name.split()), index, subindex),
-                "location": "%s%s"%(SizeConversion[size], ".".join(map(str, current_location + 
-                                                                                (index, subindex)))),
+                "location": "%s%s" % (SizeConversion[size], ".".join(map(str, current_location +
+                                                                         (index, subindex)))),
                 "description": "",
                 "children": []})
-    return  {"name": name,
-             "type": LOCATION_CONFNODE,
-             "location": ".".join([str(i) for i in current_location]) + ".x",
-             "children": entries
-    }
-
-#--------------------------------------------------
+    return {"name": name,
+            "type": LOCATION_CONFNODE,
+            "location": ".".join([str(i) for i in current_location]) + ".x",
+            "children": entries}
+
+# --------------------------------------------------
 #                    SLAVE
-#--------------------------------------------------
+# --------------------------------------------------
+
 
 class _SlaveCTN(NodeManager):
     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
@@ -100,7 +112,7 @@
       </xsd:element>
     </xsd:schema>
     """
-    
+
     EditorType = SlaveEditor
     IconPath = os.path.join(CanFestivalPath, "objdictgen", "networkedit.png")
 
@@ -108,7 +120,7 @@
         # TODO change netname when name change
         NodeManager.__init__(self)
         odfilepath = self.GetSlaveODPath()
-        if(os.path.isfile(odfilepath)):
+        if os.path.isfile(odfilepath):
             self.OpenFileInCurrent(odfilepath)
         else:
             self.FilePath = ""
@@ -116,25 +128,25 @@
             dialog.Type.Enable(False)
             dialog.GenSYNC.Enable(False)
             if dialog.ShowModal() == wx.ID_OK:
-                name, id, nodetype, description = dialog.GetValues()
+                name, id, _nodetype, description = dialog.GetValues()
                 profile, filepath = dialog.GetProfile()
                 NMT = dialog.GetNMTManagement()
                 options = dialog.GetOptions()
-                self.CreateNewNode(name,       # Name - will be changed at build time
-                                   id,         # NodeID - will be changed at build time
-                                   "slave",    # Type
-                                   description,# description 
-                                   profile,    # profile
-                                   filepath,   # prfile filepath
-                                   NMT,        # NMT
-                                   options)     # options
+                self.CreateNewNode(name,         # Name - will be changed at build time
+                                   id,           # NodeID - will be changed at build time
+                                   "slave",      # Type
+                                   description,  # description
+                                   profile,      # profile
+                                   filepath,     # prfile filepath
+                                   NMT,          # NMT
+                                   options)      # options
             else:
                 self.CreateNewNode("SlaveNode",  # Name - will be changed at build time
                                    0x00,         # NodeID - will be changed at build time
                                    "slave",      # Type
-                                   "",           # description 
+                                   "",           # description
                                    "None",       # profile
-                                   "", # prfile filepath
+                                   "",           # prfile filepath
                                    "heartbeat",  # NMT
                                    [])           # options
             dialog.Destroy()
@@ -154,48 +166,49 @@
         if self._View is not None:
             self._View.SetBusId(self.GetCurrentLocation())
         return self._View
-    
+
     def _ExportSlave(self):
-        dialog = wx.FileDialog(self.GetCTRoot().AppFrame, 
-                               _("Choose a file"), 
-                               os.path.expanduser("~"), 
-                               "%s.eds" % self.CTNName(),  
+        dialog = wx.FileDialog(self.GetCTRoot().AppFrame,
+                               _("Choose a file"),
+                               os.path.expanduser("~"),
+                               "%s.eds" % self.CTNName(),
                                _("EDS files (*.eds)|*.eds|All files|*.*"),
-                               wx.SAVE|wx.OVERWRITE_PROMPT)
+                               wx.SAVE | wx.OVERWRITE_PROMPT)
         if dialog.ShowModal() == wx.ID_OK:
             result = eds_utils.GenerateEDSFile(dialog.GetPath(), self.GetCurrentNodeCopy())
             if result:
                 self.GetCTRoot().logger.write_error(_("Error: Export slave failed\n"))
-        dialog.Destroy()  
-        
+        dialog.Destroy()
+
     ConfNodeMethods = [
-        {"bitmap" : "ExportSlave",
-         "name" : _("Export slave"), 
-         "tooltip" : _("Export CanOpen slave to EDS file"),
-         "method" : "_ExportSlave"},
+        {
+            "bitmap":    "ExportSlave",
+            "name":    _("Export slave"),
+            "tooltip": _("Export CanOpen slave to EDS file"),
+            "method":   "_ExportSlave"
+        },
     ]
-    
+
     def CTNTestModified(self):
         return self.ChangesToSave or self.OneFileHasChanged()
-        
+
     def OnCTNSave(self, from_project_path=None):
         return self.SaveCurrentInFile(self.GetSlaveODPath())
 
     def SetParamsAttribute(self, path, value):
         result = ConfigTreeNode.SetParamsAttribute(self, path, value)
-        
+
         # Filter IEC_Channel and Name, that have specific behavior
         if path == "BaseParams.IEC_Channel" and self._View is not None:
             self._View.SetBusId(self.GetCurrentLocation())
-        
+
         return result
-    
+
     def GetVariableLocationTree(self):
-        current_location = self.GetCurrentLocation()
-        return GetSlaveLocationTree(self.CurrentNode, 
-                                    self.GetCurrentLocation(), 
+        return GetSlaveLocationTree(self.CurrentNode,
+                                    self.GetCurrentLocation(),
                                     self.BaseParams.getName())
-    
+
     def CTNGenerate_C(self, buildpath, locations):
         """
         Generate C code
@@ -212,75 +225,78 @@
         current_location = self.GetCurrentLocation()
         # define a unique name for the generated C file
         prefix = "_".join(map(str, current_location))
-        Gen_OD_path = os.path.join(buildpath, "OD_%s.c"%prefix )
+        Gen_OD_path = os.path.join(buildpath, "OD_%s.c" % prefix)
         # Create a new copy of the model
         slave = self.GetCurrentNodeCopy()
-        slave.SetNodeName("OD_%s"%prefix)
+        slave.SetNodeName("OD_%s" % prefix)
         # allow access to local OD from Slave PLC
         pointers = config_utils.LocalODPointers(locations, current_location, slave)
         res = gen_cfile.GenerateFile(Gen_OD_path, slave, pointers)
-        if res :
-            raise Exception, res
-        res = eds_utils.GenerateEDSFile(os.path.join(buildpath, "Slave_%s.eds"%prefix), slave)
-        if res :
-            raise Exception, res
-        return [(Gen_OD_path,local_canfestival_config.getCFLAGS(CanFestivalPath))],"",False
+        if res:
+            raise Exception(res)
+        res = eds_utils.GenerateEDSFile(os.path.join(buildpath, "Slave_%s.eds" % prefix), slave)
+        if res:
+            raise Exception(res)
+        return [(Gen_OD_path, local_canfestival_config.getCFLAGS(CanFestivalPath))], "", False
 
     def LoadPrevious(self):
         self.LoadCurrentPrevious()
-    
+
     def LoadNext(self):
         self.LoadCurrentNext()
-    
+
     def GetBufferState(self):
         return self.GetCurrentBufferState()
 
-#--------------------------------------------------
+# --------------------------------------------------
 #                    MASTER
-#--------------------------------------------------
+# --------------------------------------------------
+
 
 class MiniNodeManager(NodeManager):
-    
+
     def __init__(self, parent, filepath, fullname):
         NodeManager.__init__(self)
-        
+
         self.OpenFileInCurrent(filepath)
-            
+
         self.Parent = parent
         self.Fullname = fullname
-    
+
     def GetIconName(self):
         return None
-    
+
     def OnCloseEditor(self, view):
         self.Parent.OnCloseEditor(view)
-    
+
     def CTNFullName(self):
         return self.Fullname
-    
+
     def CTNTestModified(self):
         return False
-    
+
     def GetBufferState(self):
         return self.GetCurrentBufferState()
-    
+
     ConfNodeMethods = []
 
+
 class _NodeManager(NodeManager):
 
     def __init__(self, parent, *args, **kwargs):
         NodeManager.__init__(self, *args, **kwargs)
         self.Parent = parent
-        
+
     def __del__(self):
         self.Parent = None
-        
+
     def GetCurrentNodeName(self):
         return self.Parent.CTNName()
-    
+
     def GetCurrentNodeID(self):
         return self.Parent.CanFestivalNode.getNodeId()
-    
+
+
 class _NodeListCTN(NodeList):
     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
@@ -293,34 +309,34 @@
         </xsd:complexType>
       </xsd:element>
     </xsd:schema>
-    """ 
-    
+    """
+
     EditorType = NetworkEditor
     IconPath = os.path.join(CanFestivalPath, "objdictgen", "networkedit.png")
-    
+
     def __init__(self):
         manager = _NodeManager(self)
         NodeList.__init__(self, manager)
         self.LoadProject(self.CTNPath())
         self.SetNetworkName(self.BaseParams.getName())
-    
+
     def GetCanDevice(self):
         return self.CanFestivalNode.getCAN_Device()
-    
+
     def SetParamsAttribute(self, path, value):
         if path == "CanFestivalNode.NodeId":
             nodeid = self.CanFestivalNode.getNodeId()
             if value != nodeid:
                 slaves = self.GetSlaveIDs()
-                dir = (value - nodeid) / abs(value - nodeid)
+                dir = (value - nodeid) // abs(value - nodeid)
                 while value in slaves and value >= 0:
                     value += dir
                 if value < 0:
                     value = nodeid
-        
+
         value, refresh = ConfigTreeNode.SetParamsAttribute(self, path, value)
         refresh_network = False
-        
+
         # Filter IEC_Channel and Name, that have specific behavior
         if path == "BaseParams.IEC_Channel" and self._View is not None:
             self._View.SetBusId(self.GetCurrentLocation())
@@ -329,31 +345,35 @@
             refresh_network = True
         elif path == "CanFestivalNode.NodeId":
             refresh_network = True
-            
+
         if refresh_network and self._View is not None:
             wx.CallAfter(self._View.RefreshBufferState)
         return value, refresh
-    
+
     def GetVariableLocationTree(self):
         current_location = self.GetCurrentLocation()
         nodeindexes = self.SlaveNodes.keys()
         nodeindexes.sort()
-        return {"name": self.BaseParams.getName(),
-                 "type": LOCATION_CONFNODE,
-                 "location": self.GetFullIEC_Channel(),
-                 "children": [GetSlaveLocationTree(self.Manager.GetCurrentNodeCopy(),
-                                                   current_location,
-                                                   _("Local entries"))] + 
-                             [GetSlaveLocationTree(self.SlaveNodes[nodeid]["Node"], 
-                                                   current_location + (nodeid,), 
-                                                   self.SlaveNodes[nodeid]["Name"])
-                              for nodeid in nodeindexes]
+        children = []
+        children += [GetSlaveLocationTree(self.Manager.GetCurrentNodeCopy(),
+                                          current_location,
+                                          _("Local entries"))]
+        children += [GetSlaveLocationTree(self.SlaveNodes[nodeid]["Node"],
+                                          current_location + (nodeid,),
+                                          self.SlaveNodes[nodeid]["Name"]) for nodeid in nodeindexes]
+
+        return {
+            "name":     self.BaseParams.getName(),
+            "type":     LOCATION_CONFNODE,
+            "location": self.GetFullIEC_Channel(),
+            "children": children
         }
-    
+
     _GeneratedMasterView = None
+
     def _ShowGeneratedMaster(self):
         self._OpenView("Generated master")
-        
+
     def _OpenView(self, name=None, onlyopened=False):
         if name == "Generated master":
             app_frame = self.GetCTRoot().AppFrame
@@ -363,37 +383,39 @@
                 if not os.path.exists(buildpath):
                     self.GetCTRoot().logger.write_error(_("Error: No PLC built\n"))
                     return
-                
+
                 masterpath = os.path.join(buildpath, "MasterGenerated.od")
                 if not os.path.exists(masterpath):
                     self.GetCTRoot().logger.write_error(_("Error: No Master generated\n"))
                     return
-                
+
                 manager = MiniNodeManager(self, masterpath, self.CTNFullName())
                 self._GeneratedMasterView = MasterViewer(app_frame.TabsOpened, manager, app_frame, name)
-                
+
             if self._GeneratedMasterView is not None:
                 app_frame.EditProjectElement(self._GeneratedMasterView, self._GeneratedMasterView.GetInstancePath())
-            
+
             return self._GeneratedMasterView
         else:
             ConfigTreeNode._OpenView(self, name, onlyopened)
             if self._View is not None:
                 self._View.SetBusId(self.GetCurrentLocation())
             return self._View
-    
+
     ConfNodeMethods = [
-        {"bitmap" : "ShowMaster",
-         "name" : _("Show Master"), 
-         "tooltip" : _("Show Master generated by config_utils"),
-         "method" : "_ShowGeneratedMaster"}
+        {
+            "bitmap":    "ShowMaster",
+            "name":    _("Show Master"),
+            "tooltip": _("Show Master generated by config_utils"),
+            "method":   "_ShowGeneratedMaster"
+        }
     ]
-    
+
     def OnCloseEditor(self, view):
         ConfigTreeNode.OnCloseEditor(self, view)
         if self._GeneratedMasterView == view:
             self._GeneratedMasterView = None
-    
+
     def OnCTNClose(self):
         ConfigTreeNode.OnCTNClose(self)
         self._CloseView(self._GeneratedMasterView)
@@ -401,11 +423,11 @@
 
     def CTNTestModified(self):
         return self.ChangesToSave or self.HasChanged()
-        
+
     def OnCTNSave(self, from_project_path=None):
         self.SetRoot(self.CTNPath())
         if from_project_path is not None:
-            shutil.copytree(self.GetEDSFolder(from_project_path), 
+            shutil.copytree(self.GetEDSFolder(from_project_path),
                             self.GetEDSFolder())
         return self.SaveProject() is None
 
@@ -426,33 +448,36 @@
         current_location = self.GetCurrentLocation()
         # define a unique name for the generated C file
         prefix = "_".join(map(str, current_location))
-        Gen_OD_path = os.path.join(buildpath, "OD_%s.c"%prefix )
+        Gen_OD_path = os.path.join(buildpath, "OD_%s.c" % prefix)
         # Create a new copy of the model with DCF loaded with PDO mappings for desired location
         try:
-            master, pointers = config_utils.GenerateConciseDCF(locations, current_location, self, self.CanFestivalNode.getSync_TPDOs(),"OD_%s"%prefix)
-        except config_utils.PDOmappingException, e:
-            raise Exception, e.message
+            master, pointers = config_utils.GenerateConciseDCF(locations, current_location, self, self.CanFestivalNode.getSync_TPDOs(), "OD_%s" % prefix)
+        except config_utils.PDOmappingException as e:
+            raise Exception(e.message)
         # Do generate C file.
         res = gen_cfile.GenerateFile(Gen_OD_path, master, pointers)
-        if res :
-            raise Exception, res
-        
+        if res:
+            raise Exception(res)
+
         file = open(os.path.join(buildpath, "MasterGenerated.od"), "w")
-        dump(master, file)
+        # linter disabled here, undefined variable happens
+        # here because gnosis isn't impored while linting
+        dump(master, file)  # pylint: disable=undefined-variable
         file.close()
-        
-        return [(Gen_OD_path,local_canfestival_config.getCFLAGS(CanFestivalPath))],"",False
-    
+
+        return [(Gen_OD_path, local_canfestival_config.getCFLAGS(CanFestivalPath))], "", False
+
     def LoadPrevious(self):
         self.Manager.LoadCurrentPrevious()
-    
+
     def LoadNext(self):
         self.Manager.LoadCurrentNext()
-    
+
     def GetBufferState(self):
         return self.Manager.GetCurrentBufferState()
-    
-class RootClass:
+
+
+class RootClass(object):
     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <xsd:element name="CanFestivalInstance">
@@ -462,29 +487,30 @@
       </xsd:element>
     </xsd:schema>
     """
-    
-    CTNChildrenTypes = [("CanOpenNode",_NodeListCTN, "CanOpen Master"),
-                       ("CanOpenSlave",_SlaveCTN, "CanOpen Slave")]
-    def GetParamsAttributes(self, path = None):
-        infos = ConfigTreeNode.GetParamsAttributes(self, path = path)
+
+    CTNChildrenTypes = [("CanOpenNode",  _NodeListCTN, "CanOpen Master"),
+                        ("CanOpenSlave", _SlaveCTN,    "CanOpen Slave")]
+
+    def GetParamsAttributes(self, path=None):
+        infos = ConfigTreeNode.GetParamsAttributes(self, path=path)
         for element in infos:
             if element["name"] == "CanFestivalInstance":
                 for child in element["children"]:
                     if child["name"] == "CAN_Driver":
                         child["type"] = local_canfestival_config.DLL_LIST
         return infos
-    
+
     def GetCanDriver(self):
         res = self.CanFestivalInstance.getCAN_Driver()
-        if not res :
+        if not res:
             return ""
         return res
-        
+
     def CTNGenerate_C(self, buildpath, locations):
         can_driver = self.GetCanDriver()
         if can_driver is not None:
             can_drivers = local_canfestival_config.DLL_LIST
-            if can_driver not in can_drivers :
+            if can_driver not in can_drivers:
                 can_driver = can_drivers[0]
             can_drv_ext = self.GetCTRoot().GetBuilder().extension
             can_drv_prefix = self.GetCTRoot().GetBuilder().dlopen_prefix
@@ -492,106 +518,105 @@
         else:
             can_driver_name = ""
 
-        
-        format_dict = {"locstr" : "_".join(map(str,self.GetCurrentLocation())),
-                       "candriver" : can_driver_name,
-                       "nodes_includes" : "",
-                       "board_decls" : "",
-                       "nodes_init" : "",
-                       "nodes_open" : "",
-                       "nodes_stop" : "",
-                       "nodes_close" : "",
-                       "nodes_send_sync" : "",
-                       "nodes_proceed_sync" : "",
-                       "slavebootups" : "",
-                       "slavebootup_register" : "",
-                       "post_sync" : "",
-                       "post_sync_register" : "",
-                       "pre_op" : "",
-                       "pre_op_register" : "",
-                       }
+        format_dict = {
+            "locstr": "_".join(map(str, self.GetCurrentLocation())),
+            "candriver": can_driver_name,
+            "nodes_includes": "",
+            "board_decls": "",
+            "nodes_init": "",
+            "nodes_open": "",
+            "nodes_stop": "",
+            "nodes_close": "",
+            "nodes_send_sync": "",
+            "nodes_proceed_sync": "",
+            "slavebootups": "",
+            "slavebootup_register": "",
+            "post_sync": "",
+            "post_sync_register": "",
+            "pre_op": "",
+            "pre_op_register": "",
+        }
         for child in self.IECSortedChildren():
-            childlocstr = "_".join(map(str,child.GetCurrentLocation()))
+            childlocstr = "_".join(map(str, child.GetCurrentLocation()))
             nodename = "OD_%s" % childlocstr
-            
+
             # Try to get Slave Node
             child_data = getattr(child, "CanFestivalSlaveNode", None)
             if child_data is None:
                 # Not a slave -> master
                 child_data = getattr(child, "CanFestivalNode")
                 # Apply sync setting
-                format_dict["nodes_init"] += 'NODE_MASTER_INIT(%s, %s)\n    '%(
-                       nodename,
-                       child_data.getNodeId())
+                format_dict["nodes_init"] += 'NODE_MASTER_INIT(%s, %s)\n    ' % (
+                    nodename,
+                    child_data.getNodeId())
                 if child_data.getSync_TPDOs():
-                    format_dict["nodes_send_sync"] += 'NODE_SEND_SYNC(%s)\n    '%(nodename)
-                    format_dict["nodes_proceed_sync"] += 'NODE_PROCEED_SYNC(%s)\n    '%(nodename)
+                    format_dict["nodes_send_sync"] += 'NODE_SEND_SYNC(%s)\n    ' % (nodename)
+                    format_dict["nodes_proceed_sync"] += 'NODE_PROCEED_SYNC(%s)\n    ' % (nodename)
 
                 # initialize and declare node boot status variables for post_SlaveBootup lookup
                 SlaveIDs = child.GetSlaveIDs()
                 if len(SlaveIDs) == 0:
                     # define post_SlaveBootup lookup functions
                     format_dict["slavebootups"] += (
-                        "static void %s_post_SlaveBootup(CO_Data* d, UNS8 nodeId){}\n"%(nodename))
+                        "static void %s_post_SlaveBootup(CO_Data* d, UNS8 nodeId){}\n" % (nodename))
                 else:
                     format_dict["slavebootups"] += (
-                        "static void %s_post_SlaveBootup(CO_Data* d, UNS8 nodeId){\n"%(nodename)+
-                        "    check_and_start_node(d, nodeId);\n"+
+                        "static void %s_post_SlaveBootup(CO_Data* d, UNS8 nodeId){\n" % (nodename) +
+                        "    check_and_start_node(d, nodeId);\n" +
                         "}\n")
                 # register previously declared func as post_SlaveBootup callback for that node
                 format_dict["slavebootup_register"] += (
-                    "%s_Data.post_SlaveBootup = %s_post_SlaveBootup;\n"%(nodename,nodename))
+                    "%s_Data.post_SlaveBootup = %s_post_SlaveBootup;\n" % (nodename, nodename))
                 format_dict["pre_op"] += (
-                    "static void %s_preOperational(CO_Data* d){\n    "%(nodename)+
-                    "".join(["    masterSendNMTstateChange(d, %d, NMT_Reset_Comunication);\n"%NdId for NdId in SlaveIDs])+
+                    "static void %s_preOperational(CO_Data* d){\n    " % (nodename) +
+                    "".join(["    masterSendNMTstateChange(d, %d, NMT_Reset_Comunication);\n" % NdId for NdId in SlaveIDs]) +
                     "}\n")
                 format_dict["pre_op_register"] += (
-                    "%s_Data.preOperational = %s_preOperational;\n"%(nodename,nodename))
+                    "%s_Data.preOperational = %s_preOperational;\n" % (nodename, nodename))
             else:
                 # Slave node
                 align = child_data.getSync_Align()
-                align_ratio=child_data.getSync_Align_Ratio()
+                align_ratio = child_data.getSync_Align_Ratio()
                 if align > 0:
                     format_dict["post_sync"] += (
-                        "static int %s_CalCount = 0;\n"%(nodename)+
-                        "static void %s_post_sync(CO_Data* d){\n"%(nodename)+
-                        "    if(%s_CalCount < %d){\n"%(nodename, align)+
-                        "        %s_CalCount++;\n"%(nodename)+
-                        "        align_tick(-1);\n"+
-                        "    }else{\n"+
-                        "        align_tick(%d);\n"%(align_ratio)+
-                        "    }\n"+
+                        "static int %s_CalCount = 0;\n" % (nodename) +
+                        "static void %s_post_sync(CO_Data* d){\n" % (nodename) +
+                        "    if(%s_CalCount < %d){\n" % (nodename, align) +
+                        "        %s_CalCount++;\n" % (nodename) +
+                        "        align_tick(-1);\n" +
+                        "    }else{\n" +
+                        "        align_tick(%d);\n" % (align_ratio) +
+                        "    }\n" +
                         "}\n")
                     format_dict["post_sync_register"] += (
-                        "%s_Data.post_sync = %s_post_sync;\n"%(nodename,nodename))
-                format_dict["nodes_init"] += 'NODE_SLAVE_INIT(%s, %s)\n    '%(
-                       nodename,
-                       child_data.getNodeId())
-    
+                        "%s_Data.post_sync = %s_post_sync;\n" % (nodename, nodename))
+                format_dict["nodes_init"] += 'NODE_SLAVE_INIT(%s, %s)\n    ' % (
+                    nodename,
+                    child_data.getNodeId())
+
             # Include generated OD headers
-            format_dict["nodes_includes"] += '#include "%s.h"\n'%(nodename)
+            format_dict["nodes_includes"] += '#include "%s.h"\n' % (nodename)
             # Declare CAN channels according user filled config
-            format_dict["board_decls"] += 'BOARD_DECL(%s, "%s", "%s")\n'%(
-                   nodename,
-                   child.GetCanDevice(),
-                   child_data.getCAN_Baudrate())
-            format_dict["nodes_open"] += 'NODE_OPEN(%s)\n    '%(nodename)
-            format_dict["nodes_close"] += 'NODE_CLOSE(%s)\n    '%(nodename)
-            format_dict["nodes_stop"] += 'NODE_STOP(%s)\n    '%(nodename)
-        
-        filename = os.path.join(os.path.split(__file__)[0],"cf_runtime.c")
+            format_dict["board_decls"] += 'BOARD_DECL(%s, "%s", "%s")\n' % (
+                nodename,
+                child.GetCanDevice(),
+                child_data.getCAN_Baudrate())
+            format_dict["nodes_open"] += 'NODE_OPEN(%s)\n    ' % (nodename)
+            format_dict["nodes_close"] += 'NODE_CLOSE(%s)\n    ' % (nodename)
+            format_dict["nodes_stop"] += 'NODE_STOP(%s)\n    ' % (nodename)
+
+        filename = paths.AbsNeighbourFile(__file__, "cf_runtime.c")
         cf_main = open(filename).read() % format_dict
-        cf_main_path = os.path.join(buildpath, "CF_%(locstr)s.c"%format_dict)
-        f = open(cf_main_path,'w')
+        cf_main_path = os.path.join(buildpath, "CF_%(locstr)s.c" % format_dict)
+        f = open(cf_main_path, 'w')
         f.write(cf_main)
         f.close()
 
-        res = [(cf_main_path, local_canfestival_config.getCFLAGS(CanFestivalPath))],local_canfestival_config.getLDFLAGS(CanFestivalPath), True
-        
+        res = [(cf_main_path, local_canfestival_config.getCFLAGS(CanFestivalPath))], local_canfestival_config.getLDFLAGS(CanFestivalPath), True
+
         if can_driver is not None:
-            can_driver_path = os.path.join(CanFestivalPath,"drivers",can_driver,can_driver_name)
+            can_driver_path = os.path.join(CanFestivalPath, "drivers", can_driver, can_driver_name)
             if os.path.exists(can_driver_path):
-                res += ((can_driver_name, file(can_driver_path,"rb")),)
+                res += ((can_driver_name, open(can_driver_path, "rb")),)
 
         return res
-
--- a/canfestival/config_utils.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/canfestival/config_utils.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,33 +22,55 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-from types import *
+
+from __future__ import absolute_import
+from __future__ import print_function
+import os
+import sys
+import getopt
+from past.builtins import long
 
 # Translation between IEC types and Can Open types
-IECToCOType = {"BOOL":0x01, "SINT":0x02, "INT":0x03,"DINT":0x04,"LINT":0x10,
-               "USINT":0x05,"UINT":0x06,"UDINT":0x07,"ULINT":0x1B,"REAL":0x08,
-               "LREAL":0x11,"STRING":0x09,"BYTE":0x05,"WORD":0x06,"DWORD":0x07,
-               "LWORD":0x1B,"WSTRING":0x0B}
-
-# Constants for PDO types 
+IECToCOType = {
+    "BOOL":    0x01,
+    "SINT":    0x02,
+    "INT":     0x03,
+    "DINT":    0x04,
+    "LINT":    0x10,
+    "USINT":   0x05,
+    "UINT":    0x06,
+    "UDINT":   0x07,
+    "ULINT":   0x1B,
+    "REAL":    0x08,
+    "LREAL":   0x11,
+    "STRING":  0x09,
+    "BYTE":    0x05,
+    "WORD":    0x06,
+    "DWORD":   0x07,
+    "LWORD":   0x1B,
+    "WSTRING": 0x0B
+}
+
+# Constants for PDO types
 RPDO = 1
 TPDO = 2
 
-SlavePDOType = {"I" : TPDO, "Q" : RPDO}
-InvertPDOType = {RPDO : TPDO, TPDO : RPDO}
-PDOTypeBaseIndex = {RPDO : 0x1400, TPDO : 0x1800}
-PDOTypeBaseCobId = {RPDO : 0x200, TPDO : 0x180}
+SlavePDOType = {"I": TPDO, "Q": RPDO}
+InvertPDOType = {RPDO: TPDO, TPDO: RPDO}
+PDOTypeBaseIndex = {RPDO: 0x1400, TPDO: 0x1800}
+PDOTypeBaseCobId = {RPDO: 0x200, TPDO: 0x180}
 
 VariableIncrement = 0x100
-VariableStartIndex = {TPDO : 0x2000, RPDO : 0x4000}
-VariableDirText = {TPDO : "__I", RPDO : "__Q"}
-VariableTypeOffset = dict(zip(["","X","B","W","D","L"], range(6)))
+VariableStartIndex = {TPDO: 0x2000, RPDO: 0x4000}
+VariableDirText = {TPDO: "__I", RPDO: "__Q"}
+VariableTypeOffset = dict(zip(["", "X", "B", "W", "D", "L"], range(6)))
 
 TrashVariables = [(1, 0x01), (8, 0x05), (16, 0x06), (32, 0x07), (64, 0x1B)]
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                  Specific exception for PDO mapping errors
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 class PDOmappingException(Exception):
     pass
@@ -61,22 +83,22 @@
     @param size: number of bytes generated
     @return: a string containing the value converted
     """
-    
+
     data = ("%" + str(size * 2) + "." + str(size * 2) + "X") % value
     list_car = [data[i:i+2] for i in xrange(0, len(data), 2)]
     list_car.reverse()
     return "".join([chr(int(car, 16)) for car in list_car])
 
 
-def GetNodePDOIndexes(node, type, parameters = False):
+def GetNodePDOIndexes(node, type, parameters=False):
     """
     Find the PDO indexes of a node
-    @param node: node 
+    @param node: node
     @param type: type of PDO searched (RPDO or TPDO or both)
     @param parameters: indicate which indexes are expected (PDO paramaters : True or PDO mappings : False)
     @return: a list of indexes found
     """
-    
+
     indexes = []
     if type & RPDO:
         indexes.extend([idx for idx in node.GetIndexes() if 0x1400 <= idx <= 0x15FF])
@@ -91,17 +113,17 @@
 def SearchNodePDOMapping(loc_infos, node):
     """
     Find the PDO indexes of a node
-    @param node: node 
+    @param node: node
     @param type: type of PDO searched (RPDO or TPDO or both)
     @param parameters: indicate which indexes are expected (PDO paramaters : True or PDO mappings : False)
     @return: a list of indexes found
     """
-    
+
     model = (loc_infos["index"] << 16) + (loc_infos["subindex"] << 8)
-    
+
     for PDOidx in GetNodePDOIndexes(node, loc_infos["pdotype"]):
         values = node.GetEntry(PDOidx)
-        if values != None:
+        if values is not None:
             for subindex, mapping in enumerate(values):
                 if subindex != 0 and mapping & 0xFFFFFF00 == model:
                     return PDOidx, subindex
@@ -115,10 +137,10 @@
     @param cobid: PDO generated COB ID
     @param transmittype : PDO transmit type
     @param pdomapping: list of PDO mappings
-    @return: a tuple of value and number of parameters to add to DCF 
-    """
-    
-    dcfdata=[]
+    @return: a tuple of value and number of parameters to add to DCF
+    """
+
+    dcfdata = []
     # Create entry for RPDO or TPDO parameters and Disable PDO
     #           ---- INDEX -----   --- SUBINDEX ----   ----- SIZE ------   ------ DATA ------
     dcfdata += [LE_to_BE(idx, 2) + LE_to_BE(0x01, 1) + LE_to_BE(0x04, 4) + LE_to_BE(0x80000000 + cobid, 4)]
@@ -128,7 +150,7 @@
         # Disable Mapping
         dcfdata += [LE_to_BE(idx + 0x200, 2) + LE_to_BE(0x00, 1) + LE_to_BE(0x01, 4) + LE_to_BE(0x00, 1)]
         # Map Variables
-        for subindex, (name, loc_infos) in enumerate(pdomapping):
+        for subindex, (_name, loc_infos) in enumerate(pdomapping):
             value = (loc_infos["index"] << 16) + (loc_infos["subindex"] << 8) + loc_infos["size"]
             dcfdata += [LE_to_BE(idx + 0x200, 2) + LE_to_BE(subindex + 1, 1) + LE_to_BE(0x04, 4) + LE_to_BE(value, 4)]
         # Re-enable Mapping
@@ -137,7 +159,8 @@
     dcfdata += [LE_to_BE(idx, 2) + LE_to_BE(0x01, 1) + LE_to_BE(0x04, 4) + LE_to_BE(cobid, 4)]
     return "".join(dcfdata), len(dcfdata)
 
-class ConciseDCFGenerator:
+
+class ConciseDCFGenerator(object):
 
     def __init__(self, nodelist, nodename):
         # Dictionary of location informations classed by name
@@ -152,7 +175,7 @@
         self.TrashVariables = {}
         # Dictionary of pointed variables
         self.PointedVariables = {}
-        
+
         self.NodeList = nodelist
         self.Manager = self.NodeList.Manager
         self.MasterNode = self.Manager.GetCurrentNodeCopy()
@@ -161,41 +184,40 @@
 
     def GetPointedVariables(self):
         return self.PointedVariables
-    
+
     def RemoveUsedNodeCobId(self, node):
         """
         Remove all PDO COB ID used by the given node from the list of available COB ID
         @param node: node
         @return: a tuple of number of RPDO and TPDO for the node
         """
-        
+
         # Get list of all node TPDO and RPDO indexes
         nodeRpdoIndexes = GetNodePDOIndexes(node, RPDO, True)
         nodeTpdoIndexes = GetNodePDOIndexes(node, TPDO, True)
-        
+
         # Mark all the COB ID of the node already mapped PDO as not available
         for PdoIdx in nodeRpdoIndexes + nodeTpdoIndexes:
             pdo_cobid = node.GetEntry(PdoIdx, 0x01)
             # Extract COB ID, if PDO isn't active
-            if pdo_cobid > 0x600 :
+            if pdo_cobid > 0x600:
                 pdo_cobid -= 0x80000000
             # Remove COB ID from the list of available COB ID
             if pdo_cobid in self.ListCobIDAvailable:
                 self.ListCobIDAvailable.remove(pdo_cobid)
-        
+
         return len(nodeRpdoIndexes), len(nodeTpdoIndexes)
 
-    
     def PrepareMasterNode(self):
         """
         Add mandatory entries for DCF generation into MasterNode.
         """
-        
+
         # Adding DCF entry into Master node
         if not self.MasterNode.IsEntry(0x1F22):
             self.MasterNode.AddEntry(0x1F22, 1, "")
         self.Manager.AddSubentriesToCurrent(0x1F22, 127, self.MasterNode)
-        
+
         # Adding trash mappable variables for unused mapped datas
         idxTrashVariables = 0x2000 + self.MasterNode.GetNodeID()
         # Add an entry for storing unexpected all variable
@@ -206,40 +228,39 @@
             self.Manager.SetCurrentEntry(idxTrashVariables, subidx + 1, typeidx, "type", None, self.MasterNode)
             # Store the mapping value for this entry
             self.TrashVariables[size] = (idxTrashVariables << 16) + ((subidx + 1) << 8) + size
-        
+
         RPDOnumber, TPDOnumber = self.RemoveUsedNodeCobId(self.MasterNode)
-        
+
         # Store the indexes of the first RPDO and TPDO available for MasterNode
-        self.CurrentPDOParamsIdx = {RPDO : 0x1400 + RPDOnumber, TPDO : 0x1800 + TPDOnumber}
+        self.CurrentPDOParamsIdx = {RPDO: 0x1400 + RPDOnumber, TPDO: 0x1800 + TPDOnumber}
 
         # Prepare MasterNode with all nodelist slaves
         for idx, (nodeid, nodeinfos) in enumerate(self.NodeList.SlaveNodes.items()):
             node = nodeinfos["Node"]
             node.SetNodeID(nodeid)
-            
+
             RPDOnumber, TPDOnumber = self.RemoveUsedNodeCobId(node)
-            
+
             # Get Slave's default SDO server parameters
-            RSDO_cobid = node.GetEntry(0x1200,0x01)
+            RSDO_cobid = node.GetEntry(0x1200, 0x01)
             if not RSDO_cobid:
                 RSDO_cobid = 0x600 + nodeid
-            TSDO_cobid = node.GetEntry(0x1200,0x02)
+            TSDO_cobid = node.GetEntry(0x1200, 0x02)
             if not TSDO_cobid:
                 TSDO_cobid = 0x580 + nodeid
-            
+
             # Configure Master's SDO parameters entries
             self.Manager.ManageEntriesOfCurrent([0x1280 + idx], [], self.MasterNode)
             self.MasterNode.SetEntry(0x1280 + idx, 0x01, RSDO_cobid)
             self.MasterNode.SetEntry(0x1280 + idx, 0x02, TSDO_cobid)
-            self.MasterNode.SetEntry(0x1280 + idx, 0x03, nodeid)        
-        
-    
+            self.MasterNode.SetEntry(0x1280 + idx, 0x03, nodeid)
+
     def GetMasterNode(self):
         """
         Return MasterNode.
         """
         return self.MasterNode
-    
+
     def AddParamsToDCF(self, nodeid, data, nbparams):
         """
         Add entry to DCF, for the requested nodeID
@@ -249,19 +270,19 @@
         """
         # Get current DCF for slave
         nodeDCF = self.MasterNode.GetEntry(0x1F22, nodeid)
-        
+
         # Extract data and number of params in current DCF
-        if nodeDCF != None and nodeDCF != '':
+        if nodeDCF is not None and nodeDCF != '':
             tmpnbparams = [i for i in nodeDCF[:4]]
             tmpnbparams.reverse()
-            nbparams += int(''.join(["%2.2x"%ord(i) for i in tmpnbparams]), 16)
+            nbparams += int(''.join(["%2.2x" % ord(i) for i in tmpnbparams]), 16)
             data = nodeDCF[4:] + data
-        
+
         # Build new DCF
         dcf = LE_to_BE(nbparams, 0x04) + data
         # Set new DCF for slave
         self.MasterNode.SetEntry(0x1F22, nodeid, dcf)
-    
+
     def GetEmptyPDO(self, nodeid, pdotype, start_index=None):
         """
         Search a not configured PDO for a slave
@@ -275,12 +296,12 @@
             index = PDOTypeBaseIndex[pdotype]
         else:
             index = start_index
-        
+
         # Search for all PDO possible index until find a configurable PDO
         # starting from start_index
         while index < PDOTypeBaseIndex[pdotype] + 0x200:
             values = self.NodeList.GetSlaveNodeEntry(nodeid, index + 0x200)
-            if values != None and values[0] > 0:
+            if values is not None and values[0] > 0:
                 # Check that all subindex upper than 0 equal 0 => configurable PDO
                 if reduce(lambda x, y: x and y, map(lambda x: x == 0, values[1:]), True):
                     cobid = self.NodeList.GetSlaveNodeEntry(nodeid, index, 1)
@@ -296,7 +317,7 @@
                     return index, cobid, values[0]
             index += 1
         return None
-    
+
     def AddPDOMapping(self, nodeid, pdotype, pdoindex, pdocobid, pdomapping, sync_TPDOs):
         """
         Record a new mapping request for a slave, and add related slave config to the DCF
@@ -305,16 +326,18 @@
         @param pdomapping: list od variables to map with PDO
         """
         # Add an entry to MasterMapping
-        self.MasterMapping[pdocobid] = {"type" : InvertPDOType[pdotype], 
-            "mapping" : [None] + [(loc_infos["type"], name) for name, loc_infos in pdomapping]}
-        
+        self.MasterMapping[pdocobid] = {
+            "type":    InvertPDOType[pdotype],
+            "mapping": [None] + [(loc_infos["type"], name) for name, loc_infos in pdomapping]
+        }
+
         # Return the data to add to DCF
         if sync_TPDOs:
             return GeneratePDOMappingDCF(pdoindex, pdocobid, 0x01, pdomapping)
         else:
             return GeneratePDOMappingDCF(pdoindex, pdocobid, 0xFF, pdomapping)
         return 0, ""
-    
+
     def GenerateDCF(self, locations, current_location, sync_TPDOs):
         """
         Generate Concise DCF of MasterNode for the locations list given
@@ -322,87 +345,101 @@
         @param current_location: tuple of the located prefixes not to be considered
         @param sync_TPDOs: indicate if TPDO must be synchronous
         """
-        
-        #-------------------------------------------------------------------------------
+
+        # -------------------------------------------------------------------------------
         #               Verify that locations correspond to real slave variables
-        #-------------------------------------------------------------------------------
-        
+        # -------------------------------------------------------------------------------
+
         # Get list of locations check if exists and mappables -> put them in IECLocations
         for location in locations:
             COlocationtype = IECToCOType[location["IEC_TYPE"]]
             name = location["NAME"]
             if name in self.IECLocations:
                 if self.IECLocations[name]["type"] != COlocationtype:
-                    raise PDOmappingException, _("Type conflict for location \"%s\"") % name 
+                    raise PDOmappingException(_("Type conflict for location \"%s\"") % name)
             else:
                 # Get only the part of the location that concern this node
                 loc = location["LOC"][len(current_location):]
                 # loc correspond to (ID, INDEX, SUBINDEX [,BIT])
                 if len(loc) not in (2, 3, 4):
-                    raise PDOmappingException, _("Bad location size : %s") % str(loc)
+                    raise PDOmappingException(_("Bad location size : %s") % str(loc))
                 elif len(loc) == 2:
                     continue
-                
+
                 direction = location["DIR"]
-                
+
                 sizelocation = location["SIZE"]
-                
+
                 # Extract and check nodeid
                 nodeid, index, subindex = loc[:3]
-                
+
                 # Check Id is in slave node list
                 if nodeid not in self.NodeList.SlaveNodes.keys():
-                    raise PDOmappingException, _("Non existing node ID : {a1} (variable {a2})").format(a1 = nodeid, a2 = name)
-                
+                    raise PDOmappingException(
+                        _("Non existing node ID : {a1} (variable {a2})").
+                        format(a1=nodeid, a2=name))
+
                 # Get the model for this node (made from EDS)
                 node = self.NodeList.SlaveNodes[nodeid]["Node"]
-                
+
                 # Extract and check index and subindex
                 if not node.IsEntry(index, subindex):
                     msg = _("No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})").\
-                          format(a1 = "%x" % index, a2 ="%x" % subindex, a3 = nodeid, a4 = name)
-                    raise PDOmappingException, msg
-                
+                          format(a1="%x" % index, a2="%x" % subindex, a3=nodeid, a4=name)
+                    raise PDOmappingException(msg)
+
                 # Get the entry info
                 subentry_infos = node.GetSubentryInfos(index, subindex)
-                
+
                 # If a PDO mappable
                 if subentry_infos and subentry_infos["pdo"]:
                     if sizelocation == "X" and len(loc) > 3:
                         numbit = loc[3]
                     elif sizelocation != "X" and len(loc) > 3:
-                        msg = _("Cannot set bit offset for non bool '{a1}' variable (ID:{a2},Idx:{a3},sIdx:{a4}))").\
-                              format(a1 = name, a2 = nodeid, a3 = "%x" % index, a4 = "%x" % subindex)
-                        raise PDOmappingException, msg
+                        raise PDOmappingException(
+                            _("Cannot set bit offset for non bool '{a1}' variable (ID:{a2},Idx:{a3},sIdx:{a4}))").
+                            format(a1=name, a2=nodeid, a3="%x" % index, a4="%x" % subindex))
                     else:
                         numbit = None
-                    
+
                     if location["IEC_TYPE"] != "BOOL" and subentry_infos["type"] != COlocationtype:
-                        raise PDOmappingException, _("Invalid type \"{a1}\"-> {a2} != {a3}  for location\"{a4}\"").\
-                            format(a1 = location["IEC_TYPE"], a2 = COlocationtype, a3 = subentry_infos["type"] , a4 = name)
-                    
+                        raise PDOmappingException(
+                            _("Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\"").
+                            format(a1=location["IEC_TYPE"],
+                                   a2=COlocationtype,
+                                   a3=subentry_infos["type"],
+                                   a4=name))
+
                     typeinfos = node.GetEntryInfos(COlocationtype)
-                    self.IECLocations[name] = {"type":COlocationtype, "pdotype":SlavePDOType[direction],
-                                                "nodeid": nodeid, "index": index,"subindex": subindex,
-                                                "bit": numbit, "size": typeinfos["size"], "sizelocation": sizelocation}
+                    self.IECLocations[name] = {
+                        "type":         COlocationtype,
+                        "pdotype":      SlavePDOType[direction],
+                        "nodeid":       nodeid,
+                        "index":        index,
+                        "subindex":     subindex,
+                        "bit":          numbit,
+                        "size":         typeinfos["size"],
+                        "sizelocation": sizelocation
+                    }
                 else:
-                    raise PDOmappingException, _("Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))").\
-                        format(a1 = name, a2 = nodeid, a3 = "%x" % index, a4 = "%x" % subindex)
-        
-        #-------------------------------------------------------------------------------
+                    raise PDOmappingException(
+                        _("Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))").
+                        format(a1=name, a2=nodeid, a3="%x" % index, a4="%x" % subindex))
+
+        # -------------------------------------------------------------------------------
         #                         Search for locations already mapped
-        #-------------------------------------------------------------------------------
-        
+        # -------------------------------------------------------------------------------
+
         for name, locationinfos in self.IECLocations.items():
             node = self.NodeList.SlaveNodes[locationinfos["nodeid"]]["Node"]
-            
+
             # Search if slave has a PDO mapping this locations
             result = SearchNodePDOMapping(locationinfos, node)
-            if result != None:
+            if result is not None:
                 index, subindex = result
                 # Get COB ID of the PDO
                 cobid = self.NodeList.GetSlaveNodeEntry(locationinfos["nodeid"], index - 0x200, 1)
-                
+
                 # Add PDO to MasterMapping
                 if cobid not in self.MasterMapping.keys():
                     # Verify that PDO transmit type is conform to sync_TPDOs
@@ -414,44 +451,44 @@
                         else:
                             # Change TransmitType to ASYCHRONE
                             data, nbparams = GeneratePDOMappingDCF(index - 0x200, cobid, 0xFF, [])
-                        
-                        # Add entry to slave dcf to change transmit type of 
+
+                        # Add entry to slave dcf to change transmit type of
                         self.AddParamsToDCF(locationinfos["nodeid"], data, nbparams)
-                                    
+
                     mapping = [None]
                     values = node.GetEntry(index)
                     # Store the size of each entry mapped in PDO
                     for value in values[1:]:
                         if value != 0:
                             mapping.append(value % 0x100)
-                    self.MasterMapping[cobid] = {"type" : InvertPDOType[locationinfos["pdotype"]], "mapping" : mapping}
-            
+                    self.MasterMapping[cobid] = {"type": InvertPDOType[locationinfos["pdotype"]], "mapping": mapping}
+
                 # Indicate that this PDO entry must be saved
                 if locationinfos["bit"] is not None:
-                    if not isinstance(self.MasterMapping[cobid]["mapping"][subindex], ListType):
+                    if not isinstance(self.MasterMapping[cobid]["mapping"][subindex], list):
                         self.MasterMapping[cobid]["mapping"][subindex] = [1] * self.MasterMapping[cobid]["mapping"][subindex]
                     if locationinfos["bit"] < len(self.MasterMapping[cobid]["mapping"][subindex]):
                         self.MasterMapping[cobid]["mapping"][subindex][locationinfos["bit"]] = (locationinfos["type"], name)
                 else:
                     self.MasterMapping[cobid]["mapping"][subindex] = (locationinfos["type"], name)
-                
+
             else:
                 # Add location to those that haven't been mapped yet
                 if locationinfos["nodeid"] not in self.LocationsNotMapped.keys():
-                    self.LocationsNotMapped[locationinfos["nodeid"]] = {TPDO : [], RPDO : []}
+                    self.LocationsNotMapped[locationinfos["nodeid"]] = {TPDO: [], RPDO: []}
                 self.LocationsNotMapped[locationinfos["nodeid"]][locationinfos["pdotype"]].append((name, locationinfos))
-    
-        #-------------------------------------------------------------------------------
+
+        # -------------------------------------------------------------------------------
         #                         Build concise DCF for the others locations
-        #-------------------------------------------------------------------------------
-        
+        # -------------------------------------------------------------------------------
+
         for nodeid, locations in self.LocationsNotMapped.items():
             node = self.NodeList.SlaveNodes[nodeid]["Node"]
-            
+
             # Initialize number of params and data to add to node DCF
             nbparams = 0
             dataparams = ""
-            
+
             # Generate the best PDO mapping for each type of PDO
             for pdotype in (TPDO, RPDO):
                 if len(locations[pdotype]) > 0:
@@ -459,7 +496,8 @@
                     pdomapping = []
                     result = self.GetEmptyPDO(nodeid, pdotype)
                     if result is None:
-                        raise PDOmappingException, _("Unable to define PDO mapping for node %02x") % nodeid
+                        raise PDOmappingException(
+                            _("Unable to define PDO mapping for node %02x") % nodeid)
                     pdoindex, pdocobid, pdonbparams = result
                     for name, loc_infos in locations[pdotype]:
                         pdosize += loc_infos["size"]
@@ -473,7 +511,8 @@
                             pdomapping = [(name, loc_infos)]
                             result = self.GetEmptyPDO(nodeid, pdotype, pdoindex + 1)
                             if result is None:
-                                raise PDOmappingException, _("Unable to define PDO mapping for node %02x") % nodeid
+                                raise PDOmappingException(
+                                    _("Unable to define PDO mapping for node %02x") % nodeid)
                             pdoindex, pdocobid, pdonbparams = result
                         else:
                             pdomapping.append((name, loc_infos))
@@ -483,78 +522,79 @@
                         data, nbaddedparams = self.AddPDOMapping(nodeid, pdotype, pdoindex, pdocobid, pdomapping, sync_TPDOs)
                         dataparams += data
                         nbparams += nbaddedparams
-                
+
             # Add number of params and data to node DCF
             self.AddParamsToDCF(nodeid, dataparams, nbparams)
-        
-        #-------------------------------------------------------------------------------
+
+        # -------------------------------------------------------------------------------
         #                         Master Node Configuration
-        #-------------------------------------------------------------------------------
-        
+        # -------------------------------------------------------------------------------
+
         # Generate Master's Configuration from informations stored in MasterMapping
         for cobid, pdo_infos in self.MasterMapping.items():
             # Get next PDO index in MasterNode for this PDO type
             current_idx = self.CurrentPDOParamsIdx[pdo_infos["type"]]
-            
+
             # Search if there is already a PDO in MasterNode with this cob id
             for idx in GetNodePDOIndexes(self.MasterNode, pdo_infos["type"], True):
                 if self.MasterNode.GetEntry(idx, 1) == cobid:
                     current_idx = idx
-            
+
             # Add a PDO to MasterNode if not PDO have been found
             if current_idx == self.CurrentPDOParamsIdx[pdo_infos["type"]]:
                 addinglist = [current_idx, current_idx + 0x200]
                 self.Manager.ManageEntriesOfCurrent(addinglist, [], self.MasterNode)
                 self.MasterNode.SetEntry(current_idx, 0x01, cobid)
-                
+
                 # Increment the number of PDO for this PDO type
                 self.CurrentPDOParamsIdx[pdo_infos["type"]] += 1
-            
+
             # Change the transmit type of the PDO
             if sync_TPDOs:
                 self.MasterNode.SetEntry(current_idx, 0x02, 0x01)
             else:
                 self.MasterNode.SetEntry(current_idx, 0x02, 0xFF)
-            
+
             mapping = []
             for item in pdo_infos["mapping"]:
-                if isinstance(item, ListType):
+                if isinstance(item, list):
                     mapping.extend(item)
                 else:
                     mapping.append(item)
-            
+
             # Add some subentries to PDO mapping if there is not enough
             if len(mapping) > 1:
                 self.Manager.AddSubentriesToCurrent(current_idx + 0x200, len(mapping) - 1, self.MasterNode)
-            
+
             # Generate MasterNode's PDO mapping
             for subindex, variable in enumerate(mapping):
                 if subindex == 0:
                     continue
                 new_index = False
-                
-                if isinstance(variable, (IntType, LongType)):
+
+                if isinstance(variable, (int, long)):
                     # If variable is an integer then variable is unexpected
                     self.MasterNode.SetEntry(current_idx + 0x200, subindex, self.TrashVariables[variable])
                 else:
                     typeidx, varname = variable
                     variable_infos = self.IECLocations[varname]
-                    
+
                     # Calculate base index for storing variable
-                    mapvariableidx = VariableStartIndex[variable_infos["pdotype"]] + \
-                                     VariableTypeOffset[variable_infos["sizelocation"]] * VariableIncrement + \
-                                     variable_infos["nodeid"]
-                    
+                    mapvariableidx = \
+                        VariableStartIndex[variable_infos["pdotype"]] + \
+                        VariableTypeOffset[variable_infos["sizelocation"]] * VariableIncrement + \
+                        variable_infos["nodeid"]
+
                     # Generate entry name
-                    indexname = "%s%s%s_%d"%(VariableDirText[variable_infos["pdotype"]],
-                                                 variable_infos["sizelocation"],
-                                                 '_'.join(map(str,current_location)),
-                                                 variable_infos["nodeid"])    
-                    
-                    # Search for an entry that has an empty subindex 
+                    indexname = "%s%s%s_%d" % (VariableDirText[variable_infos["pdotype"]],
+                                               variable_infos["sizelocation"],
+                                               '_'.join(map(str, current_location)),
+                                               variable_infos["nodeid"])
+
+                    # Search for an entry that has an empty subindex
                     while mapvariableidx < VariableStartIndex[variable_infos["pdotype"]] + 0x2000:
                         # Entry doesn't exist
-                        if not self.MasterNode.IsEntry(mapvariableidx):    
+                        if not self.MasterNode.IsEntry(mapvariableidx):
                             # Add entry to MasterNode
                             self.Manager.AddMapVariableToCurrent(mapvariableidx, "beremiz"+indexname, 3, 1, self.MasterNode)
                             new_index = True
@@ -567,30 +607,31 @@
                                 mapvariableidx += 8 * VariableIncrement
                             else:
                                 break
-                                
+
                     # Verify that a not full entry has been found
                     if mapvariableidx < VariableStartIndex[variable_infos["pdotype"]] + 0x2000:
                         # Generate subentry name
-                        if variable_infos["bit"] != None:
-                            subindexname = "%(index)d_%(subindex)d_%(bit)d"%variable_infos
+                        if variable_infos["bit"] is not None:
+                            subindexname = "%(index)d_%(subindex)d_%(bit)d" % variable_infos
                         else:
-                            subindexname = "%(index)d_%(subindex)d"%variable_infos
+                            subindexname = "%(index)d_%(subindex)d" % variable_infos
                         # If entry have just been created, no subentry have to be added
                         if not new_index:
                             self.Manager.AddSubentriesToCurrent(mapvariableidx, 1, self.MasterNode)
                             nbsubentries += 1
                         # Add informations to the new subentry created
-                        self.MasterNode.SetMappingEntry(mapvariableidx, nbsubentries, values = {"name" : subindexname})
-                        self.MasterNode.SetMappingEntry(mapvariableidx, nbsubentries, values = {"type" : typeidx})
-                        
+                        self.MasterNode.SetMappingEntry(mapvariableidx, nbsubentries, values={"name": subindexname})
+                        self.MasterNode.SetMappingEntry(mapvariableidx, nbsubentries, values={"type": typeidx})
+
                         # Set value of the PDO mapping
                         typeinfos = self.Manager.GetEntryInfos(typeidx)
-                        if typeinfos != None:
+                        if typeinfos is not None:
                             value = (mapvariableidx << 16) + ((nbsubentries) << 8) + typeinfos["size"]
                             self.MasterNode.SetEntry(current_idx + 0x200, subindex, value)
-                        
+
                         # Add variable to pointed variables
-                        self.PointedVariables[(mapvariableidx, nbsubentries)] = "%s_%s"%(indexname, subindexname)
+                        self.PointedVariables[(mapvariableidx, nbsubentries)] = "%s_%s" % (indexname, subindexname)
+
 
 def GenerateConciseDCF(locations, current_location, nodelist, sync_TPDOs, nodename):
     """
@@ -605,13 +646,14 @@
     @param nodelist: CanFestival network editor model
     @return: a modified copy of the given CanFestival network editor model
     """
-    
+
     dcfgenerator = ConciseDCFGenerator(nodelist, nodename)
     dcfgenerator.GenerateDCF(locations, current_location, sync_TPDOs)
-    masternode,pointers = dcfgenerator.GetMasterNode(), dcfgenerator.GetPointedVariables()
+    masternode, pointers = dcfgenerator.GetMasterNode(), dcfgenerator.GetPointedVariables()
     # allow access to local OD from Master PLC
     pointers.update(LocalODPointers(locations, current_location, masternode))
-    return masternode,pointers
+    return masternode, pointers
+
 
 def LocalODPointers(locations, current_location, slave):
     IECLocations = {}
@@ -621,39 +663,43 @@
         name = location["NAME"]
         if name in IECLocations:
             if IECLocations[name] != COlocationtype:
-                raise PDOmappingException, _("Type conflict for location \"%s\"") % name 
+                raise PDOmappingException(_("Type conflict for location \"%s\"") % name)
         else:
             # Get only the part of the location that concern this node
             loc = location["LOC"][len(current_location):]
             # loc correspond to (ID, INDEX, SUBINDEX [,BIT])
             if len(loc) not in (2, 3, 4):
-                raise PDOmappingException, _("Bad location size : %s") % str(loc)
+                raise PDOmappingException(_("Bad location size : %s") % str(loc))
             elif len(loc) != 2:
                 continue
-            
+
             # Extract and check nodeid
             index, subindex = loc[:2]
-            
+
             # Extract and check index and subindex
             if not slave.IsEntry(index, subindex):
-                raise PDOmappingException, _("No such index/subindex ({a1},{a2}) (variable {a3})").\
-                    format(a1 = "%x" % index, a2 = "%x" % subindex, a3 = name)
-            
+                raise PDOmappingException(
+                    _("No such index/subindex ({a1},{a2}) (variable {a3})").
+                    format(a1="%x" % index, a2="%x" % subindex, a3=name))
+
             # Get the entry info
-            subentry_infos = slave.GetSubentryInfos(index, subindex)    
+            subentry_infos = slave.GetSubentryInfos(index, subindex)
             if subentry_infos["type"] != COlocationtype:
-                raise PDOmappingException, _("Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\"").\
-                    format( a1 = location["IEC_TYPE"], a2 = COlocationtype, a3 = subentry_infos["type"] , a4 = name)
-            
+                raise PDOmappingException(
+                    _("Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\"").
+                    format(a1=location["IEC_TYPE"],
+                           a2=COlocationtype,
+                           a3=subentry_infos["type"],
+                           a4=name))
+
             IECLocations[name] = COlocationtype
             pointers[(index, subindex)] = name
     return pointers
-        
-if __name__ == "__main__":
-    import os, sys, getopt
-
+
+
+if __name__ == "__main__":  # pylint: disable=all
     def usage():
-        print """
+        print("""
 Usage of config_utils.py test :
 
     %s [options]
@@ -666,14 +712,14 @@
             Reset the reference result of config_utils test.
             Use with caution. Be sure that config_utils
             is currently working properly.
-"""%sys.argv[0]
-    
+""" % sys.argv[0])
+
     # Boolean that indicate if reference result must be redefined
     reset = False
 
     # Extract command options
     try:
-        opts, args = getopt.getopt(sys.argv[1:], "hr", ["help","reset"])
+        opts, args = getopt.getopt(sys.argv[1:], "hr", ["help", "reset"])
     except getopt.GetoptError:
         # print help information and exit:
         usage()
@@ -693,54 +739,54 @@
         base_folder = os.path.split(base_folder)[0]
     # Add CanFestival folder to search pathes
     sys.path.append(os.path.join(base_folder, "CanFestival-3", "objdictgen"))
-    
+
     from nodemanager import *
     from nodelist import *
-    
+
     # Open the test nodelist contained into test_config folder
     manager = NodeManager()
     nodelist = NodeList(manager)
     result = nodelist.LoadProject("test_config")
-    
+
     # List of locations, we try to map for test
-    locations = [{"IEC_TYPE":"BYTE","NAME":"__IB0_1_64_24576_1","DIR":"I","SIZE":"B","LOC":(0,1,64,24576,1)},
-                 {"IEC_TYPE":"INT","NAME":"__IW0_1_64_25601_2","DIR":"I","SIZE":"W","LOC":(0,1,64,25601,2)},
-                 {"IEC_TYPE":"INT","NAME":"__IW0_1_64_25601_3","DIR":"I","SIZE":"W","LOC":(0,1,64,25601,3)},
-                 {"IEC_TYPE":"INT","NAME":"__QW0_1_64_25617_2","DIR":"Q","SIZE":"W","LOC":(0,1,64,25617,1)},
-                 {"IEC_TYPE":"BYTE","NAME":"__IB0_1_64_24578_1","DIR":"I","SIZE":"B","LOC":(0,1,64,24578,1)},
-                 {"IEC_TYPE":"UDINT","NAME":"__ID0_1_64_25638_1","DIR":"I","SIZE":"D","LOC":(0,1,64,25638,1)},
-                 {"IEC_TYPE":"UDINT","NAME":"__ID0_1_64_25638_2","DIR":"I","SIZE":"D","LOC":(0,1,64,25638,2)},
-                 {"IEC_TYPE":"UDINT","NAME":"__ID0_1_64_25638_3","DIR":"I","SIZE":"D","LOC":(0,1,64,25638,3)},
-                 {"IEC_TYPE":"UDINT","NAME":"__ID0_1_64_25638_4","DIR":"I","SIZE":"D","LOC":(0,1,64,25638,4)},
-                 {"IEC_TYPE":"UDINT","NAME":"__ID0_1_4096_0","DIR":"I","SIZE":"D","LOC":(0,1,4096,0)}]
-    
+    locations = [
+        {"IEC_TYPE": "BYTE",  "NAME": "__IB0_1_64_24576_1", "DIR": "I", "SIZE": "B", "LOC": (0, 1, 64, 24576, 1)},
+        {"IEC_TYPE": "INT",   "NAME": "__IW0_1_64_25601_2", "DIR": "I", "SIZE": "W", "LOC": (0, 1, 64, 25601, 2)},
+        {"IEC_TYPE": "INT",   "NAME": "__IW0_1_64_25601_3", "DIR": "I", "SIZE": "W", "LOC": (0, 1, 64, 25601, 3)},
+        {"IEC_TYPE": "INT",   "NAME": "__QW0_1_64_25617_2", "DIR": "Q", "SIZE": "W", "LOC": (0, 1, 64, 25617, 1)},
+        {"IEC_TYPE": "BYTE",  "NAME": "__IB0_1_64_24578_1", "DIR": "I", "SIZE": "B", "LOC": (0, 1, 64, 24578, 1)},
+        {"IEC_TYPE": "UDINT", "NAME": "__ID0_1_64_25638_1", "DIR": "I", "SIZE": "D", "LOC": (0, 1, 64, 25638, 1)},
+        {"IEC_TYPE": "UDINT", "NAME": "__ID0_1_64_25638_2", "DIR": "I", "SIZE": "D", "LOC": (0, 1, 64, 25638, 2)},
+        {"IEC_TYPE": "UDINT", "NAME": "__ID0_1_64_25638_3", "DIR": "I", "SIZE": "D", "LOC": (0, 1, 64, 25638, 3)},
+        {"IEC_TYPE": "UDINT", "NAME": "__ID0_1_64_25638_4", "DIR": "I", "SIZE": "D", "LOC": (0, 1, 64, 25638, 4)},
+        {"IEC_TYPE": "UDINT", "NAME": "__ID0_1_4096_0",     "DIR": "I", "SIZE": "D", "LOC": (0, 1, 4096, 0)}
+    ]
+
     # Generate MasterNode configuration
     try:
         masternode, pointedvariables = GenerateConciseDCF(locations, (0, 1), nodelist, True, "TestNode")
-    except ValueError, message:
-        print "%s\nTest Failed!"%message
+    except ValueError as message:
+        print("%s\nTest Failed!" % message)
         sys.exit()
-    
+
     import pprint
-    # Get Text corresponding to MasterNode 
+    # Get Text corresponding to MasterNode
     result_node = masternode.PrintString()
     result_vars = pprint.pformat(pointedvariables)
     result = result_node + "\n********POINTERS*********\n" + result_vars + "\n"
-    
+
     # If reset has been choosen
     if reset:
         # Write Text into reference result file
         testfile = open("test_config/result.txt", "w")
         testfile.write(result)
         testfile.close()
-        
-        print "Reset Successful!"
+
+        print("Reset Successful!")
     else:
-        import os
-        
         testfile = open("test_config/result_tmp.txt", "w")
         testfile.write(result)
         testfile.close()
-        
+
         os.system("diff test_config/result.txt test_config/result_tmp.txt")
         os.remove("test_config/result_tmp.txt")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/connectors/ConnectorBase.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# See COPYING file for copyrights details.
+
+import md5
+
+class ConnectorBase(object):
+
+    #chuncksize = 16384
+    chuncksize = 1024*1024
+    def BlobFromFile(self, filepath): 
+        s = md5.new()
+        blobID = s.digest()  # empty md5, to support empty blob
+        with open(filepath, "rb") as f:
+            while True:
+                chunk = f.read(self.chuncksize) 
+                if len(chunk) == 0: return blobID
+                blobID = self.AppendChunkToBlob(chunk, blobID)
+                s.update(chunk)
+                if blobID != s.digest(): return None
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/connectors/PYRO/PSK_Adapter.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,85 @@
+from __future__ import absolute_import
+from __future__ import print_function
+
+import socket
+import re
+import sslpsk
+import ssl
+import Pyro
+from Pyro.core import PyroURI
+from Pyro.protocol import _connect_socket,TCPConnection,PYROAdapter
+from Pyro.errors import ConnectionDeniedError, ProtocolError
+from Pyro.util import Log
+
+#
+# The TLS-PSK adapter that handles SSL connections instead of regular sockets,
+# but using Pre Shared Keys instead of Certificates
+#
+class PYROPSKAdapter(PYROAdapter):
+    # This is essentialy the same as in Pyro/protocol.py
+    # only raw_sock wrapping into sock through sslpsk.wrap_socket was added
+    # Pyro unfortunately doesn't allow cleaner customization
+    def bindToURI(self,URI):
+        with self.lock:   # only 1 thread at a time can bind the URI
+            try:
+                self.URI=URI
+
+                # This are the statements that differ from Pyro/protocol.py
+                raw_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+                _connect_socket(raw_sock, URI.address, URI.port, self.timeout)
+                sock = sslpsk.wrap_socket(
+                    raw_sock, psk=Pyro.config.PYROPSK, server_side=False,
+                    ciphers="PSK-AES256-CBC-SHA", # available in openssl 1.0.2 
+                    ssl_version=ssl.PROTOCOL_TLSv1)
+                # all the rest is the same as in Pyro/protocol.py 
+
+                conn=TCPConnection(sock, sock.getpeername())
+                # receive the authentication challenge string, and use that to build the actual identification string.
+                try:
+                    authChallenge=self.recvAuthChallenge(conn)
+                except ProtocolError,x:
+                    # check if we were denied
+                    if hasattr(x,"partialMsg") and x.partialMsg[:len(self.denyMSG)]==self.denyMSG:
+                        raise ConnectionDeniedError(Pyro.constants.deniedReasons[int(x.partialMsg[-1])])
+                    else:
+                        raise
+                # reply with our ident token, generated from the ident passphrase and the challenge
+                msg = self._sendConnect(sock,self.newConnValidator.createAuthToken(self.ident, authChallenge, conn.addr, self.URI, None) )
+                if msg==self.acceptMSG:
+                    self.conn=conn
+                    self.conn.connected=1
+                    Log.msg('PYROAdapter','connected to',str(URI))
+                    if URI.protocol=='PYROLOCPSK':
+                        self.resolvePYROLOC_URI("PYROPSK") # updates self.URI
+                elif msg[:len(self.denyMSG)]==self.denyMSG:
+                    try:
+                        raise ConnectionDeniedError(Pyro.constants.deniedReasons[int(msg[-1])])
+                    except (KeyError,ValueError):
+                        raise ConnectionDeniedError('invalid response')
+            except socket.error:
+                Log.msg('PYROAdapter','connection failed to URI',str(URI))
+                raise ProtocolError('connection failed')
+
+_getProtocolAdapter = Pyro.protocol.getProtocolAdapter
+def getProtocolAdapter(protocol):
+    if protocol in ('PYROPSK', 'PYROLOCPSK'):
+        return PYROPSKAdapter()
+    return _getProtocolAdapter(protocol)
+
+Pyro.protocol.getProtocolAdapter = getProtocolAdapter
+
+_processStringURI = Pyro.core.processStringURI
+def processStringURI(URI):
+    x=re.match(r'(?P<protocol>PYROLOCPSK)://(?P<hostname>[^\s:]+):?(?P<port>\d+)?/(?P<name>\S*)',URI)
+    if x:
+        protocol=x.group('protocol')
+        hostname=x.group('hostname')
+        port=x.group('port')
+        if port:
+            port=int(port)
+        else:
+            port=0
+        name=x.group('name')
+        return PyroURI(hostname,name,port,protocol)
+    return _processStringURI(URI)
+Pyro.core.processStringURI = processStringURI
--- a/connectors/PYRO/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/connectors/PYRO/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,199 +1,136 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-#
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-#
-# See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-import Pyro
-import Pyro.core
-import Pyro.util
-from Pyro.errors import PyroError
-import traceback
-from time import sleep
-import copy
-import socket
-service_type = '_PYRO._tcp.local.'
-import os.path
-# this module attribute contains a list of DNS-SD (Zeroconf) service types
-# supported by this connector confnode.
-#
-# for connectors that do not support DNS-SD, this attribute can be omitted
-# or set to an empty list.
-
-def PYRO_connector_factory(uri, confnodesroot):
-    """
-    This returns the connector to Pyro style PLCobject
-    """
-    confnodesroot.logger.write(_("PYRO connecting to URI : %s\n") % uri)
-
-    servicetype, location = uri.split("://")
-    if servicetype == "PYROS":
-        schemename = "PYROLOCSSL"
-        # Protect against name->IP substitution in Pyro3
-        Pyro.config.PYRO_DNS_URI = True
-        # Beware Pyro lib need str path, not unicode
-        # don't rely on PYRO_STORAGE ! see documentation
-        Pyro.config.PYROSSL_CERTDIR = os.path.abspath(str(confnodesroot.ProjectPath) + '/certs')
-        if not os.path.exists(Pyro.config.PYROSSL_CERTDIR):
-            confnodesroot.logger.write_error(
-                'Error : the directory %s is missing for SSL certificates (certs_dir).'
-                'Please fix it in your project.\n' % Pyro.config.PYROSSL_CERTDIR)
-            return None
-        else:
-            confnodesroot.logger.write(_("PYRO using certificates in '%s' \n")
-                                       % (Pyro.config.PYROSSL_CERTDIR))
-        Pyro.config.PYROSSL_CERT = "client.crt"
-        Pyro.config.PYROSSL_KEY = "client.key"
-        # Ugly Monkey Patching
-        def _gettimeout(self):
-            return self.timeout
-
-        def _settimeout(self, timeout):
-            self.timeout = timeout
-        from M2Crypto.SSL import Connection
-        Connection.timeout = None
-        Connection.gettimeout = _gettimeout
-        Connection.settimeout = _settimeout
-        # M2Crypto.SSL.Checker.WrongHost: Peer certificate commonName does not
-        # match host, expected 127.0.0.1, got server
-        Connection.clientPostConnectionCheck = None
-    else:
-        schemename = "PYROLOC"
-    if location.find(service_type) != -1:
-        try:
-            from util.Zeroconf import Zeroconf
-            r = Zeroconf()
-            i = r.getServiceInfo(service_type, location)
-            if i is None:
-                raise Exception("'%s' not found" % location)
-            ip = str(socket.inet_ntoa(i.getAddress()))
-            port = str(i.getPort())
-            newlocation = ip + ':' + port
-            confnodesroot.logger.write(_("'{a1}' is located at {a2}\n").format(a1 = location, a2 = newlocation))
-            location = newlocation
-            r.close()
-        except Exception, msg:
-            confnodesroot.logger.write_error(_("MDNS resolution failure for '%s'\n") % location)
-            confnodesroot.logger.write_error(traceback.format_exc())
-            return None
-
-    # Try to get the proxy object
-    try:
-        RemotePLCObjectProxy = Pyro.core.getAttrProxyForURI(schemename + "://" + location + "/PLCObject")
-    except Exception, msg:
-        confnodesroot.logger.write_error(_("Connection to '%s' failed.\n") % location)
-        confnodesroot.logger.write_error(traceback.format_exc())
-        return None
-
-    def PyroCatcher(func, default=None):
-        """
-        A function that catch a Pyro exceptions, write error to logger
-        and return default value when it happen
-        """
-        def catcher_func(*args, **kwargs):
-            try:
-                return func(*args, **kwargs)
-            except Pyro.errors.ConnectionClosedError, e:
-                confnodesroot.logger.write_error(_("Connection lost!\n"))
-                confnodesroot._SetConnector(None)
-            except Pyro.errors.ProtocolError, e:
-                confnodesroot.logger.write_error(_("Pyro exception: %s\n") % e)
-            except Exception, e:
-                # confnodesroot.logger.write_error(traceback.format_exc())
-                errmess = ''.join(Pyro.util.getPyroTraceback(e))
-                confnodesroot.logger.write_error(errmess + "\n")
-                print errmess
-                confnodesroot._SetConnector(None)
-            return default
-        return catcher_func
-
-    # Check connection is effective.
-    # lambda is for getattr of GetPLCstatus to happen inside catcher
-    if PyroCatcher(lambda: RemotePLCObjectProxy.GetPLCstatus())() is None:
-        confnodesroot.logger.write_error(_("Cannot get PLC status - connection failed.\n"))
-        return None
-
-    class PyroProxyProxy(object):
-        """
-        A proxy proxy class to handle Beremiz Pyro interface specific behavior.
-        And to put Pyro exception catcher in between caller and Pyro proxy
-        """
-        def __init__(self):
-            # for safe use in from debug thread, must create a copy
-            self.RemotePLCObjectProxyCopy = None
-
-        def GetPyroProxy(self):
-            """
-            This func returns the real Pyro Proxy.
-            Use this if you musn't keep reference to it.
-            """
-            return RemotePLCObjectProxy
-
-        def _PyroStartPLC(self, *args, **kwargs):
-            """
-            confnodesroot._connector.GetPyroProxy() is used
-            rather than RemotePLCObjectProxy because
-            object is recreated meanwhile,
-            so we must not keep ref to it here
-            """
-            current_status, log_count = confnodesroot._connector.GetPyroProxy().GetPLCstatus()
-            if current_status == "Dirty":
-                """
-                Some bad libs with static symbols may polute PLC
-                ask runtime to suicide and come back again
-                """
-                confnodesroot.logger.write(_("Force runtime reload\n"))
-                confnodesroot._connector.GetPyroProxy().ForceReload()
-                confnodesroot._Disconnect()
-                # let remote PLC time to resurect.(freeze app)
-                sleep(0.5)
-                confnodesroot._Connect()
-            self.RemotePLCObjectProxyCopy = copy.copy(confnodesroot._connector.GetPyroProxy())
-            return confnodesroot._connector.GetPyroProxy().StartPLC(*args, **kwargs)
-        StartPLC = PyroCatcher(_PyroStartPLC, False)
-
-        def _PyroGetTraceVariables(self):
-            """
-            for safe use in from debug thread, must use the copy
-            """
-            if self.RemotePLCObjectProxyCopy is None:
-                self.RemotePLCObjectProxyCopy = copy.copy(confnodesroot._connector.GetPyroProxy())
-            return self.RemotePLCObjectProxyCopy.GetTraceVariables()
-        GetTraceVariables = PyroCatcher(_PyroGetTraceVariables, ("Broken", None))
-
-        def _PyroGetPLCstatus(self):
-            return RemotePLCObjectProxy.GetPLCstatus()
-        GetPLCstatus = PyroCatcher(_PyroGetPLCstatus, ("Broken", None))
-
-        def _PyroRemoteExec(self, script, **kwargs):
-            return RemotePLCObjectProxy.RemoteExec(script, **kwargs)
-        RemoteExec = PyroCatcher(_PyroRemoteExec, (-1, "RemoteExec script failed!"))
-
-        def __getattr__(self, attrName):
-            member = self.__dict__.get(attrName, None)
-            if member is None:
-                def my_local_func(*args, **kwargs):
-                    return RemotePLCObjectProxy.__getattr__(attrName)(*args, **kwargs)
-                member = PyroCatcher(my_local_func, None)
-                self.__dict__[attrName] = member
-            return member
-
-    return PyroProxyProxy()
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+
+from __future__ import absolute_import
+from __future__ import print_function
+import traceback
+from time import sleep
+import copy
+import socket
+import os.path
+
+import Pyro
+import Pyro.core
+import Pyro.util
+from Pyro.errors import PyroError
+
+import PSKManagement as PSK
+from runtime import PlcStatus
+
+# this module attribute contains a list of DNS-SD (Zeroconf) service types
+# supported by this connector confnode.
+#
+# for connectors that do not support DNS-SD, this attribute can be omitted
+# or set to an empty list.
+
+
+def PYRO_connector_factory(uri, confnodesroot):
+    """
+    This returns the connector to Pyro style PLCobject
+    """
+    confnodesroot.logger.write(_("PYRO connecting to URI : %s\n") % uri)
+
+    scheme, location = uri.split("://")
+    if scheme == "PYROS":
+        import connectors.PYRO.PSK_Adapter
+        schemename = "PYROLOCPSK"
+        url, ID = location.split('#') #TODO fix exception when # not found
+        # load PSK from project
+        secpath = os.path.join(str(confnodesroot.ProjectPath), 'psk', ID+'.secret')
+        if not os.path.exists(secpath):
+            confnodesroot.logger.write_error(
+                'Error: Pre-Shared-Key Secret in %s is missing!\n' % secpath)
+            return None
+        secret = open(secpath).read().partition(':')[2].rstrip('\n\r')
+        Pyro.config.PYROPSK = (secret, ID)
+        # strip ID from URL, so that pyro can understand it.
+        location = url
+    else:
+        schemename = "PYROLOC"
+
+    # Try to get the proxy object
+    try:
+        RemotePLCObjectProxy = Pyro.core.getAttrProxyForURI(schemename + "://" + location + "/PLCObject")
+    except Exception:
+        confnodesroot.logger.write_error(_("Connection to '%s' failed with exception '%s'\n") % (location, str(e)))
+        #confnodesroot.logger.write_error(traceback.format_exc())
+        return None
+
+    RemotePLCObjectProxy.adapter.setTimeout(60)
+
+    def PyroCatcher(func, default=None):
+        """
+        A function that catch a Pyro exceptions, write error to logger
+        and return default value when it happen
+        """
+        def catcher_func(*args, **kwargs):
+            try:
+                return func(*args, **kwargs)
+            except Pyro.errors.ConnectionClosedError as e:
+                confnodesroot.logger.write_error(_("Connection lost!\n"))
+                confnodesroot._SetConnector(None)
+            except Pyro.errors.ProtocolError as e:
+                confnodesroot.logger.write_error(_("Pyro exception: %s\n") % e)
+            except Exception as e:
+                # confnodesroot.logger.write_error(traceback.format_exc())
+                errmess = ''.join(Pyro.util.getPyroTraceback(e))
+                confnodesroot.logger.write_error(errmess + "\n")
+                print(errmess)
+                confnodesroot._SetConnector(None)
+            return default
+        return catcher_func
+
+    # Check connection is effective.
+    # lambda is for getattr of GetPLCstatus to happen inside catcher
+    IDPSK = PyroCatcher(RemotePLCObjectProxy.GetPLCID)()
+    if IDPSK is None:
+        confnodesroot.logger.write_warning(_("PLC did not provide identity and security infomation.\n"))
+    else:
+        ID,secret = IDPSK
+        PSK.UpdateID(confnodesroot.ProjectPath, ID, secret, uri)
+
+
+    _special_return_funcs = {
+        "StartPLC": False,
+        "GetTraceVariables": (PlcStatus.Broken, None),
+        "GetPLCstatus": (PlcStatus.Broken, None),
+        "RemoteExec": (-1, "RemoteExec script failed!")
+    }
+
+    class PyroProxyProxy(object):
+        """
+        A proxy proxy class to handle Beremiz Pyro interface specific behavior.
+        And to put Pyro exception catcher in between caller and Pyro proxy
+        """
+        def __getattr__(self, attrName):
+            member = self.__dict__.get(attrName, None)
+            if member is None:
+                def my_local_func(*args, **kwargs):
+                    return RemotePLCObjectProxy.__getattr__(attrName)(*args, **kwargs)
+                member = PyroCatcher(my_local_func, _special_return_funcs.get(attrName, None))
+                self.__dict__[attrName] = member
+            return member
+
+    return PyroProxyProxy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/connectors/PYRO_dialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+
+from itertools import repeat, islice, chain
+import wx
+
+from connectors.SchemeEditor import SchemeEditor
+
+
+model = [('host',_("Host:")),
+         ('port',_("Port:"))]
+
+# (scheme, model, secure)
+models = [("LOCAL", [], False), ("PYRO", model, False), ("PYROS", model, True)]
+
+Schemes = list(zip(*models)[0])
+
+_PerSchemeConf = {sch : (mod,sec) for sch,mod,sec in models}
+
+class PYRO_dialog(SchemeEditor):
+    def __init__(self, scheme, *args, **kwargs):
+       
+        # ID selector is enabled only on PYROS (secure)
+        self.model, self.EnableIDSelector = _PerSchemeConf[scheme]
+
+        SchemeEditor.__init__(self, scheme, *args, **kwargs)
+
+    def SetLoc(self, loc):
+        hostport, ID = list(islice(chain(loc.split("#"), repeat("")),2))
+        host, port = list(islice(chain(hostport.split(":"), repeat("")),2))
+        self.SetFields(locals())
+
+    def GetLoc(self):
+        if self.model:
+            fields = self.GetFields()
+            template = "{host}"
+            if fields['port']:
+                template += ":{port}" 
+            if fields['ID']:
+                template += "#{ID}" 
+
+            return template.format(**fields)
+        return ''
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/connectors/SchemeEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+
+from itertools import repeat, izip_longest
+from functools import partial
+import wx
+
+from controls.IDBrowser import IDBrowser
+
+class SchemeEditor(wx.Panel):
+    def __init__(self, scheme, parent, *args, **kwargs):
+        self.txtctrls = {} 
+        wx.Panel.__init__(self, parent, *args, **kwargs)
+
+        self.fieldsizer = wx.FlexGridSizer(cols=2, hgap=10, vgap=10)
+
+        if self.EnableIDSelector:
+            self.model = self.model + [("ID", _("ID:"))]
+
+        for tag, label in self.model:
+            txtctrl = wx.TextCtrl(parent=self, size=wx.Size(200, -1))
+            self.txtctrls[tag] = txtctrl
+            for win, flag in [
+                (wx.StaticText(self, label=label), wx.ALIGN_CENTER_VERTICAL),
+                (txtctrl, wx.GROW)]:
+                self.fieldsizer.AddWindow(win, flag=flag)
+
+        self.fieldsizer.AddSpacer(20)
+
+        if self.EnableIDSelector:
+            self.mainsizer = wx.FlexGridSizer(cols=2, hgap=10, vgap=10)
+            self.mainsizer.AddSizer(self.fieldsizer)
+            self.idselector = IDBrowser(
+                self, parent.ctr,
+                # use a callafter, as editor can be deleted by calling SetURI
+                partial(wx.CallAfter, parent.SetURI),
+                self.txtctrls[tag].SetValue)
+            self.mainsizer.AddWindow(self.idselector)
+            self.SetSizer(self.mainsizer)
+        else:
+            self.SetSizer(self.fieldsizer)
+
+    def SetFields(self, fields):
+        for tag, label in self.model:
+            self.txtctrls[tag].SetValue(fields[tag])
+
+    def GetFields(self):
+        return {tag: self.txtctrls[tag].GetValue() for tag,label in self.model}
+
--- a/connectors/WAMP/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/connectors/WAMP/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,76 +22,88 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import sys, traceback, atexit
-#from twisted.python import log
+
+from __future__ import absolute_import
+from __future__ import print_function
+import sys
+import traceback
+from functools import partial
+from threading import Thread, Event
+from six import text_type as text
+
 from twisted.internet import reactor, threads
 from autobahn.twisted import wamp
 from autobahn.twisted.websocket import WampWebSocketClientFactory, connectWS
 from autobahn.wamp import types
 from autobahn.wamp.exception import TransportLost
 from autobahn.wamp.serializer import MsgPackSerializer
-from threading import Thread, Event
+
+from runtime import PlcStatus
 
 _WampSession = None
 _WampConnection = None
 _WampSessionEvent = Event()
 
+
 class WampSession(wamp.ApplicationSession):
     def onJoin(self, details):
-        global _WampSession, _WampSessionEvent
+        global _WampSession
         _WampSession = self
         _WampSessionEvent.set()
-        print 'WAMP session joined for :', self.config.extra["ID"]
+        print('WAMP session joined for :', self.config.extra["ID"])
 
     def onLeave(self, details):
-        global _WampSession, _WampSessionEvent
+        global _WampSession
         _WampSessionEvent.clear()
         _WampSession = None
-        print 'WAMP session left'
+        print('WAMP session left')
 
-PLCObjDefaults = { "StartPLC": False,
-                   "GetTraceVariables" : ("Broken",None),
-                   "GetPLCstatus" : ("Broken",None),
-                   "RemoteExec" : (-1, "RemoteExec script failed!")}
 
-def WAMP_connector_factory(uri, confnodesroot):
+PLCObjDefaults = {
+    "StartPLC":          False,
+    "GetTraceVariables": ("Broken", None),
+    "GetPLCstatus":      (PlcStatus.Broken, None),
+    "RemoteExec":        (-1, "RemoteExec script failed!")
+}
+
+
+def _WAMP_connector_factory(cls, uri, confnodesroot):
     """
     WAMP://127.0.0.1:12345/path#realm#ID
     WAMPS://127.0.0.1:12345/path#realm#ID
     """
-    servicetype, location = uri.split("://")
+    scheme, location = uri.split("://")
     urlpath, realm, ID = location.split('#')
-    urlprefix = {"WAMP":"ws",
-                 "WAMPS":"wss"}[servicetype]
+    urlprefix = {"WAMP":  "ws",
+                 "WAMPS": "wss"}[scheme]
     url = urlprefix+"://"+urlpath
 
     def RegisterWampClient():
 
-        ## start logging to console
+        # start logging to console
         # log.startLogging(sys.stdout)
 
         # create a WAMP application session factory
         component_config = types.ComponentConfig(
-            realm = realm,
-            extra = {"ID":ID})
+            realm=text(realm),
+            extra={"ID": ID})
         session_factory = wamp.ApplicationSessionFactory(
-            config = component_config)
-        session_factory.session = WampSession
+            config=component_config)
+        session_factory.session = cls
 
         # create a WAMP-over-WebSocket transport client factory
         transport_factory = WampWebSocketClientFactory(
             session_factory,
-            url = url,
-            serializers = [MsgPackSerializer()],
-            debug = False,
-            debug_wamp = False)
+            url=url,
+            serializers=[MsgPackSerializer()])
 
         # start the client from a Twisted endpoint
         conn = connectWS(transport_factory)
-        confnodesroot.logger.write(_("WAMP connecting to URL : %s\n")%url)
+        confnodesroot.logger.write(_("WAMP connecting to URL : %s\n") % url)
         return conn
 
     AddToDoBeforeQuit = confnodesroot.AppFrame.AddToDoBeforeQuit
+
     def ThreadProc():
         global _WampConnection
         _WampConnection = RegisterWampClient()
@@ -99,39 +111,38 @@
         reactor.run(installSignalHandlers=False)
 
     def WampSessionProcMapper(funcname):
-        wampfuncname = '.'.join((ID,funcname))
-        def catcher_func(*args,**kwargs):
-            global _WampSession
-            if _WampSession is not None :
+        wampfuncname = text('.'.join((ID, funcname)))
+
+        def catcher_func(*args, **kwargs):
+            if _WampSession is not None:
                 try:
                     return threads.blockingCallFromThread(
                         reactor, _WampSession.call, wampfuncname,
-                        *args,**kwargs)
-                except TransportLost, e:
+                        *args, **kwargs)
+                except TransportLost:
                     confnodesroot.logger.write_error(_("Connection lost!\n"))
                     confnodesroot._SetConnector(None)
-                except Exception,e:
+                except Exception:
                     errmess = traceback.format_exc()
                     confnodesroot.logger.write_error(errmess+"\n")
-                    print errmess
-                    #confnodesroot._SetConnector(None)
+                    print(errmess)
+                    # confnodesroot._SetConnector(None)
             return PLCObjDefaults.get(funcname)
         return catcher_func
 
     class WampPLCObjectProxy(object):
         def __init__(self):
-            global _WampSessionEvent, _WampConnection
+            global _WampConnection
             if not reactor.running:
                 Thread(target=ThreadProc).start()
             else:
                 _WampConnection = threads.blockingCallFromThread(
                     reactor, RegisterWampClient)
             if not _WampSessionEvent.wait(5):
-                _WampConnection = stopConnecting()
-                raise Exception, _("WAMP connection timeout")
+                _WampConnection.stopConnecting()
+                raise Exception(_("WAMP connection timeout"))
 
         def __del__(self):
-            global _WampConnection
             _WampConnection.disconnect()
             #
             # reactor.stop()
@@ -143,14 +154,9 @@
                 self.__dict__[attrName] = member
             return member
 
-    # Try to get the proxy object
-    try :
-        return WampPLCObjectProxy()
-    except Exception, msg:
-        confnodesroot.logger.write_error(_("WAMP connection to '%s' failed.\n")%location)
-        confnodesroot.logger.write_error(traceback.format_exc())
-        return None
+    # TODO : GetPLCID()
+    # TODO : PSK.UpdateID()
 
+    return WampPLCObjectProxy
 
-
-
+WAMP_connector_factory = partial(_WAMP_connector_factory, WampSession)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/connectors/WAMP_dialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+
+from itertools import repeat, islice, chain
+import wx
+
+from connectors.SchemeEditor import SchemeEditor
+
+Schemes = ["WAMP", "WAMPS"]
+
+model = [('host',_("Host:")),
+         ('port',_("Port:")),
+         ('realm',_("Realm:"))]
+
+class WAMP_dialog(SchemeEditor):
+    def __init__(self, *args, **kwargs):
+        self.model = model
+        self.EnableIDSelector = True
+        SchemeEditor.__init__(self, *args, **kwargs)
+
+    def SetLoc(self, loc):
+        hostport, realm, ID = list(islice(chain(loc.split("#"), repeat("")),3))
+        host, port = list(islice(chain(hostport.split(":"), repeat("")),2))
+        self.SetFields(locals())
+
+    def GetLoc(self):
+        fields = self.GetFields()
+
+        #TODO : input validation test
+
+        template = "{host}" + \
+                   (":{port}" if fields['port'] else '') +\
+                   "#{realm}#{ID}"
+
+        return template.format(**fields)
+
--- a/connectors/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/connectors/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,65 +1,130 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-#
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-#
-# See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-# Package initialisation
-
-from os import listdir, path
-
-
-_base_path = path.split(__file__)[0]
-
-
-def _GetLocalConnectorClassFactory(name):
-    return lambda: getattr(__import__(name, globals(), locals()), name + "_connector_factory")
-
-connectors = {name:_GetLocalConnectorClassFactory(name)
-                  for name in listdir(_base_path)
-                      if path.isdir(path.join(_base_path, name))
-                          and not name.startswith("__")}
-
-
-def ConnectorFactory(uri, confnodesroot):
-    """
-    Return a connector corresponding to the URI
-    or None if cannot connect to URI
-    """
-    servicetype = uri.split("://")[0].upper()
-    if servicetype == "LOCAL":
-        # Local is special case
-        # pyro connection to local runtime
-        # started on demand, listening on random port
-        servicetype = "PYRO"
-        runtime_port = confnodesroot.AppFrame.StartLocalRuntime(
-            taskbaricon=True)
-        uri = "PYROLOC://127.0.0.1:" + str(runtime_port)
-    elif servicetype in connectors:
-        pass
-    elif servicetype[-1] == 'S' and servicetype[:-1] in connectors:
-        servicetype = servicetype[:-1]
-    else:
-        return None
-
-    # import module according to uri type
-    connectorclass = connectors[servicetype]()
-    return connectorclass(uri, confnodesroot)
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+# Package initialisation
+
+
+from __future__ import absolute_import
+from os import listdir, path
+import util.paths as paths
+from connectors.ConnectorBase import ConnectorBase
+from types import ClassType
+
+connectors_packages = ["PYRO","WAMP"]
+
+
+def _GetLocalConnectorClassFactory(name):
+    return lambda: getattr(__import__(name, globals(), locals()), name + "_connector_factory")
+
+
+connectors = {name: _GetLocalConnectorClassFactory(name)
+              for name in connectors_packages}
+
+_dialogs_imported = False
+per_URI_connectors = None
+schemes = None 
+
+# lazy import of connectors dialogs, only if used
+def _Import_Dialogs():
+    global per_URI_connectors, schemes, _dialogs_imported
+    if not _dialogs_imported: 
+        _dialogs_imported = True
+        per_URI_connectors = {}
+        schemes = []
+        for con_name in connectors_packages:
+            module =  __import__(con_name + '_dialog', globals(), locals())
+
+            for scheme in module.Schemes:
+                per_URI_connectors[scheme] = getattr(module, con_name + '_dialog')
+                schemes += [scheme]
+
+
+def ConnectorFactory(uri, confnodesroot):
+    """
+    Return a connector corresponding to the URI
+    or None if cannot connect to URI
+    """
+    _scheme = uri.split("://")[0].upper()
+
+    # commented code to enable for MDNS:// support
+    # _scheme, location = uri.split("://")
+    # _scheme = _scheme.upper()
+
+    if _scheme == "LOCAL":
+        # Local is special case
+        # pyro connection to local runtime
+        # started on demand, listening on random port
+        scheme = "PYRO"
+        runtime_port = confnodesroot.AppFrame.StartLocalRuntime(
+            taskbaricon=True)
+        uri = "PYROLOC://127.0.0.1:" + str(runtime_port)
+
+    # commented code to enable for MDNS:// support
+    # elif _scheme == "MDNS":
+    #     try:
+    #         from zeroconf import Zeroconf
+    #         r = Zeroconf()
+    #         i = r.get_service_info(zeroconf_service_type, location)
+    #         if i is None:
+    #             raise Exception("'%s' not found" % location)
+    #         ip = str(socket.inet_ntoa(i.address))
+    #         port = str(i.port)
+    #         newlocation = ip + ':' + port
+    #         confnodesroot.logger.write(_("'{a1}' is located at {a2}\n").format(a1=location, a2=newlocation))
+    #         location = newlocation
+    #         # not a bug, but a workaround against obvious downgrade attack
+    #         scheme = "PYROS"
+    #         r.close()
+    #     except Exception:
+    #         confnodesroot.logger.write_error(_("MDNS resolution failure for '%s'\n") % location)
+    #         confnodesroot.logger.write_error(traceback.format_exc())
+    #         return None
+
+    elif _scheme in connectors:
+        scheme = _scheme
+    elif _scheme[-1] == 'S' and _scheme[:-1] in connectors:
+        scheme = _scheme[:-1]
+    else:
+        return None
+
+    # import module according to uri type and get connector specific baseclass
+    # first call to import the module, 
+    # then call with parameters to create the class
+    connector_specific_class = connectors[scheme]()(uri, confnodesroot)
+    
+    if connector_specific_class is None:
+        return None
+
+    # new class inheriting from generic and specific connector base classes
+    return ClassType(_scheme + "_connector", 
+                     (ConnectorBase, connector_specific_class), {})()
+
+def EditorClassFromScheme(scheme):
+    _Import_Dialogs()
+    return per_URI_connectors.get(scheme, None) 
+
+def ConnectorSchemes():
+    _Import_Dialogs()
+    return schemes
--- a/controls/CustomEditableListBox.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/CustomEditableListBox.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,19 +22,22 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 import wx.gizmos
 
+
 class CustomEditableListBox(wx.gizmos.EditableListBox):
-    
+
     def __init__(self, *args, **kwargs):
         wx.gizmos.EditableListBox.__init__(self, *args, **kwargs)
-        
+
         listbox = self.GetListCtrl()
         listbox.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
         listbox.Bind(wx.EVT_LIST_BEGIN_LABEL_EDIT, self.OnLabelBeginEdit)
         listbox.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnLabelEndEdit)
-        
+
         for button, tooltip, call_function in [
                 (self.GetEditButton(), _("Edit item"), "_OnEditButton"),
                 (self.GetNewButton(), _("New item"), "_OnNewButton"),
@@ -43,13 +46,13 @@
                 (self.GetDownButton(), _("Move down"), "_OnDownButton")]:
             button.SetToolTipString(tooltip)
             button.Bind(wx.EVT_BUTTON, self.GetButtonPressedFunction(call_function))
-    
+
         self.Editing = False
-    
+
     def EnsureCurrentItemVisible(self):
         listctrl = self.GetListCtrl()
         listctrl.EnsureVisible(listctrl.GetFocusedItem())
-    
+
     def OnLabelBeginEdit(self, event):
         self.Editing = True
         func = getattr(self, "_OnLabelBeginEdit", None)
@@ -57,7 +60,7 @@
             func(event)
         else:
             event.Skip()
-        
+
     def OnLabelEndEdit(self, event):
         self.Editing = False
         func = getattr(self, "_OnLabelEndEdit", None)
@@ -65,7 +68,7 @@
             func(event)
         else:
             event.Skip()
-    
+
     def GetButtonPressedFunction(self, call_function):
         def OnButtonPressed(event):
             if wx.Platform != '__WXMSW__' or not self.Editing:
@@ -77,7 +80,7 @@
                     wx.CallAfter(self.EnsureCurrentItemVisible)
                     event.Skip()
         return OnButtonPressed
-    
+
     def OnKeyDown(self, event):
         button = None
         keycode = event.GetKeyCode()
--- a/controls/CustomGrid.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/CustomGrid.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,49 +22,52 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 import wx.grid
 
+
 class CustomGrid(wx.grid.Grid):
-    
+
     def __init__(self, *args, **kwargs):
         wx.grid.Grid.__init__(self, *args, **kwargs)
-        
+
         self.Editable = True
-        
+
         self.AddButton = None
         self.DeleteButton = None
         self.UpButton = None
         self.DownButton = None
-        
+
         self.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False, 'Sans'))
         self.SetLabelFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, False, 'Sans'))
         self.SetSelectionBackground(wx.WHITE)
         self.SetSelectionForeground(wx.BLACK)
         self.DisableDragRowSize()
-        
+
         self.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnSelectCell)
         self.Bind(wx.grid.EVT_GRID_EDITOR_HIDDEN, self.OnEditorHidden)
         self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
-    
+
     def SetFocus(self):
         if self:
             wx.grid.Grid.SetFocus(self)
-    
+
     def SetDefaultValue(self, default_value):
         self.DefaultValue = default_value
-    
+
     def SetEditable(self, editable=True):
         self.Editable = editable
         self.RefreshButtons()
-        
+
     def SetButtons(self, buttons):
         for name in ["Add", "Delete", "Up", "Down"]:
             button = buttons.get(name, None)
             setattr(self, "%sButton" % name, button)
             if button is not None:
                 button.Bind(wx.EVT_BUTTON, getattr(self, "On%sButton" % name))
-    
+
     def RefreshButtons(self):
         if self:
             rows = self.Table.GetNumberRows()
@@ -77,7 +80,7 @@
                 self.UpButton.Enable(self.Editable and row > 0)
             if self.DownButton is not None:
                 self.DownButton.Enable(self.Editable and 0 <= row < rows - 1)
-    
+
     def CloseEditControl(self):
         row, col = self.GetGridCursorRow(), self.GetGridCursorCol()
         if row != -1 and col != -1:
@@ -119,27 +122,27 @@
                 self.Table.ResetView(self)
         if new_row != row:
             self.SetSelectedCell(new_row, col)
-    
+
     def SetSelectedCell(self, row, col):
         self.SetGridCursor(row, col)
         self.MakeCellVisible(row, col)
         self.RefreshButtons()
-        
+
     def OnAddButton(self, event):
         self.AddRow()
         self.SetFocus()
         event.Skip()
-        
+
     def OnDeleteButton(self, event):
         self.DeleteRow()
         self.SetFocus()
         event.Skip()
-        
+
     def OnUpButton(self, event):
         self.MoveRow(self.GetGridCursorRow(), -1)
         self.SetFocus()
         event.Skip()
-        
+
     def OnDownButton(self, event):
         self.MoveRow(self.GetGridCursorRow(), 1)
         self.SetFocus()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/controls/CustomIntCtrl.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2017: Andrey Skvortsov
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+
+from __future__ import absolute_import
+import wx
+import wx.lib.intctrl
+
+
+class CustomIntUpdatedEvent(wx.PyCommandEvent):
+    def __init__(self, id, value=0, object=None):
+        wx.PyCommandEvent.__init__(self, CustomIntCtrl.wxEVT_COMMAND_CUSTOM_INT_UPDATED, id)
+
+        self.__value = value
+        self.SetEventObject(object)
+
+    def GetValue(self):
+        """Retrieve the value of the control at the time
+        this event was generated."""
+        return self.__value
+
+
+class CustomIntCtrl(wx.lib.intctrl.IntCtrl):
+    """
+    This class provides a control that takes and returns long as
+    value, and provides bounds support and optional value limiting.
+
+    It handles entering negative numbers more user-friendly than
+    original wx.lib.intctrl.IntCtrl.
+
+    It applies limits as focus is changed to other control and
+    sends event afterwards to signal that editing is done.
+    """
+
+    # Used to trap events indicating that the current
+    # integer value of the control has been changed.
+    wxEVT_COMMAND_CUSTOM_INT_UPDATED = wx.NewEventType()
+    EVT_CUSTOM_INT = wx.PyEventBinder(wxEVT_COMMAND_CUSTOM_INT_UPDATED, 1)
+
+    def __init__(self, *args, **kwargs):
+        wx.lib.intctrl.IntCtrl.__init__(self, *args, **kwargs)
+        self.Bind(wx.EVT_KILL_FOCUS, self.UpdateValue)
+        self.SetLongAllowed(True)
+        self.SetLimited(False)
+
+    def GetValue(self):
+        """
+        Returns integer (long) value of the control,
+        but handles entering negative numbers
+        """
+        s = wx.TextCtrl.GetValue(self)
+        if s == '-':
+            s = ''
+        return self._fromGUI(s)
+
+    def GetValueStr(self):
+        """Returns string value of TextCtrl"""
+        return wx.TextCtrl.GetValue(self)
+
+    def UpdateValue(self, event):
+        self.SetLimited(True)
+        self.SetLimited(False)
+        try:
+            self.GetEventHandler().ProcessEvent(
+                CustomIntUpdatedEvent(self.GetId(), self.GetValue(), self))
+        except ValueError:
+            return
+        event.Skip()
--- a/controls/CustomStyledTextCtrl.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/CustomStyledTextCtrl.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,23 +22,29 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from functools import reduce
 import wx
 import wx.stc
+from six.moves import xrange
 
 if wx.Platform == '__WXMSW__':
-    faces = { 'times': 'Times New Roman',
-              'mono' : 'Courier New',
-              'helv' : 'Arial',
-              'other': 'Comic Sans MS',
-              'size' : 10,
-             }
+    faces = {
+        'times': 'Times New Roman',
+        'mono':  'Courier New',
+        'helv':  'Arial',
+        'other': 'Comic Sans MS',
+        'size':  10,
+    }
 else:
-    faces = { 'times': 'Times',
-              'mono' : 'Courier',
-              'helv' : 'Helvetica',
-              'other': 'new century schoolbook',
-              'size' : 12,
-             }
+    faces = {
+        'times': 'Times',
+        'mono':  'Courier',
+        'helv':  'Helvetica',
+        'other': 'new century schoolbook',
+        'size':  12,
+    }
 
 NAVIGATION_KEYS = [
     wx.WXK_END,
@@ -58,6 +64,7 @@
     wx.WXK_NUMPAD_PAGEDOWN,
     wx.WXK_NUMPAD_END]
 
+
 def GetCursorPos(old, new):
     if old == "":
         return 0
@@ -81,22 +88,22 @@
     else:
         return None
 
+
 class CustomStyledTextCtrl(wx.stc.StyledTextCtrl):
-    
+
     def __init__(self, *args, **kwargs):
         wx.stc.StyledTextCtrl.__init__(self, *args, **kwargs)
-        
+
         self.Bind(wx.EVT_MOTION, self.OnMotion)
-        
+
     def OnMotion(self, event):
         if wx.Platform == '__WXMSW__':
             if not event.Dragging():
-                x, y = event.GetPosition()
+                x, _y = event.GetPosition()
                 margin_width = reduce(
-                        lambda x, y: x + y,
-                        [self.GetMarginWidth(i)
-                         for i in xrange(3)],
-                        0)
+                    lambda x, y: x + y,
+                    [self.GetMarginWidth(i) for i in xrange(3)],
+                    0)
                 if x <= margin_width:
                     self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))
                 else:
--- a/controls/CustomTable.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/CustomTable.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,6 +22,8 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 import wx.grid
 
@@ -30,8 +32,9 @@
 else:
     ROW_HEIGHT = 28
 
+
 class CustomTable(wx.grid.PyGridTableBase):
-    
+
     """
     A custom wx.grid.Grid Table using user supplied data
     """
@@ -47,10 +50,10 @@
         # see if the table has changed size
         self._rows = self.GetNumberRows()
         self._cols = self.GetNumberCols()
-    
+
     def GetNumberCols(self):
         return len(self.colnames)
-        
+
     def GetNumberRows(self):
         return len(self.data)
 
@@ -66,11 +69,11 @@
     def GetValue(self, row, col):
         if row < self.GetNumberRows():
             return self.data[row].get(self.GetColLabelValue(col, False), "")
-    
+
     def SetValue(self, row, col, value):
         if col < len(self.colnames):
             self.data[row][self.GetColLabelValue(col, False)] = value
-    
+
     def GetValueByName(self, row, colname):
         if row < self.GetNumberRows():
             return self.data[row].get(colname)
@@ -87,14 +90,24 @@
         grid.CloseEditControl()
         grid.BeginBatch()
         for current, new, delmsg, addmsg in [
-            (self._rows, self.GetNumberRows(), wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED, wx.grid.GRIDTABLE_NOTIFY_ROWS_APPENDED),
-            (self._cols, self.GetNumberCols(), wx.grid.GRIDTABLE_NOTIFY_COLS_DELETED, wx.grid.GRIDTABLE_NOTIFY_COLS_APPENDED),
+                (
+                    self._rows,
+                    self.GetNumberRows(),
+                    wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED,
+                    wx.grid.GRIDTABLE_NOTIFY_ROWS_APPENDED
+                ),
+                (
+                    self._cols,
+                    self.GetNumberCols(),
+                    wx.grid.GRIDTABLE_NOTIFY_COLS_DELETED,
+                    wx.grid.GRIDTABLE_NOTIFY_COLS_APPENDED
+                ),
         ]:
             if new < current:
-                msg = wx.grid.GridTableMessage(self,delmsg,new,current-new)
+                msg = wx.grid.GridTableMessage(self, delmsg, new, current-new)
                 grid.ProcessTableMessage(msg)
             elif new > current:
-                msg = wx.grid.GridTableMessage(self,addmsg,new-current)
+                msg = wx.grid.GridTableMessage(self, addmsg, new-current)
                 grid.ProcessTableMessage(msg)
                 self.UpdateValues(grid)
         grid.EndBatch()
@@ -125,33 +138,33 @@
             row_highlights = self.Highlights.get(row, {})
             for col in range(self.GetNumberCols()):
                 colname = self.GetColLabelValue(col, False)
-                
+
                 grid.SetReadOnly(row, col, True)
                 grid.SetCellEditor(row, col, None)
                 grid.SetCellRenderer(row, col, None)
-                
+
                 highlight_colours = row_highlights.get(colname.lower(), [(wx.WHITE, wx.BLACK)])[-1]
                 grid.SetCellBackgroundColour(row, col, highlight_colours[0])
                 grid.SetCellTextColour(row, col, highlight_colours[1])
             self.ResizeRow(grid, row)
-    
+
     def ResizeRow(self, grid, row):
         if grid.GetRowSize(row) < ROW_HEIGHT:
             grid.SetRowMinimalHeight(row, ROW_HEIGHT)
             grid.AutoSizeRow(row, False)
-    
+
     def SetData(self, data):
         self.data = data
-    
+
     def GetData(self):
         return self.data
-    
+
     def GetCurrentIndex(self):
         return self.CurrentIndex
-    
+
     def SetCurrentIndex(self, index):
         self.CurrentIndex = index
-    
+
     def AppendRow(self, row_content):
         self.data.append(row_content)
 
@@ -191,7 +204,7 @@
         if highlight_type is None:
             self.Highlights = {}
         else:
-            for row, row_highlights in self.Highlights.iteritems():
+            for _row, row_highlights in self.Highlights.iteritems():
                 row_items = row_highlights.items()
                 for col, col_highlights in row_items:
                     if highlight_type in col_highlights:
--- a/controls/CustomToolTip.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/CustomToolTip.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,49 +22,50 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+from __future__ import absolute_import
 import wx
 
 from controls.CustomStyledTextCtrl import faces
 
-TOOLTIP_MAX_CHARACTERS = 30 # Maximum number of characters by line in ToolTip
-TOOLTIP_MAX_LINE = 5        # Maximum number of line in ToolTip
-TOOLTIP_WAIT_PERIOD = 0.5   # Wait period before displaying tooltip in second
+TOOLTIP_MAX_CHARACTERS = 30  # Maximum number of characters by line in ToolTip
+TOOLTIP_MAX_LINE = 5         # Maximum number of line in ToolTip
+TOOLTIP_WAIT_PERIOD = 0.5    # Wait period before displaying tooltip in second
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                               Custom ToolTip
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
-"""
-Class that implements a custom tool tip
-"""
 
 class CustomToolTip(wx.PopupWindow):
-    
+    """
+    Class that implements a custom tool tip
+    """
+
     def __init__(self, parent, tip, restricted=True):
         """
         Constructor
         @param parent: Parent window
         @param tip: Tip text (may be multiline)
-        @param restricted: Tool tip must follow size restriction in line and 
+        @param restricted: Tool tip must follow size restriction in line and
             characters number defined (default True)
         """
         wx.PopupWindow.__init__(self, parent)
-        
+
         self.Restricted = restricted
-        
+
         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
         self.SetTip(tip)
-        
+
         # Initialize text font style
         self.Font = wx.Font(
-            faces["size"], 
-            wx.SWISS, 
-            wx.NORMAL, 
-            wx.NORMAL, 
-            faceName = faces["mono"])
-        
+            faces["size"],
+            wx.SWISS,
+            wx.NORMAL,
+            wx.NORMAL,
+            faceName=faces["mono"])
+
         self.Bind(wx.EVT_PAINT, self.OnPaint)
-    
+
     def SetFont(self, font):
         """
         Set tool tip text font style
@@ -72,7 +73,7 @@
         """
         self.Font = font
         self.RefreshTip()
-    
+
     def SetTip(self, tip):
         """
         Set tool tip text
@@ -87,8 +88,7 @@
                     new_line = words[0]
                     for word in words[1:]:
                         # Add word to line
-                        if len(new_line + " " + word) <= \
-                            TOOLTIP_MAX_CHARACTERS:
+                        if len(new_line + " " + word) <= TOOLTIP_MAX_CHARACTERS:
                             new_line += " " + word
                         # Create new line
                         else:
@@ -97,24 +97,24 @@
                     self.Tip.append(new_line)
                 else:
                     self.Tip.append(line)
-            
+
             # Restrict number of lines
             if len(self.Tip) > TOOLTIP_MAX_LINE:
                 self.Tip = self.Tip[:TOOLTIP_MAX_LINE]
-                
+
                 # Add ... to the end of last line to indicate that tool tip
                 # text is too long
                 if len(self.Tip[-1]) < TOOLTIP_MAX_CHARACTERS - 3:
                     self.Tip[-1] += "..."
                 else:
-                    self.Tip[-1] = self.Tip[-1]\
-                        [:TOOLTIP_MAX_CHARACTERS - 3] + "..."
+                    self.Tip[-1] = self.Tip[-1][:TOOLTIP_MAX_CHARACTERS - 3] + \
+                                   "..."
         else:
             self.Tip = tip.splitlines()
-        
+
         # Prevent to call wx method in non-wx threads
         wx.CallAfter(self.RefreshTip)
-    
+
     def SetToolTipPosition(self, pos):
         """
         Set tool tip position
@@ -122,32 +122,32 @@
         """
         # Get screen size to prevent tool tip to go out of the screen
         screen_width, screen_height = wx.GetDisplaySize()
-        
+
         # Calculate position of tool tip to stay in screen limits
         tip_width, tip_height = self.GetToolTipSize()
         self.SetPosition(wx.Point(
             max(0, min(pos.x, screen_width - tip_width)),
             max(0, min(pos.y, screen_height - tip_height))))
-    
+
     def GetToolTipSize(self):
         """
         Get tool tip size according to tip text and restriction
         @return: wx.Size(tool_tip_width, tool_tip_height)
         """
         max_width = max_height = 0
-        
+
         # Create a memory DC for calculating text extent
-        dc = wx.MemoryDC()
+        dc = wx.MemoryDC(wx.EmptyBitmap(1, 1))
         dc.SetFont(self.Font)
-        
+
         # Compute max tip text size
         for line in self.Tip:
             w, h = dc.GetTextExtent(line)
             max_width = max(max_width, w)
             max_height += h
-        
+
         return wx.Size(max_width + 4, max_height + 4)
-    
+
     def RefreshTip(self):
         """
         Refresh tip on screen
@@ -156,10 +156,10 @@
         if self:
             # Refresh tool tip size and position
             self.SetClientSize(self.GetToolTipSize())
-            
+
             # Redraw tool tip
             self.Refresh()
-    
+
     def OnPaint(self, event):
         """
         Callback for Paint Event
@@ -168,26 +168,26 @@
         # Get buffered paint DC for tool tip
         dc = wx.AutoBufferedPaintDC(self)
         dc.Clear()
-        
+
         # Set DC drawing style
         dc.SetPen(wx.BLACK_PEN)
         dc.SetBrush(wx.Brush(wx.Colour(255, 238, 170)))
         dc.SetFont(self.Font)
-        
+
         # Draw Tool tip
         dc.BeginDrawing()
         tip_width, tip_height = self.GetToolTipSize()
-        
+
         # Draw background rectangle
         dc.DrawRectangle(0, 0, tip_width, tip_height)
-        
+
         # Draw tool tip text
         line_offset = 0
         for line in self.Tip:
             dc.DrawText(line, 2, line_offset + 2)
-            line_width, line_height = dc.GetTextExtent(line)
+            _line_width, line_height = dc.GetTextExtent(line)
             line_offset += line_height
-        
+
         dc.EndDrawing()
-        
+
         event.Skip()
--- a/controls/CustomTree.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/CustomTree.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,6 +22,9 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
 import wx
 import wx.lib.agw.customtreectrl as CT
 
@@ -30,44 +33,51 @@
 # Customize CustomTreeItem for adding icon on item left
 CT.GenericTreeItem._ExtraImage = None
 
+
 def SetExtraImage(self, image):
     self._type = (1 if image is not None else 0)
     self._ExtraImage = image
 
+
 CT.GenericTreeItem.SetExtraImage = SetExtraImage
 
 _DefaultGetCurrentCheckedImage = CT.GenericTreeItem.GetCurrentCheckedImage
+
+
 def GetCurrentCheckedImage(self):
     if self._ExtraImage is not None:
         return self._ExtraImage
     return _DefaultGetCurrentCheckedImage(self)
+
+
 CT.GenericTreeItem.GetCurrentCheckedImage = GetCurrentCheckedImage
 
+
 class CustomTree(CT.CustomTreeCtrl):
-    
+
     def __init__(self, *args, **kwargs):
         CT.CustomTreeCtrl.__init__(self, *args, **kwargs)
-        
+
         self.BackgroundBitmap = None
-        self.BackgroundAlign = wx.ALIGN_LEFT|wx.ALIGN_TOP
-        
+        self.BackgroundAlign = wx.ALIGN_LEFT | wx.ALIGN_TOP
+
         self.AddMenu = None
         self.Enabled = False
-        
+
         self.Bind(wx.EVT_SCROLLWIN, self.OnScroll)
         self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
-    
+
     def SetBackgroundBitmap(self, bitmap, align):
         self.BackgroundBitmap = bitmap
         self.BackgroundAlign = align
-    
+
     def SetImageListCheck(self, sizex, sizey, imglist=None):
         CT.CustomTreeCtrl.SetImageListCheck(self, sizex, sizey, imglist=None)
-        
+
         self.ExtraImages = {}
         for image in ["function", "functionBlock", "program"]:
             self.ExtraImages[image] = self._imageListCheck.Add(GetBitmap(image.upper()))
-    
+
     def SetItemExtraImage(self, item, bitmap):
         dc = wx.ClientDC(self)
         image = self.ExtraImages.get(bitmap)
@@ -76,45 +86,45 @@
         else:
             item.SetExtraImage(None)
         self.CalculateSize(item, dc)
-        self.RefreshLine(item)   
-        
+        self.RefreshLine(item)
+
     def SetAddMenu(self, add_menu):
         self.AddMenu = add_menu
-    
+
     def Enable(self, enabled):
         self.Enabled = enabled
-    
+
     def GetBitmapRect(self):
         client_size = self.GetClientSize()
         bitmap_size = self.BackgroundBitmap.GetSize()
-        
+
         if self.BackgroundAlign & wx.ALIGN_RIGHT:
             x = client_size[0] - bitmap_size[0]
         elif self.BackgroundAlign & wx.ALIGN_CENTER_HORIZONTAL:
-            x = (client_size[0] - bitmap_size[0]) / 2
+            x = (client_size[0] - bitmap_size[0]) // 2
         else:
             x = 0
-        
+
         if self.BackgroundAlign & wx.ALIGN_BOTTOM:
             y = client_size[1] - bitmap_size[1]
         elif self.BackgroundAlign & wx.ALIGN_CENTER_VERTICAL:
-            y = (client_size[1] - bitmap_size[1]) / 2
+            y = (client_size[1] - bitmap_size[1]) // 2
         else:
             y = 0
-        
+
         return wx.Rect(x, y, bitmap_size[0], bitmap_size[1])
-    
+
     def OnLeftUp(self, event):
         if self.Enabled:
             pos = event.GetPosition()
-            item, flags = self.HitTest(pos)
-            
+            _item, flags = self.HitTest(pos)
+
             bitmap_rect = self.GetBitmapRect()
-            if (bitmap_rect.InsideXY(pos.x, pos.y) or 
-                flags & wx.TREE_HITTEST_NOWHERE) and self.AddMenu is not None:
+            if ((bitmap_rect.InsideXY(pos.x, pos.y) or
+                 flags & wx.TREE_HITTEST_NOWHERE) and self.AddMenu is not None):
                 wx.CallAfter(self.PopupMenuXY, self.AddMenu, pos.x, pos.y)
         event.Skip()
-    
+
     def OnEraseBackground(self, event):
         dc = event.GetDC()
 
@@ -122,12 +132,12 @@
             dc = wx.ClientDC(self)
             rect = self.GetUpdateRegion().GetBox()
             dc.SetClippingRect(rect)
-        
+
         dc.Clear()
-        
+
         bitmap_rect = self.GetBitmapRect()
         dc.DrawBitmap(self.BackgroundBitmap, bitmap_rect.x, bitmap_rect.y)
-    
+
     def OnScroll(self, event):
         wx.CallAfter(self.Refresh)
         event.Skip()
--- a/controls/DebugVariablePanel/DebugVariableGraphicViewer.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/DebugVariablePanel/DebugVariableGraphicViewer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,29 +22,25 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
-from types import TupleType
+
+from __future__ import absolute_import
+from __future__ import division
 from time import time as gettime
+from cycler import cycler
+
 import numpy
-
 import wx
-
 import matplotlib
 import matplotlib.pyplot
 from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
 from matplotlib.backends.backend_wxagg import _convert_agg_to_wx_bitmap
 from matplotlib.backends.backend_agg import FigureCanvasAgg
 from mpl_toolkits.mplot3d import Axes3D
+from six.moves import xrange
 
 from editors.DebugViewer import REFRESH_PERIOD
-
-from DebugVariableItem import DebugVariableItem
-from DebugVariableViewer import *
-from GraphButton import GraphButton
-
-
-from distutils.version import LooseVersion
-if LooseVersion(matplotlib.__version__) >= LooseVersion("1.5.0"):
-    from cycler import cycler
+from controls.DebugVariablePanel.DebugVariableViewer import *
+from controls.DebugVariablePanel.GraphButton import GraphButton
 
 
 # Graph variable display type
@@ -53,19 +49,20 @@
 # Canvas height
 [SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI] = [0, 100, 200]
 
-CANVAS_BORDER = (20., 10.) # Border height on at bottom and top of graph
-CANVAS_PADDING = 8.5       # Border inside graph where no label is drawn
-VALUE_LABEL_HEIGHT = 17.   # Height of variable label in graph
-AXES_LABEL_HEIGHT = 12.75  # Height of variable value in graph
+CANVAS_BORDER = (30., 20.)  # Border height on at bottom and top of graph
+CANVAS_PADDING = 8.5        # Border inside graph where no label is drawn
+VALUE_LABEL_HEIGHT = 17.    # Height of variable label in graph
+AXES_LABEL_HEIGHT = 12.75   # Height of variable value in graph
 
 # Colors used cyclically for graph curves
 COLOR_CYCLE = ['r', 'b', 'g', 'm', 'y', 'k']
 # Color for graph cursor
 CURSOR_COLOR = '#800080'
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                      Debug Variable Graphic Viewer Helpers
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 def merge_ranges(ranges):
     """
@@ -83,37 +80,37 @@
             min_value = range_min
         elif range_min is not None:
             min_value = min(min_value, range_min)
-        
+
         # Update maximal range value
         if max_value is None:
             max_value = range_max
         elif range_min is not None:
             max_value = max(max_value, range_max)
-    
+
     # Calculate range center and width if at least one valid range is defined
     if min_value is not None and max_value is not None:
         center = (min_value + max_value) / 2.
         range_size = max(1.0, max_value - min_value)
-    
+
     # Set default center and with if no valid range is defined
     else:
         center = 0.5
         range_size = 1.0
-    
+
     # Return range expended from 10 %
     return center - range_size * 0.55, center + range_size * 0.55
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                   Debug Variable Graphic Viewer Drop Target
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a custom drop target class for Debug Variable Graphic
-Viewer
-"""
+# -------------------------------------------------------------------------------
+
 
 class DebugVariableGraphicDropTarget(wx.TextDropTarget):
-    
+    """
+    Class that implements a custom drop target class for Debug Variable Graphic
+    Viewer
+    """
+
     def __init__(self, parent, window):
         """
         Constructor
@@ -123,7 +120,7 @@
         wx.TextDropTarget.__init__(self)
         self.ParentControl = parent
         self.ParentWindow = window
-        
+
     def __del__(self):
         """
         Destructor
@@ -132,7 +129,7 @@
         # Panel
         self.ParentControl = None
         self.ParentWindow = None
-        
+
     def OnDragOver(self, x, y, d):
         """
         Function called when mouse is dragged over Drop Target
@@ -142,9 +139,9 @@
         """
         # Signal parent that mouse is dragged over
         self.ParentControl.OnMouseDragging(x, y)
-        
+
         return wx.TextDropTarget.OnDragOver(self, x, y, d)
-        
+
     def OnDropText(self, x, y, data):
         """
         Function called when mouse is released in Drop Target
@@ -154,65 +151,65 @@
         """
         # Signal Debug Variable Panel to reset highlight
         self.ParentWindow.ResetHighlight()
-        
+
         message = None
-        
+
         # Check that data is valid regarding DebugVariablePanel
         try:
             values = eval(data)
-            if not isinstance(values, TupleType):
+            if not isinstance(values, tuple):
                 raise ValueError
-        except:
-            message = _("Invalid value \"%s\" for debug variable")%data
+        except Exception:
+            message = _("Invalid value \"%s\" for debug variable") % data
             values = None
-        
+
         # Display message if data is invalid
         if message is not None:
             wx.CallAfter(self.ShowMessage, message)
-        
+
         # Data contain a reference to a variable to debug
         elif values[1] == "debug":
             target_idx = self.ParentControl.GetIndex()
-            
+
             # If mouse is dropped in graph canvas bounding box and graph is
             # not 3D canvas, graphs will be merged
             rect = self.ParentControl.GetAxesBoundingBox()
             if not self.ParentControl.Is3DCanvas() and rect.InsideXY(x, y):
                 # Default merge type is parallel
                 merge_type = GRAPH_PARALLEL
-                
+
                 # If mouse is dropped in left part of graph canvas, graph
                 # wall be merged orthogonally
-                merge_rect = wx.Rect(rect.x, rect.y, 
+                merge_rect = wx.Rect(rect.x, rect.y,
                                      rect.width / 2., rect.height)
                 if merge_rect.InsideXY(x, y):
                     merge_type = GRAPH_ORTHOGONAL
-                
+
                 # Merge graphs
-                wx.CallAfter(self.ParentWindow.MergeGraphs, 
-                             values[0], target_idx, 
+                wx.CallAfter(self.ParentWindow.MergeGraphs,
+                             values[0], target_idx,
                              merge_type, force=True)
-                
+
             else:
-                width, height = self.ParentControl.GetSize()
-                
+                _width, height = self.ParentControl.GetSize()
+
                 # Get Before which Viewer the variable has to be moved or added
                 # according to the position of mouse in Viewer.
-                if y > height / 2:
+                if y > height // 2:
                     target_idx += 1
-                
+
                 # Drag'n Drop is an internal is an internal move inside Debug
-                # Variable Panel 
+                # Variable Panel
                 if len(values) > 2 and values[2] == "move":
-                    self.ParentWindow.MoveValue(values[0], 
+                    self.ParentWindow.MoveValue(values[0],
                                                 target_idx)
-                
+
                 # Drag'n Drop was initiated by another control of Beremiz
                 else:
-                    self.ParentWindow.InsertValue(values[0], 
-                                                  target_idx, 
+                    self.ParentWindow.InsertValue(values[0],
+                                                  target_idx,
                                                   force=True)
-    
+
     def OnLeave(self):
         """
         Function called when mouse is leave Drop Target
@@ -220,30 +217,30 @@
         # Signal Debug Variable Panel to reset highlight
         self.ParentWindow.ResetHighlight()
         return wx.TextDropTarget.OnLeave(self)
-    
+
     def ShowMessage(self, message):
         """
         Show error message in Error Dialog
         @param message: Error message to display
         """
-        dialog = wx.MessageDialog(self.ParentWindow, 
-                                  message, 
-                                  _("Error"), 
-                                  wx.OK|wx.ICON_ERROR)
+        dialog = wx.MessageDialog(self.ParentWindow,
+                                  message,
+                                  _("Error"),
+                                  wx.OK | wx.ICON_ERROR)
         dialog.ShowModal()
         dialog.Destroy()
 
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                      Debug Variable Graphic Viewer Class
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a Viewer that display variable values as a graphs
-"""
+# -------------------------------------------------------------------------------
+
 
 class DebugVariableGraphicViewer(DebugVariableViewer, FigureCanvas):
-    
+    """
+    Class that implements a Viewer that display variable values as a graphs
+    """
+
     def __init__(self, parent, window, items, graph_type):
         """
         Constructor
@@ -253,36 +250,36 @@
         @param graph_type: Graph display type (Parallel or orthogonal)
         """
         DebugVariableViewer.__init__(self, window, items)
-        
+
         self.GraphType = graph_type        # Graph type display
         self.CursorTick = None             # Tick of the graph cursor
-        
+
         # Mouse position when start dragging
         self.MouseStartPos = None
         # Tick when moving tick start
         self.StartCursorTick = None
         # Canvas size when starting to resize canvas
-        self.CanvasStartSize = None        
-        
+        self.CanvasStartSize = None
+
         # List of current displayed contextual buttons
         self.ContextualButtons = []
         # Reference to item for which contextual buttons was displayed
         self.ContextualButtonsItem = None
-        
+
         # Flag indicating that zoom fit current displayed data range or whole
         # data range if False
         self.ZoomFit = False
-        
+
         # Create figure for drawing graphs
         self.Figure = matplotlib.figure.Figure(facecolor='w')
         # Defined border around figure in canvas
-        self.Figure.subplotpars.update(top=0.95, left=0.1, 
+        self.Figure.subplotpars.update(top=0.95, left=0.1,
                                        bottom=0.1, right=0.95)
-        
+
         FigureCanvas.__init__(self, parent, -1, self.Figure)
         self.SetWindowStyle(wx.WANTS_CHARS)
         self.SetBackgroundColour(wx.WHITE)
-        
+
         # Bind wx events
         self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick)
         self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
@@ -290,42 +287,41 @@
         self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave)
         self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
         self.Bind(wx.EVT_SIZE, self.OnResize)
-        
+
         # Set canvas min size
         canvas_size = self.GetCanvasMinSize()
         self.SetMinSize(canvas_size)
-        
+
         # Define Viewer drop target
         self.SetDropTarget(DebugVariableGraphicDropTarget(self, window))
-        
+
         # Connect matplotlib events
         self.mpl_connect('button_press_event', self.OnCanvasButtonPressed)
         self.mpl_connect('motion_notify_event', self.OnCanvasMotion)
         self.mpl_connect('button_release_event', self.OnCanvasButtonReleased)
         self.mpl_connect('scroll_event', self.OnCanvasScroll)
-        
+
         # Add buttons for zooming on current displayed data range
         self.Buttons.append(
-                GraphButton(0, 0, "fit_graph", self.OnZoomFitButton))
-        
+            GraphButton(0, 0, "fit_graph", self.OnZoomFitButton))
+
         # Add buttons for changing canvas size with predefined height
         for size, bitmap in zip(
                 [SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI],
                 ["minimize_graph", "middle_graph", "maximize_graph"]):
-            self.Buttons.append(
-                    GraphButton(0, 0, bitmap, 
-                                self.GetOnChangeSizeButton(size)))
-        
+            self.Buttons.append(GraphButton(0, 0, bitmap,
+                                            self.GetOnChangeSizeButton(size)))
+
         # Add buttons for exporting graph values to clipboard and close graph
         for bitmap, callback in [
                 ("export_graph_mini", self.OnExportGraphButton),
                 ("delete_graph", self.OnCloseButton)]:
             self.Buttons.append(GraphButton(0, 0, bitmap, callback))
-        
+
         # Update graphs elements
         self.ResetGraphics()
         self.RefreshLabelsPosition(canvas_size.height)
-    
+
     def AddItem(self, item):
         """
         Add an item to the list of items displayed by Viewer
@@ -333,14 +329,14 @@
         """
         DebugVariableViewer.AddItem(self, item)
         self.ResetGraphics()
-        
+
     def RemoveItem(self, item):
         """
         Remove an item from the list of items displayed by Viewer
         @param item: Item to remove from the list
         """
         DebugVariableViewer.RemoveItem(self, item)
-        
+
         # If list of items is not empty
         if not self.ItemsIsEmpty():
             # Return to parallel graph if there is only one item
@@ -348,51 +344,51 @@
             if len(self.Items) == 1:
                 self.GraphType = GRAPH_PARALLEL
             self.ResetGraphics()
-    
+
     def SetCursorTick(self, cursor_tick):
         """
         Set cursor tick
         @param cursor_tick: Cursor tick
         """
         self.CursorTick = cursor_tick
-    
+
     def SetZoomFit(self, zoom_fit):
         """
         Set flag indicating that zoom fit current displayed data range
         @param zoom_fit: Flag for zoom fit (False: zoom fit whole data range)
         """
-        # Flag is different from the actual one 
+        # Flag is different from the actual one
         if zoom_fit != self.ZoomFit:
             # Save new flag value
             self.ZoomFit = zoom_fit
-            
+
             # Update button for zoom fit bitmap
             self.Buttons[0].SetBitmap("full_graph" if zoom_fit else "fit_graph")
-            
+
             # Refresh canvas
             self.RefreshViewer()
-        
+
     def SubscribeAllDataConsumers(self):
         """
         Function that unsubscribe and remove every item that store values of
         a variable that doesn't exist in PLC anymore
         """
         DebugVariableViewer.SubscribeAllDataConsumers(self)
-        
+
         # Graph still have data to display
         if not self.ItemsIsEmpty():
             # Reset flag indicating that zoom fit current displayed data range
             self.SetZoomFit(False)
-            
+
             self.ResetGraphics()
-    
+
     def Is3DCanvas(self):
         """
         Return if Viewer is a 3D canvas
         @return: True if Viewer is a 3D canvas
         """
         return self.GraphType == GRAPH_ORTHOGONAL and len(self.Items) == 3
-    
+
     def GetButtons(self):
         """
         Return list of buttons defined in Viewer
@@ -400,7 +396,7 @@
         """
         # Add contextual buttons to default buttons
         return self.Buttons + self.ContextualButtons
-    
+
     def PopupContextualButtons(self, item, rect, direction=wx.RIGHT):
         """
         Show contextual menu for item aside a label of this item defined
@@ -412,33 +408,32 @@
         # Return immediately if contextual menu for item is already shown
         if self.ContextualButtonsItem == item:
             return
-        
+
         # Close already shown contextual menu
         self.DismissContextualButtons()
-        
+
         # Save item for which contextual menu is shown
         self.ContextualButtonsItem = item
-        
+
         # If item variable is forced, add button for release variable to
         # contextual menu
         if self.ContextualButtonsItem.IsForced():
             self.ContextualButtons.append(
                 GraphButton(0, 0, "release", self.OnReleaseItemButton))
-        
+
         # Add other buttons to contextual menu
         for bitmap, callback in [
                 ("force", self.OnForceItemButton),
                 ("export_graph_mini", self.OnExportItemGraphButton),
                 ("delete_graph", self.OnRemoveItemButton)]:
-            self.ContextualButtons.append(
-                    GraphButton(0, 0, bitmap, callback))
-        
+            self.ContextualButtons.append(GraphButton(0, 0, bitmap, callback))
+
         # If buttons are shown at left side or upper side of rect, positions
         # will be set in reverse order
         buttons = self.ContextualButtons[:]
         if direction in [wx.TOP, wx.LEFT]:
-             buttons.reverse()
-             
+            buttons.reverse()
+
         # Set contextual menu buttons position aside rect depending on
         # direction given
         offset = 0
@@ -446,22 +441,22 @@
             w, h = button.GetSize()
             if direction in [wx.LEFT, wx.RIGHT]:
                 x = rect.x + (- w - offset
-                            if direction == wx.LEFT
-                            else rect.width + offset)
-                y = rect.y + (rect.height - h) / 2
+                              if direction == wx.LEFT
+                              else rect.width + offset)
+                y = rect.y + (rect.height - h) // 2
                 offset += w
             else:
-                x = rect.x + (rect.width - w ) / 2
+                x = rect.x + (rect.width - w) // 2
                 y = rect.y + (- h - offset
                               if direction == wx.TOP
                               else rect.height + offset)
                 offset += h
             button.SetPosition(x, y)
             button.Show()
-        
+
         # Refresh canvas
         self.ParentWindow.ForceRefresh()
-    
+
     def DismissContextualButtons(self):
         """
         Close current shown contextual menu
@@ -469,14 +464,14 @@
         # Return immediately if no contextual menu is shown
         if self.ContextualButtonsItem is None:
             return
-        
+
         # Reset variables corresponding to contextual menu
         self.ContextualButtonsItem = None
         self.ContextualButtons = []
-        
+
         # Refresh canvas
         self.ParentWindow.ForceRefresh()
-    
+
     def IsOverContextualButton(self, x, y):
         """
         Return if point is over one contextual button of Viewer
@@ -488,7 +483,7 @@
             if button.HitTest(x, y):
                 return button
         return None
-    
+
     def ExportGraph(self, item=None):
         """
         Export item(s) data to clipboard in CSV format
@@ -497,17 +492,17 @@
         """
         self.ParentWindow.CopyDataToClipboard(
             [(item, [entry for entry in item.GetData()])
-             for item in (self.Items 
-                          if item is None 
+             for item in (self.Items
+                          if item is None
                           else [item])])
-    
+
     def OnZoomFitButton(self):
         """
         Function called when Viewer Zoom Fit button is pressed
         """
         # Toggle zoom fit flag value
         self.SetZoomFit(not self.ZoomFit)
-        
+
     def GetOnChangeSizeButton(self, height):
         """
         Function that generate callback function for change Viewer height to
@@ -518,32 +513,32 @@
         def OnChangeSizeButton():
             self.SetCanvasHeight(height)
         return OnChangeSizeButton
-    
+
     def OnExportGraphButton(self):
         """
         Function called when Viewer Export button is pressed
         """
         # Export data of every item in Viewer
         self.ExportGraph()
-    
+
     def OnForceItemButton(self):
         """
         Function called when contextual menu Force button is pressed
         """
-        # Open dialog for forcing item variable value 
+        # Open dialog for forcing item variable value
         self.ForceValue(self.ContextualButtonsItem)
         # Close contextual menu
         self.DismissContextualButtons()
-        
+
     def OnReleaseItemButton(self):
         """
         Function called when contextual menu Release button is pressed
         """
-        # Release item variable value 
+        # Release item variable value
         self.ReleaseValue(self.ContextualButtonsItem)
         # Close contextual menu
         self.DismissContextualButtons()
-    
+
     def OnExportItemGraphButton(self):
         """
         Function called when contextual menu Export button is pressed
@@ -552,17 +547,17 @@
         self.ExportGraph(self.ContextualButtonsItem)
         # Close contextual menu
         self.DismissContextualButtons()
-        
-    def OnRemoveItemButton(self):            
+
+    def OnRemoveItemButton(self):
         """
         Function called when contextual menu Remove button is pressed
         """
         # Remove item from Viewer
-        wx.CallAfter(self.ParentWindow.DeleteValue, self, 
+        wx.CallAfter(self.ParentWindow.DeleteValue, self,
                      self.ContextualButtonsItem)
         # Close contextual menu
         self.DismissContextualButtons()
-    
+
     def HandleCursorMove(self, event):
         """
         Update Cursor position according to mouse position and graph type
@@ -571,7 +566,7 @@
         start_tick, end_tick = self.ParentWindow.GetRange()
         cursor_tick = None
         items = self.ItemsDict.values()
-        
+
         # Graph is orthogonal
         if self.GraphType == GRAPH_ORTHOGONAL:
             # Extract items data displayed in canvas figure
@@ -579,31 +574,31 @@
             end_tick = max(end_tick, start_tick)
             x_data = items[0].GetData(start_tick, end_tick)
             y_data = items[1].GetData(start_tick, end_tick)
-            
+
             # Search for the nearest point from mouse position
             if len(x_data) > 0 and len(y_data) > 0:
-                length = min(len(x_data), len(y_data)) 
-                d = numpy.sqrt((x_data[:length,1]-event.xdata) ** 2 + \
-                               (y_data[:length,1]-event.ydata) ** 2)
-                
+                length = min(len(x_data), len(y_data))
+                d = numpy.sqrt((x_data[:length, 1]-event.xdata) ** 2 +
+                               (y_data[:length, 1]-event.ydata) ** 2)
+
                 # Set cursor tick to the tick of this point
                 cursor_tick = x_data[numpy.argmin(d), 0]
-        
+
         # Graph is parallel
         else:
             # Extract items tick
             data = items[0].GetData(start_tick, end_tick)
-            
+
             # Search for point that tick is the nearest from mouse X position
             # and set cursor tick to the tick of this point
             if len(data) > 0:
                 cursor_tick = data[numpy.argmin(
-                        numpy.abs(data[:,0] - event.xdata)), 0]
-        
+                    numpy.abs(data[:, 0] - event.xdata)), 0]
+
         # Update cursor tick
         if cursor_tick is not None:
             self.ParentWindow.SetCursorTick(cursor_tick)
-    
+
     def OnCanvasButtonPressed(self, event):
         """
         Function called when a button of mouse is pressed
@@ -611,20 +606,20 @@
         """
         # Get mouse position, graph Y coordinate is inverted in matplotlib
         # comparing to wx
-        width, height = self.GetSize()
+        _width, height = self.GetSize()
         x, y = event.x, height - event.y
-        
+
         # Return immediately if mouse is over a button
         if self.IsOverButton(x, y):
-            return 
-        
+            return
+
         # Mouse was clicked inside graph figure
         if event.inaxes == self.Axes:
-            
+
             # Find if it was on an item label
             item_idx = None
             # Check every label paired with corresponding item
-            for i, t in ([pair for pair in enumerate(self.AxesLabels)] + 
+            for i, t in ([pair for pair in enumerate(self.AxesLabels)] +
                          [pair for pair in enumerate(self.Labels)]):
                 # Get label bounding box
                 (x0, y0), (x1, y1) = t.get_window_extent().get_points()
@@ -633,46 +628,46 @@
                 if rect.InsideXY(x, y):
                     item_idx = i
                     break
-            
+
             # If an item label have been clicked
             if item_idx is not None:
                 # Hide buttons and contextual buttons
                 self.ShowButtons(False)
                 self.DismissContextualButtons()
-                
+
                 # Start a drag'n drop from mouse position in wx coordinate of
                 # parent
                 xw, yw = self.GetPosition()
-                self.ParentWindow.StartDragNDrop(self, 
-                    self.ItemsDict.values()[item_idx], 
-                    x + xw, y + yw, # Current mouse position
-                    x + xw, y + yw) # Mouse position when button was clicked
-            
+                self.ParentWindow.StartDragNDrop(
+                    self, self.ItemsDict.values()[item_idx],
+                    x + xw, y + yw,  # Current mouse position
+                    x + xw, y + yw)  # Mouse position when button was clicked
+
             # Don't handle mouse button if canvas is 3D and let matplotlib do
             # the default behavior (rotate 3D axes)
             elif not self.Is3DCanvas():
                 # Save mouse position when clicked
                 self.MouseStartPos = wx.Point(x, y)
-                
+
                 # Mouse button was left button, start moving cursor
                 if event.button == 1:
                     # Save current tick in case a drag'n drop is initiate to
                     # restore it
                     self.StartCursorTick = self.CursorTick
-                    
+
                     self.HandleCursorMove(event)
-                    
+
                 # Mouse button is middle button and graph is parallel, start
                 # moving graph along X coordinate (tick)
                 elif event.button == 2 and self.GraphType == GRAPH_PARALLEL:
                     self.StartCursorTick = self.ParentWindow.GetRange()[0]
-        
+
         # Mouse was clicked outside graph figure and over resize highlight with
         # left button, start resizing Viewer
         elif event.button == 1 and event.y <= 5:
             self.MouseStartPos = wx.Point(x, y)
             self.CanvasStartSize = height
-    
+
     def OnCanvasButtonReleased(self, event):
         """
         Function called when a button of mouse is released
@@ -680,62 +675,62 @@
         """
         # If a drag'n drop is in progress, stop it
         if self.ParentWindow.IsDragging():
-            width, height = self.GetSize()
+            _width, height = self.GetSize()
             xw, yw = self.GetPosition()
             item = self.ParentWindow.DraggingAxesPanel.ItemsDict.values()[0]
             # Give mouse position in wx coordinate of parent
             self.ParentWindow.StopDragNDrop(item.GetVariable(),
-                xw + event.x, yw + height - event.y)
-        
+                                            xw + event.x, yw + height - event.y)
+
         else:
             # Reset any move in progress
             self.MouseStartPos = None
             self.CanvasStartSize = None
-            
+
             # Handle button under mouse if it exist
-            width, height = self.GetSize()
+            _width, height = self.GetSize()
             self.HandleButton(event.x, height - event.y)
-    
+
     def OnCanvasMotion(self, event):
         """
         Function called when a button of mouse is moved over Viewer
         @param event: Mouse event
         """
-        width, height = self.GetSize()
-        
+        _width, height = self.GetSize()
+
         # If a drag'n drop is in progress, move canvas dragged
         if self.ParentWindow.IsDragging():
             xw, yw = self.GetPosition()
             # Give mouse position in wx coordinate of parent
             self.ParentWindow.MoveDragNDrop(
-                xw + event.x, 
+                xw + event.x,
                 yw + height - event.y)
-        
-        # If a Viewer resize is in progress, change Viewer size 
+
+        # If a Viewer resize is in progress, change Viewer size
         elif event.button == 1 and self.CanvasStartSize is not None:
-            width, height = self.GetSize()
+            _width, height = self.GetSize()
             self.SetCanvasHeight(
                 self.CanvasStartSize + height - event.y - self.MouseStartPos.y)
-        
+
         # If no button is pressed, show or hide contextual buttons or resize
         # highlight
         elif event.button is None:
             # Compute direction for items label according graph type
-            if self.GraphType == GRAPH_PARALLEL: # Graph is parallel
+            if self.GraphType == GRAPH_PARALLEL:  # Graph is parallel
                 directions = [wx.RIGHT] * len(self.AxesLabels) + \
                              [wx.LEFT] * len(self.Labels)
-            elif len(self.AxesLabels) > 0: # Graph is orthogonal in 2D
-                directions = [wx.RIGHT, wx.TOP,  # Directions for AxesLabels
-                             wx.LEFT, wx.BOTTOM] # Directions for Labels
-            else: # Graph is orthogonal in 3D
+            elif len(self.AxesLabels) > 0:         # Graph is orthogonal in 2D
+                directions = [wx.RIGHT, wx.TOP,    # Directions for AxesLabels
+                              wx.LEFT, wx.BOTTOM]  # Directions for Labels
+            else:  # Graph is orthogonal in 3D
                 directions = [wx.LEFT] * len(self.Labels)
-            
+
             # Find if mouse is over an item label
             item_idx = None
             menu_direction = None
             for (i, t), dir in zip(
-                    [pair for pair in enumerate(self.AxesLabels)] + 
-                    [pair for pair in enumerate(self.Labels)], 
+                    [pair for pair in enumerate(self.AxesLabels)] +
+                    [pair for pair in enumerate(self.Labels)],
                     directions):
                 # Check every label paired with corresponding item
                 (x0, y0), (x1, y1) = t.get_window_extent().get_points()
@@ -745,19 +740,19 @@
                     item_idx = i
                     menu_direction = dir
                     break
-            
-            # If mouse is over an item label, 
+
+            # If mouse is over an item label,
             if item_idx is not None:
                 self.PopupContextualButtons(
-                    self.ItemsDict.values()[item_idx], 
+                    self.ItemsDict.values()[item_idx],
                     rect, menu_direction)
                 return
-            
+
             # If mouse isn't over a contextual menu, hide the current shown one
-            # if it exists 
+            # if it exists
             if self.IsOverContextualButton(event.x, height - event.y) is None:
                 self.DismissContextualButtons()
-            
+
             # Update resize highlight
             if event.y <= 5:
                 if self.SetHighlight(HIGHLIGHT_RESIZE):
@@ -767,46 +762,47 @@
                 if self.SetHighlight(HIGHLIGHT_NONE):
                     self.SetCursor(wx.NullCursor)
                     self.ParentWindow.ForceRefresh()
-        
-        # Handle buttons if canvas is not 3D 
+
+        # Handle buttons if canvas is not 3D
         elif not self.Is3DCanvas():
-            
+
             # If left button is pressed
             if event.button == 1:
-                
+
                 # Mouse is inside graph figure
                 if event.inaxes == self.Axes:
-                    
+
                     # If a cursor move is in progress, update cursor position
                     if self.MouseStartPos is not None:
                         self.HandleCursorMove(event)
-                
+
                 # Mouse is outside graph figure, cursor move is in progress and
                 # there is only one item in Viewer, start a drag'n drop
                 elif self.MouseStartPos is not None and len(self.Items) == 1:
                     xw, yw = self.GetPosition()
                     self.ParentWindow.SetCursorTick(self.StartCursorTick)
-                    self.ParentWindow.StartDragNDrop(self, 
-                        self.ItemsDict.values()[0],
+                    self.ParentWindow.StartDragNDrop(
+                        self, self.ItemsDict.values()[0],
                         # Current mouse position
                         event.x + xw, height - event.y + yw,
                         # Mouse position when button was clicked
                         self.MouseStartPos.x + xw,
                         self.MouseStartPos.y + yw)
-            
+
             # If middle button is pressed and moving graph along X coordinate
             # is in progress
-            elif event.button == 2 and self.GraphType == GRAPH_PARALLEL and \
-                 self.MouseStartPos is not None:
+            elif (event.button == 2 and
+                  self.GraphType == GRAPH_PARALLEL and
+                  self.MouseStartPos is not None):
                 start_tick, end_tick = self.ParentWindow.GetRange()
                 rect = self.GetAxesBoundingBox()
-                
+
                 # Move graph along X coordinate
                 self.ParentWindow.SetCanvasPosition(
-                    self.StartCursorTick + 
+                    self.StartCursorTick +
                     (self.MouseStartPos.x - event.x) *
-                    (end_tick - start_tick) / rect.width)
-    
+                    (end_tick - start_tick) // rect.width)
+
     def OnCanvasScroll(self, event):
         """
         Function called when a wheel mouse is use in Viewer
@@ -815,7 +811,7 @@
         # Change X range of graphs if mouse is in canvas figure and ctrl is
         # pressed
         if event.inaxes is not None and event.guiEvent.ControlDown():
-            
+
             # Calculate position of fixed tick point according to graph type
             # and mouse position
             if self.GraphType == GRAPH_ORTHOGONAL:
@@ -823,11 +819,11 @@
                 tick = (start_tick + end_tick) / 2.
             else:
                 tick = event.xdata
-            self.ParentWindow.ChangeRange(int(-event.step) / 3, tick)
-            
+            self.ParentWindow.ChangeRange(int(-event.step) // 3, tick)
+
             # Vetoing event to prevent parent panel to be scrolled
             self.ParentWindow.VetoScrollEvent = True
-    
+
     def OnLeftDClick(self, event):
         """
         Function called when a left mouse button is double clicked
@@ -841,17 +837,17 @@
             self.ParentWindow.SetCursorTick(self.StartCursorTick)
             # Toggle to text Viewer(s)
             self.ParentWindow.ToggleViewerType(self)
-        
+
         else:
             event.Skip()
-    
+
     # Cursor tick move for each arrow key
     KEY_CURSOR_INCREMENT = {
         wx.WXK_LEFT: -1,
         wx.WXK_RIGHT: 1,
         wx.WXK_UP: 10,
         wx.WXK_DOWN: -10}
-    
+
     def OnKeyDown(self, event):
         """
         Function called when key is pressed
@@ -863,7 +859,7 @@
             if move is not None:
                 self.ParentWindow.MoveCursorTick(move)
         event.Skip()
-    
+
     def OnLeave(self, event):
         """
         Function called when mouse leave Viewer
@@ -876,7 +872,7 @@
             DebugVariableViewer.OnLeave(self, event)
         else:
             event.Skip()
-    
+
     def GetCanvasMinSize(self):
         """
         Return the minimum size of Viewer so that all items label can be
@@ -885,10 +881,10 @@
         """
         # The minimum height take in account the height of all items, padding
         # inside figure and border around figure
-        return wx.Size(200, 
-            CANVAS_BORDER[0] + CANVAS_BORDER[1] + 
-            2 * CANVAS_PADDING + VALUE_LABEL_HEIGHT * len(self.Items))
-    
+        return wx.Size(200,
+                       CANVAS_BORDER[0] + CANVAS_BORDER[1] +
+                       2 * CANVAS_PADDING + VALUE_LABEL_HEIGHT * len(self.Items))
+
     def SetCanvasHeight(self, height):
         """
         Set Viewer size checking that it respects Viewer minimum size
@@ -899,7 +895,7 @@
         self.SetMinSize(wx.Size(min_width, height))
         self.RefreshLabelsPosition(height)
         self.ParentWindow.RefreshGraphicsSizer()
-        
+
     def GetAxesBoundingBox(self, parent_coordinate=False):
         """
         Return figure bounding box in wx coordinate
@@ -911,52 +907,52 @@
         ax, ay, aw, ah = self.figure.gca().get_position().bounds
         bbox = wx.Rect(ax * width, height - (ay + ah) * height - 1,
                        aw * width + 2, ah * height + 1)
-        
+
         # If parent_coordinate, add Viewer position in parent
         if parent_coordinate:
             xw, yw = self.GetPosition()
             bbox.x += xw
             bbox.y += yw
-        
+
         return bbox
-    
+
     def RefreshHighlight(self, x, y):
         """
         Refresh Viewer highlight according to mouse position
         @param x: X coordinate of mouse pointer
         @param y: Y coordinate of mouse pointer
         """
-        width, height = self.GetSize()
-        
+        _width, height = self.GetSize()
+
         # Mouse is over Viewer figure and graph is not 3D
         bbox = self.GetAxesBoundingBox()
         if bbox.InsideXY(x, y) and not self.Is3DCanvas():
-            rect = wx.Rect(bbox.x, bbox.y, bbox.width / 2, bbox.height)
+            rect = wx.Rect(bbox.x, bbox.y, bbox.width // 2, bbox.height)
             # Mouse is over Viewer left part of figure
             if rect.InsideXY(x, y):
                 self.SetHighlight(HIGHLIGHT_LEFT)
-            
+
             # Mouse is over Viewer right part of figure
             else:
                 self.SetHighlight(HIGHLIGHT_RIGHT)
-        
+
         # Mouse is over upper part of Viewer
-        elif y < height / 2:
+        elif y < height // 2:
             # Viewer is upper one in Debug Variable Panel, show highlight
             if self.ParentWindow.IsViewerFirst(self):
                 self.SetHighlight(HIGHLIGHT_BEFORE)
-            
+
             # Viewer is not the upper one, show highlight in previous one
             # It prevents highlight to move when mouse leave one Viewer to
             # another
             else:
                 self.SetHighlight(HIGHLIGHT_NONE)
                 self.ParentWindow.HighlightPreviousViewer(self)
-        
+
         # Mouse is over lower part of Viewer
         else:
             self.SetHighlight(HIGHLIGHT_AFTER)
-    
+
     def OnAxesMotion(self, event):
         """
         Function overriding default function called when mouse is dragged for
@@ -969,13 +965,14 @@
             if current_time - self.LastMotionTime > REFRESH_PERIOD:
                 self.LastMotionTime = current_time
                 Axes3D._on_move(self.Axes, event)
-    
+
     def GetAddTextFunction(self):
         """
         Return function for adding text in figure according to graph type
         @return: Function adding text to figure
         """
         text_func = (self.Axes.text2D if self.Is3DCanvas() else self.Axes.text)
+
         def AddText(*args, **kwargs):
             args = [0, 0, ""]
             kwargs["transform"] = self.Axes.transAxes
@@ -983,62 +980,59 @@
         return AddText
 
     def SetAxesColor(self, color):
-        if LooseVersion(matplotlib.__version__) >= LooseVersion("1.5.0"):
-            self.Axes.set_prop_cycle(cycler('color',color))
-        else:
-            self.Axes.set_color_cycle(color)
-        
+        self.Axes.set_prop_cycle(cycler('color', color))
+
     def ResetGraphics(self):
         """
         Reset figure and graphical elements displayed in it
-        Called any time list of items or graph type change 
+        Called any time list of items or graph type change
         """
         # Clear figure from any axes defined
         self.Figure.clear()
-        
+
         # Add 3D projection if graph is in 3D
         if self.Is3DCanvas():
             self.Axes = self.Figure.gca(projection='3d')
             self.SetAxesColor(['b'])
-            
-            # Override function to prevent too much refresh when graph is 
+
+            # Override function to prevent too much refresh when graph is
             # rotated
             self.LastMotionTime = gettime()
             setattr(self.Axes, "_on_move", self.OnAxesMotion)
-            
+
             # Init graph mouse event so that graph can be rotated
             self.Axes.mouse_init()
-            
+
             # Set size of Z axis labels
             self.Axes.tick_params(axis='z', labelsize='small')
-        
+
         else:
             self.Axes = self.Figure.gca()
             self.SetAxesColor(COLOR_CYCLE)
-        
+
         # Set size of X and Y axis labels
         self.Axes.tick_params(axis='x', labelsize='small')
         self.Axes.tick_params(axis='y', labelsize='small')
-        
+
         # Init variables storing graphical elements added to figure
-        self.Plots = []      # List of curves
-        self.VLine = None    # Vertical line for cursor
-        self.HLine = None    # Horizontal line for cursor (only orthogonal 2D)
-        self.AxesLabels = [] # List of items variable path text label
-        self.Labels = []     # List of items text label
-        
-        # Get function to add a text in figure according to graph type 
+        self.Plots = []       # List of curves
+        self.VLine = None     # Vertical line for cursor
+        self.HLine = None     # Horizontal line for cursor (only orthogonal 2D)
+        self.AxesLabels = []  # List of items variable path text label
+        self.Labels = []      # List of items text label
+
+        # Get function to add a text in figure according to graph type
         add_text_func = self.GetAddTextFunction()
-        
+
         # Graph type is parallel or orthogonal in 3D
         if self.GraphType == GRAPH_PARALLEL or self.Is3DCanvas():
             num_item = len(self.Items)
             for idx in xrange(num_item):
-                
+
                 # Get color from color cycle (black if only one item)
-                color = ('k' if num_item == 1
-                             else COLOR_CYCLE[idx % len(COLOR_CYCLE)])
-                
+                color = ('k' if num_item == 1 else
+                         COLOR_CYCLE[idx % len(COLOR_CYCLE)])
+
                 # In 3D graph items variable label are not displayed as text
                 # in figure, but as axis title
                 if not self.Is3DCanvas():
@@ -1046,12 +1040,12 @@
                     self.AxesLabels.append(
                         add_text_func(size='small', color=color,
                                       verticalalignment='top'))
-                
+
                 # Items variable labels are in figure lower right corner
                 self.Labels.append(
-                    add_text_func(size='large', color=color, 
+                    add_text_func(size='large', color=color,
                                   horizontalalignment='right'))
-        
+
         # Graph type is orthogonal in 2D
         else:
             # X coordinate labels are in figure lower side
@@ -1059,7 +1053,7 @@
             self.Labels.append(
                 add_text_func(size='large',
                               horizontalalignment='right'))
-            
+
             # Y coordinate labels are vertical and in figure left side
             self.AxesLabels.append(
                 add_text_func(size='small', rotation='vertical',
@@ -1067,11 +1061,11 @@
             self.Labels.append(
                 add_text_func(size='large', rotation='vertical',
                               verticalalignment='top'))
-       
+
         # Refresh position of labels according to Viewer size
-        width, height = self.GetSize()
+        _width, height = self.GetSize()
         self.RefreshLabelsPosition(height)
-    
+
     def RefreshLabelsPosition(self, height):
         """
         Function called when mouse leave Viewer
@@ -1083,51 +1077,51 @@
         # expressed border and text position in pixel on screen and apply the
         # ratio calculated hereafter to get border and text position in
         # matplotlib coordinate
-        canvas_ratio = 1. / height # Divide by canvas height in pixel
+        canvas_ratio = 1. / height  # Divide by canvas height in pixel
         graph_ratio = 1. / (
-            (1.0 - (CANVAS_BORDER[0] + CANVAS_BORDER[1]) * canvas_ratio)
-             * height)             # Divide by figure height in pixel
-        
+            (1.0 - (CANVAS_BORDER[0] + CANVAS_BORDER[1]) * canvas_ratio) *
+            height)             # Divide by figure height in pixel
+
         # Update position of figure (keeping up and bottom border the same
         # size)
         self.Figure.subplotpars.update(
-            top= 1.0 - CANVAS_BORDER[1] * canvas_ratio, 
-            bottom= CANVAS_BORDER[0] * canvas_ratio)
-        
+            top=1.0 - CANVAS_BORDER[1] * canvas_ratio,
+            bottom=CANVAS_BORDER[0] * canvas_ratio)
+
         # Update position of items labels
         if self.GraphType == GRAPH_PARALLEL or self.Is3DCanvas():
             num_item = len(self.Items)
             for idx in xrange(num_item):
-                
+
                 # In 3D graph items variable label are not displayed
                 if not self.Is3DCanvas():
                     # Items variable labels are in figure upper left corner
                     self.AxesLabels[idx].set_position(
-                        (0.05, 
-                         1.0 - (CANVAS_PADDING + 
+                        (0.05,
+                         1.0 - (CANVAS_PADDING +
                                 AXES_LABEL_HEIGHT * idx) * graph_ratio))
-                
+
                 # Items variable labels are in figure lower right corner
                 self.Labels[idx].set_position(
-                    (0.95, 
-                     CANVAS_PADDING * graph_ratio + 
+                    (0.95,
+                     CANVAS_PADDING * graph_ratio +
                      (num_item - idx - 1) * VALUE_LABEL_HEIGHT * graph_ratio))
         else:
             # X coordinate labels are in figure lower side
             self.AxesLabels[0].set_position(
-                    (0.1, CANVAS_PADDING * graph_ratio))
+                (0.1, CANVAS_PADDING * graph_ratio))
             self.Labels[0].set_position(
-                    (0.95, CANVAS_PADDING * graph_ratio))
-            
+                (0.95, CANVAS_PADDING * graph_ratio))
+
             # Y coordinate labels are vertical and in figure left side
             self.AxesLabels[1].set_position(
-                    (0.05, 2 * CANVAS_PADDING * graph_ratio))
+                (0.05, 2 * CANVAS_PADDING * graph_ratio))
             self.Labels[1].set_position(
-                    (0.05, 1.0 - CANVAS_PADDING * graph_ratio))
-        
+                (0.05, 1.0 - CANVAS_PADDING * graph_ratio))
+
         # Update subplots
         self.Figure.subplots_adjust()
-    
+
     def RefreshViewer(self, refresh_graphics=True):
         """
         Function called to refresh displayed by matplotlib canvas
@@ -1138,55 +1132,55 @@
         if refresh_graphics:
             # Get tick range of values to display
             start_tick, end_tick = self.ParentWindow.GetRange()
-            
+
             # Graph is parallel
-            if self.GraphType == GRAPH_PARALLEL:    
+            if self.GraphType == GRAPH_PARALLEL:
                 # Init list of data range for each variable displayed
                 ranges = []
-                
+
                 # Get data and range for each variable displayed
                 for idx, item in enumerate(self.Items):
                     data, min_value, max_value = item.GetDataAndValueRange(
-                                start_tick, end_tick, not self.ZoomFit)
-                    
+                        start_tick, end_tick, not self.ZoomFit)
+
                     # Check that data is not empty
                     if data is not None:
                         # Add variable range to list of variable data range
                         ranges.append((min_value, max_value))
-                        
+
                         # Add plot to canvas if not yet created
                         if len(self.Plots) <= idx:
                             self.Plots.append(
                                 self.Axes.plot(data[:, 0], data[:, 1])[0])
-                        
+
                         # Set data to already created plot in canvas
                         else:
                             self.Plots[idx].set_data(data[:, 0], data[:, 1])
-                
+
                 # Get X and Y axis ranges
                 x_min, x_max = start_tick, end_tick
                 y_min, y_max = merge_ranges(ranges)
-                
+
                 # Display cursor in canvas if a cursor tick is defined and it is
                 # include in values tick range
-                if (self.CursorTick is not None and 
-                    start_tick <= self.CursorTick <= end_tick):
-                    
+                if self.CursorTick is not None and \
+                   start_tick <= self.CursorTick <= end_tick:
+
                     # Define a vertical line to display cursor position if no
                     # line is already defined
                     if self.VLine is None:
-                        self.VLine = self.Axes.axvline(self.CursorTick, 
+                        self.VLine = self.Axes.axvline(self.CursorTick,
                                                        color=CURSOR_COLOR)
-                    
+
                     # Set value of vertical line if already defined
                     else:
                         self.VLine.set_xdata((self.CursorTick, self.CursorTick))
                     self.VLine.set_visible(True)
-                
+
                 # Hide vertical line if cursor tick is not defined or reset
                 elif self.VLine is not None:
                     self.VLine.set_visible(False)
-            
+
             # Graph is orthogonal
             else:
                 # Update tick range, removing ticks that don't have a value for
@@ -1194,76 +1188,76 @@
                 start_tick = max(start_tick, self.GetItemsMinCommonTick())
                 end_tick = max(end_tick, start_tick)
                 items = self.ItemsDict.values()
-                
+
                 # Get data and range for first variable (X coordinate)
                 x_data, x_min, x_max = items[0].GetDataAndValueRange(
-                                        start_tick, end_tick, not self.ZoomFit)
+                    start_tick, end_tick, not self.ZoomFit)
+
                 # Get data and range for second variable (Y coordinate)
                 y_data, y_min, y_max = items[1].GetDataAndValueRange(
-                                        start_tick, end_tick, not self.ZoomFit)
-                
+                    start_tick, end_tick, not self.ZoomFit)
+
                 # Normalize X and Y coordinates value range
                 x_min, x_max = merge_ranges([(x_min, x_max)])
                 y_min, y_max = merge_ranges([(y_min, y_max)])
-                
-                # Get X and Y coordinates for cursor if cursor tick is defined 
+
+                # Get X and Y coordinates for cursor if cursor tick is defined
                 if self.CursorTick is not None:
-                    x_cursor, x_forced = items[0].GetValue(
-                                            self.CursorTick, raw=True)
-                    y_cursor, y_forced = items[1].GetValue(
-                                            self.CursorTick, raw=True)
-                
+                    x_cursor, _x_forced = items[0].GetValue(
+                        self.CursorTick, raw=True)
+                    y_cursor, _y_forced = items[1].GetValue(
+                        self.CursorTick, raw=True)
+
                 # Get common data length so that each value has an x and y
                 # coordinate
                 length = (min(len(x_data), len(y_data))
                           if x_data is not None and y_data is not None
                           else 0)
-                
-                # Graph is orthogonal 2D 
+
+                # Graph is orthogonal 2D
                 if len(self.Items) < 3:
-                    
+
                     # Check that x and y data are not empty
                     if x_data is not None and y_data is not None:
-                        
+
                         # Add plot to canvas if not yet created
                         if len(self.Plots) == 0:
                             self.Plots.append(
-                                self.Axes.plot(x_data[:, 1][:length], 
+                                self.Axes.plot(x_data[:, 1][:length],
                                                y_data[:, 1][:length])[0])
-                        
+
                         # Set data to already created plot in canvas
                         else:
                             self.Plots[0].set_data(
-                                x_data[:, 1][:length], 
+                                x_data[:, 1][:length],
                                 y_data[:, 1][:length])
-                    
+
                     # Display cursor in canvas if a cursor tick is defined and it is
                     # include in values tick range
-                    if (self.CursorTick is not None and 
-                        start_tick <= self.CursorTick <= end_tick):
-                        
+                    if self.CursorTick is not None and \
+                       start_tick <= self.CursorTick <= end_tick:
+
                         # Define a vertical line to display cursor x coordinate
                         # if no line is already defined
                         if self.VLine is None:
-                            self.VLine = self.Axes.axvline(x_cursor, 
+                            self.VLine = self.Axes.axvline(x_cursor,
                                                            color=CURSOR_COLOR)
                         # Set value of vertical line if already defined
                         else:
                             self.VLine.set_xdata((x_cursor, x_cursor))
-                        
-                        
+
                         # Define a horizontal line to display cursor y
                         # coordinate if no line is already defined
                         if self.HLine is None:
-                            self.HLine = self.Axes.axhline(y_cursor, 
+                            self.HLine = self.Axes.axhline(y_cursor,
                                                            color=CURSOR_COLOR)
                         # Set value of horizontal line if already defined
                         else:
                             self.HLine.set_ydata((y_cursor, y_cursor))
-                        
+
                         self.VLine.set_visible(True)
                         self.HLine.set_visible(True)
-                    
+
                     # Hide vertical and horizontal line if cursor tick is not
                     # defined or reset
                     else:
@@ -1271,42 +1265,43 @@
                             self.VLine.set_visible(False)
                         if self.HLine is not None:
                             self.HLine.set_visible(False)
-                
+
                 # Graph is orthogonal 3D
                 else:
                     # Remove all plots already defined in 3D canvas
                     while len(self.Axes.lines) > 0:
                         self.Axes.lines.pop()
-                    
+
                     # Get data and range for third variable (Z coordinate)
                     z_data, z_min, z_max = items[2].GetDataAndValueRange(
-                                    start_tick, end_tick, not self.ZoomFit)
-                    
+                        start_tick, end_tick, not self.ZoomFit)
+
                     # Normalize Z coordinate value range
                     z_min, z_max = merge_ranges([(z_min, z_max)])
-                    
+
                     # Check that x, y and z data are not empty
-                    if (x_data is not None and y_data is not None and 
-                        z_data is not None):
-                        
+                    if x_data is not None and \
+                       y_data is not None and \
+                       z_data is not None:
+
                         # Get common data length so that each value has an x, y
                         # and z coordinate
                         length = min(length, len(z_data))
-                        
+
                         # Add plot to canvas
                         self.Axes.plot(x_data[:, 1][:length],
                                        y_data[:, 1][:length],
-                                       zs = z_data[:, 1][:length])
-                    
+                                       zs=z_data[:, 1][:length])
+
                     # Display cursor in canvas if a cursor tick is defined and
                     # it is include in values tick range
-                    if (self.CursorTick is not None and 
-                        start_tick <= self.CursorTick <= end_tick):
-                        
+                    if self.CursorTick is not None and \
+                       start_tick <= self.CursorTick <= end_tick:
+
                         # Get Z coordinate for cursor
-                        z_cursor, z_forced = items[2].GetValue(
-                                                self.CursorTick, raw=True)
-                        
+                        z_cursor, _z_forced = items[2].GetValue(
+                            self.CursorTick, raw=True)
+
                         # Add 3 lines parallel to x, y and z axis to display
                         # cursor position in 3D
                         for kwargs in [{"xs": numpy.array([x_min, x_max])},
@@ -1319,50 +1314,50 @@
                                 kwargs.setdefault(param, value)
                             kwargs["color"] = CURSOR_COLOR
                             self.Axes.plot(**kwargs)
-                    
+
                     # Set Z axis limits
                     self.Axes.set_zlim(z_min, z_max)
-            
+
             # Set X and Y axis limits
             self.Axes.set_xlim(x_min, x_max)
             self.Axes.set_ylim(y_min, y_max)
-        
+
         # Get value and forced flag for each variable displayed in graph
         # If cursor tick is not defined get value and flag of last received
         # or get value and flag of variable at cursor tick
-        values, forced = apply(zip, [
-                (item.GetValue(self.CursorTick)
-                 if self.CursorTick is not None
-                 else (item.GetValue(), item.IsForced()))
-                for item in self.Items])
-        
+        args = [(
+            item.GetValue(self.CursorTick)
+            if self.CursorTick is not None
+            else (item.GetValue(), item.IsForced())) for item in self.Items]
+        values, forced = zip(*args)
+
         # Get path of each variable displayed simplified using panel variable
         # name mask
-        labels = [item.GetVariable(self.ParentWindow.GetVariableNameMask()) 
+        labels = [item.GetVariable(self.ParentWindow.GetVariableNameMask())
                   for item in self.Items]
-        
-        # Get style for each variable according to 
+
+        # Get style for each variable according to
         styles = map(lambda x: {True: 'italic', False: 'normal'}[x], forced)
-        
+
         # Graph is orthogonal 3D, set variables path as 3D axis label
         if self.Is3DCanvas():
-            for idx, label_func in enumerate([self.Axes.set_xlabel, 
+            for idx, label_func in enumerate([self.Axes.set_xlabel,
                                               self.Axes.set_ylabel,
                                               self.Axes.set_zlabel]):
                 label_func(labels[idx], fontdict={'size': 'small',
                                                   'color': COLOR_CYCLE[idx]})
-        
+
         # Graph is not orthogonal 3D, set variables path in axes labels
         else:
             for label, text in zip(self.AxesLabels, labels):
                 label.set_text(text)
-        
+
         # Set value label text and style according to value and forced flag for
         # each variable displayed
         for label, value, style in zip(self.Labels, values, styles):
             label.set_text(value)
             label.set_style(style)
-        
+
         # Refresh figure
         self.draw()
 
@@ -1372,51 +1367,49 @@
         """
         # Render figure using agg
         FigureCanvasAgg.draw(self)
-        
+
         # Get bitmap of figure rendered
         self.bitmap = _convert_agg_to_wx_bitmap(self.get_renderer(), None)
-        if wx.VERSION < (3, 0, 0):        
+        if wx.VERSION < (3, 0, 0):
             self.bitmap.UseAlpha()
-        
+
         # Create DC for rendering graphics in bitmap
         destDC = wx.MemoryDC()
         destDC.SelectObject(self.bitmap)
-        
+
         # Get Graphics Context for DC, for anti-aliased and transparent
         # rendering
         destGC = wx.GCDC(destDC)
-        
+
         destGC.BeginDrawing()
-        
+
         # Get canvas size and figure bounding box in canvas
         width, height = self.GetSize()
         bbox = self.GetAxesBoundingBox()
-        
+
         # If highlight to display is resize, draw thick grey line at bottom
-        # side of canvas 
+        # side of canvas
         if self.Highlight == HIGHLIGHT_RESIZE:
-            destGC.SetPen(HIGHLIGHT_RESIZE_PEN)
-            destGC.SetBrush(HIGHLIGHT_RESIZE_BRUSH)
+            destGC.SetPen(HIGHLIGHT['RESIZE_PEN'])
+            destGC.SetBrush(HIGHLIGHT['RESIZE_BRUSH'])
             destGC.DrawRectangle(0, height - 5, width, 5)
-        
+
         # If highlight to display is merging graph, draw 50% transparent blue
         # rectangle on left or right part of figure depending on highlight type
         elif self.Highlight in [HIGHLIGHT_LEFT, HIGHLIGHT_RIGHT]:
-            destGC.SetPen(HIGHLIGHT_DROP_PEN)
-            destGC.SetBrush(HIGHLIGHT_DROP_BRUSH)
-            
-            x_offset = (bbox.width / 2 
+            destGC.SetPen(HIGHLIGHT['DROP_PEN'])
+            destGC.SetBrush(HIGHLIGHT['DROP_BRUSH'])
+
+            x_offset = (bbox.width // 2
                         if self.Highlight == HIGHLIGHT_RIGHT
                         else 0)
-            destGC.DrawRectangle(bbox.x + x_offset, bbox.y, 
-                                 bbox.width / 2, bbox.height)
-        
+            destGC.DrawRectangle(bbox.x + x_offset, bbox.y,
+                                 bbox.width // 2, bbox.height)
+
         # Draw other Viewer common elements
         self.DrawCommonElements(destGC, self.GetButtons())
-        
+
         destGC.EndDrawing()
-        
+
         self._isDrawn = True
         self.gui_repaint(drawDC=drawDC)
-    
-    
--- a/controls/DebugVariablePanel/DebugVariableItem.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/DebugVariablePanel/DebugVariableItem.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,29 +22,31 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from datetime import timedelta
+import binascii
 import numpy
-import binascii
-
 from graphics.DebugDataConsumer import DebugDataConsumer, TYPE_TRANSLATOR
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                 Constant for calculate CRC for string variables
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 STRING_CRC_SIZE = 8
 STRING_CRC_MASK = 2 ** STRING_CRC_SIZE - 1
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                          Debug Variable Item Class
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements an element that consumes debug values for PLC variable and
-stores received values for displaying them in graphic panel or table
-"""
+# -------------------------------------------------------------------------------
+
 
 class DebugVariableItem(DebugDataConsumer):
-    
+    """
+    Class that implements an element that consumes debug values for PLC variable and
+    stores received values for displaying them in graphic panel or table
+    """
+
     def __init__(self, parent, variable, store_data=False):
         """
         Constructor
@@ -52,24 +54,24 @@
         @param variable: Path of variable to debug
         """
         DebugDataConsumer.__init__(self)
-        
+
         self.Parent = parent
         self.Variable = variable
         self.StoreData = store_data
-        
+
         # Get Variable data type
         self.RefreshVariableType()
-        
+
     def __del__(self):
         """
         Destructor
         """
         # Reset reference to debug variable panel
         self.Parent = None
-    
+
     def SetVariable(self, variable):
         """
-        Set path of variable 
+        Set path of variable
         @param variable: Path of variable to debug
         """
         if self.Parent is not None and self.Variable != variable:
@@ -77,46 +79,46 @@
             self.Variable = variable
             # Get Variable data type
             self.RefreshVariableType()
-            
+
             # Refresh debug variable panel
             self.Parent.RefreshView()
-    
+
     def GetVariable(self, mask=None):
         """
-        Return path of variable 
+        Return path of variable
         @param mask: Mask to apply to variable path [var_name, '*',...]
         @return: String containing masked variable path
         """
         # Apply mask to variable name
         if mask is not None:
             # '#' correspond to parts that are different between all items
-            
+
             # Extract variable path parts
             parts = self.Variable.split('.')
             # Adjust mask size to size of variable path
             mask = mask + ['*'] * max(0, len(parts) - len(mask))
-            
+
             # Store previous mask
             last = None
             # Init masked variable path
             variable = ""
-            
+
             for m, p in zip(mask, parts):
                 # Part is not masked, add part prefixed with '.' is previous
                 # wasn't masked
                 if m == '*':
                     variable += ('.' if last == '*' else '') + p
-                
+
                 # Part is mask, add '..' if first or previous wasn't masked
                 elif last is None or last == '*':
                     variable += '..'
-                
+
                 last = m
-            
+
             return variable
-        
+
         return self.Variable
-    
+
     def RefreshVariableType(self):
         """
         Get and store variable data type
@@ -124,14 +126,14 @@
         self.VariableType = self.Parent.GetDataType(self.Variable)
         # Reset data stored
         self.ResetData()
-    
+
     def GetVariableType(self):
         """
         Return variable data type
         @return: Variable data type
         """
         return self.VariableType
-    
+
     def GetData(self, start_tick=None, end_tick=None):
         """
         Return data stored contained in given range
@@ -142,7 +144,7 @@
         # Return immediately if data empty or none
         if self.Data is None or len(self.Data) == 0:
             return self.Data
-        
+
         # Find nearest data outside given range indexes
         start_idx = (self.GetNearestData(start_tick, -1)
                      if start_tick is not None
@@ -150,28 +152,27 @@
         end_idx = (self.GetNearestData(end_tick, 1)
                    if end_tick is not None
                    else len(self.Data))
-        
+
         # Return data between indexes
         return self.Data[start_idx:end_idx]
-    
+
     def GetRawValue(self, index):
         """
         Return raw value at given index for string variables
         @param index: Variable value index
         @return: Variable data type
         """
-        if (self.VariableType in ["STRING", "WSTRING"] and
-            index < len(self.RawData)):
+        if self.VariableType in ["STRING", "WSTRING"] and index < len(self.RawData):
             return self.RawData[index][0]
         return ""
-    
+
     def GetValueRange(self):
         """
         Return variable value range
         @return: (minimum_value, maximum_value)
         """
         return self.MinValue, self.MaxValue
-    
+
     def GetDataAndValueRange(self, start_tick, end_tick, full_range=True):
         """
         Return variable data and value range for a given tick range
@@ -179,16 +180,16 @@
         @param end_tick: end tick of given range (default None, last data)
         @param full_range: Value range is calculated on whole data (False: only
         calculated on data in given range)
-        @return: (numpy.array([(tick, value, forced),...]), 
+        @return: (numpy.array([(tick, value, forced),...]),
                   min_value, max_value)
         """
         # Get data in given tick range
         data = self.GetData(start_tick, end_tick)
-        
+
         # Value range is calculated on whole data
         if full_range:
             return data, self.MinValue, self.MaxValue
-        
+
         # Check that data in given range is not empty
         values = data[:, 1]
         if len(values) > 0:
@@ -196,10 +197,10 @@
             return (data,
                     data[numpy.argmin(values), 1],
                     data[numpy.argmax(values), 1])
-        
+
         # Return default values
         return data, None, None
-    
+
     def ResetData(self):
         """
         Reset data stored when store data option enabled
@@ -207,31 +208,33 @@
         if self.StoreData and self.IsNumVariable():
             # Init table storing data
             self.Data = numpy.array([]).reshape(0, 3)
-            
+
             # Init table storing raw data if variable is strin
             self.RawData = ([]
                             if self.VariableType in ["STRING", "WSTRING"]
                             else None)
-                
+
             # Init Value range variables
             self.MinValue = None
             self.MaxValue = None
-        
+
         else:
             self.Data = None
-        
+            self.MinValue = None
+            self.MaxValue = None
         # Init variable value
         self.Value = ""
-    
+
     def IsNumVariable(self):
         """
         Return if variable data type is numeric. String variables are
-        considered as numeric (string CRC)
+        considered as numeric (string CRC). Time variables are considered
+        as number of seconds
         @return: True if data type is numeric
         """
-        return (self.Parent.IsNumType(self.VariableType) or 
-                self.VariableType in ["STRING", "WSTRING"])
-    
+        return (self.Parent.IsNumType(self.VariableType) or
+                self.VariableType in ["STRING", "WSTRING", "TIME", "TOD", "DT", "DATE"])
+
     def NewValues(self, ticks, values):
         """
         Function called by debug thread when a new debug value is available
@@ -240,24 +243,29 @@
         @param forced: Forced flag, True if value is forced (default: False)
         """
         DebugDataConsumer.NewValues(self, ticks[-1], values[-1], raw=None)
-        
+
         if self.Data is not None:
-            
+
             if self.VariableType in ["STRING", "WSTRING"]:
                 last_raw_data = (self.RawData[-1]
                                  if len(self.RawData) > 0 else None)
                 last_raw_data_idx = len(self.RawData) - 1
-            
+
             data_values = []
             for tick, (value, forced) in zip(ticks, values):
                 # Translate forced flag to float for storing in Data table
                 forced_value = float(forced)
-                
-                # String data value is CRC
-                num_value = (binascii.crc32(value) & STRING_CRC_MASK
-                             if self.VariableType in ["STRING", "WSTRING"]
-                             else float(value))
-            
+
+                if self.VariableType in ["STRING", "WSTRING"]:
+                    # String data value is CRC
+                    num_value = (binascii.crc32(value) & STRING_CRC_MASK)
+                elif self.VariableType in ["TIME", "TOD", "DT", "DATE"]:
+                    # Numeric value of time type variables
+                    # is represented in seconds
+                    num_value = float(value.total_seconds())
+                else:
+                    num_value = float(value)
+
                 # Update variable range values
                 self.MinValue = (min(self.MinValue, num_value)
                                  if self.MinValue is not None
@@ -265,10 +273,10 @@
                 self.MaxValue = (max(self.MaxValue, num_value)
                                  if self.MaxValue is not None
                                  else num_value)
-            
+
                 # In the case of string variables, we store raw string value and
                 # forced flag in raw data table. Only changes in this two values
-                # are stored. Index to the corresponding raw value is stored in 
+                # are stored. Index to the corresponding raw value is stored in
                 # data third column
                 if self.VariableType in ["STRING", "WSTRING"]:
                     raw_data = (value, forced_value)
@@ -277,20 +285,20 @@
                         last_raw_data = raw_data
                         self.RawData.append(raw_data)
                     extra_value = last_raw_data_idx
-                
+
                 # In other case, data third column is forced flag
                 else:
                     extra_value = forced_value
-            
+
                 data_values.append(
                     [float(tick), num_value, extra_value])
-            
+
             # Add New data to stored data table
             self.Data = numpy.append(self.Data, data_values, axis=0)
-            
+
             # Signal to debug variable panel to refresh
             self.Parent.HasNewData = True
-        
+
     def SetForced(self, forced):
         """
         Update Forced flag
@@ -299,29 +307,27 @@
         # Store forced flag
         if self.Forced != forced:
             self.Forced = forced
-            
+
             # Signal to debug variable panel to refresh
             self.Parent.HasNewData = True
-    
+
     def SetValue(self, value):
         """
         Update value.
         @param value: New value
         """
         # Remove quote and double quote surrounding string value to get raw value
-        if (self.VariableType == "STRING" and
-            value.startswith("'") and value.endswith("'") or
-            self.VariableType == "WSTRING" and
-            value.startswith('"') and value.endswith('"')):
+        if self.VariableType == "STRING" and value.startswith("'") and value.endswith("'") or \
+           self.VariableType == "WSTRING" and value.startswith('"') and value.endswith('"'):
             value = value[1:-1]
-        
+
         # Store variable value
         if self.Value != value:
             self.Value = value
-            
+
             # Signal to debug variable panel to refresh
             self.Parent.HasNewData = True
-    
+
     def GetValue(self, tick=None, raw=False):
         """
         Return current value or value and forced flag for tick given
@@ -329,30 +335,34 @@
         """
         # If tick given and stored data option enabled
         if tick is not None and self.Data is not None:
-            
+
             # Return current value and forced flag if data empty
             if len(self.Data) == 0:
                 return self.Value, self.IsForced()
-            
+
             # Get index of nearest data from tick given
             idx = self.GetNearestData(tick, 0)
-            
+
             # Get value and forced flag at given index
-            value, forced = self.RawData[int(self.Data[idx, 2])] \
-                            if self.VariableType in ["STRING", "WSTRING"] \
-                            else self.Data[idx, 1:3]
-            
+            value, forced = \
+                self.RawData[int(self.Data[idx, 2])] \
+                if self.VariableType in ["STRING", "WSTRING"] \
+                else self.Data[idx, 1:3]
+
+            if self.VariableType in ["TIME", "TOD", "DT", "DATE"]:
+                value = timedelta(seconds=value)
+
             # Get raw value if asked
             if not raw:
                 value = TYPE_TRANSLATOR.get(
-                        self.VariableType, str)(value)
-            
+                    self.VariableType, str)(value)
+
             return value, forced
-            
+
         # Return raw value if asked
         if not raw and self.VariableType in ["STRING", "WSTRING"]:
             return TYPE_TRANSLATOR.get(
-                    self.VariableType, str)(self.Value)
+                self.VariableType, str)(self.Value)
         return self.Value
 
     def GetNearestData(self, tick, adjust):
@@ -368,16 +378,16 @@
         # Return immediately if data is empty
         if self.Data is None:
             return None
-        
+
         # Extract data ticks
         ticks = self.Data[:, 0]
-        
+
         # Get nearest data from tick
         idx = numpy.argmin(abs(ticks - tick))
-        
+
         # Adjust data index according to constraint
-        if (adjust < 0 and ticks[idx] > tick and idx > 0 or
-            adjust > 0 and ticks[idx] < tick and idx < len(ticks)):
+        if adjust < 0 and ticks[idx] > tick and idx > 0 or \
+           adjust > 0 and ticks[idx] < tick and idx < len(ticks):
             idx += adjust
-        
+
         return idx
--- a/controls/DebugVariablePanel/DebugVariablePanel.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/DebugVariablePanel/DebugVariablePanel.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,69 +22,67 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-from types import TupleType
-import math
+
+from __future__ import absolute_import
+from __future__ import division
+from functools import reduce
 import numpy
 
 import wx
 import wx.lib.buttons
 
+
+# pylint: disable=wrong-import-position
 import matplotlib
-matplotlib.use('WX')
+matplotlib.use('WX')   # noqa
 import matplotlib.pyplot
-from matplotlib.backends.backend_wxagg import _convert_agg_to_wx_bitmap
 
 from editors.DebugViewer import DebugViewer
 from util.BitmapLibrary import GetBitmap
 
-from DebugVariableItem import DebugVariableItem
-from DebugVariableTextViewer import DebugVariableTextViewer
-from DebugVariableGraphicViewer import *
-
-MILLISECOND = 1000000       # Number of nanosecond in a millisecond
-SECOND = 1000 * MILLISECOND # Number of nanosecond in a second
-MINUTE = 60 * SECOND        # Number of nanosecond in a minute
-HOUR = 60 * MINUTE          # Number of nanosecond in a hour
-DAY = 24 * HOUR             # Number of nanosecond in a day
-
-# List of values possible for graph range
-# Format is [(time_in_plain_text, value_in_nanosecond),...]
-RANGE_VALUES = \
-    [(_("%dms") % i, i * MILLISECOND) for i in (10, 20, 50, 100, 200, 500)] + \
-    [(_("%ds") % i, i * SECOND) for i in (1, 2, 5, 10, 20, 30)] + \
-    [(_("%dm") % i, i * MINUTE) for i in (1, 2, 5, 10, 20, 30)] + \
-    [(_("%dh") % i, i * HOUR) for i in (1, 2, 3, 6, 12, 24)]
+from controls.DebugVariablePanel.DebugVariableItem import DebugVariableItem
+from controls.DebugVariablePanel.DebugVariableTextViewer import DebugVariableTextViewer
+from controls.DebugVariablePanel.DebugVariableGraphicViewer import *
+
+
+MILLISECOND = 1000000        # Number of nanosecond in a millisecond
+SECOND = 1000 * MILLISECOND  # Number of nanosecond in a second
+MINUTE = 60 * SECOND         # Number of nanosecond in a minute
+HOUR = 60 * MINUTE           # Number of nanosecond in a hour
+DAY = 24 * HOUR              # Number of nanosecond in a day
 
 # Scrollbar increment in pixel
 SCROLLBAR_UNIT = 10
 
+
 def compute_mask(x, y):
     return [(xp if xp == yp else "*")
             for xp, yp in zip(x, y)]
 
+
 def NextTick(variables):
     next_tick = None
-    for item, data in variables:
+    for _item, data in variables:
         if len(data) == 0:
             continue
-        
+
         next_tick = (data[0][0]
                      if next_tick is None
                      else min(next_tick, data[0][0]))
-    
+
     return next_tick
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                    Debug Variable Graphic Panel Drop Target
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a custom drop target class for Debug Variable Graphic
-Panel
-"""
+# -------------------------------------------------------------------------------
+
 
 class DebugVariableDropTarget(wx.TextDropTarget):
-    
+    """
+    Class that implements a custom drop target class for Debug Variable Graphic
+    Panel
+    """
+
     def __init__(self, window):
         """
         Constructor
@@ -92,14 +90,14 @@
         """
         wx.TextDropTarget.__init__(self)
         self.ParentWindow = window
-    
+
     def __del__(self):
         """
         Destructor
         """
         # Remove reference to Debug Variable Panel
         self.ParentWindow = None
-    
+
     def OnDragOver(self, x, y, d):
         """
         Function called when mouse is dragged over Drop Target
@@ -107,10 +105,10 @@
         @param y: Y coordinate of mouse pointer
         @param d: Suggested default for return value
         """
-       # Signal Debug Variable Panel to refresh highlight giving mouse position
+        # Signal Debug Variable Panel to refresh highlight giving mouse position
         self.ParentWindow.RefreshHighlight(x, y)
         return wx.TextDropTarget.OnDragOver(self, x, y, d)
-        
+
     def OnDropText(self, x, y, data):
         """
         Function called when mouse is released in Drop Target
@@ -120,34 +118,34 @@
         """
         # Signal Debug Variable Panel to reset highlight
         self.ParentWindow.ResetHighlight()
-        
+
         message = None
-        
+
         # Check that data is valid regarding DebugVariablePanel
         try:
             values = eval(data)
-            if not isinstance(values, TupleType):
+            if not isinstance(values, tuple):
                 raise ValueError
-        except:
-            message = _("Invalid value \"%s\" for debug variable")%data
+        except Exception:
+            message = _("Invalid value \"%s\" for debug variable") % data
             values = None
-            
+
         # Display message if data is invalid
         if message is not None:
             wx.CallAfter(self.ShowMessage, message)
-        
+
         # Data contain a reference to a variable to debug
         elif values[1] == "debug":
-            
+
             # Drag'n Drop is an internal is an internal move inside Debug
-            # Variable Panel 
+            # Variable Panel
             if len(values) > 2 and values[2] == "move":
                 self.ParentWindow.MoveValue(values[0])
-            
+
             # Drag'n Drop was initiated by another control of Beremiz
             else:
                 self.ParentWindow.InsertValue(values[0], force=True)
-    
+
     def OnLeave(self):
         """
         Function called when mouse is leave Drop Target
@@ -155,30 +153,25 @@
         # Signal Debug Variable Panel to reset highlight
         self.ParentWindow.ResetHighlight()
         return wx.TextDropTarget.OnLeave(self)
-    
+
     def ShowMessage(self, message):
         """
         Show error message in Error Dialog
         @param message: Error message to display
         """
-        dialog = wx.MessageDialog(self.ParentWindow, 
-                                  message, 
-                                  _("Error"), 
-                                  wx.OK|wx.ICON_ERROR)
+        dialog = wx.MessageDialog(self.ParentWindow,
+                                  message,
+                                  _("Error"),
+                                  wx.OK | wx.ICON_ERROR)
         dialog.ShowModal()
         dialog.Destroy()
 
 
-#-------------------------------------------------------------------------------
-#                      Debug Variable Graphic Panel Class
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a Viewer that display variable values as a graphs
-"""
-
 class DebugVariablePanel(wx.Panel, DebugViewer):
-    
+    """
+    Class that implements a Viewer that display variable values as a graphs
+    """
+
     def __init__(self, parent, producer, window):
         """
         Constructor
@@ -187,112 +180,120 @@
         consumers
         @param window: Reference to Beremiz frame
         """
-        wx.Panel.__init__(self, parent, style=wx.SP_3D|wx.TAB_TRAVERSAL)
-        
+        wx.Panel.__init__(self, parent, style=wx.SP_3D | wx.TAB_TRAVERSAL)
+
+        # List of values possible for graph range
+        # Format is [(time_in_plain_text, value_in_nanosecond),...]
+        self.RANGE_VALUES = [(_("%dms") % i, i * MILLISECOND) for i in (10, 20, 50, 100, 200, 500)] + \
+                            [(_("%ds") % i, i * SECOND) for i in (1, 2, 5, 10, 20, 30)] + \
+                            [(_("%dm") % i, i * MINUTE) for i in (1, 2, 5, 10, 20, 30)] + \
+                            [(_("%dh") % i, i * HOUR) for i in (1, 2, 3, 6, 12, 24)]
+
         # Save Reference to Beremiz frame
         self.ParentWindow = window
-        
+
         # Variable storing flag indicating that variable displayed in table
         # received new value and then table need to be refreshed
         self.HasNewData = False
-        
+
         # Variable storing flag indicating that refresh has been forced, and
         # that next time refresh is possible, it will be done even if no new
         # data is available
         self.Force = False
-        
+
         self.SetBackgroundColour(wx.WHITE)
-        
+
         main_sizer = wx.BoxSizer(wx.VERTICAL)
-        
-        self.Ticks = numpy.array([]) # List of tick received
-        self.StartTick = 0           # Tick starting range of data displayed
-        self.Fixed = False           # Flag that range of data is fixed
-        self.CursorTick = None       # Tick of cursor for displaying values
-        
+
+        self.Ticks = numpy.array([])  # List of tick received
+        self.StartTick = 0            # Tick starting range of data displayed
+        self.Fixed = False            # Flag that range of data is fixed
+        self.CursorTick = None        # Tick of cursor for displaying values
+
         self.DraggingAxesPanel = None
         self.DraggingAxesBoundingBox = None
         self.DraggingAxesMousePos = None
         self.VetoScrollEvent = False
-        
+
         self.VariableNameMask = []
-        
+
         self.GraphicPanels = []
-        
+
         graphics_button_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        main_sizer.AddSizer(graphics_button_sizer, border=5, flag=wx.GROW|wx.ALL)
-        
+        main_sizer.AddSizer(graphics_button_sizer, border=5, flag=wx.GROW | wx.ALL)
+
         range_label = wx.StaticText(self, label=_('Range:'))
         graphics_button_sizer.AddWindow(range_label, flag=wx.ALIGN_CENTER_VERTICAL)
-        
+
         self.CanvasRange = wx.ComboBox(self, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange)
-        graphics_button_sizer.AddWindow(self.CanvasRange, 1, 
-              border=5, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL)
-        
+        graphics_button_sizer.AddWindow(self.CanvasRange, 1,
+                                        border=5,
+                                        flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL)
+
         self.CanvasRange.Clear()
         default_range_idx = 0
-        for idx, (text, value) in enumerate(RANGE_VALUES):
+        for idx, (text, _value) in enumerate(self.RANGE_VALUES):
             self.CanvasRange.Append(text)
-            if text == "1s":
+            if _value == 1000000000:
                 default_range_idx = idx
         self.CanvasRange.SetSelection(default_range_idx)
-        
+
         for name, bitmap, help in [
-            ("CurrentButton", "current", _("Go to current value")),
-            ("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]:
-            button = wx.lib.buttons.GenBitmapButton(self, 
-                  bitmap=GetBitmap(bitmap), 
-                  size=wx.Size(28, 28), style=wx.NO_BORDER)
+                ("CurrentButton",     "current",      _("Go to current value")),
+                ("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]:
+            button = wx.lib.buttons.GenBitmapButton(
+                self, bitmap=GetBitmap(bitmap),
+                size=wx.Size(28, 28), style=wx.NO_BORDER)
             button.SetToolTipString(help)
             setattr(self, name, button)
             self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button)
             graphics_button_sizer.AddWindow(button, border=5, flag=wx.LEFT)
-        
-        self.CanvasPosition = wx.ScrollBar(self, 
-              size=wx.Size(0, 16), style=wx.SB_HORIZONTAL)
-        self.CanvasPosition.Bind(wx.EVT_SCROLL_THUMBTRACK, 
-              self.OnPositionChanging, self.CanvasPosition)
-        self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEUP, 
-              self.OnPositionChanging, self.CanvasPosition)
-        self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEDOWN, 
-              self.OnPositionChanging, self.CanvasPosition)
-        self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEUP, 
-              self.OnPositionChanging, self.CanvasPosition)
-        self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEDOWN, 
-              self.OnPositionChanging, self.CanvasPosition)
-        main_sizer.AddWindow(self.CanvasPosition, border=5, flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM)
-        
+
+        self.CanvasPosition = wx.ScrollBar(
+            self, size=wx.Size(0, 16), style=wx.SB_HORIZONTAL)
+        self.CanvasPosition.Bind(wx.EVT_SCROLL_THUMBTRACK,
+                                 self.OnPositionChanging, self.CanvasPosition)
+        self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEUP,
+                                 self.OnPositionChanging, self.CanvasPosition)
+        self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEDOWN,
+                                 self.OnPositionChanging, self.CanvasPosition)
+        self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEUP,
+                                 self.OnPositionChanging, self.CanvasPosition)
+        self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEDOWN,
+                                 self.OnPositionChanging, self.CanvasPosition)
+        main_sizer.AddWindow(self.CanvasPosition, border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
+
         self.TickSizer = wx.BoxSizer(wx.HORIZONTAL)
-        main_sizer.AddSizer(self.TickSizer, border=5, flag=wx.ALL|wx.GROW)
-        
+        main_sizer.AddSizer(self.TickSizer, border=5, flag=wx.ALL | wx.GROW)
+
         self.TickLabel = wx.StaticText(self)
         self.TickSizer.AddWindow(self.TickLabel, border=5, flag=wx.RIGHT)
-        
-        self.MaskLabel = wx.TextCtrl(self, style=wx.TE_READONLY|wx.TE_CENTER|wx.NO_BORDER)
-        self.TickSizer.AddWindow(self.MaskLabel, 1, border=5, flag=wx.RIGHT|wx.GROW)
-        
+
+        self.MaskLabel = wx.TextCtrl(self, style=wx.TE_READONLY | wx.TE_CENTER | wx.NO_BORDER)
+        self.TickSizer.AddWindow(self.MaskLabel, 1, border=5, flag=wx.RIGHT | wx.GROW)
+
         self.TickTimeLabel = wx.StaticText(self)
         self.TickSizer.AddWindow(self.TickTimeLabel)
-        
-        self.GraphicsWindow = wx.ScrolledWindow(self, style=wx.HSCROLL|wx.VSCROLL)
+
+        self.GraphicsWindow = wx.ScrolledWindow(self, style=wx.HSCROLL | wx.VSCROLL)
         self.GraphicsWindow.SetBackgroundColour(wx.WHITE)
         self.GraphicsWindow.SetDropTarget(DebugVariableDropTarget(self))
         self.GraphicsWindow.Bind(wx.EVT_ERASE_BACKGROUND, self.OnGraphicsWindowEraseBackground)
         self.GraphicsWindow.Bind(wx.EVT_PAINT, self.OnGraphicsWindowPaint)
         self.GraphicsWindow.Bind(wx.EVT_SIZE, self.OnGraphicsWindowResize)
         self.GraphicsWindow.Bind(wx.EVT_MOUSEWHEEL, self.OnGraphicsWindowMouseWheel)
-        
+
         main_sizer.AddWindow(self.GraphicsWindow, 1, flag=wx.GROW)
-        
+
         self.GraphicsSizer = wx.BoxSizer(wx.VERTICAL)
         self.GraphicsWindow.SetSizer(self.GraphicsSizer)
-    
+
         DebugViewer.__init__(self, producer, True)
-        
+
         self.SetSizer(main_sizer)
         self.SetTickTime()
-    
+
     def SetTickTime(self, ticktime=0):
         """
         Set Ticktime for calculate data range according to time range selected
@@ -300,26 +301,26 @@
         """
         # Save ticktime
         self.Ticktime = ticktime
-        
+
         # Set ticktime to millisecond if undefined
         if self.Ticktime == 0:
             self.Ticktime = MILLISECOND
-        
+
         # Calculate range to apply to data
-        self.CurrentRange = RANGE_VALUES[
-            self.CanvasRange.GetSelection()][1] / self.Ticktime
-    
+        self.CurrentRange = self.RANGE_VALUES[
+            self.CanvasRange.GetSelection()][1] // self.Ticktime
+
     def SetDataProducer(self, producer):
         """
         Set Data Producer
         @param producer: Data Producer
         """
         DebugViewer.SetDataProducer(self, producer)
-        
+
         # Set ticktime if data producer is available
         if self.DataProducer is not None:
             self.SetTickTime(self.DataProducer.GetTicktime())
-    
+
     def RefreshNewData(self):
         """
         Called to refresh Panel according to values received by variables
@@ -329,50 +330,50 @@
         if self.HasNewData or self.Force:
             self.HasNewData = False
             self.RefreshView()
-        
+
         DebugViewer.RefreshNewData(self)
-    
+
     def NewDataAvailable(self, ticks):
         """
         Called by DataProducer for each tick captured or by panel to refresh
         graphs
         @param tick: PLC tick captured
-        All other parameters are passed to refresh function 
+        All other parameters are passed to refresh function
         """
         # If tick given
         if ticks is not None:
             tick = ticks[-1]
-            
+
             # Save tick as start tick for range if data is still empty
             if len(self.Ticks) == 0:
                 self.StartTick = ticks[0]
-            
+
             # Add tick to list of ticks received
             self.Ticks = numpy.append(self.Ticks, ticks)
-            
+
             # Update start tick for range if range follow ticks received
             if not self.Fixed or tick < self.StartTick + self.CurrentRange:
                 self.StartTick = max(self.StartTick, tick - self.CurrentRange)
-            
+
             # Force refresh if graph is fixed because range of data received
             # is too small to fill data range selected
             if self.Fixed and \
                self.Ticks[-1] - self.Ticks[0] < self.CurrentRange:
                 self.Force = True
-            
+
             self.HasNewData = False
             self.RefreshView()
-            
+
         else:
             DebugViewer.NewDataAvailable(self, ticks)
-    
+
     def ForceRefresh(self):
         """
         Called to force refresh of graphs
         """
         self.Force = True
         wx.CallAfter(self.NewDataAvailable, None)
-    
+
     def SetCursorTick(self, cursor_tick):
         """
         Set Cursor for displaying values of items at a tick given
@@ -381,37 +382,36 @@
         # Save cursor tick
         self.CursorTick = cursor_tick
         self.Fixed = cursor_tick is not None
-        self.UpdateCursorTick() 
-    
+        self.UpdateCursorTick()
+
     def MoveCursorTick(self, move):
         if self.CursorTick is not None:
-            cursor_tick = max(self.Ticks[0], 
-                          min(self.CursorTick + move, 
-                              self.Ticks[-1]))
+            cursor_tick = max(self.Ticks[0],
+                              min(self.CursorTick + move, self.Ticks[-1]))
             cursor_tick_idx = numpy.argmin(numpy.abs(self.Ticks - cursor_tick))
             if self.Ticks[cursor_tick_idx] == self.CursorTick:
-                cursor_tick_idx = max(0, 
-                                  min(cursor_tick_idx + abs(move) / move, 
-                                      len(self.Ticks) - 1))
+                cursor_tick_idx = max(0,
+                                      min(cursor_tick_idx + abs(move) // move,
+                                          len(self.Ticks) - 1))
             self.CursorTick = self.Ticks[cursor_tick_idx]
-            self.StartTick = max(self.Ticks[
-                                numpy.argmin(numpy.abs(self.Ticks - 
-                                        self.CursorTick + self.CurrentRange))],
-                             min(self.StartTick, self.CursorTick))
+            self.StartTick = max(
+                self.Ticks[numpy.argmin(
+                    numpy.abs(self.Ticks - self.CursorTick + self.CurrentRange))],
+                min(self.StartTick, self.CursorTick))
             self.RefreshCanvasPosition()
-            self.UpdateCursorTick() 
-            
+            self.UpdateCursorTick()
+
     def ResetCursorTick(self):
         self.CursorTick = None
         self.Fixed = False
         self.UpdateCursorTick()
-    
+
     def UpdateCursorTick(self):
         for panel in self.GraphicPanels:
             if isinstance(panel, DebugVariableGraphicViewer):
                 panel.SetCursorTick(self.CursorTick)
         self.ForceRefresh()
-    
+
     def StartDragNDrop(self, panel, item, x_mouse, y_mouse, x_mouse_start, y_mouse_start):
         if len(panel.GetItems()) > 1:
             self.DraggingAxesPanel = DebugVariableGraphicViewer(self.GraphicsWindow, self, [item], GRAPH_PARALLEL)
@@ -424,23 +424,23 @@
             self.DraggingAxesPanel = panel
         self.DraggingAxesBoundingBox = panel.GetAxesBoundingBox(parent_coordinate=True)
         self.DraggingAxesMousePos = wx.Point(
-            x_mouse_start - self.DraggingAxesBoundingBox.x, 
+            x_mouse_start - self.DraggingAxesBoundingBox.x,
             y_mouse_start - self.DraggingAxesBoundingBox.y)
         self.MoveDragNDrop(x_mouse, y_mouse)
-        
+
     def MoveDragNDrop(self, x_mouse, y_mouse):
         self.DraggingAxesBoundingBox.x = x_mouse - self.DraggingAxesMousePos.x
         self.DraggingAxesBoundingBox.y = y_mouse - self.DraggingAxesMousePos.y
         self.RefreshHighlight(x_mouse, y_mouse)
-    
+
     def RefreshHighlight(self, x_mouse, y_mouse):
         for idx, panel in enumerate(self.GraphicPanels):
             x, y = panel.GetPosition()
             width, height = panel.GetSize()
             rect = wx.Rect(x, y, width, height)
-            if (rect.InsideXY(x_mouse, y_mouse) or 
-                idx == 0 and y_mouse < 0 or
-                idx == len(self.GraphicPanels) - 1 and y_mouse > panel.GetPosition()[1]):
+            if rect.InsideXY(x_mouse, y_mouse) or \
+               idx == 0 and y_mouse < 0 or \
+               idx == len(self.GraphicPanels) - 1 and y_mouse > panel.GetPosition()[1]:
                 panel.RefreshHighlight(x_mouse - x, y_mouse - y)
             else:
                 panel.SetHighlight(HIGHLIGHT_NONE)
@@ -448,7 +448,7 @@
             self.RefreshView()
         else:
             self.ForceRefresh()
-    
+
     def ResetHighlight(self):
         for panel in self.GraphicPanels:
             panel.SetHighlight(HIGHLIGHT_NONE)
@@ -456,10 +456,10 @@
             self.RefreshView()
         else:
             self.ForceRefresh()
-    
+
     def IsDragging(self):
         return self.DraggingAxesPanel is not None
-    
+
     def GetDraggingAxesClippingRegion(self, panel):
         x, y = panel.GetPosition()
         width, height = panel.GetSize()
@@ -468,12 +468,12 @@
         bbox.x -= x
         bbox.y -= y
         return bbox
-    
+
     def GetDraggingAxesPosition(self, panel):
         x, y = panel.GetPosition()
         return wx.Point(self.DraggingAxesBoundingBox.x - x,
                         self.DraggingAxesBoundingBox.y - y)
-    
+
     def StopDragNDrop(self, variable, x_mouse, y_mouse):
         if self.DraggingAxesPanel not in self.GraphicPanels:
             self.DraggingAxesPanel.Destroy()
@@ -489,64 +489,46 @@
                 panel.ShowButtons(True)
                 merge_type = GRAPH_PARALLEL
                 if isinstance(panel, DebugVariableTextViewer) or panel.Is3DCanvas():
-                    if y_mouse > yw + height / 2:
+                    if y_mouse > yw + height // 2:
                         idx += 1
                     wx.CallAfter(self.MoveValue, variable, idx, True)
                 else:
                     rect = panel.GetAxesBoundingBox(True)
                     if rect.InsideXY(x_mouse, y_mouse):
-                        merge_rect = wx.Rect(rect.x, rect.y, rect.width / 2., rect.height)
+                        merge_rect = wx.Rect(rect.x, rect.y, rect.width // 2, rect.height)
                         if merge_rect.InsideXY(x_mouse, y_mouse):
                             merge_type = GRAPH_ORTHOGONAL
                         wx.CallAfter(self.MergeGraphs, variable, idx, merge_type, force=True)
                     else:
-                        if y_mouse > yw + height / 2:
+                        if y_mouse > yw + height // 2:
                             idx += 1
                         wx.CallAfter(self.MoveValue, variable, idx, True)
                 self.ForceRefresh()
-                return 
+                return
         width, height = self.GraphicsWindow.GetVirtualSize()
         rect = wx.Rect(0, 0, width, height)
         if rect.InsideXY(x_mouse, y_mouse):
             wx.CallAfter(self.MoveValue, variable, len(self.GraphicPanels), True)
         self.ForceRefresh()
-    
+
     def RefreshGraphicsSizer(self):
         self.GraphicsSizer.Clear()
-        
+
         for panel in self.GraphicPanels:
             self.GraphicsSizer.AddWindow(panel, flag=wx.GROW)
-            
+
         self.GraphicsSizer.Layout()
         self.RefreshGraphicsWindowScrollbars()
-    
+
     def RefreshView(self):
         self.RefreshCanvasPosition()
-        
-        width, height = self.GraphicsWindow.GetVirtualSize()
-        bitmap = wx.EmptyBitmap(width, height)
-        dc = wx.BufferedDC(wx.ClientDC(self.GraphicsWindow), bitmap)
-        dc.Clear()
-        dc.BeginDrawing()
-        if self.DraggingAxesPanel is not None:
-            destBBox = self.DraggingAxesBoundingBox
-            srcBBox = self.DraggingAxesPanel.GetAxesBoundingBox()
-            
-            srcBmp = _convert_agg_to_wx_bitmap(self.DraggingAxesPanel.get_renderer(), None)
-            srcDC = wx.MemoryDC()
-            srcDC.SelectObject(srcBmp)
-                
-            dc.Blit(destBBox.x, destBBox.y, 
-                    int(destBBox.width), int(destBBox.height), 
-                    srcDC, srcBBox.x, srcBBox.y)
-        dc.EndDrawing()
-        
+
         if not self.Fixed or self.Force:
             self.Force = False
             refresh_graphics = True
         else:
             refresh_graphics = False
-        
+
         if self.DraggingAxesPanel is not None and self.DraggingAxesPanel not in self.GraphicPanels:
             self.DraggingAxesPanel.RefreshViewer(refresh_graphics)
         for panel in self.GraphicPanels:
@@ -554,7 +536,7 @@
                 panel.RefreshViewer(refresh_graphics)
             else:
                 panel.RefreshViewer()
-        
+
         if self.CursorTick is not None:
             tick = self.CursorTick
         elif len(self.Ticks) > 0:
@@ -566,31 +548,31 @@
             tick_duration = int(tick * self.Ticktime)
             not_null = False
             duration = ""
-            for value, format in [(tick_duration / DAY, _("%dd")),
-                                  ((tick_duration % DAY) / HOUR, _("%dh")),
-                                  ((tick_duration % HOUR) / MINUTE, _("%dm")),
-                                  ((tick_duration % MINUTE) / SECOND, _("%ds"))]:
-                
+            for value, format in [(tick_duration // DAY, _("%dd")),
+                                  ((tick_duration % DAY) // HOUR, _("%dh")),
+                                  ((tick_duration % HOUR) // MINUTE, _("%dm")),
+                                  ((tick_duration % MINUTE) // SECOND, _("%ds"))]:
+
                 if value > 0 or not_null:
                     duration += format % value
                     not_null = True
-            
-            duration += _("%03gms") % (float(tick_duration % SECOND) / MILLISECOND) 
+
+            duration += _("%03gms") % ((tick_duration % SECOND) / MILLISECOND)
             self.TickTimeLabel.SetLabel("t: %s" % duration)
         else:
             self.TickLabel.SetLabel("")
             self.TickTimeLabel.SetLabel("")
         self.TickSizer.Layout()
-    
+
     def SubscribeAllDataConsumers(self):
         DebugViewer.SubscribeAllDataConsumers(self)
-        
+
         if self.DataProducer is not None:
             if self.DataProducer is not None:
                 self.SetTickTime(self.DataProducer.GetTicktime())
-        
+
         self.ResetCursorTick()
-        
+
         for panel in self.GraphicPanels[:]:
             panel.SubscribeAllDataConsumers()
             if panel.ItemsIsEmpty():
@@ -598,28 +580,28 @@
                     panel.ReleaseMouse()
                 self.GraphicPanels.remove(panel)
                 panel.Destroy()
-        
+
         self.ResetVariableNameMask()
         self.RefreshGraphicsSizer()
         self.ForceRefresh()
-    
+
     def ResetView(self):
         self.UnsubscribeAllDataConsumers()
-        
+
         self.Fixed = False
         for panel in self.GraphicPanels:
             panel.Destroy()
         self.GraphicPanels = []
         self.ResetVariableNameMask()
         self.RefreshGraphicsSizer()
-    
+
     def SetCanvasPosition(self, tick):
         tick = max(self.Ticks[0], min(tick, self.Ticks[-1] - self.CurrentRange))
         self.StartTick = self.Ticks[numpy.argmin(numpy.abs(self.Ticks - tick))]
         self.Fixed = True
         self.RefreshCanvasPosition()
         self.ForceRefresh()
-    
+
     def RefreshCanvasPosition(self):
         if len(self.Ticks) > 0:
             pos = int(self.StartTick - self.Ticks[0])
@@ -628,14 +610,14 @@
             pos = 0
             range = 0
         self.CanvasPosition.SetScrollbar(pos, self.CurrentRange, range, self.CurrentRange)
-    
+
     def ChangeRange(self, dir, tick=None):
         current_range = self.CurrentRange
         current_range_idx = self.CanvasRange.GetSelection()
-        new_range_idx = max(0, min(current_range_idx + dir, len(RANGE_VALUES) - 1))
+        new_range_idx = max(0, min(current_range_idx + dir, len(self.RANGE_VALUES) - 1))
         if new_range_idx != current_range_idx:
             self.CanvasRange.SetSelection(new_range_idx)
-            self.CurrentRange = RANGE_VALUES[new_range_idx][1] / self.Ticktime
+            self.CurrentRange = self.RANGE_VALUES[new_range_idx][1] / self.Ticktime
             if len(self.Ticks) > 0:
                 if tick is None:
                     tick = self.StartTick + self.CurrentRange / 2.
@@ -644,7 +626,7 @@
                 self.StartTick = self.Ticks[numpy.argmin(numpy.abs(self.Ticks - new_start_tick))]
                 self.Fixed = new_start_tick < self.Ticks[-1] - self.CurrentRange
             self.ForceRefresh()
-    
+
     def RefreshRange(self):
         if len(self.Ticks) > 0:
             if self.Fixed and self.Ticks[-1] - self.Ticks[0] < self.CurrentRange:
@@ -654,21 +636,21 @@
             else:
                 self.StartTick = max(self.Ticks[0], self.Ticks[-1] - self.CurrentRange)
         self.ForceRefresh()
-    
+
     def OnRangeChanged(self, event):
         try:
-            self.CurrentRange = RANGE_VALUES[self.CanvasRange.GetSelection()][1] / self.Ticktime
-        except ValueError, e:
+            self.CurrentRange = self.RANGE_VALUES[self.CanvasRange.GetSelection()][1] // self.Ticktime
+        except ValueError:
             self.CanvasRange.SetValue(str(self.CurrentRange))
         wx.CallAfter(self.RefreshRange)
         event.Skip()
-    
+
     def OnCurrentButton(self, event):
         if len(self.Ticks) > 0:
             self.StartTick = max(self.Ticks[0], self.Ticks[-1] - self.CurrentRange)
             self.ResetCursorTick()
         event.Skip()
-    
+
     def CopyDataToClipboard(self, variables):
         text = "tick;%s;\n" % ";".join([item.GetVariable() for item, data in variables])
         next_tick = NextTick(variables)
@@ -693,7 +675,7 @@
             text += "%d;%s;\n" % (next_tick, ";".join(values))
             next_tick = NextTick(variables)
         self.ParentWindow.SetCopyBuffer(text)
-    
+
     def OnExportGraphButton(self, event):
         items = reduce(lambda x, y: x + y,
                        [panel.GetItems() for panel in self.GraphicPanels],
@@ -703,25 +685,25 @@
                      if item.IsNumVariable()]
         wx.CallAfter(self.CopyDataToClipboard, variables)
         event.Skip()
-    
+
     def OnPositionChanging(self, event):
         if len(self.Ticks) > 0:
             self.StartTick = self.Ticks[0] + event.GetPosition()
             self.Fixed = True
             self.ForceRefresh()
         event.Skip()
-    
+
     def GetRange(self):
         return self.StartTick, self.StartTick + self.CurrentRange
-    
+
     def GetViewerIndex(self, viewer):
         if viewer in self.GraphicPanels:
             return self.GraphicPanels.index(viewer)
         return None
-    
+
     def IsViewerFirst(self, viewer):
         return viewer == self.GraphicPanels[0]
-    
+
     def HighlightPreviousViewer(self, viewer):
         if self.IsViewerFirst(viewer):
             return
@@ -729,25 +711,25 @@
         if idx is None:
             return
         self.GraphicPanels[idx-1].SetHighlight(HIGHLIGHT_AFTER)
-    
+
     def ResetVariableNameMask(self):
         items = []
         for panel in self.GraphicPanels:
             items.extend(panel.GetItems())
         if len(items) > 1:
-            self.VariableNameMask = reduce(compute_mask,
-                [item.GetVariable().split('.') for item in items])
+            self.VariableNameMask = reduce(
+                compute_mask, [item.GetVariable().split('.') for item in items])
         elif len(items) > 0:
             self.VariableNameMask = items[0].GetVariable().split('.')[:-1] + ['*']
         else:
             self.VariableNameMask = []
         self.MaskLabel.ChangeValue(".".join(self.VariableNameMask))
         self.MaskLabel.SetInsertionPoint(self.MaskLabel.GetLastPosition())
-            
+
     def GetVariableNameMask(self):
         return self.VariableNameMask
-    
-    def InsertValue(self, iec_path, idx = None, force=False, graph=False):
+
+    def InsertValue(self, iec_path, idx=None, force=False, graph=False):
         for panel in self.GraphicPanels:
             if panel.GetItem(iec_path) is not None:
                 if graph and isinstance(panel, DebugVariableTextViewer):
@@ -758,7 +740,7 @@
         item = DebugVariableItem(self, iec_path, True)
         result = self.AddDataConsumer(iec_path.upper(), item, True)
         if result is not None or force:
-            
+
             self.Freeze()
             if item.IsNumVariable() and graph:
                 panel = DebugVariableGraphicViewer(self.GraphicsWindow, self, [item], GRAPH_PARALLEL)
@@ -774,8 +756,8 @@
             self.RefreshGraphicsSizer()
             self.Thaw()
             self.ForceRefresh()
-    
-    def MoveValue(self, iec_path, idx = None, graph=False):
+
+    def MoveValue(self, iec_path, idx=None, graph=False):
         if idx is None:
             idx = len(self.GraphicPanels)
         source_panel = None
@@ -787,9 +769,9 @@
                 break
         if source_panel is not None:
             source_panel_idx = self.GraphicPanels.index(source_panel)
-            
-            if (len(source_panel.GetItems()) == 1):
-                
+
+            if len(source_panel.GetItems()) == 1:
+
                 if source_panel_idx < idx:
                     self.GraphicPanels.insert(idx, source_panel)
                     self.GraphicPanels.pop(source_panel_idx)
@@ -798,7 +780,7 @@
                     self.GraphicPanels.insert(idx, source_panel)
                 else:
                     return
-                
+
             else:
                 source_panel.RemoveItem(item)
                 source_size = source_panel.GetSize()
@@ -807,22 +789,22 @@
                     panel.SetCanvasHeight(source_size.height)
                     if self.CursorTick is not None:
                         panel.SetCursorTick(self.CursorTick)
-                
+
                 else:
                     panel = DebugVariableTextViewer(self.GraphicsWindow, self, [item])
-                
+
                 self.GraphicPanels.insert(idx, panel)
-                
+
                 if source_panel.ItemsIsEmpty():
                     if source_panel.HasCapture():
                         source_panel.ReleaseMouse()
                     source_panel.Destroy()
                     self.GraphicPanels.remove(source_panel)
-                
+
             self.ResetVariableNameMask()
             self.RefreshGraphicsSizer()
             self.ForceRefresh()
-    
+
     def MergeGraphs(self, source, target_idx, merge_type, force=False):
         source_item = None
         source_panel = None
@@ -845,12 +827,12 @@
             target_panel = self.GraphicPanels[target_idx]
             graph_type = target_panel.GraphType
             if target_panel != source_panel:
-                if (merge_type == GRAPH_PARALLEL and graph_type != merge_type or
-                    merge_type == GRAPH_ORTHOGONAL and 
-                    (graph_type == GRAPH_PARALLEL and len(target_panel.Items) > 1 or
-                     graph_type == GRAPH_ORTHOGONAL and len(target_panel.Items) >= 3)):
+                if merge_type == GRAPH_PARALLEL and graph_type != merge_type or \
+                   merge_type == GRAPH_ORTHOGONAL and (
+                           graph_type == GRAPH_PARALLEL and len(target_panel.Items) > 1 or
+                           graph_type == GRAPH_ORTHOGONAL and len(target_panel.Items) >= 3):
                     return
-                
+
                 if source_panel is not None:
                     source_panel.RemoveItem(source_item)
                     if source_panel.ItemsIsEmpty():
@@ -858,11 +840,11 @@
                             source_panel.ReleaseMouse()
                         source_panel.Destroy()
                         self.GraphicPanels.remove(source_panel)
-            elif (merge_type != graph_type and len(target_panel.Items) == 2):
+            elif merge_type != graph_type and len(target_panel.Items) == 2:
                 target_panel.RemoveItem(source_item)
             else:
                 target_panel = None
-                
+
             if target_panel is not None:
                 target_panel.AddItem(source_item)
                 target_panel.GraphType = merge_type
@@ -874,15 +856,15 @@
                 else:
                     target_panel.SetCanvasHeight(size.height)
                 target_panel.ResetGraphics()
-                
+
                 self.ResetVariableNameMask()
                 self.RefreshGraphicsSizer()
                 self.ForceRefresh()
-    
+
     def DeleteValue(self, source_panel, item=None):
         source_idx = self.GetViewerIndex(source_panel)
         if source_idx is not None:
-            
+
             if item is None:
                 source_panel.ClearItems()
                 source_panel.Destroy()
@@ -900,7 +882,7 @@
                 self.Fixed = False
                 self.ResetCursorTick()
             self.ForceRefresh()
-    
+
     def ToggleViewerType(self, panel):
         panel_idx = self.GetViewerIndex(panel)
         if panel_idx is not None:
@@ -916,7 +898,7 @@
             panel.Destroy()
         self.RefreshGraphicsSizer()
         self.ForceRefresh()
-    
+
     def ResetGraphicsValues(self):
         self.Ticks = numpy.array([])
         self.StartTick = 0
@@ -928,26 +910,28 @@
         xstart, ystart = self.GraphicsWindow.GetViewStart()
         window_size = self.GraphicsWindow.GetClientSize()
         vwidth, vheight = self.GraphicsSizer.GetMinSize()
-        posx = max(0, min(xstart, (vwidth - window_size[0]) / SCROLLBAR_UNIT))
-        posy = max(0, min(ystart, (vheight - window_size[1]) / SCROLLBAR_UNIT))
+        posx = max(0, min(xstart, (vwidth - window_size[0]) // SCROLLBAR_UNIT))
+        posy = max(0, min(ystart, (vheight - window_size[1]) // SCROLLBAR_UNIT))
         self.GraphicsWindow.Scroll(posx, posy)
-        self.GraphicsWindow.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, 
-                vwidth / SCROLLBAR_UNIT, vheight / SCROLLBAR_UNIT, posx, posy)
-    
+        self.GraphicsWindow.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
+                                          vwidth // SCROLLBAR_UNIT,
+                                          vheight // SCROLLBAR_UNIT,
+                                          posx, posy)
+
     def OnGraphicsWindowEraseBackground(self, event):
         pass
-    
+
     def OnGraphicsWindowPaint(self, event):
         self.RefreshView()
         event.Skip()
-    
+
     def OnGraphicsWindowResize(self, event):
         size = self.GetSize()
         for panel in self.GraphicPanels:
             panel_size = panel.GetSize()
-            if (isinstance(panel, DebugVariableGraphicViewer) and 
-                panel.GraphType == GRAPH_ORTHOGONAL and 
-                panel_size.width == panel_size.height):
+            if isinstance(panel, DebugVariableGraphicViewer) and \
+               panel.GraphType == GRAPH_ORTHOGONAL and \
+               panel_size.width == panel_size.height:
                 panel.SetCanvasHeight(size.width)
         self.RefreshGraphicsWindowScrollbars()
         self.GraphicsSizer.Layout()
--- a/controls/DebugVariablePanel/DebugVariableTextViewer.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/DebugVariablePanel/DebugVariableTextViewer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,24 +22,25 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-from types import TupleType
+
+from __future__ import absolute_import
+from __future__ import division
 
 import wx
 
-from DebugVariableItem import DebugVariableItem
-from DebugVariableViewer import DebugVariableViewer
-from GraphButton import GraphButton
-
-#-------------------------------------------------------------------------------
+from controls.DebugVariablePanel.DebugVariableViewer import DebugVariableViewer
+from controls.DebugVariablePanel.GraphButton import GraphButton
+
+# -------------------------------------------------------------------------------
 #                     Debug Variable Text Viewer Drop Target
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a custom drop target class for Debug Variable Text Viewer
-"""
+# -------------------------------------------------------------------------------
+
 
 class DebugVariableTextDropTarget(wx.TextDropTarget):
-    
+    """
+    Class that implements a custom drop target class for Debug Variable Text Viewer
+    """
+
     def __init__(self, parent, window):
         """
         Constructor
@@ -49,7 +50,7 @@
         wx.TextDropTarget.__init__(self)
         self.ParentControl = parent
         self.ParentWindow = window
-    
+
     def __del__(self):
         """
         Destructor
@@ -58,7 +59,7 @@
         # Panel
         self.ParentControl = None
         self.ParentWindow = None
-        
+
     def OnDragOver(self, x, y, d):
         """
         Function called when mouse is dragged over Drop Target
@@ -68,9 +69,9 @@
         """
         # Signal parent that mouse is dragged over
         self.ParentControl.OnMouseDragging(x, y)
-        
+
         return wx.TextDropTarget.OnDragOver(self, x, y, d)
-        
+
     def OnDropText(self, x, y, data):
         """
         Function called when mouse is released in Drop Target
@@ -80,77 +81,76 @@
         """
         # Signal Debug Variable Panel to reset highlight
         self.ParentWindow.ResetHighlight()
-        
+
         message = None
-        
+
         # Check that data is valid regarding DebugVariablePanel
         try:
             values = eval(data)
-            if not isinstance(values, TupleType):
+            if not isinstance(values, tuple):
                 raise ValueError
-        except:
+        except Exception:
             message = _("Invalid value \"%s\" for debug variable") % data
             values = None
-        
+
         # Display message if data is invalid
         if message is not None:
             wx.CallAfter(self.ShowMessage, message)
-        
+
         # Data contain a reference to a variable to debug
         elif values[1] == "debug":
-            
+
             # Get Before which Viewer the variable has to be moved or added
             # according to the position of mouse in Viewer.
-            width, height = self.ParentControl.GetSize()
+            _width, height = self.ParentControl.GetSize()
             target_idx = self.ParentControl.GetIndex()
-            if y > height / 2:
+            if y > height // 2:
                 target_idx += 1
-            
+
             # Drag'n Drop is an internal is an internal move inside Debug
-            # Variable Panel 
+            # Variable Panel
             if len(values) > 2 and values[2] == "move":
-                self.ParentWindow.MoveValue(values[0], 
+                self.ParentWindow.MoveValue(values[0],
                                             target_idx)
-            
+
             # Drag'n Drop was initiated by another control of Beremiz
             else:
-                self.ParentWindow.InsertValue(values[0], 
-                                              target_idx, 
+                self.ParentWindow.InsertValue(values[0],
+                                              target_idx,
                                               force=True)
-    
+
     def OnLeave(self):
         """
         Function called when mouse is leave Drop Target
         """
         # Signal Debug Variable Panel to reset highlight
         self.ParentWindow.ResetHighlight()
-        
+
         return wx.TextDropTarget.OnLeave(self)
-    
+
     def ShowMessage(self, message):
         """
         Show error message in Error Dialog
         @param message: Error message to display
         """
-        dialog = wx.MessageDialog(self.ParentWindow, 
-                                  message, 
-                                  _("Error"), 
-                                  wx.OK|wx.ICON_ERROR)
+        dialog = wx.MessageDialog(self.ParentWindow,
+                                  message,
+                                  _("Error"),
+                                  wx.OK | wx.ICON_ERROR)
         dialog.ShowModal()
         dialog.Destroy()
 
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                      Debug Variable Text Viewer Class
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a Viewer that display variable values as a text
-"""
+# -------------------------------------------------------------------------------
 
 class DebugVariableTextViewer(DebugVariableViewer, wx.Panel):
-    
-    def __init__(self, parent, window, items=[]):
+    """
+    Class that implements a Viewer that display variable values as a text
+    """
+
+    def __init__(self, parent, window, items=None):
         """
         Constructor
         @param parent: Parent wx.Window of DebugVariableText
@@ -158,13 +158,13 @@
         @param items: List of DebugVariableItem displayed by Viewer
         """
         DebugVariableViewer.__init__(self, window, items)
-        
+
         wx.Panel.__init__(self, parent)
         # Set panel background colour
         self.SetBackgroundColour(wx.WHITE)
         # Define panel drop target
         self.SetDropTarget(DebugVariableTextDropTarget(self, window))
-        
+
         # Bind events
         self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
         self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
@@ -174,16 +174,16 @@
         self.Bind(wx.EVT_SIZE, self.OnResize)
         self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
         self.Bind(wx.EVT_PAINT, self.OnPaint)
-        
+
         # Define panel min size for parent sizer layout
         self.SetMinSize(wx.Size(0, 25))
-        
+
         # Add buttons to Viewer
         for bitmap, callback in [("force", self.OnForceButton),
                                  ("release", self.OnReleaseButton),
                                  ("delete_graph", self.OnCloseButton)]:
             self.Buttons.append(GraphButton(0, 0, bitmap, callback))
-    
+
     def RefreshViewer(self):
         """
         Method that refresh the content displayed by Viewer
@@ -193,24 +193,24 @@
         bitmap = wx.EmptyBitmap(width, height)
         dc = wx.BufferedDC(wx.ClientDC(self), bitmap)
         dc.Clear()
-        
+
         # Get Graphics Context for DC, for anti-aliased and transparent
         # rendering
         gc = wx.GCDC(dc)
-        
+
         gc.BeginDrawing()
-        
+
         # Get first item
         item = self.ItemsDict.values()[0]
-        
+
         # Get item variable path masked according Debug Variable Panel mask
         item_path = item.GetVariable(
-                self.ParentWindow.GetVariableNameMask())
-        
+            self.ParentWindow.GetVariableNameMask())
+
         # Draw item variable path at Viewer left side
         w, h = gc.GetTextExtent(item_path)
-        gc.DrawText(item_path, 20, (height - h) / 2)
-        
+        gc.DrawText(item_path, 20, (height - h) // 2)
+
         # Update 'Release' button state and text color according to item forced
         # flag value
         item_forced = item.IsForced()
@@ -218,17 +218,17 @@
         self.RefreshButtonsPosition()
         if item_forced:
             gc.SetTextForeground(wx.BLUE)
-        
+
         # Draw item current value at right side of Viewer
         item_value = item.GetValue()
         w, h = gc.GetTextExtent(item_value)
-        gc.DrawText(item_value, width - 40 - w, (height - h) / 2)
-        
+        gc.DrawText(item_value, width - 40 - w, (height - h) // 2)
+
         # Draw other Viewer common elements
         self.DrawCommonElements(gc)
-        
+
         gc.EndDrawing()
-    
+
     def OnLeftDown(self, event):
         """
         Function called when mouse left button is pressed
@@ -236,15 +236,15 @@
         """
         # Get first item
         item = self.ItemsDict.values()[0]
-        
+
         # Calculate item path bounding box
-        width, height = self.GetSize()
+        _width, height = self.GetSize()
         item_path = item.GetVariable(
-                self.ParentWindow.GetVariableNameMask())
+            self.ParentWindow.GetVariableNameMask())
         w, h = self.GetTextExtent(item_path)
-        
+
         # Test if mouse has been pressed in this bounding box. In that case
-        # start a move drag'n drop of item variable 
+        # start a move drag'n drop of item variable
         x, y = event.GetPosition()
         item_path_bbox = wx.Rect(20, (height - h) / 2, w, h)
         if item_path_bbox.InsideXY(x, y):
@@ -253,11 +253,11 @@
             dragSource = wx.DropSource(self)
             dragSource.SetData(data)
             dragSource.DoDragDrop()
-        
+
         # In other case handle event normally
         else:
             event.Skip()
-    
+
     def OnLeftUp(self, event):
         """
         Function called when mouse left button is released
@@ -267,7 +267,7 @@
         x, y = event.GetPosition()
         wx.CallAfter(self.HandleButton, x, y)
         event.Skip()
-    
+
     def OnLeftDClick(self, event):
         """
         Function called when mouse left button is double clicked
@@ -276,7 +276,7 @@
         # Only numeric variables can be toggled to graph canvas
         if self.ItemsDict.values()[0].IsNumVariable():
             self.ParentWindow.ToggleViewerType(self)
-    
+
     def OnPaint(self, event):
         """
         Function called when redrawing Viewer content is needed
--- a/controls/DebugVariablePanel/DebugVariableViewer.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/DebugVariablePanel/DebugVariableViewer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,12 +22,13 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
 from collections import OrderedDict
+from functools import reduce
 
 import wx
-
-import matplotlib
-import matplotlib.pyplot
 from matplotlib.backends.backend_wxagg import _convert_agg_to_wx_bitmap
 
 from dialogs.ForceVariableDialog import ForceVariableDialog
@@ -41,52 +42,62 @@
  HIGHLIGHT_RESIZE] = range(6)
 
 # Viewer highlight styles
-HIGHLIGHT_DROP_PEN = wx.Pen(wx.Colour(0, 128, 255))
-HIGHLIGHT_DROP_BRUSH = wx.Brush(wx.Colour(0, 128, 255, 128))
-HIGHLIGHT_RESIZE_PEN = wx.Pen(wx.Colour(200, 200, 200))
-HIGHLIGHT_RESIZE_BRUSH = wx.Brush(wx.Colour(200, 200, 200))
-
-#-------------------------------------------------------------------------------
+HIGHLIGHT = {
+}
+
+# -------------------------------------------------------------------------------
 #                        Base Debug Variable Viewer Class
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a generic viewer that display a list of variable values
-This class has to be inherited to effectively display variable values
-"""
-
-class DebugVariableViewer:
-    
-    def __init__(self, window, items=[]):
+# -------------------------------------------------------------------------------
+
+
+class DebugVariableViewer(object):
+    """
+    Class that implements a generic viewer that display a list of variable values
+    This class has to be inherited to effectively display variable values
+    """
+
+    def __init__(self, window, items=None):
         """
         Constructor
         @param window: Reference to the Debug Variable Panel
         @param items: List of DebugVariableItem displayed by Viewer
         """
         self.ParentWindow = window
+        items = [] if items is None else items
         self.ItemsDict = OrderedDict([(item.GetVariable(), item)
                                       for item in items])
         self.Items = self.ItemsDict.viewvalues()
-        
+
         # Variable storing current highlight displayed in Viewer
         self.Highlight = HIGHLIGHT_NONE
         # List of buttons
         self.Buttons = []
-    
+        self.InitHighlightPensBrushes()
+
     def __del__(self):
         """
         Destructor
         """
         # Remove reference to Debug Variable Panel
         self.ParentWindow = None
-    
+
+    def InitHighlightPensBrushes(self):
+        """
+        Init global pens and brushes
+        """
+        if not HIGHLIGHT:
+            HIGHLIGHT['DROP_PEN'] = wx.Pen(wx.Colour(0, 128, 255))
+            HIGHLIGHT['DROP_BRUSH'] = wx.Brush(wx.Colour(0, 128, 255, 128))
+            HIGHLIGHT['RESIZE_PEN'] = wx.Pen(wx.Colour(200, 200, 200))
+            HIGHLIGHT['RESIZE_BRUSH'] = wx.Brush(wx.Colour(200, 200, 200))
+
     def GetIndex(self):
         """
         Return position of Viewer in Debug Variable Panel
         @return: Position of Viewer
         """
         return self.ParentWindow.GetViewerIndex(self)
-    
+
     def GetItem(self, variable):
         """
         Return item storing values of a variable
@@ -94,28 +105,28 @@
         @return: Item storing values of this variable
         """
         return self.ItemsDict.get(variable, None)
-    
+
     def GetItems(self):
         """
         Return items displayed by Viewer
         @return: List of items displayed in Viewer
         """
         return self.ItemsDict.values()
-    
+
     def AddItem(self, item):
         """
         Add an item to the list of items displayed by Viewer
         @param item: Item to add to the list
         """
         self.ItemsDict[item.GetVariable()] = item
-        
+
     def RemoveItem(self, item):
         """
         Remove an item from the list of items displayed by Viewer
         @param item: Item to remove from the list
         """
         self.ItemsDict.pop(item.GetVariable(), None)
-    
+
     def ClearItems(self):
         """
         Clear list of items displayed by Viewer
@@ -123,17 +134,17 @@
         # Unsubscribe every items of the list
         for item in self.Items:
             self.ParentWindow.RemoveDataConsumer(item)
-        
+
         # Clear list
         self.ItemsDict.clear()
-        
+
     def ItemsIsEmpty(self):
         """
         Return if list of items displayed by Viewer is empty
         @return: True if list is empty
         """
         return len(self.Items) == 0
-    
+
     def SubscribeAllDataConsumers(self):
         """
         Function that unsubscribe and remove every item that store values of
@@ -141,7 +152,7 @@
         """
         for item in self.ItemsDict.values()[:]:
             iec_path = item.GetVariable()
-            
+
             # Check that variablepath exist in PLC
             if self.ParentWindow.GetDataType(iec_path) is None:
                 # If not, unsubscribe and remove it
@@ -151,30 +162,30 @@
                 # If it exist, resubscribe and refresh data type
                 self.ParentWindow.AddDataConsumer(iec_path.upper(), item, True)
                 item.RefreshVariableType()
-    
+
     def ResetItemsData(self):
         """
         Reset data stored in every items displayed in Viewer
         """
         for item in self.Items:
             item.ResetData()
-    
+
     def GetItemsMinCommonTick(self):
         """
         Return the minimum tick common to all iems displayed in Viewer
         @return: Minimum common tick between items
         """
-        return reduce(max, [item.GetData()[0, 0] 
+        return reduce(max, [item.GetData()[0, 0]
                             for item in self.Items
                             if len(item.GetData()) > 0], 0)
-    
+
     def RefreshViewer(self):
         """
         Method that refresh the content displayed by Viewer
         Need to be overridden by inherited classes
         """
         pass
-    
+
     def SetHighlight(self, highlight):
         """
         Set Highlight type displayed in Viewer
@@ -183,17 +194,17 @@
         # Return immediately if highlight don't change
         if self.Highlight == highlight:
             return False
-        
+
         self.Highlight = highlight
         return True
-    
+
     def GetButtons(self):
         """
         Return list of buttons defined in Viewer
         @return: List of buttons
         """
         return self.Buttons
-    
+
     def IsOverButton(self, x, y):
         """
         Return if point is over one button of Viewer
@@ -205,7 +216,7 @@
             if button.HitTest(x, y):
                 return button
         return None
-    
+
     def HandleButton(self, x, y):
         """
         Search for the button under point and if found execute associated
@@ -217,10 +228,10 @@
         button = self.IsOverButton(x, y)
         if button is None:
             return False
-        
+
         button.ProcessCallback()
         return True
-    
+
     def ShowButtons(self, show):
         """
         Set display state of buttons in Viewer
@@ -229,35 +240,35 @@
         # Change display of every buttons
         for button in self.Buttons:
             button.Show(show)
-        
+
         # Refresh button positions
         self.RefreshButtonsPosition()
         self.RefreshViewer()
-    
+
     def RefreshButtonsPosition(self):
         """
         Function that refresh buttons position in Viewer
         """
         # Get Viewer size
-        width, height = self.GetSize()
-        
+        width, _height = self.GetSize()
+
         # Buttons are align right so we calculate buttons positions in
         # reverse order
         buttons = self.Buttons[:]
         buttons.reverse()
-        
+
         # Position offset on x coordinate
         x_offset = 0
         for button in buttons:
-            # Buttons are stacked right, removing those that are not active 
+            # Buttons are stacked right, removing those that are not active
             if button.IsEnabled():
                 # Update button position according to button width and offset
                 # on x coordinate
-                w, h = button.GetSize()
+                w, _h = button.GetSize()
                 button.SetPosition(width - 5 - w - x_offset, 5)
                 # Update offset on x coordinate
                 x_offset += w + 2
-    
+
     def DrawCommonElements(self, dc, buttons=None):
         """
         Function that draw common graphics for every Viewers
@@ -268,26 +279,26 @@
         """
         # Get Viewer size
         width, height = self.GetSize()
-        
+
         # Set dc styling for drop before or drop after highlight
-        dc.SetPen(HIGHLIGHT_DROP_PEN)
-        dc.SetBrush(HIGHLIGHT_DROP_BRUSH)
-        
+        dc.SetPen(HIGHLIGHT['DROP_PEN'])
+        dc.SetBrush(HIGHLIGHT['DROP_BRUSH'])
+
         # Draw line at upper side of Viewer if highlight is drop before
         if self.Highlight == HIGHLIGHT_BEFORE:
             dc.DrawLine(0, 1, width - 1, 1)
-        
+
         # Draw line at lower side of Viewer if highlight is drop before
         elif self.Highlight == HIGHLIGHT_AFTER:
             dc.DrawLine(0, height - 1, width - 1, height - 1)
-        
+
         # If no specific buttons are defined, get default buttons
         if buttons is None:
             buttons = self.Buttons
         # Draw buttons
         for button in buttons:
             button.Draw(dc)
-        
+
         # If graph dragging is processing
         if self.ParentWindow.IsDragging():
             destBBox = self.ParentWindow.GetDraggingAxesClippingRegion(self)
@@ -295,55 +306,55 @@
             if destBBox.width > 0 and destBBox.height > 0:
                 srcPanel = self.ParentWindow.DraggingAxesPanel
                 srcBBox = srcPanel.GetAxesBoundingBox()
-                
+
                 srcX = srcBBox.x - (srcPos.x if destBBox.x == 0 else 0)
                 srcY = srcBBox.y - (srcPos.y if destBBox.y == 0 else 0)
-                
+
                 srcBmp = _convert_agg_to_wx_bitmap(
-                            srcPanel.get_renderer(), None)
+                    srcPanel.get_renderer(), None)
                 srcDC = wx.MemoryDC()
                 srcDC.SelectObject(srcBmp)
-                
-                dc.Blit(destBBox.x, destBBox.y, 
-                        int(destBBox.width), int(destBBox.height), 
+
+                dc.Blit(destBBox.x, destBBox.y,
+                        int(destBBox.width), int(destBBox.height),
                         srcDC, srcX, srcY)
-    
+
     def OnEnter(self, event):
         """
         Function called when entering Viewer
-        @param event: wx.MouseEvent 
+        @param event: wx.MouseEvent
         """
         # Display buttons
         self.ShowButtons(True)
         event.Skip()
-        
+
     def OnLeave(self, event):
         """
         Function called when leaving Viewer
-        @param event: wx.MouseEvent 
+        @param event: wx.MouseEvent
         """
         # Hide buttons
         self.ShowButtons(False)
         event.Skip()
-    
+
     def OnCloseButton(self):
         """
         Function called when Close button is pressed
         """
         wx.CallAfter(self.ParentWindow.DeleteValue, self)
-    
+
     def OnForceButton(self):
         """
         Function called when Force button is pressed
         """
         self.ForceValue(self.ItemsDict.values()[0])
-        
+
     def OnReleaseButton(self):
         """
         Function called when Release button is pressed
         """
         self.ReleaseValue(self.ItemsDict.values()[0])
-    
+
     def OnMouseDragging(self, x, y):
         """
         Function called when mouse is dragged over Viewer
@@ -354,7 +365,7 @@
         # Refresh highlight in Debug Variable Panel (highlight can be displayed
         # in another Viewer
         self.ParentWindow.RefreshHighlight(x + xw, y + yw)
-    
+
     def RefreshHighlight(self, x, y):
         """
         Function called by Debug Variable Panel asking Viewer to refresh
@@ -363,23 +374,23 @@
         @param y: Y coordinate of mouse pointer
         """
         # Get Viewer size
-        width, height = self.GetSize()
-        
+        _width, height = self.GetSize()
+
         # Mouse is in the first half of Viewer
-        if y < height / 2:
+        if y < height // 2:
             # If Viewer is the upper one, draw drop before highlight
             if self.ParentWindow.IsViewerFirst(self):
                 self.SetHighlight(HIGHLIGHT_BEFORE)
-            
+
             # Else draw drop after highlight in previous Viewer
             else:
                 self.SetHighlight(HIGHLIGHT_NONE)
                 self.ParentWindow.HighlightPreviousViewer(self)
-        
-        # Mouse is in the second half of Viewer, draw drop after highlight 
+
+        # Mouse is in the second half of Viewer, draw drop after highlight
         else:
             self.SetHighlight(HIGHLIGHT_AFTER)
-    
+
     def OnEraseBackground(self, event):
         """
         Function called when Viewer background is going to be erase
@@ -387,7 +398,7 @@
         """
         # Prevent flicker on Windows
         pass
-    
+
     def OnResize(self, event):
         """
         Function called when Viewer size changed
@@ -397,7 +408,7 @@
         self.RefreshButtonsPosition()
         self.ParentWindow.ForceRefresh()
         event.Skip()
-    
+
     def ForceValue(self, item):
         """
         Force value of item given
@@ -409,17 +420,17 @@
         # Return immediately if not found
         if iec_type is None:
             return
-        
+
         # Open a dialog to enter varaible forced value
         dialog = ForceVariableDialog(self, iec_type, str(item.GetValue()))
         if dialog.ShowModal() == wx.ID_OK:
             self.ParentWindow.ForceDataValue(iec_path.upper(),
                                              dialog.GetValue())
-    
+
     def ReleaseValue(self, item):
         """
         Release value of item given
         @param item: Item to release value
         """
         self.ParentWindow.ReleaseDataValue(
-                item.GetVariable().upper())
+            item.GetVariable().upper())
--- a/controls/DebugVariablePanel/GraphButton.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/DebugVariablePanel/GraphButton.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,20 +22,22 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from util.BitmapLibrary import GetBitmap
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                        Custom button for Graphic Viewer Class
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
-"""
-Class that implements a custom button for graphic Viewer
-"""
 
-class GraphButton():
-    
+class GraphButton(object):
+    """
+    Class that implements a custom button for graphic Viewer
+    """
+
     def __init__(self, x, y, bitmap, callback):
         """
         Constructor
@@ -48,21 +50,21 @@
         self.SetPosition(x, y)
         # Set button bitmap
         self.SetBitmap(bitmap)
-        
+
         # By default button is hide and enabled
         self.Shown = False
         self.Enabled = True
-        
+
         # Save reference to callback function
         self.Callback = callback
-    
+
     def __del__(self):
         """
         Destructor
         """
         # Remove reference to callback function
         self.callback = None
-    
+
     def SetBitmap(self, bitmap):
         """
         Set bitmap to use for button
@@ -70,7 +72,7 @@
         """
         # Get wx.Bitmap object corresponding to bitmap
         self.Bitmap = GetBitmap(bitmap)
-    
+
     def GetSize(self):
         """
         Return size of button
@@ -78,7 +80,7 @@
         """
         # Button size is size of bitmap
         return self.Bitmap.GetSize()
-    
+
     def SetPosition(self, x, y):
         """
         Set button position
@@ -86,7 +88,7 @@
         @param y: Y coordinate of Button in Graphic Viewer
         """
         self.Position = wx.Point(x, y)
-    
+
     def Show(self, show=True):
         """
         Mark if button to be displayed in Graphic Viewer
@@ -94,20 +96,20 @@
         (default True)
         """
         self.Shown = show
-        
+
     def Hide(self):
         """
         Hide button from Graphic Viewer
         """
         self.Show(False)
-    
+
     def IsShown(self):
         """
         Return if button is displayed in Graphic Viewer
         @return: True if button is displayed in Graphic Viewer
         """
         return self.Shown
-    
+
     def Enable(self, enable=True):
         """
         Mark if button is active in Graphic Viewer
@@ -115,44 +117,44 @@
         (default True)
         """
         self.Enabled = enable
-    
+
     def Disable(self):
         """
         Deactivate button in Graphic Viewer
         """
         self.Enabled = False
-    
+
     def IsEnabled(self):
         """
         Return if button is active in Graphic Viewer
         @return: True if button is active in Graphic Viewer
         """
         return self.Enabled
-    
+
     def HitTest(self, x, y):
         """
         Test if point is inside button
         @param x: X coordinate of point
         @param y: Y coordinate of point
         @return: True if button is active and displayed and point is inside
-        button 
+        button
         """
         # Return immediately if button is hidden or inactive
         if not (self.IsShown() and self.IsEnabled()):
             return False
-        
+
         # Test if point is inside button
         w, h = self.Bitmap.GetSize()
         rect = wx.Rect(self.Position.x, self.Position.y, w, h)
         return rect.InsideXY(x, y)
-    
+
     def ProcessCallback(self):
         """
         Call callback function if defined
         """
         if self.Callback is not None:
             self.Callback()
-    
+
     def Draw(self, dc):
         """
         Draw button in Graphic Viewer
--- a/controls/DebugVariablePanel/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/DebugVariablePanel/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,5 +22,5 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-
-from DebugVariablePanel import DebugVariablePanel
+from __future__ import absolute_import
+from controls.DebugVariablePanel.DebugVariablePanel import DebugVariablePanel
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/controls/DiscoveryPanel.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,259 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+
+from __future__ import absolute_import
+import socket
+from six.moves import xrange
+import wx
+import wx.lib.mixins.listctrl as listmix
+from zeroconf import ServiceBrowser, Zeroconf, get_all_addresses
+import netifaces
+
+service_type = '_Beremiz._tcp.local.'
+
+
+class AutoWidthListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
+    def __init__(self, parent, id, name, pos=wx.DefaultPosition,
+                 size=wx.DefaultSize, style=0):
+        wx.ListCtrl.__init__(self, parent, id, pos, size, style, name=name)
+        listmix.ListCtrlAutoWidthMixin.__init__(self)
+
+class DiscoveryPanel(wx.Panel, listmix.ColumnSorterMixin):
+
+    def _init_coll_MainSizer_Items(self, parent):
+        parent.AddWindow(self.staticText1,    0, border=20, flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
+        parent.AddWindow(self.ServicesList,   0, border=20, flag=wx.LEFT | wx.RIGHT | wx.GROW)
+        parent.AddSizer(self.ButtonGridSizer, 0, border=20, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
+
+    def _init_coll_MainSizer_Growables(self, parent):
+        parent.AddGrowableCol(0)
+        parent.AddGrowableRow(1)
+
+    def _init_coll_ButtonGridSizer_Items(self, parent):
+        parent.AddWindow(self.RefreshButton, 0, border=0, flag=0)
+        # parent.AddWindow(self.ByIPCheck, 0, border=0, flag=0)
+
+    def _init_coll_ButtonGridSizer_Growables(self, parent):
+        parent.AddGrowableCol(0)
+        parent.AddGrowableRow(0)
+
+    def _init_sizers(self):
+        self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10)
+        self.ButtonGridSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=0)
+
+        self._init_coll_MainSizer_Items(self.MainSizer)
+        self._init_coll_MainSizer_Growables(self.MainSizer)
+        self._init_coll_ButtonGridSizer_Items(self.ButtonGridSizer)
+        self._init_coll_ButtonGridSizer_Growables(self.ButtonGridSizer)
+
+        self.SetSizer(self.MainSizer)
+
+    def _init_list_ctrl(self):
+        # Set up list control
+        listID = wx.NewId()
+        self.ServicesList = AutoWidthListCtrl(
+            id=listID,
+            name='ServicesList', parent=self, pos=wx.Point(0, 0), size=wx.Size(0, 0),
+            style=wx.LC_REPORT | wx.LC_EDIT_LABELS | wx.LC_SORT_ASCENDING | wx.LC_SINGLE_SEL)
+        self.ServicesList.InsertColumn(0, _('NAME'))
+        self.ServicesList.InsertColumn(1, _('TYPE'))
+        self.ServicesList.InsertColumn(2, _('IP'))
+        self.ServicesList.InsertColumn(3, _('PORT'))
+        self.ServicesList.SetColumnWidth(0, 150)
+        self.ServicesList.SetColumnWidth(1, 150)
+        self.ServicesList.SetColumnWidth(2, 150)
+        self.ServicesList.SetColumnWidth(3, 150)
+        self.ServicesList.SetInitialSize(wx.Size(-1, 300))
+        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, id=listID)
+        self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, id=listID)
+
+    def _init_ctrls(self, prnt):
+        self.staticText1 = wx.StaticText(
+            label=_('Services available:'), name='staticText1', parent=self,
+            pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
+
+        self.RefreshButton = wx.Button(
+            label=_('Refresh'), name='RefreshButton', parent=self,
+            pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
+        self.RefreshButton.Bind(wx.EVT_BUTTON, self.OnRefreshButton)
+
+        # self.ByIPCheck = wx.CheckBox(self, label=_("Use IP instead of Service Name"))
+        # self.ByIPCheck.SetValue(True)
+
+        self._init_sizers()
+        self.Fit()
+
+    def __init__(self, parent):
+        wx.Panel.__init__(self, parent)
+
+        self.parent = parent
+
+        self._init_list_ctrl()
+        listmix.ColumnSorterMixin.__init__(self, 4)
+
+        self._init_ctrls(parent)
+
+        self.itemDataMap = {}
+        self.nextItemId = 0
+
+        self.URI = None
+        self.Browser = None
+        self.ZeroConfInstance = None
+
+        self.RefreshList()
+        self.LatestSelection = None
+
+        self.IfacesMonitorState = None
+        self.IfacesMonitorTimer = wx.Timer(self)
+        self.IfacesMonitorTimer.Start(2000)
+        self.Bind(wx.EVT_TIMER, self.IfacesMonitor , self.IfacesMonitorTimer)
+
+    def __del__(self):
+        self.IfacesMonitorTimer.Stop()
+        self.Browser.cancel()
+        self.ZeroConfInstance.close()
+
+    def IfacesMonitor(self, event):
+        NewState = get_all_addresses(socket.AF_INET)
+
+        if self.IfacesMonitorState != NewState: 
+            if self.IfacesMonitorState is not None:
+                # refresh only if a new address appeared
+                for addr in NewState:
+                    if addr not in self.IfacesMonitorState:
+                        self.RefreshList()
+                        break
+            self.IfacesMonitorState = NewState
+        event.Skip()
+
+    def RefreshList(self):
+        self.ServicesList.DeleteAllItems()
+        if self.Browser is not None:
+            self.Browser.cancel()
+        if self.ZeroConfInstance is not None:
+            self.ZeroConfInstance.close()
+        self.ZeroConfInstance = Zeroconf()
+        self.Browser = ServiceBrowser(self.ZeroConfInstance, service_type, self)
+
+    def OnRefreshButton(self, event):
+        self.RefreshList()
+
+    # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
+    def GetListCtrl(self):
+        return self.ServicesList
+
+    def getColumnText(self, index, col):
+        item = self.ServicesList.GetItem(index, col)
+        return item.GetText()
+
+    def OnItemSelected(self, event):
+        self.SetURI(event.m_itemIndex)
+        event.Skip()
+
+    def OnItemActivated(self, event):
+        self.SetURI(event.m_itemIndex)
+        self.parent.EndModal(wx.ID_OK)
+        event.Skip()
+
+#    def SetURI(self, idx):
+#        connect_type = self.getColumnText(idx, 1)
+#        connect_address = self.getColumnText(idx, 2)
+#        connect_port = self.getColumnText(idx, 3)
+#
+#        self.URI = "%s://%s:%s"%(connect_type, connect_address, connect_port)
+
+    def SetURI(self, idx):
+        self.LatestSelection = idx
+
+    def GetURI(self):
+        if self.LatestSelection is not None:
+            # if self.ByIPCheck.IsChecked():
+            svcname, scheme, host, port = \
+                map(lambda col:self.getColumnText(self.LatestSelection, col),
+                    range(4))
+            return ("%s://%s:%s#%s" % (scheme, host, port, svcname)) \
+                if scheme[-1] == "S" \
+                else ("%s://%s:%s" % (scheme, host, port))
+            # else:
+            #     svcname = self.getColumnText(self.LatestSelection, 0)
+            #     connect_type = self.getColumnText(self.LatestSelection, 1)
+            #     return str("MDNS://%s" % svcname)
+        return None
+
+    def remove_service(self, zeroconf, _type, name):
+        wx.CallAfter(self._removeService, name)
+
+    def _removeService(self, name):
+        '''
+        called when a service with the desired type goes offline.
+        '''
+
+        # loop through the list items looking for the service that went offline
+        for idx in xrange(self.ServicesList.GetItemCount()):
+            # this is the unique identifier assigned to the item
+            item_id = self.ServicesList.GetItemData(idx)
+
+            # this is the full typename that was received by addService
+            item_name = self.itemDataMap[item_id][4]
+
+            if item_name == name:
+                self.ServicesList.DeleteItem(idx)
+                break
+
+    def add_service(self, zeroconf, _type, name):
+        wx.CallAfter(self._addService, _type, name)
+
+    def _addService(self, _type, name):
+        '''
+        called when a service with the desired type is discovered.
+        '''
+        info = self.ZeroConfInstance.get_service_info(_type, name)
+        svcname = name.split(".")[0]
+        typename = info.properties.get("protocol", None)
+        ip = str(socket.inet_ntoa(info.address))
+        port = info.port
+
+        num_items = self.ServicesList.GetItemCount()
+
+        # display the new data in the list
+        new_item = self.ServicesList.InsertStringItem(num_items, svcname)
+        self.ServicesList.SetStringItem(new_item, 1, "%s" % typename)
+        self.ServicesList.SetStringItem(new_item, 2, "%s" % ip)
+        self.ServicesList.SetStringItem(new_item, 3, "%s" % port)
+
+        # record the new data for the ColumnSorterMixin
+        # we assign every list item a unique id (that won't change when items
+        # are added or removed)
+        self.ServicesList.SetItemData(new_item, self.nextItemId)
+
+        # the value of each column has to be stored in the itemDataMap
+        # so that ColumnSorterMixin knows how to sort the column.
+
+        # "name" is included at the end so that self.removeService
+        # can access it.
+        self.itemDataMap[self.nextItemId] = [svcname, typename, ip, port, name]
+
+        self.nextItemId += 1
--- a/controls/DurationCellEditor.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/DurationCellEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,44 +22,47 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from dialogs.DurationEditorDialog import DurationEditorDialog
 
+
 class DurationCellControl(wx.PyControl):
-    
+
     '''
     Custom cell editor control with a text box and a button that launches
     the DurationEditorDialog.
     '''
     def __init__(self, parent):
-        wx.Control.__init__(self, parent)
-        
+        wx.PyControl.__init__(self, parent)
+
         main_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(0)
-        
+
         # create location text control
-        self.Duration = wx.TextCtrl(self, size=wx.Size(0, -1), 
-              style=wx.TE_PROCESS_ENTER)
+        self.Duration = wx.TextCtrl(self, size=wx.Size(0, -1),
+                                    style=wx.TE_PROCESS_ENTER)
         self.Duration.Bind(wx.EVT_KEY_DOWN, self.OnDurationChar)
         main_sizer.AddWindow(self.Duration, flag=wx.GROW)
-        
+
         # create browse button
         self.EditButton = wx.Button(self, label='...', size=wx.Size(30, -1))
         self.Bind(wx.EVT_BUTTON, self.OnEditButtonClick, self.EditButton)
         main_sizer.AddWindow(self.EditButton, flag=wx.GROW)
-        
+
         self.Bind(wx.EVT_SIZE, self.OnSize)
-        
+
         self.SetSizer(main_sizer)
-        
+
         self.Default = None
-        
+
     def SetValue(self, value):
         self.Default = value
         self.Duration.SetValue(value)
-    
+
     def GetValue(self):
         return self.Duration.GetValue()
 
@@ -90,23 +93,24 @@
 
     def SetInsertionPoint(self, i):
         self.Duration.SetInsertionPoint(i)
-    
+
     def SetFocus(self):
         self.Duration.SetFocus()
 
+
 class DurationCellEditor(wx.grid.PyGridCellEditor):
     '''
     Grid cell editor that uses DurationCellControl to display an edit button.
     '''
     def __init__(self, table, colname):
         wx.grid.PyGridCellEditor.__init__(self)
-        
+
         self.Table = table
         self.Colname = colname
-    
+
     def __del__(self):
         self.CellControl = None
-    
+
     def Create(self, parent, id, evt_handler):
         self.CellControl = DurationCellControl(parent)
         self.SetControl(self.CellControl)
@@ -131,13 +135,13 @@
             return self.EndEditInternal(row, col, grid, oldval)
     else:
         def EndEdit(self, row, col, grid):
-            oldval = self.Table.GetValueByName(row, self.Colname)            
-            return self.EndEditInternal(row, col, grid, oldval)    
+            oldval = self.Table.GetValueByName(row, self.Colname)
+            return self.EndEditInternal(row, col, grid, oldval)
 
     def SetSize(self, rect):
         self.CellControl.SetDimensions(rect.x + 1, rect.y,
-                                        rect.width, rect.height,
-                                        wx.SIZE_ALLOW_MINUS_ONE)
+                                       rect.width, rect.height,
+                                       wx.SIZE_ALLOW_MINUS_ONE)
 
     def Clone(self):
-        return DurationCellEditor(self.Table)
+        return DurationCellEditor(self.Table, self.Colname)
--- a/controls/EnhancedStatusBar.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/EnhancedStatusBar.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,248 +1,248 @@
-# --------------------------------------------------------------------------- #
-# ENHANCEDSTATUSBAR wxPython IMPLEMENTATION
-# Python Code By:
-#
-# Andrea Gavana, @ 31 May 2005
-# Nitro, @ 21 September 2005
-# Latest Revision: 21 September 2005, 19.57.20 GMT+2
-# Latest Revision before Latest Revision: 21 September 2005, 18.29.35 GMT+2
-# Latest Revision before Latest Revision before Latest Revision: 31 May 2005, 23.17 CET
-#
-#
-# TODO List/Caveats
-#
-# 1. Some Requests/Features To Add?
-#
-#
-# For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please
-# Write To Me At:
-# 
-#
-# andrea.gavana@agip.it
-# andrea_gavan@tin.it
-#
-# Or, Obviously, To The wxPython Mailing List!!!
-#
-#
-# licensed under wxWidgets License (GPL compatible)
-# End Of Comments
-# --------------------------------------------------------------------------- #
-
-""" Description:
-
-EnhancedStatusBar Is A Slight Modification (Actually A Subclassing) Of wx.StatusBar.
-It Allows You To Add Almost Any Widget You Like To The wx.StatusBar Of Your Main
-Frame Application And Also To Layout Them Properly.
-
-
-What It Can Do:
-
-1) Almost All The Functionalities Of wx.StatusBar Are Still Present;
-2) You Can Add Different Kind Of Widgets Into Every Field Of The EnhancedStatusBar;
-3) The AddWidget() Methods Accepts 2 Layout Inputs:
-   - horizontalalignment: This Specify The Horizontal Alignment For Your Widget,
-     And Can Be ESB_EXACT_FIT, ESB_ALIGN_CENTER_HORIZONTAL, ESB_ALIGN_LEFT And
-     ESB_ALIGN_RIGHT;
-   - varticalalignment: This Specify The Vertical Alignment For Your Widget,
-     And Can Be ESB_EXACT_FIT, ESB_ALIGN_CENTER_VERTICAL, ESB_ALIGN_BOTTOM And
-     ESB_ALIGN_LEFT;
-
-EnhancedStatusBar Is Freeware And Distributed Under The wxPython License. 
-
-Latest Revision: 21 September 2005, 19.57.20 GMT+2
-Latest Revision before Latest Revision: 21 September 2005, 18.29.35 GMT+2
-Latest Revision before Latest Revision before Latest Revision: 31 May 2005, 23.17 CET
-
-"""
-
-import wx
-
-# Horizontal Alignment Constants
-ESB_ALIGN_CENTER_VERTICAL = 1
-ESB_ALIGN_TOP = 2
-ESB_ALIGN_BOTTOM = 3
-
-# Vertical Alignment Constants
-ESB_ALIGN_CENTER_HORIZONTAL = 11
-ESB_ALIGN_LEFT = 12
-ESB_ALIGN_RIGHT = 13
-
-# Exact Fit (Either Horizontal Or Vertical Or Both) Constant
-ESB_EXACT_FIT = 20
-
-
-# ---------------------------------------------------------------
-# Class EnhancedStatusBar
-# ---------------------------------------------------------------
-# This Is The Main Class Implementation. See The Demo For Details
-# ---------------------------------------------------------------
-class EnhancedStatusBarItem(object):
-    def __init__(self, widget, pos, horizontalalignment=ESB_ALIGN_CENTER_HORIZONTAL, verticalalignment=ESB_ALIGN_CENTER_VERTICAL):
-        self.__dict__.update( locals() )
-
-class EnhancedStatusBar(wx.StatusBar):
-
-    def __init__(self, parent, id=wx.ID_ANY, style=wx.ST_SIZEGRIP,
-                 name="EnhancedStatusBar"):
-        """Default Class Constructor.
-
-        EnhancedStatusBar.__init__(self, parent, id=wx.ID_ANY,
-                                   style=wx.ST_SIZEGRIP,
-                                   name="EnhancedStatusBar")
-        """
-        
-        wx.StatusBar.__init__(self, parent, id, style, name)
-        
-        self._items = {}
-        self._curPos = 0
-        self._parent = parent
-        
-        wx.EVT_SIZE(self, self.OnSize) 
-        wx.CallAfter(self.OnSize, None)
-
-            
-    def OnSize(self, event):
-        """Handles The wx.EVT_SIZE Events For The StatusBar.
-
-        Actually, All The Calculations Linked To HorizontalAlignment And
-        VerticalAlignment Are Done In This Function."""
-
-        for pos, item in self._items.items():
-            widget, horizontalalignment, verticalalignment = item.widget, item.horizontalalignment, item.verticalalignment
-           
-            rect = self.GetFieldRect(pos)
-            widgetpos = widget.GetPosition()
-            widgetsize = widget.GetSize()
-
-            rect = self.GetFieldRect(pos)
-            
-            if horizontalalignment == ESB_EXACT_FIT:
-                
-                if verticalalignment == ESB_EXACT_FIT:
-                    """ 1 September 2015 Fix fit align """
-                    widget.SetSize((rect.width-4, rect.height-4))
-                    widget.SetPosition((rect.x+2, rect.y+2))
-                elif verticalalignment == ESB_ALIGN_CENTER_VERTICAL:
-                    if widgetsize[1] < rect.width - 1:
-                        diffs = (rect.height - widgetsize[1])/2
-                        widget.SetSize((rect.width-2, widgetsize[1]))
-                        widget.SetPosition((rect.x-1, rect.y+diffs))
-                    else:
-                        widget.SetSize((rect.width-2, widgetsize[1]))
-                        widget.SetPosition((rect.x-1, rect.y-1))
-                elif verticalalignment == ESB_ALIGN_TOP:
-                    widget.SetSize((rect.width-2, widgetsize[1]))
-                    widget.SetPosition((rect.x-1, rect.y))
-                elif verticalalignment == ESB_ALIGN_BOTTOM:
-                    widget.SetSize((rect.width-2, widgetsize[1]))
-                    widget.SetPosition((rect.x-1, rect.height-widgetsize[1]))
-
-            elif horizontalalignment == ESB_ALIGN_LEFT:
-                
-                xpos = rect.x - 1
-                if verticalalignment == ESB_EXACT_FIT:
-                    widget.SetSize((widgetsize[0], rect.height-2))
-                    widget.SetPosition((xpos, rect.y-1))
-                elif verticalalignment == ESB_ALIGN_CENTER_VERTICAL:
-                    if widgetsize[1] < rect.height - 1:
-                        diffs = (rect.height - widgetsize[1])/2
-                        widget.SetPosition((xpos, rect.y+diffs))
-                    else:
-                        widget.SetSize((widgetsize[0], rect.height-2))
-                        widget.SetPosition((xpos, rect.y-1))
-                elif verticalalignment == ESB_ALIGN_TOP:
-                    widget.SetPosition((xpos, rect.y))
-                elif verticalalignment == ESB_ALIGN_BOTTOM:
-                    widget.SetPosition((xpos, rect.height-widgetsize[1]))
-                
-            elif horizontalalignment == ESB_ALIGN_RIGHT:
-                
-                xpos = rect.x + rect.width - widgetsize[0] - 1
-                if verticalalignment == ESB_EXACT_FIT:
-                    widget.SetSize((widgetsize[0], rect.height-2))
-                    widget.SetPosition((xpos, rect.y-1))
-                elif verticalalignment == ESB_ALIGN_CENTER_VERTICAL:
-                    if widgetsize[1] < rect.height - 1:
-                        diffs = (rect.height - widgetsize[1])/2
-                        widget.SetPosition((xpos, rect.y+diffs))
-                    else:
-                        widget.SetSize((widgetsize[0], rect.height-2))
-                        widget.SetPosition((xpos, rect.y-1))
-                elif verticalalignment == ESB_ALIGN_TOP:
-                    widget.SetPosition((xpos, rect.y))
-                elif verticalalignment == ESB_ALIGN_BOTTOM:
-                    widget.SetPosition((xpos, rect.height-widgetsize[1]))
-
-            elif horizontalalignment == ESB_ALIGN_CENTER_HORIZONTAL:
-                
-                xpos = rect.x + (rect.width - widgetsize[0])/2 - 1
-                if verticalalignment == ESB_EXACT_FIT:
-                    widget.SetSize((widgetsize[0], rect.height))
-                    widget.SetPosition((xpos, rect.y))
-                elif verticalalignment == ESB_ALIGN_CENTER_VERTICAL:
-                    if widgetsize[1] < rect.height - 1:
-                        diffs = (rect.height - widgetsize[1])/2
-                        widget.SetPosition((xpos, rect.y+diffs))
-                    else:
-                        widget.SetSize((widgetsize[0], rect.height-1))
-                        widget.SetPosition((xpos, rect.y+1))
-                elif verticalalignment == ESB_ALIGN_TOP:
-                    widget.SetPosition((xpos, rect.y))
-                elif verticalalignment == ESB_ALIGN_BOTTOM:
-                    widget.SetPosition((xpos, rect.height-widgetsize[1]))
-
-                
-        if event is not None:
-            event.Skip()
-        
-        
-    def AddWidget(self, widget, horizontalalignment=ESB_ALIGN_CENTER_HORIZONTAL,
-                  verticalalignment=ESB_ALIGN_CENTER_VERTICAL, pos = -1):
-        """Add A Widget To The EnhancedStatusBar.
-
-        Parameters:
-
-        - horizontalalignment: This Can Be One Of:
-          a) ESB_EXACT_FIT: The Widget Will Fit Horizontally The StatusBar Field Width;
-          b) ESB_ALIGN_CENTER_HORIZONTAL: The Widget Will Be Centered Horizontally In
-             The StatusBar Field;
-          c) ESB_ALIGN_LEFT: The Widget Will Be Left Aligned In The StatusBar Field;
-          d) ESB_ALIGN_RIGHT: The Widget Will Be Right Aligned In The StatusBar Field;
-
-        - verticalalignment:
-          a) ESB_EXACT_FIT: The Widget Will Fit Vertically The StatusBar Field Height;
-          b) ESB_ALIGN_CENTER_VERTICAL: The Widget Will Be Centered Vertically In
-             The StatusBar Field;
-          c) ESB_ALIGN_BOTTOM: The Widget Will Be Bottom Aligned In The StatusBar Field;
-          d) ESB_ALIGN_TOP: The Widget Will Be TOP Aligned In The StatusBar Field;
-
-        """
-
-        if pos == -1:
-            pos = self._curPos
-            self._curPos += 1
-        
-        if self.GetFieldsCount() <= pos:
-            raise "\nERROR: EnhancedStatusBar has a max of %d items, you tried to set item #%d" % (self.GetFieldsCount(), pos)
-
-        if horizontalalignment not in [ESB_ALIGN_CENTER_HORIZONTAL, ESB_EXACT_FIT,
-                                       ESB_ALIGN_LEFT, ESB_ALIGN_RIGHT]:
-            raise '\nERROR: Parameter "horizontalalignment" Should Be One Of '\
-                  '"ESB_ALIGN_CENTER_HORIZONTAL", "ESB_ALIGN_LEFT", "ESB_ALIGN_RIGHT"' \
-                  '"ESB_EXACT_FIT"'
-
-        if verticalalignment not in [ESB_ALIGN_CENTER_VERTICAL, ESB_EXACT_FIT,
-                                     ESB_ALIGN_TOP, ESB_ALIGN_BOTTOM]:
-            raise '\nERROR: Parameter "verticalalignment" Should Be One Of '\
-                  '"ESB_ALIGN_CENTER_VERTICAL", "ESB_ALIGN_TOP", "ESB_ALIGN_BOTTOM"' \
-                  '"ESB_EXACT_FIT"'
-        
-
-        try:
-            self.RemoveChild(self._items[pos].widget)
-            self._items[pos].widget.Destroy()
-        except KeyError: pass
-        
-        self._items[pos] = EnhancedStatusBarItem(widget, pos, horizontalalignment, verticalalignment)
-        
-        wx.CallAfter(self.OnSize, None)
+# --------------------------------------------------------------------------- #
+# ENHANCEDSTATUSBAR wxPython IMPLEMENTATION
+# Python Code By:
+#
+# Andrea Gavana, @ 31 May 2005
+# Nitro, @ 21 September 2005
+# Latest Revision: 21 September 2005, 19.57.20 GMT+2
+# Latest Revision before Latest Revision: 21 September 2005, 18.29.35 GMT+2
+# Latest Revision before Latest Revision before Latest Revision: 31 May 2005, 23.17 CET
+#
+#
+# TODO List/Caveats
+#
+# 1. Some Requests/Features To Add?
+#
+#
+# For All Kind Of Problems, Requests Of Enhancements And Bug Reports, Please
+# Write To Me At:
+#
+#
+# andrea.gavana@agip.it
+# andrea_gavan@tin.it
+#
+# Or, Obviously, To The wxPython Mailing List!!!
+#
+#
+# licensed under wxWidgets License (GPL compatible)
+# End Of Comments
+# --------------------------------------------------------------------------- #
+
+""" Description:
+
+EnhancedStatusBar Is A Slight Modification (Actually A Subclassing) Of wx.StatusBar.
+It Allows You To Add Almost Any Widget You Like To The wx.StatusBar Of Your Main
+Frame Application And Also To Layout Them Properly.
+
+
+What It Can Do:
+
+1) Almost All The Functionalities Of wx.StatusBar Are Still Present;
+2) You Can Add Different Kind Of Widgets Into Every Field Of The EnhancedStatusBar;
+3) The AddWidget() Methods Accepts 2 Layout Inputs:
+   - horizontalalignment: This Specify The Horizontal Alignment For Your Widget,
+     And Can Be ESB_EXACT_FIT, ESB_ALIGN_CENTER_HORIZONTAL, ESB_ALIGN_LEFT And
+     ESB_ALIGN_RIGHT;
+   - varticalalignment: This Specify The Vertical Alignment For Your Widget,
+     And Can Be ESB_EXACT_FIT, ESB_ALIGN_CENTER_VERTICAL, ESB_ALIGN_BOTTOM And
+     ESB_ALIGN_LEFT;
+
+EnhancedStatusBar Is Freeware And Distributed Under The wxPython License.
+
+Latest Revision: 21 September 2005, 19.57.20 GMT+2
+Latest Revision before Latest Revision: 21 September 2005, 18.29.35 GMT+2
+Latest Revision before Latest Revision before Latest Revision: 31 May 2005, 23.17 CET
+
+"""
+
+from __future__ import absolute_import
+from __future__ import division
+import wx
+
+# Horizontal Alignment Constants
+ESB_ALIGN_CENTER_VERTICAL = 1
+ESB_ALIGN_TOP = 2
+ESB_ALIGN_BOTTOM = 3
+
+# Vertical Alignment Constants
+ESB_ALIGN_CENTER_HORIZONTAL = 11
+ESB_ALIGN_LEFT = 12
+ESB_ALIGN_RIGHT = 13
+
+# Exact Fit (Either Horizontal Or Vertical Or Both) Constant
+ESB_EXACT_FIT = 20
+
+
+# ---------------------------------------------------------------
+# Class EnhancedStatusBar
+# ---------------------------------------------------------------
+# This Is The Main Class Implementation. See The Demo For Details
+# ---------------------------------------------------------------
+class EnhancedStatusBarItem(object):
+    def __init__(self, widget, pos, horizontalalignment=ESB_ALIGN_CENTER_HORIZONTAL, verticalalignment=ESB_ALIGN_CENTER_VERTICAL):
+        self.__dict__.update(locals())
+
+
+class EnhancedStatusBar(wx.StatusBar):
+
+    def __init__(self, parent, id=wx.ID_ANY, style=wx.ST_SIZEGRIP,
+                 name="EnhancedStatusBar"):
+        """Default Class Constructor.
+
+        EnhancedStatusBar.__init__(self, parent, id=wx.ID_ANY,
+                                   style=wx.ST_SIZEGRIP,
+                                   name="EnhancedStatusBar")
+        """
+
+        wx.StatusBar.__init__(self, parent, id, style, name)
+
+        self._items = {}
+        self._curPos = 0
+        self._parent = parent
+
+        wx.EVT_SIZE(self, self.OnSize)
+        wx.CallAfter(self.OnSize, None)
+
+    def OnSize(self, event):
+        """Handles The wx.EVT_SIZE Events For The StatusBar.
+
+        Actually, All The Calculations Linked To HorizontalAlignment And
+        VerticalAlignment Are Done In This Function."""
+
+        for pos, item in self._items.items():
+            widget, horizontalalignment, verticalalignment = item.widget, item.horizontalalignment, item.verticalalignment
+
+            rect = self.GetFieldRect(pos)
+            widgetsize = widget.GetSize()
+
+            rect = self.GetFieldRect(pos)
+
+            if horizontalalignment == ESB_EXACT_FIT:
+
+                if verticalalignment == ESB_EXACT_FIT:
+                    # 1 September 2015 Fix fit align
+                    widget.SetSize((rect.width-4, rect.height-4))
+                    widget.SetPosition((rect.x+2, rect.y+2))
+                elif verticalalignment == ESB_ALIGN_CENTER_VERTICAL:
+                    if widgetsize[1] < rect.width - 1:
+                        diffs = (rect.height - widgetsize[1])/2
+                        widget.SetSize((rect.width-2, widgetsize[1]))
+                        widget.SetPosition((rect.x-1, rect.y+diffs))
+                    else:
+                        widget.SetSize((rect.width-2, widgetsize[1]))
+                        widget.SetPosition((rect.x-1, rect.y-1))
+                elif verticalalignment == ESB_ALIGN_TOP:
+                    widget.SetSize((rect.width-2, widgetsize[1]))
+                    widget.SetPosition((rect.x-1, rect.y))
+                elif verticalalignment == ESB_ALIGN_BOTTOM:
+                    widget.SetSize((rect.width-2, widgetsize[1]))
+                    widget.SetPosition((rect.x-1, rect.height-widgetsize[1]))
+
+            elif horizontalalignment == ESB_ALIGN_LEFT:
+
+                xpos = rect.x - 1
+                if verticalalignment == ESB_EXACT_FIT:
+                    widget.SetSize((widgetsize[0], rect.height-2))
+                    widget.SetPosition((xpos, rect.y-1))
+                elif verticalalignment == ESB_ALIGN_CENTER_VERTICAL:
+                    if widgetsize[1] < rect.height - 1:
+                        diffs = (rect.height - widgetsize[1]) // 2
+                        widget.SetPosition((xpos, rect.y+diffs))
+                    else:
+                        widget.SetSize((widgetsize[0], rect.height-2))
+                        widget.SetPosition((xpos, rect.y-1))
+                elif verticalalignment == ESB_ALIGN_TOP:
+                    widget.SetPosition((xpos, rect.y))
+                elif verticalalignment == ESB_ALIGN_BOTTOM:
+                    widget.SetPosition((xpos, rect.height-widgetsize[1]))
+
+            elif horizontalalignment == ESB_ALIGN_RIGHT:
+
+                xpos = rect.x + rect.width - widgetsize[0] - 1
+                if verticalalignment == ESB_EXACT_FIT:
+                    widget.SetSize((widgetsize[0], rect.height-2))
+                    widget.SetPosition((xpos, rect.y-1))
+                elif verticalalignment == ESB_ALIGN_CENTER_VERTICAL:
+                    if widgetsize[1] < rect.height - 1:
+                        diffs = (rect.height - widgetsize[1]) // 2
+                        widget.SetPosition((xpos, rect.y+diffs))
+                    else:
+                        widget.SetSize((widgetsize[0], rect.height-2))
+                        widget.SetPosition((xpos, rect.y-1))
+                elif verticalalignment == ESB_ALIGN_TOP:
+                    widget.SetPosition((xpos, rect.y))
+                elif verticalalignment == ESB_ALIGN_BOTTOM:
+                    widget.SetPosition((xpos, rect.height-widgetsize[1]))
+
+            elif horizontalalignment == ESB_ALIGN_CENTER_HORIZONTAL:
+
+                xpos = rect.x + (rect.width - widgetsize[0]) // 2 - 1
+                if verticalalignment == ESB_EXACT_FIT:
+                    widget.SetSize((widgetsize[0], rect.height))
+                    widget.SetPosition((xpos, rect.y))
+                elif verticalalignment == ESB_ALIGN_CENTER_VERTICAL:
+                    if widgetsize[1] < rect.height - 1:
+                        diffs = (rect.height - widgetsize[1]) // 2
+                        widget.SetPosition((xpos, rect.y+diffs))
+                    else:
+                        widget.SetSize((widgetsize[0], rect.height-1))
+                        widget.SetPosition((xpos, rect.y+1))
+                elif verticalalignment == ESB_ALIGN_TOP:
+                    widget.SetPosition((xpos, rect.y))
+                elif verticalalignment == ESB_ALIGN_BOTTOM:
+                    widget.SetPosition((xpos, rect.height-widgetsize[1]))
+
+        if event is not None:
+            event.Skip()
+
+    def AddWidget(self, widget, horizontalalignment=ESB_ALIGN_CENTER_HORIZONTAL,
+                  verticalalignment=ESB_ALIGN_CENTER_VERTICAL, pos=-1):
+        """Add A Widget To The EnhancedStatusBar.
+
+        Parameters:
+
+        - horizontalalignment: This Can Be One Of:
+          a) ESB_EXACT_FIT: The Widget Will Fit Horizontally The StatusBar Field Width;
+          b) ESB_ALIGN_CENTER_HORIZONTAL: The Widget Will Be Centered Horizontally In
+             The StatusBar Field;
+          c) ESB_ALIGN_LEFT: The Widget Will Be Left Aligned In The StatusBar Field;
+          d) ESB_ALIGN_RIGHT: The Widget Will Be Right Aligned In The StatusBar Field;
+
+        - verticalalignment:
+          a) ESB_EXACT_FIT: The Widget Will Fit Vertically The StatusBar Field Height;
+          b) ESB_ALIGN_CENTER_VERTICAL: The Widget Will Be Centered Vertically In
+             The StatusBar Field;
+          c) ESB_ALIGN_BOTTOM: The Widget Will Be Bottom Aligned In The StatusBar Field;
+          d) ESB_ALIGN_TOP: The Widget Will Be TOP Aligned In The StatusBar Field;
+
+        """
+
+        if pos == -1:
+            pos = self._curPos
+            self._curPos += 1
+
+        if self.GetFieldsCount() <= pos:
+            raise ValueError("\nERROR: EnhancedStatusBar has a max of %d items, you tried to set item #%d" %
+                             (self.GetFieldsCount(), pos))
+
+        if horizontalalignment not in [ESB_ALIGN_CENTER_HORIZONTAL, ESB_EXACT_FIT,
+                                       ESB_ALIGN_LEFT, ESB_ALIGN_RIGHT]:
+            raise ValueError('\nERROR: Parameter "horizontalalignment" Should Be One Of '
+                             '"ESB_ALIGN_CENTER_HORIZONTAL", "ESB_ALIGN_LEFT", "ESB_ALIGN_RIGHT"'
+                             '"ESB_EXACT_FIT"')
+
+        if verticalalignment not in [ESB_ALIGN_CENTER_VERTICAL, ESB_EXACT_FIT,
+                                     ESB_ALIGN_TOP, ESB_ALIGN_BOTTOM]:
+            raise ValueError('\nERROR: Parameter "verticalalignment" Should Be One Of '
+                             '"ESB_ALIGN_CENTER_VERTICAL", "ESB_ALIGN_TOP", "ESB_ALIGN_BOTTOM"'
+                             '"ESB_EXACT_FIT"')
+
+        try:
+            self.RemoveChild(self._items[pos].widget)
+            self._items[pos].widget.Destroy()
+        except KeyError:
+            pass
+
+        self._items[pos] = EnhancedStatusBarItem(widget, pos, horizontalalignment, verticalalignment)
+
+        wx.CallAfter(self.OnSize, None)
--- a/controls/FolderTree.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/FolderTree.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,14 +22,18 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import os
 
 import wx
+from six.moves import xrange
 
 from util.BitmapLibrary import GetBitmap
 
 DRIVE, FOLDER, FILE = range(3)
 
+
 def sort_folder(x, y):
     if x[1] == y[1]:
         return cmp(x[0], y[0])
@@ -38,6 +42,7 @@
     else:
         return 1
 
+
 def splitpath(path):
     head, tail = os.path.split(path)
     if head == "":
@@ -46,20 +51,21 @@
         return splitpath(head)
     return splitpath(head) + [tail]
 
+
 class FolderTree(wx.Panel):
-    
+
     def __init__(self, parent, folder, filter=None, editable=True):
         wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL)
-        
+
         main_sizer = wx.BoxSizer(wx.VERTICAL)
-        
-        self.Tree = wx.TreeCtrl(self, 
-              style=wx.TR_HAS_BUTTONS|
-                    wx.TR_SINGLE|
-                    wx.SUNKEN_BORDER|
-                    wx.TR_HIDE_ROOT|
-                    wx.TR_LINES_AT_ROOT|
-                    wx.TR_EDIT_LABELS)
+
+        self.Tree = wx.TreeCtrl(self,
+                                style=(wx.TR_HAS_BUTTONS |
+                                       wx.TR_SINGLE |
+                                       wx.SUNKEN_BORDER |
+                                       wx.TR_HIDE_ROOT |
+                                       wx.TR_LINES_AT_ROOT |
+                                       wx.TR_EDIT_LABELS))
         if wx.Platform == '__WXMSW__':
             self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnTreeItemExpanded, self.Tree)
             self.Tree.Bind(wx.EVT_LEFT_DOWN, self.OnTreeLeftDown)
@@ -69,19 +75,19 @@
         self.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT, self.OnTreeBeginLabelEdit, self.Tree)
         self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self.OnTreeEndLabelEdit, self.Tree)
         main_sizer.AddWindow(self.Tree, 1, flag=wx.GROW)
-        
+
         if filter is not None:
             self.Filter = wx.ComboBox(self, style=wx.CB_READONLY)
             self.Bind(wx.EVT_COMBOBOX, self.OnFilterChanged, self.Filter)
             main_sizer.AddWindow(self.Filter, flag=wx.GROW)
         else:
             self.Filter = None
-        
+
         self.SetSizer(main_sizer)
-        
+
         self.Folder = folder
         self.Editable = editable
-        
+
         self.TreeImageList = wx.ImageList(16, 16)
         self.TreeImageDict = {}
         for item_type, bitmap in [(DRIVE, "tree_drive"),
@@ -89,7 +95,7 @@
                                   (FILE, "tree_file")]:
             self.TreeImageDict[item_type] = self.TreeImageList.Add(GetBitmap(bitmap))
         self.Tree.SetImageList(self.TreeImageList)
-        
+
         self.Filters = {}
         if self.Filter is not None:
             filter_parts = filter.split("|")
@@ -101,11 +107,11 @@
                 self.Filter.Append(filter_parts[idx])
                 if idx == 0:
                     self.Filter.SetStringSelection(filter_parts[idx])
-                
+
             self.CurrentFilter = self.Filters[self.Filter.GetStringSelection()]
         else:
             self.CurrentFilter = ""
-    
+
     def _GetFolderChildren(self, folderpath, recursive=True):
         items = []
         if wx.Platform == '__WXMSW__' and folderpath == "/":
@@ -116,7 +122,7 @@
         else:
             try:
                 files = os.listdir(folderpath)
-            except:
+            except Exception:
                 return []
             for filename in files:
                 if not filename.startswith("."):
@@ -127,25 +133,25 @@
                         else:
                             children = 0
                         items.append((filename, FOLDER, children))
-                    elif (self.CurrentFilter == "" or 
+                    elif (self.CurrentFilter == "" or
                           os.path.splitext(filename)[1] == self.CurrentFilter):
                         items.append((filename, FILE, None))
         if recursive:
             items.sort(sort_folder)
         return items
-    
+
     def SetFilter(self, filter):
         self.CurrentFilter = filter
-    
+
     def GetTreeCtrl(self):
         return self.Tree
-    
+
     def RefreshTree(self):
         root = self.Tree.GetRootItem()
         if not root.IsOk():
             root = self.Tree.AddRoot("")
         self.GenerateTreeBranch(root, self.Folder)
-        
+
     def GenerateTreeBranch(self, root, folderpath):
         item, item_cookie = self.Tree.GetFirstChild(root)
         for idx, (filename, item_type, children) in enumerate(self._GetFolderChildren(folderpath)):
@@ -172,18 +178,18 @@
     def ExpandItem(self, item):
         self.GenerateTreeBranch(item, self.GetPath(item))
         self.Tree.Expand(item)
-    
+
     def OnTreeItemActivated(self, event):
         self.ExpandItem(event.GetItem())
         event.Skip()
-    
+
     def OnTreeLeftDown(self, event):
         item, flags = self.Tree.HitTest(event.GetPosition())
         if flags & wx.TREE_HITTEST_ONITEMBUTTON and not self.Tree.IsExpanded(item):
             self.ExpandItem(item)
         else:
             event.Skip()
-    
+
     def OnTreeItemExpanded(self, event):
         item = event.GetItem()
         self.GenerateTreeBranch(item, self.GetPath(item))
@@ -201,7 +207,7 @@
             event.Skip()
         else:
             event.Veto()
-    
+
     def OnTreeEndLabelEdit(self, event):
         new_name = event.GetLabel()
         if new_name != "":
@@ -212,20 +218,20 @@
                     os.rename(old_filepath, new_filepath)
                     event.Skip()
                 else:
-                    message =  wx.MessageDialog(self, 
-                        _("File '%s' already exists!") % new_name, 
-                        _("Error"), wx.OK|wx.ICON_ERROR)
+                    message = wx.MessageDialog(self,
+                                               _("File '%s' already exists!") % new_name,
+                                               _("Error"), wx.OK | wx.ICON_ERROR)
                     message.ShowModal()
                     message.Destroy()
                     event.Veto()
         else:
             event.Skip()
-    
+
     def OnFilterChanged(self, event):
         self.CurrentFilter = self.Filters[self.Filter.GetStringSelection()]
         self.RefreshTree()
         event.Skip()
-    
+
     def _SelectItem(self, root, parts):
         if len(parts) == 0:
             self.Tree.SelectItem(root)
@@ -233,22 +239,22 @@
             item, item_cookie = self.Tree.GetFirstChild(root)
             while item.IsOk():
                 if self.Tree.GetItemText(item) == parts[0]:
-                    if (self.Tree.ItemHasChildren(item) and 
-                        not self.Tree.IsExpanded(item)):
+                    if self.Tree.ItemHasChildren(item) and \
+                       not self.Tree.IsExpanded(item):
                         self.Tree.Expand(item)
                         wx.CallAfter(self._SelectItem, item, parts[1:])
                     else:
                         self._SelectItem(item, parts[1:])
                     return
                 item, item_cookie = self.Tree.GetNextChild(root, item_cookie)
-    
+
     def SetPath(self, path):
         if path.startswith(self.Folder):
             root = self.Tree.GetRootItem()
             if root.IsOk():
                 relative_path = path.replace(os.path.join(self.Folder, ""), "")
                 self._SelectItem(root, splitpath(relative_path))
-    
+
     def GetPath(self, item=None):
         if item is None:
             item = self.Tree.GetSelection()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/controls/IDBrowser.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,219 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+import os
+import wx
+import wx.dataview as dv
+import PSKManagement as PSK
+from PSKManagement import *
+from dialogs.IDMergeDialog import IDMergeDialog
+
+class IDBrowserModel(dv.PyDataViewIndexListModel):
+    def __init__(self, project_path, columncount):
+        self.project_path = project_path
+        self.columncount = columncount
+        self.data = PSK.GetData(project_path)
+        dv.PyDataViewIndexListModel.__init__(self, len(self.data))
+
+    def _saveData(self):
+        PSK.SaveData(self.project_path, self.data)
+
+    def GetColumnType(self, col):
+        return "string"
+
+    def GetValueByRow(self, row, col):
+        return self.data[row][col]
+
+    def SetValueByRow(self, value, row, col):
+        self.data[row][col] = value
+        self._saveData()
+
+    def GetColumnCount(self):
+        return len(self.data[0]) if self.data else self.columncount
+
+    def GetCount(self):
+        return len(self.data)
+    
+    def Compare(self, item1, item2, col, ascending):
+        if not ascending: # swap sort order?
+            item2, item1 = item1, item2
+        row1 = self.GetRow(item1)
+        row2 = self.GetRow(item2)
+        if col == 0:
+            return cmp(int(self.data[row1][col]), int(self.data[row2][col]))
+        else:
+            return cmp(self.data[row1][col], self.data[row2][col])
+
+    def DeleteRows(self, rows):
+        rows = list(rows)
+        rows.sort(reverse=True)
+        
+        for row in rows:
+            PSK.DeleteID(self.project_path, self.data[row][COL_ID])
+            del self.data[row]
+            self.RowDeleted(row)
+        self._saveData()
+            
+    def AddRow(self, value):
+        self.data.append(value)
+        self.RowAppended()
+        self._saveData()
+
+    def Import(self, filepath, sircb):
+        data = PSK.ImportIDs(self.project_path, filepath, sircb)
+        if data is not None:
+            self.data = data
+            self.Reset(len(self.data)) 
+
+    def Export(self, filepath):
+        PSK.ExportIDs(self.project_path, filepath)
+
+colflags = dv.DATAVIEW_COL_RESIZABLE|dv.DATAVIEW_COL_SORTABLE
+
+class IDBrowser(wx.Panel):
+    def __init__(self, parent, ctr, SelectURICallBack=None, SelectIDCallBack=None, **kwargs):
+        big = self.isManager = SelectURICallBack is None and SelectIDCallBack is None 
+        wx.Panel.__init__(self, parent, -1, size=(800 if big else 450,
+                                                  600 if big else 200))
+
+        self.SelectURICallBack = SelectURICallBack
+        self.SelectIDCallBack = SelectIDCallBack
+
+        dvStyle = wx.BORDER_THEME | dv.DV_ROW_LINES
+        if self.isManager :
+            # no multiple selection in selector mode
+            dvStyle |= dv.DV_MULTIPLE
+        self.dvc = dv.DataViewCtrl(self, style = dvStyle)
+                    
+        args = lambda *a,**k:(a,k)
+
+        ColumnsDesc = [
+            args(_("ID"), COL_ID, width = 70),
+            args(_("Last URI"), COL_URI, width = 300 if big else 80),
+            args(_("Description"), COL_DESC, width = 300 if big else 200, 
+                mode = dv.DATAVIEW_CELL_EDITABLE 
+                       if self.isManager 
+                       else dv.DATAVIEW_CELL_INERT),
+            args(_("Last connection"),  COL_LAST, width = 120),
+        ]
+
+        self.model = IDBrowserModel(ctr.ProjectPath, len(ColumnsDesc))
+        self.dvc.AssociateModel(self.model)
+
+        col_list = []
+        for a,k in ColumnsDesc:
+            col_list.append(
+                self.dvc.AppendTextColumn(*a,**dict(k, flags = colflags)))
+        col_list[COL_LAST].SetSortOrder(False)
+
+        # TODO : sort by last bvisit by default
+
+        self.Sizer = wx.BoxSizer(wx.VERTICAL) 
+        self.Sizer.Add(self.dvc, 1, wx.EXPAND)
+
+        btnbox = wx.BoxSizer(wx.HORIZONTAL)
+        if self.isManager :
+
+            # deletion of secret and metadata
+            deleteButton = wx.Button(self, label=_("Delete ID"))
+            self.Bind(wx.EVT_BUTTON, self.OnDeleteButton, deleteButton)
+            btnbox.Add(deleteButton, 0, wx.LEFT|wx.RIGHT, 5)
+
+            # export all
+            exportButton = wx.Button(self, label=_("Export all"))
+            self.Bind(wx.EVT_BUTTON, self.OnExportButton, exportButton)
+            btnbox.Add(exportButton, 0, wx.LEFT|wx.RIGHT, 5)
+
+            # import with a merge -> duplicates are asked for
+            importButton = wx.Button(self, label=_("Import"))
+            self.Bind(wx.EVT_BUTTON, self.OnImportButton, importButton)
+            btnbox.Add(importButton, 0, wx.LEFT|wx.RIGHT, 5)
+
+        else :
+            # selector mode
+            self.useURIButton = wx.Button(self, label=_("Use last URI"))
+            self.Bind(wx.EVT_BUTTON, self.OnUseURIButton, self.useURIButton)
+            self.useURIButton.Disable()
+            btnbox.Add(self.useURIButton, 0, wx.LEFT|wx.RIGHT, 5)
+
+        self.Sizer.Add(btnbox, 0, wx.TOP|wx.BOTTOM, 5)
+        self.Bind(dv.EVT_DATAVIEW_SELECTION_CHANGED, self.OnSelectionChanged, self.dvc)
+
+
+    def OnDeleteButton(self, evt):
+        items = self.dvc.GetSelections()
+        rows = [self.model.GetRow(item) for item in items]
+
+        # Ask if user really wants to delete
+        if wx.MessageBox(_('Are you sure to delete selected IDs?'),
+                         _('Delete IDs'),
+                             wx.YES_NO | wx.CENTRE | wx.NO_DEFAULT) != wx.YES:
+            return
+
+        self.model.DeleteRows(rows)
+
+    def OnSelectionChanged(self, evt):
+        if not self.isManager :
+            items = self.dvc.GetSelections()
+            somethingSelected = len(items) > 0
+            self.useURIButton.Enable(somethingSelected)
+            if somethingSelected:
+                row = self.model.GetRow(items[0])
+                ID = self.model.GetValueByRow(row, COL_ID)
+                self.SelectIDCallBack(ID)
+
+
+    def OnUseURIButton(self, evt):
+        row = self.model.GetRow(self.dvc.GetSelections()[0])
+        URI = self.model.GetValueByRow(row, COL_URI)
+        if URI:
+            self.SelectURICallBack(URI)
+
+    def OnExportButton(self, evt):
+        dialog = wx.FileDialog(self, _("Choose a file"),
+                               wildcard = _("PSK ZIP files (*.zip)|*.zip"), 
+                               style = wx.SAVE | wx.OVERWRITE_PROMPT)
+        if dialog.ShowModal() == wx.ID_OK:
+            self.model.Export(dialog.GetPath())
+
+    def ShouldIReplaceCallback(self,existing,replacement):
+        ID,URI,DESC,LAST = existing
+        _ID,_URI,_DESC,_LAST = replacement
+        dlg = IDMergeDialog(self, 
+            _("Import IDs"), 
+            (_("Replace information for ID {ID} ?") + "\n\n" +
+             _("Existing:") + "\n    " +
+             _("Description:") + " {DESC}\n    " +
+             _("Last known URI:") + " {URI}\n    " +
+             _("Last connection:") + " {LAST}\n\n" +
+             _("Replacement:") + "\n    " +
+             _("Description:") + " {_DESC}\n    " +
+             _("Last known URI:") + " {_URI}\n    " +
+             _("Last connection:") + " {_LAST}\n").format(**locals()),
+            _("Do the same for following IDs"),
+            [_("Replace"), _("Keep"),_("Cancel")])
+
+        answer = dlg.ShowModal() # return value ignored as we have "Ok" only anyhow
+        if answer == wx.ID_CANCEL:
+            return CANCEL
+
+        if dlg.OptionChecked():
+            if answer == wx.ID_YES:
+                return REPLACE_ALL
+            return KEEP_ALL
+        else:
+            if answer == wx.ID_YES:
+                return REPLACE
+            return KEEP
+
+    def OnImportButton(self, evt):
+        dialog = wx.FileDialog(self, _("Choose a file"),
+                               wildcard = _("PSK ZIP files (*.zip)|*.zip"), 
+                               style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)
+        if dialog.ShowModal() == wx.ID_OK:
+            self.model.Import(dialog.GetPath(),
+                              self.ShouldIReplaceCallback)
+
--- a/controls/LibraryPanel.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/LibraryPanel.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,27 +22,31 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+from __future__ import absolute_import
+from functools import reduce
 import wx
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                                 Helpers
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 [CATEGORY, BLOCK] = range(2)
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                              Library Panel
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a panel displaying a tree containing an hierarchical list
-of functions and function blocks available in project an a search control for
-quickly find one functions or function blocks in this list and a text control
-displaying informations about selected functions or function blocks
-"""
+# -------------------------------------------------------------------------------
+
 
 class LibraryPanel(wx.Panel):
-    
+    """
+    Class that implements a panel displaying a tree containing an hierarchical list
+    of functions and function blocks available in project an a search control for
+    quickly find one functions or function blocks in this list and a text control
+    displaying informations about selected functions or function blocks
+    """
+
     def __init__(self, parent, enable_drag=False):
         """
         Constructor
@@ -51,19 +55,19 @@
         be drag'n drop from LibraryPanel (default: False)
         """
         wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL)
-        
+
         # Define LibraryPanel main sizer
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(1)
-        
+
         # Add SearchCtrl to main sizer
         self.SearchCtrl = wx.SearchCtrl(self)
         # Add a button with a magnifying glass, essentially to show that this
         # control is for searching in tree
         self.SearchCtrl.ShowSearchButton(True)
         self.Bind(wx.EVT_TEXT, self.OnSearchCtrlChanged, self.SearchCtrl)
-        self.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN, 
+        self.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN,
                   self.OnSearchButtonClick, self.SearchCtrl)
         # Bind keyboard event on SearchCtrl text control to catch UP and DOWN
         # for search previous and next occurrence
@@ -74,56 +78,56 @@
             search_textctrl.Bind(wx.EVT_CHAR, self.OnKeyDown)
 
         main_sizer.AddWindow(self.SearchCtrl, flag=wx.GROW)
-        
+
         # Add Splitter window for tree and block comment to main sizer
         splitter_window = wx.SplitterWindow(self)
         splitter_window.SetSashGravity(1.0)
         main_sizer.AddWindow(splitter_window, flag=wx.GROW)
-        
+
         # Add TreeCtrl for functions and function blocks library in splitter
         # window
         self.Tree = wx.TreeCtrl(splitter_window,
-              size=wx.Size(0, 0),  
-              style=wx.TR_HAS_BUTTONS|
-                    wx.TR_SINGLE|
-                    wx.SUNKEN_BORDER|
-                    wx.TR_HIDE_ROOT|
-                    wx.TR_LINES_AT_ROOT)
+                                size=wx.Size(0, 0),
+                                style=(wx.TR_HAS_BUTTONS |
+                                       wx.TR_SINGLE |
+                                       wx.SUNKEN_BORDER |
+                                       wx.TR_HIDE_ROOT |
+                                       wx.TR_LINES_AT_ROOT))
         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeItemSelected, self.Tree)
         self.Tree.Bind(wx.EVT_CHAR, self.OnKeyDown)
         # If drag'n drop is enabled, bind event generated when a drag begins on
         # tree to start a drag'n drop
         if enable_drag:
             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTreeBeginDrag, self.Tree)
-        
+
         # Add TextCtrl for function and function block informations
-        self.Comment = wx.TextCtrl(splitter_window, size=wx.Size(0, 80), 
-              style=wx.TE_READONLY|wx.TE_MULTILINE)
-        
+        self.Comment = wx.TextCtrl(splitter_window, size=wx.Size(0, 80),
+                                   style=wx.TE_READONLY | wx.TE_MULTILINE)
+
         splitter_window.SplitHorizontally(self.Tree, self.Comment, -80)
-        
+
         self.SetSizer(main_sizer)
-        
+
         # Reference to the project controller
         self.Controller = None
-        
+
         # Variable storing functions and function blocks library to display
         self.BlockList = None
-    
+
     def __del__(self):
         """
         Destructor
         """
         # Remove reference to project controller
         self.Controller = None
-    
+
     def SetController(self, controller):
         """
         Set reference to project controller
         @param controller: Reference to project controller
         """
         self.Controller = controller
-    
+
     def SetBlockList(self, blocklist):
         """
         Set function and function block library to display in TreeCtrl
@@ -133,15 +137,15 @@
         self.BlockList = blocklist
         # Refresh TreeCtrl values
         self.RefreshTree()
-    
+
     def SetFocus(self):
         """
         Called to give focus to LibraryPanel
-        Override wx.Window SetFocus method 
+        Override wx.Window SetFocus method
         """
         # Give focus to SearchCtrl
         self.SearchCtrl.SetFocus()
-    
+
     def ResetTree(self):
         """
         Reset LibraryPanel values displayed in controls
@@ -150,7 +154,7 @@
         self.SearchCtrl.SetValue("")
         self.Tree.DeleteAllItems()
         self.Comment.SetValue("")
-    
+
     def RefreshTree(self):
         """
         Refresh LibraryPanel values displayed in controls
@@ -160,35 +164,35 @@
         if blocktypes is None and self.Controller is not None:
             # Get library from project controller if not defined
             blocktypes = self.Controller.GetBlockTypes()
-        
+
         # Refresh TreeCtrl values if a library is defined
         if blocktypes is not None:
             # List that will contain tree items to be deleted when TreeCtrl
             # will be refreshed
             items_to_delete = []
-            
+
             # Get current selected item for selected it when values refreshed
             selected_item = self.Tree.GetSelection()
             selected_pydata = (self.Tree.GetPyData(selected_item)
-                               if selected_item.IsOk() and
-                                  selected_item != self.Tree.GetRootItem()
+                               if (selected_item.IsOk() and
+                                   selected_item != self.Tree.GetRootItem())
                                else None)
             # Don't save selected item if it is a category
             selected_infos = ((self.Tree.GetItemText(selected_item),
                                selected_pydata["inputs"])
-                             if selected_pydata is not None and
-                                selected_pydata["type"] == BLOCK
-                             else (None, None))
-            
+                              if (selected_pydata is not None and
+                                  selected_pydata["type"] == BLOCK)
+                              else (None, None))
+
             # Get TreeCtrl root item (hidden)
             root = self.Tree.GetRootItem()
             if not root.IsOk():
                 # Create root if not present
                 root = self.Tree.AddRoot("")
-            
+
             # Iterate over functions and function blocks library categories and
             # add a tree item to root item for each of them
-            
+
             # Get first child under root item
             category_item, root_cookie = self.Tree.GetFirstChild(root)
             for category in blocktypes:
@@ -196,11 +200,11 @@
                 # extracting translated strings for gettext to consider "name"
                 # to be translated
                 category_name = category["name"]
-                
+
                 # Tree item already exists, set item label
                 if category_item.IsOk():
                     self.Tree.SetItemText(category_item, _(category_name))
-                
+
                 # Tree item doesn't exist, add new one to root
                 else:
                     category_item = self.Tree.AppendItem(root, _(category_name))
@@ -209,83 +213,83 @@
                     if wx.Platform != '__WXMSW__':
                         category_item, root_cookie = \
                             self.Tree.GetNextChild(root, root_cookie)
-                
-                # Set data associated to tree item (only save that item is a 
+
+                # Set data associated to tree item (only save that item is a
                 # category)
-                self.Tree.SetPyData(category_item, {"type" : CATEGORY})
-                
+                self.Tree.SetPyData(category_item, {"type": CATEGORY})
+
                 # Iterate over functions and function blocks defined in library
-                # category add a tree item to category tree item for each of 
+                # category add a tree item to category tree item for each of
                 # them
-                
+
                 # Get first child under category tree item
                 blocktype_item, category_cookie = \
                     self.Tree.GetFirstChild(category_item)
                 for blocktype in category["list"]:
-                    
+
                     # Tree item already exists, set item label
                     if blocktype_item.IsOk():
                         self.Tree.SetItemText(blocktype_item, blocktype["name"])
-                    
+
                     # Tree item doesn't exist, add new one to category item
                     else:
                         blocktype_item = self.Tree.AppendItem(
-                                            category_item, blocktype["name"])
+                            category_item, blocktype["name"])
                         # See comment when adding category
                         if wx.Platform != '__WXMSW__':
                             blocktype_item, category_cookie = \
-                                self.Tree.GetNextChild(category_item, 
+                                self.Tree.GetNextChild(category_item,
                                                        category_cookie)
-                    
+
                     # Define data to associate to block tree item
                     comment = blocktype["comment"]
-                    block_data = {"type" : BLOCK, 
-                                  "block_type" : blocktype["type"], 
-                                  "inputs" : tuple([type 
-                                                    for name, type, modifier
-                                                    in blocktype["inputs"]]), 
-                                  "extension" : (len(blocktype["inputs"])
-                                                 if blocktype["extensible"]
-                                                 else None),
-                                  "comment": _(comment) + 
-                                             blocktype.get("usage", "")}
+                    block_data = {
+                        "type":       BLOCK,
+                        "block_type": blocktype["type"],
+                        "inputs":     tuple([type
+                                             for _name, type, _modifier
+                                             in blocktype["inputs"]]),
+                        "extension":  (len(blocktype["inputs"])
+                                       if blocktype["extensible"] else None),
+                        "comment":    _(comment) + blocktype.get("usage", "")
+                    }
                     self.Tree.SetPyData(blocktype_item, block_data)
-                    
+
                     # Select block tree item in tree if it corresponds to
                     # previously selected one
-                    if selected_infos == (blocktype["name"], 
+                    if selected_infos == (blocktype["name"],
                                           blocktype["inputs"]):
                         self.Tree.SelectItem(blocktype_item)
-                        
+
                         # Update TextCtrl value
                         self.Comment.SetValue(block_data["comment"])
-                
+
                     # Get next block tree item under category tree item
                     blocktype_item, category_cookie = \
                         self.Tree.GetNextChild(category_item, category_cookie)
-                
+
                 # Add every remaining tree item under category tree item after
                 # updating all block items to the list of items to delete
                 while blocktype_item.IsOk():
                     items_to_delete.append(blocktype_item)
                     blocktype_item, category_cookie = \
                         self.Tree.GetNextChild(category_item, category_cookie)
-                
+
                 # Get next category tree item under root item
                 category_item, root_cookie = \
                     self.Tree.GetNextChild(root, root_cookie)
-            
-            # Add every remaining tree item under root item after updating all 
+
+            # Add every remaining tree item under root item after updating all
             # category items to the list of items to delete
             while category_item.IsOk():
                 items_to_delete.append(category_item)
                 category_item, root_cookie = \
                     self.Tree.GetNextChild(root, root_cookie)
-            
+
             # Remove all items in list of items to delete from TreeCtrl
             for item in items_to_delete:
                 self.Tree.Delete(item)
-    
+
     def GetSelectedBlock(self):
         """
         Get selected block informations
@@ -295,20 +299,20 @@
         # Get selected item associated data in tree
         selected_item = self.Tree.GetSelection()
         selected_pydata = (self.Tree.GetPyData(selected_item)
-                           if selected_item.IsOk() and
-                              selected_item != self.Tree.GetRootItem()
+                           if (selected_item.IsOk() and
+                               selected_item != self.Tree.GetRootItem())
                            else None)
-        
+
         # Return value is None if selected tree item is root or a category
-        return ({"type": self.Tree.GetItemText(selected_item), 
+        return ({"type": self.Tree.GetItemText(selected_item),
                  "inputs": selected_pydata["inputs"]}
-                if selected_pydata is not None and 
-                   selected_pydata["type"] == BLOCK
+                if (selected_pydata is not None and
+                    selected_pydata["type"] == BLOCK)
                 else None)
-    
+
     def SelectTreeItem(self, name, inputs):
         """
-        Select Tree item corresponding to block informations given 
+        Select Tree item corresponding to block informations given
         @param name: Block type name
         @param inputs: List of block inputs type [input_type,...]
         """
@@ -318,8 +322,8 @@
             # Select tree item found
             self.Tree.SelectItem(item)
             self.Tree.EnsureVisible(item)
-    
-    def FindTreeItem(self, item, name, inputs = None):
+
+    def FindTreeItem(self, item, name, inputs=None):
         """
         Find Tree item corresponding to block informations given
         Function is recursive
@@ -330,12 +334,12 @@
         # Return immediately if item isn't valid
         if not item.IsOk():
             return None
-        
+
         # Get data associated to item to test
         item_pydata = self.Tree.GetPyData(item)
         if item_pydata is not None and item_pydata["type"] == BLOCK:
             # Only test item corresponding to block
-            
+
             # Test if block inputs type are the same than those given
             type_inputs = item_pydata.get("inputs", None)
             type_extension = item_pydata.get("extension", None)
@@ -343,7 +347,7 @@
                 same_inputs = reduce(
                     lambda x, y: x and y,
                     map(
-                        lambda x: x[0]==x[1] or x[0]=='ANY' or x[1]=='ANY',
+                        lambda x: x[0] == x[1] or x[0] == 'ANY' or x[1] == 'ANY',
                         zip(type_inputs,
                             (inputs[:type_extension]
                              if type_extension is not None
@@ -351,11 +355,11 @@
                     True)
             else:
                 same_inputs = True
-            
+
             # Return item if  block data corresponds to informations given
             if self.Tree.GetItemText(item) == name and same_inputs:
                 return item
-        
+
         # Test item children if item doesn't correspond
         child, child_cookie = self.Tree.GetFirstChild(item)
         while child.IsOk():
@@ -363,9 +367,9 @@
             if result:
                 return result
             child, child_cookie = self.Tree.GetNextChild(item, child_cookie)
-        
+
         return None
-    
+
     def SearchInTree(self, value, mode="first"):
         """
         Search in Tree and select item that name contains string given
@@ -378,43 +382,43 @@
         root = self.Tree.GetRootItem()
         if not root.IsOk():
             return False
-        
+
         # Set function to navigate in Tree item sibling according to search
-        # mode defined 
+        # mode defined
         sibling_function = (self.Tree.GetPrevSibling
                             if mode == "previous"
                             else self.Tree.GetNextSibling)
-        
+
         # Get current selected item (for next and previous mode)
         item = self.Tree.GetSelection()
         if not item.IsOk() or mode == "first":
-            item, item_cookie = self.Tree.GetFirstChild(root)
+            item, _item_cookie = self.Tree.GetFirstChild(root)
             selected = None
         else:
             selected = item
-        
+
         # Navigate through tree items until one matching found or reach tree
         # starting or ending
         while item.IsOk():
-            
+
             # Get item data to get item type
             item_pydata = self.Tree.GetPyData(item)
-            
+
             # Item is a block category
             if (item == root) or item_pydata["type"] == CATEGORY:
-                
-                # Get category first or last child according to search mode 
+
+                # Get category first or last child according to search mode
                 # defined
                 child = (self.Tree.GetLastChild(item)
                          if mode == "previous"
                          else self.Tree.GetFirstChild(item)[0])
-                
+
                 # If category has no child, go to sibling category
                 item = (child if child.IsOk() else sibling_function(item))
-            
+
             # Item is a block
             else:
-                
+
                 # Extract item block name
                 name = self.Tree.GetItemText(item)
                 # Test if block name contains string given
@@ -428,17 +432,17 @@
                     self.Tree.SelectItem(item)
                     self.Tree.EnsureVisible(item)
                     return True
-                
+
                 # Go to next item sibling if block not found
                 next = sibling_function(item)
-                
+
                 # If category has no other child, go to next category sibling
                 item = (next
                         if next.IsOk()
                         else sibling_function(self.Tree.GetItemParent(item)))
-        
+
         return False
-    
+
     def OnSearchCtrlChanged(self, event):
         """
         Called when SearchCtrl text control value changed
@@ -447,7 +451,7 @@
         # Search for block containing SearchCtrl value in 'first' mode
         self.SearchInTree(self.SearchCtrl.GetValue())
         event.Skip()
-    
+
     def OnSearchButtonClick(self, event):
         """
         Called when SearchCtrl search button was clicked
@@ -456,7 +460,7 @@
         # Search for block containing SearchCtrl value in 'next' mode
         self.SearchInTree(self.SearchCtrl.GetValue(), "next")
         event.Skip()
-    
+
     def OnTreeItemSelected(self, event):
         """
         Called when tree item is selected
@@ -468,13 +472,13 @@
             item_pydata["comment"]
             if item_pydata is not None and item_pydata["type"] == BLOCK
             else "")
-        
+
         # Call extra function defined when tree item is selected
         if getattr(self, "_OnTreeItemSelected", None) is not None:
             self._OnTreeItemSelected(event)
-        
+
         event.Skip()
-    
+
     def OnTreeBeginDrag(self, event):
         """
         Called when a drag is started in tree
@@ -482,19 +486,19 @@
         """
         selected_item = event.GetItem()
         item_pydata = self.Tree.GetPyData(selected_item)
-        
+
         # Item dragged is a block
         if item_pydata is not None and item_pydata["type"] == BLOCK:
             # Start a drag'n drop
             data = wx.TextDataObject(str(
-                (self.Tree.GetItemText(selected_item), 
-                 item_pydata["block_type"], 
-                 "", 
+                (self.Tree.GetItemText(selected_item),
+                 item_pydata["block_type"],
+                 "",
                  item_pydata["inputs"])))
             dragSource = wx.DropSource(self.Tree)
             dragSource.SetData(data)
             dragSource.DoDragDrop()
-    
+
     def OnKeyDown(self, event):
         """
         Called when key is pressed in SearchCtrl text control
@@ -503,17 +507,17 @@
         # Get event keycode and value in SearchCtrl
         keycode = event.GetKeyCode()
         search_value = self.SearchCtrl.GetValue()
-        
+
         # Up key was pressed and SearchCtrl isn't empty, search for block in
-        # 'previous' mode 
+        # 'previous' mode
         if keycode == wx.WXK_UP and search_value != "":
             self.SearchInTree(search_value, "previous")
-        
+
         # Down key was pressed and SearchCtrl isn't empty, search for block in
-        # 'next' mode 
+        # 'next' mode
         elif keycode == wx.WXK_DOWN and search_value != "":
             self.SearchInTree(search_value, "next")
-        
+
         # Handle key normally
         else:
             event.Skip()
--- a/controls/LocationCellEditor.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/LocationCellEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,36 +22,39 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from dialogs.BrowseLocationsDialog import BrowseLocationsDialog
 
+
 class LocationCellControl(wx.PyControl):
-    
+
     '''
     Custom cell editor control with a text box and a button that launches
     the BrowseLocationsDialog.
     '''
     def __init__(self, parent):
-        wx.Control.__init__(self, parent)
-        
+        wx.PyControl.__init__(self, parent)
+
         main_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(0)
-        
+
         # create location text control
-        self.Location = wx.TextCtrl(self, size=wx.Size(0, -1), 
-              style=wx.TE_PROCESS_ENTER)
+        self.Location = wx.TextCtrl(self, size=wx.Size(0, -1),
+                                    style=wx.TE_PROCESS_ENTER)
         self.Location.Bind(wx.EVT_KEY_DOWN, self.OnLocationChar)
         main_sizer.AddWindow(self.Location, flag=wx.GROW)
-        
+
         # create browse button
         self.BrowseButton = wx.Button(self, label='...', size=wx.Size(30, -1))
         self.BrowseButton.Bind(wx.EVT_BUTTON, self.OnBrowseButtonClick)
         main_sizer.AddWindow(self.BrowseButton, flag=wx.GROW)
-        
+
         self.Bind(wx.EVT_SIZE, self.OnSize)
-        
+
         self.SetSizer(main_sizer)
 
         self.Controller = None
@@ -73,7 +76,7 @@
     def SetValue(self, value):
         self.Default = value
         self.Location.SetValue(value)
-    
+
     def GetValue(self):
         return self.Location.GetValue()
 
@@ -88,15 +91,17 @@
         else:
             infos = None
         dialog.Destroy()
-        
+
         if infos is not None:
             location = infos["location"]
             # set the location
             if not infos["location"].startswith("%"):
-                dialog = wx.SingleChoiceDialog(self, 
-                      _("Select a variable class:"), _("Variable class"), 
-                      [_("Input"), _("Output"), _("Memory")], 
-                      wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
+                dialog = wx.SingleChoiceDialog(
+                    self,
+                    _("Select a variable class:"),
+                    _("Variable class"),
+                    [_("Input"), _("Output"), _("Memory")],
+                    wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
                 if dialog.ShowModal() == wx.ID_OK:
                     selected = dialog.GetSelection()
                 else:
@@ -111,7 +116,7 @@
                     location = "%Q" + location
                 else:
                     location = "%M" + location
-            
+
             self.Location.SetValue(location)
             self.VarType = infos["IEC_type"]
 
@@ -129,24 +134,25 @@
 
     def SetInsertionPoint(self, i):
         self.Location.SetInsertionPoint(i)
-    
+
     def SetFocus(self):
         self.Location.SetFocus()
 
+
 class LocationCellEditor(wx.grid.PyGridCellEditor):
     '''
     Grid cell editor that uses LocationCellControl to display a browse button.
     '''
     def __init__(self, table, controller):
         wx.grid.PyGridCellEditor.__init__(self)
-        
+
         self.Table = table
         self.Controller = controller
 
     def __del__(self):
         self.CellControl = None
         self.Controller = None
-    
+
     def Create(self, parent, id, evt_handler):
         self.CellControl = LocationCellControl(parent)
         self.SetControl(self.CellControl)
@@ -169,20 +175,19 @@
             self.Table.SetValueByName(row, 'Type', self.CellControl.GetVarType())
         self.CellControl.Disable()
         return changed
-        
+
     if wx.VERSION >= (3, 0, 0):
         def EndEdit(self, row, col, grid, oldval):
             return self.EndEditInternal(row, col, grid, oldval)
     else:
         def EndEdit(self, row, col, grid):
-            old_loc = self.Table.GetValueByName(row, 'Location')            
+            old_loc = self.Table.GetValueByName(row, 'Location')
             return self.EndEditInternal(row, col, grid, old_loc)
-    
+
     def SetSize(self, rect):
         self.CellControl.SetDimensions(rect.x + 1, rect.y,
-                                        rect.width, rect.height,
-                                        wx.SIZE_ALLOW_MINUS_ONE)
+                                       rect.width, rect.height,
+                                       wx.SIZE_ALLOW_MINUS_ONE)
 
     def Clone(self):
         return LocationCellEditor(self.Table, self.Controller)
-
--- a/controls/LogViewer.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/LogViewer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -23,30 +23,36 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 
+from __future__ import absolute_import
+from __future__ import division
 from datetime import datetime
 from time import time as gettime
+from weakref import proxy
+
 import numpy
-
 import wx
+from six.moves import xrange
 
 from controls.CustomToolTip import CustomToolTip, TOOLTIP_WAIT_PERIOD
 from editors.DebugViewer import DebugViewer, REFRESH_PERIOD
-from targets.typemapping import LogLevelsCount, LogLevels
+from runtime.loglevels import LogLevelsCount, LogLevels
 from util.BitmapLibrary import GetBitmap
-from weakref import proxy
+
 
 THUMB_SIZE_RATIO = 1. / 8.
 
+
 def ArrowPoints(direction, width, height, xoffset, yoffset):
     if direction == wx.TOP:
         return [wx.Point(xoffset + 1, yoffset + height - 2),
-                wx.Point(xoffset + width / 2, yoffset + 1),
+                wx.Point(xoffset + width // 2, yoffset + 1),
                 wx.Point(xoffset + width - 1, yoffset + height - 2)]
     else:
         return [wx.Point(xoffset + 1, yoffset - height + 1),
-                wx.Point(xoffset + width / 2, yoffset - 2),
+                wx.Point(xoffset + width // 2, yoffset - 2),
                 wx.Point(xoffset + width - 1, yoffset - height + 1)]
 
+
 class LogScrollBar(wx.Panel):
 
     def __init__(self, parent, size):
@@ -58,7 +64,7 @@
         self.Bind(wx.EVT_PAINT, self.OnPaint)
         self.Bind(wx.EVT_SIZE, self.OnResize)
 
-        self.ThumbPosition = 0. # -1 <= ThumbPosition <= 1
+        self.ThumbPosition = 0.  # -1 <= ThumbPosition <= 1
         self.ThumbScrollingStartPos = None
 
     def GetRangeRect(self):
@@ -66,7 +72,7 @@
         return wx.Rect(0, width, width, height - 2 * width)
 
     def GetThumbRect(self):
-        width, height = self.GetClientSize()
+        width, _height = self.GetClientSize()
         range_rect = self.GetRangeRect()
         thumb_size = range_rect.height * THUMB_SIZE_RATIO
         thumb_range = range_rect.height - thumb_size
@@ -115,13 +121,12 @@
 
     def OnMotion(self, event):
         if event.Dragging() and self.ThumbScrollingStartPos is not None:
-            posx, posy = event.GetPosition()
-            width, height = self.GetClientSize()
+            _posx, posy = event.GetPosition()
             range_rect = self.GetRangeRect()
             thumb_size = range_rect.height * THUMB_SIZE_RATIO
             thumb_range = range_rect.height - thumb_size
             self.RefreshThumbPosition(
-                max(-1., min((posy - self.ThumbScrollingStartPos.y) * 2. / thumb_range, 1.)))
+                max(-1., min((posy - self.ThumbScrollingStartPos.y) * 2. // thumb_range, 1.)))
         event.Skip()
 
     def OnResize(self, event):
@@ -143,11 +148,11 @@
         gc.SetPen(wx.Pen(wx.NamedColour("GREY"), 3))
         gc.SetBrush(wx.GREY_BRUSH)
 
-        gc.DrawLines(ArrowPoints(wx.TOP, width * 0.75, width * 0.5, 2, (width + height) / 4 - 3))
-        gc.DrawLines(ArrowPoints(wx.TOP, width * 0.75, width * 0.5, 2, (width + height) / 4 + 3))
-
-        gc.DrawLines(ArrowPoints(wx.BOTTOM, width * 0.75, width * 0.5, 2, (height * 3 - width) / 4 + 3))
-        gc.DrawLines(ArrowPoints(wx.BOTTOM, width * 0.75, width * 0.5, 2, (height * 3 - width) / 4 - 3))
+        gc.DrawLines(ArrowPoints(wx.TOP, width * 0.75, width * 0.5, 2, (width + height) // 4 - 3))
+        gc.DrawLines(ArrowPoints(wx.TOP, width * 0.75, width * 0.5, 2, (width + height) // 4 + 3))
+
+        gc.DrawLines(ArrowPoints(wx.BOTTOM, width * 0.75, width * 0.5, 2, (height * 3 - width) // 4 + 3))
+        gc.DrawLines(ArrowPoints(wx.BOTTOM, width * 0.75, width * 0.5, 2, (height * 3 - width) // 4 - 3))
 
         thumb_rect = self.GetThumbRect()
         exclusion_rect = wx.Rect(thumb_rect.x, thumb_rect.y,
@@ -177,9 +182,11 @@
         dc.EndDrawing()
         event.Skip()
 
+
 BUTTON_SIZE = (70, 15)
 
-class LogButton():
+
+class LogButton(object):
 
     def __init__(self, label, callback):
         self.Position = wx.Point(0, 0)
@@ -217,13 +224,15 @@
 
         w, h = dc.GetTextExtent(self.Label)
         dc.DrawText(self.Label,
-            self.Position.x + (self.Size.width - w) / 2,
-            self.Position.y + (self.Size.height - h) / 2)
+                    self.Position.x + (self.Size.width - w) // 2,
+                    self.Position.y + (self.Size.height - h) // 2)
+
 
 DATE_INFO_SIZE = 10
 MESSAGE_INFO_SIZE = 18
 
-class LogMessage:
+
+class LogMessage(object):
 
     def __init__(self, tv_sec, tv_nsec, level, level_bitmap, msg):
         self.Date = datetime.utcfromtimestamp(tv_sec)
@@ -252,25 +261,26 @@
         if draw_date:
             datetime_text = self.Date.strftime("%d/%m/%y %H:%M")
             dw, dh = dc.GetTextExtent(datetime_text)
-            dc.DrawText(datetime_text, (width - dw) / 2, offset + (DATE_INFO_SIZE - dh) / 2)
+            dc.DrawText(datetime_text, (width - dw) // 2, offset + (DATE_INFO_SIZE - dh) // 2)
             offset += DATE_INFO_SIZE
 
         seconds_text = "%12.9f" % self.Seconds
         sw, sh = dc.GetTextExtent(seconds_text)
-        dc.DrawText(seconds_text, 5, offset + (MESSAGE_INFO_SIZE - sh) / 2)
+        dc.DrawText(seconds_text, 5, offset + (MESSAGE_INFO_SIZE - sh) // 2)
 
         bw, bh = self.LevelBitmap.GetWidth(), self.LevelBitmap.GetHeight()
-        dc.DrawBitmap(self.LevelBitmap, 10 + sw, offset + (MESSAGE_INFO_SIZE - bh) / 2)
+        dc.DrawBitmap(self.LevelBitmap, 10 + sw, offset + (MESSAGE_INFO_SIZE - bh) // 2)
 
         text = self.Message.replace("\n", " ")
-        mw, mh = dc.GetTextExtent(text)
-        dc.DrawText(text, 15 + sw + bw, offset + (MESSAGE_INFO_SIZE - mh) / 2)
+        _mw, mh = dc.GetTextExtent(text)
+        dc.DrawText(text, 15 + sw + bw, offset + (MESSAGE_INFO_SIZE - mh) // 2)
 
     def GetHeight(self, draw_date):
         if draw_date:
             return DATE_INFO_SIZE + MESSAGE_INFO_SIZE
         return MESSAGE_INFO_SIZE
 
+
 SECOND = 1
 MINUTE = 60 * SECOND
 HOUR = 60 * MINUTE
@@ -281,10 +291,11 @@
                             (_("1m"), MINUTE),
                             (_("1s"), SECOND)]
 
+
 class LogViewer(DebugViewer, wx.Panel):
 
     def __init__(self, parent, window):
-        wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER)
+        wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL | wx.SUNKEN_BORDER)
         DebugViewer.__init__(self, None, False, False)
 
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
@@ -292,7 +303,7 @@
         main_sizer.AddGrowableRow(1)
 
         filter_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        main_sizer.AddSizer(filter_sizer, border=5, flag=wx.TOP|wx.LEFT|wx.RIGHT|wx.GROW)
+        main_sizer.AddSizer(filter_sizer, border=5, flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
 
         self.MessageFilter = wx.ComboBox(self, style=wx.CB_READONLY)
         self.MessageFilter.Append(_("All"))
@@ -301,20 +312,20 @@
         for level in levels:
             self.MessageFilter.Append(_(level))
         self.Bind(wx.EVT_COMBOBOX, self.OnMessageFilterChanged, self.MessageFilter)
-        filter_sizer.AddWindow(self.MessageFilter, 1, border=5, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
+        filter_sizer.AddWindow(self.MessageFilter, 1, border=5, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
 
         self.SearchMessage = wx.SearchCtrl(self, style=wx.TE_PROCESS_ENTER)
         self.SearchMessage.ShowSearchButton(True)
         self.SearchMessage.ShowCancelButton(True)
         self.Bind(wx.EVT_TEXT_ENTER, self.OnSearchMessageChanged, self.SearchMessage)
         self.Bind(wx.EVT_SEARCHCTRL_SEARCH_BTN,
-              self.OnSearchMessageSearchButtonClick, self.SearchMessage)
+                  self.OnSearchMessageSearchButtonClick, self.SearchMessage)
         self.Bind(wx.EVT_SEARCHCTRL_CANCEL_BTN,
-              self.OnSearchMessageCancelButtonClick, self.SearchMessage)
-        filter_sizer.AddWindow(self.SearchMessage, 3, border=5, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
+                  self.OnSearchMessageCancelButtonClick, self.SearchMessage)
+        filter_sizer.AddWindow(self.SearchMessage, 3, border=5, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
 
         self.CleanButton = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap("Clean"),
-              size=wx.Size(28, 28), style=wx.NO_BORDER)
+                                                          size=wx.Size(28, 28), style=wx.NO_BORDER)
         self.CleanButton.SetToolTipString(_("Clean log messages"))
         self.Bind(wx.EVT_BUTTON, self.OnCleanButton, self.CleanButton)
         filter_sizer.AddWindow(self.CleanButton)
@@ -322,7 +333,7 @@
         message_panel_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
         message_panel_sizer.AddGrowableCol(0)
         message_panel_sizer.AddGrowableRow(0)
-        main_sizer.AddSizer(message_panel_sizer, border=5, flag=wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.GROW)
+        main_sizer.AddSizer(message_panel_sizer, border=5, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
 
         self.MessagePanel = wx.Panel(self)
         if wx.Platform == '__WXMSW__':
@@ -379,7 +390,7 @@
         self.ScrollTimer.Stop()
 
     def ResetLogMessages(self):
-        self.previous_log_count = [None]*LogLevelsCount
+        self.ResetLogCounters()
         self.OldestMessages = []
         self.LogMessages = []
         self.LogMessagesTimestamp = numpy.array([])
@@ -387,20 +398,23 @@
         self.HasNewData = False
 
     def SetLogSource(self, log_source):
-        self.LogSource = proxy(log_source) if log_source else None
+        self.LogSource = proxy(log_source) if log_source is not None else None
         self.CleanButton.Enable(self.LogSource is not None)
         if log_source is not None:
             self.ResetLogMessages()
-            self.RefreshView()
+            wx.CallAfter(self.RefreshView)
 
     def GetLogMessageFromSource(self, msgidx, level):
         if self.LogSource is not None:
             answer = self.LogSource.GetLogMessage(level, msgidx)
             if answer is not None:
-                msg, tick, tv_sec, tv_nsec = answer
+                msg, _tick, tv_sec, tv_nsec = answer
                 return LogMessage(tv_sec, tv_nsec, level, self.LevelIcons[level], msg)
         return None
 
+    def ResetLogCounters(self):
+        self.previous_log_count = [None]*LogLevelsCount
+
     def SetLogCounters(self, log_count):
         new_messages = []
         for level, count, prev in zip(xrange(LogLevelsCount), log_count, self.previous_log_count):
@@ -410,7 +424,7 @@
                     oldest_message = (-1, None)
                 else:
                     dump_end = prev - 1
-                for msgidx in xrange(count-1, dump_end,-1):
+                for msgidx in xrange(count-1, dump_end, -1):
                     new_message = self.GetLogMessageFromSource(msgidx, level)
                     if new_message is None:
                         if prev is None:
@@ -475,12 +489,12 @@
             msgidx -= 1
         if len(self.LogMessages) > 0:
             message = self.LogMessages[0]
-            for idx, msg in self.OldestMessages:
+            for _idx, msg in self.OldestMessages:
                 if msg is not None and msg > message:
                     message = msg
             while message is not None:
                 level = message.Level
-                oldest_msgidx, oldest_message = self.OldestMessages[level]
+                oldest_msgidx, _oldest_message = self.OldestMessages[level]
                 if oldest_msgidx > 0:
                     message = self.GetLogMessageFromSource(oldest_msgidx - 1, level)
                     if message is not None:
@@ -501,13 +515,13 @@
                         current_message = message
                     self.LogMessages.insert(message_idx, message)
                     self.LogMessagesTimestamp = numpy.insert(
-                            self.LogMessagesTimestamp,
-                            [message_idx],
-                            [message.Timestamp])
+                        self.LogMessagesTimestamp,
+                        [message_idx],
+                        [message.Timestamp])
                     self.CurrentMessage = self.LogMessages.index(current_message)
                     if message_idx == 0 and self.FilterLogMessage(message, timestamp):
                         return message, 0
-                for idx, msg in self.OldestMessages:
+                for _idx, msg in self.OldestMessages:
                     if msg is not None and (message is None or msg > message):
                         message = msg
         return None, None
@@ -549,6 +563,14 @@
 
         self.MessageScrollBar.RefreshThumbPosition()
 
+    def IsPLCLogEmpty(self):
+        empty = True
+        for _level, prev in zip(xrange(LogLevelsCount), self.previous_log_count):
+            if prev is not None:
+                empty = False
+                break
+        return empty
+
     def IsMessagePanelTop(self, message_idx=None):
         if message_idx is None:
             message_idx = self.CurrentMessage
@@ -560,7 +582,7 @@
         if message_idx is None:
             message_idx = self.CurrentMessage
         if message_idx is not None:
-            width, height = self.MessagePanel.GetClientSize()
+            _width, height = self.MessagePanel.GetClientSize()
             offset = 5
             message = self.LogMessages[message_idx]
             draw_date = True
@@ -590,8 +612,8 @@
 
     def ScrollMessagePanelByPage(self, page):
         if self.CurrentMessage is not None:
-            width, height = self.MessagePanel.GetClientSize()
-            message_per_page = max(1, (height - DATE_INFO_SIZE) / MESSAGE_INFO_SIZE - 1)
+            _width, height = self.MessagePanel.GetClientSize()
+            message_per_page = max(1, (height - DATE_INFO_SIZE) // MESSAGE_INFO_SIZE - 1)
             self.ScrollMessagePanel(page * message_per_page)
 
     def ScrollMessagePanelByTimestamp(self, seconds):
@@ -636,7 +658,7 @@
         event.Skip()
 
     def OnCleanButton(self, event):
-        if self.LogSource is not None:
+        if self.LogSource is not None and not self.IsPLCLogEmpty():
             self.LogSource.ResetLogCount()
         self.ResetLogMessages()
         self.RefreshView()
@@ -654,7 +676,7 @@
 
     def GetMessageByScreenPos(self, posx, posy):
         if self.CurrentMessage is not None:
-            width, height = self.MessagePanel.GetClientSize()
+            _width, height = self.MessagePanel.GetClientSize()
             message_idx = self.CurrentMessage
             message = self.LogMessages[message_idx]
             draw_date = True
@@ -736,7 +758,7 @@
         event.Skip()
 
     def OnMessagePanelMouseWheel(self, event):
-        self.ScrollMessagePanel(event.GetWheelRotation() / event.GetWheelDelta())
+        self.ScrollMessagePanel(event.GetWheelRotation() // event.GetWheelDelta())
         event.Skip()
 
     def OnMessagePanelEraseBackground(self, event):
@@ -747,15 +769,15 @@
         event.Skip()
 
     def OnMessagePanelResize(self, event):
-        width, height = self.MessagePanel.GetClientSize()
+        width, _height = self.MessagePanel.GetClientSize()
         offset = 2
         for button in self.LeftButtons:
             button.SetPosition(offset, 2)
-            w, h = button.GetSize()
+            w, _h = button.GetSize()
             offset += w + 2
         offset = width - 2
         for button in self.RightButtons:
-            w, h = button.GetSize()
+            w, _h = button.GetSize()
             button.SetPosition(offset - w, 2)
             offset -= w + 2
         if self.IsMessagePanelBottom():
--- a/controls/PouInstanceVariablesPanel.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/PouInstanceVariablesPanel.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,21 +22,35 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
 from collections import namedtuple
 
 import wx
 import wx.lib.agw.customtreectrl as CT
 import wx.lib.buttons
 
+from plcopen.types_enums import *
+
+from util.BitmapLibrary import GetBitmap
+
+
 # Customize CustomTreeItem for adding icon on item right
 CT.GenericTreeItem._rightimages = []
 
+
 def SetRightImages(self, images):
     self._rightimages = images
+
+
 CT.GenericTreeItem.SetRightImages = SetRightImages
 
+
 def GetRightImages(self):
     return self._rightimages
+
+
 CT.GenericTreeItem.GetRightImages = GetRightImages
 
 
@@ -49,24 +63,24 @@
         height = CT.CustomTreeCtrl.GetLineHeight(self, item)
         rightimages = item.GetRightImages()
         if len(rightimages) > 0:
-            r_image_w, r_image_h = self._imageListRight.GetSize(rightimages[0])
+            _r_image_w, r_image_h = self._imageListRight.GetSize(rightimages[0])
             return max(height, r_image_h + 8)
         return height
 
     def GetItemRightImagesBBox(self, item):
         rightimages = item.GetRightImages()
         if len(rightimages) > 0:
-            w, h = self.GetClientSize()
+            w, _h = self.GetClientSize()
             total_h = self.GetLineHeight(item)
             r_image_w, r_image_h = self._imageListRight.GetSize(rightimages[0])
-            
+
             bbox_width = (r_image_w + 4) * len(rightimages) + 4
             bbox_height = r_image_h + 8
             bbox_x = w - bbox_width
-            bbox_y = item.GetY() + ((total_h > r_image_h) and [(total_h-r_image_h)/2] or [0])[0]
-            
+            bbox_y = item.GetY() + ((total_h > r_image_h) and [(total_h-r_image_h)//2] or [0])[0]
+
             return wx.Rect(bbox_x, bbox_y, bbox_width, bbox_height)
-        
+
         return None
 
     def IsOverItemRightImage(self, item, point):
@@ -75,30 +89,28 @@
             point = self.CalcUnscrolledPosition(point)
             r_image_w, r_image_h = self._imageListRight.GetSize(rightimages[0])
             images_bbx = self.GetItemRightImagesBBox(item)
-            
+
             rect = wx.Rect(images_bbx.x + 4, images_bbx.y + 4,
                            r_image_w, r_image_h)
             for r_image in rightimages:
                 if rect.Inside(point):
                     return r_image
                 rect.x += r_image_w + 4
-            
+
             return None
-                
+
     def PaintItem(self, item, dc, level, align):
         CT.CustomTreeCtrl.PaintItem(self, item, dc, level, align)
-        
+
         rightimages = item.GetRightImages()
         if len(rightimages) > 0:
             images_bbx = self.GetItemRightImagesBBox(item)
-            r_image_w, r_image_h = self._imageListRight.GetSize(rightimages[0])
-            
+            r_image_w, _r_image_h = self._imageListRight.GetSize(rightimages[0])
+
             dc.SetBrush(wx.TRANSPARENT_BRUSH)
             dc.SetPen(wx.TRANSPARENT_PEN)
-            
-            bg_width = (r_image_w + 4) * len(rightimages) + 4
-            bg_height = r_image_h + 8
-            dc.DrawRectangle(images_bbx.x, images_bbx.y, 
+
+            dc.DrawRectangle(images_bbx.x, images_bbx.y,
                              images_bbx.width, images_bbx.height)
             x_pos = images_bbx.x + 4
             for r_image in rightimages:
@@ -106,107 +118,107 @@
                     r_image, dc, x_pos, images_bbx.y + 4,
                     wx.IMAGELIST_DRAW_TRANSPARENT)
                 x_pos += r_image_w + 4
-    
+
+
 _ButtonCallbacks = namedtuple("ButtonCallbacks", ["leftdown", "dclick"])
 
-from PLCControler import ITEMS_VARIABLE, ITEM_CONFIGURATION, ITEM_RESOURCE, ITEM_POU, ITEM_TRANSITION, ITEM_ACTION
-from util.BitmapLibrary import GetBitmap
 
 class PouInstanceVariablesPanel(wx.Panel):
 
     def __init__(self, parent, window, controller, debug):
-        wx.Panel.__init__(self, name='PouInstanceTreePanel', 
-                parent=parent, pos=wx.Point(0, 0), 
-                size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-        
-        self.ParentButton = wx.lib.buttons.GenBitmapButton(self,
-              bitmap=GetBitmap("top"), size=wx.Size(28, 28), style=wx.NO_BORDER)
+        wx.Panel.__init__(self, name='PouInstanceTreePanel',
+                          parent=parent, pos=wx.Point(0, 0),
+                          size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+
+        self.ParentButton = wx.lib.buttons.GenBitmapButton(
+            self, bitmap=GetBitmap("top"), size=wx.Size(28, 28), style=wx.NO_BORDER)
         self.ParentButton.SetToolTipString(_("Parent instance"))
-        self.Bind(wx.EVT_BUTTON, self.OnParentButtonClick, 
-                self.ParentButton)
-        
+        self.Bind(wx.EVT_BUTTON, self.OnParentButtonClick,
+                  self.ParentButton)
+
         self.InstanceChoice = wx.ComboBox(self, size=wx.Size(0, 0), style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnInstanceChoiceChanged,
-                self.InstanceChoice)
-        
-        self.DebugButton = wx.lib.buttons.GenBitmapButton(self, 
-              bitmap=GetBitmap("debug_instance"), size=wx.Size(28, 28), style=wx.NO_BORDER)
+                  self.InstanceChoice)
+
+        self.DebugButton = wx.lib.buttons.GenBitmapButton(
+            self, bitmap=GetBitmap("debug_instance"), size=wx.Size(28, 28), style=wx.NO_BORDER)
         self.DebugButton.SetToolTipString(_("Debug instance"))
-        self.Bind(wx.EVT_BUTTON, self.OnDebugButtonClick, 
-                self.DebugButton)
-        
-        self.VariablesList = CustomTreeCtrlWithRightImage(self,
-              style=wx.SUNKEN_BORDER,
-              agwStyle=CT.TR_NO_BUTTONS|
-                       CT.TR_SINGLE|
-                       CT.TR_HAS_VARIABLE_ROW_HEIGHT|
-                       CT.TR_HIDE_ROOT|
-                       CT.TR_NO_LINES|
-                       getattr(CT, "TR_ALIGN_WINDOWS_RIGHT", CT.TR_ALIGN_WINDOWS))
+        self.Bind(wx.EVT_BUTTON, self.OnDebugButtonClick,
+                  self.DebugButton)
+
+        self.VariablesList = CustomTreeCtrlWithRightImage(
+            self,
+            style=wx.SUNKEN_BORDER,
+            agwStyle=(CT.TR_NO_BUTTONS |
+                      CT.TR_SINGLE |
+                      CT.TR_HAS_VARIABLE_ROW_HEIGHT |
+                      CT.TR_HIDE_ROOT |
+                      CT.TR_NO_LINES |
+                      getattr(CT, "TR_ALIGN_WINDOWS_RIGHT", CT.TR_ALIGN_WINDOWS)))
         self.VariablesList.SetIndent(0)
         self.VariablesList.SetSpacing(5)
-        self.VariablesList.DoSelectItem = lambda *x,**y:True
+        self.VariablesList.DoSelectItem = lambda *x, **y: True
         self.VariablesList.Bind(CT.EVT_TREE_ITEM_ACTIVATED,
-                self.OnVariablesListItemActivated)
+                                self.OnVariablesListItemActivated)
         self.VariablesList.Bind(wx.EVT_LEFT_DOWN, self.OnVariablesListLeftDown)
         self.VariablesList.Bind(wx.EVT_KEY_DOWN, self.OnVariablesListKeyDown)
-        
+
         self.TreeRightImageList = wx.ImageList(24, 24)
         self.EditImage = self.TreeRightImageList.Add(GetBitmap("edit"))
         self.DebugInstanceImage = self.TreeRightImageList.Add(GetBitmap("debug_instance"))
         self.VariablesList.SetRightImageList(self.TreeRightImageList)
-        
+
         self.ButtonCallBacks = {
             self.EditImage: _ButtonCallbacks(
                 self.EditButtonCallback, None),
             self.DebugInstanceImage: _ButtonCallbacks(
                 self.DebugButtonCallback, self.DebugButtonDClickCallback)}
-        
+
         buttons_sizer = wx.FlexGridSizer(cols=3, hgap=0, rows=1, vgap=0)
         buttons_sizer.AddWindow(self.ParentButton)
         buttons_sizer.AddWindow(self.InstanceChoice, flag=wx.GROW)
         buttons_sizer.AddWindow(self.DebugButton)
         buttons_sizer.AddGrowableCol(1)
         buttons_sizer.AddGrowableRow(0)
-        
+
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
         main_sizer.AddSizer(buttons_sizer, flag=wx.GROW)
         main_sizer.AddWindow(self.VariablesList, flag=wx.GROW)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(1)
-        
+
         self.SetSizer(main_sizer)
-        
+
         self.ParentWindow = window
         self.Controller = controller
         self.Debug = debug
         if not self.Debug:
             self.DebugButton.Hide()
-        
+
         self.PouTagName = None
         self.PouInfos = None
         self.PouInstance = None
-        
+
     def __del__(self):
         self.Controller = None
-    
+
     def SetTreeImageList(self, tree_image_list):
         self.VariablesList.SetImageList(tree_image_list)
-    
+
     def SetController(self, controller):
         self.Controller = controller
-    
+
         self.RefreshView()
-    
+
     def SetPouType(self, tagname, pou_instance=None):
         if self.Controller is not None:
             if tagname == "Project":
                 config_name = self.Controller.GetProjectMainConfigurationName()
                 if config_name is not None:
-                    tagname = self.Controller.ComputeConfigurationName(config_name)
+                    tagname = ComputeConfigurationName(config_name)
             if pou_instance is not None:
                 self.PouInstance = pou_instance
-            
+
             if self.PouTagName != tagname:
                 self.PouTagName = tagname
                 self.RefreshView()
@@ -214,49 +226,54 @@
                 self.RefreshInstanceChoice()
         else:
             self.RefreshView()
-    
+
     def ResetView(self):
         self.Controller = None
-        
+
         self.PouTagName = None
         self.PouInfos = None
         self.PouInstance = None
-        
+
         self.RefreshView()
-    
+
     def RefreshView(self):
         self.Freeze()
         self.VariablesList.DeleteAllItems()
-        
+
         if self.Controller is not None and self.PouTagName is not None:
-            self.PouInfos = self.Controller.GetPouVariables(self.PouTagName, self.Debug)
+            if self.PouTagName.split('::')[0] in ['A', 'T']:
+                self.PouInfos = self.Controller.GetPouVariables('P::%s' % self.PouTagName.split('::')[1], self.Debug)
+            else:
+                self.PouInfos = self.Controller.GetPouVariables(self.PouTagName, self.Debug)
+            if None in self.Controller.GetEditedElementType(self.PouTagName, self.Debug) and self.PouInfos is not None:
+                self.PouInfos.debug = False
         else:
             self.PouInfos = None
         if self.PouInfos is not None:
-            root = self.VariablesList.AddRoot("")
+            root = self.VariablesList.AddRoot("", data=self.PouInfos)
             for var_infos in self.PouInfos.variables:
                 if var_infos.type is not None:
                     text = "%s (%s)" % (var_infos.name, var_infos.type)
                 else:
                     text = var_infos.name
-                
+
                 right_images = []
                 if var_infos.edit:
                     right_images.append(self.EditImage)
-                
+
                 if var_infos.debug and self.Debug:
                     right_images.append(self.DebugInstanceImage)
-                
+
                 item = self.VariablesList.AppendItem(root, text)
                 item.SetRightImages(right_images)
                 self.VariablesList.SetItemImage(item, self.ParentWindow.GetTreeImage(var_infos.var_class))
                 self.VariablesList.SetPyData(item, var_infos)
-            
+
         self.RefreshInstanceChoice()
         self.RefreshButtons()
-        
+
         self.Thaw()
-    
+
     def RefreshInstanceChoice(self):
         self.InstanceChoice.Clear()
         self.InstanceChoice.SetValue("")
@@ -274,12 +291,12 @@
             else:
                 self.PouInstance = None
                 self.InstanceChoice.SetValue(_("Select an instance"))
-    
+
     def RefreshButtons(self):
         enabled = self.InstanceChoice.GetSelection() != -1
         self.ParentButton.Enable(enabled and self.PouInfos.var_class != ITEM_CONFIGURATION)
         self.DebugButton.Enable(enabled and self.PouInfos.debug and self.Debug)
-        
+
         root = self.VariablesList.GetRootItem()
         if root is not None and root.IsOk():
             item, item_cookie = self.VariablesList.GetFirstChild(root)
@@ -290,73 +307,76 @@
                         if child.GetName() != "edit":
                             child.Enable(enabled)
                 item, item_cookie = self.VariablesList.GetNextChild(root, item_cookie)
-    
+
     def EditButtonCallback(self, infos):
         var_class = infos.var_class
         if var_class == ITEM_RESOURCE:
-            tagname = self.Controller.ComputeConfigurationResourceName(
-                self.InstanceChoice.GetStringSelection(), 
+            tagname = ComputeConfigurationResourceName(
+                self.InstanceChoice.GetStringSelection(),
                 infos.name)
         elif var_class == ITEM_TRANSITION:
-            tagname = self.Controller.ComputePouTransitionName(
+            tagname = ComputePouTransitionName(
                 self.PouTagName.split("::")[1],
                 infos.name)
         elif var_class == ITEM_ACTION:
-            tagname = self.Controller.ComputePouActionName(
+            tagname = ComputePouActionName(
                 self.PouTagName.split("::")[1],
                 infos.name)
         else:
             var_class = ITEM_POU
-            tagname = self.Controller.ComputePouName(infos.type)
+            tagname = ComputePouName(infos.type)
         self.ParentWindow.EditProjectElement(var_class, tagname)
-    
+
     def DebugButtonCallback(self, infos):
         if self.InstanceChoice.GetSelection() != -1:
             var_class = infos.var_class
-            var_path = "%s.%s" % (self.InstanceChoice.GetStringSelection(), 
-                                  infos.name)
+            instance_path = self.InstanceChoice.GetStringSelection()
+            if self.PouTagName.split("::")[0] in ["A", "T"]:
+                pos = instance_path.rfind('.')
+                instance_path = instance_path[0:pos]
+            var_path = "%s.%s" % (instance_path, infos.name)
             if var_class in ITEMS_VARIABLE:
                 self.ParentWindow.AddDebugVariable(var_path, force=True)
             elif var_class == ITEM_TRANSITION:
                 self.ParentWindow.OpenDebugViewer(
                     var_class,
                     var_path,
-                    self.Controller.ComputePouTransitionName(
+                    ComputePouTransitionName(
                         self.PouTagName.split("::")[1],
                         infos.name))
             elif var_class == ITEM_ACTION:
                 self.ParentWindow.OpenDebugViewer(
                     var_class,
                     var_path,
-                    self.Controller.ComputePouActionName(
+                    ComputePouActionName(
                         self.PouTagName.split("::")[1],
                         infos.name))
             else:
                 self.ParentWindow.OpenDebugViewer(
                     var_class,
                     var_path,
-                    self.Controller.ComputePouName(infos.type))
-    
+                    ComputePouName(infos.type))
+
     def DebugButtonDClickCallback(self, infos):
         if self.InstanceChoice.GetSelection() != -1:
             if infos.var_class in ITEMS_VARIABLE:
                 self.ParentWindow.AddDebugVariable(
-                    "%s.%s" % (self.InstanceChoice.GetStringSelection(), 
-                               infos.name), 
+                    "%s.%s" % (self.InstanceChoice.GetStringSelection(),
+                               infos.name),
                     force=True,
                     graph=True)
-    
+
     def ShowInstanceChoicePopup(self):
         self.InstanceChoice.SetFocusFromKbd()
         size = self.InstanceChoice.GetSize()
         event = wx.MouseEvent(wx.EVT_LEFT_DOWN._getEvtType())
-        event.x = size.width / 2
-        event.y = size.height / 2
+        event.x = size.width // 2
+        event.y = size.height // 2
         event.SetEventObject(self.InstanceChoice)
-        #event = wx.KeyEvent(wx.EVT_KEY_DOWN._getEvtType())
-        #event.m_keyCode = wx.WXK_SPACE
+        # event = wx.KeyEvent(wx.EVT_KEY_DOWN._getEvtType())
+        # event.m_keyCode = wx.WXK_SPACE
         self.InstanceChoice.GetEventHandler().ProcessEvent(event)
-    
+
     def OnParentButtonClick(self, event):
         if self.InstanceChoice.GetSelection() != -1:
             parent_path = self.InstanceChoice.GetStringSelection().rsplit(".", 1)[0]
@@ -365,11 +385,11 @@
                 wx.CallAfter(self.SetPouType, tagname, parent_path)
                 wx.CallAfter(self.ParentWindow.SelectProjectTreeItem, tagname)
         event.Skip()
-        
+
     def OnInstanceChoiceChanged(self, event):
         self.RefreshButtons()
         event.Skip()
-        
+
     def OnDebugButtonClick(self, event):
         if self.InstanceChoice.GetSelection() != -1:
             self.ParentWindow.OpenDebugViewer(
@@ -377,31 +397,37 @@
                 self.InstanceChoice.GetStringSelection(),
                 self.PouTagName)
         event.Skip()
-    
+
     def OnVariablesListItemActivated(self, event):
         selected_item = event.GetItem()
         if selected_item is not None and selected_item.IsOk():
             item_infos = self.VariablesList.GetPyData(selected_item)
             if item_infos is not None:
-                
+
                 item_button = self.VariablesList.IsOverItemRightImage(
                     selected_item, event.GetPoint())
                 if item_button is not None:
                     callback = self.ButtonCallBacks[item_button].dclick
                     if callback is not None:
                         callback(item_infos)
-                
+
                 elif item_infos.var_class not in ITEMS_VARIABLE:
                     instance_path = self.InstanceChoice.GetStringSelection()
                     if item_infos.var_class == ITEM_RESOURCE:
                         if instance_path != "":
-                            tagname = self.Controller.ComputeConfigurationResourceName(
-                                           instance_path, 
-                                           item_infos.name)
+                            tagname = ComputeConfigurationResourceName(
+                                instance_path,
+                                item_infos.name)
                         else:
                             tagname = None
                     else:
-                        tagname = self.Controller.ComputePouName(item_infos.type)
+                        parent_infos = self.VariablesList.GetPyData(selected_item.GetParent())
+                        if item_infos.var_class == ITEM_ACTION:
+                            tagname = ComputePouActionName(parent_infos.type, item_infos.name)
+                        elif item_infos.var_class == ITEM_TRANSITION:
+                            tagname = ComputePouTransitionName(parent_infos.type, item_infos.name)
+                        else:
+                            tagname = ComputePouName(item_infos.type)
                     if tagname is not None:
                         if instance_path != "":
                             item_path = "%s.%s" % (instance_path, item_infos.name)
@@ -410,7 +436,7 @@
                         self.SetPouType(tagname, item_path)
                         self.ParentWindow.SelectProjectTreeItem(tagname)
         event.Skip()
-    
+
     def OnVariablesListLeftDown(self, event):
         if self.InstanceChoice.GetSelection() == -1:
             wx.CallAfter(self.ShowInstanceChoicePopup)
@@ -420,15 +446,15 @@
             if item is not None:
                 item_infos = self.VariablesList.GetPyData(item)
                 if item_infos is not None:
-                    
+
                     item_button = self.VariablesList.IsOverItemRightImage(
                         item, event.GetPosition())
                     if item_button is not None:
                         callback = self.ButtonCallBacks[item_button].leftdown
                         if callback is not None:
                             callback(item_infos)
-                
-                    elif (flags & CT.TREE_HITTEST_ONITEMLABEL and 
+
+                    elif (flags & CT.TREE_HITTEST_ONITEMLABEL and
                           item_infos.var_class in ITEMS_VARIABLE):
                         self.ParentWindow.EnsureTabVisible(
                             self.ParentWindow.DebugVariablePanel)
@@ -443,4 +469,3 @@
         keycode = event.GetKeyCode()
         if keycode != wx.WXK_LEFT:
             event.Skip()
-
--- a/controls/ProjectPropertiesPanel.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/ProjectPropertiesPanel.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2012: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,24 +23,31 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+from __future__ import absolute_import
 import wx
-
-#-------------------------------------------------------------------------------
+from wx.lib.scrolledpanel import ScrolledPanel
+
+from xmlclass.xmlclass import URI_model
+
+# -------------------------------------------------------------------------------
 #                                 Helpers
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 REQUIRED_PARAMS = ["projectName", "productName", "productVersion", "companyName"]
 
-[TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE, 
- POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES
+[
+    TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE,
+    POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES
 ] = range(10)
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                       Project Properties Panel
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 class ProjectPropertiesPanel(wx.Notebook):
-    
+
     def AddSizerParams(self, parent, sizer, params):
         for idx, (name, label) in enumerate(params):
             border = 0
@@ -47,105 +55,115 @@
                 border |= wx.TOP
             elif idx == len(params) - 1:
                 border |= wx.BOTTOM
-            
+
             st = wx.StaticText(parent, label=label)
-            sizer.AddWindow(st, border=10, 
-                  flag=wx.ALIGN_CENTER_VERTICAL|border|wx.LEFT)
-            
+            sizer.AddWindow(st, border=10,
+                            flag=wx.ALIGN_CENTER_VERTICAL | border | wx.LEFT)
+
             tc = wx.TextCtrl(parent, style=wx.TE_PROCESS_ENTER)
             setattr(self, name, tc)
             callback = self.GetTextCtrlChangedFunction(tc, name)
             self.Bind(wx.EVT_TEXT_ENTER, callback, tc)
             tc.Bind(wx.EVT_KILL_FOCUS, callback)
-            sizer.AddWindow(tc, border=10, 
-                  flag=wx.GROW|border|wx.RIGHT)
-
-    def __init__(self, parent, controller=None, window=None, enable_required=True):
-        wx.Notebook.__init__(self, parent, size=wx.Size(500, 300))
+            sizer.AddWindow(tc, border=10,
+                            flag=wx.GROW | border | wx.RIGHT)
+
+    def __init__(self, parent, controller=None, window=None, enable_required=True, scrolling=True):
+        wx.Notebook.__init__(self, parent)
 
         self.Controller = controller
         self.ParentWindow = window
         self.Values = None
-        
+
         # Project Panel elements
 
-        self.ProjectPanel = wx.Panel(self, style=wx.TAB_TRAVERSAL)
+        self.ProjectPanel = ScrolledPanel(self, style=wx.TAB_TRAVERSAL)
+        self.ProjectPanel.SetAutoLayout(1)
+        if scrolling:
+            self.ProjectPanel.SetupScrolling()
         projectpanel_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=5, vgap=15)
         projectpanel_sizer.AddGrowableCol(1)
         self.ProjectPanel.SetSizer(projectpanel_sizer)
-        
+
         self.AddSizerParams(self.ProjectPanel, projectpanel_sizer,
-              [("projectName", _('Project Name (required):')),
-               ("projectVersion", _('Project Version (optional):')),
-               ("productName", _('Product Name (required):')),
-               ("productVersion", _('Product Version (required):')),
-               ("productRelease", _('Product Release (optional):'))])
-        
+                            [("projectName",    _('Project Name (required):')),
+                             ("projectVersion", _('Project Version (optional):')),
+                             ("productName",    _('Product Name (required):')),
+                             ("productVersion", _('Product Version (required):')),
+                             ("productRelease", _('Product Release (optional):'))])
+
         self.AddPage(self.ProjectPanel, _("Project"))
-        
+
         # Author Panel elements
 
-        self.AuthorPanel = wx.Panel(self, style=wx.TAB_TRAVERSAL)
+        self.AuthorPanel = ScrolledPanel(self, style=wx.TAB_TRAVERSAL)
+        self.AuthorPanel.SetAutoLayout(1)
+        if scrolling:
+            self.AuthorPanel.SetupScrolling()
         authorpanel_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=4, vgap=15)
         authorpanel_sizer.AddGrowableCol(1)
         self.AuthorPanel.SetSizer(authorpanel_sizer)
-        
+
         self.AddSizerParams(self.AuthorPanel, authorpanel_sizer,
-              [("companyName", _('Company Name (required):')),
-               ("companyURL", _('Company URL (optional):')),
-               ("authorName", _('Author Name (optional):')),
-               ("organization", _('Organization (optional):'))])
-        
+                            [("companyName",  _('Company Name (required):')),
+                             ("companyURL",   _('Company URL (optional):')),
+                             ("authorName",   _('Author Name (optional):')),
+                             ("organization", _('Organization (optional):'))])
+
         self.AddPage(self.AuthorPanel, _("Author"))
 
         # Graphics Panel elements
 
-        self.GraphicsPanel = wx.Panel(self, style=wx.TAB_TRAVERSAL)
+        self.GraphicsPanel = ScrolledPanel(self, style=wx.TAB_TRAVERSAL)
+        self.GraphicsPanel.SetAutoLayout(1)
+        if scrolling:
+            self.GraphicsPanel.SetupScrolling()
         graphicpanel_sizer = wx.FlexGridSizer(cols=1, hgap=5, rows=4, vgap=5)
         graphicpanel_sizer.AddGrowableCol(0)
         graphicpanel_sizer.AddGrowableRow(3)
         self.GraphicsPanel.SetSizer(graphicpanel_sizer)
-        
+
         pageSize_st = wx.StaticText(self.GraphicsPanel,
-              label=_('Page Size (optional):'))
-        graphicpanel_sizer.AddWindow(pageSize_st, border=10, 
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.LEFT|wx.RIGHT)
-        
+                                    label=_('Page Size (optional):'))
+        graphicpanel_sizer.AddWindow(
+            pageSize_st, border=10,
+            flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.LEFT | wx.RIGHT)
+
         pageSize_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=5)
         pageSize_sizer.AddGrowableCol(1)
-        graphicpanel_sizer.AddSizer(pageSize_sizer, border=10, 
-              flag=wx.GROW|wx.LEFT|wx.RIGHT)
-        
+        graphicpanel_sizer.AddSizer(pageSize_sizer, border=10,
+                                    flag=wx.GROW | wx.LEFT | wx.RIGHT)
+
         for name, label in [('PageWidth', _('Width:')),
                             ('PageHeight', _('Height:'))]:
             st = wx.StaticText(self.GraphicsPanel, label=label)
-            pageSize_sizer.AddWindow(st, border=12, 
-                  flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT)
-            
-            sp = wx.SpinCtrl(self.GraphicsPanel, 
-                  min=0, max=2**16, style=wx.TE_PROCESS_ENTER)
+            pageSize_sizer.AddWindow(st, border=12,
+                                     flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT)
+
+            sp = wx.SpinCtrl(self.GraphicsPanel,
+                             min=0, max=2**16, style=wx.TE_PROCESS_ENTER)
             setattr(self, name, sp)
             callback = self.GetPageSizeChangedFunction(sp, name)
             self.Bind(wx.EVT_TEXT_ENTER, callback, sp)
             sp.Bind(wx.EVT_KILL_FOCUS, callback)
             pageSize_sizer.AddWindow(sp, flag=wx.GROW)
-        
+
         scaling_st = wx.StaticText(self.GraphicsPanel,
-              label=_('Grid Resolution:'))
-        graphicpanel_sizer.AddWindow(scaling_st, border=10, 
-              flag=wx.GROW|wx.LEFT|wx.RIGHT)
-        
+                                   label=_('Grid Resolution:'))
+        graphicpanel_sizer.AddWindow(scaling_st, border=10,
+                                     flag=wx.GROW | wx.LEFT | wx.RIGHT)
+
         scaling_nb = wx.Notebook(self.GraphicsPanel)
-        graphicpanel_sizer.AddWindow(scaling_nb, border=10, 
-              flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        graphicpanel_sizer.AddWindow(scaling_nb, border=10,
+                                     flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
         self.Scalings = {}
-        for language, translation in [("FBD",_("FBD")), ("LD",_("LD")), ("SFC",_("SFC"))]:
+        for language, translation in [("FBD", _("FBD")), ("LD", _("LD")), ("SFC", _("SFC"))]:
             scaling_panel = wx.Panel(scaling_nb, style=wx.TAB_TRAVERSAL)
             scalingpanel_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=5)
             scalingpanel_sizer.AddGrowableCol(1)
             scaling_panel.SetSizer(scalingpanel_sizer)
-            
+
             scaling_controls = []
             for idx, (name, label) in enumerate([('XScale', _('Horizontal:')),
                                                  ('YScale', _('Vertical:'))]):
@@ -153,67 +171,72 @@
                     border = wx.TOP
                 else:
                     border = wx.BOTTOM
-                
+
                 st = wx.StaticText(scaling_panel, label=label)
-                scalingpanel_sizer.AddWindow(st, border=10, 
-                      flag=wx.ALIGN_CENTER_VERTICAL|border|wx.LEFT)
-                
-                sp = wx.SpinCtrl(scaling_panel, 
-                      min=0, max=2**16, style=wx.TE_PROCESS_ENTER)
+                scalingpanel_sizer.AddWindow(
+                    st, border=10,
+                    flag=wx.ALIGN_CENTER_VERTICAL | border | wx.LEFT)
+
+                sp = wx.SpinCtrl(scaling_panel,
+                                 min=0, max=2**16, style=wx.TE_PROCESS_ENTER)
                 scaling_controls.append(sp)
                 callback = self.GetScalingChangedFunction(sp, language, name)
                 self.Bind(wx.EVT_TEXT_ENTER, callback, sp)
                 sp.Bind(wx.EVT_KILL_FOCUS, callback)
-                scalingpanel_sizer.AddWindow(sp, border=10, 
-                      flag=wx.GROW|border|wx.RIGHT)
-        
+                scalingpanel_sizer.AddWindow(sp, border=10,
+                                             flag=wx.GROW | border | wx.RIGHT)
+
             self.Scalings[language] = scaling_controls
             scaling_nb.AddPage(scaling_panel, translation)
-        
+
         self.AddPage(self.GraphicsPanel, _("Graphics"))
 
         # Miscellaneous Panel elements
 
-        self.MiscellaneousPanel = wx.Panel(id=-1, parent=self, 
-              name='MiscellaneousPanel', pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+        self.MiscellaneousPanel = ScrolledPanel(parent=self,
+                                                name='MiscellaneousPanel',
+                                                style=wx.TAB_TRAVERSAL)
+        self.MiscellaneousPanel.SetAutoLayout(1)
+        if scrolling:
+            self.MiscellaneousPanel.SetupScrolling()
         miscellaneouspanel_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=15)
         miscellaneouspanel_sizer.AddGrowableCol(1)
         miscellaneouspanel_sizer.AddGrowableRow(1)
         self.MiscellaneousPanel.SetSizer(miscellaneouspanel_sizer)
-        
+
         language_label = wx.StaticText(self.MiscellaneousPanel,
-              label=_('Language (optional):'))
-        miscellaneouspanel_sizer.AddWindow(language_label, border=10, 
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.LEFT)
-        
-        self.Language = wx.ComboBox(self.MiscellaneousPanel, 
-              style=wx.CB_READONLY)
+                                       label=_('Language (optional):'))
+        miscellaneouspanel_sizer.AddWindow(language_label, border=10,
+                                           flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.LEFT)
+
+        self.Language = wx.ComboBox(self.MiscellaneousPanel,
+                                    style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnLanguageChanged, self.Language)
-        miscellaneouspanel_sizer.AddWindow(self.Language, border=10, 
-              flag=wx.GROW|wx.TOP|wx.RIGHT)
-        
-        description_label = wx.StaticText(self.MiscellaneousPanel,
-              label=_('Content Description (optional):'))
-        miscellaneouspanel_sizer.AddWindow(description_label, border=10, 
-              flag=wx.BOTTOM|wx.LEFT)
-        
-        self.ContentDescription = wx.TextCtrl(self.MiscellaneousPanel, 
-              style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER)
-        self.Bind(wx.EVT_TEXT_ENTER, self.OnContentDescriptionChanged, 
-              self.ContentDescription)
-        self.ContentDescription.Bind(wx.EVT_KILL_FOCUS, 
-              self.OnContentDescriptionChanged)
-        miscellaneouspanel_sizer.AddWindow(self.ContentDescription, border=10, 
-              flag=wx.GROW|wx.BOTTOM|wx.RIGHT)
-        
+        miscellaneouspanel_sizer.AddWindow(self.Language, border=10,
+                                           flag=wx.GROW | wx.TOP | wx.RIGHT)
+
+        description_label = wx.StaticText(
+            self.MiscellaneousPanel, label=_('Content Description (optional):'))
+        miscellaneouspanel_sizer.AddWindow(description_label, border=10,
+                                           flag=wx.BOTTOM | wx.LEFT)
+
+        self.ContentDescription = wx.TextCtrl(
+            self.MiscellaneousPanel, size=wx.Size(240, 150),
+            style=wx.TE_MULTILINE | wx.TE_PROCESS_ENTER)
+        self.Bind(wx.EVT_TEXT_ENTER, self.OnContentDescriptionChanged,
+                  self.ContentDescription)
+        self.ContentDescription.Bind(wx.EVT_KILL_FOCUS,
+                                     self.OnContentDescriptionChanged)
+        miscellaneouspanel_sizer.AddWindow(self.ContentDescription, border=10,
+                                           flag=wx.GROW | wx.BOTTOM | wx.RIGHT)
+
         self.AddPage(self.MiscellaneousPanel, _("Miscellaneous"))
-        
+
         for param in REQUIRED_PARAMS:
             getattr(self, param).Enable(enable_required)
-           
+
         languages = ["", "en-US", "fr-FR", "zh-CN", "ru-RU"]
-        
+
         for language in languages:
             self.Language.Append(language)
 
@@ -240,13 +263,13 @@
                 tc = getattr(self, item, None)
                 if tc is not None:
                     tc.SetValue(value)
-        
+
     def GetValues(self):
         values = {}
         for param in ["projectName", "projectVersion",
                       "productName", "productVersion",
                       "productRelease", "companyName",
-                      "companyURL", "authorName", 
+                      "companyURL", "authorName",
                       "organization"]:
             value = getattr(self, param).GetValue()
             if param in REQUIRED_PARAMS or value != "":
@@ -269,21 +292,26 @@
             values["scaling"][language] = (self.Scalings[language][0].GetValue(),
                                            self.Scalings[language][1].GetValue())
         return values
-    
+
     def GetTextCtrlChangedFunction(self, textctrl, name):
         def TextCtrlChangedFunction(event):
-            if self.Controller is not None:
-                if self.Values is not None:
-                    old_value = self.Values.get(name)
-                else:
-                    old_value = None
+            if self.Controller is not None and self.Values is not None:
+                old_value = self.Values.get(name)
                 new_value = textctrl.GetValue()
-                if name not in REQUIRED_PARAMS and new_value == "":
+                if name in REQUIRED_PARAMS and new_value == "":
                     new_value = None
+                if name == 'companyURL':
+                    if not URI_model.match(new_value):
+                        new_value = None
+                        dialog = wx.MessageDialog(self, _('Invalid URL!\n'
+                                                          'Please enter correct URL address.'),
+                                                  _("Error"), wx.OK | wx.ICON_ERROR)
+                        dialog.ShowModal()
+                        dialog.Destroy()
                 if old_value != new_value:
                     self.Controller.SetProjectProperties(properties={name: new_value})
                     self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU,
-                            PROJECTTREE, PAGETITLES)
+                                               PROJECTTREE, PAGETITLES)
                     wx.CallAfter(self.RefreshView)
             event.Skip()
         return TextCtrlChangedFunction
@@ -302,11 +330,11 @@
                 if old_value != new_value:
                     self.Controller.SetProjectProperties(properties={"pageSize": new_value})
                     self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU,
-                          PAGETITLES, SCALING)
+                                               PAGETITLES, SCALING)
                     wx.CallAfter(self.RefreshView)
             event.Skip()
         return PageSizeChangedFunction
-    
+
     def GetScalingChangedFunction(self, spinctrl, language, name):
         def ScalingChangedFunction(event):
             if self.Controller is not None:
@@ -322,11 +350,11 @@
                 if old_value != new_value:
                     self.Controller.SetProjectProperties(properties={"scaling": {language: new_value}})
                     self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU,
-                          PAGETITLES, SCALING)
+                                               PAGETITLES, SCALING)
                     wx.CallAfter(self.RefreshView)
             event.Skip()
         return ScalingChangedFunction
-    
+
     def OnLanguageChanged(self, event):
         if self.Controller is not None:
             if self.Values is not None:
@@ -341,7 +369,7 @@
                 self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES)
                 wx.CallAfter(self.RefreshView)
         event.Skip()
-        
+
     def OnContentDescriptionChanged(self, event):
         if self.Controller is not None:
             if self.Values is not None:
--- a/controls/SearchResultPanel.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/SearchResultPanel.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,7 +22,9 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-from types import TupleType
+
+from __future__ import absolute_import
+from functools import reduce
 
 import wx
 import wx.lib.buttons
@@ -30,6 +32,8 @@
 
 from PLCControler import *
 from util.BitmapLibrary import GetBitmap
+from plcopen.types_enums import GetElementType
+
 
 def GenerateName(infos):
     if infos[0] in ["input", "output", "value"]:
@@ -40,159 +44,162 @@
         return "element %d %s" % (infos[1], infos[2])
     return "%s:" % infos[0]
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                            Search Result Panel
-#-------------------------------------------------------------------------------
-
-[ID_SEARCHRESULTPANEL, ID_SEARCHRESULTPANELHEADERLABEL,
- ID_SEARCHRESULTPANELSEARCHRESULTSTREE, ID_SEARCHRESULTPANELRESETBUTTON, 
+# -------------------------------------------------------------------------------
+
+
+[
+    ID_SEARCHRESULTPANEL, ID_SEARCHRESULTPANELHEADERLABEL,
+    ID_SEARCHRESULTPANELSEARCHRESULTSTREE, ID_SEARCHRESULTPANELRESETBUTTON,
 ] = [wx.NewId() for _init_ctrls in range(4)]
 
+
 class SearchResultPanel(wx.Panel):
 
-    if wx.VERSION < (2, 6, 0):
-        def Bind(self, event, function, id = None):
-            if id is not None:
-                event(self, id, function)
-            else:
-                event(self, function)
-
     def _init_coll_MainSizer_Items(self, parent):
         parent.AddSizer(self.HeaderSizer, 0, border=0, flag=wx.GROW)
         parent.AddWindow(self.SearchResultsTree, 1, border=0, flag=wx.GROW)
-    
+
     def _init_coll_MainSizer_Growables(self, parent):
         parent.AddGrowableCol(0)
         parent.AddGrowableRow(1)
 
     def _init_coll_HeaderSizer_Items(self, parent):
-        parent.AddWindow(self.HeaderLabel, 1, border=5, flag=wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
+        parent.AddWindow(self.HeaderLabel, 1, border=5, flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
         parent.AddWindow(self.ResetButton, 0, border=0, flag=0)
-    
+
     def _init_coll_HeaderSizer_Growables(self, parent):
         parent.AddGrowableCol(0)
-    
+
     def _init_sizers(self):
         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
         self.HeaderSizer = wx.BoxSizer(wx.HORIZONTAL)
-        
+
         self._init_coll_MainSizer_Items(self.MainSizer)
         self._init_coll_MainSizer_Growables(self.MainSizer)
         self._init_coll_HeaderSizer_Items(self.HeaderSizer)
-        
+
         self.SetSizer(self.MainSizer)
 
     def _init_ctrls(self, prnt):
-        wx.Panel.__init__(self, id=ID_SEARCHRESULTPANEL,
-              name='SearchResultPanel', parent=prnt, pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-
         self.HeaderLabel = wx.StaticText(id=ID_SEARCHRESULTPANELHEADERLABEL,
-              name='HeaderLabel', parent=self,
-              pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
-        
-        search_results_tree_style = CT.TR_HAS_BUTTONS|CT.TR_NO_LINES|CT.TR_HAS_VARIABLE_ROW_HEIGHT
+                                         name='HeaderLabel', parent=self,
+                                         pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
+
+        search_results_tree_style = CT.TR_HAS_BUTTONS | CT.TR_NO_LINES | CT.TR_HAS_VARIABLE_ROW_HEIGHT
         self.SearchResultsTree = CT.CustomTreeCtrl(id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE,
-              name="SearchResultsTree", parent=self,
-              pos=wx.Point(0, 0), style=search_results_tree_style)
+                                                   name="SearchResultsTree", parent=self,
+                                                   pos=wx.Point(0, 0), style=search_results_tree_style)
         if wx.VERSION >= (2, 8, 11):
             self.SearchResultsTree.SetAGWWindowStyleFlag(search_results_tree_style)
         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnSearchResultsTreeItemActivated,
-              id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE)
-        
-        self.ResetButton = wx.lib.buttons.GenBitmapButton(self,
-              bitmap=GetBitmap("reset"), size=wx.Size(28, 28), style=wx.NO_BORDER)
+                  id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE)
+
+        self.ResetButton = wx.lib.buttons.GenBitmapButton(
+            self, bitmap=GetBitmap("reset"),
+            size=wx.Size(28, 28), style=wx.NO_BORDER)
         self.ResetButton.SetToolTipString(_("Reset search result"))
         self.Bind(wx.EVT_BUTTON, self.OnResetButton, self.ResetButton)
-        
+
         self._init_sizers()
 
     def __init__(self, parent, window):
+        wx.Panel.__init__(self, id=ID_SEARCHRESULTPANEL,
+                          name='SearchResultPanel', parent=parent,
+                          pos=wx.Point(0, 0),
+                          size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
+
         self.ParentWindow = window
-        
+
         self._init_ctrls(parent)
-        
+
         # Define Tree item icon list
         self.TreeImageList = wx.ImageList(16, 16)
         self.TreeImageDict = {}
-        
+
         # Icons for other items
         for imgname, itemtype in [
-            #editables
-            ("PROJECT",        ITEM_PROJECT),
-            ("TRANSITION",     ITEM_TRANSITION),
-            ("ACTION",         ITEM_ACTION),
-            ("CONFIGURATION",  ITEM_CONFIGURATION),
-            ("RESOURCE",       ITEM_RESOURCE),
-            ("DATATYPE",       ITEM_DATATYPE),
-            ("ACTION",         "action_block"),
-            ("IL",             "IL"),
-            ("ST",             "ST")]:
+                # editables
+                ("PROJECT",        ITEM_PROJECT),
+                ("TRANSITION",     ITEM_TRANSITION),
+                ("ACTION",         ITEM_ACTION),
+                ("CONFIGURATION",  ITEM_CONFIGURATION),
+                ("RESOURCE",       ITEM_RESOURCE),
+                ("DATATYPE",       ITEM_DATATYPE),
+                ("ACTION",         "action_block"),
+                ("IL",             "IL"),
+                ("ST",             "ST")]:
             self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(imgname))
-        
+
         for itemtype in ["function", "functionBlock", "program",
                          "comment", "block", "io_variable",
                          "connector", "contact", "coil",
-                         "step", "transition", "jump", 
-                         "var_local", "var_input", 
+                         "step", "transition", "jump",
+                         "var_local", "var_input",
                          "var_inout", "var_output"]:
             self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(itemtype.upper()))
-        
+
         # Assign icon list to TreeCtrl
         self.SearchResultsTree.SetImageList(self.TreeImageList)
-        
+
         self.ResetSearchResults()
 
     def SetSearchResults(self, criteria, search_results):
         self.Criteria = criteria
         self.SearchResults = {}
         self.ElementsOrder = []
-        
+
         for infos, start, end, text in search_results:
             if infos[0] not in self.ElementsOrder:
                 self.ElementsOrder.append(infos[0])
-            
+
             results = self.SearchResults.setdefault(infos[0], [])
             results.append((infos, start, end, text))
-        
+
         self.RefreshView()
-    
+
     def ResetSearchResults(self):
         self.Criteria = None
         self.ElementsOrder = []
         self.SearchResults = {}
         self.RefreshView()
-    
+
     def RefreshView(self):
         self.SearchResultsTree.DeleteAllItems()
         if self.Criteria is None:
+            self.SearchResultsTree.AddRoot("")
+            root = self.SearchResultsTree.GetRootItem()
+            root.SetHilight(False)
             self.HeaderLabel.SetLabel(_("No search results available."))
             self.ResetButton.Enable(False)
         else:
             matches_number = 0
-            search_results_tree_infos = {"name": _("Project '%s':") % self.ParentWindow.Controler.GetProjectName(),
-                                         "type": ITEM_PROJECT,
-                                         "data": None,
-                                         "text": None,
-                                         "matches": None,
-                                        }
+            search_results_tree_infos = {
+                "name": _("Project '%s':") % self.ParentWindow.Controler.GetProjectName(),
+                "type": ITEM_PROJECT,
+                "data": None,
+                "text": None,
+                "matches": None,
+            }
             search_results_tree_children = search_results_tree_infos.setdefault("children", [])
             for tagname in self.ElementsOrder:
                 results = self.SearchResults.get(tagname, [])
                 matches_number += len(results)
-                
+
                 words = tagname.split("::")
-                
-                element_type = self.ParentWindow.Controler.GetElementType(tagname)
+
+                element_type = GetElementType(tagname)
                 if element_type == ITEM_POU:
                     element_type = self.ParentWindow.Controler.GetPouType(words[1])
-                
+
                 element_infos = {"name": words[-1],
                                  "type": element_type,
                                  "data": tagname,
                                  "text": None,
                                  "matches": len(results)}
-                
+
                 children = element_infos.setdefault("children", [])
                 for infos, start, end, text in results:
                     if infos[1] == "name" or element_type == ITEM_DATATYPE:
@@ -215,15 +222,16 @@
                                 child_type = self.ParentWindow.Controler.GetPouBodyType(words[1])
                         else:
                             child_name = GenerateName(infos[3:])
-                    child_infos = {"name": child_name,
-                                   "type": child_type,
-                                   "data": (infos, start, end ,None),
-                                   "text": text,
-                                   "matches": 1,
-                                   "children": [],
-                                  }
+                    child_infos = {
+                        "name": child_name,
+                        "type": child_type,
+                        "data": (infos, start, end, None),
+                        "text": text,
+                        "matches": 1,
+                        "children": [],
+                    }
                     children.append(child_infos)
-                
+
                 if len(words) > 2:
                     for _element_infos in search_results_tree_children:
                         if _element_infos["name"] == words[1]:
@@ -234,41 +242,40 @@
                         search_results_tree_children.append(element_infos)
                 else:
                     search_results_tree_children.append(element_infos)
-            
+
             if matches_number < 2:
                 header_format = _("'{a1}' - {a2} match in project")
             else:
                 header_format = _("'{a1}' - {a2} matches in project")
-            
-            self.HeaderLabel.SetLabel(header_format.format(a1 = self.Criteria["find_pattern"], a2 = matches_number))
+
+            self.HeaderLabel.SetLabel(header_format.format(a1=self.Criteria["find_pattern"], a2=matches_number))
             self.ResetButton.Enable(True)
-            
+
             if matches_number > 0:
                 root = self.SearchResultsTree.GetRootItem()
                 if root is None:
                     root = self.SearchResultsTree.AddRoot(search_results_tree_infos["name"])
                 self.GenerateSearchResultsTreeBranch(root, search_results_tree_infos)
                 self.SearchResultsTree.Expand(root)
-    
+
     def GetTextCtrlClickFunction(self, item):
         def OnTextCtrlClick(event):
             self.SearchResultsTree.SelectItem(item)
             event.Skip()
         return OnTextCtrlClick
-    
+
     def GetTextCtrlDClickFunction(self, item):
         def OnTextCtrlDClick(event):
             self.ShowSearchResults(item)
             event.Skip()
         return OnTextCtrlDClick
-    
+
     def GenerateSearchResultsTreeBranch(self, root, infos):
-        to_delete = []
         if infos["name"] == "body":
             item_name = "%d:" % infos["data"][1][0]
         else:
             item_name = infos["name"]
-        
+
         self.SearchResultsTree.SetItemText(root, item_name)
         self.SearchResultsTree.SetPyData(root, infos["data"])
         self.SearchResultsTree.SetItemBackgroundColour(root, wx.WHITE)
@@ -278,7 +285,7 @@
                 self.SearchResultsTree.SetItemImage(root, self.TreeImageDict[self.ParentWindow.Controler.GetPouType(infos["name"])])
             else:
                 self.SearchResultsTree.SetItemImage(root, self.TreeImageDict[infos["type"]])
-        
+
         text = None
         if infos["text"] is not None:
             text = infos["text"]
@@ -291,13 +298,13 @@
             text = _("(%d matches)") % infos["matches"]
             start_idx, end_idx = 0, len(text)
             style = wx.TextAttr(wx.Colour(0, 127, 174))
-        
+
         if text is not None:
-            text_ctrl_style = wx.BORDER_NONE|wx.TE_READONLY|wx.TE_RICH2
+            text_ctrl_style = wx.BORDER_NONE | wx.TE_READONLY | wx.TE_RICH2
             if wx.Platform != '__WXMSW__' or len(text.splitlines()) > 1:
                 text_ctrl_style |= wx.TE_MULTILINE
-            text_ctrl = wx.TextCtrl(id=-1, parent=self.SearchResultsTree, pos=wx.Point(0, 0), 
-                    value=text, style=text_ctrl_style)
+            text_ctrl = wx.TextCtrl(id=-1, parent=self.SearchResultsTree, pos=wx.Point(0, 0),
+                                    value=text, style=text_ctrl_style)
             width, height = text_ctrl.GetTextExtent(text)
             text_ctrl.SetClientSize(wx.Size(width + 1, height))
             text_ctrl.SetBackgroundColour(self.SearchResultsTree.GetBackgroundColour())
@@ -306,32 +313,29 @@
             text_ctrl.SetInsertionPoint(0)
             text_ctrl.SetStyle(start_idx, end_idx, style)
             self.SearchResultsTree.SetItemWindow(root, text_ctrl)
-            
-        if wx.VERSION >= (2, 6, 0):
-            item, root_cookie = self.SearchResultsTree.GetFirstChild(root)
-        else:
-            item, root_cookie = self.SearchResultsTree.GetFirstChild(root, 0)
+
+        item, root_cookie = self.SearchResultsTree.GetFirstChild(root)
         for child in infos["children"]:
             if item is None:
                 item = self.SearchResultsTree.AppendItem(root, "")
                 item, root_cookie = self.SearchResultsTree.GetNextChild(root, root_cookie)
             self.GenerateSearchResultsTreeBranch(item, child)
             item, root_cookie = self.SearchResultsTree.GetNextChild(root, root_cookie)
-    
+
     def ShowSearchResults(self, item):
         data = self.SearchResultsTree.GetPyData(item)
-        if isinstance(data, TupleType):
+        if isinstance(data, tuple):
             search_results = [data]
         else:
             search_results = self.SearchResults.get(data, [])
         self.ParentWindow.ClearHighlights(SEARCH_RESULT_HIGHLIGHT)
-        for infos, start, end, text in search_results:
+        for infos, start, end, _text in search_results:
             self.ParentWindow.ShowSearchResult(infos, start, end)
-    
+
     def OnSearchResultsTreeItemActivated(self, event):
         self.ShowSearchResults(event.GetItem())
         event.Skip()
-    
+
     def OnResetButton(self, event):
         self.ResetSearchResults()
         self.ParentWindow.ClearSearchResults()
--- a/controls/TextCtrlAutoComplete.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/TextCtrlAutoComplete.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,8 +22,10 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from six.moves import cPickle
 import wx
-import cPickle
 
 MAX_ITEM_COUNT = 10
 MAX_ITEM_SHOWN = 6
@@ -34,34 +36,37 @@
     LISTBOX_BORDER_HEIGHT = 4
     LISTBOX_INTERVAL_HEIGHT = 6
 
+
 class PopupWithListbox(wx.PopupWindow):
-    
-    def __init__(self, parent, choices=[]):
+
+    def __init__(self, parent, choices=None):
         wx.PopupWindow.__init__(self, parent, wx.BORDER_SIMPLE)
-        
-        self.ListBox = wx.ListBox(self, -1, style=wx.LB_HSCROLL|wx.LB_SINGLE|wx.LB_SORT)
-        
+
+        self.ListBox = wx.ListBox(self, -1, style=wx.LB_HSCROLL | wx.LB_SINGLE | wx.LB_SORT)
+
+        choices = [] if choices is None else choices
         self.SetChoices(choices)
-        
+
         self.ListBox.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
         self.ListBox.Bind(wx.EVT_MOTION, self.OnMotion)
-    
+
     def SetChoices(self, choices):
         max_text_width = 0
         max_text_height = 0
-        
+
         self.ListBox.Clear()
         for choice in choices:
             self.ListBox.Append(choice)
             w, h = self.ListBox.GetTextExtent(choice)
             max_text_width = max(max_text_width, w)
             max_text_height = max(max_text_height, h)
-        
+
         itemcount = min(len(choices), MAX_ITEM_SHOWN)
         width = self.Parent.GetSize()[0]
-        height = max_text_height * itemcount + \
-                 LISTBOX_INTERVAL_HEIGHT * max(0, itemcount - 1) + \
-                 2 * LISTBOX_BORDER_HEIGHT
+        height = \
+            max_text_height * itemcount + \
+            LISTBOX_INTERVAL_HEIGHT * max(0, itemcount - 1) + \
+            2 * LISTBOX_BORDER_HEIGHT
         if max_text_width + 10 > width:
             height += 15
         size = wx.Size(width, height)
@@ -69,7 +74,7 @@
             size.width -= 2
         self.ListBox.SetSize(size)
         self.SetClientSize(size)
-    
+
     def MoveSelection(self, direction):
         selected = self.ListBox.GetSelection()
         if selected == wx.NOT_FOUND:
@@ -82,10 +87,10 @@
         if selected == self.ListBox.GetCount():
             selected = wx.NOT_FOUND
         self.ListBox.SetSelection(selected)
-    
+
     def GetSelection(self):
         return self.ListBox.GetStringSelection()
-    
+
     def OnLeftDown(self, event):
         selected = self.ListBox.HitTest(wx.Point(event.GetX(), event.GetY()))
         parent_size = self.Parent.GetSize()
@@ -99,16 +104,17 @@
         else:
             wx.CallAfter(self.Parent.DismissListBox)
         event.Skip()
-    
+
     def OnMotion(self, event):
         self.ListBox.SetSelection(
             self.ListBox.HitTest(wx.Point(event.GetX(), event.GetY())))
         event.Skip()
-    
+
+
 class TextCtrlAutoComplete(wx.TextCtrl):
 
-    def __init__ (self, parent, choices=None, dropDownClick=True,
-                  element_path=None, **therest):
+    def __init__(self, parent, choices=None, dropDownClick=True,
+                 element_path=None, **therest):
         """
         Constructor works just like wx.TextCtrl except you can pass in a
         list of choices.  You can also change the choice list at any time
@@ -118,21 +124,21 @@
         therest['style'] = wx.TE_PROCESS_ENTER | therest.get('style', 0)
 
         wx.TextCtrl.__init__(self, parent, **therest)
-        
-        #Some variables
+
+        # Some variables
         self._dropDownClick = dropDownClick
         self._lastinsertionpoint = None
         self._hasfocus = False
-        
+
         self._screenheight = wx.SystemSettings.GetMetric(wx.SYS_SCREEN_Y)
         self.element_path = element_path
-        
+
         self.listbox = None
-        
+
         self.SetChoices(choices)
 
-        #gp = self
-        #while ( gp != None ) :
+        # gp = self
+        # while ( gp != None ) :
         #    gp.Bind ( wx.EVT_MOVE , self.onControlChanged, gp )
         #    gp.Bind ( wx.EVT_SIZE , self.onControlChanged, gp )
         #    gp = gp.GetParent()
@@ -142,7 +148,7 @@
         self.Bind(wx.EVT_TEXT, self.OnEnteredText)
         self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
 
-        #If need drop down on left click
+        # If need drop down on left click
         if dropDownClick:
             self.Bind(wx.EVT_LEFT_DOWN, self.OnClickToggleDown)
             self.Bind(wx.EVT_LEFT_UP, self.OnClickToggleUp)
@@ -201,14 +207,14 @@
         self.DismissListBox()
         self._hasfocus = False
         event.Skip()
-    
+
     def SetChoices(self, choices):
         self._choices = choices
         self.RefreshListBoxChoices()
-        
+
     def GetChoices(self):
         return self._choices
-    
+
     def SetValueFromSelected(self, selected):
         """
         Sets the wx.TextCtrl value from the selected wx.ListCtrl item.
@@ -217,7 +223,7 @@
         if selected != "":
             self.SetValue(selected)
         self.DismissListBox()
-    
+
     def RefreshListBoxChoices(self):
         if self.listbox is not None:
             text = self.GetValue()
@@ -227,7 +233,7 @@
     def PopupListBox(self):
         if self.listbox is None:
             self.listbox = PopupWithListbox(self)
-            
+
             # Show the popup right below or above the button
             # depending on available screen space...
             pos = self.ClientToScreen((0, 0))
@@ -236,9 +242,9 @@
                 pos.x -= 2
                 pos.y -= 2
             self.listbox.Position(pos, (0, sz[1]))
-            
+
             self.RefreshListBoxChoices()
-            
+
             self.listbox.Show()
 
     def DismissListBox(self):
--- a/controls/VariablePanel.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/VariablePanel.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,951 +1,1012 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-#
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-#
-# See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-import os
-import re
-from types import TupleType, StringType, UnicodeType
-
-import wx
-import wx.grid
-import wx.lib.buttons
-
-from plcopen.structures import LOCATIONDATATYPES, TestIdentifier, IEC_KEYWORDS, DefaultType
-from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD, ERROR_HIGHLIGHT
-from dialogs.ArrayTypeDialog import ArrayTypeDialog
-from CustomGrid import CustomGrid
-from CustomTable import CustomTable
-from LocationCellEditor import LocationCellEditor
-from util.BitmapLibrary import GetBitmap
-from PLCControler import _VariableInfos
-
-#-------------------------------------------------------------------------------
-#                                 Helpers
-#-------------------------------------------------------------------------------
-
-[TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE,
- POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES
-] = range(10)
-
-def GetVariableTableColnames(location):
-    _ = lambda x : x
-    if location:
-    	return ["#", _("Name"), _("Class"), _("Type"), _("Location"), _("Initial Value"), _("Option"), _("Documentation")]
-    return ["#", _("Name"), _("Class"), _("Type"), _("Initial Value"), _("Option"), _("Documentation")]
-
-def GetOptions(constant=True, retain=True, non_retain=True):
-    _ = lambda x : x
-    options = [""]
-    if constant:
-        options.append(_("Constant"))
-    if retain:
-        options.append(_("Retain"))
-    if non_retain:
-        options.append(_("Non-Retain"))
-    return options
-OPTIONS_DICT = dict([(_(option), option) for option in GetOptions()])
-
-def GetFilterChoiceTransfer():
-    _ = lambda x : x
-    return {_("All"): _("All"), _("Interface"): _("Interface"),
-            _("   Input"): _("Input"), _("   Output"): _("Output"), _("   InOut"): _("InOut"),
-            _("   External"): _("External"), _("Variables"): _("Variables"), _("   Local"): _("Local"),
-            _("   Temp"): _("Temp"), _("Global"): _("Global")}#, _("Access") : _("Access")}
-VARIABLE_CHOICES_DICT = dict([(_(_class), _class) for _class in GetFilterChoiceTransfer().iterkeys()])
-VARIABLE_CLASSES_DICT = dict([(_(_class), _class) for _class in GetFilterChoiceTransfer().itervalues()])
-
-CheckOptionForClass = {"Local": lambda x: x,
-                       "Temp": lambda x: "",
-                       "Input": lambda x: {"Retain": "Retain", "Non-Retain": "Non-Retain"}.get(x, ""),
-                       "InOut": lambda x: "",
-                       "Output": lambda x: {"Retain": "Retain", "Non-Retain": "Non-Retain"}.get(x, ""),
-                       "Global": lambda x: {"Constant": "Constant", "Retain": "Retain"}.get(x, ""),
-                       "External": lambda x: {"Constant": "Constant"}.get(x, "")
-                      }
-
-LOCATION_MODEL = re.compile("((?:%[IQM](?:\*|(?:[XBWLD]?[0-9]+(?:\.[0-9]+)*)))?)$")
-VARIABLE_NAME_SUFFIX_MODEL = re.compile("([0-9]*)$")
-
-#-------------------------------------------------------------------------------
-#                            Variables Panel Table
-#-------------------------------------------------------------------------------
-
-class VariableTable(CustomTable):
-
-    """
-    A custom wx.grid.Grid Table using user supplied data
-    """
-    def __init__(self, parent, data, colnames):
-        # The base class must be initialized *first*
-        CustomTable.__init__(self, parent, data, colnames)
-        self.old_value = None
-
-    def GetValueByName(self, row, colname):
-        if row < self.GetNumberRows():
-            return getattr(self.data[row], colname)
-
-    def SetValueByName(self, row, colname, value):
-        if row < self.GetNumberRows():
-            setattr(self.data[row], colname, value)
-
-    def GetValue(self, row, col):
-        if row < self.GetNumberRows():
-            if col == 0:
-                return self.data[row].Number
-            colname = self.GetColLabelValue(col, False)
-            if colname == "Initial Value":
-                colname = "InitialValue"
-            value = getattr(self.data[row], colname, "")
-            if colname == "Type" and isinstance(value, TupleType):
-                if value[0] == "array":
-                    return "ARRAY [%s] OF %s" % (",".join(map(lambda x : "..".join(x), value[2])), value[1])
-            if not isinstance(value, (StringType, UnicodeType)):
-                value = str(value)
-            if colname in ["Class", "Option"]:
-                return _(value)
-            return value
-
-    def SetValue(self, row, col, value):
-        if col < len(self.colnames):
-            colname = self.GetColLabelValue(col, False)
-            if colname == "Name":
-                self.old_value = getattr(self.data[row], colname)
-            elif colname == "Class":
-                value = VARIABLE_CLASSES_DICT[value]
-                self.SetValueByName(row, "Option", CheckOptionForClass[value](self.GetValueByName(row, "Option")))
-                if value == "External":
-                    self.SetValueByName(row, "InitialValue", "")
-            elif colname == "Option":
-                value = OPTIONS_DICT[value]
-            elif colname == "Initial Value":
-                colname = "InitialValue"
-            setattr(self.data[row], colname, value)
-
-    def GetOldValue(self):
-        return self.old_value
-
-    def _GetRowEdit(self, row):
-        row_edit = self.GetValueByName(row, "Edit")
-        var_type = self.Parent.GetTagName()
-        bodytype = self.Parent.Controler.GetEditedElementBodyType(var_type)
-        if bodytype in ["ST", "IL"]:
-            row_edit = True;
-        return row_edit
-
-    def _updateColAttrs(self, grid):
-        """
-        wx.grid.Grid -> update the column attributes to add the
-        appropriate renderer given the column name.
-
-        Otherwise default to the default renderer.
-        """
-        for row in range(self.GetNumberRows()):
-            var_class = self.GetValueByName(row, "Class")
-            var_type = self.GetValueByName(row, "Type")
-            row_highlights = self.Highlights.get(row, {})
-            for col in range(self.GetNumberCols()):
-                editor = None
-                renderer = None
-                colname = self.GetColLabelValue(col, False)
-                if self.Parent.Debug:
-                    grid.SetReadOnly(row, col, True)
-                else:
-                    if colname == "Option":
-                        options = GetOptions(constant = var_class in ["Local", "External", "Global"],
-                                             retain = self.Parent.ElementType != "function" and var_class in ["Local", "Input", "Output", "Global"],
-                                             non_retain = self.Parent.ElementType != "function" and var_class in ["Local", "Input", "Output"])
-                        if len(options) > 1:
-                            editor = wx.grid.GridCellChoiceEditor()
-                            editor.SetParameters(",".join(map(_, options)))
-                        else:
-                            grid.SetReadOnly(row, col, True)
-                    elif col != 0 and self._GetRowEdit(row):
-                        grid.SetReadOnly(row, col, False)
-                        if colname == "Name":
-                            editor = wx.grid.GridCellTextEditor()
-                            renderer = wx.grid.GridCellStringRenderer()
-                        elif colname == "Initial Value":
-                            if var_class not in ["External", "InOut"]:
-                                if self.Parent.Controler.IsEnumeratedType(var_type):
-                                    editor = wx.grid.GridCellChoiceEditor()
-                                    editor.SetParameters(",".join([""] + self.Parent.Controler.GetEnumeratedDataValues(var_type)))
-                                else:
-                                    editor = wx.grid.GridCellTextEditor()
-                                renderer = wx.grid.GridCellStringRenderer()
-                            else:
-                                grid.SetReadOnly(row, col, True)
-                        elif colname == "Location":
-                            if var_class in ["Local", "Global"] and self.Parent.Controler.IsLocatableType(var_type):
-                                editor = LocationCellEditor(self, self.Parent.Controler)
-                                renderer = wx.grid.GridCellStringRenderer()
-                            else:
-                                grid.SetReadOnly(row, col, True)
-                        elif colname == "Class":
-                            if len(self.Parent.ClassList) == 1:
-                                grid.SetReadOnly(row, col, True)
-                            else:
-                                editor = wx.grid.GridCellChoiceEditor()
-                                excluded = []
-                                if self.Parent.IsFunctionBlockType(var_type):
-                                    excluded.extend(["Local","Temp"])
-                                editor.SetParameters(",".join([_(choice) for choice in self.Parent.ClassList if choice not in excluded]))
-                    elif colname != "Documentation":
-                        grid.SetReadOnly(row, col, True)
-
-                grid.SetCellEditor(row, col, editor)
-                grid.SetCellRenderer(row, col, renderer)
-
-                if colname == "Location" and LOCATION_MODEL.match(self.GetValueByName(row, colname)) is None:
-                    highlight_colours = ERROR_HIGHLIGHT
-                else:
-                    highlight_colours = row_highlights.get(colname.lower(), [(wx.WHITE, wx.BLACK)])[-1]
-                grid.SetCellBackgroundColour(row, col, highlight_colours[0])
-                grid.SetCellTextColour(row, col, highlight_colours[1])
-            self.ResizeRow(grid, row)
-
-#-------------------------------------------------------------------------------
-#                         Variable Panel Drop Target
-#-------------------------------------------------------------------------------
-
-class VariableDropTarget(wx.TextDropTarget):
-    '''
-    This allows dragging a variable location from somewhere to the Location
-    column of a variable row.
-
-    The drag source should be a TextDataObject containing a Python tuple like:
-        ('%ID0.0.0', 'location', 'REAL')
-
-    c_ext/CFileEditor.py has an example of this (you can drag a C extension
-    variable to the Location column of the variable panel).
-    '''
-    def __init__(self, parent):
-        wx.TextDropTarget.__init__(self)
-        self.ParentWindow = parent
-
-    def OnDropText(self, x, y, data):
-        self.ParentWindow.ParentWindow.Select()
-        x, y = self.ParentWindow.VariablesGrid.CalcUnscrolledPosition(x, y)
-        col = self.ParentWindow.VariablesGrid.XToCol(x)
-        row = self.ParentWindow.VariablesGrid.YToRow(y)
-        message = None
-        element_type = self.ParentWindow.ElementType
-        try:
-            values = eval(data)
-        except:
-            message = _("Invalid value \"%s\" for variable grid element")%data
-            values = None
-        if not isinstance(values, TupleType):
-            message = _("Invalid value \"%s\" for variable grid element")%data
-            values = None
-        if values is not None:
-            if col != wx.NOT_FOUND and row != wx.NOT_FOUND:
-                colname = self.ParentWindow.Table.GetColLabelValue(col, False)
-                if colname == "Location" and values[1] == "location":
-                    if not self.ParentWindow.Table.GetValueByName(row, "Edit"):
-                        message = _("Can't give a location to a function block instance")
-                    elif self.ParentWindow.Table.GetValueByName(row, "Class") not in ["Local", "Global"]:
-                        message = _("Can only give a location to local or global variables")
-                    else:
-                        location = values[0]
-                        variable_type = self.ParentWindow.Table.GetValueByName(row, "Type")
-                        base_type = self.ParentWindow.Controler.GetBaseType(variable_type)
-
-                        if values[2] is not None:
-                            base_location_type = self.ParentWindow.Controler.GetBaseType(values[2])
-                            if values[2] != variable_type and base_type != base_location_type:
-                                message = _("Incompatible data types between \"{a1}\" and \"{a2}\"").\
-                                          format(a1 = values[2], a2 = variable_type)
-
-                        if message is None:
-                            if not location.startswith("%"):
-                                if location[0].isdigit() and base_type != "BOOL":
-                                    message = _("Incompatible size of data between \"%s\" and \"BOOL\"")%location
-                                elif location[0] not in LOCATIONDATATYPES:
-                                    message = _("Unrecognized data size \"%s\"")%location[0]
-                                elif base_type not in LOCATIONDATATYPES[location[0]]:
-                                    message = _("Incompatible size of data between \"{a1}\" and \"{a2}\"").\
-                                              format(a1 = location, a2 = variable_type)
-                                else:
-                                    dialog = wx.SingleChoiceDialog(self.ParentWindow.ParentWindow.ParentWindow,
-                                          _("Select a variable class:"), _("Variable class"),
-                                          [_("Input"), _("Output"), _("Memory")],
-                                          wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
-                                    if dialog.ShowModal() == wx.ID_OK:
-                                        selected = dialog.GetSelection()
-                                    else:
-                                        selected = None
-                                    dialog.Destroy()
-                                    if selected is None:
-                                        return
-                                    if selected == 0:
-                                        location = "%I" + location
-                                    elif selected == 1:
-                                        location = "%Q" + location
-                                    else:
-                                        location = "%M" + location
-
-                            if message is None:
-                                self.ParentWindow.Table.SetValue(row, col, location)
-                                self.ParentWindow.Table.ResetView(self.ParentWindow.VariablesGrid)
-                                self.ParentWindow.SaveValues()
-                elif colname == "Initial Value" and values[1] == "Constant":
-                    if not self.ParentWindow.Table.GetValueByName(row, "Edit"):
-                        message = _("Can't set an initial value to a function block instance")
-                    else:
-                        self.ParentWindow.Table.SetValue(row, col, values[0])
-                        self.ParentWindow.Table.ResetView(self.ParentWindow.VariablesGrid)
-                        self.ParentWindow.SaveValues()
-            elif (element_type not in ["config", "resource", "function"] and values[1] == "Global" and
-                  self.ParentWindow.Filter in ["All", "Interface", "External"] or
-                  element_type != "function" and values[1] in ["location", "NamedConstant"]):
-                if values[1] in  ["location","NamedConstant"]:
-                    var_name = values[3]
-                else:
-                    var_name = values[0]
-                tagname = self.ParentWindow.GetTagName()
-                dlg = wx.TextEntryDialog(
-                    self.ParentWindow.ParentWindow.ParentWindow,
-                    _("Confirm or change variable name"),
-                    _('Variable Drop'), var_name)
-                dlg.SetValue(var_name)
-                var_name = dlg.GetValue() if dlg.ShowModal() == wx.ID_OK else None
-                dlg.Destroy()
-                if var_name is None:
-                    return
-                elif var_name.upper() in [name.upper()
-                        for name in self.ParentWindow.Controler.\
-                            GetProjectPouNames(self.ParentWindow.Debug)]:
-                    message = _("\"%s\" pou already exists!")%var_name
-                elif not var_name.upper() in [name.upper()
-                        for name in self.ParentWindow.Controler.\
-                            GetEditedElementVariables(tagname, self.ParentWindow.Debug)]:
-                    var_infos = self.ParentWindow.DefaultValue.copy()
-                    var_infos.Name = var_name
-                    var_infos.Type = values[2]
-                    var_infos.Documentation = values[4]
-                    if values[1] == "location":
-                        location = values[0]
-                        if not location.startswith("%"):
-                            dialog = wx.SingleChoiceDialog(self.ParentWindow.ParentWindow.ParentWindow,
-                                  _("Select a variable class:"), _("Variable class"),
-                                  [_("Input"), _("Output"), _("Memory")],
-                                  wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
-                            if dialog.ShowModal() == wx.ID_OK:
-                                selected = dialog.GetSelection()
-                            else:
-                                selected = None
-                            dialog.Destroy()
-                            if selected is None:
-                                return
-                            if selected == 0:
-                                location = "%I" + location
-                            elif selected == 1:
-                                location = "%Q" + location
-                            else:
-                                location = "%M" + location
-                        if element_type == "functionBlock":
-                            configs = self.ParentWindow.Controler.GetProjectConfigNames(
-                                                                self.ParentWindow.Debug)
-                            if len(configs) == 0:
-                                return
-                            if not var_name.upper() in [name.upper()
-                                for name in self.ParentWindow.Controler.\
-                                    GetConfigurationVariableNames(configs[0])]:
-                                self.ParentWindow.Controler.AddConfigurationGlobalVar(
-                                    configs[0], values[2], var_name, location, "")
-                            var_infos.Class = "External"
-                        else:
-                            if element_type == "program":
-                                var_infos.Class = "Local"
-                            else:
-                                var_infos.Class = "Global"
-                            var_infos.Location = location
-                    elif values[1] == "NamedConstant":
-                        if element_type in ["functionBlock","program"]:
-                            var_infos.Class = "Local"
-                            var_infos.InitialValue = values[0]
-                        else :
-                            return
-                    else:
-                        var_infos.Class = "External"
-                    var_infos.Number = len(self.ParentWindow.Values)
-                    self.ParentWindow.Values.append(var_infos)
-                    self.ParentWindow.SaveValues()
-                    self.ParentWindow.RefreshValues()
-                else:
-                    message = _("\"%s\" element for this pou already exists!")%var_name
-
-        if message is not None:
-            wx.CallAfter(self.ShowMessage, message)
-
-    def ShowMessage(self, message):
-        message = wx.MessageDialog(self.ParentWindow, message, _("Error"), wx.OK|wx.ICON_ERROR)
-        message.ShowModal()
-        message.Destroy()
-
-#-------------------------------------------------------------------------------
-#                               Variable Panel
-#-------------------------------------------------------------------------------
-
-class VariablePanel(wx.Panel):
-
-    def __init__(self, parent, window, controler, element_type, debug=False):
-        wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL)
-
-        self.MainSizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=0)
-        self.MainSizer.AddGrowableCol(0)
-        self.MainSizer.AddGrowableRow(1)
-
-        controls_sizer = wx.FlexGridSizer(cols=10, hgap=5, rows=1, vgap=5)
-        controls_sizer.AddGrowableCol(5)
-        controls_sizer.AddGrowableRow(0)
-        self.MainSizer.AddSizer(controls_sizer, border=5, flag=wx.GROW|wx.ALL)
-
-        self.ReturnTypeLabel = wx.StaticText(self, label=_('Return Type:'))
-        controls_sizer.AddWindow(self.ReturnTypeLabel, flag=wx.ALIGN_CENTER_VERTICAL)
-
-        self.ReturnType = wx.ComboBox(self,
-              size=wx.Size(145, -1), style=wx.CB_READONLY)
-        self.Bind(wx.EVT_COMBOBOX, self.OnReturnTypeChanged, self.ReturnType)
-        controls_sizer.AddWindow(self.ReturnType)
-
-        self.DescriptionLabel = wx.StaticText(self, label=_('Description:'))
-        controls_sizer.AddWindow(self.DescriptionLabel, flag=wx.ALIGN_CENTER_VERTICAL)
-
-        self.Description = wx.TextCtrl(self,
-              size=wx.Size(250, -1), style=wx.TE_PROCESS_ENTER)
-        self.Bind(wx.EVT_TEXT_ENTER, self.OnDescriptionChanged, self.Description)
-        self.Description.Bind(wx.EVT_KILL_FOCUS, self.OnDescriptionChanged)
-        controls_sizer.AddWindow(self.Description)
-
-        class_filter_label = wx.StaticText(self, label=_('Class Filter:'))
-        controls_sizer.AddWindow(class_filter_label, flag=wx.ALIGN_CENTER_VERTICAL)
-
-        self.ClassFilter = wx.ComboBox(self,
-              size=wx.Size(145, -1), style=wx.CB_READONLY)
-        self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, self.ClassFilter)
-        controls_sizer.AddWindow(self.ClassFilter)
-
-        for name, bitmap, help in [
-                ("AddButton", "add_element", _("Add variable")),
-                ("DeleteButton", "remove_element", _("Remove variable")),
-                ("UpButton", "up", _("Move variable up")),
-                ("DownButton", "down", _("Move variable down"))]:
-            button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap),
-                  size=wx.Size(28, 28), style=wx.NO_BORDER)
-            button.SetToolTipString(help)
-            setattr(self, name, button)
-            controls_sizer.AddWindow(button)
-
-        self.VariablesGrid = CustomGrid(self, style=wx.VSCROLL)
-        self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
-        self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
-              self.OnVariablesGridCellChange)
-        self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK,
-              self.OnVariablesGridCellLeftClick)
-        self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
-              self.OnVariablesGridEditorShown)
-        self.MainSizer.AddWindow(self.VariablesGrid, flag=wx.GROW)
-
-        self.SetSizer(self.MainSizer)
-
-        self.ParentWindow = window
-        self.Controler = controler
-        self.ElementType = element_type
-        self.Debug = debug
-
-        self.RefreshHighlightsTimer = wx.Timer(self, -1)
-        self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer,
-              self.RefreshHighlightsTimer)
-
-        self.Filter = "All"
-        self.FilterChoices = []
-        self.FilterChoiceTransfer = GetFilterChoiceTransfer()
-
-        self.DefaultValue = _VariableInfos("", "", "", "", "", True, "", DefaultType, ([], []), 0)
-
-        if element_type in ["config", "resource"]:
-            self.DefaultTypes = {"All" : "Global"}
-        else:
-            self.DefaultTypes = {"All" : "Local", "Interface" : "Input", "Variables" : "Local"}
-
-        if element_type in ["config", "resource"] \
-        or element_type in ["program", "transition", "action"]:
-            # this is an element that can have located variables
-            self.Table = VariableTable(self, [], GetVariableTableColnames(True))
-
-            if element_type in ["config", "resource"]:
-                self.FilterChoices = ["All", "Global"]#,"Access"]
-            else:
-                self.FilterChoices = ["All",
-                                        "Interface", "   Input", "   Output", "   InOut", "   External",
-                                        "Variables", "   Local", "   Temp"]#,"Access"]
-
-            # these condense the ColAlignements list
-            l = wx.ALIGN_LEFT
-            c = wx.ALIGN_CENTER
-
-            #                      Num  Name    Class   Type    Loc     Init    Option   Doc
-            self.ColSizes       = [40,  80,     70,     80,     80,     80,     100,     80]
-            self.ColAlignements = [c,   l,      l,      l,      l,      l,      l,       l]
-
-        else:
-            # this is an element that cannot have located variables
-            self.Table = VariableTable(self, [], GetVariableTableColnames(False))
-
-            if element_type == "function":
-                self.FilterChoices = ["All",
-                                        "Interface", "   Input", "   Output", "   InOut",
-                                        "Variables", "   Local"]
-            else:
-                self.FilterChoices = ["All",
-                                        "Interface", "   Input", "   Output", "   InOut", "   External",
-                                        "Variables", "   Local", "   Temp"]
-
-            # these condense the ColAlignements list
-            l = wx.ALIGN_LEFT
-            c = wx.ALIGN_CENTER
-
-            #                      Num  Name    Class   Type    Init    Option   Doc
-            self.ColSizes       = [40,  80,     70,     80,     80,     100,     160]
-            self.ColAlignements = [c,   l,      l,      l,      l,      l,       l]
-
-        self.ElementType = element_type
-        self.BodyType = None
-
-        for choice in self.FilterChoices:
-            self.ClassFilter.Append(_(choice))
-
-        reverse_transfer = {}
-        for filter, choice in self.FilterChoiceTransfer.items():
-            reverse_transfer[choice] = filter
-        self.ClassFilter.SetStringSelection(_(reverse_transfer[self.Filter]))
-        self.RefreshTypeList()
-
-        self.VariablesGrid.SetTable(self.Table)
-        self.VariablesGrid.SetButtons({"Add": self.AddButton,
-                                       "Delete": self.DeleteButton,
-                                       "Up": self.UpButton,
-                                       "Down": self.DownButton})
-        self.VariablesGrid.SetEditable(not self.Debug)
-
-        def _AddVariable(new_row):
-            if new_row > 0:
-                row_content = self.Values[new_row - 1].copy()
-
-                result = VARIABLE_NAME_SUFFIX_MODEL.search(row_content.Name)
-                if result is not None:
-                    name = row_content.Name[:result.start(1)]
-                    suffix = result.group(1)
-                    if suffix != "":
-                        start_idx = int(suffix)
-                    else:
-                        start_idx = 0
-                else:
-                    name = row_content.Name
-                    start_idx = 0
-            else:
-                row_content = None
-                start_idx = 0
-                name = "LocalVar"
-
-            if row_content is not None and row_content.Edit:
-                row_content = self.Values[new_row - 1].copy()
-            else:
-                row_content = self.DefaultValue.copy()
-                if self.Filter in self.DefaultTypes:
-                    row_content.Class = self.DefaultTypes[self.Filter]
-                else:
-                    row_content.Class = self.Filter
-
-            row_content.Name = self.Controler.GenerateNewName(
-                    self.TagName, None, name + "%d", start_idx)
-
-            if self.Filter == "All" and len(self.Values) > 0:
-                self.Values.insert(new_row, row_content)
-            else:
-                self.Values.append(row_content)
-                new_row = self.Table.GetNumberRows()
-            self.SaveValues()
-            if self.ElementType == "resource":
-                self.ParentWindow.RefreshView(variablepanel = False)
-            self.RefreshValues()
-            return new_row
-        setattr(self.VariablesGrid, "_AddRow", _AddVariable)
-
-        def _DeleteVariable(row):
-            if _GetRowEdit(row):
-                self.Values.remove(self.Table.GetRow(row))
-                self.SaveValues()
-                if self.ElementType == "resource":
-                    self.ParentWindow.RefreshView(variablepanel = False)
-                self.RefreshValues()
-        setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable)
-
-        def _MoveVariable(row, move):
-            if self.Filter == "All":
-                new_row = max(0, min(row + move, len(self.Values) - 1))
-                if new_row != row:
-                    self.Values.insert(new_row, self.Values.pop(row))
-                    self.SaveValues()
-                    self.RefreshValues()
-                return new_row
-            return row
-        setattr(self.VariablesGrid, "_MoveRow", _MoveVariable)
-
-        def _GetRowEdit(row):
-            row_edit = False
-            if self:
-                row_edit = self.Table.GetValueByName(row, "Edit")
-                bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
-                row_edit = row_edit or (bodytype in ["ST", "IL"])
-            return row_edit
-
-        def _RefreshButtons():
-            if self:
-                table_length = len(self.Table.data)
-                row_class = None
-                row_edit = True
-                row = 0
-                if table_length > 0:
-                    row = self.VariablesGrid.GetGridCursorRow()
-                    row_edit = _GetRowEdit(row)
-                self.AddButton.Enable(not self.Debug)
-                self.DeleteButton.Enable(not self.Debug and (table_length > 0 and row_edit))
-                self.UpButton.Enable(not self.Debug and (table_length > 0 and row > 0 and self.Filter == "All"))
-                self.DownButton.Enable(not self.Debug and (table_length > 0 and row < table_length - 1 and self.Filter == "All"))
-        setattr(self.VariablesGrid, "RefreshButtons", _RefreshButtons)
-
-        self.VariablesGrid.SetRowLabelSize(0)
-        for col in range(self.Table.GetNumberCols()):
-            attr = wx.grid.GridCellAttr()
-            attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
-            self.VariablesGrid.SetColAttr(col, attr)
-            self.VariablesGrid.SetColMinimalWidth(col, self.ColSizes[col])
-            self.VariablesGrid.AutoSizeColumn(col, False)
-
-    def __del__(self):
-        self.RefreshHighlightsTimer.Stop()
-
-    def SetTagName(self, tagname):
-        self.TagName = tagname
-        self.BodyType = self.Controler.GetEditedElementBodyType(self.TagName)
-
-    def GetTagName(self):
-        return self.TagName
-
-    def IsFunctionBlockType(self, name):
-        if (isinstance(name, TupleType) or
-            self.ElementType != "function" and self.BodyType in ["ST", "IL"]):
-            return False
-        else:
-            return self.Controler.GetBlockType(name, debug=self.Debug) is not None
-
-    def RefreshView(self):
-        self.PouNames = self.Controler.GetProjectPouNames(self.Debug)
-        returnType = None
-        description = None
-
-        words = self.TagName.split("::")
-        if self.ElementType == "config":
-            self.Values = self.Controler.GetConfigurationGlobalVars(words[1], self.Debug)
-        elif self.ElementType == "resource":
-            self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2], self.Debug)
-        else:
-            if self.ElementType == "function":
-                self.ReturnType.Clear()
-                for data_type in self.Controler.GetDataTypes(self.TagName, debug=self.Debug):
-                    self.ReturnType.Append(data_type)
-                returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, debug=self.Debug)
-            description = self.Controler.GetPouDescription(words[1])
-            self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug)
-
-        if returnType is not None:
-            self.ReturnType.SetStringSelection(returnType)
-            self.ReturnType.Enable(not self.Debug)
-            self.ReturnTypeLabel.Show()
-            self.ReturnType.Show()
-        else:
-            self.ReturnType.Enable(False)
-            self.ReturnTypeLabel.Hide()
-            self.ReturnType.Hide()
-
-        if description is not None:
-            self.Description.SetValue(description)
-            self.Description.Enable(not self.Debug)
-            self.DescriptionLabel.Show()
-            self.Description.Show()
-        else:
-            self.Description.Enable(False)
-            self.DescriptionLabel.Hide()
-            self.Description.Hide()
-
-        self.RefreshValues()
-        self.VariablesGrid.RefreshButtons()
-        self.MainSizer.Layout()
-
-    def OnReturnTypeChanged(self, event):
-        words = self.TagName.split("::")
-        self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
-        self.Controler.BufferProject()
-        self.ParentWindow.RefreshView(variablepanel = False)
-        self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
-        event.Skip()
-
-    def OnDescriptionChanged(self, event):
-        words = self.TagName.split("::")
-        old_description = self.Controler.GetPouDescription(words[1])
-        new_description = self.Description.GetValue()
-        if new_description != old_description:
-            self.Controler.SetPouDescription(words[1], new_description)
-            self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
-        event.Skip()
-
-    def OnClassFilter(self, event):
-        self.Filter = self.FilterChoiceTransfer[VARIABLE_CHOICES_DICT[self.ClassFilter.GetStringSelection()]]
-        self.RefreshTypeList()
-        self.RefreshValues()
-        self.VariablesGrid.RefreshButtons()
-        event.Skip()
-
-    def RefreshTypeList(self):
-        if self.Filter == "All":
-            self.ClassList = [self.FilterChoiceTransfer[choice] for choice in self.FilterChoices if self.FilterChoiceTransfer[choice] not in ["All","Interface","Variables"]]
-        elif self.Filter == "Interface":
-            self.ClassList = ["Input","Output","InOut","External"]
-        elif self.Filter == "Variables":
-            self.ClassList = ["Local","Temp"]
-        else:
-            self.ClassList = [self.Filter]
-
-    def OnVariablesGridCellChange(self, event):
-        row, col = event.GetRow(), event.GetCol()
-        colname = self.Table.GetColLabelValue(col, False)
-        value = self.Table.GetValue(row, col)
-        message = None
-
-        if colname == "Name" and value != "":
-            if not TestIdentifier(value):
-                message = _("\"%s\" is not a valid identifier!") % value
-            elif value.upper() in IEC_KEYWORDS:
-                message = _("\"%s\" is a keyword. It can't be used!") % value
-            elif value.upper() in self.PouNames:
-                message = _("A POU named \"%s\" already exists!") % value
-            elif value.upper() in [var.Name.upper() for var in self.Values if var != self.Table.data[row]]:
-                message = _("A variable with \"%s\" as name already exists in this pou!") % value
-            else:
-                self.SaveValues(False)
-                old_value = self.Table.GetOldValue()
-                if old_value != "":
-                    self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value)
-                self.Controler.BufferProject()
-                wx.CallAfter(self.ParentWindow.RefreshView, False)
-                self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
-        else:
-            self.SaveValues()
-            if colname == "Class":
-                wx.CallAfter(self.ParentWindow.RefreshView, False)
-            elif colname == "Location":
-                wx.CallAfter(self.ParentWindow.RefreshView)
-
-        if message is not None:
-            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
-            dialog.ShowModal()
-            dialog.Destroy()
-            event.Veto()
-        else:
-            event.Skip()
-
-    def BuildStdIECTypesMenu(self,type_menu):
-            # build a submenu containing standard IEC types
-            base_menu = wx.Menu(title='')
-            for base_type in self.Controler.GetBaseTypes():
-                new_id = wx.NewId()
-                base_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
-                self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id)
-
-            type_menu.AppendMenu(wx.NewId(), _("Base Types"), base_menu)
-
-    def BuildUserTypesMenu(self,type_menu):
-            # build a submenu containing user-defined types
-            datatype_menu = wx.Menu(title='')
-            datatypes = self.Controler.GetDataTypes(basetypes = False, confnodetypes = False)
-            for datatype in datatypes:
-                new_id = wx.NewId()
-                datatype_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
-                self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id)
-
-            type_menu.AppendMenu(wx.NewId(), _("User Data Types"), datatype_menu)
-
-    def BuildLibsTypesMenu(self, type_menu):
-        for category in self.Controler.GetConfNodeDataTypes():
-            if len(category["list"]) > 0:
-                # build a submenu containing confnode types
-                confnode_datatype_menu = wx.Menu(title='')
-                for datatype in category["list"]:
-                    new_id = wx.NewId()
-                    confnode_datatype_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
-                    self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id)
-
-                type_menu.AppendMenu(wx.NewId(), category["name"], confnode_datatype_menu)
-
-    def BuildProjectTypesMenu(self, type_menu, classtype):
-        # build a submenu containing function block types
-        bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
-        pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
-        if classtype in ["Input", "Output", "InOut", "External", "Global"] or \
-        poutype != "function" and bodytype in ["ST", "IL"]:
-            functionblock_menu = wx.Menu(title='')
-            fbtypes = self.Controler.GetFunctionBlockTypes(self.TagName)
-            for functionblock_type in fbtypes:
-                new_id = wx.NewId()
-                functionblock_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
-                self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
-
-            type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu)
-
-    def BuildArrayTypesMenu(self, type_menu):
-        new_id = wx.NewId()
-        type_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Array"))
-        self.Bind(wx.EVT_MENU, self.VariableArrayTypeFunction, id=new_id)
-
-    def OnVariablesGridEditorShown(self, event):
-        row, col = event.GetRow(), event.GetCol()
-
-        label_value = self.Table.GetColLabelValue(col, False)
-        if label_value == "Type":
-            classtype = self.Table.GetValueByName(row, "Class")
-            type_menu = wx.Menu(title='')   # the root menu
-
-            self.BuildStdIECTypesMenu(type_menu)
-
-            self.BuildUserTypesMenu(type_menu)
-
-            self.BuildLibsTypesMenu(type_menu)
-
-            self.BuildProjectTypesMenu(type_menu,classtype)
-
-            self.BuildArrayTypesMenu(type_menu)
-
-            rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col))
-            corner_x = rect.x + rect.width
-            corner_y = rect.y + self.VariablesGrid.GetColLabelSize()
-
-            # pop up this new menu
-            self.VariablesGrid.PopupMenuXY(type_menu, corner_x, corner_y)
-            type_menu.Destroy()
-            event.Veto()
-        else:
-            event.Skip()
-
-    def GetVariableTypeFunction(self, base_type):
-        def VariableTypeFunction(event):
-            row = self.VariablesGrid.GetGridCursorRow()
-            self.Table.SetValueByName(row, "Type", base_type)
-            self.Table.ResetView(self.VariablesGrid)
-            self.SaveValues(False)
-            self.ParentWindow.RefreshView(variablepanel = False)
-            self.Controler.BufferProject()
-            self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
-        return VariableTypeFunction
-
-    def VariableArrayTypeFunction(self, event):
-        row = self.VariablesGrid.GetGridCursorRow()
-        dialog = ArrayTypeDialog(self,
-                                 self.Controler.GetDataTypes(self.TagName),
-                                 self.Table.GetValueByName(row, "Type"))
-        if dialog.ShowModal() == wx.ID_OK:
-            self.Table.SetValueByName(row, "Type", dialog.GetValue())
-            self.Table.ResetView(self.VariablesGrid)
-            self.SaveValues(False)
-            self.ParentWindow.RefreshView(variablepanel = False)
-            self.Controler.BufferProject()
-            self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
-        dialog.Destroy()
-
-    def OnVariablesGridCellLeftClick(self, event):
-        row = event.GetRow()
-        if not self.Debug and (event.GetCol() == 0 and self.Table.GetValueByName(row, "Edit")):
-            var_name = self.Table.GetValueByName(row, "Name")
-            var_class = self.Table.GetValueByName(row, "Class")
-            var_type = self.Table.GetValueByName(row, "Type")
-            data = wx.TextDataObject(str((var_name, var_class, var_type, self.TagName)))
-            dragSource = wx.DropSource(self.VariablesGrid)
-            dragSource.SetData(data)
-            dragSource.DoDragDrop()
-        event.Skip()
-
-    def RefreshValues(self):
-        data = []
-        for num, variable in enumerate(self.Values):
-            if variable.Class in self.ClassList:
-                variable.Number = num + 1
-                data.append(variable)
-        self.Table.SetData(data)
-        self.Table.ResetView(self.VariablesGrid)
-
-    def SaveValues(self, buffer = True):
-        words = self.TagName.split("::")
-        if self.ElementType == "config":
-            self.Controler.SetConfigurationGlobalVars(words[1], self.Values)
-        elif self.ElementType == "resource":
-            self.Controler.SetConfigurationResourceGlobalVars(words[1], words[2], self.Values)
-        else:
-            if self.ReturnType.IsEnabled():
-                self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
-            self.Controler.SetPouInterfaceVars(words[1], self.Values)
-        if buffer:
-            self.Controler.BufferProject()
-            self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
-
-#-------------------------------------------------------------------------------
-#                        Highlights showing functions
-#-------------------------------------------------------------------------------
-
-    def OnRefreshHighlightsTimer(self, event):
-        self.Table.ResetView(self.VariablesGrid)
-        event.Skip()
-
-    def AddVariableHighlight(self, infos, highlight_type):
-        if isinstance(infos[0], TupleType):
-            for i in xrange(*infos[0]):
-                self.Table.AddHighlight((i,) + infos[1:], highlight_type)
-            cell_visible = infos[0][0]
-        else:
-            self.Table.AddHighlight(infos, highlight_type)
-            cell_visible = infos[0]
-        colnames = [colname.lower() for colname in self.Table.colnames]
-        self.VariablesGrid.MakeCellVisible(cell_visible, colnames.index(infos[1]))
-        self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
-
-    def RemoveVariableHighlight(self, infos, highlight_type):
-        if isinstance(infos[0], TupleType):
-            for i in xrange(*infos[0]):
-                self.Table.RemoveHighlight((i,) + infos[1:], highlight_type)
-        else:
-            self.Table.RemoveHighlight(infos, highlight_type)
-        self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
-
-    def ClearHighlights(self, highlight_type=None):
-        self.Table.ClearHighlights(highlight_type)
-        self.Table.ResetView(self.VariablesGrid)
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+
+from __future__ import absolute_import
+from __future__ import division
+import re
+from builtins import str as text
+
+import wx
+import wx.grid
+import wx.lib.buttons
+from six import string_types
+from six.moves import xrange
+
+from plcopen.structures import LOCATIONDATATYPES, TestIdentifier, IEC_KEYWORDS, DefaultType
+from plcopen.VariableInfoCollector import _VariableInfos
+from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD, ERROR_HIGHLIGHT
+from dialogs.ArrayTypeDialog import ArrayTypeDialog
+from controls.CustomGrid import CustomGrid
+from controls.CustomTable import CustomTable
+from controls.LocationCellEditor import LocationCellEditor
+from util.BitmapLibrary import GetBitmap
+from util.TranslationCatalogs import NoTranslate
+
+
+# -------------------------------------------------------------------------------
+#                                 Helpers
+# -------------------------------------------------------------------------------
+
+
+[
+    TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE,
+    POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES
+] = range(10)
+
+
+def GetVariableTableColnames(location):
+    _ = NoTranslate
+    cols = ["#",
+            _("Name"),
+            _("Class"),
+            _("Type"),
+            _("Location"),
+            _("Initial Value"),
+            _("Option"),
+            _("Documentation")]
+    if not location:
+        del cols[4]  # remove 'Location' column
+    return cols
+
+
+def GetOptions(constant=True, retain=True, non_retain=True):
+    _ = NoTranslate
+    options = [""]
+    if constant:
+        options.append(_("Constant"))
+    if retain:
+        options.append(_("Retain"))
+    if non_retain:
+        options.append(_("Non-Retain"))
+    return options
+
+
+def GetFilterChoiceTransfer():
+    _ = NoTranslate
+    return {_("All"): _("All"), _("Interface"): _("Interface"),
+            _("   Input"): _("Input"), _("   Output"): _("Output"), _("   InOut"): _("InOut"),
+            _("   External"): _("External"), _("Variables"): _("Variables"), _("   Local"): _("Local"),
+            _("   Temp"): _("Temp"), _("Global"): _("Global")}  # , _("Access") : _("Access")}
+
+
+CheckOptionForClass = {
+    "Local": lambda x: x,
+    "Temp": lambda x: "",
+    "Input": lambda x: {"Retain": "Retain", "Non-Retain": "Non-Retain"}.get(x, ""),
+    "InOut": lambda x: "",
+    "Output": lambda x: {"Retain": "Retain", "Non-Retain": "Non-Retain"}.get(x, ""),
+    "Global": lambda x: {"Constant": "Constant", "Retain": "Retain"}.get(x, ""),
+    "External": lambda x: {"Constant": "Constant"}.get(x, "")
+}
+
+LOCATION_MODEL = re.compile(r"((?:%[IQM](?:\*|(?:[XBWLD]?[0-9]+(?:\.[0-9]+)*)))?)$")
+LOCATION_MODEL_SET = re.compile(r"((?:%[IQM](?:[XBWLD]?[0-9]+(?:\.[0-9]+)*))?)$")
+
+
+# -------------------------------------------------------------------------------
+#                            Variables Panel Table
+# -------------------------------------------------------------------------------
+
+
+class VariableTable(CustomTable):
+
+    """
+    A custom wx.grid.Grid Table using user supplied data
+    """
+    def __init__(self, parent, data, colnames):
+        # The base class must be initialized *first*
+        CustomTable.__init__(self, parent, data, colnames)
+        self.old_value = None
+        self.OPTIONS_DICT = dict([(_(option), option)
+                                  for option in GetOptions()])
+        self.VARIABLE_CLASSES_DICT = dict([(_(_class), _class)
+                                           for _class in GetFilterChoiceTransfer().itervalues()])
+
+    def GetValueByName(self, row, colname):
+        if row < self.GetNumberRows():
+            return getattr(self.data[row], colname)
+
+    def SetValueByName(self, row, colname, value):
+        if row < self.GetNumberRows():
+            setattr(self.data[row], colname, value)
+
+    def GetValue(self, row, col):
+        if row < self.GetNumberRows():
+            if col == 0:
+                return self.data[row].Number
+            colname = self.GetColLabelValue(col, False)
+            if colname == "Initial Value":
+                colname = "InitialValue"
+            value = getattr(self.data[row], colname, "")
+            if colname == "Type" and isinstance(value, tuple):
+                if value[0] == "array":
+                    return "ARRAY [%s] OF %s" % (",".join(map("..".join, value[2])), value[1])
+            if not isinstance(value, string_types):
+                value = str(value)
+            if colname in ["Class", "Option"]:
+                return _(value)
+            return value
+
+    def SetValue(self, row, col, value):
+        if col < len(self.colnames):
+            colname = self.GetColLabelValue(col, False)
+            if colname == "Name":
+                self.old_value = getattr(self.data[row], colname)
+            elif colname == "Class":
+                value = self.VARIABLE_CLASSES_DICT[value]
+                self.SetValueByName(row, "Option", CheckOptionForClass[value](self.GetValueByName(row, "Option")))
+                if value == "External":
+                    self.SetValueByName(row, "InitialValue", "")
+            elif colname == "Option":
+                value = self.OPTIONS_DICT[value]
+            elif colname == "Initial Value":
+                colname = "InitialValue"
+            setattr(self.data[row], colname, value)
+
+    def GetOldValue(self):
+        return self.old_value
+
+    def _GetRowEdit(self, row):
+        row_edit = self.GetValueByName(row, "Edit")
+        var_type = self.Parent.GetTagName()
+        bodytype = self.Parent.Controler.GetEditedElementBodyType(var_type)
+        if bodytype in ["ST", "IL"]:
+            row_edit = True
+        return row_edit
+
+    def _updateColAttrs(self, grid):
+        """
+        wx.grid.Grid -> update the column attributes to add the
+        appropriate renderer given the column name.
+
+        Otherwise default to the default renderer.
+        """
+        for row in range(self.GetNumberRows()):
+            var_class = self.GetValueByName(row, "Class")
+            var_type = self.GetValueByName(row, "Type")
+            row_highlights = self.Highlights.get(row, {})
+            for col in range(self.GetNumberCols()):
+                editor = None
+                renderer = None
+                colname = self.GetColLabelValue(col, False)
+                if self.Parent.Debug:
+                    grid.SetReadOnly(row, col, True)
+                else:
+                    if colname == "Option":
+                        options = GetOptions(constant=var_class in ["Local", "External", "Global"],
+                                             retain=self.Parent.ElementType != "function" and var_class in ["Local", "Input", "Output", "Global"],
+                                             non_retain=self.Parent.ElementType != "function" and var_class in ["Local", "Input", "Output"])
+                        if len(options) > 1:
+                            editor = wx.grid.GridCellChoiceEditor()
+                            editor.SetParameters(",".join(map(_, options)))
+                        else:
+                            grid.SetReadOnly(row, col, True)
+                    elif col != 0 and self._GetRowEdit(row):
+                        grid.SetReadOnly(row, col, False)
+                        if colname == "Name":
+                            editor = wx.grid.GridCellTextEditor()
+                            renderer = wx.grid.GridCellStringRenderer()
+                        elif colname == "Initial Value":
+                            if var_class not in ["External", "InOut"]:
+                                if self.Parent.Controler.IsEnumeratedType(var_type):
+                                    editor = wx.grid.GridCellChoiceEditor()
+                                    editor.SetParameters(",".join([""] + self.Parent.Controler.GetEnumeratedDataValues(var_type)))
+                                else:
+                                    editor = wx.grid.GridCellTextEditor()
+                                renderer = wx.grid.GridCellStringRenderer()
+                            else:
+                                grid.SetReadOnly(row, col, True)
+                        elif colname == "Location":
+                            if var_class in ["Local", "Global"] and self.Parent.Controler.IsLocatableType(var_type):
+                                editor = LocationCellEditor(self, self.Parent.Controler)
+                                renderer = wx.grid.GridCellStringRenderer()
+                            else:
+                                grid.SetReadOnly(row, col, True)
+                        elif colname == "Class":
+                            if len(self.Parent.ClassList) == 1:
+                                grid.SetReadOnly(row, col, True)
+                            else:
+                                editor = wx.grid.GridCellChoiceEditor()
+                                excluded = []
+                                if self.Parent.IsFunctionBlockType(var_type):
+                                    excluded.extend(["Local", "Temp"])
+                                editor.SetParameters(",".join([_(choice) for choice in self.Parent.ClassList if choice not in excluded]))
+                    elif colname != "Documentation":
+                        grid.SetReadOnly(row, col, True)
+
+                grid.SetCellEditor(row, col, editor)
+                grid.SetCellRenderer(row, col, renderer)
+
+                if colname == "Location" and LOCATION_MODEL.match(self.GetValueByName(row, colname)) is None:
+                    highlight_colours = ERROR_HIGHLIGHT
+                else:
+                    highlight_colours = row_highlights.get(colname.lower(), [(wx.WHITE, wx.BLACK)])[-1]
+                grid.SetCellBackgroundColour(row, col, highlight_colours[0])
+                grid.SetCellTextColour(row, col, highlight_colours[1])
+            self.ResizeRow(grid, row)
+
+
+# -------------------------------------------------------------------------------
+#                         Variable Panel Drop Target
+# -------------------------------------------------------------------------------
+
+
+class VariableDropTarget(wx.TextDropTarget):
+    '''
+    This allows dragging a variable location from somewhere to the Location
+    column of a variable row.
+
+    The drag source should be a TextDataObject containing a Python tuple like:
+        ('%ID0.0.0', 'location', 'REAL')
+
+    c_ext/CFileEditor.py has an example of this (you can drag a C extension
+    variable to the Location column of the variable panel).
+    '''
+    def __init__(self, parent):
+        wx.TextDropTarget.__init__(self)
+        self.ParentWindow = parent
+
+    def OnDropText(self, x, y, data):
+        self.ParentWindow.ParentWindow.Select()
+        x, y = self.ParentWindow.VariablesGrid.CalcUnscrolledPosition(x, y)
+        col = self.ParentWindow.VariablesGrid.XToCol(x)
+        row = self.ParentWindow.VariablesGrid.YToRow(y)
+        message = None
+        element_type = self.ParentWindow.ElementType
+        try:
+            values = eval(data)
+        except Exception:
+            message = _("Invalid value \"%s\" for variable grid element") % data
+            values = None
+        if not isinstance(values, tuple):
+            message = _("Invalid value \"%s\" for variable grid element") % data
+            values = None
+        if values is not None:
+            if col != wx.NOT_FOUND and row != wx.NOT_FOUND:
+                colname = self.ParentWindow.Table.GetColLabelValue(col, False)
+                if colname == "Location" and values[1] == "location":
+                    if not self.ParentWindow.Table.GetValueByName(row, "Edit"):
+                        message = _("Can't give a location to a function block instance")
+                    elif self.ParentWindow.Table.GetValueByName(row, "Class") not in ["Local", "Global"]:
+                        message = _("Can only give a location to local or global variables")
+                    else:
+                        location = values[0]
+                        variable_type = self.ParentWindow.Table.GetValueByName(row, "Type")
+                        base_type = self.ParentWindow.Controler.GetBaseType(variable_type)
+
+                        if values[2] is not None:
+                            base_location_type = self.ParentWindow.Controler.GetBaseType(values[2])
+                            if values[2] != variable_type and base_type != base_location_type:
+                                message = _("Incompatible data types between \"{a1}\" and \"{a2}\"").\
+                                          format(a1=values[2], a2=variable_type)
+
+                        if message is None:
+                            if not location.startswith("%"):
+                                if location[0].isdigit() and base_type != "BOOL":
+                                    message = _("Incompatible size of data between \"%s\" and \"BOOL\"") % location
+                                elif location[0] not in LOCATIONDATATYPES:
+                                    message = _("Unrecognized data size \"%s\"") % location[0]
+                                elif base_type not in LOCATIONDATATYPES[location[0]]:
+                                    message = _("Incompatible size of data between \"{a1}\" and \"{a2}\"").\
+                                              format(a1=location, a2=variable_type)
+                                else:
+                                    dialog = wx.SingleChoiceDialog(
+                                        self.ParentWindow.ParentWindow.ParentWindow,
+                                        _("Select a variable class:"),
+                                        _("Variable class"),
+                                        [_("Input"), _("Output"), _("Memory")],
+                                        wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
+                                    if dialog.ShowModal() == wx.ID_OK:
+                                        selected = dialog.GetSelection()
+                                    else:
+                                        selected = None
+                                    dialog.Destroy()
+                                    if selected is None:
+                                        return
+                                    if selected == 0:
+                                        location = "%I" + location
+                                    elif selected == 1:
+                                        location = "%Q" + location
+                                    else:
+                                        location = "%M" + location
+
+                            if message is None:
+                                self.ParentWindow.Table.SetValue(row, col, location)
+                                self.ParentWindow.Table.ResetView(self.ParentWindow.VariablesGrid)
+                                self.ParentWindow.SaveValues()
+                elif colname == "Initial Value" and values[1] == "Constant":
+                    if not self.ParentWindow.Table.GetValueByName(row, "Edit"):
+                        message = _("Can't set an initial value to a function block instance")
+                    else:
+                        self.ParentWindow.Table.SetValue(row, col, values[0])
+                        self.ParentWindow.Table.ResetView(self.ParentWindow.VariablesGrid)
+                        self.ParentWindow.SaveValues()
+            elif (element_type not in ["config", "resource", "function"] and values[1] == "Global" and
+                  self.ParentWindow.Filter in ["All", "Interface", "External"] or
+                  element_type != "function" and values[1] in ["location", "NamedConstant"]):
+                if values[1] in ["location", "NamedConstant"]:
+                    var_name = values[3]
+                else:
+                    var_name = values[0]
+                tagname = self.ParentWindow.GetTagName()
+                dlg = wx.TextEntryDialog(
+                    self.ParentWindow.ParentWindow.ParentWindow,
+                    _("Confirm or change variable name"),
+                    _('Variable Drop'), var_name)
+                dlg.SetValue(var_name)
+                var_name = dlg.GetValue() if dlg.ShowModal() == wx.ID_OK else None
+                dlg.Destroy()
+                if var_name is None:
+                    return
+                elif var_name.upper() in [
+                        name.upper() for name in
+                        self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]:
+                    message = _("\"%s\" pou already exists!") % var_name
+                elif not var_name.upper() in [
+                        name.upper()
+                        for name in self.ParentWindow.Controler.
+                        GetEditedElementVariables(tagname, self.ParentWindow.Debug)]:
+                    var_infos = self.ParentWindow.DefaultValue.copy()
+                    var_infos.Name = var_name
+                    var_infos.Type = values[2]
+                    var_infos.Documentation = values[4]
+                    if values[1] == "location":
+                        location = values[0]
+                        if not location.startswith("%"):
+                            dialog = wx.SingleChoiceDialog(
+                                self.ParentWindow.ParentWindow.ParentWindow,
+                                _("Select a variable class:"),
+                                _("Variable class"),
+                                [_("Input"), _("Output"), _("Memory")],
+                                wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
+                            if dialog.ShowModal() == wx.ID_OK:
+                                selected = dialog.GetSelection()
+                            else:
+                                selected = None
+                            dialog.Destroy()
+                            if selected is None:
+                                return
+                            if selected == 0:
+                                location = "%I" + location
+                            elif selected == 1:
+                                location = "%Q" + location
+                            else:
+                                location = "%M" + location
+                        if element_type == "functionBlock":
+                            configs = self.ParentWindow.Controler.GetProjectConfigNames(
+                                self.ParentWindow.Debug)
+                            if len(configs) == 0:
+                                return
+                            if not var_name.upper() in [
+                                    name.upper() for name in
+                                    self.ParentWindow.Controler.GetConfigurationVariableNames(configs[0])]:
+                                self.ParentWindow.Controler.AddConfigurationGlobalVar(
+                                    configs[0], values[2], var_name, location, "")
+                            var_infos.Class = "External"
+                        else:
+                            if element_type == "program":
+                                var_infos.Class = "Local"
+                            else:
+                                var_infos.Class = "Global"
+                            var_infos.Location = location
+                    elif values[1] == "NamedConstant":
+                        if element_type in ["functionBlock", "program"]:
+                            var_infos.Class = "Local"
+                            var_infos.InitialValue = values[0]
+                        else:
+                            return
+                    else:
+                        var_infos.Class = "External"
+                    var_infos.Number = len(self.ParentWindow.Values)
+                    self.ParentWindow.Values.append(var_infos)
+                    self.ParentWindow.SaveValues()
+                    self.ParentWindow.RefreshValues()
+                else:
+                    message = _("\"%s\" element for this pou already exists!") % var_name
+
+        if message is not None:
+            wx.CallAfter(self.ShowMessage, message)
+
+    def ShowMessage(self, message):
+        message = wx.MessageDialog(self.ParentWindow, message, _("Error"), wx.OK | wx.ICON_ERROR)
+        message.ShowModal()
+        message.Destroy()
+
+
+# -------------------------------------------------------------------------------
+#                               Variable Panel
+# -------------------------------------------------------------------------------
+
+
+class VariablePanel(wx.Panel):
+
+    def __init__(self, parent, window, controler, element_type, debug=False):
+        wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL)
+
+        self.VARIABLE_CHOICES_DICT = dict([(_(_class), _class) for
+                                           _class in GetFilterChoiceTransfer().iterkeys()])
+
+        self.MainSizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=0)
+        self.MainSizer.AddGrowableCol(0)
+        self.MainSizer.AddGrowableRow(1)
+
+        controls_sizer = wx.FlexGridSizer(cols=10, hgap=5, rows=1, vgap=5)
+        controls_sizer.AddGrowableCol(5)
+        controls_sizer.AddGrowableRow(0)
+        self.MainSizer.AddSizer(controls_sizer, border=5, flag=wx.GROW | wx.ALL)
+
+        self.ReturnTypeLabel = wx.StaticText(self, label=_('Return Type:'))
+        controls_sizer.AddWindow(self.ReturnTypeLabel, flag=wx.ALIGN_CENTER_VERTICAL)
+
+        self.ReturnType = wx.ComboBox(self,
+                                      size=wx.Size(145, -1), style=wx.CB_READONLY)
+        self.Bind(wx.EVT_COMBOBOX, self.OnReturnTypeChanged, self.ReturnType)
+        controls_sizer.AddWindow(self.ReturnType)
+
+        self.DescriptionLabel = wx.StaticText(self, label=_('Description:'))
+        controls_sizer.AddWindow(self.DescriptionLabel, flag=wx.ALIGN_CENTER_VERTICAL)
+
+        self.Description = wx.TextCtrl(self,
+                                       size=wx.Size(250, -1), style=wx.TE_PROCESS_ENTER)
+        self.Bind(wx.EVT_TEXT_ENTER, self.OnDescriptionChanged, self.Description)
+        self.Description.Bind(wx.EVT_KILL_FOCUS, self.OnDescriptionChanged)
+        controls_sizer.AddWindow(self.Description)
+
+        class_filter_label = wx.StaticText(self, label=_('Class Filter:'))
+        controls_sizer.AddWindow(class_filter_label, flag=wx.ALIGN_CENTER_VERTICAL)
+
+        self.ClassFilter = wx.ComboBox(self,
+                                       size=wx.Size(145, -1), style=wx.CB_READONLY)
+        self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, self.ClassFilter)
+        controls_sizer.AddWindow(self.ClassFilter)
+
+        for name, bitmap, help in [
+                ("AddButton", "add_element", _("Add variable")),
+                ("DeleteButton", "remove_element", _("Remove variable")),
+                ("UpButton", "up", _("Move variable up")),
+                ("DownButton", "down", _("Move variable down"))]:
+            button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap),
+                                                    size=wx.Size(28, 28), style=wx.NO_BORDER)
+            button.SetToolTipString(help)
+            setattr(self, name, button)
+            controls_sizer.AddWindow(button)
+
+        self.VariablesGrid = CustomGrid(self, style=wx.VSCROLL | wx.HSCROLL)
+        self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
+        self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
+                                self.OnVariablesGridCellChange)
+        self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK,
+                                self.OnVariablesGridCellLeftClick)
+        self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
+                                self.OnVariablesGridEditorShown)
+        self.MainSizer.AddWindow(self.VariablesGrid, flag=wx.GROW)
+
+        self.SetSizer(self.MainSizer)
+
+        self.ParentWindow = window
+        self.Controler = controler
+        self.ElementType = element_type
+        self.Debug = debug
+
+        self.RefreshHighlightsTimer = wx.Timer(self, -1)
+        self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer,
+                  self.RefreshHighlightsTimer)
+
+        self.Filter = "All"
+        self.FilterChoices = []
+        self.FilterChoiceTransfer = GetFilterChoiceTransfer()
+
+        self.DefaultValue = _VariableInfos("LocalVar0", "", "", "", "", True, "", DefaultType, ([], []), 0)
+
+        if element_type in ["config", "resource"]:
+            self.DefaultTypes = {"All": "Global"}
+        else:
+            self.DefaultTypes = {"All": "Local", "Interface": "Input", "Variables": "Local"}
+
+        if element_type in ["config", "resource"] \
+           or element_type in ["program", "transition", "action"]:
+            # this is an element that can have located variables
+            self.Table = VariableTable(self, [], GetVariableTableColnames(True))
+
+            if element_type in ["config", "resource"]:
+                self.FilterChoices = ["All", "Global"]  # ,"Access"]
+            else:
+                self.FilterChoices = ["All",
+                                      "Interface", "   Input", "   Output", "   InOut", "   External",
+                                      "Variables", "   Local", "   Temp"]  # ,"Access"]
+
+            # these condense the ColAlignements list
+            left = wx.ALIGN_LEFT
+            center = wx.ALIGN_CENTER
+
+            #                        Num     Name    Class   Type    Loc     Init    Option   Doc
+            self.ColSettings = {
+                "size":             [40,     80,     100,    80,     110,    120,    100,     160],
+                "alignement":       [center, left,   left,   left,   left,   left,   left,    left],
+                "fixed_size":       [True,   False,  True,   False,  True,   True,   True,    False],
+            }
+
+        else:
+            # this is an element that cannot have located variables
+            self.Table = VariableTable(self, [], GetVariableTableColnames(False))
+
+            if element_type == "function":
+                self.FilterChoices = ["All",
+                                      "Interface", "   Input", "   Output", "   InOut",
+                                      "Variables", "   Local"]
+            else:
+                self.FilterChoices = ["All",
+                                      "Interface", "   Input", "   Output", "   InOut", "   External",
+                                      "Variables", "   Local", "   Temp"]
+
+            # these condense the alignements list
+            left = wx.ALIGN_LEFT
+            center = wx.ALIGN_CENTER
+
+            #                        Num     Name    Class   Type    Init    Option   Doc
+            self.ColSettings = {
+                "size":             [40,     80,     100,    80,     120,    100,     160],
+                "alignement":       [center, left,   left,   left,   left,   left,    left],
+                "fixed_size":       [True,   False,  True,   False,  True,   True,    False],
+            }
+
+        self.PanelWidthMin = sum(self.ColSettings["size"])
+
+        self.ElementType = element_type
+        self.BodyType = None
+
+        for choice in self.FilterChoices:
+            self.ClassFilter.Append(_(choice))
+
+        reverse_transfer = {}
+        for filter, choice in self.FilterChoiceTransfer.items():
+            reverse_transfer[choice] = filter
+        self.ClassFilter.SetStringSelection(_(reverse_transfer[self.Filter]))
+        self.RefreshTypeList()
+
+        self.VariablesGrid.SetTable(self.Table)
+        self.VariablesGrid.SetButtons({"Add": self.AddButton,
+                                       "Delete": self.DeleteButton,
+                                       "Up": self.UpButton,
+                                       "Down": self.DownButton})
+        self.VariablesGrid.SetEditable(not self.Debug)
+
+        def _AddVariable(new_row):
+            row_content = self.DefaultValue.copy()
+            if new_row > 0:
+                # doesn't copy values of previous var if it's non-editable (like a FB)
+                if self.Values[new_row-1].Edit:
+                    row_content = self.Values[new_row-1].copy()
+                old_name = self.Values[new_row-1].Name
+                row_content.Name = self.Controler.GenerateNewName(
+                    self.TagName, old_name, old_name+'%d')
+
+                # increment location address
+                if row_content.Location != "" and LOCATION_MODEL_SET.match(row_content.Location):
+                    old_location = row_content.Location
+                    model = re.compile(r"%[IQM][XBWLD]?(.*\.|)")
+                    prefix = model.match(old_location).group(0)
+                    addr = int(re.split(model, old_location)[-1]) + 1
+                    row_content.Location = prefix + text(addr)
+
+            if not row_content.Class:
+                row_content.Class = self.DefaultTypes.get(self.Filter, self.Filter)
+
+            if self.Filter == "All" and len(self.Values) > 0:
+                self.Values.insert(new_row, row_content)
+            else:
+                self.Values.append(row_content)
+                new_row = self.Table.GetNumberRows()
+            self.SaveValues()
+            if self.ElementType == "resource":
+                self.ParentWindow.RefreshView(variablepanel=False)
+            self.RefreshValues()
+            return new_row
+        setattr(self.VariablesGrid, "_AddRow", _AddVariable)
+
+        def _DeleteVariable(row):
+            if _GetRowEdit(row):
+                self.Values.remove(self.Table.GetRow(row))
+                self.SaveValues()
+                if self.ElementType == "resource":
+                    self.ParentWindow.RefreshView(variablepanel=False)
+                self.RefreshValues()
+        setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable)
+
+        def _MoveVariable(row, move):
+            if self.Filter == "All":
+                new_row = max(0, min(row + move, len(self.Values) - 1))
+                if new_row != row:
+                    self.Values.insert(new_row, self.Values.pop(row))
+                    self.SaveValues()
+                    self.RefreshValues()
+                return new_row
+            return row
+        setattr(self.VariablesGrid, "_MoveRow", _MoveVariable)
+
+        def _GetRowEdit(row):
+            row_edit = False
+            if self:
+                row_edit = self.Table.GetValueByName(row, "Edit")
+                bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
+                row_edit = row_edit or (bodytype in ["ST", "IL"])
+            return row_edit
+
+        def _RefreshButtons():
+            if self:
+                table_length = len(self.Table.data)
+                row_edit = True
+                row = 0
+                if table_length > 0:
+                    row = self.VariablesGrid.GetGridCursorRow()
+                    row_edit = _GetRowEdit(row)
+                self.AddButton.Enable(not self.Debug)
+                self.DeleteButton.Enable(not self.Debug and (table_length > 0 and row_edit))
+                self.UpButton.Enable(not self.Debug and (table_length > 0 and row > 0 and self.Filter == "All"))
+                self.DownButton.Enable(not self.Debug and (table_length > 0 and row < table_length - 1 and self.Filter == "All"))
+        setattr(self.VariablesGrid, "RefreshButtons", _RefreshButtons)
+
+        panel_width = window.Parent.ScreenRect.Width - 35
+        if panel_width > self.PanelWidthMin:
+            stretch_cols_width = panel_width
+            stretch_cols_sum = 0
+            for col in range(len(self.ColSettings["fixed_size"])):
+                if self.ColSettings["fixed_size"][col]:
+                    stretch_cols_width -= self.ColSettings["size"][col]
+                else:
+                    stretch_cols_sum += self.ColSettings["size"][col]
+
+        self.VariablesGrid.SetRowLabelSize(0)
+        for col in range(self.Table.GetNumberCols()):
+            attr = wx.grid.GridCellAttr()
+            attr.SetAlignment(self.ColSettings["alignement"][col], wx.ALIGN_CENTRE)
+            self.VariablesGrid.SetColAttr(col, attr)
+            self.VariablesGrid.SetColMinimalWidth(col, self.ColSettings["size"][col])
+            if (panel_width > self.PanelWidthMin) and not self.ColSettings["fixed_size"][col]:
+                self.VariablesGrid.SetColSize(col, int((self.ColSettings["size"][col]/stretch_cols_sum)*stretch_cols_width))
+            else:
+                self.VariablesGrid.SetColSize(col, self.ColSettings["size"][col])
+
+    def __del__(self):
+        self.RefreshHighlightsTimer.Stop()
+
+    def SetTagName(self, tagname):
+        self.TagName = tagname
+        self.BodyType = self.Controler.GetEditedElementBodyType(self.TagName)
+
+    def GetTagName(self):
+        return self.TagName
+
+    def IsFunctionBlockType(self, name):
+        if isinstance(name, tuple) or \
+           self.ElementType != "function" and self.BodyType in ["ST", "IL"]:
+            return False
+        else:
+            return self.Controler.GetBlockType(name, debug=self.Debug) is not None
+
+    def RefreshView(self):
+        self.PouNames = self.Controler.GetProjectPouNames(self.Debug)
+        returnType = None
+        description = None
+
+        words = self.TagName.split("::")
+        if self.ElementType == "config":
+            self.Values = self.Controler.GetConfigurationGlobalVars(words[1], self.Debug)
+        elif self.ElementType == "resource":
+            self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2], self.Debug)
+        else:
+            if self.ElementType == "function":
+                self.ReturnType.Clear()
+                for data_type in self.Controler.GetDataTypes(self.TagName, debug=self.Debug):
+                    self.ReturnType.Append(data_type)
+                returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, debug=self.Debug)
+            description = self.Controler.GetPouDescription(words[1])
+            self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug)
+
+        if returnType is not None:
+            self.ReturnType.SetStringSelection(returnType)
+            self.ReturnType.Enable(not self.Debug)
+            self.ReturnTypeLabel.Show()
+            self.ReturnType.Show()
+        else:
+            self.ReturnType.Enable(False)
+            self.ReturnTypeLabel.Hide()
+            self.ReturnType.Hide()
+
+        if description is not None:
+            self.Description.SetValue(description)
+            self.Description.Enable(not self.Debug)
+            self.DescriptionLabel.Show()
+            self.Description.Show()
+        else:
+            self.Description.Enable(False)
+            self.DescriptionLabel.Hide()
+            self.Description.Hide()
+
+        self.RefreshValues()
+        self.VariablesGrid.RefreshButtons()
+        self.MainSizer.Layout()
+
+    def OnReturnTypeChanged(self, event):
+        words = self.TagName.split("::")
+        self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
+        self.Controler.BufferProject()
+        self.ParentWindow.RefreshView(variablepanel=False)
+        self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
+        event.Skip()
+
+    def OnDescriptionChanged(self, event):
+        words = self.TagName.split("::")
+        old_description = self.Controler.GetPouDescription(words[1])
+        new_description = self.Description.GetValue()
+        if new_description != old_description:
+            self.Controler.SetPouDescription(words[1], new_description)
+            self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
+        event.Skip()
+
+    def OnClassFilter(self, event):
+        self.Filter = self.FilterChoiceTransfer[self.VARIABLE_CHOICES_DICT[self.ClassFilter.GetStringSelection()]]
+        self.RefreshTypeList()
+        self.RefreshValues()
+        self.VariablesGrid.RefreshButtons()
+        event.Skip()
+
+    def RefreshTypeList(self):
+        if self.Filter == "All":
+            self.ClassList = [self.FilterChoiceTransfer[choice] for choice in self.FilterChoices if self.FilterChoiceTransfer[choice] not in ["All", "Interface", "Variables"]]
+        elif self.Filter == "Interface":
+            self.ClassList = ["Input", "Output", "InOut", "External"]
+        elif self.Filter == "Variables":
+            self.ClassList = ["Local", "Temp"]
+        else:
+            self.ClassList = [self.Filter]
+
+    def ShowErrorMessage(self, message):
+        dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
+        dialog.ShowModal()
+        dialog.Destroy()
+
+    def OnVariablesGridCellChange(self, event):
+        row, col = event.GetRow(), event.GetCol()
+        colname = self.Table.GetColLabelValue(col, False)
+        value = self.Table.GetValue(row, col)
+        message = None
+
+        if colname == "Name" and value != "":
+            if not TestIdentifier(value):
+                message = _("\"%s\" is not a valid identifier!") % value
+            elif value.upper() in IEC_KEYWORDS:
+                message = _("\"%s\" is a keyword. It can't be used!") % value
+            elif value.upper() in self.PouNames:
+                message = _("A POU named \"%s\" already exists!") % value
+            elif value.upper() in [var.Name.upper() for var in self.Values if var != self.Table.data[row]]:
+                message = _("A variable with \"%s\" as name already exists in this pou!") % value
+            else:
+                self.SaveValues(False)
+                old_value = self.Table.GetOldValue()
+                if old_value != "":
+                    self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value)
+                self.Controler.BufferProject()
+                wx.CallAfter(self.ParentWindow.RefreshView, False)
+                self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
+        else:
+            self.SaveValues()
+            if colname == "Class":
+                self.ClearLocation(row, col, value)
+                wx.CallAfter(self.ParentWindow.RefreshView)
+            elif colname == "Location":
+                wx.CallAfter(self.ParentWindow.RefreshView)
+
+        if message is not None:
+            wx.CallAfter(self.ShowErrorMessage, message)
+            event.Veto()
+        else:
+            event.Skip()
+
+    def ClearLocation(self, row, col, value):
+        if self.Values[row].Location != '':
+            if self.Table.GetColLabelValue(col, False) == 'Class' and value not in ["Local", "Global"] or \
+               self.Table.GetColLabelValue(col, False) == 'Type' and not self.Controler.IsLocatableType(value):
+                self.Values[row].Location = ''
+                self.RefreshValues()
+                self.SaveValues()
+
+    def BuildStdIECTypesMenu(self, type_menu):
+        # build a submenu containing standard IEC types
+        base_menu = wx.Menu(title='')
+        for base_type in self.Controler.GetBaseTypes():
+            new_id = wx.NewId()
+            base_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=base_type)
+            self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(base_type), id=new_id)
+
+        type_menu.AppendMenu(wx.NewId(), _("Base Types"), base_menu)
+
+    def BuildUserTypesMenu(self, type_menu):
+        # build a submenu containing user-defined types
+        datatype_menu = wx.Menu(title='')
+        datatypes = self.Controler.GetDataTypes(basetypes=False, confnodetypes=False)
+        for datatype in datatypes:
+            new_id = wx.NewId()
+            datatype_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
+            self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id)
+
+        type_menu.AppendMenu(wx.NewId(), _("User Data Types"), datatype_menu)
+
+    def BuildLibsTypesMenu(self, type_menu):
+        for category in self.Controler.GetConfNodeDataTypes():
+            if len(category["list"]) > 0:
+                # build a submenu containing confnode types
+                confnode_datatype_menu = wx.Menu(title='')
+                for datatype in category["list"]:
+                    new_id = wx.NewId()
+                    confnode_datatype_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=datatype)
+                    self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(datatype), id=new_id)
+
+                type_menu.AppendMenu(wx.NewId(), category["name"], confnode_datatype_menu)
+
+    def BuildProjectTypesMenu(self, type_menu, classtype):
+        # build a submenu containing function block types
+        bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
+        _pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
+        if classtype in ["Input", "Output", "InOut", "External", "Global"] or \
+           poutype != "function" and bodytype in ["ST", "IL"]:
+            functionblock_menu = wx.Menu(title='')
+            fbtypes = self.Controler.GetFunctionBlockTypes(self.TagName)
+            for functionblock_type in fbtypes:
+                new_id = wx.NewId()
+                functionblock_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
+                self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
+
+            type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu)
+
+    def BuildArrayTypesMenu(self, type_menu):
+        new_id = wx.NewId()
+        type_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Array"))
+        self.Bind(wx.EVT_MENU, self.VariableArrayTypeFunction, id=new_id)
+
+    def OnVariablesGridEditorShown(self, event):
+        row, col = event.GetRow(), event.GetCol()
+
+        label_value = self.Table.GetColLabelValue(col, False)
+        if label_value == "Type":
+            old_value = self.Values[row].Type
+            classtype = self.Table.GetValueByName(row, "Class")
+            type_menu = wx.Menu(title='')   # the root menu
+
+            self.BuildStdIECTypesMenu(type_menu)
+
+            self.BuildUserTypesMenu(type_menu)
+
+            self.BuildLibsTypesMenu(type_menu)
+
+            self.BuildProjectTypesMenu(type_menu, classtype)
+
+            self.BuildArrayTypesMenu(type_menu)
+
+            rect = self.VariablesGrid.BlockToDeviceRect((row, col), (row, col))
+            corner_x = rect.x + rect.width
+            corner_y = rect.y + self.VariablesGrid.GetColLabelSize()
+
+            # pop up this new menu
+            self.VariablesGrid.PopupMenuXY(type_menu, corner_x, corner_y)
+            type_menu.Destroy()
+            event.Veto()
+            value = self.Values[row].Type
+            if old_value != value:
+                self.ClearLocation(row, col, value)
+        else:
+            event.Skip()
+
+    def GetVariableTypeFunction(self, base_type):
+        def VariableTypeFunction(event):
+            row = self.VariablesGrid.GetGridCursorRow()
+            self.Table.SetValueByName(row, "Type", base_type)
+            self.Table.ResetView(self.VariablesGrid)
+            self.SaveValues(False)
+            self.ParentWindow.RefreshView(variablepanel=False)
+            self.Controler.BufferProject()
+            self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
+        return VariableTypeFunction
+
+    def VariableArrayTypeFunction(self, event):
+        row = self.VariablesGrid.GetGridCursorRow()
+        dialog = ArrayTypeDialog(self,
+                                 self.Controler.GetDataTypes(self.TagName),
+                                 self.Table.GetValueByName(row, "Type"))
+        if dialog.ShowModal() == wx.ID_OK:
+            self.Table.SetValueByName(row, "Type", dialog.GetValue())
+            self.Table.ResetView(self.VariablesGrid)
+            self.SaveValues(False)
+            self.ParentWindow.RefreshView(variablepanel=False)
+            self.Controler.BufferProject()
+            self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
+        dialog.Destroy()
+
+    def OnVariablesGridCellLeftClick(self, event):
+        row = event.GetRow()
+        if not self.Debug and (event.GetCol() == 0 and self.Table.GetValueByName(row, "Edit")):
+            var_name = self.Table.GetValueByName(row, "Name")
+            var_class = self.Table.GetValueByName(row, "Class")
+            var_type = self.Table.GetValueByName(row, "Type")
+            data = wx.TextDataObject(str((var_name, var_class, var_type, self.TagName)))
+            dragSource = wx.DropSource(self.VariablesGrid)
+            dragSource.SetData(data)
+            dragSource.DoDragDrop()
+        event.Skip()
+
+    def RefreshValues(self):
+        data = []
+        for num, variable in enumerate(self.Values):
+            if variable.Class in self.ClassList:
+                variable.Number = num + 1
+                data.append(variable)
+        self.Table.SetData(data)
+        self.Table.ResetView(self.VariablesGrid)
+
+    def SaveValues(self, buffer=True):
+        words = self.TagName.split("::")
+        if self.ElementType == "config":
+            self.Controler.SetConfigurationGlobalVars(words[1], self.Values)
+        elif self.ElementType == "resource":
+            self.Controler.SetConfigurationResourceGlobalVars(words[1], words[2], self.Values)
+        else:
+            if self.ReturnType.IsEnabled():
+                self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
+            self.Controler.SetPouInterfaceVars(words[1], self.Values)
+        if buffer:
+            self.Controler.BufferProject()
+            self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, PAGETITLES, POUINSTANCEVARIABLESPANEL, LIBRARYTREE)
+
+    # -------------------------------------------------------------------------------
+    #                        Highlights showing functions
+    # -------------------------------------------------------------------------------
+
+    def OnRefreshHighlightsTimer(self, event):
+        self.Table.ResetView(self.VariablesGrid)
+        event.Skip()
+
+    def AddVariableHighlight(self, infos, highlight_type):
+        if isinstance(infos[0], tuple):
+            for i in xrange(*infos[0]):
+                self.Table.AddHighlight((i,) + infos[1:], highlight_type)
+            cell_visible = infos[0][0]
+        else:
+            self.Table.AddHighlight(infos, highlight_type)
+            cell_visible = infos[0]
+        colnames = [colname.lower() for colname in self.Table.colnames]
+        self.VariablesGrid.MakeCellVisible(cell_visible, colnames.index(infos[1]))
+        self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
+
+    def RemoveVariableHighlight(self, infos, highlight_type):
+        if isinstance(infos[0], tuple):
+            for i in xrange(*infos[0]):
+                self.Table.RemoveHighlight((i,) + infos[1:], highlight_type)
+        else:
+            self.Table.RemoveHighlight(infos, highlight_type)
+        self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
+
+    def ClearHighlights(self, highlight_type=None):
+        self.Table.ClearHighlights(highlight_type)
+        self.Table.ResetView(self.VariablesGrid)
--- a/controls/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/controls/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -24,20 +24,24 @@
 
 # Package initialization
 
-from CustomEditableListBox import CustomEditableListBox
-from CustomGrid import CustomGrid
-from CustomTable import CustomTable
-from CustomTree import CustomTree
-from DebugVariablePanel import DebugVariablePanel
-from DurationCellEditor import DurationCellEditor
-from LibraryPanel import LibraryPanel
-from LocationCellEditor import LocationCellEditor
-from PouInstanceVariablesPanel import PouInstanceVariablesPanel
-from ProjectPropertiesPanel import ProjectPropertiesPanel
-from VariablePanel import VariablePanel
-from SearchResultPanel import SearchResultPanel
-from TextCtrlAutoComplete import TextCtrlAutoComplete
-from FolderTree import FolderTree
-from LogViewer import LogViewer
-from CustomStyledTextCtrl import CustomStyledTextCtrl
-from CustomToolTip import CustomToolTip
+from __future__ import absolute_import
+
+from controls.CustomEditableListBox import CustomEditableListBox
+from controls.CustomGrid import CustomGrid
+from controls.CustomTable import CustomTable
+from controls.CustomTree import CustomTree
+from controls.CustomIntCtrl import CustomIntCtrl
+from controls.DebugVariablePanel import DebugVariablePanel
+from controls.DurationCellEditor import DurationCellEditor
+from controls.LibraryPanel import LibraryPanel
+from controls.LocationCellEditor import LocationCellEditor
+from controls.PouInstanceVariablesPanel import PouInstanceVariablesPanel
+from controls.ProjectPropertiesPanel import ProjectPropertiesPanel
+from controls.VariablePanel import VariablePanel
+from controls.SearchResultPanel import SearchResultPanel
+from controls.TextCtrlAutoComplete import TextCtrlAutoComplete
+from controls.FolderTree import FolderTree
+from controls.LogViewer import LogViewer
+from controls.CustomStyledTextCtrl import CustomStyledTextCtrl
+from controls.CustomToolTip import CustomToolTip
+
--- a/dialogs/AboutDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/AboutDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -30,15 +30,13 @@
 This module contains classes extended from wx.Dialog used by the GUI.
 """
 
+
+from __future__ import absolute_import
 import os
-import sys
-import time
 import wx
 from wx.lib.agw.hyperlink import HyperLinkCtrl
 
 
-#----------------------------------------------------------------------
-
 class AboutDialog(wx.Dialog):
     """
     A replacement About Dialog for Windows, as it uses a generic frame that
@@ -106,8 +104,6 @@
         CreditsDialog(self, self.info)
 
 
-#----------------------------------------------------------------------
-
 class CreditsDialog(wx.Dialog):
     def __init__(self, parent, info):
         wx.Dialog.__init__(self, parent, title=_("Credits"), size=(475, 320),
@@ -144,8 +140,6 @@
         close.Bind(wx.EVT_BUTTON, lambda evt: self.Destroy())
 
 
-#----------------------------------------------------------------------
-
 class LicenseDialog(wx.Dialog):
     def __init__(self, parent, info):
         wx.Dialog.__init__(self, parent, title=_("License"), size=(500, 400),
@@ -173,7 +167,6 @@
 
         close.Bind(wx.EVT_BUTTON, lambda evt: self.Destroy())
 
-#----------------------------------------------------------------------
 
 def ShowAboutDialog(parent, info):
     if os.name == "nt":
--- a/dialogs/ActionBlockDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/ActionBlockDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -4,6 +4,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -21,32 +22,37 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 import wx.grid
 import wx.lib.buttons
 
 from controls import CustomGrid, CustomTable
+from plcopen.BlockInstanceCollector import _ActionInfos
 from util.BitmapLibrary import GetBitmap
-from PLCControler import _ActionInfos
-
-#-------------------------------------------------------------------------------
+from util.TranslationCatalogs import NoTranslate
+# -------------------------------------------------------------------------------
 #                                  Helpers
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 def GetActionTableColnames():
-    _ = lambda x: x
+    _ = NoTranslate
     return [_("Qualifier"), _("Duration"), _("Type"), _("Value"), _("Indicator")]
 
+
 def GetTypeList():
-    _ = lambda x: x
+    _ = NoTranslate
     return [_("Action"), _("Variable"), _("Inline")]
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                               Action Table
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 class ActionTable(CustomTable):
-    
+
     def GetValue(self, row, col):
         if row < self.GetNumberRows():
             colname = self.GetColLabelValue(col, False)
@@ -54,7 +60,7 @@
             if colname == "Type":
                 return _(value)
             return value
-    
+
     def SetValue(self, row, col, value):
         if col < len(self.colnames):
             colname = self.GetColLabelValue(col, False)
@@ -63,7 +69,7 @@
             elif colname == "Qualifier" and not self.Parent.DurationList[value]:
                 self.data[row].duration = ""
             setattr(self.data[row], colname.lower(), value)
-        
+
     def _updateColAttrs(self, grid):
         """
         wx.Grid -> update the column attributes to add the
@@ -71,7 +77,7 @@
 
         Otherwise default to the default renderer.
         """
-        
+
         for row in range(self.GetNumberRows()):
             for col in range(self.GetNumberCols()):
                 editor = None
@@ -102,70 +108,71 @@
                 elif colname == "Indicator":
                     editor = wx.grid.GridCellChoiceEditor()
                     editor.SetParameters(self.Parent.VariableList)
-                    
+
                 grid.SetCellEditor(row, col, editor)
                 grid.SetCellRenderer(row, col, renderer)
                 grid.SetReadOnly(row, col, readonly)
-                
+
                 grid.SetCellBackgroundColour(row, col, wx.WHITE)
             self.ResizeRow(grid, row)
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                            Action Block Dialog
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 class ActionBlockDialog(wx.Dialog):
-    
+
     def __init__(self, parent):
-        wx.Dialog.__init__(self, parent,
-              size=wx.Size(500, 300), title=_('Edit action block properties'))
-        
+        wx.Dialog.__init__(self, parent, title=_('Edit action block properties'))
+
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(1)
-        
+
         top_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
         top_sizer.AddGrowableCol(0)
         top_sizer.AddGrowableRow(0)
         main_sizer.AddSizer(top_sizer, border=20,
-              flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
-        
+                            flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+
         actions_label = wx.StaticText(self, label=_('Actions:'))
         top_sizer.AddWindow(actions_label, flag=wx.ALIGN_BOTTOM)
-        
+
         for name, bitmap, help in [
                 ("AddButton", "add_element", _("Add action")),
                 ("DeleteButton", "remove_element", _("Remove action")),
                 ("UpButton", "up", _("Move action up")),
                 ("DownButton", "down", _("Move action down"))]:
-            button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap), 
-                  size=wx.Size(28, 28), style=wx.NO_BORDER)
+            button = wx.lib.buttons.GenBitmapButton(
+                self, bitmap=GetBitmap(bitmap),
+                size=wx.Size(28, 28), style=wx.NO_BORDER)
             button.SetToolTipString(help)
             setattr(self, name, button)
             top_sizer.AddWindow(button)
-        
-        self.ActionsGrid = CustomGrid(self, size=wx.Size(0, 0), style=wx.VSCROLL)
+
+        self.ActionsGrid = CustomGrid(self, size=wx.Size(-1, 250), style=wx.VSCROLL)
         self.ActionsGrid.DisableDragGridSize()
         self.ActionsGrid.EnableScrolling(False, True)
-        self.ActionsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, 
+        self.ActionsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
                               self.OnActionsGridCellChange)
         main_sizer.AddSizer(self.ActionsGrid, border=20,
-              flag=wx.GROW|wx.LEFT|wx.RIGHT)
-        
-        button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+                            flag=wx.GROW | wx.LEFT | wx.RIGHT)
+
+        button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
         self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
-        main_sizer.AddSizer(button_sizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        main_sizer.AddSizer(button_sizer, border=20,
+                            flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
         self.SetSizer(main_sizer)
-        
+
         self.Table = ActionTable(self, [], GetActionTableColnames())
-        typelist = GetTypeList()       
-        self.TypeList = ",".join(map(_,typelist))
+        typelist = GetTypeList()
+        self.TypeList = ",".join(map(_, typelist))
         self.TranslateType = dict([(_(value), value) for value in typelist])
-        self.ColSizes = [60, 90, 80, 110, 80]
+        self.ColSizes = [60, 90, 130, 200, 50]
         self.ColAlignements = [wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
-        
+
         self.ActionsGrid.SetTable(self.Table)
         self.ActionsGrid.SetDefaultValue(_ActionInfos("N", "Action", "", "", ""))
         self.ActionsGrid.SetButtons({"Add": self.AddButton,
@@ -173,18 +180,19 @@
                                      "Up": self.UpButton,
                                      "Down": self.DownButton})
         self.ActionsGrid.SetRowLabelSize(0)
-        
+
         for col in range(self.Table.GetNumberCols()):
             attr = wx.grid.GridCellAttr()
             attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
             self.ActionsGrid.SetColAttr(col, attr)
             self.ActionsGrid.SetColMinimalWidth(col, self.ColSizes[col])
             self.ActionsGrid.AutoSizeColumn(col, False)
-        
+
         self.Table.ResetView(self.ActionsGrid)
         self.ActionsGrid.SetFocus()
         self.ActionsGrid.RefreshButtons()
-    
+        self.Fit()
+
     def OnOK(self, event):
         self.ActionsGrid.CloseEditControl()
         self.EndModal(wx.ID_OK)
@@ -192,14 +200,14 @@
     def OnActionsGridCellChange(self, event):
         wx.CallAfter(self.Table.ResetView, self.ActionsGrid)
         event.Skip()
-    
+
     def SetQualifierList(self, list):
         self.QualifierList = ",".join(list)
         self.DurationList = list
 
     def SetVariableList(self, list):
         self.VariableList = "," + ",".join([variable.Name for variable in list])
-        
+
     def SetActionList(self, list):
         self.ActionList = "," + ",".join(list)
 
@@ -217,7 +225,7 @@
         if len(actions) > 0:
             self.ActionsGrid.SetGridCursor(0, 0)
         self.ActionsGrid.RefreshButtons()
-    
+
     def GetValues(self):
         actions = self.Table.GetData()
         for action in actions:
--- a/dialogs/ArrayTypeDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/ArrayTypeDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -21,99 +21,108 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import re
-from types import TupleType
 
 import wx
 
 from controls import CustomEditableListBox
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                                  Helpers
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
-DIMENSION_MODEL = re.compile("([0-9]+)\.\.([0-9]+)$")
+DIMENSION_MODEL = re.compile(r"([0-9]+)\.\.([0-9]+)$")
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                             Array Type Dialog
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 class ArrayTypeDialog(wx.Dialog):
-    
+
     def __init__(self, parent, datatypes, infos):
-        wx.Dialog.__init__(self, parent,
-              size=wx.Size(500, 350), title=_('Edit array type properties'))
-        
+        wx.Dialog.__init__(self, parent, title=_('Edit array type properties'))
+
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(1)
-        
+
         top_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        main_sizer.AddSizer(top_sizer, border=20, 
-              flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
-        
+        main_sizer.AddSizer(top_sizer, border=20,
+                            flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+
         basetype_label = wx.StaticText(self, label=_('Base Type:'))
         top_sizer.AddWindow(basetype_label, 1, flag=wx.ALIGN_BOTTOM)
-        
+
         self.BaseType = wx.ComboBox(self, style=wx.CB_READONLY)
         top_sizer.AddWindow(self.BaseType, 1, flag=wx.GROW)
-        
-        self.Dimensions = CustomEditableListBox(self, label=_("Dimensions:"), 
-              style=wx.gizmos.EL_ALLOW_NEW|
-                    wx.gizmos.EL_ALLOW_EDIT|
-                    wx.gizmos.EL_ALLOW_DELETE)
-        for func in ["_OnLabelEndEdit", 
-                     "_OnAddButton", 
-                     "_OnDelButton", 
-                     "_OnUpButton", 
+
+        self.Dimensions = CustomEditableListBox(self, label=_("Dimensions:"),
+                                                style=(wx.gizmos.EL_ALLOW_NEW |
+                                                       wx.gizmos.EL_ALLOW_EDIT |
+                                                       wx.gizmos.EL_ALLOW_DELETE))
+        for func in ["_OnLabelEndEdit",
+                     "_OnAddButton",
+                     "_OnDelButton",
+                     "_OnUpButton",
                      "_OnDownButton"]:
             setattr(self.Dimensions, func, self.OnDimensionsChanged)
-        main_sizer.AddSizer(self.Dimensions, border=20, 
-              flag=wx.GROW|wx.LEFT|wx.RIGHT)
-        
-        button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+        main_sizer.AddSizer(self.Dimensions, border=20,
+                            flag=wx.GROW | wx.LEFT | wx.RIGHT)
+
+        button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
         self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
-        main_sizer.AddSizer(button_sizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        main_sizer.AddSizer(button_sizer, border=20,
+                            flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
         self.SetSizer(main_sizer)
-        
+
         for datatype in datatypes:
             self.BaseType.Append(datatype)
-        
-        if isinstance(infos, TupleType) and infos[0] == "array":
+
+        if isinstance(infos, tuple) and infos[0] == "array":
             self.BaseType.SetStringSelection(infos[1])
-            self.Dimensions.SetStrings(map(lambda x : "..".join(x), infos[2]))
+            self.Dimensions.SetStrings(map("..".join, infos[2]))
         elif infos in datatypes:
             self.BaseType.SetStringSelection(infos)
-        
+
         self.BaseType.SetFocus()
-        
+        self.Fit()
+
     def GetDimensions(self):
+        message = None
         dimensions_list = []
-        for dimensions in self.Dimensions.GetStrings():
+        dimension_strings = self.Dimensions.GetStrings()
+        if len(dimension_strings) == 0:
+            message = _("Empty dimension isn't allowed.")
+
+        for dimensions in dimension_strings:
             result = DIMENSION_MODEL.match(dimensions)
             if result is None:
-                message = wx.MessageDialog(self, _("\"%s\" value isn't a valid array dimension!")%dimensions, _("Error"), wx.OK|wx.ICON_ERROR)
-                message.ShowModal()
-                message.Destroy()
-                return None
+                message = _("\"%s\" value isn't a valid array dimension!") % dimensions
+                break
             bounds = result.groups()
             if int(bounds[0]) >= int(bounds[1]):
-                message = wx.MessageDialog(self, _("\"%s\" value isn't a valid array dimension!\nRight value must be greater than left value.")%dimensions, _("Error"), wx.OK|wx.ICON_ERROR)
-                message.ShowModal()
-                message.Destroy()
-                return None
+                message = _("\"%s\" value isn't a valid array dimension!\nRight value must be greater than left value.") % dimensions
+                break
             dimensions_list.append(bounds)
+
+        if message is not None:
+            dlg = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
+            dlg.ShowModal()
+            dlg.Destroy()
+            return None
         return dimensions_list
-    
+
     def OnDimensionsChanged(self, event):
         wx.CallAfter(self.GetDimensions)
         event.Skip()
-    
+
     def OnOK(self, event):
         if self.GetDimensions() is not None:
             self.EndModal(wx.ID_OK)
-            
+
     def GetValue(self):
         return "array", self.BaseType.GetStringSelection(), self.GetDimensions()
--- a/dialogs/BlockPreviewDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/BlockPreviewDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2013: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,78 +23,82 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
 import wx
 
 from plcopen.structures import TestIdentifier, IEC_KEYWORDS
 from graphics.GraphicCommons import FREEDRAWING_MODE
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                    Dialog with preview for graphic block
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a generic dialog containing a preview panel for displaying
-graphic created by dialog
-"""
+# -------------------------------------------------------------------------------
+
 
 class BlockPreviewDialog(wx.Dialog):
-    
-    def __init__(self, parent, controller, tagname, size, title):
+    """
+    Class that implements a generic dialog containing a preview panel for displaying
+    graphic created by dialog
+    """
+
+    def __init__(self, parent, controller, tagname, title):
         """
         Constructor
         @param parent: Parent wx.Window of dialog for modal
         @param controller: Reference to project controller
         @param tagname: Tagname of project POU edited
-        @param size: wx.Size object containing size of dialog
         @param title: Title of dialog frame
         """
-        wx.Dialog.__init__(self, parent, size=size, title=title)
-        
+        wx.Dialog.__init__(self, parent, title=title)
+
         # Save reference to
         self.Controller = controller
         self.TagName = tagname
-        
+
         # Label for preview
         self.PreviewLabel = wx.StaticText(self, label=_('Preview:'))
-        
+
         # Create Preview panel
         self.Preview = wx.Panel(self, style=wx.SIMPLE_BORDER)
         self.Preview.SetBackgroundColour(wx.WHITE)
-        
+
         # Add function to preview panel so that it answers to graphic elements
         # like Viewer
-        setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
-        setattr(self.Preview, "GetScaling", lambda:None)
+        setattr(self.Preview, "GetDrawingMode", lambda: FREEDRAWING_MODE)
+        setattr(self.Preview, "GetScaling", lambda: None)
         setattr(self.Preview, "GetBlockType", controller.GetBlockType)
         setattr(self.Preview, "IsOfType", controller.IsOfType)
-        
+
         # Bind paint event on Preview panel
         self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
-        
+
         # Add default dialog buttons sizer
-        self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
-        self.Bind(wx.EVT_BUTTON, self.OnOK, 
+        self.ButtonSizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
+        self.Bind(wx.EVT_BUTTON, self.OnOK,
                   self.ButtonSizer.GetAffirmativeButton())
-        
+
         self.Element = None            # Graphic element to display in preview
         self.MinElementSize = None     # Graphic element minimal size
-        
+
         # Variable containing the graphic element name when dialog is opened
         self.DefaultElementName = None
-        
+        self.Fit()
+
         # List of variables defined in POU {var_name: (var_class, var_type),...}
         self.VariableList = {}
-        
+
     def __del__(self):
         """
         Destructor
         """
         # Remove reference to project controller
         self.Controller = None
-    
-    def _init_sizers(self, main_rows, main_growable_row,
-                            left_rows, left_growable_row,
-                            right_rows, right_growable_row):
+
+    def _init_sizers(self,
+                     main_rows, main_growable_row,
+                     left_rows, left_growable_row,
+                     right_rows, right_growable_row):
         """
         Initialize common sizers
         @param main_rows: Number of rows in main sizer
@@ -107,44 +112,44 @@
         None if no row is growable
         """
         # Create dialog main sizer
-        self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, 
+        self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0,
                                           rows=main_rows, vgap=10)
         self.MainSizer.AddGrowableCol(0)
         if main_growable_row is not None:
             self.MainSizer.AddGrowableRow(main_growable_row)
-        
+
         # Create a sizer for dividing parameters in two columns
-        column_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        self.MainSizer.AddSizer(column_sizer, border=20, 
-              flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
-        
+        self.ColumnSizer = wx.BoxSizer(wx.HORIZONTAL)
+        self.MainSizer.AddSizer(self.ColumnSizer, border=20,
+                                flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+
         # Create a sizer for left column
-        self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, 
+        self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0,
                                               rows=left_rows, vgap=5)
         self.LeftGridSizer.AddGrowableCol(0)
         if left_growable_row is not None:
             self.LeftGridSizer.AddGrowableRow(left_growable_row)
-        column_sizer.AddSizer(self.LeftGridSizer, 1, border=5, 
-              flag=wx.GROW|wx.RIGHT)
-        
+        self.ColumnSizer.AddSizer(self.LeftGridSizer, 1, border=5,
+                                  flag=wx.GROW | wx.RIGHT | wx.EXPAND)
+
         # Create a sizer for right column
-        self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, 
+        self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0,
                                                rows=right_rows, vgap=0)
         self.RightGridSizer.AddGrowableCol(0)
         if right_growable_row is not None:
             self.RightGridSizer.AddGrowableRow(right_growable_row)
-        column_sizer.AddSizer(self.RightGridSizer, 1, border=5, 
-              flag=wx.GROW|wx.LEFT)
-        
+        self.ColumnSizer.AddSizer(self.RightGridSizer, 1, border=5,
+                                  flag=wx.GROW | wx.LEFT)
+
         self.SetSizer(self.MainSizer)
-    
+
     def SetMinElementSize(self, size):
         """
         Define minimal graphic element size
         @param size: Tuple containing minimal size (width, height)
         """
         self.MinElementSize = size
-    
+
     def GetMinElementSize(self):
         """
         Get minimal graphic element size
@@ -154,16 +159,16 @@
         """
         if self.Element is None:
             return None
-        
+
         return self.Element.GetMinSize()
-    
+
     def SetPreviewFont(self, font):
         """
         Set font of Preview panel
         @param font: wx.Font object containing font style
         """
         self.Preview.SetFont(font)
-    
+
     def RefreshVariableList(self):
         """
         Extract list of variables defined in POU
@@ -171,23 +176,21 @@
         # Get list of variables defined in POU
         self.VariableList = {
             var.Name: (var.Class, var.Type)
-            for var in self.Controller.GetEditedElementInterfaceVars(
-                                                        self.TagName)
+            for var in self.Controller.GetEditedElementInterfaceVars(self.TagName)
             if var.Edit}
-        
-        # Add POU name to variable list if POU is a function 
-        returntype = self.Controller.GetEditedElementInterfaceReturnType(
-                                                            self.TagName)
+
+        # Add POU name to variable list if POU is a function
+        returntype = self.Controller.GetEditedElementInterfaceReturnType(self.TagName)
         if returntype is not None:
             self.VariableList[
                 self.Controller.GetEditedElementName(self.TagName)] = \
                  ("Output", returntype)
-        
+
         # Add POU name if POU is a transition
         words = self.TagName.split("::")
         if words[0] == "T":
             self.VariableList[words[2]] = ("Output", "BOOL")
-    
+
     def TestElementName(self, element_name):
         """
         Test displayed graphic element name
@@ -197,47 +200,46 @@
         message_format = None
         # Get graphic element name in upper case
         uppercase_element_name = element_name.upper()
-        
+
         # Test if graphic element name is a valid identifier
         if not TestIdentifier(element_name):
             message_format = _("\"%s\" is not a valid identifier!")
-        
+
         # Test that graphic element name isn't a keyword
         elif uppercase_element_name in IEC_KEYWORDS:
             message_format = _("\"%s\" is a keyword. It can't be used!")
-        
+
         # Test that graphic element name isn't a POU name
         elif uppercase_element_name in self.Controller.GetProjectPouNames():
             message_format = _("\"%s\" pou already exists!")
-        
+
         # Test that graphic element name isn't already used in POU by a variable
         # or another graphic element
-        elif ((self.DefaultElementName is None or 
-               self.DefaultElementName.upper() != uppercase_element_name) and 
-              uppercase_element_name in self.Controller.\
-                    GetEditedElementVariables(self.TagName)):
+        elif ((self.DefaultElementName is None or
+               self.DefaultElementName.upper() != uppercase_element_name) and
+              uppercase_element_name in self.Controller.GetEditedElementVariables(self.TagName)):
             message_format = _("\"%s\" element for this pou already exists!")
-        
+
         # If an error have been identify, show error message dialog
         if message_format is not None:
             self.ShowErrorMessage(message_format % element_name)
             # Test failed
             return False
-        
+
         # Test succeed
         return True
-    
+
     def ShowErrorMessage(self, message):
         """
         Show an error message dialog over this dialog
         @param message: Error message to display
         """
-        dialog = wx.MessageDialog(self, message, 
-                                  _("Error"), 
-                                  wx.OK|wx.ICON_ERROR)
+        dialog = wx.MessageDialog(self, message,
+                                  _("Error"),
+                                  wx.OK | wx.ICON_ERROR)
         dialog.ShowModal()
         dialog.Destroy()
-    
+
     def OnOK(self, event):
         """
         Called when dialog OK button is pressed
@@ -247,7 +249,7 @@
         """
         # Close dialog
         self.EndModal(wx.ID_OK)
-    
+
     def RefreshPreview(self):
         """
         Refresh preview panel of graphic element
@@ -257,42 +259,42 @@
         dc = wx.ClientDC(self.Preview)
         dc.SetFont(self.Preview.GetFont())
         dc.Clear()
-        
+
         # Return immediately if no graphic element defined
         if self.Element is None:
             return
-        
+
         # Calculate block size according to graphic element min size due to its
         # parameters and graphic element min size defined
         min_width, min_height = self.GetMinElementSize()
         width = max(self.MinElementSize[0], min_width)
         height = max(self.MinElementSize[1], min_height)
         self.Element.SetSize(width, height)
-        
+
         # Get element position and bounding box to center in preview
         posx, posy = self.Element.GetPosition()
         bbox = self.Element.GetBoundingBox()
-        
+
         # Get Preview panel size
         client_size = self.Preview.GetClientSize()
-        
+
         # If graphic element is too big to be displayed in preview panel,
         # calculate preview panel scale so that graphic element fit inside
-        scale = (max(float(bbox.width) / client_size.width, 
-                     float(bbox.height) / client_size.height) * 1.1
-                 if bbox.width * 1.1 > client_size.width or 
-                    bbox.height * 1.1 > client_size.height
-                 else 1.0)
+        k = 1.1 if (bbox.width * 1.1 > client_size.width or
+                    bbox.height * 1.1 > client_size.height) \
+            else 1.0
+        scale = (max(bbox.width / client_size.width,
+                     bbox.height / client_size.height) * k)
         dc.SetUserScale(1.0 / scale, 1.0 / scale)
-        
+
         # Center graphic element in preview panel
-        x = int(client_size.width * scale - bbox.width) / 2 + posx - bbox.x
-        y = int(client_size.height * scale - bbox.height) / 2 + posy - bbox.y
+        x = int(client_size.width * scale - bbox.width) // 2 + posx - bbox.x
+        y = int(client_size.height * scale - bbox.height) // 2 + posy - bbox.y
         self.Element.SetPosition(x, y)
-        
+
         # Draw graphic element
         self.Element.Draw(dc)
-    
+
     def OnPaint(self, event):
         """
         Called when Preview panel need to be redraw
@@ -300,4 +302,3 @@
         """
         self.RefreshPreview()
         event.Skip()
-        
--- a/dialogs/BrowseLocationsDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/BrowseLocationsDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,153 +23,164 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.#
 
-import os
-
+
+from __future__ import absolute_import
 import wx
 
 from plcopen.structures import LOCATIONDATATYPES
 from PLCControler import LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY
 from util.BitmapLibrary import GetBitmap
-
-#-------------------------------------------------------------------------------
+from util.TranslationCatalogs import NoTranslate
+
+# -------------------------------------------------------------------------------
 #                                   Helpers
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 def GetDirFilterChoiceOptions():
-    _ = lambda x : x
-    return [(_("All"), [LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY]), 
-            (_("Input"), [LOCATION_VAR_INPUT]), 
-            (_("Output"), [LOCATION_VAR_OUTPUT]), 
+    _ = NoTranslate
+    return [(_("All"), [LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY]),
+            (_("Input"), [LOCATION_VAR_INPUT]),
+            (_("Output"), [LOCATION_VAR_OUTPUT]),
             (_("Memory"), [LOCATION_VAR_MEMORY])]
-DIRFILTERCHOICE_OPTIONS = dict([(_(option), filter) for option, filter in GetDirFilterChoiceOptions()])
+
 
 def GetTypeFilterChoiceOptions():
-    _ = lambda x : x
-    return [_("All"), 
-            _("Type and derivated"), 
+    _ = NoTranslate
+    return [_("All"),
+            _("Type and derivated"),
             _("Type strict")]
 
+
 # turn LOCATIONDATATYPES inside-out
 LOCATION_SIZES = {}
 for size, types in LOCATIONDATATYPES.iteritems():
     for type in types:
         LOCATION_SIZES[type] = size
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                            Browse Locations Dialog
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 class BrowseLocationsDialog(wx.Dialog):
-    
+
     def __init__(self, parent, var_type, controller):
-        wx.Dialog.__init__(self, parent,  
-              size=wx.Size(600, 400), title=_('Browse Locations'),
-              style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)
-        
+        wx.Dialog.__init__(self, parent, title=_('Browse Locations'),
+                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
+
+        self.DIRFILTERCHOICE_OPTIONS = dict(
+            [(_(option), filter) for option, filter in GetDirFilterChoiceOptions()])
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(1)
-        
+
         locations_label = wx.StaticText(self, label=_('Locations available:'))
-        main_sizer.AddWindow(locations_label, border=20, 
-              flag=wx.TOP|wx.LEFT|wx.RIGHT|wx.GROW)
-        
-        self.LocationsTree = wx.TreeCtrl(self, 
-              style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_HIDE_ROOT|wx.TR_LINES_AT_ROOT)
-        self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnLocationsTreeItemActivated, 
+        main_sizer.AddWindow(locations_label, border=20,
+                             flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
+
+        self.LocationsTree = wx.TreeCtrl(self,
+                                         style=(wx.TR_HAS_BUTTONS |
+                                                wx.TR_SINGLE |
+                                                wx.SUNKEN_BORDER |
+                                                wx.TR_HIDE_ROOT |
+                                                wx.TR_LINES_AT_ROOT))
+        self.LocationsTree.SetInitialSize(wx.Size(-1, 300))
+        self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnLocationsTreeItemActivated,
                   self.LocationsTree)
-        main_sizer.AddWindow(self.LocationsTree, border=20, 
-              flag=wx.LEFT|wx.RIGHT|wx.GROW)
-        
+        main_sizer.AddWindow(self.LocationsTree, border=20,
+                             flag=wx.LEFT | wx.RIGHT | wx.GROW)
+
         button_gridsizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
         button_gridsizer.AddGrowableCol(1)
         button_gridsizer.AddGrowableCol(3)
         button_gridsizer.AddGrowableRow(0)
-        main_sizer.AddSizer(button_gridsizer, border=20, 
-              flag=wx.BOTTOM|wx.LEFT|wx.RIGHT|wx.GROW)
-        
+        main_sizer.AddSizer(button_gridsizer, border=20,
+                            flag=wx.BOTTOM | wx.LEFT | wx.RIGHT | wx.GROW)
+
         direction_label = wx.StaticText(self, label=_('Direction:'))
         button_gridsizer.AddWindow(direction_label,
-              flag=wx.ALIGN_CENTER_VERTICAL)
-        
-        self.DirFilterChoice = wx.ComboBox(self, size=wx.Size(0, -1), style=wx.CB_READONLY)
+                                   flag=wx.ALIGN_CENTER_VERTICAL)
+
+        self.DirFilterChoice = wx.ComboBox(self, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnFilterChoice, self.DirFilterChoice)
         button_gridsizer.AddWindow(self.DirFilterChoice,
-              flag=wx.GROW|wx.ALIGN_CENTER_VERTICAL)
-        
+                                   flag=wx.GROW | wx.ALIGN_CENTER_VERTICAL)
+
         filter_label = wx.StaticText(self, label=_('Type:'))
         button_gridsizer.AddWindow(filter_label,
-              flag=wx.ALIGN_CENTER_VERTICAL)
-        
-        self.TypeFilterChoice = wx.ComboBox(self, size=wx.Size(0, -1), style=wx.CB_READONLY)
+                                   flag=wx.ALIGN_CENTER_VERTICAL)
+
+        self.TypeFilterChoice = wx.ComboBox(self, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnFilterChoice, self.TypeFilterChoice)
         button_gridsizer.AddWindow(self.TypeFilterChoice,
-              flag=wx.GROW|wx.ALIGN_CENTER_VERTICAL)
-        
-        button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+                                   flag=wx.GROW | wx.ALIGN_CENTER_VERTICAL)
+
+        button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
         self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
         button_gridsizer.AddSizer(button_sizer, flag=wx.ALIGN_RIGHT)
-        
+
         self.SetSizer(main_sizer)
-        
+
         self.Controller = controller
         self.VarType = var_type
         self.BaseVarType = self.Controller.GetBaseType(self.VarType)
         self.VarTypeSize = LOCATION_SIZES[self.BaseVarType]
         self.Locations = self.Controller.GetVariableLocationTree()
-        
+
         # Define Tree item icon list
         self.TreeImageList = wx.ImageList(16, 16)
         self.TreeImageDict = {}
-        
+
         # Icons for items
         for imgname, itemtype in [
-            ("CONFIGURATION", LOCATION_CONFNODE), 
-            ("RESOURCE",      LOCATION_MODULE), 
-            ("PROGRAM",       LOCATION_GROUP), 
-            ("VAR_INPUT",     LOCATION_VAR_INPUT), 
-            ("VAR_OUTPUT",    LOCATION_VAR_OUTPUT), 
-            ("VAR_LOCAL",     LOCATION_VAR_MEMORY)]:
-            self.TreeImageDict[itemtype]=self.TreeImageList.Add(GetBitmap(imgname))
-        
+                ("CONFIGURATION", LOCATION_CONFNODE),
+                ("RESOURCE",      LOCATION_MODULE),
+                ("PROGRAM",       LOCATION_GROUP),
+                ("VAR_INPUT",     LOCATION_VAR_INPUT),
+                ("VAR_OUTPUT",    LOCATION_VAR_OUTPUT),
+                ("VAR_LOCAL",     LOCATION_VAR_MEMORY)]:
+            self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(imgname))
+
         # Assign icon list to TreeCtrls
         self.LocationsTree.SetImageList(self.TreeImageList)
-        
+
         # Set a options for the choice
-        for option, filter in GetDirFilterChoiceOptions():
+        for option, _filter in GetDirFilterChoiceOptions():
             self.DirFilterChoice.Append(_(option))
         self.DirFilterChoice.SetStringSelection(_("All"))
         for option in GetTypeFilterChoiceOptions():
             self.TypeFilterChoice.Append(_(option))
         self.TypeFilterChoice.SetStringSelection(_("All"))
         self.RefreshFilters()
-        
+
         self.RefreshLocationsTree()
-    
+        self.Fit()
+
     def RefreshFilters(self):
-        self.DirFilter = DIRFILTERCHOICE_OPTIONS[self.DirFilterChoice.GetStringSelection()]
+        self.DirFilter = self.DIRFILTERCHOICE_OPTIONS[self.DirFilterChoice.GetStringSelection()]
         self.TypeFilter = self.TypeFilterChoice.GetSelection()
-    
+
     def RefreshLocationsTree(self):
         root = self.LocationsTree.GetRootItem()
         if not root.IsOk():
             root = self.LocationsTree.AddRoot("")
         self.GenerateLocationsTreeBranch(root, self.Locations)
-    
+
     def FilterType(self, location_type, location_size):
         if self.TypeFilter == 0:
             return True
-        
+
         if location_size != self.VarTypeSize:
             return False
-        
+
         if self.TypeFilter == 1:
             return self.Controller.IsOfType(location_type, self.BaseVarType)
         elif self.TypeFilter == 2:
             return location_type == self.VarType
-        
+
         return True
-    
+
     def GenerateLocationsTreeBranch(self, root, locations):
         to_delete = []
         item, root_cookie = self.LocationsTree.GetFirstChild(root)
@@ -192,28 +204,28 @@
             item, root_cookie = self.LocationsTree.GetNextChild(root, root_cookie)
         for item in to_delete:
             self.LocationsTree.Delete(item)
-    
+
     def OnLocationsTreeItemActivated(self, event):
         infos = self.LocationsTree.GetPyData(event.GetItem())
         if infos["type"] not in [LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP]:
             wx.CallAfter(self.EndModal, wx.ID_OK)
         event.Skip()
-    
+
     def OnFilterChoice(self, event):
         self.RefreshFilters()
         self.RefreshLocationsTree()
-    
+
     def GetValues(self):
         selected = self.LocationsTree.GetSelection()
         return self.LocationsTree.GetPyData(selected)
-        
+
     def OnOK(self, event):
         selected = self.LocationsTree.GetSelection()
         var_infos = None
         if selected.IsOk():
             var_infos = self.LocationsTree.GetPyData(selected)
         if var_infos is None or var_infos["type"] in [LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP]:
-            dialog = wx.MessageDialog(self, _("A location must be selected!"), _("Error"), wx.OK|wx.ICON_ERROR)
+            dialog = wx.MessageDialog(self, _("A location must be selected!"), _("Error"), wx.OK | wx.ICON_ERROR)
             dialog.ShowModal()
             dialog.Destroy()
         else:
--- a/dialogs/BrowseValuesLibraryDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/BrowseValuesLibraryDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,45 +23,48 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 
 class BrowseValuesLibraryDialog(wx.Dialog):
     """
     Modal dialog that helps in selecting predefined XML attributes sets out of hierarchically organized list
-    """    
+    """
 
     def __init__(self, parent, name, library, default=None):
         wx.Dialog.__init__(self,
-              name='BrowseValueDialog', parent=parent,
-              size=wx.Size(600, 400), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER,
-              title=_('Browse %s values library') % name)
-
-        self.SetClientSize(wx.Size(600, 400))
+                           name='BrowseValueDialog', parent=parent,
+                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER,
+                           title=_('Browse %s values library') % name)
 
         self.staticText1 = wx.StaticText(
-              label=_('Choose a value for %s:') % name, name='staticText1', parent=self,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-        
+            label=_('Choose a value for %s:') % name,
+            name='staticText1', parent=self,
+            pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
+
         self.ValuesLibrary = wx.TreeCtrl(
-              name='ValuesLibrary', parent=self, pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER|wx.TR_HIDE_ROOT|wx.TR_LINES_AT_ROOT)
-        
-        self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+            name='ValuesLibrary', parent=self, pos=wx.Point(0, 0),
+            size=wx.Size(400, 200),
+            style=wx.TR_HAS_BUTTONS | wx.TR_SINGLE | wx.SUNKEN_BORDER | wx.TR_HIDE_ROOT | wx.TR_LINES_AT_ROOT)
+
+        self.ButtonSizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
 
         self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
-        
+
         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10)
-        
-        self.flexGridSizer1.AddWindow(self.staticText1, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
-        self.flexGridSizer1.AddWindow(self.ValuesLibrary, 0, border=20, flag=wx.GROW|wx.LEFT|wx.RIGHT)
-        self.flexGridSizer1.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-    
+
+        self.flexGridSizer1.AddWindow(self.staticText1,   0, border=20, flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+        self.flexGridSizer1.AddWindow(self.ValuesLibrary, 0, border=20, flag=wx.GROW | wx.LEFT | wx.RIGHT)
+        self.flexGridSizer1.AddSizer(self.ButtonSizer,    0, border=20, flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
         self.flexGridSizer1.AddGrowableCol(0)
         self.flexGridSizer1.AddGrowableRow(1)
-        
+
         self.SetSizer(self.flexGridSizer1)
-        
+        self.Fit()
+
         root = self.ValuesLibrary.AddRoot("")
         self.GenerateValuesLibraryBranch(root, library, default)
 
@@ -80,9 +84,8 @@
     def OnOK(self, event):
         selected = self.ValuesLibrary.GetSelection()
         if not selected.IsOk() or self.ValuesLibrary.GetPyData(selected) is None:
-            message = wx.MessageDialog(self, _("No valid value selected!"), _("Error"), wx.OK|wx.ICON_ERROR)
+            message = wx.MessageDialog(self, _("No valid value selected!"), _("Error"), wx.OK | wx.ICON_ERROR)
             message.ShowModal()
             message.Destroy()
         else:
             self.EndModal(wx.ID_OK)
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/CommentEditDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,86 @@
+#
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2018: Andrey Skvortsov <andrej.skvortzov@gmail.com>
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+from __future__ import absolute_import
+
+import wx
+
+
+class CommentEditDialog(wx.Dialog):
+    """
+    This dialog behaves like wx.TextEntryDialog,
+    but additionaly it allows to set custom font and
+    exact size for wx.TextCtrl.
+    That allows to edit comment and immediately
+    see how it'll be shown on wiresheet.
+    """
+
+    def __init__(self, parent, font, value="", size=wx.Size(400, 200)):
+        """
+        Constructor
+
+        :param parent:
+            parent window (wx.Window)
+        :param font:
+            the font for text control
+        :param value:
+            the default value, which may be the empty string
+        :param size:
+            desired initial size for text control.
+            Minimal size of text control is limited
+            by (100,100)
+        """
+        wx.Dialog.__init__(self, parent, title=_("Please enter comment text"))
+        msg_label = wx.StaticText(self, label=_("Edit comment"))
+        input_size = wx.Size(max(size[0], 100), max(size[1], 100))
+        input = wx.TextCtrl(self, style=wx.TE_MULTILINE)
+        input.SetInitialSize(input_size)
+        input.SetFont(font)
+        input.SetValue(value)
+        buttons = self.CreateButtonSizer(wx.OK | wx.CANCEL)
+        sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10)
+        border = 20
+
+        sizer.Add(msg_label, 0,
+                  flag=wx.TOP | wx.LEFT | wx.RIGHT,
+                  border=border)
+        sizer.Add(input, 1,
+                  flag=wx.EXPAND | wx.LEFT | wx.RIGHT,
+                  border=border)
+        sizer.Add(buttons, 0,
+                  flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                  border=border)
+
+        self.SetSizerAndFit(sizer)
+        self.input = input
+
+    def SetValue(self, value):
+        """Sets text value"""
+        self.input.SetValue(value)
+
+    def GetValue(self):
+        """
+        Returns the text that the user has entered
+        if the user has pressed wx.OK,
+        or the original value if the user has pressed Cancel.
+        """
+        return self.input.GetValue()
--- a/dialogs/ConnectionDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/ConnectionDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,23 +23,25 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from graphics.GraphicCommons import CONNECTOR, CONTINUATION
 from graphics.FBD_Objects import FBD_Connector
-from BlockPreviewDialog import BlockPreviewDialog
-
-#-------------------------------------------------------------------------------
+from dialogs.BlockPreviewDialog import BlockPreviewDialog
+
+# -------------------------------------------------------------------------------
 #                       Set Connection Parameters Dialog
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a dialog for defining parameters of a connection graphic
-element
-"""
+# -------------------------------------------------------------------------------
+
 
 class ConnectionDialog(BlockPreviewDialog):
-    
+    """
+    Class that implements a dialog for defining parameters of a connection graphic
+    element
+    """
+
     def __init__(self, parent, controller, tagname, apply_button=False):
         """
         Constructor
@@ -48,46 +51,50 @@
         @param apply_button: Enable button for applying connector modification
         to all connector having the same name in POU (default: False)
         """
-        BlockPreviewDialog.__init__(self, parent, controller, tagname, 
-              size=wx.Size(350, 250), title=_('Connection Properties'))
-        
+        BlockPreviewDialog.__init__(self, parent, controller, tagname,
+                                    title=_('Connection Properties'))
+
         # Init common sizers
-        self._init_sizers(2, 0, 5, None, 2, 1)
-        
+        self._init_sizers(2, 0, 7, 1, 0, None)
+
         # Create label for connection type
         type_label = wx.StaticText(self, label=_('Type:'))
         self.LeftGridSizer.AddWindow(type_label, flag=wx.GROW)
-        
+
         # Create radio buttons for selecting connection type
         self.TypeRadioButtons = {}
         first = True
         for type, label in [(CONNECTOR, _('Connector')),
                             (CONTINUATION, _('Continuation'))]:
-            radio_button = wx.RadioButton(self, label=label, 
-                  style=(wx.RB_GROUP if first else 0))
+            radio_button = wx.RadioButton(self, label=label,
+                                          style=(wx.RB_GROUP if first else 0))
             radio_button.SetValue(first)
             self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, radio_button)
             self.LeftGridSizer.AddWindow(radio_button, flag=wx.GROW)
             self.TypeRadioButtons[type] = radio_button
             first = False
-        
+
         # Create label for connection name
         name_label = wx.StaticText(self, label=_('Name:'))
         self.LeftGridSizer.AddWindow(name_label, flag=wx.GROW)
-        
+
         # Create text control for defining connection name
         self.ConnectionName = wx.TextCtrl(self)
+        self.ConnectionName.SetMinSize(wx.Size(200, -1))
         self.Bind(wx.EVT_TEXT, self.OnNameChanged, self.ConnectionName)
         self.LeftGridSizer.AddWindow(self.ConnectionName, flag=wx.GROW)
-        
+
         # Add preview panel and associated label to sizers
-        self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
-        self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW)
-        
+        self.Preview.SetMinSize(wx.Size(-1, 100))
+        self.LeftGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
+        self.LeftGridSizer.AddWindow(self.Preview, flag=wx.GROW)
+
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(self.ButtonSizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        self.MainSizer.AddSizer(
+            self.ButtonSizer, border=20,
+            flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+        self.ColumnSizer.RemoveSizer(self.RightGridSizer)
+
         # Add button for applying connection name modification to all connection
         # of POU
         if apply_button:
@@ -95,17 +102,16 @@
             self.ApplyToAllButton.SetToolTipString(
                 _("Apply name modification to all continuations with the same name"))
             self.Bind(wx.EVT_BUTTON, self.OnApplyToAll, self.ApplyToAllButton)
-            self.ButtonSizer.AddWindow(self.ApplyToAllButton, 
-                    border=(3 if wx.Platform == '__WXMSW__' else 10),
-                    flag=wx.LEFT)
+            self.ButtonSizer.AddWindow(self.ApplyToAllButton, flag=wx.LEFT)
         else:
             self.ConnectionName.ChangeValue(
                 controller.GenerateNewName(
-                        tagname, None, "Connection%d", 0))
-        
+                    tagname, None, "Connection%d", 0))
+        self.Fit()
+
         # Connector radio button is default control having keyboard focus
         self.TypeRadioButtons[CONNECTOR].SetFocus()
-    
+
     def GetConnectionType(self):
         """
         Return type selected for connection
@@ -114,7 +120,7 @@
         return (CONNECTOR
                 if self.TypeRadioButtons[CONNECTOR].GetValue()
                 else CONTINUATION)
-    
+
     def SetValues(self, values):
         """
         Set default connection parameters
@@ -122,18 +128,18 @@
         """
         # For each parameters defined, set corresponding control value
         for name, value in values.items():
-            
+
             # Parameter is connection type
             if name == "type":
                 self.TypeRadioButtons[value].SetValue(True)
-            
+
             # Parameter is connection name
             elif name == "name":
                 self.ConnectionName.SetValue(value)
-        
+
         # Refresh preview panel
         self.RefreshPreview()
-    
+
     def GetValues(self):
         """
         Return connection parameters defined in dialog
@@ -151,23 +157,23 @@
         @return: True if connection name is valid
         """
         message = None
-        
+
         # Get connection name typed by user
         connection_name = self.ConnectionName.GetValue()
-        
+
         # Test that a name have been defined
         if connection_name == "":
             message = _("Form isn't complete. Name must be filled!")
-        
+
         # If an error have been identify, show error message dialog
         if message is not None:
             self.ShowErrorMessage(message)
             # Test failed
             return False
-        
+
         # Return result of element name test
         return self.TestElementName(connection_name)
-        
+
     def OnOK(self, event):
         """
         Called when dialog OK button is pressed
@@ -203,17 +209,16 @@
         """
         self.RefreshPreview()
         event.Skip()
-        
+
     def RefreshPreview(self):
         """
         Refresh preview panel of graphic element
         Override BlockPreviewDialog function
         """
         # Set graphic element displayed, creating a FBD connection element
-        self.Element = FBD_Connector(self.Preview, 
-                self.GetConnectionType(),
-                self.ConnectionName.GetValue())
-        
+        self.Element = FBD_Connector(self.Preview,
+                                     self.GetConnectionType(),
+                                     self.ConnectionName.GetValue())
+
         # Call BlockPreviewDialog function
         BlockPreviewDialog.RefreshPreview(self)
-        
--- a/dialogs/DiscoveryDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,250 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-#
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-#
-# See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-import socket
-import wx
-import  wx.lib.mixins.listctrl  as  listmix
-from util.Zeroconf import *
-
-import connectors
-
-service_type = '_PYRO._tcp.local.'
-
-class AutoWidthListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
-    def __init__(self, parent, id, name, pos=wx.DefaultPosition,
-                 size=wx.DefaultSize, style=0):
-        wx.ListCtrl.__init__(self, parent, id, pos, size, style, name=name)
-        listmix.ListCtrlAutoWidthMixin.__init__(self)
-
-[ID_DISCOVERYDIALOG, ID_DISCOVERYDIALOGSTATICTEXT1, 
- ID_DISCOVERYDIALOGSERVICESLIST, ID_DISCOVERYDIALOGREFRESHBUTTON, 
- ID_DISCOVERYDIALOGLOCALBUTTON, ID_DISCOVERYDIALOGIPBUTTON, 
-] = [wx.NewId() for _init_ctrls in range(6)]
-
-class DiscoveryDialog(wx.Dialog, listmix.ColumnSorterMixin):
-    
-    def _init_coll_MainSizer_Items(self, parent):
-        parent.AddWindow(self.staticText1, 0, border=20, flag=wx.TOP|wx.LEFT|wx.RIGHT|wx.GROW)
-        parent.AddWindow(self.ServicesList, 0, border=20, flag=wx.LEFT|wx.RIGHT|wx.GROW)
-        parent.AddSizer(self.ButtonGridSizer, 0, border=20, flag=wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.GROW)
-        
-    def _init_coll_MainSizer_Growables(self, parent):
-        parent.AddGrowableCol(0)
-        parent.AddGrowableRow(1)
-    
-    def _init_coll_ButtonGridSizer_Items(self, parent):
-        parent.AddWindow(self.RefreshButton, 0, border=0, flag=0)
-        parent.AddWindow(self.LocalButton, 0, border=0, flag=0)
-        parent.AddWindow(self.IpButton, 0, border=0, flag=0)
-        parent.AddSizer(self.ButtonSizer, 0, border=0, flag=0)
-        
-    def _init_coll_ButtonGridSizer_Growables(self, parent):
-        parent.AddGrowableCol(0)
-        parent.AddGrowableCol(1)
-        parent.AddGrowableRow(0)
-    
-    def _init_sizers(self):
-        self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10)
-        self.ButtonGridSizer = wx.FlexGridSizer(cols=4, hgap=5, rows=1, vgap=0)
-        
-        self._init_coll_MainSizer_Items(self.MainSizer)
-        self._init_coll_MainSizer_Growables(self.MainSizer)
-        self._init_coll_ButtonGridSizer_Items(self.ButtonGridSizer)
-        self._init_coll_ButtonGridSizer_Growables(self.ButtonGridSizer)
-        
-        self.SetSizer(self.MainSizer)
-    
-    def _init_ctrls(self, prnt):
-        wx.Dialog.__init__(self, id=ID_DISCOVERYDIALOG, 
-              name='DiscoveryDialog', parent=prnt,  
-              size=wx.Size(600, 600), style=wx.DEFAULT_DIALOG_STYLE,
-              title=_('Service Discovery'))
-        
-        self.staticText1 = wx.StaticText(id=ID_DISCOVERYDIALOGSTATICTEXT1,
-              label=_('Services available:'), name='staticText1', parent=self,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-        
-        # Set up list control
-        self.ServicesList = AutoWidthListCtrl(id=ID_DISCOVERYDIALOGSERVICESLIST,
-              name='ServicesList', parent=self, pos=wx.Point(0, 0), size=wx.Size(0, 0), 
-              style=wx.LC_REPORT|wx.LC_EDIT_LABELS|wx.LC_SORT_ASCENDING|wx.LC_SINGLE_SEL)
-        self.ServicesList.InsertColumn(0, _('NAME'))
-        self.ServicesList.InsertColumn(1, _('TYPE'))
-        self.ServicesList.InsertColumn(2, _('IP'))
-        self.ServicesList.InsertColumn(3, _('PORT'))
-        self.ServicesList.SetColumnWidth(0, 150)
-        self.ServicesList.SetColumnWidth(1, 150)
-        self.ServicesList.SetColumnWidth(2, 150)
-        self.ServicesList.SetColumnWidth(3, 150)
-        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, id=ID_DISCOVERYDIALOGSERVICESLIST)
-        self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, id=ID_DISCOVERYDIALOGSERVICESLIST)
-        
-        listmix.ColumnSorterMixin.__init__(self, 4)
-        
-        self.RefreshButton = wx.Button(id=ID_DISCOVERYDIALOGREFRESHBUTTON,
-              label=_('Refresh'), name='RefreshButton', parent=self,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnRefreshButton, id=ID_DISCOVERYDIALOGREFRESHBUTTON)
-        
-        self.LocalButton = wx.Button(id=ID_DISCOVERYDIALOGLOCALBUTTON,
-              label=_('Local'), name='LocalButton', parent=self,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnLocalButton, id=ID_DISCOVERYDIALOGLOCALBUTTON)
-
-        self.IpButton = wx.Button(id=ID_DISCOVERYDIALOGIPBUTTON,
-              label=_('Add IP'), name='IpButton', parent=self,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-        self.Bind(wx.EVT_BUTTON, self.OnIpButton, id=ID_DISCOVERYDIALOGIPBUTTON)
-        
-        self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTER)
-        
-        self._init_sizers()
-        
-    def __init__(self, parent):
-        self._init_ctrls(parent)
-        
-        self.itemDataMap = {}
-        self.nextItemId = 0
-        
-        self.URI = None
-        self.Browser = None
-        
-        self.ZeroConfInstance = Zeroconf()
-        self.RefreshList()
-        self.LatestSelection=None
-        
-    def __del__(self):
-        if self.Browser is not None : self.Browser.cancel()
-        self.ZeroConfInstance.close()
-        
-    def RefreshList(self):
-        if self.Browser is not None : self.Browser.cancel()
-        self.Browser = ServiceBrowser(self.ZeroConfInstance, service_type, self)
-
-    def OnRefreshButton(self, event):
-        self.ServicesList.DeleteAllItems()
-        self.RefreshList()
-
-    def OnLocalButton(self, event):
-        self.URI = "LOCAL://"
-        self.EndModal(wx.ID_OK)
-        event.Skip()
-
-    def OnIpButton(self, event):
-        if self.LatestSelection is not None:
-            l = lambda col : self.getColumnText(self.LatestSelection,col)
-            self.URI = "%s://%s:%s"%tuple(map(l,(1,2,3)))
-            self.EndModal(wx.ID_OK)
-        event.Skip()
-
-    # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
-    def GetListCtrl(self):
-        return self.ServicesList
-
-    def getColumnText(self, index, col):
-        item = self.ServicesList.GetItem(index, col)
-        return item.GetText()
-
-    def OnItemSelected(self, event):
-        self.SetURI(event.m_itemIndex)
-        event.Skip()
-
-    def OnItemActivated(self, event):
-        self.SetURI(event.m_itemIndex)
-        self.EndModal(wx.ID_OK)
-        event.Skip()
-
-#    def SetURI(self, idx):
-#        connect_type = self.getColumnText(idx, 1)
-#        connect_address = self.getColumnText(idx, 2)
-#        connect_port = self.getColumnText(idx, 3)
-#        
-#        self.URI = "%s://%s:%s"%(connect_type, connect_address, connect_port)
-
-    def SetURI(self, idx):
-        self.LatestSelection = idx
-        svcname = self.getColumnText(idx, 0) 
-        connect_type = self.getColumnText(idx, 1)
-        self.URI = "%s://%s"%(connect_type, svcname + '.' + service_type)
-        
-    def GetURI(self):
-        return self.URI
-        
-    def removeService(self, zeroconf, _type, name):
-        wx.CallAfter(self._removeService, name)
-
-
-    def _removeService(self, name):
-        '''
-        called when a service with the desired type goes offline.
-        '''
-        
-        # loop through the list items looking for the service that went offline
-        for idx in xrange(self.ServicesList.GetItemCount()):
-            # this is the unique identifier assigned to the item
-            item_id = self.ServicesList.GetItemData(idx)
-
-            # this is the full typename that was received by addService
-            item_name = self.itemDataMap[item_id][4]
-
-            if item_name == name:
-                self.ServicesList.DeleteItem(idx)
-                break
-        
-    def addService(self, zeroconf, _type, name):
-        wx.CallAfter(self._addService, _type, name)
-
-    def _addService(self, _type, name):
-        '''
-        called when a service with the desired type is discovered.
-        '''
-        info = self.ZeroConfInstance.getServiceInfo(_type, name)
-
-        svcname  = name.split(".")[0]
-        typename = _type.split(".")[0][1:]
-        ip       = str(socket.inet_ntoa(info.getAddress()))
-        port     = info.getPort()
-
-        num_items = self.ServicesList.GetItemCount()
-
-        # display the new data in the list
-        new_item = self.ServicesList.InsertStringItem(num_items, svcname)
-        self.ServicesList.SetStringItem(new_item, 1, "%s" % typename)
-        self.ServicesList.SetStringItem(new_item, 2, "%s" % ip)
-        self.ServicesList.SetStringItem(new_item, 3, "%s" % port)
-
-        # record the new data for the ColumnSorterMixin
-        # we assign every list item a unique id (that won't change when items
-        # are added or removed)
-        self.ServicesList.SetItemData(new_item, self.nextItemId)
- 
-        # the value of each column has to be stored in the itemDataMap
-        # so that ColumnSorterMixin knows how to sort the column.
-
-        # "name" is included at the end so that self.removeService
-        # can access it.
-        self.itemDataMap[self.nextItemId] = [ svcname, typename, ip, port, name ]
-
-        self.nextItemId += 1
-        
--- a/dialogs/DurationEditorDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/DurationEditorDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,13 +23,16 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
 import re
 
 import wx
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                                  Helpers
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 MICROSECONDS = 0.001
 MILLISECONDS = 1
@@ -37,63 +41,64 @@
 HOUR = 60 * MINUTE
 DAY = 24 * HOUR
 
-IEC_TIME_MODEL = re.compile("(?:T|TIME)#(-)?(?:(%(float)s)D_?)?(?:(%(float)s)H_?)?(?:(%(float)s)M(?!S)_?)?(?:(%(float)s)S_?)?(?:(%(float)s)MS)?$" % {"float": "[0-9]+(?:\.[0-9]+)?"})
+IEC_TIME_MODEL = re.compile(r"(?:T|TIME)#(-)?(?:(%(float)s)D_?)?(?:(%(float)s)H_?)?(?:(%(float)s)M(?!S)_?)?(?:(%(float)s)S_?)?(?:(%(float)s)MS)?$" % {"float": r"[0-9]+(?:\.[0-9]+)?"})
 
-CONTROLS = [
-    ("Days", _('Days:')),
-    ("Hours", _('Hours:')),
-    ("Minutes", _('Minutes:')),
-    ("Seconds", _('Seconds:')),
-    ("Milliseconds", _('Milliseconds:')),
-    ("Microseconds", _('Microseconds:')),
-]
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                         Edit Duration Value Dialog
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 class DurationEditorDialog(wx.Dialog):
 
     def __init__(self, parent):
-        wx.Dialog.__init__(self, parent, 
-              size=wx.Size(700, 200), title=_('Edit Duration'))
-        
+        wx.Dialog.__init__(self, parent, title=_('Edit Duration'))
+
+        CONTROLS = [
+            ("Days", _('Days:')),
+            ("Hours", _('Hours:')),
+            ("Minutes", _('Minutes:')),
+            ("Seconds", _('Seconds:')),
+            ("Milliseconds", _('Milliseconds:')),
+            ("Microseconds", _('Microseconds:')),
+        ]
+
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(0)
-        
+
         controls_sizer = wx.FlexGridSizer(cols=len(CONTROLS), hgap=10, rows=2, vgap=10)
-        main_sizer.AddSizer(controls_sizer, border=20, 
-              flag=wx.TOP|wx.LEFT|wx.RIGHT|wx.GROW)
-        
+        main_sizer.AddSizer(controls_sizer, border=20,
+                            flag=wx.TOP | wx.LEFT | wx.RIGHT | wx.GROW)
+
         controls = []
         for i, (name, label) in enumerate(CONTROLS):
             controls_sizer.AddGrowableCol(i)
-            
+
             st = wx.StaticText(self, label=label)
             txtctrl = wx.TextCtrl(self, value='0', style=wx.TE_PROCESS_ENTER)
-            self.Bind(wx.EVT_TEXT_ENTER, 
-                      self.GetControlValueTestFunction(txtctrl), 
+            self.Bind(wx.EVT_TEXT_ENTER,
+                      self.GetControlValueTestFunction(txtctrl),
                       txtctrl)
             setattr(self, name, txtctrl)
-        
+
             controls.append((st, txtctrl))
-            
+
         for st, txtctrl in controls:
             controls_sizer.AddWindow(st, flag=wx.GROW)
-            
+
         for st, txtctrl in controls:
             controls_sizer.AddWindow(txtctrl, flag=wx.GROW)
-        
-        button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+
+        button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
         self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
-        main_sizer.AddSizer(button_sizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        main_sizer.AddSizer(button_sizer, border=20,
+                            flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
         self.SetSizer(main_sizer)
-        
+        self.Fit()
         self.Days.SetFocus()
-        
+
     def SetDuration(self, value):
         result = IEC_TIME_MODEL.match(value.upper())
         if result is not None:
@@ -112,16 +117,17 @@
             else:
                 self.Milliseconds.SetValue("0")
                 self.Microseconds.SetValue("0")
-        
+
     def GetControlValueTestFunction(self, control):
         def OnValueChanged(event):
             try:
-                value = float(control.GetValue())
-            except ValueError, e:
-                message = wx.MessageDialog(self, _("Invalid value!\nYou must fill a numeric value."), _("Error"), wx.OK|wx.ICON_ERROR)
+                float(control.GetValue())
+            except ValueError:
+                message = wx.MessageDialog(self, _("Invalid value!\nYou must fill a numeric value."), _("Error"), wx.OK | wx.ICON_ERROR)
                 message.ShowModal()
                 message.Destroy()
             event.Skip()
+            self.OnCloseDialog()
         return OnValueChanged
 
     def GetDuration(self):
@@ -129,38 +135,42 @@
         for control, factor in [(self.Days, DAY), (self.Hours, HOUR),
                                 (self.Minutes, MINUTE), (self.Seconds, SECOND),
                                 (self.Milliseconds, MILLISECONDS), (self.Microseconds, MICROSECONDS)]:
-            
+
             milliseconds += float(control.GetValue()) * factor
-        
+
         not_null = False
         duration = "T#"
-        for value, format in [(int(milliseconds) / DAY, "%dd"),
-                            ((int(milliseconds) % DAY) / HOUR, "%dh"),
-                            ((int(milliseconds) % HOUR) / MINUTE, "%dm"),
-                            ((int(milliseconds) % MINUTE) / SECOND, "%ds")]:
-            
+        for value, format in [((int(milliseconds) // DAY),             "%dd"),
+                              ((int(milliseconds) % DAY) // HOUR,      "%dh"),
+                              ((int(milliseconds) % HOUR) // MINUTE,   "%dm"),
+                              ((int(milliseconds) % MINUTE) // SECOND, "%ds")]:
+
             if value > 0 or not_null:
                 duration += format % value
                 not_null = True
-        
-        duration += "%gms" % (milliseconds % SECOND)
+
+        duration += ("%f" % (milliseconds % SECOND)).rstrip("0").rstrip(".") + "ms"
         return duration
-    
+
     def OnOK(self, event):
+        self.OnCloseDialog()
+
+    def OnCloseDialog(self):
         errors = []
-        for control, name in [(self.Days, _("days")), (self.Hours, _("hours")), 
+        for control, name in [(self.Days, _("days")), (self.Hours, _("hours")),
                               (self.Minutes, _("minutes")), (self.Seconds, _("seconds")),
-                              (self.Milliseconds, _("milliseconds"))]:
+                              (self.Milliseconds, _("milliseconds")),
+                              (self.Microseconds, _("microseconds"))]:
             try:
-                value = float(control.GetValue())
-            except ValueError, e:
+                float(control.GetValue())
+            except ValueError:
                 errors.append(name)
         if len(errors) > 0:
             if len(errors) == 1:
                 message = _("Field %s hasn't a valid value!") % errors[0]
             else:
                 message = _("Fields %s haven't a valid value!") % ",".join(errors)
-            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
+            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
             dialog.ShowModal()
             dialog.Destroy()
         else:
--- a/dialogs/FBDBlockDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/FBDBlockDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,32 +23,35 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import re
 
 import wx
 
 from graphics.FBD_Objects import FBD_Block
 from controls.LibraryPanel import LibraryPanel
-from BlockPreviewDialog import BlockPreviewDialog
-
-#-------------------------------------------------------------------------------
+from dialogs.BlockPreviewDialog import BlockPreviewDialog
+
+# -------------------------------------------------------------------------------
 #                                    Helpers
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 def GetBlockTypeDefaultNameModel(blocktype):
     return re.compile("%s[0-9]+" % blocktype if blocktype is not None else ".*")
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                         Set Block Parameters Dialog
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a dialog for defining parameters of a FBD block graphic
-element
-"""
+# -------------------------------------------------------------------------------
+
 
 class FBDBlockDialog(BlockPreviewDialog):
-    
+    """
+    Class that implements a dialog for defining parameters of a FBD block graphic
+    element
+    """
+
     def __init__(self, parent, controller, tagname):
         """
         Constructor
@@ -56,82 +60,84 @@
         @param tagname: Tagname of project POU edited
         """
         BlockPreviewDialog.__init__(self, parent, controller, tagname,
-              size=wx.Size(600, 450), title=_('Block Properties'))
-        
+                                    title=_('Block Properties'))
+
         # Init common sizers
         self._init_sizers(2, 0, 1, 0, 3, 2)
-        
+
         # Create static box around library panel
         type_staticbox = wx.StaticBox(self, label=_('Type:'))
         left_staticboxsizer = wx.StaticBoxSizer(type_staticbox, wx.VERTICAL)
         self.LeftGridSizer.AddSizer(left_staticboxsizer, border=5, flag=wx.GROW)
-        
+
         # Create Library panel and add it to static box
         self.LibraryPanel = LibraryPanel(self)
+        self.LibraryPanel.SetInitialSize(wx.Size(-1, 400))
+
         # Set function to call when selection in Library panel changed
-        setattr(self.LibraryPanel, "_OnTreeItemSelected", 
-              self.OnLibraryTreeItemSelected)
-        left_staticboxsizer.AddWindow(self.LibraryPanel, 1, border=5, 
-              flag=wx.GROW|wx.TOP)
-        
+        setattr(self.LibraryPanel, "_OnTreeItemSelected",
+                self.OnLibraryTreeItemSelected)
+        left_staticboxsizer.AddWindow(self.LibraryPanel, 1, border=5,
+                                      flag=wx.GROW | wx.TOP)
+
         # Create sizer for other block parameters
         top_right_gridsizer = wx.FlexGridSizer(cols=2, hgap=0, rows=4, vgap=5)
         top_right_gridsizer.AddGrowableCol(1)
         self.RightGridSizer.AddSizer(top_right_gridsizer, flag=wx.GROW)
-        
+
         # Create label for block name
         name_label = wx.StaticText(self, label=_('Name:'))
-        top_right_gridsizer.AddWindow(name_label, 
-              flag=wx.ALIGN_CENTER_VERTICAL)
-        
+        top_right_gridsizer.AddWindow(name_label,
+                                      flag=wx.ALIGN_CENTER_VERTICAL)
+
         # Create text control for defining block name
         self.BlockName = wx.TextCtrl(self)
         self.Bind(wx.EVT_TEXT, self.OnNameChanged, self.BlockName)
         top_right_gridsizer.AddWindow(self.BlockName, flag=wx.GROW)
-        
+
         # Create label for extended block input number
         inputs_label = wx.StaticText(self, label=_('Inputs:'))
-        top_right_gridsizer.AddWindow(inputs_label, 
-              flag=wx.ALIGN_CENTER_VERTICAL)
-        
+        top_right_gridsizer.AddWindow(inputs_label,
+                                      flag=wx.ALIGN_CENTER_VERTICAL)
+
         # Create spin control for defining extended block input number
         self.Inputs = wx.SpinCtrl(self, min=2, max=20,
-              style=wx.SP_ARROW_KEYS)
+                                  style=wx.SP_ARROW_KEYS)
         self.Bind(wx.EVT_SPINCTRL, self.OnInputsChanged, self.Inputs)
         top_right_gridsizer.AddWindow(self.Inputs, flag=wx.GROW)
-        
+
         # Create label for block execution order
-        execution_order_label = wx.StaticText(self, 
-              label=_('Execution Order:'))
-        top_right_gridsizer.AddWindow(execution_order_label, 
-              flag=wx.ALIGN_CENTER_VERTICAL)
-        
+        execution_order_label = wx.StaticText(self,
+                                              label=_('Execution Order:'))
+        top_right_gridsizer.AddWindow(execution_order_label,
+                                      flag=wx.ALIGN_CENTER_VERTICAL)
+
         # Create spin control for defining block execution order
         self.ExecutionOrder = wx.SpinCtrl(self, min=0, style=wx.SP_ARROW_KEYS)
-        self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged, 
+        self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged,
                   self.ExecutionOrder)
         top_right_gridsizer.AddWindow(self.ExecutionOrder, flag=wx.GROW)
-                
+
         # Create label for block execution control
-        execution_control_label = wx.StaticText(self, 
-              label=_('Execution Control:'))
-        top_right_gridsizer.AddWindow(execution_control_label, 
-              flag=wx.ALIGN_CENTER_VERTICAL)
-        
+        execution_control_label = wx.StaticText(self,
+                                                label=_('Execution Control:'))
+        top_right_gridsizer.AddWindow(execution_control_label,
+                                      flag=wx.ALIGN_CENTER_VERTICAL)
+
         # Create check box to enable block execution control
         self.ExecutionControl = wx.CheckBox(self)
-        self.Bind(wx.EVT_CHECKBOX, self.OnExecutionOrderChanged, 
+        self.Bind(wx.EVT_CHECKBOX, self.OnExecutionOrderChanged,
                   self.ExecutionControl)
         top_right_gridsizer.AddWindow(self.ExecutionControl, flag=wx.GROW)
-        
+
         # Add preview panel and associated label to sizers
         self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
         self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW)
-        
+
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(self.ButtonSizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        self.MainSizer.AddSizer(self.ButtonSizer, border=20,
+                                flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
         # Dictionary containing correspondence between parameter exchanged and
         # control to fill with parameter value
         self.ParamsControl = {
@@ -139,19 +145,20 @@
             "executionOrder": self.ExecutionOrder,
             "executionControl": self.ExecutionControl
         }
-        
+
         # Init controls value and sensibility
         self.BlockName.SetValue("")
         self.BlockName.Enable(False)
         self.Inputs.Enable(False)
-        
+
         # Variable containing last name typed
         self.CurrentBlockName = None
-        
+
         # Refresh Library panel values
         self.LibraryPanel.SetBlockList(controller.GetBlockTypes(tagname))
+        self.Fit()
         self.LibraryPanel.SetFocus()
-    
+
     def SetValues(self, values):
         """
         Set default block parameters
@@ -159,38 +166,38 @@
         """
         # Extract block type defined in parameters
         blocktype = values.get("type", None)
-        
-        # Select block type in library panel    
+
+        # Select block type in library panel
         if blocktype is not None:
-            self.LibraryPanel.SelectTreeItem(blocktype, 
+            self.LibraryPanel.SelectTreeItem(blocktype,
                                              values.get("inputs", None))
-        
+
         # Define regular expression for determine if block name is block
         # default name
         default_name_model = GetBlockTypeDefaultNameModel(blocktype)
-        
+
         # For each parameters defined, set corresponding control value
         for name, value in values.items():
-            
+
             # Parameter is block name
             if name == "name":
                 if value != "":
                     # Set default graphic element name for testing
                     self.DefaultElementName = value
-                    
+
                     # Test if block name is type default block name and save
                     # block name if not (name have been typed by user)
                     if default_name_model.match(value) is None:
                         self.CurrentBlockName = value
-            
+
                 self.BlockName.ChangeValue(value)
-            
+
             # Set value of other controls
             else:
                 control = self.ParamsControl.get(name, None)
                 if control is not None:
                     control.SetValue(value)
-        
+
         # Refresh preview panel
         self.RefreshPreview()
 
@@ -207,7 +214,7 @@
             name: control.GetValue()
             for name, control in self.ParamsControl.iteritems()})
         return values
-    
+
     def OnOK(self, event):
         """
         Called when dialog OK button is pressed
@@ -215,31 +222,31 @@
         @param event: wx.Event from OK button
         """
         message = None
-        
+
         # Get block type selected
         selected = self.LibraryPanel.GetSelectedBlock()
-        
+
         # Get block type name and if block is a function block
         block_name = self.BlockName.GetValue()
         name_enabled = self.BlockName.IsEnabled()
-        
+
         # Test that a type has been selected for block
         if selected is None:
             message = _("Form isn't complete. Valid block type must be selected!")
-        
+
         # Test, if block is a function block, that a name have been defined
         elif name_enabled and block_name == "":
             message = _("Form isn't complete. Name must be filled!")
-        
+
         # Show error message if an error is detected
         if message is not None:
             self.ShowErrorMessage(message)
-        
+
         # Test block name validity if necessary
         elif not name_enabled or self.TestElementName(block_name):
             # Call BlockPreviewDialog function
             BlockPreviewDialog.OnOK(self, event)
-    
+
     def OnLibraryTreeItemSelected(self, event):
         """
         Called when block type selected in library panel
@@ -247,12 +254,12 @@
         """
         # Get type selected in library panel
         values = self.LibraryPanel.GetSelectedBlock()
-        
+
         # Get block type informations
-        blocktype = (self.Controller.GetBlockType(values["type"], 
+        blocktype = (self.Controller.GetBlockType(values["type"],
                                                   values["inputs"])
                      if values is not None else None)
-        
+
         # Set input number spin control according to block type informations
         if blocktype is not None:
             self.Inputs.SetValue(len(blocktype["inputs"]))
@@ -260,12 +267,12 @@
         else:
             self.Inputs.SetValue(2)
             self.Inputs.Enable(False)
-        
+
         # Update block name with default value if block type is a function and
         # current block name wasn't typed by user
         if blocktype is not None and blocktype["type"] != "function":
             self.BlockName.Enable(True)
-            
+
             if self.CurrentBlockName is None:
                 # Generate new block name according to block type, taking
                 # default element name if it was already a default name for this
@@ -273,21 +280,21 @@
                 default_name_model = GetBlockTypeDefaultNameModel(values["type"])
                 block_name = (
                     self.DefaultElementName
-                    if (self.DefaultElementName is not None and 
+                    if (self.DefaultElementName is not None and
                         default_name_model.match(self.DefaultElementName))
                     else self.Controller.GenerateNewName(
                         self.TagName, None, values["type"]+"%d", 0))
             else:
                 block_name = self.CurrentBlockName
-                
+
             self.BlockName.ChangeValue(block_name)
         else:
             self.BlockName.Enable(False)
             self.BlockName.ChangeValue("")
-        
+
         # Refresh preview panel
         self.RefreshPreview()
-    
+
     def OnNameChanged(self, event):
         """
         Called when block name value changed
@@ -298,7 +305,7 @@
             self.CurrentBlockName = self.BlockName.GetValue()
             self.RefreshPreview()
         event.Skip()
-    
+
     def OnInputsChanged(self, event):
         """
         Called when block inputs number changed
@@ -307,7 +314,7 @@
         if self.Inputs.IsEnabled():
             self.RefreshPreview()
         event.Skip()
-    
+
     def OnExecutionOrderChanged(self, event):
         """
         Called when block execution order value changed
@@ -315,7 +322,7 @@
         """
         self.RefreshPreview()
         event.Skip()
-    
+
     def OnExecutionControlChanged(self, event):
         """
         Called when block execution control value changed
@@ -323,7 +330,7 @@
         """
         self.RefreshPreview()
         event.Skip()
-    
+
     def RefreshPreview(self):
         """
         Refresh preview panel of graphic element
@@ -331,22 +338,21 @@
         """
         # Get type selected in library panel
         values = self.LibraryPanel.GetSelectedBlock()
-        
+
         # If a block type is selected in library panel
         if values is not None:
             # Set graphic element displayed, creating a FBD block element
-            self.Element = FBD_Block(self.Preview, values["type"], 
-                    (self.BlockName.GetValue()
-                     if self.BlockName.IsEnabled()
-                     else ""), 
-                    extension = self.Inputs.GetValue(), 
-                    inputs = values["inputs"], 
-                    executionControl = self.ExecutionControl.GetValue(), 
-                    executionOrder = self.ExecutionOrder.GetValue())
-        
+            self.Element = FBD_Block(
+                self.Preview, values["type"],
+                (self.BlockName.GetValue() if self.BlockName.IsEnabled() else ""),
+                extension=self.Inputs.GetValue(),
+                inputs=values["inputs"],
+                executionControl=self.ExecutionControl.GetValue(),
+                executionOrder=self.ExecutionOrder.GetValue())
+
         # Reset graphic element displayed
         else:
-            self.Element = None 
-        
+            self.Element = None
+
         # Call BlockPreviewDialog function
         BlockPreviewDialog.RefreshPreview(self)
--- a/dialogs/FBDVariableDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/FBDVariableDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,34 +23,28 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+from __future__ import absolute_import
 import wx
 
 from graphics.GraphicCommons import INPUT, INOUT, OUTPUT
 from graphics.FBD_Objects import FBD_Variable
-from BlockPreviewDialog import BlockPreviewDialog
-
-#-------------------------------------------------------------------------------
+from dialogs.BlockPreviewDialog import BlockPreviewDialog
+
+# -------------------------------------------------------------------------------
 #                                    Helpers
-#-------------------------------------------------------------------------------
-
-# Dictionaries containing correspondence between variable block class and string
-# to be shown in Class combo box in both sense
-VARIABLE_CLASSES_DICT = {INPUT : _("Input"),
-                         INOUT : _("InOut"),
-                         OUTPUT : _("Output")}
-VARIABLE_CLASSES_DICT_REVERSE = dict(
-    [(value, key) for key, value in VARIABLE_CLASSES_DICT.iteritems()])
-
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------------
 #                        Set Variable Parameters Dialog
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a dialog for defining parameters of a FBD variable graphic
-element
-"""
+# -------------------------------------------------------------------------------
+
 
 class FBDVariableDialog(BlockPreviewDialog):
+    """
+    Class that implements a dialog for defining parameters of a FBD variable graphic
+    element
+    """
 
     def __init__(self, parent, controller, tagname, exclude_input=False):
         """
@@ -60,70 +55,85 @@
         @param exclude_input: Exclude input from variable class selection
         """
         BlockPreviewDialog.__init__(self, parent, controller, tagname,
-              size=wx.Size(400, 380), title=_('Variable Properties'))
-        
+                                    title=_('Variable Properties'))
+
+        # Dictionaries containing correspondence between variable block class and string
+        # to be shown in Class combo box in both sense
+        self.VARIABLE_CLASSES_DICT = {
+            INPUT:  _("Input"),
+            INOUT:  _("InOut"),
+            OUTPUT: _("Output")
+        }
+
+        self.VARIABLE_CLASSES_DICT_REVERSE = dict(
+            [(value, key) for key, value in self.VARIABLE_CLASSES_DICT.iteritems()])
+
         # Init common sizers
         self._init_sizers(4, 2, 4, None, 3, 2)
-        
+
         # Create label for variable class
         class_label = wx.StaticText(self, label=_('Class:'))
         self.LeftGridSizer.AddWindow(class_label, flag=wx.GROW)
-        
+
         # Create a combo box for defining variable class
         self.Class = wx.ComboBox(self, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnClassChanged, self.Class)
         self.LeftGridSizer.AddWindow(self.Class, flag=wx.GROW)
-        
+
         # Create label for variable execution order
-        execution_order_label = wx.StaticText(self, 
-              label=_('Execution Order:'))
+        execution_order_label = wx.StaticText(self,
+                                              label=_('Execution Order:'))
         self.LeftGridSizer.AddWindow(execution_order_label, flag=wx.GROW)
-        
+
         # Create spin control for defining variable execution order
         self.ExecutionOrder = wx.SpinCtrl(self, min=0, style=wx.SP_ARROW_KEYS)
-        self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged, 
+        self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged,
                   self.ExecutionOrder)
         self.LeftGridSizer.AddWindow(self.ExecutionOrder, flag=wx.GROW)
-        
+
         # Create label for variable expression
         name_label = wx.StaticText(self, label=_('Expression:'))
-        self.RightGridSizer.AddWindow(name_label, border=5, 
-              flag=wx.GROW|wx.BOTTOM)
-        
+        self.RightGridSizer.AddWindow(name_label, border=5,
+                                      flag=wx.GROW | wx.BOTTOM)
+
         # Create text control for defining variable expression
         self.Expression = wx.TextCtrl(self)
         self.Bind(wx.EVT_TEXT, self.OnExpressionChanged, self.Expression)
         self.RightGridSizer.AddWindow(self.Expression, flag=wx.GROW)
-        
+
         # Create a list box to selected variable expression in the list of
         # variables defined in POU
-        self.VariableName = wx.ListBox(self, size=wx.Size(0, 120), 
-              style=wx.LB_SINGLE|wx.LB_SORT)
+        self.VariableName = wx.ListBox(self, size=wx.Size(-1, 120),
+                                       style=wx.LB_SINGLE | wx.LB_SORT)
         self.Bind(wx.EVT_LISTBOX, self.OnNameChanged, self.VariableName)
-        self.RightGridSizer.AddWindow(self.VariableName, flag=wx.GROW)
-        
+        self.RightGridSizer.AddWindow(self.VariableName, border=4, flag=wx.GROW | wx.TOP)
+
         # Add preview panel and associated label to sizers
         self.MainSizer.AddWindow(self.PreviewLabel, border=20,
-              flag=wx.GROW|wx.LEFT|wx.RIGHT)
+                                 flag=wx.GROW | wx.LEFT | wx.RIGHT)
         self.MainSizer.AddWindow(self.Preview, border=20,
-              flag=wx.GROW|wx.LEFT|wx.RIGHT)
-        
+                                 flag=wx.GROW | wx.LEFT | wx.RIGHT)
+
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(self.ButtonSizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        self.MainSizer.AddSizer(
+            self.ButtonSizer, border=20,
+            flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
         # Set options that can be selected in class combo box
-        for var_class, choice in VARIABLE_CLASSES_DICT.iteritems():
+        for var_class, choice in self.VARIABLE_CLASSES_DICT.iteritems():
             if not exclude_input or var_class != INPUT:
                 self.Class.Append(choice)
         self.Class.SetSelection(0)
-        
+
         # Extract list of variables defined in POU
         self.RefreshVariableList()
-        
+
         # Refresh values in name list box
         self.RefreshNameList()
-        
+
+        self.Preview.SetInitialSize(wx.Size(-1, 60))
+        self.Fit()
+
         # Class combo box is default control having keyboard focus
         self.Class.SetFocus()
 
@@ -132,45 +142,44 @@
         Called to refresh names in name list box
         """
         # Get variable class to select POU variable applicable
-        var_class = VARIABLE_CLASSES_DICT_REVERSE[
-                            self.Class.GetStringSelection()]
-        
+        var_class = self.VARIABLE_CLASSES_DICT_REVERSE[
+            self.Class.GetStringSelection()]
+
         # Refresh names in name list box by selecting variables in POU variables
         # list that can be applied to variable class
         self.VariableName.Clear()
-        for name, (var_type, value_type) in self.VariableList.iteritems():
+        for name, (var_type, _value_type) in self.VariableList.iteritems():
             if var_type != "Input" or var_class == INPUT:
                 self.VariableName.Append(name)
-        
+
         # Get variable expression and select corresponding value in name list
         # box if it exists
         selected = self.Expression.GetValue()
-        if (selected != "" and 
-            self.VariableName.FindString(selected) != wx.NOT_FOUND):
+        if selected != "" and self.VariableName.FindString(selected) != wx.NOT_FOUND:
             self.VariableName.SetStringSelection(selected)
         else:
             self.VariableName.SetSelection(wx.NOT_FOUND)
-        
+
         # Disable name list box if no name present inside
         self.VariableName.Enable(self.VariableName.GetCount() > 0)
-            
+
     def SetValues(self, values):
         """
         Set default variable parameters
         @param values: Variable parameters values
         """
-        
+
         # Get class parameter value
         var_class = values.get("class", None)
         if var_class is not None:
             # Set class selected in class combo box
-            self.Class.SetStringSelection(VARIABLE_CLASSES_DICT[var_class])
+            self.Class.SetStringSelection(self.VARIABLE_CLASSES_DICT[var_class])
             # Refresh names in name list box according to var class
             self.RefreshNameList()
-        
+
         # For each parameters defined, set corresponding control value
         for name, value in values.items():
-            
+
             # Parameter is variable expression
             if name == "expression":
                 # Set expression text control value
@@ -180,14 +189,15 @@
                     self.VariableName.SetStringSelection(value)
                 else:
                     self.VariableName.SetSelection(wx.NOT_FOUND)
-            
+
             # Parameter is variable execution order
             elif name == "executionOrder":
                 self.ExecutionOrder.SetValue(value)
-        
+
         # Refresh preview panel
         self.RefreshPreview()
-        
+        self.Fit()
+
     def GetValues(self):
         """
         Return block parameters defined in dialog
@@ -195,8 +205,8 @@
         """
         expression = self.Expression.GetValue()
         values = {
-            "class": VARIABLE_CLASSES_DICT_REVERSE[
-                        self.Class.GetStringSelection()],
+            "class": self.VARIABLE_CLASSES_DICT_REVERSE[
+                self.Class.GetStringSelection()],
             "expression": expression,
             "var_type": self.VariableList.get(expression, (None, None))[1],
             "executionOrder": self.ExecutionOrder.GetValue()}
@@ -210,16 +220,16 @@
         @param event: wx.Event from OK button
         """
         message = None
-        
+
         # Test that an expression have been selected or typed by user
         value = self.Expression.GetValue()
         if value == "":
             message = _("At least a variable or an expression must be selected!")
-        
+
         # Show error message if an error is detected
         if message is not None:
             self.ShowErrorMessage(message)
-        
+
         else:
             # Call BlockPreviewDialog function
             BlockPreviewDialog.OnOK(self, event)
@@ -231,7 +241,7 @@
         """
         # Refresh name list box values
         self.RefreshNameList()
-        
+
         self.RefreshPreview()
         event.Skip()
 
@@ -244,10 +254,10 @@
         # list box if value selected is valid
         if self.VariableName.GetSelection() != wx.NOT_FOUND:
             self.Expression.ChangeValue(self.VariableName.GetStringSelection())
-        
-        self.RefreshPreview()
-        event.Skip()
-    
+
+        self.RefreshPreview()
+        event.Skip()
+
     def OnExpressionChanged(self, event):
         """
         Called when expression text control is changed by user
@@ -256,10 +266,10 @@
         # Select the corresponding value in name list box if it exists
         self.VariableName.SetSelection(
             self.VariableName.FindString(self.Expression.GetValue()))
-        
-        self.RefreshPreview()
-        event.Skip()
-    
+
+        self.RefreshPreview()
+        event.Skip()
+
     def OnExecutionOrderChanged(self, event):
         """
         Called when block execution control value changed
@@ -267,7 +277,7 @@
         """
         self.RefreshPreview()
         event.Skip()
-    
+
     def RefreshPreview(self):
         """
         Refresh preview panel of graphic element
@@ -275,16 +285,14 @@
         """
         # Get expression value to put in FBD variable element
         name = self.Expression.GetValue()
-        
+
         # Set graphic element displayed, creating a FBD variable element
-        self.Element = FBD_Variable(self.Preview, 
-                    VARIABLE_CLASSES_DICT_REVERSE[
-                        self.Class.GetStringSelection()], 
-                    name, 
-                    self.VariableList.get(name, ("", ""))[1], 
-                    executionOrder = self.ExecutionOrder.GetValue())
-        
+        self.Element = FBD_Variable(
+            self.Preview,
+            self.VARIABLE_CLASSES_DICT_REVERSE[self.Class.GetStringSelection()],
+            name,
+            self.VariableList.get(name, ("", ""))[1],
+            executionOrder=self.ExecutionOrder.GetValue())
+
         # Call BlockPreviewDialog function
         BlockPreviewDialog.RefreshPreview(self)
-        
-        
--- a/dialogs/FindInPouDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/FindInPouDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,118 +23,124 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 from plcopen.plcopen import *
 
+
 class FindInPouDialog(wx.Dialog):
 
     def _init_icon(self, parent):
         if parent and parent.icon:
-                self.SetIcon(parent.icon)
+            self.SetIcon(parent.icon)
 
-    
     def __init__(self, parent):
-        wx.Dialog.__init__(self, parent, title=_("Find"),         
-              size=wx.Size(500, 280), style=wx.CAPTION|
-                                            wx.CLOSE_BOX|
-                                            wx.CLIP_CHILDREN|
-                                            wx.RESIZE_BORDER)
-        
+        wx.Dialog.__init__(
+            self, parent, title=_("Find"),
+            style=wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN | wx.RESIZE_BORDER)
+
         self._init_icon(parent)
         panel = wx.Panel(self, style=wx.TAB_TRAVERSAL)
-        
+
         main_sizer = wx.FlexGridSizer(cols=1, hgap=5, rows=2, vgap=5)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(0)
-        
+
         controls_sizer = wx.BoxSizer(wx.VERTICAL)
-        main_sizer.AddSizer(controls_sizer, border=20, 
-              flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
-        
+        main_sizer.AddSizer(controls_sizer, border=20,
+                            flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+
         patterns_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=5)
         patterns_sizer.AddGrowableCol(1)
-        controls_sizer.AddSizer(patterns_sizer, border=5, flag=wx.GROW|wx.BOTTOM)
-        
+        controls_sizer.AddSizer(patterns_sizer, border=5, flag=wx.GROW | wx.BOTTOM)
+
         find_label = wx.StaticText(panel, label=_("Find:"))
         patterns_sizer.AddWindow(find_label, flag=wx.ALIGN_CENTER_VERTICAL)
-        
+
         self.FindPattern = wx.TextCtrl(panel)
         self.Bind(wx.EVT_TEXT, self.OnFindPatternChanged, self.FindPattern)
         self.Bind(wx.EVT_CHAR_HOOK, self.OnEscapeKey)
         patterns_sizer.AddWindow(self.FindPattern, flag=wx.GROW)
-        
+
         params_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        controls_sizer.AddSizer(params_sizer, border=5, flag=wx.GROW|wx.BOTTOM)
-        
+        controls_sizer.AddSizer(params_sizer, border=5, flag=wx.GROW | wx.BOTTOM)
+
         direction_staticbox = wx.StaticBox(panel, label=_("Direction"))
         direction_staticboxsizer = wx.StaticBoxSizer(
-              direction_staticbox, wx.VERTICAL)
-        params_sizer.AddSizer(direction_staticboxsizer, 1, border=5, 
-              flag=wx.GROW|wx.RIGHT)
-        
-        self.Forward = wx.RadioButton(panel, label=_("Forward"), 
-              style=wx.RB_GROUP)
-        direction_staticboxsizer.AddWindow(self.Forward, border=5, 
-              flag=wx.ALL|wx.GROW)
-        
+            direction_staticbox, wx.VERTICAL)
+        params_sizer.AddSizer(direction_staticboxsizer, 1, border=5,
+                              flag=wx.GROW | wx.RIGHT)
+
+        self.Forward = wx.RadioButton(panel, label=_("Forward"),
+                                      style=wx.RB_GROUP)
+        direction_staticboxsizer.AddWindow(self.Forward, border=5,
+                                           flag=wx.ALL | wx.GROW)
+
         self.Backward = wx.RadioButton(panel, label=_("Backward"))
-        direction_staticboxsizer.AddWindow(self.Backward, border=5, 
-              flag=wx.ALL|wx.GROW)
-        
+        direction_staticboxsizer.AddWindow(self.Backward, border=5,
+                                           flag=wx.ALL | wx.GROW)
+
         options_staticbox = wx.StaticBox(panel, label=_("Options"))
         options_staticboxsizer = wx.StaticBoxSizer(
-              options_staticbox, wx.VERTICAL)
+            options_staticbox, wx.VERTICAL)
         params_sizer.AddSizer(options_staticboxsizer, 1, flag=wx.GROW)
-        
+
         self.CaseSensitive = wx.CheckBox(panel, label=_("Case sensitive"))
         self.CaseSensitive.SetValue(True)
-        options_staticboxsizer.AddWindow(self.CaseSensitive, border=5, 
-              flag=wx.ALL|wx.GROW)
-        
+        options_staticboxsizer.AddWindow(self.CaseSensitive, border=5,
+                                         flag=wx.ALL | wx.GROW)
+
         self.WrapSearch = wx.CheckBox(panel, label=_("Wrap search"))
         self.WrapSearch.SetValue(True)
-        options_staticboxsizer.AddWindow(self.WrapSearch, border=5, 
-              flag=wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.GROW)
-        
+        options_staticboxsizer.AddWindow(self.WrapSearch, border=5,
+                                         flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
+
         self.RegularExpressions = wx.CheckBox(panel, label=_("Regular expressions"))
-        options_staticboxsizer.AddWindow(self.RegularExpressions, border=5, 
-              flag=wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.GROW)
-        
+        options_staticboxsizer.AddWindow(self.RegularExpressions, border=5,
+                                         flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.GROW)
+
         buttons_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        main_sizer.AddSizer(buttons_sizer, border=20, 
-              flag=wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_RIGHT)
-        
+        main_sizer.AddSizer(buttons_sizer, border=20,
+                            flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_RIGHT)
+
         self.FindButton = wx.Button(panel, label=_("Find"))
         self.FindButton.SetDefault()
         self.Bind(wx.EVT_BUTTON, self.OnFindButton, self.FindButton)
         buttons_sizer.AddWindow(self.FindButton, border=5, flag=wx.RIGHT)
-        
+
         self.CloseButton = wx.Button(panel, label=_("Close"))
         self.Bind(wx.EVT_BUTTON, self.OnCloseButton, self.CloseButton)
         buttons_sizer.AddWindow(self.CloseButton)
 
-        self.StatusLabel = wx.StaticText(panel, label= "")
+        # set the longest message here, to use it length to calculate
+        # optimal size of dialog window
+        self.RegExpSyntaxErrMsg = _("Syntax error in regular expression of pattern to search!")
+        self.StatusLabel = wx.StaticText(panel, label=self.RegExpSyntaxErrMsg)
         controls_sizer.AddWindow(self.StatusLabel, flag=wx.ALIGN_CENTER_VERTICAL)
-        
+
         panel.SetSizer(main_sizer)
         main_sizer.Fit(self)
-        
+
+        # clear message after dialog size calculation
+        self.SetStatusText("")
+
         self.ParentWindow = parent
-        
+
         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
         self.infosPrev = {}
         self.criteria = {}
         self.FindPattern.SetFocus()
         self.RefreshButtonsState()
-    
+
     def RefreshButtonsState(self):
         find_pattern = self.FindPattern.GetValue()
         self.FindButton.Enable(find_pattern != "")
-    
+
     def OnCloseFrame(self, event):
         self.Hide()
         event.Veto()
-        
+
     def OnCloseButton(self, event):
         self.Hide()
         event.Skip()
@@ -152,7 +159,7 @@
     def SetStatusText(self, msg):
         self.StatusLabel.SetLabel(msg)
         self.Layout()
-        
+
     def OnFindButton(self, event):
         infos = {
             "find_pattern": self.FindPattern.GetValue(),
@@ -167,12 +174,12 @@
             try:
                 self.criteria = infos
                 CompilePattern(self.criteria)
-            except:
+            except Exception:
                 self.criteria.clear()
-                message = _("Syntax error in regular expression of pattern to search!")
+                message = self.RegExpSyntaxErrMsg
             self.SetStatusText(message)
         if len(self.criteria) > 0:
             wx.CallAfter(self.ParentWindow.FindInPou,
-                {True: 1, False:-1}[self.Forward.GetValue()],
-                self.criteria)
+                         {True: 1, False: -1}[self.Forward.GetValue()],
+                         self.criteria)
         event.Skip()
--- a/dialogs/ForceVariableDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/ForceVariableDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -21,31 +21,37 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import re
 import datetime
+from builtins import str as text
 
 import wx
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                                Helpers
-#-------------------------------------------------------------------------------
-
-LOCATIONDATATYPES = {"X" : ["BOOL"],
-                     "B" : ["SINT", "USINT", "BYTE", "STRING"],
-                     "W" : ["INT", "UINT", "WORD", "WSTRING"],
-                     "D" : ["DINT", "UDINT", "REAL", "DWORD"],
-                     "L" : ["LINT", "ULINT", "LREAL", "LWORD"]} 
+# -------------------------------------------------------------------------------
+
+LOCATIONDATATYPES = {"X": ["BOOL"],
+                     "B": ["SINT", "USINT", "BYTE", "STRING"],
+                     "W": ["INT", "UINT", "WORD", "WSTRING"],
+                     "D": ["DINT", "UDINT", "REAL", "DWORD"],
+                     "L": ["LINT", "ULINT", "LREAL", "LWORD"]}
+
 
 def gen_get_function(f):
     def get_function(v):
         try:
             return f(v)
-        except:
+        except Exception:
             return None
     return get_function
 
+
 def gen_get_string(delimiter):
     STRING_MODEL = re.compile("%(delimiter)s([^%(delimiter)s]*)%(delimiter)s$" % {"delimiter": delimiter})
+
     def get_string(v):
         result = STRING_MODEL.match(v)
         if result is not None:
@@ -53,6 +59,7 @@
         return None
     return get_string
 
+
 getinteger = gen_get_function(int)
 getfloat = gen_get_function(float)
 getstring = gen_get_string("'")
@@ -63,12 +70,13 @@
 HOUR = 60 * MINUTE
 DAY = 24 * HOUR
 
-IEC_TIME_MODEL = re.compile("(?:(?:T|TIME)#)?(-)?(?:(%(float)s)D_?)?(?:(%(float)s)H_?)?(?:(%(float)s)M(?!S)_?)?(?:(%(float)s)S_?)?(?:(%(float)s)MS)?$" % {"float": "[0-9]+(?:\.[0-9]+)?"})
-IEC_DATE_MODEL = re.compile("(?:(?:D|DATE)#)?([0-9]{4})-([0-9]{2})-([0-9]{2})$")
-IEC_DATETIME_MODEL = re.compile("(?:(?:DT|DATE_AND_TIME)#)?([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]+)?)$")
-IEC_TIMEOFDAY_MODEL = re.compile("(?:(?:TOD|TIME_OF_DAY)#)?([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]+)?)$")
-
-def gettime(v):    
+IEC_TIME_MODEL = re.compile(r"(?:(?:T|TIME)#)?(-)?(?:(%(float)s)D_?)?(?:(%(float)s)H_?)?(?:(%(float)s)M(?!S)_?)?(?:(%(float)s)S_?)?(?:(%(float)s)MS)?$" % {"float": r"[0-9]+(?:\.[0-9]+)?"})
+IEC_DATE_MODEL = re.compile(r"(?:(?:D|DATE)#)?([0-9]{4})-([0-9]{2})-([0-9]{2})$")
+IEC_DATETIME_MODEL = re.compile(r"(?:(?:DT|DATE_AND_TIME)#)?([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]+)?)$")
+IEC_TIMEOFDAY_MODEL = re.compile(r"(?:(?:TOD|TIME_OF_DAY)#)?([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]+)?)$")
+
+
+def gettime(v):
     result = IEC_TIME_MODEL.match(v.upper())
     if result is not None:
         negative, days, hours, minutes, seconds, milliseconds = result.groups()
@@ -87,9 +95,10 @@
         if negative is not None:
             microseconds = -microseconds
         return datetime.timedelta(microseconds=microseconds)
-    
-    else: 
-        return None
+
+    else:
+        return None
+
 
 def getdate(v):
     result = IEC_DATE_MODEL.match(v.upper())
@@ -97,12 +106,13 @@
         year, month, day = result.groups()
         try:
             date = datetime.datetime(int(year), int(month), int(day))
-        except ValueError, e:
+        except ValueError:
             return None
         base_date = datetime.datetime(1970, 1, 1)
         return date - base_date
-    else: 
-        return None
+    else:
+        return None
+
 
 def getdatetime(v):
     result = IEC_DATETIME_MODEL.match(v.upper())
@@ -110,12 +120,13 @@
         year, month, day, hours, minutes, seconds = result.groups()
         try:
             date = datetime.datetime(int(year), int(month), int(day), int(hours), int(minutes), int(float(seconds)), int((float(seconds) * SECOND) % SECOND))
-        except ValueError, e:
+        except ValueError:
             return None
         base_date = datetime.datetime(1970, 1, 1)
         return date - base_date
-    else: 
-        return None
+    else:
+        return None
+
 
 def gettimeofday(v):
     result = IEC_TIMEOFDAY_MODEL.match(v.upper())
@@ -130,6 +141,7 @@
     else:
         return None
 
+
 GetTypeValue = {"BOOL": lambda x: {"TRUE": True, "FALSE": False, "0": False, "1": True}.get(x.upper(), None),
                 "SINT": getinteger,
                 "INT": getinteger,
@@ -152,31 +164,54 @@
                 "DT": getdatetime,
                 "TOD": gettimeofday}
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                            Force Variable Dialog
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 class ForceVariableDialog(wx.TextEntryDialog):
 
     def __init__(self, parent, iec_type, defaultValue=""):
-        wx.TextEntryDialog.__init__(self, parent, message = _("Forcing Variable Value"), 
-                caption = _("Please enter value for a \"%s\" variable:") % iec_type, defaultValue = defaultValue, 
-                style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition)
-        
-        self.IEC_Type = iec_type 
-        
-        self.Bind(wx.EVT_BUTTON, self.OnOK, 
-              self.GetSizer().GetItem(2).GetSizer().GetItem(1).GetSizer().GetAffirmativeButton())
-        
+        wx.TextEntryDialog.__init__(
+            self, parent,
+            message=_("Forcing Variable Value"),
+            caption=_("Please enter value for a \"%s\" variable:") % iec_type,
+            defaultValue=defaultValue,
+            style=wx.OK | wx.CANCEL | wx.CENTRE, pos=wx.DefaultPosition)
+
+        self.IEC_Type = iec_type
+
+        self.Bind(wx.EVT_BUTTON, self.OnOK,
+                  self.GetSizer().GetItem(2).GetSizer().GetItem(1).
+                  GetSizer().GetAffirmativeButton())
+        self.ValueTextCtrl = self.GetSizer().GetItem(1).GetWindow()
+        if self.IEC_Type == "BOOL":
+            self.ToggleButton = wx.ToggleButton(self, label=_("Toggle value"))
+            value = GetTypeValue[self.IEC_Type](defaultValue)
+            if value is not None:
+                self.ToggleButton.SetValue(value)
+
+            border = self.GetSizer().GetItem(1).GetBorder()
+            self.GetSizer().Insert(before=2, item=self.ToggleButton,
+                                   border=border,
+                                   flag=wx.LEFT | wx.RIGHT | wx.EXPAND)
+            self.Bind(wx.EVT_TOGGLEBUTTON, self.ToggleBoolValue, self.ToggleButton)
+
+        self.Fit()
+
+    def ToggleBoolValue(self, event):
+        value = self.ToggleButton.GetValue()
+        self.ValueTextCtrl.SetValue(text(value))
+
     def OnOK(self, event):
         message = None
-        value = self.GetSizer().GetItem(1).GetWindow().GetValue()
+        value = self.ValueTextCtrl.GetValue()
         if value == "":
             message = _("You must type a value!")
         elif GetTypeValue[self.IEC_Type](value) is None:
-            message = _("Invalid value \"{a1}\" for \"{a2}\" variable!").format(a1 = value, a2 = self.IEC_Type)
+            message = _("Invalid value \"{a1}\" for \"{a2}\" variable!").format(a1=value, a2=self.IEC_Type)
         if message is not None:
-            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
+            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
             dialog.ShowModal()
             dialog.Destroy()
         else:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/IDManager.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,27 @@
+from __future__ import absolute_import
+
+import wx
+from connectors import ConnectorSchemes, EditorClassFromScheme
+from controls.DiscoveryPanel import DiscoveryPanel
+from controls.IDBrowser import IDBrowser
+
+class IDManager(wx.Dialog):
+    def __init__(self, parent, ctr):
+        self.ctr = ctr
+        wx.Dialog.__init__(self,
+                           name='IDManager', parent=parent,
+                           title=_('URI Editor'),
+                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER,
+                           size=(800,600))
+        # start IDBrowser in manager mode
+        self.browser = IDBrowser(self, ctr)
+        self.Bind(wx.EVT_CHAR_HOOK, self.OnEscapeKey)
+
+    def OnEscapeKey(self, event):
+        keycode = event.GetKeyCode()
+        if keycode == wx.WXK_ESCAPE:
+            self.EndModal(wx.ID_CANCEL)
+        else:
+            event.Skip()
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/IDMergeDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+import wx
+
+# class RichMessageDialog is still not available in wxPython 3.0.2 
+class IDMergeDialog(wx.Dialog):
+    def __init__(self, parent, title, question, optiontext, button_texts):
+        wx.Dialog.__init__(self, parent, title=title)
+
+        main_sizer = wx.BoxSizer(wx.VERTICAL)
+
+        message = wx.StaticText(self, label=question)
+        main_sizer.AddWindow(message, border=20,
+                             flag = wx.ALIGN_CENTER_HORIZONTAL | wx.TOP | wx.LEFT | wx.RIGHT)
+
+        self.check = wx.CheckBox(self, label=optiontext)
+        main_sizer.AddWindow(self.check, border=20,
+                             flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL)
+
+        buttons_sizer = wx.BoxSizer(wx.HORIZONTAL)
+        for label,wxID in zip(button_texts, [wx.ID_YES, wx.ID_NO, wx.ID_CANCEL]):
+            Button = wx.Button(self, label=label)
+            def OnButtonFactory(_wxID):
+                return lambda event: self.EndModal(_wxID)
+            self.Bind(wx.EVT_BUTTON, OnButtonFactory(wxID), Button)
+            buttons_sizer.AddWindow(Button)
+
+        main_sizer.AddSizer(buttons_sizer, border=20,
+                            flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.ALIGN_RIGHT)
+
+        self.SetSizer(main_sizer)
+        self.Fit()
+
+        self.Bind(wx.EVT_CHAR_HOOK, self.OnEscapeKey)
+
+    def OnEscapeKey(self, event):
+        keycode = event.GetKeyCode()
+        if keycode == wx.WXK_ESCAPE:
+            self.EndModal(wx.ID_CANCEL)
+        else:
+            event.Skip()
+
+    def OptionChecked(self):
+        return self.check.GetValue()
--- a/dialogs/LDElementDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/LDElementDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,25 +23,27 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from graphics.GraphicCommons import CONTACT_NORMAL, CONTACT_REVERSE, \
     CONTACT_RISING, CONTACT_FALLING, COIL_NORMAL, COIL_REVERSE, COIL_SET, \
     COIL_RESET, COIL_RISING, COIL_FALLING
 from graphics.LD_Objects import LD_Contact, LD_Coil
-from BlockPreviewDialog import BlockPreviewDialog
-
-#-------------------------------------------------------------------------------
+from dialogs.BlockPreviewDialog import BlockPreviewDialog
+
+# -------------------------------------------------------------------------------
 #                       Set Ladder Element Parmeters Dialog
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a dialog for defining parameters of a LD contact or coil
-graphic element
-"""
+# -------------------------------------------------------------------------------
+
 
 class LDElementDialog(BlockPreviewDialog):
-    
+    """
+    Class that implements a dialog for defining parameters of a LD contact or coil
+    graphic element
+    """
+
     def __init__(self, parent, controller, tagname, type):
         """
         Constructor
@@ -49,78 +52,81 @@
         @param tagname: Tagname of project POU edited
         @param type: Type of LD element ('contact or 'coil')
         """
-        BlockPreviewDialog.__init__(self, parent, controller, tagname, 
-              size=wx.Size(350, 320 if type == "contact" else 380),
-              title=(_("Edit Contact Values")
-                     if type == "contact"
-                     else _("Edit Coil Values")))
-        
+        BlockPreviewDialog.__init__(self, parent, controller, tagname,
+                                    title=(_("Edit Contact Values")
+                                           if type == "contact"
+                                           else _("Edit Coil Values")))
+
         # Init common sizers
-        self._init_sizers(2, 0, 
-              (7 if type == "contact" else 9), None, 2, 1)
-        
+        self._init_sizers(2, 0, (7 if type == "contact" else 9),
+                          None, 2, 1)
+
         # Create label for LD element modifier
         modifier_label = wx.StaticText(self, label=_('Modifier:'))
-        self.LeftGridSizer.AddWindow(modifier_label, border=5, 
-              flag=wx.GROW|wx.BOTTOM)
-        
+        self.LeftGridSizer.AddWindow(modifier_label, border=5,
+                                     flag=wx.GROW | wx.BOTTOM)
+
         # Create radio buttons for selecting LD element modifier
         self.ModifierRadioButtons = {}
         first = True
-        element_modifiers = ([CONTACT_NORMAL, CONTACT_REVERSE, 
+        element_modifiers = ([CONTACT_NORMAL, CONTACT_REVERSE,
                               CONTACT_RISING, CONTACT_FALLING]
                              if type == "contact"
                              else [COIL_NORMAL, COIL_REVERSE, COIL_SET,
                                    COIL_RESET, COIL_RISING, COIL_FALLING])
-        modifiers_label = [_("Normal"), _("Negated")] + \
-                          ([_("Set"), _("Reset")] if type == "coil" else []) + \
-                          [_("Rising Edge"), _("Falling Edge")]
-        
+        modifiers_label = \
+            [_("Normal"), _("Negated")] + \
+            ([_("Set"), _("Reset")] if type == "coil" else []) + \
+            [_("Rising Edge"), _("Falling Edge")]
+
         for modifier, label in zip(element_modifiers, modifiers_label):
-            radio_button = wx.RadioButton(self, label=label, 
-                  style=(wx.RB_GROUP if first else 0))
+            radio_button = wx.RadioButton(self, label=label,
+                                          style=(wx.RB_GROUP if first else 0))
             radio_button.SetValue(first)
             self.Bind(wx.EVT_RADIOBUTTON, self.OnModifierChanged, radio_button)
             self.LeftGridSizer.AddWindow(radio_button, flag=wx.GROW)
             self.ModifierRadioButtons[modifier] = radio_button
             first = False
-        
+
         # Create label for LD element variable
         element_variable_label = wx.StaticText(self, label=_('Variable:'))
         self.LeftGridSizer.AddWindow(element_variable_label, border=5,
-              flag=wx.GROW|wx.TOP)
-        
+                                     flag=wx.GROW | wx.TOP)
+
         # Create a combo box for defining LD element variable
         self.ElementVariable = wx.ComboBox(self, style=wx.CB_SORT)
-        self.Bind(wx.EVT_COMBOBOX, self.OnVariableChanged, 
+        self.Bind(wx.EVT_COMBOBOX, self.OnVariableChanged,
+                  self.ElementVariable)
+        self.Bind(wx.EVT_TEXT, self.OnVariableChanged,
                   self.ElementVariable)
         self.LeftGridSizer.AddWindow(self.ElementVariable, border=5,
-             flag=wx.GROW|wx.TOP)
-        
+                                     flag=wx.GROW | wx.TOP)
+
         # Add preview panel and associated label to sizers
         self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
         self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW)
-        
+
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(self.ButtonSizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        self.MainSizer.AddSizer(self.ButtonSizer, border=20,
+                                flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
         # Save LD element class
         self.ElementClass = (LD_Contact if type == "contact" else LD_Coil)
-        
+
         # Extract list of variables defined in POU
         self.RefreshVariableList()
-        
+
         # Set values in ElementVariable
         for name, (var_type, value_type) in self.VariableList.iteritems():
             # Only select BOOL variable and avoid input for coil
             if (type == "contact" or var_type != "Input") and \
                value_type == "BOOL":
                 self.ElementVariable.Append(name)
-        
+
+        self.Fit()
         # Normal radio button is default control having keyboard focus
         self.ModifierRadioButtons[element_modifiers[0]].SetFocus()
-    
+
     def GetElementModifier(self):
         """
         Return modifier selected for LD element
@@ -140,15 +146,15 @@
         """
         # For each parameters defined, set corresponding control value
         for name, value in values.items():
-            
+
             # Parameter is LD element variable
             if name == "variable":
                 self.ElementVariable.SetValue(value)
-            
+
             # Set value of other controls
             elif name == "modifier":
                 self.ModifierRadioButtons[value].SetValue(True)
-        
+
         # Refresh preview panel
         self.RefreshPreview()
 
@@ -184,11 +190,20 @@
         Refresh preview panel of graphic element
         Override BlockPreviewDialog function
         """
+        value = self.ElementVariable.GetValue()
+
         # Set graphic element displayed, creating a LD element
         self.Element = self.ElementClass(
-                self.Preview, 
-                self.GetElementModifier(),
-                self.ElementVariable.GetValue())
-        
+            self.Preview,
+            self.GetElementModifier(),
+            value)
+
+        button = self.ButtonSizer.GetAffirmativeButton()
+        button.Enable(value != "")
+
         # Call BlockPreviewDialog function
         BlockPreviewDialog.RefreshPreview(self)
+
+    def OnOK(self, event):
+        if self.ElementVariable.GetValue() != "":
+            self.EndModal(wx.ID_OK)
--- a/dialogs/LDPowerRailDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/LDPowerRailDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,23 +23,24 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
-from graphics.GraphicCommons import LEFTRAIL, RIGHTRAIL, LD_LINE_SIZE
+from graphics.GraphicCommons import LEFTRAIL, RIGHTRAIL
 from graphics.LD_Objects import LD_PowerRail
-from BlockPreviewDialog import BlockPreviewDialog
+from dialogs.BlockPreviewDialog import BlockPreviewDialog
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                    Set Ladder Power Rail Parameters Dialog
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
-"""
-Class that implements a dialog for defining parameters of a power rail graphic
-element
-"""
 
 class LDPowerRailDialog(BlockPreviewDialog):
-    
+    """
+    Class that implements a dialog for defining parameters of a power rail graphic
+    element
+    """
     def __init__(self, parent, controller, tagname):
         """
         Constructor
@@ -47,50 +49,52 @@
         @param tagname: Tagname of project POU edited
         """
         BlockPreviewDialog.__init__(self, parent, controller, tagname,
-              size=wx.Size(350, 260), title=_('Power Rail Properties'))
-        
+                                    title=_('Power Rail Properties'))
+
         # Init common sizers
         self._init_sizers(2, 0, 5, None, 2, 1)
-        
+
         # Create label for connection type
         type_label = wx.StaticText(self, label=_('Type:'))
         self.LeftGridSizer.AddWindow(type_label, flag=wx.GROW)
-        
+
         # Create radio buttons for selecting power rail type
         self.TypeRadioButtons = {}
         first = True
         for type, label in [(LEFTRAIL, _('Left PowerRail')),
                             (RIGHTRAIL, _('Right PowerRail'))]:
-            radio_button = wx.RadioButton(self, label=label, 
-                  style=(wx.RB_GROUP if first else 0))
+            radio_button = wx.RadioButton(self, label=label,
+                                          style=(wx.RB_GROUP if first else 0))
             radio_button.SetValue(first)
             self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, radio_button)
             self.LeftGridSizer.AddWindow(radio_button, flag=wx.GROW)
             self.TypeRadioButtons[type] = radio_button
             first = False
-        
+
         # Create label for power rail pin number
         pin_number_label = wx.StaticText(self, label=_('Pin number:'))
         self.LeftGridSizer.AddWindow(pin_number_label, flag=wx.GROW)
-        
+
         # Create spin control for defining power rail pin number
         self.PinNumber = wx.SpinCtrl(self, min=1, max=50,
-              style=wx.SP_ARROW_KEYS)
+                                     style=wx.SP_ARROW_KEYS)
         self.PinNumber.SetValue(1)
         self.Bind(wx.EVT_SPINCTRL, self.OnPinNumberChanged, self.PinNumber)
         self.LeftGridSizer.AddWindow(self.PinNumber, flag=wx.GROW)
-        
+
         # Add preview panel and associated label to sizers
         self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
         self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW)
-        
+
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(self.ButtonSizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        self.MainSizer.AddSizer(
+            self.ButtonSizer, border=20,
+            flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+        self.Fit()
+
         # Left Power Rail radio button is default control having keyboard focus
         self.TypeRadioButtons[LEFTRAIL].SetFocus()
-    
+
     def GetMinElementSize(self):
         """
         Get minimal graphic element size
@@ -98,7 +102,7 @@
         element defined
         """
         return self.Element.GetMinSize(True)
-    
+
     def GetPowerRailType(self):
         """
         Return type selected for power rail
@@ -107,7 +111,7 @@
         return (LEFTRAIL
                 if self.TypeRadioButtons[LEFTRAIL].GetValue()
                 else RIGHTRAIL)
-    
+
     def SetValues(self, values):
         """
         Set default power rail parameters
@@ -115,11 +119,11 @@
         """
         # For each parameters defined, set corresponding control value
         for name, value in values.items():
-            
+
             # Parameter is power rail type
             if name == "type":
                 self.TypeRadioButtons[value].SetValue(True)
-            
+
             # Parameter is power rail pin number
             elif name == "pin_number":
                 self.PinNumber.SetValue(value)
@@ -156,11 +160,11 @@
         Refresh preview panel of graphic element
         Override BlockPreviewDialog function
         """
-        
+
         # Set graphic element displayed, creating a power rail element
-        self.Element = LD_PowerRail(self.Preview, 
-                self.GetPowerRailType(), 
-                connectors = self.PinNumber.GetValue())
-        
+        self.Element = LD_PowerRail(self.Preview,
+                                    self.GetPowerRailType(),
+                                    connectors=self.PinNumber.GetValue())
+
         # Call BlockPreviewDialog function
         BlockPreviewDialog.RefreshPreview(self)
--- a/dialogs/PouActionDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/PouActionDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2012: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,58 +23,65 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from plcopen.structures import TestIdentifier, IEC_KEYWORDS
+from util.TranslationCatalogs import NoTranslate
+
 
 def GetActionLanguages():
-    _ = lambda x : x
+    _ = NoTranslate
     return [_("IL"), _("ST"), _("LD"), _("FBD")]
-ACTION_LANGUAGES_DICT = dict([(_(language), language) for language in GetActionLanguages()])
+
 
 class PouActionDialog(wx.Dialog):
-    
+
     def __init__(self, parent):
-        wx.Dialog.__init__(self, parent, size=wx.Size(320, 200), 
-              title=_('Create a new action'))
-        
+        wx.Dialog.__init__(self, parent, title=_('Create a new action'))
+
+        self.ACTION_LANGUAGES_DICT = dict([(_(language), language)
+                                           for language in GetActionLanguages()])
+
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(0)
-        
+
         infos_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=3, vgap=15)
         infos_sizer.AddGrowableCol(1)
-        main_sizer.AddSizer(infos_sizer, border=20, 
-              flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
-        
+        main_sizer.AddSizer(infos_sizer, border=20,
+                            flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+
         actionname_label = wx.StaticText(self, label=_('Action Name:'))
-        infos_sizer.AddWindow(actionname_label, border=4, 
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
-        
-        self.ActionName = wx.TextCtrl(self)
+        infos_sizer.AddWindow(actionname_label, border=4,
+                              flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
+
+        self.ActionName = wx.TextCtrl(self, size=wx.Size(180, -1))
         infos_sizer.AddWindow(self.ActionName, flag=wx.GROW)
-        
+
         language_label = wx.StaticText(self, label=_('Language:'))
-        infos_sizer.AddWindow(language_label, border=4, 
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
-        
+        infos_sizer.AddWindow(language_label, border=4,
+                              flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
+
         self.Language = wx.ComboBox(self, style=wx.CB_READONLY)
         infos_sizer.AddWindow(self.Language, flag=wx.GROW)
-        
-        button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
-        self.Bind(wx.EVT_BUTTON, self.OnOK, 
-              button_sizer.GetAffirmativeButton())
-        main_sizer.AddSizer(button_sizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-            
+
+        button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
+        self.Bind(wx.EVT_BUTTON, self.OnOK,
+                  button_sizer.GetAffirmativeButton())
+        main_sizer.AddSizer(button_sizer, border=20,
+                            flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
         self.SetSizer(main_sizer)
-        
+
         for option in GetActionLanguages():
             self.Language.Append(_(option))
-        
+
+        self.Fit()
         self.PouNames = []
         self.PouElementNames = []
-    
+
     def OnOK(self, event):
         error = []
         action_name = self.ActionName.GetValue()
@@ -88,9 +96,9 @@
                 if i == 0:
                     text += item
                 elif i == len(error) - 1:
-                    text += _(" and %s")%item
+                    text += _(" and %s") % item
                 else:
-                    text += _(", %s")%item 
+                    text += _(", %s") % item
             message = _("Form isn't complete. %s must be filled!") % text
         elif not TestIdentifier(action_name):
             message = _("\"%s\" is not a valid identifier!") % action_name
@@ -101,28 +109,27 @@
         elif action_name.upper() in self.PouElementNames:
             message = _("\"%s\" element for this pou already exists!") % action_name
         if message is not None:
-            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
+            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
             dialog.ShowModal()
             dialog.Destroy()
         else:
             self.EndModal(wx.ID_OK)
-    
+
     def SetPouNames(self, pou_names):
         self.PouNames = [pou_name.upper() for pou_name in pou_names]
-        
+
     def SetPouElementNames(self, element_names):
         self.PouElementNames = [element_name.upper() for element_name in element_names]
-        
+
     def SetValues(self, values):
         for item, value in values.items():
             if item == "actionName":
                 self.ActionName.SetValue(value)
             elif item == "language":
                 self.Language.SetStringSelection(_(value))
-                
+
     def GetValues(self):
         values = {}
         values["actionName"] = self.ActionName.GetValue()
-        values["language"] = ACTION_LANGUAGES_DICT[self.Language.GetStringSelection()]
+        values["language"] = self.ACTION_LANGUAGES_DICT[self.Language.GetStringSelection()]
         return values
-
--- a/dialogs/PouDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/PouDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2012: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,29 +23,34 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from plcopen.structures import TestIdentifier, IEC_KEYWORDS
-
-def GetPouTypes():
-    _ = lambda x : x
-    return [_("function"), _("functionBlock"), _("program")]
-POU_TYPES_DICT = dict([(_(pou_type), pou_type) for pou_type in GetPouTypes()])
-
-def GetPouLanguages():
-    _ = lambda x : x
-    return [_("IL"), _("ST"), _("LD"), _("FBD"), _("SFC")]
+from util.TranslationCatalogs import NoTranslate
+
 
 class PouDialog(wx.Dialog):
-
-    POU_LANGUAGES = GetPouLanguages()
-    POU_LANGUAGES_DICT = dict([(_(language), language) for language in POU_LANGUAGES])
-
-    def __init__(self, parent, pou_type = None):
+    """
+    Dialog to create new POU.
+    It allows selection of POU type, name and
+    used IEC 61131-3 programming language
+    """
+
+    POU_TYPES = None
+    POU_TYPES_DICT = None
+    POU_LANGUAGES = None
+    POU_LANGUAGES_DICT = None
+
+    def __init__(self, parent, pou_type=None, type_readonly=False):
         wx.Dialog.__init__(self, id=-1, parent=parent,
-              name='PouDialog', title=_('Create a new POU'),
-              size=wx.Size(300, 200), style=wx.DEFAULT_DIALOG_STYLE)
-        self.SetClientSize(wx.Size(300, 200))
+                           name='PouDialog', title=_('Create a new POU'),
+                           style=wx.DEFAULT_DIALOG_STYLE)
+
+        if PouDialog.POU_TYPES_DICT is None:
+            self.InitPouTypesDict()
+            self.InitPouLanguagesDict()
 
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
         main_sizer.AddGrowableCol(0)
@@ -53,18 +59,18 @@
         infos_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=3, vgap=15)
         infos_sizer.AddGrowableCol(1)
         main_sizer.AddSizer(infos_sizer, border=20,
-              flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
+                            flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         pouname_label = wx.StaticText(self, label=_('POU Name:'))
         infos_sizer.AddWindow(pouname_label, border=4,
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
+                              flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
 
         self.PouName = wx.TextCtrl(self)
         infos_sizer.AddWindow(self.PouName, flag=wx.GROW)
 
         poutype_label = wx.StaticText(self, label=_('POU Type:'))
         infos_sizer.AddWindow(poutype_label, border=4,
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
+                              flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
 
         self.PouType = wx.ComboBox(self, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnTypeChanged, self.PouType)
@@ -72,27 +78,65 @@
 
         language_label = wx.StaticText(self, label=_('Language:'))
         infos_sizer.AddWindow(language_label, border=4,
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
+                              flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
 
         self.Language = wx.ComboBox(self, style=wx.CB_READONLY)
         infos_sizer.AddWindow(self.Language, flag=wx.GROW)
 
-        button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+        button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
         self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
         main_sizer.AddSizer(button_sizer, border=20,
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
+                            flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         self.SetSizer(main_sizer)
 
-        for option in GetPouTypes():
-            self.PouType.Append(_(option))
+        for option in self.POU_TYPES:
+            if not type_readonly or _(option) == _(pou_type):
+                self.PouType.Append(_(option))
         if pou_type is not None:
             self.PouType.SetStringSelection(_(pou_type))
         self.RefreshLanguage()
-
+        self.Fit()
         self.PouNames = []
         self.PouElementNames = []
 
+    def InitPouTypes(self):
+        """
+        Initialize POU_TYPES class list.
+        This list contains not translated POU types used in PLCopen XML.
+        _() are necessary so mk18n.py could find these string for localization.
+        """
+        _ = NoTranslate
+        self.__class__.POU_TYPES = [_("function"), _("functionBlock"), _("program")]
+
+    def InitPouTypesDict(self):
+        """
+        Initialize POU_TYPES_DICT class dictionary and POU_TYPE list
+        Dictionary contains localized POU types and they are shown in UI.
+        """
+        self.InitPouTypes()
+        self.__class__.POU_TYPES_DICT = dict([(_(pou_type), pou_type)
+                                              for pou_type in self.POU_TYPES])
+
+    def InitPouLanguages(self):
+        """
+        Initialize POU_LANGUAGES class list.
+        This list contains not translated programming languages used in PLCopen XML.
+        _() are necessary so mk18n.py could find these string for localization.
+        """
+        _ = NoTranslate
+        self.__class__.POU_LANGUAGES = [_("IL"), _("ST"), _("LD"), _("FBD"), _("SFC")]
+
+    def InitPouLanguagesDict(self):
+        """
+        Initialize POU_LANGUAGES_DICT class dictionary and POU_LANGUAGES list
+        Dictionary contains localized names for programming languages
+        as they are shown in UI.
+        """
+        self.InitPouLanguages()
+        self.__class__.POU_LANGUAGES_DICT = dict([(_(language), language)
+                                                  for language in self.POU_LANGUAGES])
+
     def OnOK(self, event):
         error = []
         pou_name = self.PouName.GetValue()
@@ -110,9 +154,9 @@
                 if i == 0:
                     text += item
                 elif i == len(error) - 1:
-                    text += _(" and %s")%item
+                    text += _(" and %s") % item
                 else:
-                    text += _(", %s")%item
+                    text += _(", %s") % item
             message = _("Form isn't complete. %s must be filled!") % text
         elif not TestIdentifier(pou_name):
             message = _("\"%s\" is not a valid identifier!") % pou_name
@@ -125,13 +169,13 @@
             question = True
         if message is not None:
             if question:
-                dialog = wx.MessageDialog(self, message, _("Warning"), wx.YES_NO|wx.ICON_EXCLAMATION)
+                dialog = wx.MessageDialog(self, message, _("Warning"), wx.YES_NO | wx.ICON_EXCLAMATION)
                 result = dialog.ShowModal()
                 dialog.Destroy()
                 if result == wx.ID_YES:
                     self.EndModal(wx.ID_OK)
             else:
-                dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
+                dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
                 dialog.ShowModal()
                 dialog.Destroy()
         else:
@@ -141,7 +185,7 @@
         selection = self.POU_LANGUAGES_DICT.get(self.Language.GetStringSelection(), "")
         self.Language.Clear()
         for language in self.POU_LANGUAGES:
-            if language != "SFC" or POU_TYPES_DICT[self.PouType.GetStringSelection()] != "function":
+            if language != "SFC" or self.POU_TYPES_DICT[self.PouType.GetStringSelection()] != "function":
                 self.Language.Append(_(language))
         if self.Language.FindString(_(selection)) != wx.NOT_FOUND:
             self.Language.SetStringSelection(_(selection))
@@ -168,6 +212,6 @@
     def GetValues(self):
         values = {}
         values["pouName"] = self.PouName.GetValue()
-        values["pouType"] = POU_TYPES_DICT[self.PouType.GetStringSelection()]
+        values["pouType"] = self.POU_TYPES_DICT[self.PouType.GetStringSelection()]
         values["language"] = self.POU_LANGUAGES_DICT[self.Language.GetStringSelection()]
         return values
--- a/dialogs/PouNameDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/PouNameDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,23 +22,27 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
+from plcopen.structures import TestIdentifier, IEC_KEYWORDS
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                                POU Name Dialog
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 class PouNameDialog(wx.TextEntryDialog):
 
-    def __init__(self, parent, message, caption = "Please enter text", defaultValue = "", 
-                       style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
+    def __init__(self, parent, message, caption=_("Please enter text"), defaultValue="",
+                 style=wx.OK | wx.CANCEL | wx.CENTRE, pos=wx.DefaultPosition):
         wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
-        
+
         self.PouNames = []
-        
-        self.Bind(wx.EVT_BUTTON, self.OnOK, 
-              self.GetSizer().GetItem(2).GetSizer().GetItem(1).GetSizer().GetAffirmativeButton())
-        
+
+        self.Bind(wx.EVT_BUTTON, self.OnOK,
+                  self.GetSizer().GetItem(2).GetSizer().GetItem(1).GetSizer().GetAffirmativeButton())
+
     def OnOK(self, event):
         message = None
         step_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
@@ -51,7 +55,7 @@
         elif step_name.upper() in self.PouNames:
             message = _("A POU named \"%s\" already exists!") % step_name
         if message is not None:
-            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
+            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
             dialog.ShowModal()
             dialog.Destroy()
         else:
@@ -60,4 +64,3 @@
 
     def SetPouNames(self, pou_names):
         self.PouNames = [pou_name.upper() for pou_name in pou_names]
-
--- a/dialogs/PouTransitionDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/PouTransitionDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2012: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,66 +23,66 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from plcopen.structures import TestIdentifier, IEC_KEYWORDS
+from util.TranslationCatalogs import NoTranslate
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                                POU Transition Dialog
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 def GetTransitionLanguages():
-    _ = lambda x : x
-    #
-    # IL language is temporary disabled because
-    # matiec freezes if transition is written in IL
-    #
-    # return [_("IL"), _("ST"), _("LD"), _("FBD")]
-    return [ _("ST"), _("LD"), _("FBD")]
-TRANSITION_LANGUAGES_DICT = dict([(_(language), language) for language in GetTransitionLanguages()])
+    _ = NoTranslate
+    return [_("IL"), _("ST"), _("LD"), _("FBD")]
+
 
 class PouTransitionDialog(wx.Dialog):
-    
     def __init__(self, parent):
-        wx.Dialog.__init__(self, parent, size=wx.Size(350, 200),
-              title=_('Create a new transition'))
-        
+        wx.Dialog.__init__(self, parent, title=_('Create a new transition'))
+
+        self.TRANSITION_LANGUAGES_DICT = dict([(_(language), language)
+                                               for language in GetTransitionLanguages()])
+
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(0)
-        
-        infos_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=3, vgap=15)
+
+        infos_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=3, vgap=10)
         infos_sizer.AddGrowableCol(1)
-        main_sizer.AddSizer(infos_sizer, border=20, 
-              flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
-        
+        main_sizer.AddSizer(infos_sizer, border=20,
+                            flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+
         transitionname_label = wx.StaticText(self, label=_('Transition Name:'))
-        infos_sizer.AddWindow(transitionname_label, border=4, 
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
+        infos_sizer.AddWindow(transitionname_label, border=4,
+                              flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
 
-        self.TransitionName = wx.TextCtrl(self)
+        self.TransitionName = wx.TextCtrl(self, size=wx.Size(180, -1))
         infos_sizer.AddWindow(self.TransitionName, flag=wx.GROW)
 
         language_label = wx.StaticText(self, label=_('Language:'))
-        infos_sizer.AddWindow(language_label, border=4, 
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
-        
+        infos_sizer.AddWindow(language_label, border=4,
+                              flag=wx.ALIGN_CENTER_VERTICAL | wx.TOP)
+
         self.Language = wx.ComboBox(self, style=wx.CB_READONLY)
         infos_sizer.AddWindow(self.Language, flag=wx.GROW)
-        
-        button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
+
+        button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
         self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
-        main_sizer.AddSizer(button_sizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        main_sizer.AddSizer(button_sizer, border=20, flag=wx.ALIGN_RIGHT | wx.BOTTOM)
+
         self.SetSizer(main_sizer)
-        
+
         for language in GetTransitionLanguages():
             self.Language.Append(_(language))
-            
+
+        self.Fit()
         self.PouNames = []
         self.PouElementNames = []
-        
+
     def OnOK(self, event):
         error = []
         transition_name = self.TransitionName.GetValue()
@@ -96,9 +97,9 @@
                 if i == 0:
                     text += item
                 elif i == len(error) - 1:
-                    text += _(" and %s")%item
+                    text += _(" and %s") % item
                 else:
-                    text += _(", %s")%item 
+                    text += _(", %s") % item
             message = _("Form isn't complete. %s must be filled!") % text
         elif not TestIdentifier(transition_name):
             message = _("\"%s\" is not a valid identifier!") % transition_name
@@ -109,27 +110,27 @@
         elif transition_name.upper() in self.PouElementNames:
             message = _("\"%s\" element for this pou already exists!") % transition_name
         if message is not None:
-            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
+            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
             dialog.ShowModal()
             dialog.Destroy()
         else:
             self.EndModal(wx.ID_OK)
-    
+
     def SetPouNames(self, pou_names):
         self.PouNames = [pou_name.upper() for pou_name in pou_names]
-    
+
     def SetPouElementNames(self, pou_names):
         self.PouElementNames = [pou_name.upper() for pou_name in pou_names]
-    
+
     def SetValues(self, values):
         for item, value in values.items():
             if item == "transitionName":
                 self.TransitionName.SetValue(value)
             elif item == "language":
                 self.Language.SetSelection(_(value))
-                
+
     def GetValues(self):
         values = {}
         values["transitionName"] = self.TransitionName.GetValue()
-        values["language"] = TRANSITION_LANGUAGES_DICT[self.Language.GetStringSelection()]
+        values["language"] = self.TRANSITION_LANGUAGES_DICT[self.Language.GetStringSelection()]
         return values
--- a/dialogs/ProjectDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/ProjectDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2012: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,32 +23,37 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from controls.ProjectPropertiesPanel import ProjectPropertiesPanel
 
+
 class ProjectDialog(wx.Dialog):
-    
+
     def __init__(self, parent, enable_required=True):
-        wx.Dialog.__init__(self, parent, title=_('Project properties'), 
-              size=wx.Size(500, 350), style=wx.DEFAULT_DIALOG_STYLE)
-        
+        wx.Dialog.__init__(self, parent, title=_('Project properties'),
+                           style=wx.DEFAULT_DIALOG_STYLE)
+
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(0)
-        
-        self.ProjectProperties = ProjectPropertiesPanel(self, 
-              enable_required=enable_required)
+
+        self.ProjectProperties = ProjectPropertiesPanel(
+            self, enable_required=enable_required, scrolling=False)
         main_sizer.AddWindow(self.ProjectProperties, flag=wx.GROW)
-        
-        self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
-        self.Bind(wx.EVT_BUTTON, self.OnOK, 
+
+        self.ButtonSizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
+        self.Bind(wx.EVT_BUTTON, self.OnOK,
                   self.ButtonSizer.GetAffirmativeButton())
-        main_sizer.AddSizer(self.ButtonSizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        main_sizer.AddSizer(self.ButtonSizer, border=20,
+                            flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
         self.SetSizer(main_sizer)
-        
+        self.ProjectProperties.Fit()
+        self.Fit()
+
     def OnOK(self, event):
         values = self.ProjectProperties.GetValues()
         error = []
@@ -63,12 +69,13 @@
                 if i == 0:
                     text += item
                 elif i == len(error) - 1:
-                    text += _(" and %s")%item
+                    text += _(" and %s") % item
                 else:
-                    text += ", %s"%item
-            dialog = wx.MessageDialog(self, 
-                _("Form isn't complete. %s must be filled!") % text, 
-                _("Error"), wx.OK|wx.ICON_ERROR)
+                    text += ", %s" % item
+            dialog = wx.MessageDialog(
+                self,
+                _("Form isn't complete. %s must be filled!") % text,
+                _("Error"), wx.OK | wx.ICON_ERROR)
             dialog.ShowModal()
             dialog.Destroy()
         else:
@@ -76,6 +83,6 @@
 
     def SetValues(self, values):
         self.ProjectProperties.SetValues(values)
-        
+
     def GetValues(self):
         return self.ProjectProperties.GetValues()
--- a/dialogs/SFCDivergenceDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/SFCDivergenceDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,25 +23,26 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+from __future__ import absolute_import
 import wx
 
 from graphics.GraphicCommons import SELECTION_DIVERGENCE, \
     SELECTION_CONVERGENCE, SIMULTANEOUS_DIVERGENCE, SIMULTANEOUS_CONVERGENCE
 from graphics.SFC_Objects import SFC_Divergence
-from BlockPreviewDialog import BlockPreviewDialog
+from dialogs.BlockPreviewDialog import BlockPreviewDialog
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                         Create New Divergence Dialog
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
-"""
-Class that implements a dialog for defining parameters for creating a new
-divergence graphic element
-"""
 
 class SFCDivergenceDialog(BlockPreviewDialog):
-    
-    def __init__(self, parent, controller, tagname, poss_div_types = None):
+    """
+    Class that implements a dialog for defining parameters for creating a new
+    divergence graphic element
+    """
+
+    def __init__(self, parent, controller, tagname, poss_div_types=None):
         """
         Constructor
         @param parent: Parent wx.Window of dialog for modal
@@ -48,17 +50,16 @@
         @param tagname: Tagname of project POU edited
         @param poss_div_types: Types of divergence that will be available in the dialog window
         """
-        BlockPreviewDialog.__init__(self, parent, controller, tagname, 
-              size=wx.Size(500, 300), 
-              title=_('Create a new divergence or convergence'))
-        
+        BlockPreviewDialog.__init__(self, parent, controller, tagname,
+                                    title=_('Create a new divergence or convergence'))
+
         # Init common sizers
         self._init_sizers(2, 0, 7, None, 2, 1)
-        
+
         # Create label for divergence type
         type_label = wx.StaticText(self, label=_('Type:'))
         self.LeftGridSizer.AddWindow(type_label, flag=wx.GROW)
-        
+
         # Create radio buttons for selecting divergence type
         divergence_buttons = [
             (SELECTION_DIVERGENCE, _('Selection Divergence')),
@@ -67,45 +68,49 @@
             (SIMULTANEOUS_CONVERGENCE, _('Simultaneous Convergence'))]
         poss_div_btns = []
         if poss_div_types is not None:
-             for val in poss_div_types:
-                 poss_div_btns.append(divergence_buttons[val])
+            for val in poss_div_types:
+                poss_div_btns.append(divergence_buttons[val])
         else:
             poss_div_btns = divergence_buttons
         self.TypeRadioButtons = {}
         first = True
         focusbtn = None
         for type, label in poss_div_btns:
-            radio_button = wx.RadioButton(self, label=label, 
-                  style=(wx.RB_GROUP if first else 0))
+            radio_button = wx.RadioButton(self, label=label,
+                                          style=(wx.RB_GROUP if first else 0))
             radio_button.SetValue(first)
             self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, radio_button)
             self.LeftGridSizer.AddWindow(radio_button, flag=wx.GROW)
             self.TypeRadioButtons[type] = radio_button
-            if first: focusbtn = type
+            if first:
+                focusbtn = type
             first = False
 
         # Create label for number of divergence sequences
-        sequences_label = wx.StaticText(self, 
-              label=_('Number of sequences:'))
+        sequences_label = wx.StaticText(self,
+                                        label=_('Number of sequences:'))
         self.LeftGridSizer.AddWindow(sequences_label, flag=wx.GROW)
-        
+
         # Create spin control for defining number of divergence sequences
         self.Sequences = wx.SpinCtrl(self, min=2, max=20, initial=2)
         self.Bind(wx.EVT_SPINCTRL, self.OnSequencesChanged, self.Sequences)
         self.LeftGridSizer.AddWindow(self.Sequences, flag=wx.GROW)
-        
+
         # Add preview panel and associated label to sizers
         self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
         self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW)
-        
+
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(self.ButtonSizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        self.MainSizer.AddSizer(
+            self.ButtonSizer, border=20,
+            flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
+        self.Fit()
+
         # Selection divergence radio button is default control having keyboard
         # focus
         self.TypeRadioButtons[focusbtn].SetFocus()
-    
+
     def GetMinElementSize(self):
         """
         Get minimal graphic element size
@@ -113,7 +118,7 @@
         element defined
         """
         return self.Element.GetMinSize(True)
-    
+
     def GetDivergenceType(self):
         """
         Return type selected for SFC divergence
@@ -125,7 +130,7 @@
             if control.GetValue():
                 return type
         return None
-    
+
     def GetValues(self):
         """
         Set default SFC divergence parameters
@@ -149,17 +154,16 @@
         """
         self.RefreshPreview()
         event.Skip()
-        
+
     def RefreshPreview(self):
         """
         Refresh preview panel of graphic element
         Override BlockPreviewDialog function
         """
         # Set graphic element displayed, creating a SFC divergence
-        self.Element = SFC_Divergence(self.Preview, 
-                                      self.GetDivergenceType(), 
+        self.Element = SFC_Divergence(self.Preview,
+                                      self.GetDivergenceType(),
                                       self.Sequences.GetValue())
-        
+
         # Call BlockPreviewDialog function
         BlockPreviewDialog.RefreshPreview(self)
-        
--- a/dialogs/SFCStepDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/SFCStepDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,22 +23,24 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from graphics.SFC_Objects import SFC_Step
-from BlockPreviewDialog import BlockPreviewDialog
+from dialogs.BlockPreviewDialog import BlockPreviewDialog
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                         Set SFC Step Parameters Dialog
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
-"""
-Class that implements a dialog for defining parameters of a SFC step graphic
-element
-"""
 
 class SFCStepDialog(BlockPreviewDialog):
-    
+    """
+    Class that implements a dialog for defining parameters of a SFC step graphic
+    element
+    """
+
     def __init__(self, parent, controller, tagname, initial=False):
         """
         Constructor
@@ -46,25 +49,25 @@
         @param tagname: Tagname of project POU edited
         @param initial: True if step is initial (default: False)
         """
-        BlockPreviewDialog.__init__(self,parent, controller, tagname,  
-              size=wx.Size(400, 280), title=_('Edit Step'))
-        
+        BlockPreviewDialog.__init__(self, parent, controller, tagname,
+                                    title=_('Edit Step'))
+
         # Init common sizers
         self._init_sizers(2, 0, 6, None, 2, 1)
-        
+
         # Create label for SFC step name
         name_label = wx.StaticText(self, label=_('Name:'))
         self.LeftGridSizer.AddWindow(name_label, flag=wx.GROW)
-        
+
         # Create text control for defining SFC step name
         self.StepName = wx.TextCtrl(self)
         self.Bind(wx.EVT_TEXT, self.OnNameChanged, self.StepName)
         self.LeftGridSizer.AddWindow(self.StepName, flag=wx.GROW)
-        
+
         # Create label for SFC step connectors
         connectors_label = wx.StaticText(self, label=_('Connectors:'))
         self.LeftGridSizer.AddWindow(connectors_label, flag=wx.GROW)
-        
+
         # Create check boxes for defining connectors available on SFC step
         self.ConnectorsCheckBox = {}
         for name, label in [("input", _("Input")),
@@ -76,25 +79,28 @@
             self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, check_box)
             self.LeftGridSizer.AddWindow(check_box, flag=wx.GROW)
             self.ConnectorsCheckBox[name] = check_box
-        
+
         # Add preview panel and associated label to sizers
         self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
         self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW)
-        
+
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(self.ButtonSizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        self.MainSizer.AddSizer(
+            self.ButtonSizer, border=20,
+            flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
         # Save flag that indicates that step is initial
         self.Initial = initial
-        
+
         # Set default name for step
         self.StepName.ChangeValue(controller.GenerateNewName(
-               tagname, None, "Step%d", 0))
-        
+            tagname, None, "Step%d", 0))
+
+        self.Fit()
+
         # Step name text control is default control having keyboard focus
         self.StepName.SetFocus()
-    
+
     def SetValues(self, values):
         """
         Set default block parameters
@@ -102,20 +108,20 @@
         """
         # For each parameters defined, set corresponding control value
         for name, value in values.items():
-            
+
             # Parameter is step name
             if name == "name":
                 self.StepName.ChangeValue(value)
-        
+
             # Set value of other controls
             else:
                 control = self.ConnectorsCheckBox.get(name, None)
                 if control is not None:
                     control.SetValue(value)
-        
+
         # Refresh preview panel
         self.RefreshPreview()
-        
+
     def GetValues(self):
         """
         Return step parameters defined in dialog
@@ -127,7 +133,7 @@
             for name, control in self.ConnectorsCheckBox.iteritems()})
         values["width"], values["height"] = self.Element.GetSize()
         return values
-    
+
     def OnOK(self, event):
         """
         Called when dialog OK button is pressed
@@ -135,23 +141,23 @@
         @param event: wx.Event from OK button
         """
         message = None
-        
+
         # Get step name typed by user
         step_name = self.StepName.GetValue()
-        
+
         # Test that a name have been defined
         if step_name == "":
             message = _("Form isn't complete. Name must be filled!")
-        
+
         # If an error have been identify, show error message dialog
         if message is not None:
             self.ShowErrorMessage(message)
-        
+
         # Test step name validity
         elif self.TestElementName(step_name):
             # Call BlockPreviewDialog function
             BlockPreviewDialog.OnOK(self, event)
-    
+
     def OnConnectorsChanged(self, event):
         """
         Called when a step connector value changed
@@ -167,23 +173,23 @@
         """
         self.RefreshPreview()
         event.Skip()
-    
+
     def RefreshPreview(self):
         """
         Refresh preview panel of graphic element
         Override BlockPreviewDialog function
         """
         # Set graphic element displayed, creating a SFC step element
-        self.Element = SFC_Step(self.Preview, 
-                                self.StepName.GetValue(), 
+        self.Element = SFC_Step(self.Preview,
+                                self.StepName.GetValue(),
                                 self.Initial)
-        
+
         # Update connectors of SFC step element according to check boxes value
         for name, control in self.ConnectorsCheckBox.iteritems():
             if control.IsChecked():
                 getattr(self.Element, "Add" + name.capitalize())()
             else:
                 getattr(self.Element, "Remove" + name.capitalize())()
-        
+
         # Call BlockPreviewDialog function
         BlockPreviewDialog.RefreshPreview(self)
--- a/dialogs/SFCStepNameDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/SFCStepNameDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,25 +22,29 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
+from plcopen.structures import TestIdentifier, IEC_KEYWORDS
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                          Edit Step Name Dialog
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 class SFCStepNameDialog(wx.TextEntryDialog):
 
-    def __init__(self, parent, message, caption = "Please enter text", defaultValue = "", 
-                       style = wx.OK|wx.CANCEL|wx.CENTRE, pos = wx.DefaultPosition):
+    def __init__(self, parent, message, caption=_("Please enter text"), defaultValue="",
+                 style=wx.OK | wx.CANCEL | wx.CENTRE, pos=wx.DefaultPosition):
         wx.TextEntryDialog.__init__(self, parent, message, caption, defaultValue, style, pos)
-        
+
         self.PouNames = []
         self.Variables = []
         self.StepNames = []
-        
-        self.Bind(wx.EVT_BUTTON, self.OnOK, 
-              self.GetSizer().GetItem(2).GetSizer().GetItem(1).GetSizer().GetAffirmativeButton())
-        
+
+        self.Bind(wx.EVT_BUTTON, self.OnOK,
+                  self.GetSizer().GetItem(2).GetSizer().GetItem(1).GetSizer().GetAffirmativeButton())
+
     def OnOK(self, event):
         message = None
         step_name = self.GetSizer().GetItem(1).GetWindow().GetValue()
@@ -57,7 +61,7 @@
         elif step_name.upper() in self.StepNames:
             message = _("\"%s\" step already exists!") % step_name
         if message is not None:
-            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
+            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
             dialog.ShowModal()
             dialog.Destroy()
         else:
--- a/dialogs/SFCTransitionDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/SFCTransitionDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,22 +23,23 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+from __future__ import absolute_import
 import wx
 
 from graphics.SFC_Objects import SFC_Transition
-from BlockPreviewDialog import BlockPreviewDialog
-
-#-------------------------------------------------------------------------------
+from dialogs.BlockPreviewDialog import BlockPreviewDialog
+
+# -------------------------------------------------------------------------------
 #                        Set Transition Parameters Dialog
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a dialog for defining parameters of a transition graphic
-element
-"""
+# -------------------------------------------------------------------------------
+
 
 class SFCTransitionDialog(BlockPreviewDialog):
-    
+    """
+    Class that implements a dialog for defining parameters of a transition graphic
+    element
+    """
+
     def __init__(self, parent, controller, tagname, connection=True):
         """
         Constructor
@@ -48,34 +50,34 @@
         connection (default: True)
         """
         BlockPreviewDialog.__init__(self, parent, controller, tagname,
-              size=wx.Size(350, 350), title=_('Edit transition'))
-        
+                                    title=_('Edit transition'))
+
         # Init common sizers
         self._init_sizers(2, 0, 8, None, 2, 1)
-        
+
         # Create label for transition type
         type_label = wx.StaticText(self, label=_('Type:'))
         self.LeftGridSizer.AddWindow(type_label, flag=wx.GROW)
-        
+
         # Create combo box for selecting reference value
         reference = wx.ComboBox(self, style=wx.CB_READONLY)
         reference.Append("")
         for transition in controller.GetEditedElementTransitions(tagname):
             reference.Append(transition)
         self.Bind(wx.EVT_COMBOBOX, self.OnReferenceChanged, reference)
-        
+
         # Create Text control for defining inline value
         inline = wx.TextCtrl(self)
         self.Bind(wx.EVT_TEXT, self.OnInlineChanged, inline)
-        
+
         # Create radio buttons for selecting power rail type
         self.TypeRadioButtons = {}
         first = True
         for type, label, control in [('reference', _('Reference'), reference),
                                      ('inline', _('Inline'), inline),
                                      ('connection', _('Connection'), None)]:
-            radio_button = wx.RadioButton(self, label=label, 
-                  style=(wx.RB_GROUP if first else 0))
+            radio_button = wx.RadioButton(self, label=label,
+                                          style=(wx.RB_GROUP if first else 0))
             radio_button.SetValue(first)
             self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, radio_button)
             self.LeftGridSizer.AddWindow(radio_button, flag=wx.GROW)
@@ -84,27 +86,30 @@
                 self.LeftGridSizer.AddWindow(control, flag=wx.GROW)
             self.TypeRadioButtons[type] = (radio_button, control)
             first = False
-        
+
         # Create label for transition priority
         priority_label = wx.StaticText(self, label=_('Priority:'))
         self.LeftGridSizer.AddWindow(priority_label, flag=wx.GROW)
-        
+
         # Create spin control for defining priority value
         self.Priority = wx.SpinCtrl(self, min=0, style=wx.SP_ARROW_KEYS)
         self.Bind(wx.EVT_TEXT, self.OnPriorityChanged, self.Priority)
         self.LeftGridSizer.AddWindow(self.Priority, flag=wx.GROW)
-        
+
         # Add preview panel and associated label to sizers
         self.RightGridSizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
         self.RightGridSizer.AddWindow(self.Preview, flag=wx.GROW)
-        
+
         # Add buttons sizer to sizers
-        self.MainSizer.AddSizer(self.ButtonSizer, border=20, 
-              flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
-        
+        self.MainSizer.AddSizer(
+            self.ButtonSizer, border=20,
+            flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
+        self.Fit()
+
         # Reference radio button is default control having keyboard focus
         self.TypeRadioButtons["reference"][0].SetFocus()
-    
+
     def GetTransitionType(self):
         """
         Return type selected for SFC transition and associated value
@@ -121,7 +126,7 @@
                 else:
                     return type, None
         return None, None
-    
+
     def SetValues(self, values):
         """
         Set default SFC transition parameters
@@ -129,14 +134,14 @@
         """
         # Extract transition value according to type
         type_value = values.get("value", None)
-        
+
         # For each parameters defined, set corresponding control value
         for name, value in values.items():
-            
+
             # Parameter is SFC transition priority
             if name == "priority":
                 self.Priority.SetValue(values["priority"])
-            
+
             # Parameter is SFC transition type
             elif name == "type":
                 for type, (radio, control) in self.TypeRadioButtons.iteritems():
@@ -149,20 +154,20 @@
                                 control.SetStringSelection(type_value)
                             elif isinstance(control, wx.TextCtrl):
                                 control.ChangeValue(type_value)
-        
+
         # Refresh preview panel
         self.RefreshPreview()
-        
+
     def GetValues(self):
         """
         Return SFC transition parameters defined in dialog
         @return: {parameter_name: parameter_value,...}
         """
-        values = {"priority" : self.Priority.GetValue()}
+        values = {"priority": self.Priority.GetValue()}
         values["type"], values["value"] = self.GetTransitionType()
         values["width"], values["height"] = self.Element.GetSize()
         return values
-    
+
     def OnOK(self, event):
         """
         Called when dialog OK button is pressed
@@ -170,18 +175,18 @@
         @param event: wx.Event from OK button
         """
         message = None
-        
+
         # Get transition type and value associated
         type, value = self.GetTransitionType()
-        
+
         # Test that value associated to type is defined
         if type != "connection" and value == "":
             message = _("Form isn't complete. %s must be filled!") % type
-        
+
         # Show error message if an error is detected
         if message is not None:
             self.ShowErrorMessage(message)
-        
+
         else:
             # Call BlockPreviewDialog function
             BlockPreviewDialog.OnOK(self, event)
@@ -192,10 +197,10 @@
         @param event: wx.RadioButtonEvent
         """
         # Refresh sensibility of control associated to transition types
-        for type, (radio, control) in self.TypeRadioButtons.iteritems():
+        for _type, (radio, control) in self.TypeRadioButtons.iteritems():
             if control is not None:
                 control.Enable(radio.GetValue())
-        
+
         # Refresh preview panel
         self.RefreshPreview()
         event.Skip()
@@ -233,6 +238,6 @@
         self.Element = SFC_Transition(self.Preview)
         self.Element.SetType(*self.GetTransitionType())
         self.Element.SetPriority(self.Priority.GetValue())
-        
+
         # Call BlockPreviewDialog function
         BlockPreviewDialog.RefreshPreview(self)
--- a/dialogs/SearchInProjectDialog.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/SearchInProjectDialog.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,76 +23,77 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import re
+
+from __future__ import absolute_import
+import wx
 from plcopen.plcopen import *
-import wx
+from util.TranslationCatalogs import NoTranslate
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                          Search In Project Dialog
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 def GetElementsChoices():
-    _ = lambda x: x
-    return [("datatype", _("Data Type")), 
-            ("function", _("Function")), 
-            ("functionBlock", _("Function Block")), 
-            ("program", _("Program")), 
+    _ = NoTranslate
+    return [("datatype", _("Data Type")),
+            ("function", _("Function")),
+            ("functionBlock", _("Function Block")),
+            ("program", _("Program")),
             ("configuration", _("Configuration"))]
 
+
 class SearchInProjectDialog(wx.Dialog):
-    
+
     def __init__(self, parent):
-        wx.Dialog.__init__(self, parent, title=_('Search in Project'), 
-              size=wx.Size(600, 350))
-        
+        wx.Dialog.__init__(self, parent, title=_('Search in Project'))
+
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=10)
         main_sizer.AddGrowableCol(0)
         main_sizer.AddGrowableRow(1)
-        
+
         pattern_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=5)
         pattern_sizer.AddGrowableCol(0)
-        main_sizer.AddSizer(pattern_sizer, border=20, 
-              flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
-        
+        main_sizer.AddSizer(pattern_sizer, border=20,
+                            flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+
         pattern_label = wx.StaticText(self, label=_('Pattern to search:'))
         pattern_sizer.AddWindow(pattern_label, flag=wx.ALIGN_BOTTOM)
-        
+
         self.CaseSensitive = wx.CheckBox(self, label=_('Case sensitive'))
         pattern_sizer.AddWindow(self.CaseSensitive, flag=wx.GROW)
-        
-        self.Pattern = wx.TextCtrl(self)
+
+        self.Pattern = wx.TextCtrl(self, size=wx.Size(250, -1))
         self.Bind(wx.EVT_TEXT, self.FindPatternChanged, self.Pattern)
         pattern_sizer.AddWindow(self.Pattern, flag=wx.GROW)
         self.Bind(wx.EVT_CHAR_HOOK, self.OnEscapeKey)
         self.RegularExpression = wx.CheckBox(self, label=_('Regular expression'))
         pattern_sizer.AddWindow(self.RegularExpression, flag=wx.GROW)
-        
+
         scope_staticbox = wx.StaticBox(self, label=_('Scope'))
         scope_sizer = wx.StaticBoxSizer(scope_staticbox, wx.HORIZONTAL)
-        main_sizer.AddSizer(scope_sizer, border=20, 
-              flag=wx.GROW|wx.LEFT|wx.RIGHT)
-        
+        main_sizer.AddSizer(scope_sizer, border=20,
+                            flag=wx.GROW | wx.LEFT | wx.RIGHT)
+
         scope_selection_sizer = wx.BoxSizer(wx.VERTICAL)
-        scope_sizer.AddSizer(scope_selection_sizer, 1, border=5, 
-              flag=wx.GROW|wx.TOP|wx.LEFT|wx.BOTTOM)
-        
-        self.WholeProject = wx.RadioButton(self, label=_('Whole Project'), 
-              size=wx.Size(0, 24), style=wx.RB_GROUP)
+        scope_sizer.AddSizer(scope_selection_sizer, 1, border=5,
+                             flag=wx.GROW | wx.TOP | wx.LEFT | wx.BOTTOM)
+
+        self.WholeProject = wx.RadioButton(self, label=_('Whole Project'), style=wx.RB_GROUP)
         self.WholeProject.SetValue(True)
         self.Bind(wx.EVT_RADIOBUTTON, self.OnScopeChanged, self.WholeProject)
-        scope_selection_sizer.AddWindow(self.WholeProject, border=5, 
-              flag=wx.GROW|wx.BOTTOM)
-        
-        self.OnlyElements = wx.RadioButton(self, 
-              label=_('Only Elements'), size=wx.Size(0, 24))
+        scope_selection_sizer.AddWindow(self.WholeProject, border=5,
+                                        flag=wx.GROW | wx.BOTTOM)
+
+        self.OnlyElements = wx.RadioButton(self, label=_('Only Elements'))
         self.Bind(wx.EVT_RADIOBUTTON, self.OnScopeChanged, self.OnlyElements)
         self.OnlyElements.SetValue(False)
         scope_selection_sizer.AddWindow(self.OnlyElements, flag=wx.GROW)
-        
+
         self.ElementsList = wx.CheckListBox(self)
         self.ElementsList.Enable(False)
-        scope_sizer.AddWindow(self.ElementsList, 1, border=5, 
-              flag=wx.GROW|wx.TOP|wx.RIGHT|wx.BOTTOM)
+        scope_sizer.AddWindow(self.ElementsList, 1, border=5,
+                              flag=wx.GROW | wx.TOP | wx.RIGHT | wx.BOTTOM)
 
         buttons_sizer = wx.BoxSizer(wx.HORIZONTAL)
         main_sizer.AddSizer(buttons_sizer, border=20,
@@ -105,11 +107,13 @@
         self.CloseButton = wx.Button(self, label=_("Close"))
         self.Bind(wx.EVT_BUTTON, self.OnCloseButton, self.CloseButton)
         buttons_sizer.AddWindow(self.CloseButton)
-        
+
         self.SetSizer(main_sizer)
-        
-        for name, label in GetElementsChoices():
+
+        for _name, label in GetElementsChoices():
             self.ElementsList.Append(_(label))
+
+        self.Fit()
         self.infosPrev = {}
         self.criteria = {}
         self.Pattern.SetFocus()
@@ -139,7 +143,7 @@
             self.OnCloseButton(event)
         else:
             event.Skip()
-    
+
     def OnFindButton(self, event):
         message = None
         infos = {
@@ -151,7 +155,7 @@
             infos["filter"] = "all"
         elif self.OnlyElements.GetValue():
             infos["filter"] = []
-            for index, (name, label) in enumerate(GetElementsChoices()):
+            for index, (name, _label) in enumerate(GetElementsChoices()):
                 if self.ElementsList.IsChecked(index):
                     infos["filter"].append(name)
 
@@ -160,12 +164,12 @@
                 self.criteria = infos
                 CompilePattern(self.criteria)
                 self.infosPrev = infos
-            except:
+            except Exception:
                 self.criteria.clear()
                 message = _("Syntax error in regular expression of pattern to search!")
-        
+
         if message is not None:
-            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
+            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
             dialog.ShowModal()
             dialog.Destroy()
         else:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dialogs/UriEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,93 @@
+from __future__ import absolute_import
+
+import wx
+from connectors import ConnectorSchemes, EditorClassFromScheme
+from controls.DiscoveryPanel import DiscoveryPanel
+
+class UriEditor(wx.Dialog):
+    def _init_ctrls(self, parent):
+        self.UriTypeChoice = wx.Choice(parent=self, choices=self.choices)
+        self.UriTypeChoice.SetSelection(0)
+        self.Bind(wx.EVT_CHOICE, self.OnTypeChoice, self.UriTypeChoice)
+        self.editor_sizer = wx.BoxSizer(wx.HORIZONTAL)
+        self.ButtonSizer = self.CreateButtonSizer(wx.OK | wx.CANCEL)
+
+    def _init_sizers(self):
+        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
+        typeSizer = wx.BoxSizer(wx.HORIZONTAL)
+        typeSizer.Add(wx.StaticText(self, wx.ID_ANY, _("Scheme :")), border=5,
+                                    flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+        typeSizer.Add(self.UriTypeChoice, border=5, flag=wx.ALL)
+        self.mainSizer.Add(typeSizer)
+
+        self.mainSizer.Add(self.editor_sizer, border=5, flag=wx.ALL)
+        self.mainSizer.Add(self.ButtonSizer, border=5,
+                           flag=wx.BOTTOM | wx.ALIGN_CENTER_HORIZONTAL)
+        self.SetSizer(self.mainSizer)
+        self.Layout()
+        self.Fit()
+
+    def __init__(self, parent, ctr, uri=''):
+        self.ctr = ctr
+        wx.Dialog.__init__(self,
+                           name='UriEditor', parent=parent,
+                           title=_('URI Editor'))
+        self.choices = [_("- Search local network -")] + ConnectorSchemes()
+        self._init_ctrls(parent)
+        self._init_sizers()
+        self.scheme = None
+        self.scheme_editor = None
+        self.SetURI(uri)
+        self.CenterOnParent()
+
+    def OnTypeChoice(self, event):
+        index = event.GetSelection()
+        self._replaceSchemeEditor(event.GetString() if index > 0 else None)
+
+    def SetURI(self, uri):
+        try:
+            scheme, loc = uri.strip().split("://",1)
+            scheme = scheme.upper()
+        except:
+            scheme = None
+
+        if scheme in ConnectorSchemes():
+            self.UriTypeChoice.SetStringSelection(scheme)
+        else:
+            self.UriTypeChoice.SetSelection(0)
+            scheme = None
+
+        self._replaceSchemeEditor(scheme)
+
+        if scheme is not None:
+            self.scheme_editor.SetLoc(loc)
+
+
+    def GetURI(self):
+        if self.scheme is None:
+            return self.scheme_editor.GetURI()
+        else:
+            return self.scheme+"://"+self.scheme_editor.GetLoc()
+
+    def _replaceSchemeEditor(self, scheme):
+        self.scheme = scheme
+       
+        if self.scheme_editor is not None:
+            self.editor_sizer.Detach(self.scheme_editor)
+            self.scheme_editor.Destroy()
+            self.scheme_editor = None
+
+        if scheme is not None :
+            EditorClass = EditorClassFromScheme(scheme)
+            self.scheme_editor = EditorClass(scheme,self)
+        else :
+            # None is for searching local network
+            self.scheme_editor = DiscoveryPanel(self) 
+
+        self.editor_sizer.Add(self.scheme_editor)
+        self.scheme_editor.Refresh()
+            
+        self.editor_sizer.Layout()
+        self.mainSizer.Layout()
+        self.Fit()
+
--- a/dialogs/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/dialogs/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -25,25 +25,30 @@
 
 # Package initialization
 
-from ConnectionDialog import ConnectionDialog
-from ActionBlockDialog import ActionBlockDialog
-from FBDBlockDialog import FBDBlockDialog
-from FBDVariableDialog import FBDVariableDialog
-from LDElementDialog import LDElementDialog
-from LDPowerRailDialog import LDPowerRailDialog
-from SFCStepDialog import SFCStepDialog
-from SFCStepNameDialog import SFCStepNameDialog
-from SFCTransitionDialog import SFCTransitionDialog
-from SFCDivergenceDialog import SFCDivergenceDialog
-from ForceVariableDialog import ForceVariableDialog
-from ArrayTypeDialog import ArrayTypeDialog
-from DurationEditorDialog import DurationEditorDialog
-from SearchInProjectDialog import SearchInProjectDialog
-from BrowseLocationsDialog import BrowseLocationsDialog
-from ProjectDialog import ProjectDialog
-from PouDialog import PouDialog
-from PouTransitionDialog import PouTransitionDialog
-from PouActionDialog import PouActionDialog
-from FindInPouDialog import FindInPouDialog
-from BrowseValuesLibraryDialog import BrowseValuesLibraryDialog
-from DiscoveryDialog import DiscoveryDialog
+from __future__ import absolute_import
+
+from dialogs.CommentEditDialog import CommentEditDialog
+from dialogs.ConnectionDialog import ConnectionDialog
+from dialogs.ActionBlockDialog import ActionBlockDialog
+from dialogs.FBDBlockDialog import FBDBlockDialog
+from dialogs.FBDVariableDialog import FBDVariableDialog
+from dialogs.LDElementDialog import LDElementDialog
+from dialogs.LDPowerRailDialog import LDPowerRailDialog
+from dialogs.SFCStepDialog import SFCStepDialog
+from dialogs.SFCStepNameDialog import SFCStepNameDialog
+from dialogs.SFCTransitionDialog import SFCTransitionDialog
+from dialogs.SFCDivergenceDialog import SFCDivergenceDialog
+from dialogs.ForceVariableDialog import ForceVariableDialog
+from dialogs.ArrayTypeDialog import ArrayTypeDialog
+from dialogs.DurationEditorDialog import DurationEditorDialog
+from dialogs.SearchInProjectDialog import SearchInProjectDialog
+from dialogs.BrowseLocationsDialog import BrowseLocationsDialog
+from dialogs.ProjectDialog import ProjectDialog
+from dialogs.PouDialog import PouDialog
+from dialogs.PouTransitionDialog import PouTransitionDialog
+from dialogs.PouActionDialog import PouActionDialog
+from dialogs.FindInPouDialog import FindInPouDialog
+from dialogs.BrowseValuesLibraryDialog import BrowseValuesLibraryDialog
+from dialogs.UriEditor import UriEditor
+from dialogs.IDManager import IDManager
+
--- a/doc/Makefile	Sat Jun 02 11:56:01 2018 +0100
+++ b/doc/Makefile	Mon Jan 07 13:50:39 2019 +0100
@@ -38,6 +38,8 @@
 endef
 $(foreach lang, $(langs), $(eval $(call by_lang,$(lang))))
 
+%.pot : gettext
+	echo "Build missing pot files"
 
 all: $(sitelist)
 	mkdir -p $(BUILDDIR)/final
--- a/doc/conf.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/doc/conf.py	Mon Jan 07 13:50:39 2019 +0100
@@ -11,17 +11,15 @@
 # All configuration values have a default; values that are commented out
 # serve to show the default.
 
-import sys, os
-
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
-#sys.path.insert(0, os.path.abspath('.'))
+# sys.path.insert(0, os.path.abspath('.'))
 
 # -- General configuration -----------------------------------------------------
 
 # If your documentation needs a minimal Sphinx version, state it here.
-#needs_sphinx = '1.0'
+# needs_sphinx = '1.0'
 
 # Add any Sphinx extension module names here, as strings. They can be extensions
 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
@@ -34,7 +32,7 @@
 source_suffix = '.rst'
 
 # The encoding of source files.
-#source_encoding = 'utf-8-sig'
+# source_encoding = 'utf-8-sig'
 
 # The master toctree document.
 master_doc = 'index'
@@ -54,40 +52,40 @@
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
-#language = None
+# language = None
 
 gettext_compact = False
-locale_dirs = [ "locale/" ]
+locale_dirs = ["locale/"]
 
 # There are two options for replacing |today|: either, you set today to some
 # non-false value, then it is used:
-#today = ''
+# today = ''
 # Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
+# today_fmt = '%B %d, %Y'
 
 # List of patterns, relative to source directory, that match files and
 # directories to ignore when looking for source files.
 exclude_patterns = ['_build']
 
 # The reST default role (used for this markup: `text`) to use for all documents.
-#default_role = None
+# default_role = None
 
 # If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
+# add_function_parentheses = True
 
 # If true, the current module name will be prepended to all description
 # unit titles (such as .. function::).
-#add_module_names = True
+# add_module_names = True
 
 # If true, sectionauthor and moduleauthor directives will be shown in the
 # output. They are ignored by default.
-#show_authors = False
+# show_authors = False
 
 # The name of the Pygments (syntax highlighting) style to use.
 pygments_style = 'sphinx'
 
 # A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
+# modindex_common_prefix = []
 
 
 # -- Options for HTML output ---------------------------------------------------
@@ -99,26 +97,26 @@
 # Theme options are theme-specific and customize the look and feel of a theme
 # further.  For a list of options available for each theme, see the
 # documentation.
-#html_theme_options = {}
+# html_theme_options = {}
 
 # Add any paths that contain custom themes here, relative to this directory.
-#html_theme_path = []
+# html_theme_path = []
 
 # The name for this set of Sphinx documents.  If None, it defaults to
 # "<project> v<release> documentation".
-#html_title = None
+# html_title = None
 
 # A shorter title for the navigation bar.  Default is the same as html_title.
-#html_short_title = None
+# html_short_title = None
 
 # The name of an image file (relative to this directory) to place at the top
 # of the sidebar.
-#html_logo = None
+# html_logo = None
 
 # The name of an image file (within the static path) to use as favicon of the
 # docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
 # pixels large.
-#html_favicon = None
+# html_favicon = None
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
@@ -127,44 +125,44 @@
 
 # If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
 # using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
+# html_last_updated_fmt = '%b %d, %Y'
 
 # If true, SmartyPants will be used to convert quotes and dashes to
 # typographically correct entities.
-#html_use_smartypants = True
+# html_use_smartypants = True
 
 # Custom sidebar templates, maps document names to template names.
-#html_sidebars = {}
+# html_sidebars = {}
 
 # Additional templates that should be rendered to pages, maps page names to
 # template names.
-#html_additional_pages = {}
+# html_additional_pages = {}
 
 # If false, no module index is generated.
-#html_domain_indices = True
+# html_domain_indices = True
 
 # If false, no index is generated.
-#html_use_index = True
+# html_use_index = True
 
 # If true, the index is split into individual pages for each letter.
-#html_split_index = False
+# html_split_index = False
 
 # If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
+# html_show_sourcelink = True
 
 # If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-#html_show_sphinx = True
+# html_show_sphinx = True
 
 # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#html_show_copyright = True
+# html_show_copyright = True
 
 # If true, an OpenSearch description file will be output, and all pages will
 # contain a <link> tag referring to it.  The value of this option must be the
 # base URL from which the finished HTML is served.
-#html_use_opensearch = ''
+# html_use_opensearch = ''
 
 # This is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = None
+# html_file_suffix = None
 
 # Output file base name for HTML help builder.
 htmlhelp_basename = 'Beremizdoc'
@@ -173,42 +171,42 @@
 # -- Options for LaTeX output --------------------------------------------------
 
 latex_elements = {
-# The paper size ('letterpaper' or 'a4paper').
-#'papersize': 'letterpaper',
-
-# The font size ('10pt', '11pt' or '12pt').
-#'pointsize': '10pt',
-
-# Additional stuff for the LaTeX preamble.
-#'preamble': '',
+    # The paper size ('letterpaper' or 'a4paper').
+    # 'papersize': 'letterpaper',
+
+    # The font size ('10pt', '11pt' or '12pt').
+    # 'pointsize': '10pt',
+
+    # Additional stuff for the LaTeX preamble.
+    # 'preamble': '',
 }
 
 # Grouping the document tree into LaTeX files. List of tuples
 # (source start file, target name, title, author, documentclass [howto/manual]).
 latex_documents = [
-  ('index', 'Beremiz.tex', u'Beremiz Documentation',
-   u'Beremiz Documentation Authors', 'manual'),
+    ('index', 'Beremiz.tex', u'Beremiz Documentation',
+     u'Beremiz Documentation Authors', 'manual'),
 ]
 
 # The name of an image file (relative to this directory) to place at the top of
 # the title page.
-#latex_logo = None
+# latex_logo = None
 
 # For "manual" documents, if this is true, then toplevel headings are parts,
 # not chapters.
-#latex_use_parts = False
+# latex_use_parts = False
 
 # If true, show page references after internal links.
-#latex_show_pagerefs = False
+# latex_show_pagerefs = False
 
 # If true, show URL addresses after external links.
-#latex_show_urls = False
+# latex_show_urls = False
 
 # Documents to append as an appendix to all manuals.
-#latex_appendices = []
+# latex_appendices = []
 
 # If false, no module index is generated.
-#latex_domain_indices = True
+# latex_domain_indices = True
 
 
 # -- Options for manual page output --------------------------------------------
@@ -221,7 +219,7 @@
 ]
 
 # If true, show URL addresses after external links.
-#man_show_urls = False
+# man_show_urls = False
 
 
 # -- Options for Texinfo output ------------------------------------------------
@@ -230,16 +228,16 @@
 # (source start file, target name, title, author,
 #  dir menu entry, description, category)
 texinfo_documents = [
-  ('index', 'Beremiz', u'Beremiz Documentation',
-   u'Beremiz Documentation Authors', 'Beremiz', 'One line description of project.',
-   'Miscellaneous'),
+    ('index', 'Beremiz', u'Beremiz Documentation',
+     u'Beremiz Documentation Authors', 'Beremiz', 'One line description of project.',
+     'Miscellaneous'),
 ]
 
 # Documents to append as an appendix to all manuals.
-#texinfo_appendices = []
+# texinfo_appendices = []
 
 # If false, no module index is generated.
-#texinfo_domain_indices = True
+# texinfo_domain_indices = True
 
 # How to display URL addresses: 'footnote', 'no', or 'inline'.
-#texinfo_show_urls = 'footnote'
+# texinfo_show_urls = 'footnote'
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/manual/connectors_fr.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,183 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) is 21st century inquisition
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz 1.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-08-09 14:06+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../manual/connectors.rst:2
+msgid "Beremiz and Beremiz_service connectors"
+msgstr ""
+
+#: ../../manual/connectors.rst:6
+msgid "To connect a PLC, Beremiz provides 2 types of connectors :"
+msgstr ""
+
+#: ../../manual/connectors.rst:5
+msgid "a Pyro connector"
+msgstr ""
+
+#: ../../manual/connectors.rst:6
+msgid "a WAMP connector"
+msgstr ""
+
+#: ../../manual/connectors.rst:8
+msgid ""
+"To configure the connection, you have to set the *URI_location* in your "
+"project Config tab according to this documentation."
+msgstr ""
+
+#: ../../manual/connectors.rst:11
+msgid "The Pyro connector"
+msgstr ""
+
+#: ../../manual/connectors.rst:13
+msgid ""
+"Pyro is an advanced and powerful Distributed Object Technology system "
+"written entirely in Python. Beremiz_service spawns a Pyro server, serving a "
+"PLCObject (see runtime/PLCObject.py). Therefore, Beremiz acts as a Pyro "
+"client."
+msgstr ""
+
+#: ../../manual/connectors.rst:16
+msgid "TODO:: link to PLCObject API documentation"
+msgstr ""
+
+#: ../../manual/connectors.rst:22 ../../manual/connectors.rst:105
+msgid "URI_location :"
+msgstr ""
+
+#: ../../manual/connectors.rst:19
+msgid ""
+"LOCAL:// is a facility that starts the PLC service locally and connect "
+"Beremiz to it via Pyro. This is intended for use in development stage."
+msgstr ""
+
+#: ../../manual/connectors.rst:21
+msgid ""
+"PYRO://<ip:port> normal connection to a remote PLC. PLC default port is 3000."
+msgstr ""
+
+#: ../../manual/connectors.rst:22
+msgid "PYROS://<ip:port> SSL connection to a remote PLC, see below."
+msgstr ""
+
+#: ../../manual/connectors.rst:24
+msgid ""
+"more information about Pyro can be found on http://pythonhosted.org//Pyro/1-"
+"intro.html"
+msgstr ""
+
+#: ../../manual/connectors.rst:28
+msgid "Setup a Pyro SSL connection"
+msgstr ""
+
+#: ../../manual/connectors.rst:30
+msgid ""
+"Pyro v3 has a limited TLS/SSL support based on m2crypto. Pyro v4 had dropped "
+"it. In order to have a full and reliable SSL, we recommand to use a TLS/SSL "
+"wrapper as nginx, stub or stunnel."
+msgstr ""
+
+#: ../../manual/connectors.rst:35
+msgid "TLS-PSK with stunnel"
+msgstr ""
+
+#: ../../manual/connectors.rst:37
+msgid ""
+"In this example, we setup a simple TLS-PSK connection according to rfc4279. "
+"This ciphersuite avoid the need for public key operations and certificate "
+"management. It is perfect for a performance-constrained environments with "
+"limited CPU power as a PLC."
+msgstr ""
+
+#: ../../manual/connectors.rst:43
+msgid "Needed :"
+msgstr ""
+
+#: ../../manual/connectors.rst:43
+msgid "stunnel >= 5.09"
+msgstr ""
+
+#: ../../manual/connectors.rst:45
+msgid "verify openssl support for PSK cipher::"
+msgstr ""
+
+#: ../../manual/connectors.rst:51
+msgid "Client setup (Beremiz)"
+msgstr ""
+
+#: ../../manual/connectors.rst:53
+msgid ""
+"You need to choose an identity for your client, here *client1*. generate a "
+"valid and strong key::"
+msgstr ""
+
+#: ../../manual/connectors.rst:58
+msgid "write a stunnel client configuration file *stunnel-client.conf*::"
+msgstr ""
+
+#: ../../manual/connectors.rst:69
+msgid "start stunnel client side::"
+msgstr ""
+
+#: ../../manual/connectors.rst:73
+msgid ""
+"You could now connect beremiz with classic URI_location = "
+"PYRO://127.0.0.1:3002"
+msgstr ""
+
+#: ../../manual/connectors.rst:77
+msgid "Server setup (PLC)"
+msgstr ""
+
+#: ../../manual/connectors.rst:79
+msgid "import the client key in a keyfile psk.txt, concatening all client key."
+msgstr ""
+
+#: ../../manual/connectors.rst:81
+msgid "write a stunnel server  configuration file *stunnel-server.conf*::"
+msgstr ""
+
+#: ../../manual/connectors.rst:90
+msgid "start stunnel server side::"
+msgstr ""
+
+#: ../../manual/connectors.rst:94
+msgid "more documentation on stunnel http://www.stunnel.org/docs.html"
+msgstr ""
+
+#: ../../manual/connectors.rst:97
+msgid "The WAMP connector"
+msgstr ""
+
+#: ../../manual/connectors.rst:99
+msgid ""
+"WAMP is an open standard WebSocket subprotocol that provides two application "
+"messaging patterns in one unified protocol: Remote Procedure Calls + Publish "
+"& Subscribe."
+msgstr ""
+
+#: ../../manual/connectors.rst:102
+msgid "Beremiz WAMP connector implementation uses Autobahn and crossbar."
+msgstr ""
+
+#: ../../manual/connectors.rst:105
+msgid "WAMP://127.0.0.1:8888#Automation#2534667845"
+msgstr ""
+
+#: ../../manual/connectors.rst:107
+msgid "more information about WAMP can be found on http://wamp.ws/"
+msgstr ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/manual/connectors_kr.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,183 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) is 21st century inquisition
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz 1.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2017-08-09 14:06+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../manual/connectors.rst:2
+msgid "Beremiz and Beremiz_service connectors"
+msgstr ""
+
+#: ../../manual/connectors.rst:6
+msgid "To connect a PLC, Beremiz provides 2 types of connectors :"
+msgstr ""
+
+#: ../../manual/connectors.rst:5
+msgid "a Pyro connector"
+msgstr ""
+
+#: ../../manual/connectors.rst:6
+msgid "a WAMP connector"
+msgstr ""
+
+#: ../../manual/connectors.rst:8
+msgid ""
+"To configure the connection, you have to set the *URI_location* in your "
+"project Config tab according to this documentation."
+msgstr ""
+
+#: ../../manual/connectors.rst:11
+msgid "The Pyro connector"
+msgstr ""
+
+#: ../../manual/connectors.rst:13
+msgid ""
+"Pyro is an advanced and powerful Distributed Object Technology system "
+"written entirely in Python. Beremiz_service spawns a Pyro server, serving a "
+"PLCObject (see runtime/PLCObject.py). Therefore, Beremiz acts as a Pyro "
+"client."
+msgstr ""
+
+#: ../../manual/connectors.rst:16
+msgid "TODO:: link to PLCObject API documentation"
+msgstr ""
+
+#: ../../manual/connectors.rst:22 ../../manual/connectors.rst:105
+msgid "URI_location :"
+msgstr ""
+
+#: ../../manual/connectors.rst:19
+msgid ""
+"LOCAL:// is a facility that starts the PLC service locally and connect "
+"Beremiz to it via Pyro. This is intended for use in development stage."
+msgstr ""
+
+#: ../../manual/connectors.rst:21
+msgid ""
+"PYRO://<ip:port> normal connection to a remote PLC. PLC default port is 3000."
+msgstr ""
+
+#: ../../manual/connectors.rst:22
+msgid "PYROS://<ip:port> SSL connection to a remote PLC, see below."
+msgstr ""
+
+#: ../../manual/connectors.rst:24
+msgid ""
+"more information about Pyro can be found on http://pythonhosted.org//Pyro/1-"
+"intro.html"
+msgstr ""
+
+#: ../../manual/connectors.rst:28
+msgid "Setup a Pyro SSL connection"
+msgstr ""
+
+#: ../../manual/connectors.rst:30
+msgid ""
+"Pyro v3 has a limited TLS/SSL support based on m2crypto. Pyro v4 had dropped "
+"it. In order to have a full and reliable SSL, we recommand to use a TLS/SSL "
+"wrapper as nginx, stub or stunnel."
+msgstr ""
+
+#: ../../manual/connectors.rst:35
+msgid "TLS-PSK with stunnel"
+msgstr ""
+
+#: ../../manual/connectors.rst:37
+msgid ""
+"In this example, we setup a simple TLS-PSK connection according to rfc4279. "
+"This ciphersuite avoid the need for public key operations and certificate "
+"management. It is perfect for a performance-constrained environments with "
+"limited CPU power as a PLC."
+msgstr ""
+
+#: ../../manual/connectors.rst:43
+msgid "Needed :"
+msgstr ""
+
+#: ../../manual/connectors.rst:43
+msgid "stunnel >= 5.09"
+msgstr ""
+
+#: ../../manual/connectors.rst:45
+msgid "verify openssl support for PSK cipher::"
+msgstr ""
+
+#: ../../manual/connectors.rst:51
+msgid "Client setup (Beremiz)"
+msgstr ""
+
+#: ../../manual/connectors.rst:53
+msgid ""
+"You need to choose an identity for your client, here *client1*. generate a "
+"valid and strong key::"
+msgstr ""
+
+#: ../../manual/connectors.rst:58
+msgid "write a stunnel client configuration file *stunnel-client.conf*::"
+msgstr ""
+
+#: ../../manual/connectors.rst:69
+msgid "start stunnel client side::"
+msgstr ""
+
+#: ../../manual/connectors.rst:73
+msgid ""
+"You could now connect beremiz with classic URI_location = "
+"PYRO://127.0.0.1:3002"
+msgstr ""
+
+#: ../../manual/connectors.rst:77
+msgid "Server setup (PLC)"
+msgstr ""
+
+#: ../../manual/connectors.rst:79
+msgid "import the client key in a keyfile psk.txt, concatening all client key."
+msgstr ""
+
+#: ../../manual/connectors.rst:81
+msgid "write a stunnel server  configuration file *stunnel-server.conf*::"
+msgstr ""
+
+#: ../../manual/connectors.rst:90
+msgid "start stunnel server side::"
+msgstr ""
+
+#: ../../manual/connectors.rst:94
+msgid "more documentation on stunnel http://www.stunnel.org/docs.html"
+msgstr ""
+
+#: ../../manual/connectors.rst:97
+msgid "The WAMP connector"
+msgstr ""
+
+#: ../../manual/connectors.rst:99
+msgid ""
+"WAMP is an open standard WebSocket subprotocol that provides two application "
+"messaging patterns in one unified protocol: Remote Procedure Calls + Publish "
+"& Subscribe."
+msgstr ""
+
+#: ../../manual/connectors.rst:102
+msgid "Beremiz WAMP connector implementation uses Autobahn and crossbar."
+msgstr ""
+
+#: ../../manual/connectors.rst:105
+msgid "WAMP://127.0.0.1:8888#Automation#2534667845"
+msgstr ""
+
+#: ../../manual/connectors.rst:107
+msgid "more information about WAMP can be found on http://wamp.ws/"
+msgstr ""
--- a/docutil/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/docutil/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,6 +22,8 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-from dochtml import *
-from docpdf import *
-from docsvg import *
+
+from __future__ import absolute_import
+from docutil.dochtml import *
+from docutil.docpdf import *
+from docutil.docsvg import *
--- a/docutil/dochtml.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/docutil/dochtml.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,28 +22,36 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import wx, os, wx.html, subprocess
+
+from __future__ import absolute_import
+import subprocess
+import wx
+import wx.html
 
 HtmlFrameOpened = []
 
+
 def OpenHtmlFrame(self, title, file, size):
-        if title not in HtmlFrameOpened:
-            HtmlFrameOpened.append(title)
-            window = HtmlFrame(self, HtmlFrameOpened)
-            window.SetTitle(title)
-            window.SetHtmlPage(file)
-            window.SetClientSize(size)
-            window.Show()
+    if title not in HtmlFrameOpened:
+        HtmlFrameOpened.append(title)
+        window = HtmlFrame(self, HtmlFrameOpened)
+        window.SetTitle(title)
+        window.SetHtmlPage(file)
+        window.SetClientSize(size)
+        window.Show()
+
 
 [ID_HTMLFRAME, ID_HTMLFRAMEHTMLCONTENT] = [wx.NewId() for _init_ctrls in range(2)]
 EVT_HTML_URL_CLICK = wx.NewId()
 
+
 class HtmlWindowUrlClick(wx.PyEvent):
     def __init__(self, linkinfo):
         wx.PyEvent.__init__(self)
         self.SetEventType(EVT_HTML_URL_CLICK)
         self.linkinfo = (linkinfo.GetHref(), linkinfo.GetTarget())
-        
+
+
 class UrlClickHtmlWindow(wx.html.HtmlWindow):
     """ HTML window that generates and OnLinkClicked event.
 
@@ -51,47 +59,49 @@
     """
     def OnLinkClicked(self, linkinfo):
         wx.PostEvent(self, HtmlWindowUrlClick(linkinfo))
-    
+
     def Bind(self, event, handler, source=None, id=wx.ID_ANY, id2=wx.ID_ANY):
         if event == HtmlWindowUrlClick:
             self.Connect(-1, -1, EVT_HTML_URL_CLICK, handler)
         else:
-            wx.html.HtmlWindow.Bind(event, handler, source=source, id=id, id2=id2)
+            wx.html.HtmlWindow.Bind(self, event, handler, source=source, id=id, id2=id2)
+
 
 class HtmlFrame(wx.Frame):
-        def _init_ctrls(self, prnt):
-            wx.Frame.__init__(self, id=ID_HTMLFRAME, name='HtmlFrame',
-                  parent=prnt, pos=wx.Point(320, 231), size=wx.Size(853, 616),
-                  style=wx.DEFAULT_FRAME_STYLE, title='')
-            self.SetIcon(prnt.icon)
-            self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
-            
-            self.HtmlContent = UrlClickHtmlWindow(id=ID_HTMLFRAMEHTMLCONTENT,
-                  name='HtmlContent', parent=self, pos=wx.Point(0, 0),
-                  size=wx.Size(-1, -1), style=wx.html.HW_SCROLLBAR_AUTO|wx.html.HW_NO_SELECTION)
-            self.HtmlContent.Bind(HtmlWindowUrlClick, self.OnLinkClick)
+    def _init_ctrls(self, prnt):
+        self.SetIcon(prnt.icon)
+        self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
 
-        def __init__(self, parent, opened):
-            self._init_ctrls(parent)
-            self.HtmlFrameOpened = opened
-            
-        def SetHtmlCode(self, htmlcode):
-            self.HtmlContent.SetPage(htmlcode)
-            
-        def SetHtmlPage(self, htmlpage):
-            self.HtmlContent.LoadPage(htmlpage)
-            
-        def OnCloseFrame(self, event):
-            self.HtmlFrameOpened.remove(self.GetTitle())
-            event.Skip()
-        
-        def OnLinkClick(self, event):
-            url = event.linkinfo[0]
-            try:
-                if wx.Platform == '__WXMSW__':
-                    import webbrowser
-                    webbrowser.open(url)
-                elif subprocess.call("firefox %s"%url, shell=True) != 0:
-                    wx.MessageBox("""Firefox browser not found.\nPlease point your browser at :\n%s""" % url)
-            except ImportError:
-                wx.MessageBox('Please point your browser at: %s' % url)
+        self.HtmlContent = UrlClickHtmlWindow(id=ID_HTMLFRAMEHTMLCONTENT,
+                                              name='HtmlContent', parent=self, pos=wx.Point(0, 0),
+                                              size=wx.Size(-1, -1), style=wx.html.HW_SCROLLBAR_AUTO | wx.html.HW_NO_SELECTION)
+        self.HtmlContent.Bind(HtmlWindowUrlClick, self.OnLinkClick)
+
+    def __init__(self, parent, opened):
+        wx.Frame.__init__(self, id=ID_HTMLFRAME, name='HtmlFrame',
+                          parent=parent, pos=wx.Point(320, 231),
+                          size=wx.Size(853, 616),
+                          style=wx.DEFAULT_FRAME_STYLE, title='')
+        self._init_ctrls(parent)
+        self.HtmlFrameOpened = opened
+
+    def SetHtmlCode(self, htmlcode):
+        self.HtmlContent.SetPage(htmlcode)
+
+    def SetHtmlPage(self, htmlpage):
+        self.HtmlContent.LoadPage(htmlpage)
+
+    def OnCloseFrame(self, event):
+        self.HtmlFrameOpened.remove(self.GetTitle())
+        event.Skip()
+
+    def OnLinkClick(self, event):
+        url = event.linkinfo[0]
+        try:
+            if wx.Platform == '__WXMSW__':
+                import webbrowser
+                webbrowser.open(url)
+            elif subprocess.call("firefox %s" % url, shell=True) != 0:
+                wx.MessageBox("""Firefox browser not found.\nPlease point your browser at :\n%s""" % url)
+        except ImportError:
+            wx.MessageBox('Please point your browser at: %s' % url)
--- a/docutil/docpdf.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/docutil/docpdf.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,56 +22,65 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import wx, os
+
+from __future__ import absolute_import
+from __future__ import print_function
+import os
+import wx
+
 
 readerexepath = None
-    
+
+
 def get_acroversion():
     " Return version of Adobe Acrobat executable or None"
-    import _winreg
-    adobesoft = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r'Software\Adobe')
-    for index in range(_winreg.QueryInfoKey(adobesoft)[0]):
-        key = _winreg.EnumKey(adobesoft, index)
+    from six.moves import winreg
+    adobesoft = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r'Software\Adobe')
+    for index in range(winreg.QueryInfoKey(adobesoft)[0]):
+        key = winreg.EnumKey(adobesoft, index)
         if "acrobat" in key.lower():
-            acrokey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 'Software\\Adobe\\%s' % key)
-            for index in range(_winreg.QueryInfoKey(acrokey)[0]):
-                numver = _winreg.EnumKey(acrokey, index)
+            acrokey = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, 'Software\\Adobe\\%s' % key)
+            for index in range(winreg.QueryInfoKey(acrokey)[0]):
+                numver = winreg.EnumKey(acrokey, index)
                 try:
-                    res = _winreg.QueryValue(_winreg.HKEY_LOCAL_MACHINE, 'Software\\Adobe\\%s\\%s\\InstallPath' % (key, numver))
+                    res = winreg.QueryValue(winreg.HKEY_LOCAL_MACHINE, 'Software\\Adobe\\%s\\%s\\InstallPath' % (key, numver))
                     return res
-                except:
+                except Exception:
                     pass
     return None
 
-def open_win_pdf(readerexepath, pdffile, pagenum = None):
-    if pagenum != None :
-        os.spawnl(os.P_DETACH, readerexepath, "AcroRd32.exe", "/A", "page=%d=OpenActions" % pagenum, '"%s"'%pdffile)
+
+def open_win_pdf(readerexepath, pdffile, pagenum=None):
+    if pagenum is not None:
+        os.spawnl(os.P_DETACH, readerexepath, "AcroRd32.exe", "/A", "page=%d=OpenActions" % pagenum, '"%s"' % pdffile)
     else:
-        os.spawnl(os.P_DETACH, readerexepath, "AcroRd32.exe", '"%s"'%pdffile)
+        os.spawnl(os.P_DETACH, readerexepath, "AcroRd32.exe", '"%s"' % pdffile)
 
-def open_lin_pdf(readerexepath, pdffile, pagenum = None):
-    if pagenum == None :
-        os.system("%s -remote DS301 %s &"%(readerexepath, pdffile))
+
+def open_lin_pdf(readerexepath, pdffile, pagenum=None):
+    if pagenum is None:
+        os.system("%s -remote DS301 %s &" % (readerexepath, pdffile))
     else:
-        print "Open pdf %s at page %d"%(pdffile, pagenum)
-        os.system("%s -remote DS301 %s %d &"%(readerexepath, pdffile, pagenum))
+        print("Open pdf %s at page %d" % (pdffile, pagenum))
+        os.system("%s -remote DS301 %s %d &" % (readerexepath, pdffile, pagenum))
 
-def open_pdf(pdffile, pagenum = None):
-    if wx.Platform == '__WXMSW__' :
+
+def open_pdf(pdffile, pagenum=None):
+    if wx.Platform == '__WXMSW__':
         try:
             readerpath = get_acroversion()
-        except:
+        except Exception:
             wx.MessageBox("Acrobat Reader is not found or installed !")
             return None
-        
+
         readerexepath = os.path.join(readerpath, "AcroRd32.exe")
-        if(os.path.isfile(readerexepath)):
+        if os.path.isfile(readerexepath):
             open_win_pdf(readerexepath, pdffile, pagenum)
         else:
             return None
     else:
-        readerexepath = os.path.join("/usr/bin","xpdf")
-        if(os.path.isfile(readerexepath)):
+        readerexepath = os.path.join("/usr/bin", "xpdf")
+        if os.path.isfile(readerexepath):
             open_lin_pdf(readerexepath, pdffile, pagenum)
         else:
             wx.MessageBox("xpdf is not found or installed !")
--- a/docutil/docsvg.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/docutil/docsvg.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,41 +22,52 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import wx, os, subprocess
+
+from __future__ import absolute_import
+import os
+import subprocess
+import wx
+
 
 def get_inkscape_path():
     """ Return the Inkscape path """
-    import _winreg
-    svgexepath = _winreg.QueryValue(_winreg.HKEY_LOCAL_MACHINE,
-                 'Software\\Classes\\svgfile\\shell\\Inkscape\\command')
+    from six.moves import winreg
+    try:
+        svgexepath = winreg.QueryValue(winreg.HKEY_LOCAL_MACHINE,
+                                       'Software\\Classes\\svgfile\\shell\\Inkscape\\command')
+    except OSError:
+        svgexepath = winreg.QueryValue(winreg.HKEY_LOCAL_MACHINE,
+                                       'Software\\Classes\\inkscape.svg\\shell\\open\\command')
     svgexepath = svgexepath.replace('"%1"', '')
     return svgexepath.replace('"', '')
 
+
 def open_win_svg(svgexepath, svgfile):
     """ Open Inkscape on Windows platform """
     popenargs = [svgexepath]
-    if svgfile is not None :
+    if svgfile is not None:
         popenargs.append(svgfile)
-    subprocess.Popen(popenargs).pid
+    subprocess.Popen(popenargs)
+
 
 def open_lin_svg(svgexepath, svgfile):
     """ Open Inkscape on Linux platform """
     if os.path.isfile("/usr/bin/inkscape"):
-        os.system("%s %s &"%(svgexepath , svgfile))
-    
+        os.system("%s %s &" % (svgexepath, svgfile))
+
+
 def open_svg(svgfile):
     """ Generic function to open SVG file """
-    if wx.Platform == '__WXMSW__' :
+    if wx.Platform == '__WXMSW__':
         try:
             open_win_svg(get_inkscape_path(), svgfile)
-        except:
+        except Exception:
             wx.MessageBox("Inkscape is not found or installed !")
             return None
     else:
-        svgexepath = os.path.join("/usr/bin","inkscape")
-        if(os.path.isfile(svgexepath)):
+        svgexepath = os.path.join("/usr/bin", "inkscape")
+        if os.path.isfile(svgexepath):
             open_lin_svg(svgexepath, svgfile)
         else:
             wx.MessageBox("Inkscape is not found or installed !")
             return None
-
--- a/editors/CodeFileEditor.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/editors/CodeFileEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,22 +22,29 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
 import re
+from builtins import str as text
 
 import wx
 import wx.grid
 import wx.stc as stc
 import wx.lib.buttons
+from six.moves import xrange
+
 
 from plcopen.plcopen import TestTextElement
 from plcopen.structures import TestIdentifier, IEC_KEYWORDS, DefaultType
 from controls import CustomGrid, CustomTable
+from controls.CustomStyledTextCtrl import CustomStyledTextCtrl, faces, GetCursorPos, NAVIGATION_KEYS
 from editors.ConfTreeNodeEditor import ConfTreeNodeEditor
 from util.BitmapLibrary import GetBitmap
-from controls.CustomStyledTextCtrl import CustomStyledTextCtrl, faces, GetCursorPos, NAVIGATION_KEYS
-from controls.VariablePanel import VARIABLE_NAME_SUFFIX_MODEL
+from util.TranslationCatalogs import NoTranslate
 from graphics.GraphicCommons import ERROR_HIGHLIGHT, SEARCH_RESULT_HIGHLIGHT, REFRESH_HIGHLIGHT_PERIOD
 
+
 [STC_CODE_ERROR, STC_CODE_SEARCH_RESULT,
  STC_CODE_SECTION] = range(15, 18)
 
@@ -48,6 +55,7 @@
 
 EDGE_COLUMN = 80
 
+
 class CodeEditor(CustomStyledTextCtrl):
 
     KEYWORDS = []
@@ -55,14 +63,14 @@
 
     def __init__(self, parent, window, controler):
         CustomStyledTextCtrl.__init__(self, parent, -1, wx.DefaultPosition,
-                 wx.Size(-1, 300), 0)
+                                      wx.Size(-1, 300), 0)
 
         self.SetMarginType(1, stc.STC_MARGIN_NUMBER)
         self.SetMarginWidth(1, 25)
 
         self.SetProperty("fold", "1")
         self.SetProperty("tab.timmy.whinge.level", "1")
-        self.SetMargins(0,0)
+        self.SetMargins(0, 0)
 
         self.SetViewWhiteSpace(False)
 
@@ -133,12 +141,13 @@
         for section in self.Controler.SECTIONS_NAMES:
             section_comment = " %s section " % (section)
             len_headers = EDGE_COLUMN - len(section_comment)
-            section_comment = self.COMMENT_HEADER * (len_headers / 2) + \
-                              section_comment + \
-                              self.COMMENT_HEADER * (len_headers - len_headers / 2)
+            section_comment = \
+                self.COMMENT_HEADER * (len_headers // 2) + \
+                section_comment + \
+                self.COMMENT_HEADER * (len_headers - len_headers // 2)
 
             self.SectionsComments[section] = {
-                 "comment": section_comment,
+                "comment": section_comment,
             }
 
         for i, section in enumerate(self.Controler.SECTIONS_NAMES):
@@ -152,7 +161,7 @@
                 section_infos["comment"] + "(.*)" +
                 section_end, re.DOTALL)
 
-        self.SetModEventMask(wx.stc.STC_MOD_BEFOREINSERT|wx.stc.STC_MOD_BEFOREDELETE)
+        self.SetModEventMask(wx.stc.STC_MOD_BEFOREINSERT | wx.stc.STC_MOD_BEFOREDELETE)
 
         self.Bind(wx.stc.EVT_STC_DO_DROP, self.OnDoDrop)
         self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)
@@ -170,17 +179,17 @@
     def OnModification(self, event):
         if not self.DisableEvents:
             mod_type = event.GetModificationType()
-            if not (mod_type&wx.stc.STC_PERFORMED_UNDO or mod_type&wx.stc.STC_PERFORMED_REDO):
-                if mod_type&wx.stc.STC_MOD_BEFOREINSERT:
-                    if self.CurrentAction == None:
+            if not (mod_type & wx.stc.STC_PERFORMED_UNDO or mod_type & wx.stc.STC_PERFORMED_REDO):
+                if mod_type & wx.stc.STC_MOD_BEFOREINSERT:
+                    if self.CurrentAction is None:
                         self.StartBuffering()
                     elif self.CurrentAction[0] != "Add" or self.CurrentAction[1] != event.GetPosition() - 1:
                         self.Controler.EndBuffering()
                         self.StartBuffering()
                     self.CurrentAction = ("Add", event.GetPosition())
                     wx.CallAfter(self.RefreshModel)
-                elif mod_type&wx.stc.STC_MOD_BEFOREDELETE:
-                    if self.CurrentAction == None:
+                elif mod_type & wx.stc.STC_MOD_BEFOREDELETE:
+                    if self.CurrentAction is None:
                         self.StartBuffering()
                     elif self.CurrentAction[0] != "Delete" or self.CurrentAction[1] != event.GetPosition() + 1:
                         self.Controler.EndBuffering()
@@ -193,10 +202,9 @@
     def OnDoDrop(self, event):
         try:
             values = eval(event.GetDragText())
-        except:
+        except Exception:
             values = event.GetDragText()
         if isinstance(values, tuple):
-            message = None
             if values[3] == self.Controler.GetCurrentLocation():
                 self.ResetBuffer()
                 event.SetDragText(values[0])
@@ -226,7 +234,7 @@
             self.ParentWindow.RefreshPageTitles()
 
     def ResetBuffer(self):
-        if self.CurrentAction != None:
+        if self.CurrentAction is not None:
             self.Controler.EndBuffering()
             self.CurrentAction = None
 
@@ -258,7 +266,7 @@
             self.SetText(new_text)
             new_cursor_pos = GetCursorPos(old_text, new_text)
             self.LineScroll(column, line)
-            if new_cursor_pos != None:
+            if new_cursor_pos is not None:
                 self.GotoPos(new_cursor_pos)
             else:
                 self.GotoPos(old_cursor_pos)
@@ -319,11 +327,9 @@
             newline_size = 1
 
         # Disable to type any character in section header lines
-        if (self.GetLineState(self.LineFromPosition(current_pos)) and
-            not text_selected and
-            key not in NAVIGATION_KEYS + [
-                wx.WXK_RETURN,
-                wx.WXK_NUMPAD_ENTER]):
+        if self.GetLineState(self.LineFromPosition(current_pos)) and \
+           not text_selected and \
+           key not in NAVIGATION_KEYS + [wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER]:
             return
 
         # Disable to delete line between code and header lines
@@ -335,8 +341,6 @@
             return
 
         elif key == 32 and event.ControlDown():
-            pos = self.GetCurrentPos()
-
             # Tips
             if event.ShiftDown():
                 pass
@@ -381,7 +385,7 @@
         if braceAtCaret >= 0:
             braceOpposite = self.BraceMatch(braceAtCaret)
 
-        if braceAtCaret != -1  and braceOpposite == -1:
+        if braceAtCaret != -1 and braceOpposite == -1:
             self.BraceBadLight(braceAtCaret)
         else:
             self.BraceHighlight(braceAtCaret, braceOpposite)
@@ -392,17 +396,17 @@
 
     def OnMarginClick(self, event):
         # fold and unfold as needed
-        if evt.GetMargin() == 2:
-            if evt.GetShift() and evt.GetControl():
+        if event.GetMargin() == 2:
+            if event.GetShift() and event.GetControl():
                 self.FoldAll()
             else:
-                lineClicked = self.LineFromPosition(evt.GetPosition())
+                lineClicked = self.LineFromPosition(event.GetPosition())
 
                 if self.GetFoldLevel(lineClicked) & stc.STC_FOLDLEVELHEADERFLAG:
-                    if evt.GetShift():
+                    if event.GetShift():
                         self.SetFoldExpanded(lineClicked, True)
                         self.Expand(lineClicked, True, True, 1)
-                    elif evt.GetControl():
+                    elif event.GetControl():
                         if self.GetFoldExpanded(lineClicked):
                             self.SetFoldExpanded(lineClicked, False)
                             self.Expand(lineClicked, False, True, 0)
@@ -443,8 +447,6 @@
 
             lineNum = lineNum + 1
 
-
-
     def Expand(self, line, doExpand, force=False, visLevels=0, level=-1):
         lastChild = self.GetLastChild(line, level)
         line = line + 1
@@ -509,7 +511,7 @@
 
             self.SearchResults = [
                 (start, end, SEARCH_RESULT_HIGHLIGHT)
-                for start, end, text in
+                for start, end, _text in
                 TestTextElement(self.GetText(), search_params)]
             self.CurrentFindHighlight = None
 
@@ -548,9 +550,9 @@
                 self.RemoveHighlight(*self.CurrentFindHighlight)
             self.CurrentFindHighlight = None
 
-#-------------------------------------------------------------------------------
-#                        Highlights showing functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                        Highlights showing functions
+    # -------------------------------------------------------------------------------
 
     def OnRefreshHighlightsTimer(self, event):
         self.RefreshView(True)
@@ -575,8 +577,8 @@
 
     def RemoveHighlight(self, start, end, highlight_type):
         highlight_type = HIGHLIGHT_TYPES.get(highlight_type, None)
-        if (highlight_type is not None and
-            (start, end, highlight_type) in self.Highlights):
+        if highlight_type is not None and \
+           (start, end, highlight_type) in self.Highlights:
             self.Highlights.remove((start, end, highlight_type))
             self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
 
@@ -596,18 +598,42 @@
             self.SetStyling(len(self.GetText()) - highlight_end_pos, stc.STC_STYLE_DEFAULT)
 
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                         Helper for VariablesGrid values
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
+class AllGridCellEditor(wx.grid.GridCellTextEditor):
+    def __init__(self, table, row, col):
+        wx.grid.GridCellTextEditor.__init__(self)
+
+
+class ClassGridCellEditor(wx.grid.GridCellChoiceEditor):
+    def __init__(self, table, row, col):
+        wx.grid.GridCellChoiceEditor.__init__(self)
+        self.SetParameters("input,memory,output")
+
 
 class VariablesTable(CustomTable):
+    __defaultColumnType = dict(
+        [(name, AllGridCellEditor) for name in
+         ["Name", "Initial", "Description", "OnChange", "Options"]] +
+        [('Class', ClassGridCellEditor), ('Type', None)])
+
+    def __init__(self, *args, **kwargs):
+        my_columns = kwargs.pop("additional_columns")
+        super(VariablesTable, self).__init__(*args, **kwargs)
+        self.columnTypes = dict(self.__defaultColumnType)
+        if my_columns is not None:
+            for key in my_columns.keys():
+                if key in self.columnTypes.keys():
+                    self.columnTypes[key] = my_columns[key]
 
     def GetValue(self, row, col):
         if row < self.GetNumberRows():
             if col == 0:
                 return row + 1
             else:
-                return str(self.data[row].get(self.GetColLabelValue(col, False), ""))
+                return text(self.data[row].get(self.GetColLabelValue(col, False), ""))
 
     def _updateColAttrs(self, grid):
         """
@@ -617,23 +643,15 @@
         Otherwise default to the default renderer.
         """
 
-        typelist = None
-        accesslist = None
         for row in range(self.GetNumberRows()):
             for col in range(self.GetNumberCols()):
                 editor = None
                 renderer = None
                 colname = self.GetColLabelValue(col, False)
 
-                if colname in ["Name", "Initial", "Description", "OnChange", "Options"]:
-                    editor = wx.grid.GridCellTextEditor()
-                elif colname == "Class":
-                    editor = wx.grid.GridCellChoiceEditor()
-                    editor.SetParameters("input,memory,output")
-                elif colname == "Type":
-                    pass
-                else:
-                    grid.SetReadOnly(row, col, True)
+                editortype = self.columnTypes.get(colname, None)
+                if editortype is not None:
+                    editor = editortype(self, row, col)
 
                 grid.SetCellEditor(row, col, editor)
                 grid.SetCellRenderer(row, col, renderer)
@@ -644,7 +662,7 @@
 
 class VariablesEditor(wx.Panel):
 
-    def __init__(self, parent, window, controler):
+    def __init__(self, parent, window, controler, additional_columns=None):
         wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL)
 
         main_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=4)
@@ -660,7 +678,7 @@
                 ("UpVariableButton", "up", _("Move variable up")),
                 ("DownVariableButton", "down", _("Move variable down"))]:
             button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap),
-                  size=wx.Size(28, 28), style=wx.NO_BORDER)
+                                                    size=wx.Size(28, 28), style=wx.NO_BORDER)
             button.SetToolTipString(help)
             setattr(self, name, button)
             controls_sizer.AddWindow(button, border=5, flag=wx.BOTTOM)
@@ -676,12 +694,16 @@
         self.ParentWindow = window
         self.Controler = controler
 
-        self.VariablesDefaultValue = {"Name" : "", "Type" : DefaultType, "Initial": "",
-                                      "Description":"", "OnChange":"", "Options":""}
-        self.Table = VariablesTable(self, [], ["#", "Name","Type", "Initial",
-                                               "Description", "OnChange", "Options"])        
-        # self.Table = VariablesTable(self, [], [_("#"), _("Name"), _("Type"), _("Initial"),
-        #                                        _("Description"), _("OnChange"), _("Options")])
+        self.VariablesDefaultValue = {
+            "Name":        "LocalVar0",
+            "Type":        DefaultType,
+            "Initial":     "",
+            "Description": "",
+            "OnChange":    "",
+            "Options":     ""
+        }
+
+        self.Table = VariablesTable(self, [], self.GetVariableTableColnames(), additional_columns=additional_columns)
         self.ColAlignements = [wx.ALIGN_RIGHT] +  \
                               [wx.ALIGN_LEFT]*(len(self.VariablesDefaultValue))
         self.ColSizes = [20, 150] + [130]*(len(self.VariablesDefaultValue)-1)
@@ -694,19 +716,9 @@
         def _AddVariable(new_row):
             if new_row > 0:
                 row_content = self.Table.data[new_row - 1].copy()
-                result = VARIABLE_NAME_SUFFIX_MODEL.search(row_content["Name"])
-                if result is not None:
-                    name = row_content["Name"][:result.start(1)]
-                    suffix = result.group(1)
-                    if suffix != "":
-                        start_idx = int(suffix)
-                    else:
-                        start_idx = 0
-                else:
-                    name = row_content["Name"]
-                    start_idx = 0
-                row_content["Name"] = self.Controler.GenerateNewName(
-                        name + "%d", start_idx)
+                old_name = row_content['Name']
+                row_content['Name'] =\
+                    self.Controler.GenerateNewName(old_name, old_name+'%d')
             else:
                 row_content = self.VariablesDefaultValue.copy()
             self.Table.InsertRow(new_row, row_content)
@@ -737,6 +749,16 @@
             self.VariablesGrid.SetColSize(col, self.ColSizes[col])
         self.Table.ResetView(self.VariablesGrid)
 
+    def GetVariableTableColnames(self):
+        _ = NoTranslate
+        return ["#",
+                _("Name"),
+                _("Type"),
+                _("Initial"),
+                _("Description"),
+                _("OnChange"),
+                _("Options")]
+
     def RefreshModel(self):
         self.Controler.SetVariables(self.Table.GetData())
         self.RefreshBuffer()
@@ -757,6 +779,11 @@
     def DoGetBestSize(self):
         return self.ParentWindow.GetPanelBestSize()
 
+    def ShowErrorMessage(self, message):
+        dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
+        dialog.ShowModal()
+        dialog.Destroy()
+
     def OnVariablesGridCellChange(self, event):
         row, col = event.GetRow(), event.GetCol()
         colname = self.Table.GetColLabelValue(col, False)
@@ -780,10 +807,8 @@
             wx.CallAfter(self.RefreshView)
 
         if message is not None:
-            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
-            dialog.ShowModal()
-            dialog.Destroy()
             event.Veto()
+            wx.CallAfter(self.ShowErrorMessage, message)
         else:
             event.Skip()
 
@@ -827,7 +852,7 @@
             data_type = self.Table.GetValueByName(row, "Type")
             var_name = self.Table.GetValueByName(row, "Name")
             data = wx.TextDataObject(str((var_name, "Global", data_type,
-                    self.Controler.GetCurrentLocation())))
+                                          self.Controler.GetCurrentLocation())))
             dragSource = wx.DropSource(self.VariablesGrid)
             dragSource.SetData(data)
             dragSource.DoDragDrop()
@@ -835,28 +860,31 @@
         event.Skip()
 
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                          CodeFileEditor Main Frame Class
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 class CodeFileEditor(ConfTreeNodeEditor):
 
     CONFNODEEDITOR_TABS = []
     CODE_EDITOR = None
+    COLUMNS_TYPE = None
 
     def _create_CodePanel(self, prnt):
         self.CodeEditorPanel = wx.SplitterWindow(prnt)
         self.CodeEditorPanel.SetMinimumPaneSize(1)
 
         self.VariablesPanel = VariablesEditor(self.CodeEditorPanel,
-                self.ParentWindow, self.Controler)
+                                              self.ParentWindow,
+                                              self.Controler,
+                                              self.COLUMNS_TYPE)
 
         if self.CODE_EDITOR is not None:
             self.CodeEditor = self.CODE_EDITOR(self.CodeEditorPanel,
-                        self.ParentWindow, self.Controler)
+                                               self.ParentWindow, self.Controler)
 
             self.CodeEditorPanel.SplitHorizontally(self.VariablesPanel,
-                    self.CodeEditor, 150)
+                                                   self.CodeEditor, 150)
         else:
             self.CodeEditorPanel.Initialize(self.VariablesPanel)
 
@@ -886,4 +914,3 @@
 
     def Find(self, direction, search_params):
         self.CodeEditor.Find(direction, search_params)
-
--- a/editors/ConfTreeNodeEditor.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/editors/ConfTreeNodeEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
 #
 # See COPYING file for copyrights details.
 #
@@ -22,36 +23,40 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import os
-import types
+
+from __future__ import absolute_import
+from __future__ import division
 
 import wx
 
-from EditorPanel import EditorPanel
+from editors.EditorPanel import EditorPanel
 
 from IDEFrame import TITLE, FILEMENU, PROJECTTREE, PAGETITLES
 
 from controls import TextCtrlAutoComplete
-from dialogs import BrowseValuesLibraryDialog
+from dialogs import BrowseValuesLibraryDialog, UriEditor
 from util.BitmapLibrary import GetBitmap
 
 if wx.Platform == '__WXMSW__':
-    faces = { 'times': 'Times New Roman',
-              'mono' : 'Courier New',
-              'helv' : 'Arial',
-              'other': 'Comic Sans MS',
-              'size' : 16,
-             }
+    faces = {
+        'times': 'Times New Roman',
+        'mono':  'Courier New',
+        'helv':  'Arial',
+        'other': 'Comic Sans MS',
+        'size':  16,
+    }
 else:
-    faces = { 'times': 'Times',
-              'mono' : 'Courier',
-              'helv' : 'Helvetica',
-              'other': 'new century schoolbook',
-              'size' : 18,
-             }
+    faces = {
+        'times': 'Times',
+        'mono':  'Courier',
+        'helv':  'Helvetica',
+        'other': 'new century schoolbook',
+        'size':  18,
+    }
 
 SCROLLBAR_UNIT = 10
 
+
 class GenBitmapTextButton(wx.lib.buttons.GenBitmapTextButton):
     def _GetLabelSize(self):
         """ used internally """
@@ -70,17 +75,17 @@
 
     def DrawLabel(self, dc, width, height, dw=0, dy=0):
         bmp = self.bmpLabel
-        if bmp != None:     # if the bitmap is used
+        if bmp is not None:     # if the bitmap is used
             if self.bmpDisabled and not self.IsEnabled():
                 bmp = self.bmpDisabled
             if self.bmpFocus and self.hasFocus:
                 bmp = self.bmpFocus
             if self.bmpSelected and not self.up:
                 bmp = self.bmpSelected
-            bw,bh = bmp.GetWidth(), bmp.GetHeight()
+            bw, bh = bmp.GetWidth(), bmp.GetHeight()
             if not self.up:
                 dw = dy = self.labelDelta
-            hasMask = bmp.GetMask() != None
+            hasMask = bmp.GetMask() is not None
         else:
             bw = bh = 0     # no bitmap -> size is zero
 
@@ -95,11 +100,11 @@
         if not self.up:
             dw = dy = self.labelDelta
 
-        pos_x = (width-bw)/2+dw      # adjust for bitmap and text to centre
-        pos_y = (height-bh-th)/2+dy
-        if bmp !=None:
-            dc.DrawBitmap(bmp, pos_x, pos_y, hasMask) # draw bitmap if available
-            pos_x = (width-tw)/2+dw      # adjust for bitmap and text to centre
+        pos_x = (width - bw) // 2 + dw      # adjust for bitmap and text to centre
+        pos_y = (height - bh - th) // 2 + dy
+        if bmp is not None:
+            dc.DrawBitmap(bmp, pos_x, pos_y, hasMask)  # draw bitmap if available
+            pos_x = (width-tw)//2+dw      # adjust for bitmap and text to centre
             pos_y += bh + 2
 
         dc.DrawText(label, pos_x, pos_y)      # draw the text
@@ -109,19 +114,20 @@
     """ Customized GenStaticBitmap, fix transparency redraw bug on wx2.8/win32,
     and accept image name as __init__ parameter, fail silently if file do not exist"""
     def __init__(self, parent, ID, bitmapname,
-                 pos = wx.DefaultPosition, size = wx.DefaultSize,
-                 style = 0,
-                 name = "genstatbmp"):
+                 pos=wx.DefaultPosition, size=wx.DefaultSize,
+                 style=0,
+                 name="genstatbmp"):
 
         bitmap = GetBitmap(bitmapname)
         if bitmap is None:
             bitmap = wx.EmptyBitmap(0, 0)
 
         wx.StaticBitmap.__init__(self, parent, ID,
-                 bitmap,
-                 pos, size,
-                 style,
-                 name)
+                                 bitmap,
+                                 pos, size,
+                                 style,
+                                 name)
+
 
 class ConfTreeNodeEditor(EditorPanel):
 
@@ -136,48 +142,54 @@
 
         if tabs_num > 1 or self.SHOW_BASE_PARAMS:
             self.Editor = wx.Panel(parent,
-                style=wx.SUNKEN_BORDER|wx.SP_3D)
+                                   style=wx.SUNKEN_BORDER | wx.SP_3D)
 
             self.MainSizer = wx.BoxSizer(wx.VERTICAL)
 
             if self.SHOW_BASE_PARAMS:
                 baseparamseditor_sizer = wx.BoxSizer(wx.HORIZONTAL)
                 self.MainSizer.AddSizer(baseparamseditor_sizer, border=5,
-                      flag=wx.GROW|wx.ALL)
+                                        flag=wx.GROW | wx.ALL)
 
                 self.FullIECChannel = wx.StaticText(self.Editor, -1)
                 self.FullIECChannel.SetFont(
                     wx.Font(faces["size"], wx.DEFAULT, wx.NORMAL,
-                            wx.BOLD, faceName = faces["helv"]))
+                            wx.BOLD, faceName=faces["helv"]))
                 baseparamseditor_sizer.AddWindow(self.FullIECChannel,
-                      flag=wx.ALIGN_CENTER_VERTICAL)
+                                                 flag=wx.ALIGN_CENTER_VERTICAL)
 
                 updownsizer = wx.BoxSizer(wx.VERTICAL)
                 baseparamseditor_sizer.AddSizer(updownsizer, border=5,
-                      flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL)
-
-                self.IECCUpButton = wx.lib.buttons.GenBitmapTextButton(self.Editor,
-                      bitmap=GetBitmap('IECCDown'), size=wx.Size(16, 16), style=wx.NO_BORDER)
+                                                flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL)
+
+                self.IECCUpButton = wx.lib.buttons.GenBitmapTextButton(
+                    self.Editor,
+                    bitmap=GetBitmap('IECCDown'),
+                    size=wx.Size(16, 16),
+                    style=wx.NO_BORDER)
                 self.IECCUpButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(1),
-                      self.IECCUpButton)
+                                       self.IECCUpButton)
                 updownsizer.AddWindow(self.IECCUpButton, flag=wx.ALIGN_LEFT)
 
-                self.IECCDownButton = wx.lib.buttons.GenBitmapButton(self.Editor,
-                      bitmap=GetBitmap('IECCUp'), size=wx.Size(16, 16), style=wx.NO_BORDER)
+                self.IECCDownButton = wx.lib.buttons.GenBitmapButton(
+                    self.Editor, bitmap=GetBitmap('IECCUp'),
+                    size=wx.Size(16, 16), style=wx.NO_BORDER)
                 self.IECCDownButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(-1),
-                      self.IECCDownButton)
+                                         self.IECCDownButton)
                 updownsizer.AddWindow(self.IECCDownButton, flag=wx.ALIGN_LEFT)
 
                 self.ConfNodeName = wx.TextCtrl(self.Editor,
-                      size=wx.Size(150, 25))
+                                                size=wx.Size(150, 25))
                 self.ConfNodeName.SetFont(
                     wx.Font(faces["size"] * 0.75, wx.DEFAULT, wx.NORMAL,
-                            wx.BOLD, faceName = faces["helv"]))
-                self.ConfNodeName.Bind(wx.EVT_TEXT,
-                      self.GetTextCtrlCallBackFunction(self.ConfNodeName, "BaseParams.Name", True),
-                      self.ConfNodeName)
-                baseparamseditor_sizer.AddWindow(self.ConfNodeName, border=5,
-                      flag=wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
+                            wx.BOLD, faceName=faces["helv"]))
+                self.ConfNodeName.Bind(
+                    wx.EVT_TEXT,
+                    self.GetTextCtrlCallBackFunction(self.ConfNodeName, "BaseParams.Name", True),
+                    self.ConfNodeName)
+                baseparamseditor_sizer.AddWindow(
+                    self.ConfNodeName, border=5,
+                    flag=wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER_VERTICAL)
 
                 buttons_sizer = self.GenerateMethodButtonSizer()
                 baseparamseditor_sizer.AddSizer(buttons_sizer, flag=wx.ALIGN_CENTER)
@@ -206,11 +218,11 @@
 
         if self.SHOW_PARAMS and len(self.Controler.GetParamsAttributes()) > 0:
 
-            panel_style = wx.TAB_TRAVERSAL|wx.HSCROLL|wx.VSCROLL
+            panel_style = wx.TAB_TRAVERSAL | wx.HSCROLL | wx.VSCROLL
             if self.ConfNodeNoteBook is None and parent != self.Editor:
                 panel_style |= wx.SUNKEN_BORDER
             self.ParamsEditor = wx.ScrolledWindow(parent,
-                  style=panel_style)
+                                                  style=panel_style)
             self.ParamsEditor.Bind(wx.EVT_SIZE, self.OnParamsEditorResize)
             self.ParamsEditor.Bind(wx.EVT_SCROLLWIN, self.OnParamsEditorScroll)
 
@@ -221,7 +233,7 @@
 
             self.ConfNodeParamsSizer = wx.BoxSizer(wx.VERTICAL)
             self.ParamsEditorSizer.AddSizer(self.ConfNodeParamsSizer, border=5,
-                  flag=wx.LEFT|wx.RIGHT|wx.BOTTOM)
+                                            flag=wx.LEFT | wx.RIGHT | wx.BOTTOM)
 
             self.RefreshConfNodeParamsSizer()
 
@@ -293,16 +305,17 @@
         self.Thaw()
 
     def GenerateMethodButtonSizer(self):
-        normal_bt_font=wx.Font(faces["size"] / 3, wx.DEFAULT, wx.NORMAL, wx.NORMAL, faceName = faces["helv"])
-        mouseover_bt_font=wx.Font(faces["size"] / 3, wx.DEFAULT, wx.NORMAL, wx.NORMAL, underline=True, faceName = faces["helv"])
+        normal_bt_font = wx.Font(faces["size"] // 3,    wx.DEFAULT, wx.NORMAL, wx.NORMAL, faceName=faces["helv"])
+        mouseover_bt_font = wx.Font(faces["size"] // 3, wx.DEFAULT, wx.NORMAL, wx.NORMAL, faceName=faces["helv"], underline=True)
 
         msizer = wx.BoxSizer(wx.HORIZONTAL)
 
         for confnode_method in self.Controler.ConfNodeMethods:
-            if "method" in confnode_method and confnode_method.get("shown",True):
+            if "method" in confnode_method and confnode_method.get("shown", True):
                 button = GenBitmapTextButton(self.Editor,
-                    bitmap=GetBitmap(confnode_method.get("bitmap", "Unknown")),
-                    label=confnode_method["name"], style=wx.NO_BORDER)
+                                             bitmap=GetBitmap(confnode_method.get("bitmap", "Unknown")),
+                                             label=confnode_method["name"],
+                                             style=wx.NO_BORDER)
                 button.SetFont(normal_bt_font)
                 button.SetToolTipString(confnode_method["tooltip"])
                 if confnode_method.get("push", False):
@@ -310,6 +323,7 @@
                 else:
                     button.Bind(wx.EVT_BUTTON, self.GetButtonCallBackFunction(confnode_method["method"]), button)
                 # a fancy underline on mouseover
+
                 def setFontStyle(b, s):
                     def fn(event):
                         b.SetFont(s)
@@ -318,19 +332,40 @@
                     return fn
                 button.Bind(wx.EVT_ENTER_WINDOW, setFontStyle(button, mouseover_bt_font))
                 button.Bind(wx.EVT_LEAVE_WINDOW, setFontStyle(button, normal_bt_font))
-                #hack to force size to mini
-                if not confnode_method.get("enabled",True):
+                # hack to force size to mini
+                if not confnode_method.get("enabled", True):
                     button.Disable()
                 msizer.AddWindow(button, flag=wx.ALIGN_CENTER)
         return msizer
 
-    def GenerateSizerElements(self, sizer, elements, path, clean = True):
+    def UriOptions(self, event):
+        CTR = self.ParentWindow.CTR
+        CTR_BeremizRoot = CTR.BeremizRoot
+        CTR_AppFrame = CTR.AppFrame
+
+        # Get connector uri
+        uri = CTR_BeremizRoot.getURI_location().strip()
+        dialog = UriEditor(CTR_AppFrame, CTR, uri)
+
+        if dialog.ShowModal() == wx.ID_OK:
+            CTR_BeremizRoot.setURI_location(dialog.GetURI())
+            if CTR._View is not None:
+                CTR._View.RefreshView()
+            if CTR_AppFrame is not None:
+                CTR_AppFrame.RefreshTitle()
+                CTR_AppFrame.RefreshFileMenu()
+                CTR_AppFrame.RefreshEditMenu()
+                CTR_AppFrame.RefreshPageTitles()
+
+        dialog.Destroy()
+
+    def GenerateSizerElements(self, sizer, elements, path, clean=True):
         if clean:
             sizer.Clear(True)
         first = True
         for element_infos in elements:
             if path:
-                element_path = "%s.%s"%(path, element_infos["name"])
+                element_path = "%s.%s" % (path, element_infos["name"])
             else:
                 element_path = element_infos["name"]
             if element_infos["type"] == "element":
@@ -340,7 +375,7 @@
                 if value is not None:
                     label += " - %s" % _(value)
                 staticbox = wx.StaticBox(self.ParamsEditor,
-                      label=_(label), size=wx.Size(10, 0))
+                                         label=_(label), size=wx.Size(10, 0))
                 staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL)
                 flags = (wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
                 if first:
@@ -356,23 +391,24 @@
                 if first:
                     flags |= wx.TOP
                 sizer.AddSizer(boxsizer, border=5, flag=flags)
-                staticbitmap = GenStaticBitmap(ID=-1, bitmapname=element_infos["name"],
-                    name="%s_bitmap"%element_infos["name"], parent=self.ParamsEditor,
+                staticbitmap = GenStaticBitmap(
+                    ID=-1, bitmapname=element_infos["name"],
+                    name="%s_bitmap" % element_infos["name"], parent=self.ParamsEditor,
                     pos=wx.Point(0, 0), size=wx.Size(24, 24), style=0)
                 boxsizer.AddWindow(staticbitmap, border=5, flag=wx.RIGHT)
 
                 statictext = wx.StaticText(self.ParamsEditor,
-                      label="%s:"%_(element_infos["name"]))
+                                           label="%s:" % _(element_infos["name"]))
                 boxsizer.AddWindow(statictext, border=5,
-                      flag=wx.ALIGN_CENTER_VERTICAL|wx.RIGHT)
-
-                if isinstance(element_infos["type"], types.ListType):
-                    if isinstance(element_infos["value"], types.TupleType):
+                                   flag=wx.ALIGN_CENTER_VERTICAL | wx.RIGHT)
+
+                if isinstance(element_infos["type"], list):
+                    if isinstance(element_infos["value"], tuple):
                         browse_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
                         boxsizer.AddSizer(browse_boxsizer)
 
                         textctrl = wx.TextCtrl(self.ParamsEditor,
-                              size=wx.Size(275, -1), style=wx.TE_READONLY)
+                                               size=wx.Size(275, -1), style=wx.TE_READONLY)
                         if element_infos["value"] is not None:
                             textctrl.SetValue(element_infos["value"][0])
                             value_infos = element_infos["value"][1]
@@ -380,8 +416,7 @@
                             value_infos = None
                         browse_boxsizer.AddWindow(textctrl)
 
-                        button = wx.Button(self.ParamsEditor,
-                              label="...", size=wx.Size(25, 25))
+                        button = wx.Button(self.ParamsEditor, label="...")
                         browse_boxsizer.AddWindow(button)
                         button.Bind(wx.EVT_BUTTON,
                                     self.GetBrowseCallBackFunction(element_infos["name"], textctrl, element_infos["type"],
@@ -389,19 +424,20 @@
                                     button)
                     else:
                         combobox = wx.ComboBox(self.ParamsEditor,
-                              size=wx.Size(300, -1), style=wx.CB_READONLY)
+                                               size=wx.Size(300, -1), style=wx.CB_READONLY)
                         boxsizer.AddWindow(combobox)
 
                         if element_infos["use"] == "optional":
                             combobox.Append("")
-                        if len(element_infos["type"]) > 0 and isinstance(element_infos["type"][0], types.TupleType):
-                            for choice, xsdclass in element_infos["type"]:
+                        if len(element_infos["type"]) > 0 and isinstance(element_infos["type"][0], tuple):
+                            for choice, _xsdclass in element_infos["type"]:
                                 combobox.Append(choice)
                             name = element_infos["name"]
                             value = element_infos["value"]
 
                             staticbox = wx.StaticBox(self.ParamsEditor,
-                                  label="%s - %s"%(_(name), _(value)), size=wx.Size(10, 0))
+                                                     label="%s - %s" % (_(name), _(value)),
+                                                     size=wx.Size(10, 0))
                             staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL)
                             sizer.AddSizer(staticboxsizer, border=5, flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
                             self.GenerateSizerElements(staticboxsizer, element_infos["children"], element_path)
@@ -416,7 +452,7 @@
                             combobox.SetStringSelection(element_infos["value"])
                         combobox.Bind(wx.EVT_COMBOBOX, callback, combobox)
 
-                elif isinstance(element_infos["type"], types.DictType):
+                elif isinstance(element_infos["type"], dict):
                     scmin = -(2**31)
                     scmax = 2**31-1
                     if "min" in element_infos["type"]:
@@ -424,7 +460,8 @@
                     if "max" in element_infos["type"]:
                         scmax = element_infos["type"]["max"]
                     spinctrl = wx.SpinCtrl(self.ParamsEditor,
-                          size=wx.Size(300, -1), style=wx.SP_ARROW_KEYS|wx.ALIGN_RIGHT)
+                                           size=wx.Size(300, -1),
+                                           style=wx.SP_ARROW_KEYS | wx.ALIGN_RIGHT)
                     spinctrl.SetRange(scmin, scmax)
                     boxsizer.AddWindow(spinctrl)
                     if element_infos["value"] is not None:
@@ -443,14 +480,15 @@
                                       self.GetCheckBoxCallBackFunction(checkbox, element_path),
                                       checkbox)
 
-                    elif element_infos["type"] in ["unsignedLong", "long","integer"]:
+                    elif element_infos["type"] in ["unsignedLong", "long", "integer"]:
                         if element_infos["type"].startswith("unsigned"):
                             scmin = 0
                         else:
                             scmin = -(2**31)
                         scmax = 2**31-1
                         spinctrl = wx.SpinCtrl(self.ParamsEditor,
-                              size=wx.Size(300, -1), style=wx.SP_ARROW_KEYS|wx.ALIGN_RIGHT)
+                                               size=wx.Size(300, -1),
+                                               style=wx.SP_ARROW_KEYS | wx.ALIGN_RIGHT)
                         spinctrl.SetRange(scmin, scmax)
                         boxsizer.AddWindow(spinctrl)
                         if element_infos["value"] is not None:
@@ -467,21 +505,35 @@
                                                         element_path=element_path,
                                                         size=wx.Size(300, -1))
 
-                        boxsizer.AddWindow(textctrl)
+                        if element_infos["name"] == "URI_location":
+                            uriSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
+                            uriSizer.AddGrowableCol(0)
+                            uriSizer.AddGrowableRow(0)
+
+                            self.EditButton = wx.Button(self.ParamsEditor, label='...', size=wx.Size(30, -1))
+                            self.Bind(wx.EVT_BUTTON, self.UriOptions, self.EditButton)
+
+                            uriSizer.AddWindow(textctrl, flag=wx.GROW)
+                            uriSizer.AddWindow(self.EditButton, flag=wx.GROW)
+
+                            boxsizer.AddWindow(uriSizer)
+                        else:
+                            boxsizer.AddWindow(textctrl)
+
                         if element_infos["value"] is not None:
                             textctrl.ChangeValue(str(element_infos["value"]))
                         callback = self.GetTextCtrlCallBackFunction(textctrl, element_path)
                         textctrl.Bind(wx.EVT_TEXT_ENTER, callback)
+                        textctrl.Bind(wx.EVT_TEXT, callback)
                         textctrl.Bind(wx.EVT_KILL_FOCUS, callback)
             first = False
         sizer.Layout()
         self.RefreshScrollbars()
 
-
     def GetItemChannelChangedFunction(self, dir):
         def OnConfNodeTreeItemChannelChanged(event):
             confnode_IECChannel = self.Controler.BaseParams.getIEC_Channel()
-            res = self.SetConfNodeParamsAttribute("BaseParams.IEC_Channel", confnode_IECChannel + dir)
+            self.SetConfNodeParamsAttribute("BaseParams.IEC_Channel", confnode_IECChannel + dir)
             wx.CallAfter(self.RefreshIECChannelControlsState)
             wx.CallAfter(self.ParentWindow._Refresh, TITLE, FILEMENU, PROJECTTREE)
             event.Skip()
@@ -500,7 +552,7 @@
             # Disable button to prevent re-entrant call
             event.GetEventObject().Disable()
             # Call
-            getattr(self.Controler,method)()
+            getattr(self.Controler, method)()
             # Re-enable button
             event.GetEventObject().Enable()
 
@@ -519,7 +571,7 @@
 
     def GetChoiceContentCallBackFunction(self, choicectrl, staticboxsizer, path):
         def OnChoiceContentChanged(event):
-            res = self.SetConfNodeParamsAttribute(path, choicectrl.GetStringSelection())
+            self.SetConfNodeParamsAttribute(path, choicectrl.GetStringSelection())
             wx.CallAfter(self.RefreshConfNodeParamsSizer)
             event.Skip()
         return OnChoiceContentChanged
@@ -547,6 +599,7 @@
 
     def GetBrowseCallBackFunction(self, name, textctrl, library, value_infos, path):
         infos = [value_infos]
+
         def OnBrowseButton(event):
             dialog = BrowseValuesLibraryDialog(self, name, library, infos[0])
             if dialog.ShowModal() == wx.ID_OK:
@@ -562,11 +615,13 @@
         xstart, ystart = self.ParamsEditor.GetViewStart()
         window_size = self.ParamsEditor.GetClientSize()
         maxx, maxy = self.ParamsEditorSizer.GetMinSize()
-        posx = max(0, min(xstart, (maxx - window_size[0]) / SCROLLBAR_UNIT))
-        posy = max(0, min(ystart, (maxy - window_size[1]) / SCROLLBAR_UNIT))
+        posx = max(0, min(xstart, (maxx - window_size[0]) // SCROLLBAR_UNIT))
+        posy = max(0, min(ystart, (maxy - window_size[1]) // SCROLLBAR_UNIT))
         self.ParamsEditor.Scroll(posx, posy)
         self.ParamsEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
-                maxx / SCROLLBAR_UNIT, maxy / SCROLLBAR_UNIT, posx, posy)
+                                        maxx // SCROLLBAR_UNIT,
+                                        maxy // SCROLLBAR_UNIT,
+                                        posx, posy)
 
     def OnParamsEditorResize(self, event):
         self.RefreshScrollbars()
@@ -578,4 +633,3 @@
             control.DismissListBox()
             self.Refresh()
         event.Skip()
-
--- a/editors/DataTypeEditor.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/editors/DataTypeEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -22,41 +23,47 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import re
-from types import TupleType
+from six.moves import xrange
 
 import wx
 import wx.grid
 import wx.lib.buttons
-
 from plcopen.structures import IEC_KEYWORDS, TestIdentifier, DefaultType
 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
-from controls import CustomEditableListBox, CustomGrid, CustomTable
+from controls import CustomEditableListBox, CustomGrid, CustomTable, CustomIntCtrl
 from dialogs import ArrayTypeDialog
-from EditorPanel import EditorPanel
+from editors.EditorPanel import EditorPanel
 from util.BitmapLibrary import GetBitmap
-
-#-------------------------------------------------------------------------------
+from util.TranslationCatalogs import NoTranslate
+
+# -------------------------------------------------------------------------------
 #                                    Helpers
-#-------------------------------------------------------------------------------
-
-DIMENSION_MODEL = re.compile("([0-9]+)\.\.([0-9]+)$")
+# -------------------------------------------------------------------------------
+
+DIMENSION_MODEL = re.compile(r"([0-9]+)\.\.([0-9]+)$")
+
 
 def AppendMenu(parent, help, id, kind, text):
     parent.Append(help=help, id=id, kind=kind, text=text)
 
+
 def GetElementsTableColnames():
-    _ = lambda x : x
+    _ = NoTranslate
     return ["#", _("Name"), _("Type"), _("Initial Value")]
 
+
 def GetDatatypeTypes():
-    _ = lambda x : x
+    _ = NoTranslate
     return [_("Directly"), _("Subrange"), _("Enumerated"), _("Array"), _("Structure")]
-DATATYPE_TYPES_DICT = dict([(_(datatype), datatype) for datatype in GetDatatypeTypes()])
-
-#-------------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------------
 #                            Structure Elements Table
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 class ElementsTable(CustomTable):
 
@@ -74,10 +81,10 @@
                 return row + 1
             colname = self.GetColLabelValue(col, False)
             value = self.data[row].get(colname, "")
-               
-            if colname == "Type" and isinstance(value, TupleType):
+
+            if colname == "Type" and isinstance(value, tuple):
                 if value[0] == "array":
-                    return "ARRAY [%s] OF %s" % (",".join(map(lambda x : "..".join(x), value[2])), value[1])
+                    return "ARRAY [%s] OF %s" % (",".join(map("..".join, value[2])), value[1])
             return value
 
     def SetValue(self, row, col, value):
@@ -133,9 +140,10 @@
             col_highlights = row_highlights.setdefault(infos[1], [])
         col_highlights.append(highlight_type)
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                          Datatype Editor class
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 class DataTypeEditor(EditorPanel):
 
@@ -148,21 +156,21 @@
 
         top_sizer = wx.BoxSizer(wx.HORIZONTAL)
         self.MainSizer.AddSizer(top_sizer, border=5,
-              flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
+                                flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         derivation_type_label = wx.StaticText(self.Editor, label=_('Derivation Type:'))
         top_sizer.AddWindow(derivation_type_label, border=5,
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT)
+                            flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT)
 
         self.DerivationType = wx.ComboBox(self.Editor,
-              size=wx.Size(200, -1), style=wx.CB_READONLY)
+                                          size=wx.Size(200, -1), style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnDerivationTypeChanged, self.DerivationType)
-        top_sizer.AddWindow(self.DerivationType, border=5, flag=wx.GROW|wx.RIGHT)
+        top_sizer.AddWindow(self.DerivationType, border=5, flag=wx.GROW | wx.RIGHT)
 
         typeinfos_staticbox = wx.StaticBox(self.Editor, label=_('Type infos:'))
         typeinfos_sizer = wx.StaticBoxSizer(typeinfos_staticbox, wx.HORIZONTAL)
         self.MainSizer.AddSizer(typeinfos_sizer, border=5,
-              flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
+                                flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         # Panel for Directly derived data types
 
@@ -172,25 +180,25 @@
         directly_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
 
         directly_basetype_label = wx.StaticText(self.DirectlyPanel,
-              label=_('Base Type:'))
+                                                label=_('Base Type:'))
         directly_panel_sizer.AddWindow(directly_basetype_label, 1, border=5,
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+                                       flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.DirectlyBaseType = wx.ComboBox(self.DirectlyPanel, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.DirectlyBaseType)
         directly_panel_sizer.AddWindow(self.DirectlyBaseType, 1, border=5,
-              flag=wx.GROW|wx.ALL)
+                                       flag=wx.GROW | wx.ALL)
 
         directly_initialvalue_label = wx.StaticText(self.DirectlyPanel,
-              label=_('Initial Value:'))
+                                                    label=_('Initial Value:'))
         directly_panel_sizer.AddWindow(directly_initialvalue_label, 1, border=5,
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+                                       flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.DirectlyInitialValue = wx.TextCtrl(self.DirectlyPanel,
-              style=wx.TE_PROCESS_ENTER|wx.TE_RICH)
+                                                style=wx.TE_PROCESS_ENTER | wx.TE_RICH)
         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.DirectlyInitialValue)
         directly_panel_sizer.AddWindow(self.DirectlyInitialValue, 1, border=5,
-              flag=wx.ALL)
+                                       flag=wx.ALL)
 
         self.DirectlyPanel.SetSizer(directly_panel_sizer)
 
@@ -202,49 +210,48 @@
         subrange_panel_sizer = wx.GridSizer(cols=4, hgap=5, rows=3, vgap=0)
 
         subrange_basetype_label = wx.StaticText(self.SubrangePanel,
-              label=_('Base Type:'))
+                                                label=_('Base Type:'))
         subrange_panel_sizer.AddWindow(subrange_basetype_label, 1, border=5,
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+                                       flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.SubrangeBaseType = wx.ComboBox(self.SubrangePanel, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged,
-              self.SubrangeBaseType)
+                  self.SubrangeBaseType)
         subrange_panel_sizer.AddWindow(self.SubrangeBaseType, 1, border=5,
-              flag=wx.GROW|wx.ALL)
+                                       flag=wx.GROW | wx.ALL)
 
         subrange_initialvalue_label = wx.StaticText(self.SubrangePanel,
-              label=_('Initial Value:'))
+                                                    label=_('Initial Value:'))
         subrange_panel_sizer.AddWindow(subrange_initialvalue_label, 1, border=5,
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
-
-        self.SubrangeInitialValue = wx.SpinCtrl(self.SubrangePanel,
-              style=wx.TAB_TRAVERSAL)
-        self.Bind(wx.EVT_SPINCTRL, self.OnInfosChanged, self.SubrangeInitialValue)
+                                       flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+
+        self.SubrangeInitialValue = CustomIntCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
+        self.SubrangeInitialValue.Bind(CustomIntCtrl.EVT_CUSTOM_INT, self.OnInfosChanged)
         subrange_panel_sizer.AddWindow(self.SubrangeInitialValue, 1, border=5,
-              flag=wx.GROW|wx.ALL)
+                                       flag=wx.GROW | wx.ALL)
 
         subrange_minimum_label = wx.StaticText(self.SubrangePanel, label=_('Minimum:'))
         subrange_panel_sizer.AddWindow(subrange_minimum_label, 1, border=5,
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
-
-        self.SubrangeMinimum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
-        self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMinimumChanged, self.SubrangeMinimum)
+                                       flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+
+        self.SubrangeMinimum = CustomIntCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
+        self.SubrangeMinimum.Bind(CustomIntCtrl.EVT_CUSTOM_INT, self.OnSubrangeMinimumChanged)
         subrange_panel_sizer.AddWindow(self.SubrangeMinimum, 1, border=5,
-              flag=wx.GROW|wx.ALL)
-
-        for i in xrange(2):
+                                       flag=wx.GROW | wx.ALL)
+
+        for dummy in xrange(2):
             subrange_panel_sizer.AddWindow(wx.Size(0, 0), 1)
 
         subrange_maximum_label = wx.StaticText(self.SubrangePanel,
-              label=_('Maximum:'))
+                                               label=_('Maximum:'))
         subrange_panel_sizer.AddWindow(subrange_maximum_label, 1, border=5,
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
-
-        self.SubrangeMaximum = wx.SpinCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
-        self.Bind(wx.EVT_SPINCTRL, self.OnSubrangeMaximumChanged, self.SubrangeMaximum)
+                                       flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
+
+        self.SubrangeMaximum = CustomIntCtrl(self.SubrangePanel, style=wx.TAB_TRAVERSAL)
+        self.SubrangeMaximum.Bind(CustomIntCtrl.EVT_CUSTOM_INT, self.OnSubrangeMaximumChanged)
 
         subrange_panel_sizer.AddWindow(self.SubrangeMaximum, 1, border=5,
-              flag=wx.GROW|wx.ALL)
+                                       flag=wx.GROW | wx.ALL)
 
         self.SubrangePanel.SetSizer(subrange_panel_sizer)
 
@@ -255,29 +262,32 @@
 
         enumerated_panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
 
-        self.EnumeratedValues = CustomEditableListBox(self.EnumeratedPanel,
-              label=_("Values:"), style=wx.gizmos.EL_ALLOW_NEW|
-                                        wx.gizmos.EL_ALLOW_EDIT|
-                                        wx.gizmos.EL_ALLOW_DELETE)
+        self.EnumeratedValues = CustomEditableListBox(
+            self.EnumeratedPanel,
+            label=_("Values:"),
+            style=(wx.gizmos.EL_ALLOW_NEW |
+                   wx.gizmos.EL_ALLOW_EDIT |
+                   wx.gizmos.EL_ALLOW_DELETE))
         setattr(self.EnumeratedValues, "_OnLabelEndEdit", self.OnEnumeratedValueEndEdit)
         for func in ["_OnAddButton", "_OnDelButton", "_OnUpButton", "_OnDownButton"]:
             setattr(self.EnumeratedValues, func, self.OnEnumeratedValuesChanged)
         enumerated_panel_sizer.AddWindow(self.EnumeratedValues, 1, border=5,
-              flag=wx.GROW|wx.ALL)
+                                         flag=wx.GROW | wx.ALL)
 
         enumerated_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
         enumerated_panel_sizer.AddSizer(enumerated_panel_rightsizer, 1)
 
         enumerated_initialvalue_label = wx.StaticText(self.EnumeratedPanel,
-              label=_('Initial Value:'))
+                                                      label=_('Initial Value:'))
         enumerated_panel_rightsizer.AddWindow(enumerated_initialvalue_label, 1,
-              border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+                                              border=5,
+                                              flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.EnumeratedInitialValue = wx.ComboBox(self.EnumeratedPanel,
-              style=wx.CB_READONLY)
+                                                  style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.EnumeratedInitialValue)
         enumerated_panel_rightsizer.AddWindow(self.EnumeratedInitialValue, 1,
-              border=5, flag=wx.ALL)
+                                              border=5, flag=wx.ALL)
 
         self.EnumeratedPanel.SetSizer(enumerated_panel_sizer)
 
@@ -296,36 +306,38 @@
 
         array_basetype_label = wx.StaticText(self.ArrayPanel, label=_('Base Type:'))
         array_panel_leftSizer.AddWindow(array_basetype_label, 1, border=5,
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+                                        flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.ArrayBaseType = wx.ComboBox(self.ArrayPanel, style=wx.CB_READONLY)
         self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, self.ArrayBaseType)
         array_panel_leftSizer.AddWindow(self.ArrayBaseType, 1, border=5,
-              flag=wx.GROW|wx.ALL)
+                                        flag=wx.GROW | wx.ALL)
 
         array_panel_rightsizer = wx.BoxSizer(wx.HORIZONTAL)
         array_panel_sizer.AddSizer(array_panel_rightsizer, flag=wx.GROW)
 
         array_initialvalue_label = wx.StaticText(self.ArrayPanel,
-              label=_('Initial Value:'))
+                                                 label=_('Initial Value:'))
         array_panel_rightsizer.AddWindow(array_initialvalue_label, 1, border=5,
-              flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
+                                         flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
 
         self.ArrayInitialValue = wx.TextCtrl(self.ArrayPanel,
-              style=wx.TE_PROCESS_ENTER|wx.TE_RICH)
+                                             style=wx.TE_PROCESS_ENTER | wx.TE_RICH)
         self.Bind(wx.EVT_TEXT_ENTER, self.OnReturnKeyPressed, self.ArrayInitialValue)
         array_panel_rightsizer.AddWindow(self.ArrayInitialValue, 1, border=5,
-              flag=wx.ALL)
-
-        self.ArrayDimensions = CustomEditableListBox(self.ArrayPanel,
-              label=_("Dimensions:"), style=wx.gizmos.EL_ALLOW_NEW|
-                                            wx.gizmos.EL_ALLOW_EDIT|
-                                            wx.gizmos.EL_ALLOW_DELETE)
+                                         flag=wx.ALL)
+
+        self.ArrayDimensions = CustomEditableListBox(
+            self.ArrayPanel,
+            label=_("Dimensions:"),
+            style=(wx.gizmos.EL_ALLOW_NEW |
+                   wx.gizmos.EL_ALLOW_EDIT |
+                   wx.gizmos.EL_ALLOW_DELETE))
         for func in ["_OnLabelEndEdit", "_OnAddButton", "_OnDelButton",
                      "_OnUpButton", "_OnDownButton"]:
             setattr(self.ArrayDimensions, func, self.OnDimensionsChanged)
         array_panel_sizer.AddWindow(self.ArrayDimensions, 0, border=5,
-              flag=wx.GROW|wx.ALL)
+                                    flag=wx.GROW | wx.ALL)
 
         self.ArrayPanel.SetSizer(array_panel_sizer)
 
@@ -342,10 +354,10 @@
         structure_button_sizer.AddGrowableCol(0)
         structure_button_sizer.AddGrowableRow(0)
         structure_panel_sizer.AddSizer(structure_button_sizer, 0, border=5,
-              flag=wx.ALL|wx.GROW)
+                                       flag=wx.ALL | wx.GROW)
 
         structure_elements_label = wx.StaticText(self.StructurePanel,
-              label=_('Elements :'))
+                                                 label=_('Elements :'))
         structure_button_sizer.AddWindow(structure_elements_label, flag=wx.ALIGN_BOTTOM)
 
         for name, bitmap, help in [
@@ -354,17 +366,19 @@
                 ("StructureUpButton", "up", _("Move element up")),
                 ("StructureDownButton", "down", _("Move element down"))]:
             button = wx.lib.buttons.GenBitmapButton(self.StructurePanel,
-                  bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
+                                                    bitmap=GetBitmap(bitmap),
+                                                    size=wx.Size(28, 28),
+                                                    style=wx.NO_BORDER)
             button.SetToolTipString(help)
             setattr(self, name, button)
             structure_button_sizer.AddWindow(button)
 
         self.StructureElementsGrid = CustomGrid(self.StructurePanel,
-              size=wx.Size(0, 150), style=wx.VSCROLL)
+                                                size=wx.Size(0, 150), style=wx.VSCROLL)
         self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
-              self.OnStructureElementsGridCellChange)
+                                        self.OnStructureElementsGridCellChange)
         self.StructureElementsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
-              self.OnStructureElementsGridEditorShown)
+                                        self.OnStructureElementsGridEditorShown)
         structure_panel_sizer.AddWindow(self.StructureElementsGrid, flag=wx.GROW)
 
         self.StructurePanel.SetSizer(structure_panel_sizer)
@@ -374,7 +388,7 @@
     def __init__(self, parent, tagname, window, controler):
         EditorPanel.__init__(self, parent, tagname, window, controler)
 
-        self.StructureElementDefaultValue = {"Name" : "", "Type" : DefaultType, "Initial Value" : ""}
+        self.StructureElementDefaultValue = {"Name": "", "Type": DefaultType, "Initial Value": ""}
         self.StructureElementsTable = ElementsTable(self, [], GetElementsTableColnames())
         self.StructureColSizes = [40, 150, 100, 250]
         self.StructureColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
@@ -385,6 +399,8 @@
                                                "Up": self.StructureUpButton,
                                                "Down": self.StructureDownButton})
 
+        self.DATATYPE_TYPES_DICT = dict([(_(datatype), datatype) for datatype in GetDatatypeTypes()])
+
         def _AddStructureElement(new_row):
             self.StructureElementsTable.InsertRow(new_row, self.StructureElementDefaultValue.copy())
             self.RefreshTypeInfos()
@@ -496,7 +512,7 @@
                 self.EnumeratedInitialValue.SetStringSelection(type_infos["initial"])
             elif type_infos["type"] == "Array":
                 self.ArrayBaseType.SetStringSelection(type_infos["base_type"])
-                self.ArrayDimensions.SetStrings(map(lambda x : "..".join(x), type_infos["dimensions"]))
+                self.ArrayDimensions.SetStrings(map("..".join, type_infos["dimensions"]))
                 self.ArrayInitialValue.SetValue(type_infos["initial"])
             elif type_infos["type"] == "Structure":
                 self.StructureElementsTable.SetData(type_infos["elements"])
@@ -547,12 +563,12 @@
         index = event.GetIndex()
         if index >= len(values) or values[index].upper() != text.upper():
             if text.upper() in [value.upper() for value in values]:
-                message = wx.MessageDialog(self, _("\"%s\" value already defined!")%text, _("Error"), wx.OK|wx.ICON_ERROR)
+                message = wx.MessageDialog(self, _("\"%s\" value already defined!") % text, _("Error"), wx.OK | wx.ICON_ERROR)
                 message.ShowModal()
                 message.Destroy()
                 event.Veto()
             elif text.upper() in IEC_KEYWORDS:
-                message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%text, _("Error"), wx.OK|wx.ICON_ERROR)
+                message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!") % text, _("Error"), wx.OK | wx.ICON_ERROR)
                 message.ShowModal()
                 message.Destroy()
             else:
@@ -570,39 +586,37 @@
         wx.CallAfter(self.RefreshTypeInfos)
         event.Skip()
 
+    def ShowErrorMessage(self, message):
+        dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
+        dialog.ShowModal()
+        dialog.Destroy()
+
     def OnStructureElementsGridCellChange(self, event):
         row, col = event.GetRow(), event.GetCol()
         colname = self.StructureElementsTable.GetColLabelValue(col, False)
         value = self.StructureElementsTable.GetValue(row, col)
         if colname == "Name":
+            message = None
             if not TestIdentifier(value):
-                message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%value, _("Error"), wx.OK|wx.ICON_ERROR)
-                message.ShowModal()
-                message.Destroy()
-                event.Veto()
+                message = _("\"%s\" is not a valid identifier!") % value
             elif value.upper() in IEC_KEYWORDS:
-                message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%value, _("Error"), wx.OK|wx.ICON_ERROR)
-                message.ShowModal()
-                message.Destroy()
-                event.Veto()
-##            elif value.upper() in self.PouNames:
-##                message = wx.MessageDialog(self, "A pou with \"%s\" as name exists!"%value, "Error", wx.OK|wx.ICON_ERROR)
-##                message.ShowModal()
-##                message.Destroy()
-##                event.Veto()
+                message = _("\"%s\" is a keyword. It can't be used!") % value
+#            elif value.upper() in self.PouNames:
+#                message = _("A pou with \"%s\" as name exists!")%value
             elif value.upper() in [var["Name"].upper() for idx, var in enumerate(self.StructureElementsTable.GetData()) if idx != row]:
-                message = wx.MessageDialog(self, _("An element named \"%s\" already exists in this structure!")%value, _("Error"), wx.OK|wx.ICON_ERROR)
-                message.ShowModal()
-                message.Destroy()
-                event.Veto()
+                message = _("An element named \"%s\" already exists in this structure!") % value
             else:
                 self.RefreshTypeInfos()
                 wx.CallAfter(self.StructureElementsTable.ResetView, self.StructureElementsGrid)
-##                old_value = self.Table.GetOldValue()
-##                if old_value != "":
-##                    self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value)
-##                self.Controler.BufferProject()
+#                old_value = self.Table.GetOldValue()
+#                if old_value != "":
+#                    self.Controler.UpdateEditedElementUsedVariable(self.TagName, old_value, value)
+#                self.Controler.BufferProject()
                 event.Skip()
+
+            if message is not None:
+                event.Veto()
+                wx.CallAfter(self.ShowErrorMessage, message)
         else:
             self.RefreshTypeInfos()
             wx.CallAfter(self.StructureElementsTable.ResetView, self.StructureElementsGrid)
@@ -635,15 +649,15 @@
             AppendMenu(type_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("Array"))
             self.Bind(wx.EVT_MENU, self.ElementArrayTypeFunction, id=new_id)
 
-##            functionblock_menu = wx.Menu(title='')
-##            bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
-##            pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
-##            if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]:
-##                for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName):
-##                    new_id = wx.NewId()
-##                    AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
-##                    self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
-##                type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu)
+#            functionblock_menu = wx.Menu(title='')
+#            bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
+#            pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
+#            if classtype in ["Input","Output","InOut","External","Global"] or poutype != "function" and bodytype in ["ST", "IL"]:
+#                for functionblock_type in self.Controler.GetFunctionBlockTypes(self.TagName):
+#                    new_id = wx.NewId()
+#                    AppendMenu(functionblock_menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=functionblock_type)
+#                    self.Bind(wx.EVT_MENU, self.GetVariableTypeFunction(functionblock_type), id=new_id)
+#                type_menu.AppendMenu(wx.NewId(), _("Function Block Types"), functionblock_menu)
 
             rect = self.StructureElementsGrid.BlockToDeviceRect((row, col), (row, col))
             self.StructureElementsGrid.PopupMenuXY(type_menu, rect.x + rect.width, rect.y + self.StructureElementsGrid.GetColLabelSize())
@@ -672,7 +686,7 @@
         dialog.Destroy()
 
     def RefreshDisplayedInfos(self):
-        selected = DATATYPE_TYPES_DICT[self.DerivationType.GetStringSelection()]
+        selected = self.DATATYPE_TYPES_DICT[self.DerivationType.GetStringSelection()]
         if selected != self.CurrentPanel:
             if self.CurrentPanel == "Directly":
                 self.DirectlyPanel.Hide()
@@ -710,17 +724,17 @@
         range = self.Controler.GetDataTypeRange(self.SubrangeBaseType.GetStringSelection())
         if range is not None:
             min_value, max_value = range
-            self.SubrangeMinimum.SetRange(min_value, max_value)
+            self.SubrangeMinimum.SetBounds(min_value, max_value)
             self.SubrangeMinimum.SetValue(min(max(min_value, self.SubrangeMinimum.GetValue()), max_value))
-            self.SubrangeMaximum.SetRange(min_value, max_value)
+            self.SubrangeMaximum.SetBounds(min_value, max_value)
             self.SubrangeMaximum.SetValue(min(max(min_value, self.SubrangeMaximum.GetValue()), max_value))
 
     def RefreshSubrangeInitialValueRange(self):
-        self.SubrangeInitialValue.SetRange(self.SubrangeMinimum.GetValue(), self.SubrangeMaximum.GetValue())
+        self.SubrangeInitialValue.SetBounds(self.SubrangeMinimum.GetValue(), self.SubrangeMaximum.GetValue())
 
     def RefreshTypeInfos(self):
-        selected = DATATYPE_TYPES_DICT[self.DerivationType.GetStringSelection()]
-        infos = {"type" : selected}
+        selected = self.DATATYPE_TYPES_DICT[self.DerivationType.GetStringSelection()]
+        infos = {"type": selected}
         if selected == "Directly":
             infos["base_type"] = self.DirectlyBaseType.GetStringSelection()
             infos["initial"] = self.DirectlyInitialValue.GetValue()
@@ -742,14 +756,14 @@
             for dimensions in self.ArrayDimensions.GetStrings():
                 result = DIMENSION_MODEL.match(dimensions)
                 if result is None:
-                    message = wx.MessageDialog(self, _("\"%s\" value isn't a valid array dimension!")%dimensions, _("Error"), wx.OK|wx.ICON_ERROR)
+                    message = wx.MessageDialog(self, _("\"%s\" value isn't a valid array dimension!") % dimensions, _("Error"), wx.OK | wx.ICON_ERROR)
                     message.ShowModal()
                     message.Destroy()
                     self.RefreshView()
                     return
                 bounds = result.groups()
                 if int(bounds[0]) >= int(bounds[1]):
-                    message = wx.MessageDialog(self, _("\"%s\" value isn't a valid array dimension!\nRight value must be greater than left value.")%dimensions, _("Error"), wx.OK|wx.ICON_ERROR)
+                    message = wx.MessageDialog(self, _("\"%s\" value isn't a valid array dimension!\nRight value must be greater than left value.") % dimensions, _("Error"), wx.OK | wx.ICON_ERROR)
                     message.ShowModal()
                     message.Destroy()
                     self.RefreshView()
@@ -764,9 +778,9 @@
         self.ParentWindow.RefreshFileMenu()
         self.ParentWindow.RefreshEditMenu()
 
-#-------------------------------------------------------------------------------
-#                        Highlights showing functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                        Highlights showing functions
+    # -------------------------------------------------------------------------------
 
     def OnRefreshHighlightsTimer(self, event):
         self.RefreshView()
@@ -782,7 +796,8 @@
                 control.SetBackgroundColour(wx.NullColour)
                 control.SetForegroundColour(wx.NullColour)
             elif isinstance(control, wx.TextCtrl):
-                value = control.GetValue()
+                value = control.GetValueStr() if isinstance(control, CustomIntCtrl) else \
+                        control.GetValue()
                 control.SetStyle(0, len(value), wx.TextAttr(wx.NullColour))
             elif isinstance(control, wx.gizmos.EditableListBox):
                 listctrl = control.GetListCtrl()
@@ -792,7 +807,7 @@
         self.StructureElementsTable.ClearHighlights(highlight_type)
         self.RefreshView()
 
-    def AddHighlight(self, infos, start, end ,highlight_type):
+    def AddHighlight(self, infos, start, end, highlight_type):
         self.Highlights.append((infos, start, end, highlight_type))
         self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
 
@@ -814,4 +829,3 @@
                         listctrl.SetItemBackgroundColour(infos[1], highlight_type[0])
                         listctrl.SetItemTextColour(infos[1], highlight_type[1])
                         listctrl.Select(listctrl.FocusedItem, False)
-
--- a/editors/DebugViewer.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/editors/DebugViewer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,25 +22,27 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 from threading import Lock, Timer
 from time import time as gettime
 
 import wx
 
-REFRESH_PERIOD = 0.1        # Minimum time between 2 refresh
-DEBUG_REFRESH_LOCK = Lock() # Common refresh lock for all debug viewers
-
-#-------------------------------------------------------------------------------
+REFRESH_PERIOD = 0.1         # Minimum time between 2 refresh
+DEBUG_REFRESH_LOCK = Lock()  # Common refresh lock for all debug viewers
+
+# -------------------------------------------------------------------------------
 #                               Debug Viewer Class
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements common behavior of every viewers able to display debug 
-values
-"""
-
-class DebugViewer:
-    
+# -------------------------------------------------------------------------------
+
+
+class DebugViewer(object):
+    """
+    Class that implements common behavior of every viewers able to display debug
+    values
+    """
+
     def __init__(self, producer, debug, subscribe_tick=True):
         """
         Constructor
@@ -52,49 +54,49 @@
         """
         self.Debug = debug
         self.SubscribeTick = subscribe_tick
-        
+
         # Flag indicating that consumer value update inhibited
         # (DebugViewer is refreshing)
         self.Inhibited = False
-        
+
         # List of data consumers subscribed to DataProducer
         self.DataConsumers = {}
-        
+
         # Time stamp indicating when last refresh have been initiated
         self.LastRefreshTime = gettime()
         # Flag indicating that DebugViewer has acquire common debug lock
         self.HasAcquiredLock = False
         # Lock for access to the two preceding variable
         self.AccessLock = Lock()
-        
+
         # Timer to refresh Debug Viewer one last time in the case that a new
         # value have been received during refresh was inhibited and no one
         # after refresh was activated
         self.LastRefreshTimer = None
         # Lock for access to the timer
         self.TimerAccessLock = Lock()
-        
+
         # Set DataProducer and subscribe tick if needed
         self.SetDataProducer(producer)
-        
+
     def __del__(self):
         """
         Destructor
         """
         # Unsubscribe all data consumers
         self.UnsubscribeAllDataConsumers()
-        
+
         # Delete reference to DataProducer
         self.DataProducer = None
-        
+
         # Stop last refresh timer
         if self.LastRefreshTimer is not None:
             self.LastRefreshTimer.cancel()
-        
+
         # Release Common debug lock if DebugViewer has acquired it
         if self.HasAcquiredLock:
             DEBUG_REFRESH_LOCK.release()
-    
+
     def SetDataProducer(self, producer):
         """
         Set Data Producer
@@ -103,37 +105,37 @@
         # In the case that tick need to be subscribed and DebugViewer is
         # debugging
         if self.SubscribeTick and self.Debug:
-            
+
             # Subscribe tick to new data producer
             if producer is not None:
                 producer.SubscribeDebugIECVariable("__tick__", self, True)
-            
+
             # Unsubscribe tick from old data producer
             if getattr(self, "DataProducer", None) is not None:
                 self.DataProducer.UnsubscribeDebugIECVariable("__tick__", self)
-        
+
         # Save new data producer
         self.DataProducer = producer
-    
+
     def IsDebugging(self):
         """
         Get flag indicating if Debug Viewer is debugging
         @return: Debugging flag
         """
         return self.Debug
-    
+
     def Inhibit(self, inhibit):
         """
         Set consumer value update inhibit flag
         @param inhibit: Inhibit flag
         """
         # Inhibit every data consumers in list
-        for consumer, iec_path in self.DataConsumers.iteritems():
+        for consumer, _iec_path in self.DataConsumers.iteritems():
             consumer.Inhibit(inhibit)
-        
+
         # Save inhibit flag
         self.Inhibited = inhibit
-    
+
     def AddDataConsumer(self, iec_path, consumer, buffer_list=False):
         """
         Subscribe data consumer to DataProducer
@@ -145,19 +147,19 @@
         # Return immediately if no DataProducer defined
         if self.DataProducer is None:
             return None
-        
+
         # Subscribe data consumer to DataProducer
         result = self.DataProducer.SubscribeDebugIECVariable(
-                        iec_path, consumer, buffer_list)
+            iec_path, consumer, buffer_list)
         if result is not None and consumer != self:
-            
+
             # Store data consumer if successfully subscribed and inform
             # consumer of variable data type
             self.DataConsumers[consumer] = iec_path
             consumer.SetDataType(self.GetDataType(iec_path))
-        
+
         return result
-    
+
     def RemoveDataConsumer(self, consumer):
         """
         Unsubscribe data consumer from DataProducer
@@ -165,12 +167,11 @@
         """
         # Remove consumer from data consumer list
         iec_path = self.DataConsumers.pop(consumer, None)
-        
+
         # Unsubscribe consumer from DataProducer
         if iec_path is not None:
-            self.DataProducer.UnsubscribeDebugIECVariable(
-                        iec_path, consumer)
-    
+            self.DataProducer.UnsubscribeDebugIECVariable(iec_path, consumer)
+
     def SubscribeAllDataConsumers(self):
         """
         Called to Subscribe all data consumers contained in DebugViewer.
@@ -179,24 +180,23 @@
         # Subscribe tick if needed
         if self.SubscribeTick and self.Debug and self.DataProducer is not None:
             self.DataProducer.SubscribeDebugIECVariable("__tick__", self, True)
-    
+
     def UnsubscribeAllDataConsumers(self, tick=True):
         """
         Called to Unsubscribe all data consumers.
         """
         if self.DataProducer is not None:
-            
+
             # Unscribe tick if needed
             if self.SubscribeTick and tick and self.Debug:
                 self.DataProducer.UnsubscribeDebugIECVariable("__tick__", self)
-            
+
             # Unsubscribe all data consumers in list
             for consumer, iec_path in self.DataConsumers.iteritems():
-                self.DataProducer.UnsubscribeDebugIECVariable(
-                            iec_path, consumer)
-        
+                self.DataProducer.UnsubscribeDebugIECVariable(iec_path, consumer)
+
         self.DataConsumers = {}
-    
+
     def GetDataType(self, iec_path):
         """
         Return variable data type.
@@ -204,20 +204,20 @@
         @return: variable data type (None if not found)
         """
         if self.DataProducer is not None:
-            
+
             # Search for variable informations in project compilation files
             data_type = self.DataProducer.GetDebugIECVariableType(
-                            iec_path.upper())
+                iec_path.upper())
             if data_type is not None:
                 return data_type
-            
+
             # Search for variable informations in project data
             infos = self.DataProducer.GetInstanceInfos(iec_path)
             if infos is not None:
                 return infos.type
-        
+
         return None
-    
+
     def IsNumType(self, data_type):
         """
         Indicate if data type given is a numeric data type
@@ -226,9 +226,9 @@
         """
         if self.DataProducer is not None:
             return self.DataProducer.IsNumType(data_type)
-        
+
         return False
-    
+
     def ForceDataValue(self, iec_path, value):
         """
         Force PLC variable value
@@ -237,7 +237,7 @@
         """
         if self.DataProducer is not None:
             self.DataProducer.ForceDebugIECVariable(iec_path, value)
-    
+
     def ReleaseDataValue(self, iec_path):
         """
         Release PLC variable value
@@ -245,40 +245,40 @@
         """
         if self.DataProducer is not None:
             self.DataProducer.ReleaseDebugIECVariable(iec_path)
-    
+
     def NewDataAvailable(self, ticks):
         """
         Called by DataProducer for each tick captured
         @param tick: PLC tick captured
-        All other parameters are passed to refresh function 
+        All other parameters are passed to refresh function
         """
         # Stop last refresh timer
         self.TimerAccessLock.acquire()
         if self.LastRefreshTimer is not None:
             self.LastRefreshTimer.cancel()
-            self.LastRefreshTimer=None
+            self.LastRefreshTimer = None
         self.TimerAccessLock.release()
-        
+
         # Only try to refresh DebugViewer if it is visible on screen and not
         # already refreshing
         if self.IsShown() and not self.Inhibited:
-            
+
             # Try to get acquire common refresh lock if minimum period between
             # two refresh has expired
             if gettime() - self.LastRefreshTime > REFRESH_PERIOD and \
                DEBUG_REFRESH_LOCK.acquire(False):
                 self.StartRefreshing()
-            
+
             # If common lock wasn't acquired for any reason, restart last
             # refresh timer
             else:
                 self.StartLastRefreshTimer()
-        
+
         # In the case that DebugViewer isn't visible on screen and has already
         # acquired common refresh lock, reset DebugViewer
         elif not self.IsShown() and self.HasAcquiredLock:
             DebugViewer.RefreshNewData(self)
-    
+
     def ShouldRefresh(self):
         """
         Callback function called when last refresh timer expired
@@ -286,15 +286,15 @@
         """
         # Cancel if DebugViewer is not visible on screen
         if self and self.IsShown():
-            
+
             # Try to acquire common refresh lock
             if DEBUG_REFRESH_LOCK.acquire(False):
                 self.StartRefreshing()
-            
+
             # Restart last refresh timer if common refresh lock acquired failed
             else:
                 self.StartLastRefreshTimer()
-    
+
     def StartRefreshing(self):
         """
         Called to initiate a refresh of DebugViewer
@@ -306,13 +306,13 @@
         self.HasAcquiredLock = True
         self.LastRefreshTime = gettime()
         self.AccessLock.release()
-        
+
         # Inhibit data consumer value update
         self.Inhibit(True)
-        
+
         # Initiate DebugViewer refresh
         wx.CallAfter(self.RefreshNewData)
-    
+
     def StartLastRefreshTimer(self):
         """
         Called to start last refresh timer for the minimum time between 2
@@ -324,19 +324,19 @@
             REFRESH_PERIOD, self.ShouldRefresh)
         self.LastRefreshTimer.start()
         self.TimerAccessLock.release()
-    
+
     def RefreshNewData(self):
         """
         Called to refresh DebugViewer according to values received by data
         consumers
         May be overridden by inherited classes
         Can receive any parameters depending on what is needed by inherited
-        class 
+        class
         """
         if self:
             # Activate data consumer value update
             self.Inhibit(False)
-            
+
             # Release common refresh lock if acquired and update
             # last refresh time
             self.AccessLock.acquire()
--- a/editors/EditorPanel.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/editors/EditorPanel.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,71 +22,75 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from controls import VariablePanel
 
+
 class EditorPanel(wx.SplitterWindow):
-    
+
     VARIABLE_PANEL_TYPE = None
-    
+
     def _init_Editor(self, prnt):
         self.Editor = None
-    
+
     def _init_MenuItems(self):
         self.MenuItems = []
-    
+
     def _init_ctrls(self, parent):
-        wx.SplitterWindow.__init__(self, parent,
-              style=wx.SUNKEN_BORDER|wx.SP_3D)
         self.SetMinimumPaneSize(1)
-        
+
         self._init_MenuItems()
-        
+
         if self.VARIABLE_PANEL_TYPE is not None:
             self.VariableEditor = VariablePanel(self, self, self.Controler, self.VARIABLE_PANEL_TYPE, self.Debug)
             self.VariableEditor.SetTagName(self.TagName)
         else:
             self.VariableEditor = None
-            
+
         self._init_Editor(self)
-            
+
         if self.Editor is not None and self.VariableEditor is not None:
             self.SplitHorizontally(self.VariableEditor, self.Editor, 200)
         elif self.VariableEditor is not None:
             self.Initialize(self.VariableEditor)
         elif self.Editor is not None:
             self.Initialize(self.Editor)
-        
+
     def __init__(self, parent, tagname, window, controler, debug=False):
+        wx.SplitterWindow.__init__(self, parent,
+                                   style=wx.SUNKEN_BORDER | wx.SP_3D)
+
         self.ParentWindow = window
         self.Controler = controler
         self.TagName = tagname
         self.Icon = None
         self.Debug = debug
-        
+
         self._init_ctrls(parent)
-    
+
     def SetTagName(self, tagname):
         self.TagName = tagname
         if self.VARIABLE_PANEL_TYPE is not None:
             self.VariableEditor.SetTagName(tagname)
-        
+
     def GetTagName(self):
         return self.TagName
-    
+
     def Select(self):
         self.ParentWindow.EditProjectElement(None, self.GetTagName(), True)
-    
+
     def GetTitle(self):
         return ".".join(self.TagName.split("::")[1:])
-    
+
     def GetIcon(self):
         return self.Icon
-    
+
     def SetIcon(self, icon):
         self.Icon = icon
-    
+
     def IsViewing(self, tagname):
         return self.GetTagName() == tagname
 
@@ -98,54 +102,54 @@
 
     def ResetBuffer(self):
         pass
-    
+
     def IsModified(self):
         return False
-    
+
     def CheckSaveBeforeClosing(self):
         return True
-    
+
     def Save(self):
         pass
-    
+
     def SaveAs(self):
         pass
-    
+
     def GetBufferState(self):
         if self.Controler is not None:
             return self.Controler.GetBufferState()
         return False, False
-    
+
     def Undo(self):
         if self.Controler is not None:
             self.Controler.LoadPrevious()
             self.RefreshView()
-    
+
     def Redo(self):
         if self.Controler is not None:
             self.Controler.LoadNext()
             self.RefreshView()
-    
+
     def Find(self, direction, search_params):
         pass
-        
+
     def HasNoModel(self):
         return False
-    
+
     def RefreshView(self, variablepanel=True):
         if variablepanel:
             self.RefreshVariablePanel()
-    
+
     def RefreshVariablePanel(self):
         if self.VariableEditor is not None:
             self.VariableEditor.RefreshView()
-    
+
     def GetConfNodeMenuItems(self):
         return self.MenuItems
-    
+
     def RefreshConfNodeMenu(self, confnode_menu):
         pass
-    
+
     def _Refresh(self, *args):
         self.ParentWindow._Refresh(*args)
 
@@ -159,7 +163,7 @@
     def RemoveHighlight(self, infos, start, end, highlight_type):
         if self.VariableEditor is not None and infos[0] in ["var_local", "var_input", "var_output", "var_inout"]:
             self.VariableEditor.RemoveVariableHighlight(infos[1:], highlight_type)
-        
+
     def ClearHighlights(self, highlight_type=None):
         if self.VariableEditor is not None:
             self.VariableEditor.ClearHighlights(highlight_type)
--- a/editors/FileManagementPanel.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/editors/FileManagementPanel.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,51 +22,54 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import os
 import shutil
 
 import wx
 import wx.lib.buttons
 
-from EditorPanel import EditorPanel
+from editors.EditorPanel import EditorPanel
 from util.BitmapLibrary import GetBitmap
 from controls import FolderTree
 
-FILTER = _("All files (*.*)|*.*|CSV files (*.csv)|*.csv")
 
 class FileManagementPanel(EditorPanel):
-    
+
     def _init_Editor(self, parent):
         self.Editor = wx.Panel(parent)
-        
+
         main_sizer = wx.BoxSizer(wx.HORIZONTAL)
-        
+
         left_sizer = wx.BoxSizer(wx.VERTICAL)
-        main_sizer.AddSizer(left_sizer, 1, border=5, flag=wx.GROW|wx.ALL)
-        
+        main_sizer.AddSizer(left_sizer, 1, border=5, flag=wx.GROW | wx.ALL)
+
         managed_dir_label = wx.StaticText(self.Editor, label=_(self.TagName) + ":")
-        left_sizer.AddWindow(managed_dir_label, border=5, flag=wx.GROW|wx.BOTTOM)
-        
+        left_sizer.AddWindow(managed_dir_label, border=5, flag=wx.GROW | wx.BOTTOM)
+
+        FILTER = _("All files (*.*)|*.*|CSV files (*.csv)|*.csv")
         self.ManagedDir = FolderTree(self.Editor, self.Folder, FILTER)
         left_sizer.AddWindow(self.ManagedDir, 1, flag=wx.GROW)
-        
+
         managed_treectrl = self.ManagedDir.GetTreeCtrl()
         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeItemChanged, managed_treectrl)
         if self.EnableDragNDrop:
             self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnTreeBeginDrag, managed_treectrl)
-        
+
         button_sizer = wx.BoxSizer(wx.VERTICAL)
-        main_sizer.AddSizer(button_sizer, border=5, 
-              flag=wx.ALL|wx.ALIGN_CENTER_VERTICAL)
-        
+        main_sizer.AddSizer(button_sizer, border=5,
+                            flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL)
+
         for idx, (name, bitmap, help) in enumerate([
                 ("DeleteButton", "remove_element", _("Remove file from left folder")),
                 ("LeftCopyButton", "LeftCopy", _("Copy file from right folder to left")),
                 ("RightCopyButton", "RightCopy", _("Copy file from left folder to right")),
                 ("EditButton", "edit", _("Edit file"))]):
-            button = wx.lib.buttons.GenBitmapButton(self.Editor, 
-                  bitmap=GetBitmap(bitmap), 
-                  size=wx.Size(28, 28), style=wx.NO_BORDER)
+            button = wx.lib.buttons.GenBitmapButton(
+                self.Editor,
+                bitmap=GetBitmap(bitmap),
+                size=wx.Size(28, 28), style=wx.NO_BORDER)
             button.SetToolTipString(help)
             setattr(self, name, button)
             if idx > 0:
@@ -75,62 +78,62 @@
                 flag = 0
             self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button)
             button_sizer.AddWindow(button, border=20, flag=flag)
-        
+
         right_sizer = wx.BoxSizer(wx.VERTICAL)
-        main_sizer.AddSizer(right_sizer, 1, border=5, flag=wx.GROW|wx.ALL)
-        
+        main_sizer.AddSizer(right_sizer, 1, border=5, flag=wx.GROW | wx.ALL)
+
         if wx.Platform == '__WXMSW__':
             system_dir_label = wx.StaticText(self.Editor, label=_("My Computer:"))
         else:
             system_dir_label = wx.StaticText(self.Editor, label=_("Home Directory:"))
-        right_sizer.AddWindow(system_dir_label, border=5, flag=wx.GROW|wx.BOTTOM)
-        
+        right_sizer.AddWindow(system_dir_label, border=5, flag=wx.GROW | wx.BOTTOM)
+
         self.SystemDir = FolderTree(self.Editor, self.HomeDirectory, FILTER, False)
         right_sizer.AddWindow(self.SystemDir, 1, flag=wx.GROW)
-        
+
         system_treectrl = self.SystemDir.GetTreeCtrl()
         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeItemChanged, system_treectrl)
-        
+
         self.Editor.SetSizer(main_sizer)
-        
+
     def __init__(self, parent, controler, name, folder, enable_dragndrop=False):
         self.Folder = os.path.realpath(folder)
         self.EnableDragNDrop = enable_dragndrop
-        
+
         if wx.Platform == '__WXMSW__':
             self.HomeDirectory = "/"
         else:
             self.HomeDirectory = os.path.expanduser("~")
-        
+
         EditorPanel.__init__(self, parent, name, None, None)
-        
+
         self.Controler = controler
-        
+
         self.EditableFileExtensions = []
         self.EditButton.Hide()
-        
+
         self.SetIcon(GetBitmap("FOLDER"))
-    
+
     def __del__(self):
         self.Controler.OnCloseEditor(self)
-    
+
     def GetTitle(self):
         return _(self.TagName)
-    
+
     def SetEditableFileExtensions(self, extensions):
         self.EditableFileExtensions = extensions
         if len(self.EditableFileExtensions) > 0:
             self.EditButton.Show()
-    
+
     def RefreshView(self):
         self.ManagedDir.RefreshTree()
         self.SystemDir.RefreshTree()
         self.RefreshButtonsState()
-    
+
     def RefreshButtonsState(self):
         managed_filepath = self.ManagedDir.GetPath()
         system_filepath = self.SystemDir.GetPath()
-        
+
         self.DeleteButton.Enable(os.path.isfile(managed_filepath))
         self.LeftCopyButton.Enable(os.path.isfile(system_filepath))
         self.RightCopyButton.Enable(os.path.isfile(managed_filepath))
@@ -138,22 +141,23 @@
             self.EditButton.Enable(
                 os.path.isfile(managed_filepath) and
                 os.path.splitext(managed_filepath)[1] in self.EditableFileExtensions)
-    
+
     def OnTreeItemChanged(self, event):
         self.RefreshButtonsState()
         event.Skip()
-        
+
     def OnDeleteButton(self, event):
         filepath = self.ManagedDir.GetPath()
         if os.path.isfile(filepath):
-            folder, filename = os.path.split(filepath)
-            
-            dialog = wx.MessageDialog(self, 
-                  _("Do you really want to delete the file '%s'?") % filename, 
-                  _("Delete File"), wx.YES_NO|wx.ICON_QUESTION)
+            _folder, filename = os.path.split(filepath)
+
+            dialog = wx.MessageDialog(self,
+                                      _("Do you really want to delete the file '%s'?") % filename,
+                                      _("Delete File"),
+                                      wx.YES_NO | wx.ICON_QUESTION)
             remove = dialog.ShowModal() == wx.ID_YES
             dialog.Destroy()
-            
+
             if remove:
                 os.remove(filepath)
                 self.ManagedDir.RefreshTree()
@@ -161,29 +165,30 @@
 
     def OnEditButton(self, event):
         filepath = self.ManagedDir.GetPath()
-        if (os.path.isfile(filepath) and 
-            os.path.splitext(filepath)[1] in self.EditableFileExtensions):
+        if os.path.isfile(filepath) and \
+           os.path.splitext(filepath)[1] in self.EditableFileExtensions:
             self.Controler._OpenView(filepath + "::")
         event.Skip()
-        
+
     def CopyFile(self, src, dst):
         if os.path.isfile(src):
-            src_folder, src_filename = os.path.split(src)
+            _src_folder, src_filename = os.path.split(src)
             if os.path.isfile(dst):
-                dst_folder, dst_filename = os.path.split(dst)
+                dst_folder, _dst_filename = os.path.split(dst)
             else:
                 dst_folder = dst
-            
+
             dst_filepath = os.path.join(dst_folder, src_filename)
             if os.path.isfile(dst_filepath):
-                dialog = wx.MessageDialog(self, 
-                      _("The file '%s' already exist.\nDo you want to replace it?") % src_filename, 
-                      _("Replace File"), wx.YES_NO|wx.ICON_QUESTION)
+                dialog = wx.MessageDialog(
+                    self,
+                    _("The file '%s' already exist.\nDo you want to replace it?") % src_filename,
+                    _("Replace File"), wx.YES_NO | wx.ICON_QUESTION)
                 copy = dialog.ShowModal() == wx.ID_YES
                 dialog.Destroy()
             else:
                 copy = True
-                
+
             if copy:
                 shutil.copyfile(src, dst_filepath)
                 return dst_filepath
@@ -202,7 +207,7 @@
             self.SystemDir.RefreshTree()
             self.SystemDir.SetPath(filepath)
         event.Skip()
-    
+
     def OnTreeBeginDrag(self, event):
         filepath = self.ManagedDir.GetPath()
         if os.path.isfile(filepath):
@@ -211,4 +216,3 @@
             dragSource = wx.DropSource(self)
             dragSource.SetData(data)
             dragSource.DoDragDrop()
-        
--- a/editors/IECCodeViewer.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/editors/IECCodeViewer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,19 +22,22 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 from editors.TextViewer import TextViewer
 from plcopen.plcopen import TestTextElement
 
+
 class IECCodeViewer(TextViewer):
-    
+
     def __del__(self):
         TextViewer.__del__(self)
         if getattr(self, "_OnClose"):
             self._OnClose(self)
-    
+
     def Paste(self):
         if self.Controler is not None:
             TextViewer.Paste(self)
-    
+
     def Search(self, criteria):
         return [((self.TagName, "body", 0),) + result for result in TestTextElement(self.Editor.GetText(), criteria)]
--- a/editors/LDViewer.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/editors/LDViewer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,11 +22,16 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
+from future.builtins import round
+
 import wx
-import time
-from types import *
-
-from Viewer import *
+from six.moves import xrange
+
+from editors.Viewer import *
+
 
 def ExtractNextBlocks(block, block_list):
     current_list = [block]
@@ -43,13 +48,14 @@
                 if "input" in connectors:
                     input_connectors = [connectors["input"]]
             for connector in input_connectors:
-                for wire, handle in connector.GetWires():
+                for wire, _handle in connector.GetWires():
                     next = wire.EndConnected.GetParentBlock()
                     if not isinstance(next, LD_PowerRail) and next not in block_list:
                         block_list.append(next)
                         next_list.append(next)
         current_list = next_list
-    
+
+
 def CalcBranchSize(elements, stops):
     branch_size = 0
     stop_list = stops
@@ -58,19 +64,19 @@
     element_tree = {}
     for element in elements:
         if element not in element_tree:
-            element_tree[element] = {"parents":["start"], "children":[], "weight":None}
+            element_tree[element] = {"parents": ["start"], "children": [], "weight": None}
             GenerateTree(element, element_tree, stop_list)
         elif element_tree[element]:
             element_tree[element]["parents"].append("start")
-    remove_stops = {"start":[], "stop":[]}
+    remove_stops = {"start": [], "stop": []}
     for element, values in element_tree.items():
         if "stop" in values["children"]:
             removed = []
             for child in values["children"]:
                 if child != "stop":
-##                    if child in elements:
-##                        RemoveElement(child, element_tree)
-##                        removed.append(child)
+                    # if child in elements:
+                    #     RemoveElement(child, element_tree)
+                    #     removed.append(child)
                     if "start" in element_tree[child]["parents"]:
                         if element not in remove_stops["stop"]:
                             remove_stops["stop"].append(element)
@@ -89,16 +95,17 @@
                 branch_size += values["weight"]
             else:
                 return 1
-    #print branch_size
     return branch_size
 
+
 def RemoveElement(remove, element_tree):
     if remove in element_tree and element_tree[remove]:
         for child in element_tree[remove]["children"]:
             if child != "stop":
                 RemoveElement(child, element_tree)
         element_tree.pop(remove)
-##        element_tree[remove] = None
+#        element_tree[remove] = None
+
 
 def GenerateTree(element, element_tree, stop_list):
     if element in element_tree:
@@ -112,23 +119,24 @@
             if "input" in connectors:
                 input_connectors = [connectors["input"]]
         for connector in input_connectors:
-            for wire, handle in connector.GetWires():
+            for wire, _handle in connector.GetWires():
                 next = wire.EndConnected.GetParentBlock()
                 if isinstance(next, LD_PowerRail) and next.GetType() == LEFTRAIL or next in stop_list:
-##                    for remove in element_tree[element]["children"]:
-##                        RemoveElement(remove, element_tree)
-##                    element_tree[element]["children"] = ["stop"]
+                    # for remove in element_tree[element]["children"]:
+                    #     RemoveElement(remove, element_tree)
+                    # element_tree[element]["children"] = ["stop"]
                     element_tree[element]["children"].append("stop")
-##                elif element_tree[element]["children"] == ["stop"]:
-##                    element_tree[next] = None
+                # elif element_tree[element]["children"] == ["stop"]:
+                #     element_tree[next] = None
                 elif next not in element_tree or element_tree[next]:
                     element_tree[element]["children"].append(next)
                     if next in element_tree:
                         element_tree[next]["parents"].append(element)
                     else:
-                        element_tree[next] = {"parents":[element], "children":[], "weight":None}
+                        element_tree[next] = {"parents": [element], "children": [], "weight": None}
                         GenerateTree(next, element_tree, stop_list)
 
+
 def CalcWeight(element, element_tree):
     weight = 0
     parts = None
@@ -153,29 +161,28 @@
                 return
         if not parts:
             parts = 1
-        element_tree[element]["weight"] = max(1, weight / parts)
-
-
-#-------------------------------------------------------------------------------
+        element_tree[element]["weight"] = max(1, weight // parts)
+
+
+# -------------------------------------------------------------------------------
 #                     Ladder Diagram Graphic elements Viewer class
-#-------------------------------------------------------------------------------
-
-
-"""
-Class derived from Viewer class that implements a Viewer of Ladder Diagram
-"""
+# -------------------------------------------------------------------------------
+
 
 class LD_Viewer(Viewer):
-
-    def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""):
+    """
+    Class derived from Viewer class that implements a Viewer of Ladder Diagram
+    """
+
+    def __init__(self, parent, tagname, window, controler, debug=False, instancepath=""):
         Viewer.__init__(self, parent, tagname, window, controler, debug, instancepath)
         self.Rungs = []
         self.RungComments = []
         self.CurrentLanguage = "LD"
 
-#-------------------------------------------------------------------------------
-#                          Refresh functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Refresh functions
+    # -------------------------------------------------------------------------------
 
     def ResetView(self):
         self.Rungs = []
@@ -194,7 +201,7 @@
                             self.RungComments.insert(i, None)
                 else:
                     self.RungComments.insert(i, None)
-        
+
     def loadInstance(self, instance, ids, selection):
         Viewer.loadInstance(self, instance, ids, selection)
         if self.GetDrawingMode() != FREEDRAWING_MODE:
@@ -212,12 +219,15 @@
                         if rung not in rungs:
                             rungs.append(rung)
                 if len(rungs) > 1:
-                    raise ValueError, _("Ladder element with id %d is on more than one rung.")%instance["id"]
+                    raise ValueError(
+                        _("Ladder element with id %d is on more than one rung.")
+                        % instance["id"])
+
                 element = self.FindElementById(instance["id"])
                 element_connectors = element.GetConnectors()
                 self.Rungs[rungs[0]].SelectElement(element)
                 for connector in element_connectors["inputs"]:
-                    for wire, num in connector.GetWires():
+                    for wire, _num in connector.GetWires():
                         self.Rungs[rungs[0]].SelectElement(wire)
                 wx.CallAfter(self.RefreshPosition, element)
             elif instance["type"] in ["contact", "coil"]:
@@ -228,11 +238,14 @@
                     if rung not in rungs:
                         rungs.append(rung)
                 if len(rungs) > 1:
-                    raise ValueError, _("Ladder element with id %d is on more than one rung.")%instance["id"]
+                    raise ValueError(
+                        _("Ladder element with id %d is on more than one rung.")
+                        % instance["id"])
+
                 element = self.FindElementById(instance["id"])
-                element_connectors = element.GetConnectors() 
+                element_connectors = element.GetConnectors()
                 self.Rungs[rungs[0]].SelectElement(element)
-                for wire, num in element_connectors["inputs"][0].GetWires():
+                for wire, _num in element_connectors["inputs"][0].GetWires():
                     self.Rungs[rungs[0]].SelectElement(wire)
                 wx.CallAfter(self.RefreshPosition, element)
             elif instance["type"] == "comment":
@@ -240,7 +253,7 @@
                 pos = element.GetPosition()
                 i = 0
                 inserted = False
-                while i < len(self.RungComments) and not inserted: 
+                while i < len(self.RungComments) and not inserted:
                     ipos = self.RungComments[i].GetPosition()
                     if pos[1] < ipos[1]:
                         self.RungComments.insert(i, element)
@@ -248,10 +261,10 @@
                     i += 1
                 if not inserted:
                     self.RungComments.append(element)
-            
-#-------------------------------------------------------------------------------
-#                          Search Element functions
-#-------------------------------------------------------------------------------
+
+    # -------------------------------------------------------------------------------
+    #                          Search Element functions
+    # -------------------------------------------------------------------------------
 
     def FindRung(self, element):
         for i, rung in enumerate(self.Rungs):
@@ -259,10 +272,10 @@
                 return i
         return None
 
-    def FindElement(self, event, exclude_group = False, connectors = True):
+    def FindElement(self, event, exclude_group=False, connectors=True):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             return Viewer.FindElement(self, event, exclude_group, connectors)
-        
+
         dc = self.GetLogicalDC()
         pos = event.GetLogicalPosition(dc)
         if self.SelectedElement and not isinstance(self.SelectedElement, (Graphic_Group, Wire)):
@@ -286,16 +299,16 @@
     def SearchElements(self, bbox):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             return Viewer.SearchElements(self, bbox)
-        
+
         elements = []
         for element in self.Blocks.values() + self.Comments.values():
             if element.IsInSelection(bbox):
                 elements.append(element)
         return elements
 
-#-------------------------------------------------------------------------------
-#                          Mouse event functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Mouse event functions
+    # -------------------------------------------------------------------------------
 
     def OnViewerLeftDown(self, event):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
@@ -345,7 +358,7 @@
                     self.SelectedElement.SetElements(elements)
                     self.SelectedElement.SetSelected(True)
         elif self.Mode == MODE_SELECTION and self.SelectedElement:
-            dc = self.GetLogicalDC() 
+            dc = self.GetLogicalDC()
             if not isinstance(self.SelectedElement, Graphic_Group):
                 if self.IsWire(self.SelectedElement):
                     result = self.SelectedElement.TestSegment(event.GetLogicalPosition(dc), True)
@@ -383,9 +396,9 @@
                 wx.CallAfter(self.SetCurrentCursor, 0)
         event.Skip()
 
-#-------------------------------------------------------------------------------
-#                          Keyboard event functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Keyboard event functions
+    # -------------------------------------------------------------------------------
 
     def OnChar(self, event):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
@@ -434,9 +447,9 @@
             else:
                 event.Skip()
 
-#-------------------------------------------------------------------------------
-#                  Model adding functions from Drop Target
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                  Model adding functions from Drop Target
+    # -------------------------------------------------------------------------------
 
     def AddVariableBlock(self, x, y, scaling, var_class, var_name, var_type):
         if var_type == "BOOL":
@@ -445,10 +458,10 @@
                 contact = LD_Contact(self, CONTACT_NORMAL, var_name, id)
                 width, height = contact.GetMinSize()
                 if scaling is not None:
-                    x = round(float(x) / float(scaling[0])) * scaling[0]
-                    y = round(float(y) / float(scaling[1])) * scaling[1]
-                    width = round(float(width) / float(scaling[0]) + 0.5) * scaling[0]
-                    height = round(float(height) / float(scaling[1]) + 0.5) * scaling[1]
+                    x = round(x / scaling[0]) * scaling[0]
+                    y = round(y / scaling[1]) * scaling[1]
+                    width = round(width / scaling[0] + 0.5) * scaling[0]
+                    height = round(height / scaling[1] + 0.5) * scaling[1]
                 contact.SetPosition(x, y)
                 contact.SetSize(width, height)
                 self.AddBlock(contact)
@@ -458,10 +471,10 @@
                 coil = LD_Coil(self, COIL_NORMAL, var_name, id)
                 width, height = coil.GetMinSize()
                 if scaling is not None:
-                    x = round(float(x) / float(scaling[0])) * scaling[0]
-                    y = round(float(y) / float(scaling[1])) * scaling[1]
-                    width = round(float(width) / float(scaling[0]) + 0.5) * scaling[0]
-                    height = round(float(height) / float(scaling[1]) + 0.5) * scaling[1]
+                    x = round(x / scaling[0]) * scaling[0]
+                    y = round(y / scaling[1]) * scaling[1]
+                    width = round(width / scaling[0] + 0.5) * scaling[0]
+                    height = round(height / scaling[1] + 0.5) * scaling[1]
                 coil.SetPosition(x, y)
                 coil.SetSize(width, height)
                 self.AddBlock(coil)
@@ -474,12 +487,12 @@
         else:
             Viewer.AddVariableBlock(self, x, y, scaling, var_class, var_name, var_type)
 
-#-------------------------------------------------------------------------------
-#                          Adding element functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Adding element functions
+    # -------------------------------------------------------------------------------
 
     def AddLadderRung(self):
-        dialog = LDElementDialog(self.ParentWindow, self.Controler, "coil")
+        dialog = LDElementDialog(self.ParentWindow, self.Controler, self.TagName, "coil")
         dialog.SetPreviewFont(self.GetFont())
         varlist = []
         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug)
@@ -491,7 +504,7 @@
         if returntype == "BOOL":
             varlist.append(self.Controler.GetEditedElementName(self.TagName))
         dialog.SetVariables(varlist)
-        dialog.SetValues({"name":"","type":COIL_NORMAL})
+        dialog.SetValues({"name": "", "type": COIL_NORMAL})
         if dialog.ShowModal() == wx.ID_OK:
             values = dialog.GetValues()
             startx, starty = LD_OFFSET[0], 0
@@ -500,7 +513,7 @@
                 starty = bbox.y + bbox.height
             starty += LD_OFFSET[1]
             rung = Graphic_Group(self)
-            
+
             # Create comment
             id = self.GetNewId()
             comment = Comment(self, _("Comment"), id)
@@ -511,7 +524,7 @@
             self.Controler.AddEditedElementComment(self.TagName, id)
             self.RefreshCommentModel(comment)
             starty += LD_COMMENT_DEFAULTSIZE[1] + LD_OFFSET[1]
-            
+
             # Create LeftPowerRail
             id = self.GetNewId()
             leftpowerrail = LD_PowerRail(self, LEFTRAIL, id)
@@ -521,16 +534,16 @@
             rung.SelectElement(leftpowerrail)
             self.Controler.AddEditedElementPowerRail(self.TagName, id, LEFTRAIL)
             self.RefreshPowerRailModel(leftpowerrail)
-            
+
             # Create Coil
             id = self.GetNewId()
             coil = LD_Coil(self, values["type"], values["name"], id)
-            coil.SetPosition(startx, starty + (LD_LINE_SIZE - LD_ELEMENT_SIZE[1]) / 2)
+            coil.SetPosition(startx, starty + (LD_LINE_SIZE - LD_ELEMENT_SIZE[1]) // 2)
             coil_connectors = coil.GetConnectors()
             self.AddBlock(coil)
             rung.SelectElement(coil)
             self.Controler.AddEditedElementCoil(self.TagName, id)
-            
+
             # Create Wire between LeftPowerRail and Coil
             wire = Wire(self)
             start_connector = coil_connectors["inputs"][0]
@@ -541,7 +554,7 @@
             wire.ConnectEndPoint(None, end_connector)
             self.AddWire(wire)
             rung.SelectElement(wire)
-            
+
             # Create RightPowerRail
             id = self.GetNewId()
             rightpowerrail = LD_PowerRail(self, RIGHTRAIL, id)
@@ -550,7 +563,7 @@
             self.AddBlock(rightpowerrail)
             rung.SelectElement(rightpowerrail)
             self.Controler.AddEditedElementPowerRail(self.TagName, id, RIGHTRAIL)
-            
+
             # Create Wire between LeftPowerRail and Coil
             wire = Wire(self)
             start_connector = rightpowerrail_connectors["inputs"][0]
@@ -574,12 +587,12 @@
             left_element = self.SelectedElement.EndConnected
             if not isinstance(left_element.GetParentBlock(), LD_Coil):
                 wires.append(self.SelectedElement)
-        elif self.SelectedElement and isinstance(self.SelectedElement,Graphic_Group):
+        elif self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
             if False not in [self.IsWire(element) for element in self.SelectedElement.GetElements()]:
                 for element in self.SelectedElement.GetElements():
                     wires.append(element)
         if len(wires) > 0:
-            dialog = LDElementDialog(self.ParentWindow, self.Controler, "contact")
+            dialog = LDElementDialog(self.ParentWindow, self.Controler, self.TagName, "contact")
             dialog.SetPreviewFont(self.GetFont())
             varlist = []
             vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug)
@@ -588,13 +601,13 @@
                     if var.Class != "Output" and var.Type == "BOOL":
                         varlist.append(var.Name)
             dialog.SetVariables(varlist)
-            dialog.SetValues({"name":"","type":CONTACT_NORMAL})
+            dialog.SetValues({"name": "", "type": CONTACT_NORMAL})
             if dialog.ShowModal() == wx.ID_OK:
                 values = dialog.GetValues()
                 points = wires[0].GetSelectedSegmentPoints()
                 id = self.GetNewId()
                 contact = LD_Contact(self, values["type"], values["name"], id)
-                contact.SetPosition(0, points[0].y - (LD_ELEMENT_SIZE[1] + 1) / 2)
+                contact.SetPosition(0, points[0].y - (LD_ELEMENT_SIZE[1] + 1) // 2)
                 self.AddBlock(contact)
                 self.Controler.AddEditedElementContact(self.TagName, id)
                 rungindex = self.FindRung(wires[0])
@@ -663,7 +676,7 @@
                 self.RefreshVisibleElements()
                 self.Refresh(False)
         else:
-            message = wx.MessageDialog(self, _("You must select the wire where a contact should be added!"), _("Error"), wx.OK|wx.ICON_ERROR)
+            message = wx.MessageDialog(self, _("You must select the wire where a contact should be added!"), _("Error"), wx.OK | wx.ICON_ERROR)
             message.ShowModal()
             message.Destroy()
 
@@ -683,10 +696,10 @@
             right_index = []
             for block in blocks:
                 connectors = block.GetConnectors()
-                block_infos = {"lefts":[],"rights":[]}
+                block_infos = {"lefts": [], "rights": []}
                 block_infos.update(connectors)
                 for connector in block_infos["inputs"]:
-                    for wire, handle in connector.GetWires():
+                    for wire, _handle in connector.GetWires():
                         found = False
                         for infos in blocks_infos:
                             if wire.EndConnected in infos["outputs"]:
@@ -703,7 +716,7 @@
                                 index = left_elements.index(wire.EndConnected)
                                 left_index[index] = max(left_index[index], wire.EndConnected.GetWireIndex(wire))
                 for connector in block_infos["outputs"]:
-                    for wire, handle in connector.GetWires():
+                    for wire, _handle in connector.GetWires():
                         found = False
                         for infos in blocks_infos:
                             if wire.StartConnected in infos["inputs"]:
@@ -778,7 +791,7 @@
                     if left_powerrail:
                         powerrail = left_elements[0].GetParentBlock()
                         index = 0
-                        for left_element in left_elements: 
+                        for left_element in left_elements:
                             index = max(index, powerrail.GetConnectorIndex(left_element))
                         powerrail.InsertConnector(index + 1)
                         powerrail.RefreshModel()
@@ -793,7 +806,7 @@
                             new_wire.ConnectEndPoint(None, connectors["outputs"][index + 1])
                         right_elements.reverse()
                     elif right_powerrail:
-                        dialog = LDElementDialog(self.ParentWindow, self.Controleur, "coil")
+                        dialog = LDElementDialog(self.ParentWindow, self.Controleur, self.TagName, "coil")
                         dialog.SetPreviewFont(self.GetFont())
                         varlist = []
                         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug)
@@ -805,17 +818,17 @@
                         if returntype == "BOOL":
                             varlist.append(self.Controler.GetEditedElementName(self.TagName))
                         dialog.SetVariables(varlist)
-                        dialog.SetValues({"name":"","type":COIL_NORMAL})
+                        dialog.SetValues({"name": "", "type": COIL_NORMAL})
                         if dialog.ShowModal() == wx.ID_OK:
                             values = dialog.GetValues()
                             powerrail = right_elements[0].GetParentBlock()
                             index = 0
-                            for right_element in right_elements: 
+                            for right_element in right_elements:
                                 index = max(index, powerrail.GetConnectorIndex(right_element))
                             powerrail.InsertConnector(index + 1)
                             powerrail.RefreshModel()
                             connectors = powerrail.GetConnectors()
-                            
+
                             # Create Coil
                             id = self.GetNewId()
                             coil = LD_Coil(self, values["type"], values["name"], id)
@@ -825,7 +838,7 @@
                             rung.SelectElement(coil)
                             self.Controler.AddEditedElementCoil(self.TagName, id)
                             coil_connectors = coil.GetConnectors()
-                            
+
                             # Create Wire between LeftPowerRail and Coil
                             wire = Wire(self)
                             connectors["inputs"][index + 1].Connect((wire, 0), False)
@@ -835,7 +848,7 @@
                             self.AddWire(wire)
                             rung.SelectElement(wire)
                             left_elements.reverse()
-                            
+
                             for i, left_element in enumerate(left_elements):
                                 # Create Wire between LeftPowerRail and Coil
                                 new_wire = Wire(self)
@@ -844,7 +857,7 @@
                                 left_element.InsertConnect(left_index[i] + 1, (new_wire, -1), False)
                                 new_wire.ConnectStartPoint(None, coil_connectors["inputs"][0])
                                 new_wire.ConnectEndPoint(None, left_element)
-                            
+
                             self.RefreshPosition(coil)
                     else:
                         left_elements.reverse()
@@ -852,7 +865,7 @@
                         for i, left_element in enumerate(left_elements):
                             for j, right_element in enumerate(right_elements):
                                 exist = False
-                                for wire, handle in right_element.GetWires():
+                                for wire, _handle in right_element.GetWires():
                                     exist |= wire.EndConnected == left_element
                                 if not exist:
                                     new_wire = Wire(self)
@@ -879,22 +892,22 @@
                 self.RefreshVisibleElements()
                 self.Refresh(False)
             else:
-                message = wx.MessageDialog(self, _("The group of block must be coherent!"), _("Error"), wx.OK|wx.ICON_ERROR)
+                message = wx.MessageDialog(self, _("The group of block must be coherent!"), _("Error"), wx.OK | wx.ICON_ERROR)
                 message.ShowModal()
                 message.Destroy()
         else:
-            message = wx.MessageDialog(self, _("You must select the block or group of blocks around which a branch should be added!"), _("Error"), wx.OK|wx.ICON_ERROR)
+            message = wx.MessageDialog(self, _("You must select the block or group of blocks around which a branch should be added!"), _("Error"), wx.OK | wx.ICON_ERROR)
             message.ShowModal()
             message.Destroy()
 
     def AddLadderBlock(self):
-        message = wx.MessageDialog(self, _("This option isn't available yet!"), _("Warning"), wx.OK|wx.ICON_EXCLAMATION)
+        message = wx.MessageDialog(self, _("This option isn't available yet!"), _("Warning"), wx.OK | wx.ICON_EXCLAMATION)
         message.ShowModal()
         message.Destroy()
 
-#-------------------------------------------------------------------------------
-#                          Delete element functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Delete element functions
+    # -------------------------------------------------------------------------------
 
     def DeleteContact(self, contact):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
@@ -904,8 +917,8 @@
             rung = self.Rungs[rungindex]
             old_bbox = rung.GetBoundingBox()
             connectors = contact.GetConnectors()
-            input_wires = [wire for wire, handle in connectors["inputs"][0].GetWires()]
-            output_wires = [wire for wire, handle in connectors["outputs"][0].GetWires()]
+            input_wires = [wire for wire, _handle in connectors["inputs"][0].GetWires()]
+            output_wires = [wire for wire, _handle in connectors["outputs"][0].GetWires()]
             left_elements = [(wire.EndConnected, wire.EndConnected.GetWireIndex(wire)) for wire in input_wires]
             right_elements = [(wire.StartConnected, wire.StartConnected.GetWireIndex(wire)) for wire in output_wires]
             for wire in input_wires:
@@ -924,7 +937,7 @@
             for left_element, left_index in left_elements:
                 for right_element, right_index in right_elements:
                     wire_removed = []
-                    for wire, handle in right_element.GetWires():
+                    for wire, _handle in right_element.GetWires():
                         if wire.EndConnected == left_element:
                             wire_removed.append(wire)
                         elif isinstance(wire.EndConnected.GetParentBlock(), LD_PowerRail) and powerrail:
@@ -961,7 +974,7 @@
 
     def RecursiveDeletion(self, element, rung):
         connectors = element.GetConnectors()
-        input_wires = [wire for wire, handle in connectors["inputs"][0].GetWires()]
+        input_wires = [wire for wire, _handle in connectors["inputs"][0].GetWires()]
         left_elements = [wire.EndConnected for wire in input_wires]
         rung.SelectElement(element)
         element.Clean()
@@ -991,7 +1004,7 @@
                     nbcoils += 1
             if nbcoils > 1:
                 connectors = coil.GetConnectors()
-                output_wires = [wire for wire, handle in connectors["outputs"][0].GetWires()]
+                output_wires = [wire for wire, _handle in connectors["outputs"][0].GetWires()]
                 right_elements = [wire.StartConnected for wire in output_wires]
                 for wire in output_wires:
                     wire.Clean()
@@ -1006,7 +1019,7 @@
                             right_block.DeleteConnector(index)
                             powerrail_connectors = right_block.GetConnectors()
                             for connector in powerrail_connectors["inputs"]:
-                                for wire, handle in connector.GetWires():
+                                for wire, _handle in connector.GetWires():
                                     block = wire.EndConnected.GetParentBlock()
                                     endpoint = wire.EndConnected.GetPosition(False)
                                     startpoint = connector.GetPosition(False)
@@ -1051,17 +1064,17 @@
                 rungindex = self.FindRung(wires[0])
                 rung = self.Rungs[rungindex]
                 old_bbox = rung.GetBoundingBox()
-                for wire in wires:
-                    connections = wire.GetSelectedSegmentConnections()
-                    left_block = wire.EndConnected.GetParentBlock()
-                    if wire.EndConnected not in left_elements:
-                        left_elements.append(wire.EndConnected)
-                    if wire.StartConnected not in right_elements:
-                        right_elements.append(wire.StartConnected)
+                for w in wires:
+                    connections = w.GetSelectedSegmentConnections()
+                    left_block = w.EndConnected.GetParentBlock()
+                    if w.EndConnected not in left_elements:
+                        left_elements.append(w.EndConnected)
+                    if w.StartConnected not in right_elements:
+                        right_elements.append(w.StartConnected)
                     if connections == (False, False) or connections == (False, True) and isinstance(left_block, LD_PowerRail):
-                        wire.Clean()
-                        self.RemoveWire(wire)
-                        rung.SelectElement(wire)
+                        w.Clean()
+                        self.RemoveWire(w)
+                        rung.SelectElement(w)
                 for left_element in left_elements:
                     left_block = left_element.GetParentBlock()
                     if isinstance(left_block, LD_PowerRail):
@@ -1071,8 +1084,8 @@
                     else:
                         connectors = left_block.GetConnectors()
                         for connector in connectors["outputs"]:
-                            for wire, handle in connector.GetWires():
-                                self.RefreshPosition(wire.StartConnected.GetParentBlock())
+                            for lwire, _handle in connector.GetWires():
+                                self.RefreshPosition(lwire.StartConnected.GetParentBlock())
                 for right_element in right_elements:
                     self.RefreshPosition(right_element.GetParentBlock())
                 rung.RefreshBoundingBox()
@@ -1080,16 +1093,16 @@
                 self.RefreshRungs(new_bbox.height - old_bbox.height, rungindex + 1)
                 self.SelectedElement = None
 
-#-------------------------------------------------------------------------------
-#                        Refresh element position functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                        Refresh element position functions
+    # -------------------------------------------------------------------------------
 
     def RefreshPosition(self, element, recursive=True):
         # If element is LeftPowerRail, no need to update position
         if isinstance(element, LD_PowerRail) and element.GetType() == LEFTRAIL:
             element.RefreshModel()
             return
-        
+
         # Extract max position of the elements connected to input
         connectors = element.GetConnectors()
         position = element.GetPosition()
@@ -1097,13 +1110,13 @@
         onlyone = []
         for connector in connectors["inputs"]:
             onlyone.append(len(connector.GetWires()) == 1)
-            for wire, handle in connector.GetWires():
+            for wire, _handle in connector.GetWires():
                 onlyone[-1] &= len(wire.EndConnected.GetWires()) == 1
                 leftblock = wire.EndConnected.GetParentBlock()
                 pos = leftblock.GetPosition()
                 size = leftblock.GetSize()
                 maxx = max(maxx, pos[0] + size[0])
-        
+
         # Refresh position of element
         if isinstance(element, LD_Coil):
             interval = LD_WIRECOIL_SIZE
@@ -1114,13 +1127,13 @@
         movex = maxx + interval - position[0]
         element.Move(movex, 0)
         position = element.GetPosition()
-        
+
         # Extract blocks connected to inputs
         blocks = []
         for i, connector in enumerate(connectors["inputs"]):
-            for j, (wire, handle) in enumerate(connector.GetWires()):
+            for j, (wire, _handle) in enumerate(connector.GetWires()):
                 blocks.append(wire.EndConnected.GetParentBlock())
-        
+
         for i, connector in enumerate(connectors["inputs"]):
             startpoint = connector.GetPosition(False)
             previous_blocks = []
@@ -1128,7 +1141,7 @@
             start_offset = 0
             if not onlyone[i]:
                 middlepoint = maxx + LD_WIRE_SIZE
-            for j, (wire, handle) in enumerate(connector.GetWires()):
+            for j, (wire, _handle) in enumerate(connector.GetWires()):
                 block = wire.EndConnected.GetParentBlock()
                 if isinstance(element, LD_PowerRail):
                     pos = block.GetPosition()
@@ -1168,13 +1181,13 @@
                 previous_blocks.append(block)
                 blocks.remove(block)
                 ExtractNextBlocks(block, block_list)
-        
+
         element.RefreshModel(False)
         if recursive:
             for connector in connectors["outputs"]:
-                for wire, handle in connector.GetWires():
+                for wire, _handle in connector.GetWires():
                     self.RefreshPosition(wire.StartConnected.GetParentBlock())
-    
+
     def RefreshRungs(self, movey, fromidx):
         if movey != 0:
             for i in xrange(fromidx, len(self.Rungs)):
@@ -1185,11 +1198,10 @@
                     if self.IsBlock(element):
                         self.RefreshPosition(element)
 
-#-------------------------------------------------------------------------------
-#                          Edit element content functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Edit element content functions
+    # -------------------------------------------------------------------------------
 
     def EditPowerRailContent(self, powerrail):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             Viewer.EditPowerRailContent(self, powerrail)
-
--- a/editors/ProjectNodeEditor.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/editors/ProjectNodeEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,60 +22,63 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from controls import ProjectPropertiesPanel, VariablePanel
-from EditorPanel import EditorPanel
-from ConfTreeNodeEditor import ConfTreeNodeEditor
+from editors.ConfTreeNodeEditor import ConfTreeNodeEditor
+from plcopen.types_enums import ComputeConfigurationName
+
 
 class ProjectNodeEditor(ConfTreeNodeEditor):
-    
+
     SHOW_BASE_PARAMS = False
     ENABLE_REQUIRED = True
     CONFNODEEDITOR_TABS = [
         (_("Config variables"), "_create_VariablePanel"),
         (_("Project properties"), "_create_ProjectPropertiesPanel")]
-    
+
     def _create_VariablePanel(self, prnt):
         self.VariableEditorPanel = VariablePanel(prnt, self, self.Controler, "config", self.Debug)
         self.VariableEditorPanel.SetTagName(self.TagName)
-    
+
         return self.VariableEditorPanel
-    
+
     def _create_ProjectPropertiesPanel(self, prnt):
         self.ProjectProperties = ProjectPropertiesPanel(prnt, self.Controler, self.ParentWindow, self.ENABLE_REQUIRED)
-        
+
         return self.ProjectProperties
-    
+
     def __init__(self, parent, controler, window):
         configuration = controler.GetProjectMainConfigurationName()
         if configuration is not None:
-            tagname = controler.ComputeConfigurationName(configuration)
+            tagname = ComputeConfigurationName(configuration)
         else:
             tagname = ""
-        
+
         ConfTreeNodeEditor.__init__(self, parent, controler, window, tagname)
-        
+
         buttons_sizer = self.GenerateMethodButtonSizer()
         self.MainSizer.InsertSizer(0, buttons_sizer, 0, border=5, flag=wx.ALL)
         self.MainSizer.Layout()
-        
+
         self.VariableEditor = self.VariableEditorPanel
 
     def GetTagName(self):
         return self.Controler.CTNName()
-    
+
     def SetTagName(self, tagname):
         self.TagName = tagname
         if self.VariableEditor is not None:
             self.VariableEditor.SetTagName(tagname)
-    
+
     def GetTitle(self):
         fullname = _(self.Controler.CTNName())
         if self.Controler.CTNTestModified():
             return "~%s~" % fullname
         return fullname
-    
+
     def RefreshView(self, variablepanel=True):
         ConfTreeNodeEditor.RefreshView(self)
         self.VariableEditorPanel.RefreshView()
@@ -83,12 +86,11 @@
 
     def GetBufferState(self):
         return self.Controler.GetBufferState()
-        
+
     def Undo(self):
         self.Controler.LoadPrevious()
         self.ParentWindow.CloseTabsWithoutModel()
-            
+
     def Redo(self):
         self.Controler.LoadNext()
         self.ParentWindow.CloseTabsWithoutModel()
-    
--- a/editors/ResourceEditor.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/editors/ResourceEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,23 +22,32 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 import wx.lib.buttons
 import wx.grid
+from six.moves import xrange
 
 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD, ERROR_HIGHLIGHT
 from controls import CustomGrid, CustomTable, DurationCellEditor
 from dialogs.DurationEditorDialog import IEC_TIME_MODEL
-from EditorPanel import EditorPanel
+from editors.EditorPanel import EditorPanel
 from util.BitmapLibrary import GetBitmap
-
-#-------------------------------------------------------------------------------
+from util.TranslationCatalogs import NoTranslate
+from plcopen.structures import TestIdentifier, IEC_KEYWORDS
+
+
+# -------------------------------------------------------------------------------
 #                          Configuration Editor class
-#-------------------------------------------------------------------------------
-
-[ID_CONFIGURATIONEDITOR,
+# -------------------------------------------------------------------------------
+
+
+[
+    ID_CONFIGURATIONEDITOR,
 ] = [wx.NewId() for _init_ctrls in range(1)]
 
+
 class ConfigurationEditor(EditorPanel):
 
     ID = ID_CONFIGURATIONEDITOR
@@ -59,31 +68,34 @@
         return self.Controler.GetEditedElement(self.TagName) is None
 
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                            Resource Editor class
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 def GetTasksTableColnames():
-    _ = lambda x : x
+    _ = NoTranslate
     return [_("Name"), _("Triggering"), _("Single"), _("Interval"), _("Priority")]
 
+
 def GetTaskTriggeringOptions():
-    _ = lambda x : x
+    _ = NoTranslate
     return [_("Interrupt"), _("Cyclic")]
-TASKTRIGGERINGOPTIONS_DICT = dict([(_(option), option) for option in GetTaskTriggeringOptions()])
-
-SingleCellEditor = lambda *x : wx.grid.GridCellChoiceEditor()
+
+
+def SingleCellEditor(*x):
+    return wx.grid.GridCellChoiceEditor()
+
 
 def CheckSingle(single, varlist):
     return single in varlist
 
 
 def GetInstancesTableColnames():
-    _ = lambda x : x
+    _ = NoTranslate
     return [_("Name"), _("Type"), _("Task")]
 
+
 class ResourceTable(CustomTable):
-
     """
     A custom wx.grid.Grid Table using user supplied data
     """
@@ -92,6 +104,8 @@
         CustomTable.__init__(self, parent, data, colnames)
         self.ColAlignements = []
         self.ColSizes = []
+        self.TASKTRIGGERINGOPTIONS_DICT = dict([(_(option), option)
+                                                for option in GetTaskTriggeringOptions()])
 
     def GetColAlignements(self):
         return self.ColAlignements
@@ -108,7 +122,7 @@
     def GetValue(self, row, col):
         if row < self.GetNumberRows():
             colname = self.GetColLabelValue(col, False)
-            value = str(self.data[row].get(colname, ""))
+            value = self.data[row].get(colname, "")
             if colname == "Triggering":
                 return _(value)
             return value
@@ -117,7 +131,7 @@
         if col < len(self.colnames):
             colname = self.GetColLabelValue(col, False)
             if colname == "Triggering":
-                value = TASKTRIGGERINGOPTIONS_DICT[value]
+                value = self.TASKTRIGGERINGOPTIONS_DICT[value]
             self.data[row][colname] = value
 
     def _updateColAttrs(self, grid):
@@ -154,12 +168,12 @@
                     if interval != "" and IEC_TIME_MODEL.match(interval.upper()) is None:
                         error = True
                 elif colname == "Single":
-                    editor = SingleCellEditor(self,colname)
+                    editor = SingleCellEditor(self, colname)
                     editor.SetParameters(self.Parent.VariableList)
                     if self.GetValueByName(row, "Triggering") != "Interrupt":
                         grid.SetReadOnly(row, col, True)
                     single = self.GetValueByName(row, colname)
-                    if single != "" and not CheckSingle(single,self.Parent.VariableList):
+                    if single != "" and not CheckSingle(single, self.Parent.VariableList):
                         error = True
                 elif colname == "Triggering":
                     editor = wx.grid.GridCellChoiceEditor()
@@ -185,10 +199,9 @@
                 grid.SetCellTextColour(row, col, highlight_colours[1])
             self.ResizeRow(grid, row)
 
-
-#-------------------------------------------------------------------------------
-#                        Highlights showing functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                        Highlights showing functions
+    # -------------------------------------------------------------------------------
 
     def AddHighlight(self, infos, highlight_type):
         row_highlights = self.Highlights.setdefault(infos[0], {})
@@ -199,7 +212,7 @@
         if highlight_type is None:
             self.Highlights = {}
         else:
-            for row, row_highlights in self.Highlights.iteritems():
+            for _row, row_highlights in self.Highlights.iteritems():
                 row_items = row_highlights.items()
                 for col, col_highlights in row_items:
                     if highlight_type in col_highlights:
@@ -208,13 +221,12 @@
                         row_highlights.pop(col)
 
 
-
 class ResourceEditor(EditorPanel):
 
     VARIABLE_PANEL_TYPE = "resource"
 
     def _init_Editor(self, parent):
-        self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER|wx.TAB_TRAVERSAL)
+        self.Editor = wx.Panel(parent, style=wx.SUNKEN_BORDER | wx.TAB_TRAVERSAL)
 
         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
         main_sizer.AddGrowableCol(0)
@@ -225,7 +237,7 @@
         tasks_sizer.AddGrowableCol(0)
         tasks_sizer.AddGrowableRow(1)
         main_sizer.AddSizer(tasks_sizer, border=5,
-              flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
+                            flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
 
         tasks_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
         tasks_buttons_sizer.AddGrowableCol(0)
@@ -241,7 +253,9 @@
                 ("UpTaskButton", "up", _("Move task up")),
                 ("DownTaskButton", "down", _("Move task down"))]:
             button = wx.lib.buttons.GenBitmapButton(self.Editor,
-                  bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
+                                                    bitmap=GetBitmap(bitmap),
+                                                    size=wx.Size(28, 28),
+                                                    style=wx.NO_BORDER)
             button.SetToolTipString(help)
             setattr(self, name, button)
             tasks_buttons_sizer.AddWindow(button)
@@ -254,7 +268,7 @@
         instances_sizer.AddGrowableCol(0)
         instances_sizer.AddGrowableRow(1)
         main_sizer.AddSizer(instances_sizer, border=5,
-              flag=wx.GROW|wx.BOTTOM|wx.LEFT|wx.RIGHT)
+                            flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
 
         instances_buttons_sizer = wx.FlexGridSizer(cols=5, hgap=5, rows=1, vgap=0)
         instances_buttons_sizer.AddGrowableCol(0)
@@ -269,15 +283,15 @@
                 ("DeleteInstanceButton", "remove_element", _("Remove instance")),
                 ("UpInstanceButton", "up", _("Move instance up")),
                 ("DownInstanceButton", "down", _("Move instance down"))]:
-            button = wx.lib.buttons.GenBitmapButton(self.Editor,
-                  bitmap=GetBitmap(bitmap), size=wx.Size(28, 28), style=wx.NO_BORDER)
+            button = wx.lib.buttons.GenBitmapButton(
+                self.Editor, bitmap=GetBitmap(bitmap),
+                size=wx.Size(28, 28), style=wx.NO_BORDER)
             button.SetToolTipString(help)
             setattr(self, name, button)
             instances_buttons_sizer.AddWindow(button)
 
         self.InstancesGrid = CustomGrid(self.Editor, style=wx.VSCROLL)
-        self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
-              self.OnInstancesGridCellChange)
+        self.InstancesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnInstancesGridCellChange)
         instances_sizer.AddWindow(self.InstancesGrid, flag=wx.GROW)
 
         self.Editor.SetSizer(main_sizer)
@@ -288,7 +302,8 @@
         self.RefreshHighlightsTimer = wx.Timer(self, -1)
         self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer)
 
-        self.TasksDefaultValue = {"Name" : "", "Triggering" : "", "Single" : "", "Interval" : "", "Priority" : 0}
+        self.TasksDefaultValue = {"Name": "task0", "Triggering": "Cyclic",
+                                  "Single": "", "Interval": "T#20ms", "Priority": 0}
         self.TasksTable = ResourceTable(self, [], GetTasksTableColnames())
         self.TasksTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT])
         self.TasksTable.SetColSizes([200, 100, 100, 150, 100])
@@ -299,7 +314,15 @@
                                    "Down": self.DownTaskButton})
 
         def _AddTask(new_row):
-            self.TasksTable.InsertRow(new_row, self.TasksDefaultValue.copy())
+            if new_row > 0:
+                row_content = self.TasksTable.data[new_row-1].copy()
+                old_name = row_content['Name']
+                row_content['Name'] =\
+                    self.Controler.GenerateNewName(self.TagName, old_name, old_name+'%d')
+            else:
+                row_content = self.TasksDefaultValue.copy()
+
+            self.TasksTable.InsertRow(new_row, row_content)
             self.RefreshModel()
             self.RefreshView()
             return new_row
@@ -323,7 +346,7 @@
         self.TasksTable.ResetView(self.TasksGrid)
         self.TasksGrid.RefreshButtons()
 
-        self.InstancesDefaultValue = {"Name" : "", "Type" : "", "Task" : ""}
+        self.InstancesDefaultValue = {"Name": "instance0", "Type": "", "Task": ""}
         self.InstancesTable = ResourceTable(self, [], GetInstancesTableColnames())
         self.InstancesTable.SetColAlignements([wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT])
         self.InstancesTable.SetColSizes([200, 150, 150])
@@ -334,7 +357,15 @@
                                        "Down": self.DownInstanceButton})
 
         def _AddInstance(new_row):
-            self.InstancesTable.InsertRow(new_row, self.InstancesDefaultValue.copy())
+            if new_row > 0:
+                row_content = self.InstancesTable.data[new_row - 1].copy()
+                old_name = row_content['Name']
+                row_content['Name'] =\
+                    self.Controler.GenerateNewName(self.TagName, old_name, old_name+'%d')
+            else:
+                row_content = self.InstancesDefaultValue.copy()
+
+            self.InstancesTable.InsertRow(new_row, row_content)
             self.RefreshModel()
             self.RefreshView()
             return new_row
@@ -362,9 +393,11 @@
                 rows = self.InstancesTable.GetNumberRows()
                 row = self.InstancesGrid.GetGridCursorRow()
                 self.DeleteInstanceButton.Enable(rows > 0)
-                self.UpInstanceButton.Enable(row > 0 and
+                self.UpInstanceButton.Enable(
+                    row > 0 and
                     self.InstancesTable.GetValueByName(row, "Task") == self.InstancesTable.GetValueByName(row - 1, "Task"))
-                self.DownInstanceButton.Enable(0 <= row < rows - 1 and
+                self.DownInstanceButton.Enable(
+                    0 <= row < rows - 1 and
                     self.InstancesTable.GetValueByName(row, "Task") == self.InstancesTable.GetValueByName(row + 1, "Task"))
         setattr(self.InstancesGrid, "RefreshButtons", _RefreshInstanceButtons)
 
@@ -381,17 +414,17 @@
         self.TypeList = ""
         blocktypes = self.Controler.GetBlockResource()
         for blocktype in blocktypes:
-            self.TypeList += ",%s"%blocktype
+            self.TypeList += ",%s" % blocktype
 
     def RefreshTaskList(self):
         self.TaskList = ""
         for row in xrange(self.TasksTable.GetNumberRows()):
-            self.TaskList += ",%s"%self.TasksTable.GetValueByName(row, "Name")
+            self.TaskList += ",%s" % self.TasksTable.GetValueByName(row, "Name")
 
     def RefreshVariableList(self):
         self.VariableList = ""
         for variable in self.Controler.GetEditedResourceVariables(self.TagName):
-            self.VariableList += ",%s"%variable
+            self.VariableList += ",%s" % variable
 
     def RefreshModel(self):
         self.Controler.SetEditedResourceInfos(self.TagName, self.TasksTable.GetData(), self.InstancesTable.GetData())
@@ -432,9 +465,28 @@
         self.TasksGrid.RefreshButtons()
         self.InstancesGrid.RefreshButtons()
 
+    def ShowErrorMessage(self, message):
+        dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
+        dialog.ShowModal()
+        dialog.Destroy()
+
     def OnTasksGridCellChange(self, event):
         row, col = event.GetRow(), event.GetCol()
         if self.TasksTable.GetColLabelValue(col, False) == "Name":
+            value = self.TasksTable.GetValue(row, col)
+            message = None
+
+            if not TestIdentifier(value):
+                message = _("\"%s\" is not a valid identifier!") % value
+            elif value.upper() in IEC_KEYWORDS:
+                message = _("\"%s\" is a keyword. It can't be used!") % value
+            elif value.upper() in [var["Name"].upper() for i, var in enumerate(self.TasksTable.data) if i != row]:
+                message = _("A task with the same name already exists!")
+            if message is not None:
+                event.Veto()
+                wx.CallAfter(self.ShowErrorMessage, message)
+                return
+
             tasklist = [name for name in self.TaskList.split(",") if name != ""]
             for i in xrange(self.TasksTable.GetNumberRows()):
                 task = self.TasksTable.GetValueByName(i, "Name")
@@ -447,6 +499,8 @@
                     name = self.InstancesTable.GetValueByName(i, "Task").upper()
                     if old_name == name:
                         self.InstancesTable.SetValueByName(i, "Task", new_name)
+        if self.TasksTable.GetColLabelValue(col, False) == "Triggering":
+            self.TasksTable.SetValueByName(row, "Interval", "T#20ms")
         self.RefreshModel()
         colname = self.TasksTable.GetColLabelValue(col, False)
         if colname in ["Triggering", "Name", "Single", "Interval"]:
@@ -454,14 +508,30 @@
         event.Skip()
 
     def OnInstancesGridCellChange(self, event):
+        row, col = event.GetRow(), event.GetCol()
+        if self.InstancesTable.GetColLabelValue(col, False) == "Name":
+            value = self.InstancesTable.GetValue(row, col)
+            message = None
+
+            if not TestIdentifier(value):
+                message = _("\"%s\" is not a valid identifier!") % value
+            elif value.upper() in IEC_KEYWORDS:
+                message = _("\"%s\" is a keyword. It can't be used!") % value
+            elif value.upper() in [var["Name"].upper() for i, var in enumerate(self.InstancesTable.data) if i != row]:
+                message = _("An instance with the same name already exists!")
+            if message is not None:
+                event.Veto()
+                wx.CallAfter(self.ShowErrorMessage, message)
+                return
+
         self.RefreshModel()
         self.ParentWindow.RefreshPouInstanceVariablesPanel()
         self.InstancesGrid.RefreshButtons()
         event.Skip()
 
-#-------------------------------------------------------------------------------
-#                        Highlights showing functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                        Highlights showing functions
+    # -------------------------------------------------------------------------------
 
     def OnRefreshHighlightsTimer(self, event):
         self.RefreshView()
--- a/editors/SFCViewer.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/editors/SFCViewer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,11 +22,13 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-from types import *
+
+from __future__ import absolute_import
+from __future__ import division
 
 import wx
 
-from Viewer import *
+from editors.Viewer import *
 from graphics.SFC_Objects import *
 from graphics.GraphicCommons import SELECTION_DIVERGENCE, \
     SELECTION_CONVERGENCE, SIMULTANEOUS_DIVERGENCE, SIMULTANEOUS_CONVERGENCE, EAST, NORTH, WEST, SOUTH
@@ -35,7 +37,7 @@
 
 
 class SFC_Viewer(Viewer):
-    
+
     SFC_StandardRules = {
         # The key of this dict is a block that user try to connect,
         # and the value is a list of blocks, that can be connected with the current block
@@ -61,7 +63,7 @@
         SELECTION_DIVERGENCE: [("SFC_Transition", SOUTH)],
 
         SELECTION_CONVERGENCE: [("SFC_Step", SOUTH),
-                                  ("SFC_Jump", SOUTH)],
+                                ("SFC_Jump", SOUTH)],
 
         SIMULTANEOUS_DIVERGENCE: [("SFC_Step", SOUTH)],
 
@@ -82,10 +84,10 @@
         "LD_Coil": [("SFC_Transition", WEST)]
     }
 
-    def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""):
+    def __init__(self, parent, tagname, window, controler, debug=False, instancepath=""):
         Viewer.__init__(self, parent, tagname, window, controler, debug, instancepath)
         self.CurrentLanguage = "SFC"
-    
+
     def ConnectConnectors(self, start, end):
         startpoint = [start.GetPosition(False), start.GetDirection()]
         endpoint = [end.GetPosition(False), end.GetDirection()]
@@ -96,8 +98,8 @@
         wire.ConnectStartPoint(None, start)
         wire.ConnectEndPoint(None, end)
         return wire
-    
-    def CreateTransition(self, connector, next = None):
+
+    def CreateTransition(self, connector, next=None):
         previous = connector.GetParentBlock()
         id = self.GetNewId()
         transition = SFC_Transition(self, "reference", "", 0, id)
@@ -124,7 +126,7 @@
                 next_block.RefreshPosition()
             transition.RefreshOutputModel(True)
         return transition
-    
+
     def RemoveTransition(self, transition):
         connectors = transition.GetConnectors()
         input_wires = connectors["input"].GetWires()
@@ -146,8 +148,8 @@
         self.Controler.RemoveEditedElementInstance(self.TagName, transition.GetId())
         wire = self.ConnectConnectors(next, previous)
         return wire
-    
-    def CreateStep(self, name, connector, next = None):
+
+    def CreateStep(self, name, connector, next=None):
         previous = connector.GetParentBlock()
         id = self.GetNewId()
         step = SFC_Step(self, name, False, id)
@@ -213,9 +215,9 @@
         else:
             return None
 
-#-------------------------------------------------------------------------------
-#                          Mouse event functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Mouse event functions
+    # -------------------------------------------------------------------------------
 
     def OnViewerLeftDown(self, event):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
@@ -282,14 +284,20 @@
                 self.SelectedElement.OnLeftUp(event, self.GetLogicalDC(), self.Scaling)
                 self.SelectedElement.Refresh()
             wx.CallAfter(self.SetCurrentCursor, 0)
-        elif self.Mode == MODE_WIRE and self.SelectedElement:
-            self.SelectedElement.ResetPoints()
-            self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
-            self.SelectedElement.GeneratePoints()
-            self.SelectedElement.RefreshModel()
-            self.SelectedElement.SetSelected(True)
+        #
+        # FIXME:
+        # This code was forgotten by commit
+        # 9c74d00ce93e from plcopeneditor_history repository
+        # 'Last bugs on block and wire moving, resizing with cursor fixed'
+        #
+        # elif self.Mode == MODE_WIRE and self.SelectedElement:
+        #     self.SelectedElement.ResetPoints()
+        #     self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
+        #     self.SelectedElement.GeneratePoints()
+        #     self.SelectedElement.RefreshModel()
+        #     self.SelectedElement.SetSelected(True)
         event.Skip()
-    
+
     def OnViewerRightUp(self, event):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             Viewer.OnViewerRightUp(self, event)
@@ -307,7 +315,7 @@
                     self.SelectedElement.Refresh()
                 wx.CallAfter(self.SetCurrentCursor, 0)
         event.Skip()
-    
+
     def OnViewerLeftDClick(self, event):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             Viewer.OnViewerLeftDClick(self, event)
@@ -315,7 +323,7 @@
             self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
             self.Refresh(False)
         event.Skip()
-    
+
     def OnViewerMotion(self, event):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             Viewer.OnViewerMotion(self, event)
@@ -326,11 +334,17 @@
                 if not self.IsWire(self.SelectedElement) and not isinstance(self.SelectedElement, Graphic_Group):
                     self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
                     self.SelectedElement.Refresh()
-            elif self.Mode == MODE_WIRE and self.SelectedElement:
-                self.SelectedElement.ResetPoints()
-                self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
-                self.SelectedElement.GeneratePoints()
-                self.SelectedElement.Refresh()
+            #
+            # FIXME:
+            # This code was forgotten by commit
+            # 9c74d00ce93e from plcopeneditor_history repository
+            # 'Last bugs on block and wire moving, resizing with cursor fixed'
+            #
+            # elif self.Mode == MODE_WIRE and self.SelectedElement:
+            #     self.SelectedElement.ResetPoints()
+            #     self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
+            #     self.SelectedElement.GeneratePoints()
+            #     self.SelectedElement.Refresh()
             self.UpdateScrollPos(event)
         event.Skip()
 
@@ -341,12 +355,12 @@
         return blockName
 
     # This method check the IEC 61131-3 compatibility between two SFC blocks
-    def BlockCompatibility(self,startblock = None, endblock = None, direction = None):
-        if startblock!= None and endblock != None and (isinstance(startblock,SFC_Objects)\
-                                                               or isinstance(endblock,SFC_Objects)):
+    def BlockCompatibility(self, startblock=None, endblock=None, direction=None):
+        if startblock is not None and endblock is not None and \
+           (isinstance(startblock, SFC_Objects) or isinstance(endblock, SFC_Objects)):
             # Full "SFC_StandardRules" table would be symmetrical and
             # to avoid duplicate records and minimize the table only upper part is defined.
-            if (direction == SOUTH or direction == EAST):
+            if direction == SOUTH or direction == EAST:
                 startblock, endblock = endblock, startblock
             start = self.GetBlockName(startblock)
             end = self.GetBlockName(endblock)
@@ -356,9 +370,9 @@
             return False
         return True
 
-#-------------------------------------------------------------------------------
-#                          Keyboard event functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Keyboard event functions
+    # -------------------------------------------------------------------------------
 
     def OnChar(self, event):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
@@ -424,13 +438,13 @@
                     self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, scaling[1])), False)
             else:
                 event.Skip()
-        
-#-------------------------------------------------------------------------------
-#                          Adding element functions
-#-------------------------------------------------------------------------------
+
+    # -------------------------------------------------------------------------------
+    #                          Adding element functions
+    # -------------------------------------------------------------------------------
 
     def AddInitialStep(self, pos):
-        dialog = SFCStepNameDialog(self.ParentWindow, _("Please enter step name"), _("Add a new initial step"), "", wx.OK|wx.CANCEL)
+        dialog = SFCStepNameDialog(self.ParentWindow, _("Please enter step name"), _("Add a new initial step"), "", wx.OK | wx.CANCEL)
         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
         dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug))
         dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)])
@@ -452,7 +466,7 @@
 
     def AddStep(self):
         if self.SelectedElement in self.Wires or isinstance(self.SelectedElement, SFC_Step):
-            dialog = SFCStepNameDialog(self.ParentWindow, _("Add a new step"), _("Please enter step name"), "", wx.OK|wx.CANCEL)
+            dialog = SFCStepNameDialog(self.ParentWindow, _("Add a new step"), _("Please enter step name"), "", wx.OK | wx.CANCEL)
             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
             dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug))
             dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)])
@@ -503,7 +517,7 @@
                 self.RefreshScrollBars()
                 self.Refresh(False)
             dialog.Destroy()
-    
+
     def AddStepAction(self):
         if isinstance(self.SelectedElement, SFC_Step):
             connectors = self.SelectedElement.GetConnectors()
@@ -520,7 +534,7 @@
                     pos = connectors["action"].GetPosition(False)
                     id = self.GetNewId()
                     actionblock = SFC_ActionBlock(self, [], id)
-                    actionblock.SetPosition(pos.x + SFC_WIRE_MIN_SIZE, pos.y - SFC_STEP_DEFAULT_SIZE[1] / 2)
+                    actionblock.SetPosition(pos.x + SFC_WIRE_MIN_SIZE, pos.y - SFC_STEP_DEFAULT_SIZE[1] // 2)
                     actionblock_connector = actionblock.GetConnector()
                     wire = self.ConnectConnectors(actionblock_connector, connectors["action"])
                     wire.SetPoints([wx.Point(pos.x + SFC_WIRE_MIN_SIZE, pos.y), wx.Point(pos.x, pos.y)])
@@ -532,10 +546,10 @@
                     self.RefreshScrollBars()
                     self.Refresh(False)
                 dialog.Destroy()
-    
+
     def AddDivergence(self):
-        if self.SelectedElement in self.Wires or isinstance(self.SelectedElement, Graphic_Group) or isinstance(self.SelectedElement, SFC_Step):        
-            dialog = SFCDivergenceDialog(self.ParentWindow)
+        if self.SelectedElement in self.Wires or isinstance(self.SelectedElement, (Graphic_Group, SFC_Step)):
+            dialog = SFCDivergenceDialog(self.ParentWindow, self.Controler, self.TagName)
             dialog.SetPreviewFont(self.GetFont())
             if dialog.ShowModal() == wx.ID_OK:
                 value = dialog.GetValues()
@@ -579,7 +593,7 @@
                     self.AddBlock(divergence)
                     self.Controler.AddEditedElementDivergence(self.TagName, id, value["type"])
                     self.RefreshDivergenceModel(divergence)
-                    for index, connector in enumerate(divergence_connectors["outputs"]):
+                    for _index, connector in enumerate(divergence_connectors["outputs"]):
                         if next:
                             wire = self.ConnectConnectors(next, connector)
                             pos = connector.GetPosition(False)
@@ -593,7 +607,7 @@
                         else:
                             transition = self.CreateTransition(connector)
                             transition_connectors = transition.GetConnectors()
-                            step = self.CreateStep("Step", transition_connectors["output"])
+                            _step = self.CreateStep("Step", transition_connectors["output"])
                 elif value["type"] == SIMULTANEOUS_DIVERGENCE:
                     if self.SelectedElement in self.Wires and isinstance(self.SelectedElement.EndConnected.GetParentBlock(), SFC_Transition):
                         self.SelectedElement.SetSelectedSegment(None)
@@ -637,7 +651,7 @@
                     self.AddBlock(divergence)
                     self.Controler.AddEditedElementDivergence(self.TagName, id, value["type"])
                     self.RefreshDivergenceModel(divergence)
-                    for index, connector in enumerate(divergence_connectors["outputs"]):
+                    for _index, connector in enumerate(divergence_connectors["outputs"]):
                         if next:
                             wire = self.ConnectConnectors(next, connector)
                             pos = connector.GetPosition(False)
@@ -649,7 +663,7 @@
                             next_block.RefreshModel()
                             next = None
                         else:
-                            step = self.CreateStep("Step", connector)
+                            _step = self.CreateStep("Step", connector)
                 elif isinstance(self.SelectedElement, Graphic_Group) and len(self.SelectedElement.GetElements()) > 1:
                     next = None
                     for element in self.SelectedElement.GetElements():
@@ -729,7 +743,7 @@
                 self.RefreshScrollBars()
                 self.Refresh(False)
             dialog.Destroy()
-    
+
     def AddDivergenceBranch(self, divergence):
         if isinstance(divergence, SFC_Divergence):
             if self.GetDrawingMode() == FREEDRAWING_MODE:
@@ -746,11 +760,11 @@
                         previous = transition_connectors["output"]
                     else:
                         previous = divergence_connectors["outputs"][-1]
-                    step = self.CreateStep("Step", previous)
+                    _step = self.CreateStep("Step", previous)
             self.RefreshBuffer()
             self.RefreshScrollBars()
             self.Refresh(False)
-    
+
     def RemoveDivergenceBranch(self, divergence):
         if isinstance(divergence, SFC_Divergence):
             if self.GetDrawingMode() == FREEDRAWING_MODE:
@@ -759,16 +773,18 @@
                 self.RefreshBuffer()
                 self.RefreshScrollBars()
                 self.Refresh(False)
-    
+
     def AddJump(self):
         if isinstance(self.SelectedElement, SFC_Step) and not self.SelectedElement.Output:
             choices = []
             for block in self.Blocks:
                 if isinstance(block, SFC_Step):
                     choices.append(block.GetName())
-            dialog = wx.SingleChoiceDialog(self.ParentWindow, 
-                  _("Add a new jump"), _("Please choose a target"), 
-                  choices, wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
+            dialog = wx.SingleChoiceDialog(self.ParentWindow,
+                                           _("Add a new jump"),
+                                           _("Please choose a target"),
+                                           choices,
+                                           wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
             if dialog.ShowModal() == wx.ID_OK:
                 value = dialog.GetStringSelection()
                 self.SelectedElement.AddOutput()
@@ -796,7 +812,7 @@
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             Viewer.EditStepContent(self, step)
         else:
-            dialog = SFCStepNameDialog(self.ParentWindow, _("Edit step name"), _("Please enter step name"), step.GetName(), wx.OK|wx.CANCEL)
+            dialog = SFCStepNameDialog(self.ParentWindow, _("Edit step name"), _("Please enter step name"), step.GetName(), wx.OK | wx.CANCEL)
             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
             dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug))
             dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step) and block.GetName() != step.GetName()])
@@ -812,9 +828,9 @@
                 self.Refresh(False)
             dialog.Destroy()
 
-#-------------------------------------------------------------------------------
-#                          Delete element functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Delete element functions
+    # -------------------------------------------------------------------------------
 
     def DeleteStep(self, step):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
@@ -884,7 +900,7 @@
                                 self.DeleteDivergence(previous_block)
                             else:
                                 self.RefreshDivergenceModel(previous_block)
-        
+
     def DeleteTransition(self, transition):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             Viewer.DeleteTransition(self, transition)
@@ -919,7 +935,7 @@
                     self.DeleteDivergence(next_block)
                 else:
                     self.RefreshDivergenceModel(next_block)
-            
+
     def DeleteDivergence(self, divergence):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             Viewer.DeleteDivergence(self, divergence)
@@ -979,8 +995,8 @@
                     next_pos = next.GetPosition(False)
                     wire_size = GetWireSize(previous_block)
                     previous_block.RefreshOutputPosition((0, previous_pos.y + wire_size - next_pos.y))
-                    wire.SetPoints([wx.Point(previous_pos.x, previous_pos.y + wire_size), 
-                        wx.Point(previous_pos.x, previous_pos.y)])
+                    wire.SetPoints([wx.Point(previous_pos.x, previous_pos.y + wire_size),
+                                    wx.Point(previous_pos.x, previous_pos.y)])
                     if isinstance(next_block, SFC_Divergence):
                         next_block.RefreshPosition()
                     previous_block.RefreshOutputModel(True)
@@ -1009,12 +1025,12 @@
                 next_pos = next.GetPosition(False)
                 wire_size = GetWireSize(previous_block)
                 previous_block.RefreshOutputPosition((previous_pos.x - next_pos.x, previous_pos.y + wire_size - next_pos.y))
-                wire.SetPoints([wx.Point(previous_pos.x, previous_pos.y + wire_size), 
-                    wx.Point(previous_pos.x, previous_pos.y)])
+                wire.SetPoints([wx.Point(previous_pos.x, previous_pos.y + wire_size),
+                                wx.Point(previous_pos.x, previous_pos.y)])
                 if isinstance(next_block, SFC_Divergence):
                     next_block.RefreshPosition()
                 previous_block.RefreshOutputModel(True)
-            
+
     def DeleteJump(self, jump):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             Viewer.DeleteJump(self, jump)
@@ -1049,7 +1065,7 @@
                         self.DeleteDivergence(previous_block)
                     else:
                         previous_block.RefreshModel()
-            
+
     def DeleteActionBlock(self, actionblock):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             Viewer.DeleteActionBlock(self, actionblock)
@@ -1069,14 +1085,14 @@
             self.RefreshStepModel(step)
             step.RefreshOutputPosition()
             step.RefreshOutputModel(True)
-            
+
     def DeleteWire(self, wire):
         if self.GetDrawingMode() == FREEDRAWING_MODE:
             Viewer.DeleteWire(self, wire)
 
-#-------------------------------------------------------------------------------
-#                          Model update functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Model update functions
+    # -------------------------------------------------------------------------------
 
     def RefreshBlockModel(self, block):
         blockid = block.GetId()
@@ -1087,4 +1103,3 @@
         infos["width"], infos["height"] = block.GetSize()
         infos["connectors"] = block.GetConnectors()
         self.Controler.SetEditedElementBlockInfos(self.TagName, blockid, infos)
-
--- a/editors/TextViewer.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/editors/TextViewer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,20 +22,24 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
 import re
-from types import *
+from functools import reduce
 
 import wx
 import wx.stc
+from six.moves import xrange
 
 from graphics.GraphicCommons import ERROR_HIGHLIGHT, SEARCH_RESULT_HIGHLIGHT, REFRESH_HIGHLIGHT_PERIOD
-from plcopen.structures import ST_BLOCK_START_KEYWORDS, ST_BLOCK_END_KEYWORDS, IEC_BLOCK_START_KEYWORDS, IEC_BLOCK_END_KEYWORDS, LOCATIONDATATYPES
-from EditorPanel import EditorPanel
-from controls.CustomStyledTextCtrl import CustomStyledTextCtrl, faces, GetCursorPos, NAVIGATION_KEYS
-
-#-------------------------------------------------------------------------------
+from plcopen.structures import ST_BLOCK_START_KEYWORDS, IEC_BLOCK_START_KEYWORDS, LOCATIONDATATYPES
+from editors.EditorPanel import EditorPanel
+from controls.CustomStyledTextCtrl import CustomStyledTextCtrl, faces, GetCursorPos
+
+# -------------------------------------------------------------------------------
 #                         Textual programs Viewer class
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 
 NEWLINE = "\n"
@@ -51,15 +55,16 @@
  STC_PLC_EMPTY] = range(11)
 [SPACE, WORD, NUMBER, STRING, WSTRING, COMMENT, PRAGMA, DPRAGMA] = range(8)
 
-[ID_TEXTVIEWER, ID_TEXTVIEWERTEXTCTRL,
+[
+    ID_TEXTVIEWER, ID_TEXTVIEWERTEXTCTRL,
 ] = [wx.NewId() for _init_ctrls in range(2)]
 
 re_texts = {}
 re_texts["letter"] = "[A-Za-z]"
 re_texts["digit"] = "[0-9]"
-re_texts["identifier"] = "((?:%(letter)s|(?:_(?:%(letter)s|%(digit)s)))(?:_?(?:%(letter)s|%(digit)s))*)"%re_texts
+re_texts["identifier"] = "((?:%(letter)s|(?:_(?:%(letter)s|%(digit)s)))(?:_?(?:%(letter)s|%(digit)s))*)" % re_texts
 IDENTIFIER_MODEL = re.compile(re_texts["identifier"])
-LABEL_MODEL = re.compile("[ \t\n]%(identifier)s:[ \t\n]"%re_texts)
+LABEL_MODEL = re.compile("[ \t\n]%(identifier)s:[ \t\n]" % re_texts)
 EXTENSIBLE_PARAMETER = re.compile("IN[1-9][0-9]*$")
 
 HIGHLIGHT_TYPES = {
@@ -67,23 +72,18 @@
     SEARCH_RESULT_HIGHLIGHT: STC_PLC_SEARCH_RESULT,
 }
 
+
 def LineStartswith(line, symbols):
-    return reduce(lambda x, y: x or y, map(lambda x: line.startswith(x), symbols), False)
+    return reduce(lambda x, y: x or y, map(line.startswith, symbols), False)
+
 
 class TextViewer(EditorPanel):
 
     ID = ID_TEXTVIEWER
 
-    if wx.VERSION < (2, 6, 0):
-        def Bind(self, event, function, id = None):
-            if id is not None:
-                event(self, id, function)
-            else:
-                event(self, function)
-
     def _init_Editor(self, prnt):
         self.Editor = CustomStyledTextCtrl(id=ID_TEXTVIEWERTEXTCTRL,
-                parent=prnt, name="TextViewer", size=wx.Size(0, 0), style=0)
+                                           parent=prnt, name="TextViewer", size=wx.Size(0, 0), style=0)
         self.Editor.ParentWindow = self
 
         self.Editor.CmdKeyAssign(ord('+'), wx.stc.STC_SCMOD_CTRL, wx.stc.STC_CMD_ZOOMIN)
@@ -136,8 +136,8 @@
         self.Editor.SetTabWidth(2)
         self.Editor.SetUseTabs(0)
 
-        self.Editor.SetModEventMask(wx.stc.STC_MOD_BEFOREINSERT|
-                                    wx.stc.STC_MOD_BEFOREDELETE|
+        self.Editor.SetModEventMask(wx.stc.STC_MOD_BEFOREINSERT |
+                                    wx.stc.STC_MOD_BEFOREDELETE |
                                     wx.stc.STC_PERFORMED_USER)
 
         self.Bind(wx.stc.EVT_STC_STYLENEEDED, self.OnStyleNeeded, id=ID_TEXTVIEWERTEXTCTRL)
@@ -149,7 +149,7 @@
             self.Bind(wx.stc.EVT_STC_DO_DROP, self.OnDoDrop, id=ID_TEXTVIEWERTEXTCTRL)
             self.Bind(wx.stc.EVT_STC_MODIFIED, self.OnModification, id=ID_TEXTVIEWERTEXTCTRL)
 
-    def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""):
+    def __init__(self, parent, tagname, window, controler, debug=False, instancepath=""):
         if tagname != "" and controler is not None:
             self.VARIABLE_PANEL_TYPE = controler.GetPouType(tagname.split("::")[1])
 
@@ -223,16 +223,16 @@
     def OnModification(self, event):
         if not self.DisableEvents:
             mod_type = event.GetModificationType()
-            if mod_type&wx.stc.STC_MOD_BEFOREINSERT:
-                if self.CurrentAction == None:
+            if mod_type & wx.stc.STC_MOD_BEFOREINSERT:
+                if self.CurrentAction is None:
                     self.StartBuffering()
                 elif self.CurrentAction[0] != "Add" or self.CurrentAction[1] != event.GetPosition() - 1:
                     self.Controler.EndBuffering()
                     self.StartBuffering()
                 self.CurrentAction = ("Add", event.GetPosition())
                 wx.CallAfter(self.RefreshModel)
-            elif mod_type&wx.stc.STC_MOD_BEFOREDELETE:
-                if self.CurrentAction == None:
+            elif mod_type & wx.stc.STC_MOD_BEFOREDELETE:
+                if self.CurrentAction is None:
                     self.StartBuffering()
                 elif self.CurrentAction[0] != "Delete" or self.CurrentAction[1] != event.GetPosition() + 1:
                     self.Controler.EndBuffering()
@@ -244,7 +244,7 @@
     def OnDoDrop(self, event):
         try:
             values = eval(event.GetDragText())
-        except:
+        except Exception:
             values = event.GetDragText()
         if isinstance(values, tuple):
             message = None
@@ -259,31 +259,31 @@
                     blockinputs = None
                 if values[1] != "function":
                     if blockname == "":
-                        dialog = wx.TextEntryDialog(self.ParentWindow, _("Block name"), _("Please enter a block name"), "", wx.OK|wx.CANCEL|wx.CENTRE)
+                        dialog = wx.TextEntryDialog(self.ParentWindow, _("Block name"), _("Please enter a block name"), "", wx.OK | wx.CANCEL | wx.CENTRE)
                         if dialog.ShowModal() == wx.ID_OK:
                             blockname = dialog.GetValue()
                         else:
-                            event.SetDragText("")                            
+                            event.SetDragText("")
                             return
                         dialog.Destroy()
                     if blockname.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
-                        message = _("\"%s\" pou already exists!")%blockname
+                        message = _("\"%s\" pou already exists!") % blockname
                     elif blockname.upper() in [name.upper() for name in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)]:
-                        message = _("\"%s\" element for this pou already exists!")%blockname
+                        message = _("\"%s\" element for this pou already exists!") % blockname
                     else:
                         self.Controler.AddEditedElementPouVar(self.TagName, values[0], blockname)
                         self.RefreshVariablePanel()
                         self.RefreshVariableTree()
                 blockinfo = self.Controler.GetBlockType(blocktype, blockinputs, self.Debug)
                 hint = ',\n    '.join(
-                            [ " " + fctdecl[0]+" := (*"+fctdecl[1]+"*)" for fctdecl in blockinfo["inputs"]] +
-                            [ " " + fctdecl[0]+" => (*"+fctdecl[1]+"*)" for fctdecl in blockinfo["outputs"]])
+                    [" " + fctdecl[0]+" := (*"+fctdecl[1]+"*)" for fctdecl in blockinfo["inputs"]] +
+                    [" " + fctdecl[0]+" => (*"+fctdecl[1]+"*)" for fctdecl in blockinfo["outputs"]])
                 if values[1] == "function":
                     event.SetDragText(blocktype+"(\n    "+hint+")")
                 else:
                     event.SetDragText(blockname+"(\n    "+hint+")")
             elif values[1] == "location":
-                pou_name, pou_type = self.Controler.GetEditedElementType(self.TagName, self.Debug)
+                _pou_name, pou_type = self.Controler.GetEditedElementType(self.TagName, self.Debug)
                 if len(values) > 2 and pou_type == "program":
                     var_name = values[3]
                     dlg = wx.TextEntryDialog(
@@ -296,16 +296,18 @@
                     if var_name is None:
                         return
                     elif var_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
-                        message = _("\"%s\" pou already exists!")%var_name
+                        message = _("\"%s\" pou already exists!") % var_name
                     elif var_name.upper() in [name.upper() for name in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)]:
-                        message = _("\"%s\" element for this pou already exists!")%var_name
+                        message = _("\"%s\" element for this pou already exists!") % var_name
                     else:
                         location = values[0]
                         if not location.startswith("%"):
-                            dialog = wx.SingleChoiceDialog(self.ParentWindow,
-                                  _("Select a variable class:"), _("Variable class"),
-                                  [_("Input"), _("Output"), _("Memory")],
-                                  wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
+                            dialog = wx.SingleChoiceDialog(
+                                self.ParentWindow,
+                                _("Select a variable class:"),
+                                _("Variable class"),
+                                [_("Input"), _("Output"), _("Memory")],
+                                wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
                             if dialog.ShowModal() == wx.ID_OK:
                                 selected = dialog.GetSelection()
                             else:
@@ -324,7 +326,8 @@
                             var_type = values[2]
                         else:
                             var_type = LOCATIONDATATYPES.get(location[2], ["BOOL"])[0]
-                        self.Controler.AddEditedElementPouVar(self.TagName,
+                        self.Controler.AddEditedElementPouVar(
+                            self.TagName,
                             var_type, var_name,
                             location=location, description=values[4])
                         self.RefreshVariablePanel()
@@ -333,7 +336,7 @@
                 else:
                     event.SetDragText("")
             elif values[1] == "NamedConstant":
-                pou_name, pou_type = self.Controler.GetEditedElementType(self.TagName, self.Debug)
+                _pou_name, pou_type = self.Controler.GetEditedElementType(self.TagName, self.Debug)
                 if pou_type == "program":
                     initval = values[0]
                     var_name = values[3]
@@ -347,7 +350,7 @@
                     if var_name is None:
                         return
                     elif var_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
-                        message = _("\"%s\" pou already exists!")%var_name
+                        message = _("\"%s\" pou already exists!") % var_name
                     else:
                         var_type = values[2]
                         if not var_name.upper() in [name.upper() for name in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)]:
@@ -370,7 +373,7 @@
                 if var_name is None:
                     return
                 elif var_name.upper() in [name.upper() for name in self.Controler.GetProjectPouNames(self.Debug)]:
-                    message = _("\"%s\" pou already exists!")%var_name
+                    message = _("\"%s\" pou already exists!") % var_name
                 else:
                     if not var_name.upper() in [name.upper() for name in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)]:
                         self.Controler.AddEditedElementPouExternalVar(self.TagName, values[2], var_name)
@@ -386,7 +389,7 @@
             else:
                 message = _("Variable don't belong to this POU!")
             if message is not None:
-                dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
+                dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
                 dialog.ShowModal()
                 dialog.Destroy()
                 event.SetDragText("")
@@ -416,7 +419,6 @@
     def RefreshJumpList(self):
         if self.TextSyntax == "IL":
             self.Jumps = [jump.upper() for jump in LABEL_MODEL.findall(self.GetText())]
-            self.Colourise(0, -1)
 
     # Buffer the last model state
     def RefreshBuffer(self):
@@ -434,7 +436,7 @@
             self.ParentWindow.RefreshEditMenu()
 
     def ResetBuffer(self):
-        if self.CurrentAction != None:
+        if self.CurrentAction is not None:
             self.Controler.EndBuffering()
             self.CurrentAction = None
 
@@ -473,7 +475,7 @@
                 self.SetText(new_text)
                 new_cursor_pos = GetCursorPos(old_text, new_text)
                 self.Editor.LineScroll(column, line)
-                if new_cursor_pos != None:
+                if new_cursor_pos is not None:
                     self.Editor.GotoPos(new_cursor_pos)
                 else:
                     self.Editor.GotoPos(old_cursor_pos)
@@ -491,11 +493,11 @@
                 for blocktype in category["list"]:
                     blockname = blocktype["name"].upper()
                     if blocktype["type"] == "function" and blockname not in self.Keywords and blockname not in self.Variables.keys():
-                        interface = dict([(name, {}) for name, type, modifier in blocktype["inputs"] + blocktype["outputs"] if name != ''])
+                        interface = dict([(name, {}) for name, _type, _modifier in blocktype["inputs"] + blocktype["outputs"] if name != ''])
                         for param in ["EN", "ENO"]:
-                            if not interface.has_key(param):
+                            if param not in interface:
                                 interface[param] = {}
-                        if self.Functions.has_key(blockname):
+                        if blockname in self.Functions:
                             self.Functions[blockname]["interface"].update(interface)
                             self.Functions[blockname]["extensible"] |= blocktype["extensible"]
                         else:
@@ -506,12 +508,14 @@
 
     def RefreshVariableTree(self):
         words = self.TagName.split("::")
-        self.Variables = self.GenerateVariableTree(
-            [(variable.Name, variable.Type, variable.Tree)
-             for variable in self.Controler.GetEditedElementInterfaceVars(
-                self.TagName, True, self.Debug)])
+        self.Variables = self.GenerateVariableTree([
+            (variable.Name, variable.Type, variable.Tree)
+            for variable in
+            self.Controler.GetEditedElementInterfaceVars(
+                self.TagName, True, self.Debug)
+        ])
         if self.Controler.GetEditedElementType(self.TagName, self.Debug)[1] == "function" or words[0] == "T" and self.TextSyntax == "IL":
-            return_type, (var_tree, var_dimension) = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, True, self.Debug)
+            return_type, (var_tree, _var_dimension) = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, True, self.Debug)
             if return_type is not None:
                 self.Variables[words[-1].upper()] = self.GenerateVariableTree(var_tree)
             else:
@@ -519,7 +523,7 @@
 
     def GenerateVariableTree(self, list):
         tree = {}
-        for var_name, var_type, (var_tree, var_dimension) in list:
+        for var_name, _var_type, (var_tree, _var_dimension) in list:
             tree[var_name.upper()] = self.GenerateVariableTree(var_tree)
         return tree
 
@@ -543,7 +547,7 @@
                     else:
                         level = self.Editor.GetFoldLevel(line_number - 1) & wx.stc.STC_FOLDLEVELNUMBERMASK
                 if level != wx.stc.STC_FOLDLEVELBASE:
-                    level |=  wx.stc.STC_FOLDLEVELWHITEFLAG
+                    level |= wx.stc.STC_FOLDLEVELWHITEFLAG
             elif LineStartswith(line, self.BlockStartKeywords):
                 level |= wx.stc.STC_FOLDLEVELHEADERFLAG
             elif LineStartswith(line, self.BlockEndKeywords):
@@ -632,7 +636,7 @@
                     if len(self.CallStack) > 0:
                         current_call = self.CallStack.pop()
                     else:
-                        current_call = None                    
+                        current_call = None
             elif state == PRAGMA:
                 if line.endswith("}"):
                     self.SetStyling(current_pos - last_styled_pos, STC_PLC_EMPTY)
@@ -812,7 +816,7 @@
             self.SearchParams = search_params
             self.SearchResults = [
                 (infos[1:], start, end, SEARCH_RESULT_HIGHLIGHT)
-                for infos, start, end, text in
+                for infos, start, end, _text in
                 self.Search(search_params)]
             self.CurrentFindHighlight = None
 
@@ -838,6 +842,7 @@
 
     def RefreshModel(self):
         self.RefreshJumpList()
+        self.Colourise(0, -1)
         self.Controler.SetEditedElementText(self.TagName, self.GetText())
         self.ResetSearchResults()
 
@@ -889,7 +894,7 @@
                 if self.TextSyntax in ["ST", "ALL"]:
                     indent = self.Editor.GetLineIndentation(line)
                     if LineStartswith(lineText.strip(), self.BlockStartKeywords):
-                        indent = (indent / 2 + 1) * 2
+                        indent = (indent // 2 + 1) * 2
                     self.Editor.AddText("\n" + " " * indent)
                     key_handled = True
             elif key == wx.WXK_BACK:
@@ -898,7 +903,7 @@
                         indent = self.Editor.GetColumn(self.Editor.GetCurrentPos())
                         if lineText.strip() == "" and len(lineText) > 0 and indent > 0:
                             self.Editor.DelLineLeft()
-                            self.Editor.AddText(" " * ((max(0, indent - 1) / 2) * 2))
+                            self.Editor.AddText(" " * ((max(0, indent - 1) // 2) * 2))
                             key_handled = True
             if not key_handled:
                 event.Skip()
@@ -909,9 +914,9 @@
         self.Editor.AutoCompCancel()
         event.Skip()
 
-#-------------------------------------------------------------------------------
-#                        Highlights showing functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                        Highlights showing functions
+    # -------------------------------------------------------------------------------
 
     def OnRefreshHighlightsTimer(self, event):
         self.RefreshView()
@@ -941,8 +946,8 @@
         EditorPanel.RemoveHighlight(self, infos, start, end, highlight_type)
 
         highlight_type = HIGHLIGHT_TYPES.get(highlight_type, None)
-        if (infos[0] == "body" and highlight_type is not None and
-            (infos[1], start, end, highlight_type) in self.Highlights):
+        if infos[0] == "body" and highlight_type is not None and \
+           (infos[1], start, end, highlight_type) in self.Highlights:
             self.Highlights.remove((infos[1], start, end, highlight_type))
             self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True)
 
@@ -960,5 +965,5 @@
                 self.StartStyling(highlight_start_pos, 0xff)
                 self.SetStyling(highlight_end_pos - highlight_start_pos, highlight_type)
                 self.StartStyling(highlight_start_pos, 0x00)
-                self.SetStyling(len(self.Editor.GetText()) - highlight_end_pos, wx.stc.STC_STYLE_DEFAULT)
-
+                until_end = max(0, len(self.Editor.GetText()) - highlight_end_pos)
+                self.SetStyling(until_end, wx.stc.STC_STYLE_DEFAULT)
--- a/editors/Viewer.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/editors/Viewer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,21 +22,31 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import re
+
+from __future__ import absolute_import
+from __future__ import division
 import math
 from time import time as gettime
-from types import TupleType
 from threading import Lock
+from future.builtins import round
 
 import wx
+from six.moves import xrange
 
 from plcopen.structures import *
+from plcopen.types_enums import ComputePouName
 from PLCControler import ITEM_VAR_LOCAL, ITEM_POU, ITEM_PROGRAM, ITEM_FUNCTIONBLOCK
 
+from graphics.GraphicCommons import *
+from graphics.FBD_Objects import *
+from graphics.LD_Objects import *
+from graphics.SFC_Objects import *
+from graphics.RubberBand import RubberBand
+from graphics.DebugDataConsumer import DebugDataConsumer
+
 from dialogs import *
-from graphics import *
 from editors.DebugViewer import DebugViewer, REFRESH_PERIOD
-from EditorPanel import EditorPanel
+from editors.EditorPanel import EditorPanel
 
 SCROLLBAR_UNIT = 10
 WINDOW_BORDER = 10
@@ -45,9 +55,10 @@
 CURSORS = None
 SFC_Objects = (SFC_Step, SFC_ActionBlock, SFC_Transition, SFC_Divergence, SFC_Jump)
 
+
 def ResetCursors():
     global CURSORS
-    if CURSORS == None:
+    if CURSORS is None:
         CURSORS = [wx.NullCursor,
                    wx.StockCursor(wx.CURSOR_HAND),
                    wx.StockCursor(wx.CURSOR_SIZENWSE),
@@ -55,26 +66,27 @@
                    wx.StockCursor(wx.CURSOR_SIZEWE),
                    wx.StockCursor(wx.CURSOR_SIZENS)]
 
+
 def AppendMenu(parent, help, id, kind, text):
-    if wx.VERSION >= (2, 6, 0):
-        parent.Append(help=help, id=id, kind=kind, text=text)
-    else:
-        parent.Append(helpString=help, id=id, kind=kind, item=text)
+    parent.Append(help=help, id=id, kind=kind, text=text)
+
 
 if wx.Platform == '__WXMSW__':
-    faces = { 'times': 'Times New Roman',
-              'mono' : 'Courier New',
-              'helv' : 'Arial',
-              'other': 'Comic Sans MS',
-              'size' : 10,
-             }
+    faces = {
+        'times': 'Times New Roman',
+        'mono':  'Courier New',
+        'helv':  'Arial',
+        'other': 'Comic Sans MS',
+        'size':  10,
+    }
 else:
-    faces = { 'times': 'Times',
-              'mono' : 'Courier',
-              'helv' : 'Helvetica',
-              'other': 'new century schoolbook',
-              'size' : 12,
-             }
+    faces = {
+        'times': 'Times',
+        'mono':  'Courier',
+        'helv':  'Helvetica',
+        'other': 'new century schoolbook',
+        'size':  10,
+    }
 
 if wx.Platform == '__WXMSW__':
     MAX_ZOOMIN = 4
@@ -82,49 +94,67 @@
     MAX_ZOOMIN = 7
 ZOOM_FACTORS = [math.sqrt(2) ** x for x in xrange(-6, MAX_ZOOMIN)]
 
+
 def GetVariableCreationFunction(variable_type):
     def variableCreationFunction(viewer, id, specific_values):
-        return FBD_Variable(viewer, variable_type,
-                                    specific_values.name,
-                                    specific_values.value_type,
-                                    id,
-                                    specific_values.execution_order)
+        return FBD_Variable(viewer,
+                            variable_type,
+                            specific_values.name,
+                            specific_values.value_type,
+                            id,
+                            specific_values.execution_order)
     return variableCreationFunction
 
+
 def GetConnectorCreationFunction(connector_type):
     def connectorCreationFunction(viewer, id, specific_values):
-        return FBD_Connector(viewer, connector_type,
-                                     specific_values.name, id)
+        return FBD_Connector(viewer,
+                             connector_type,
+                             specific_values.name,
+                             id)
     return connectorCreationFunction
 
+
 def commentCreationFunction(viewer, id, specific_values):
     return Comment(viewer, specific_values.content, id)
 
+
 def GetPowerRailCreationFunction(powerrail_type):
     def powerRailCreationFunction(viewer, id, specific_values):
-        return LD_PowerRail(viewer, powerrail_type, id,
-                                    specific_values.connectors)
+        return LD_PowerRail(viewer,
+                            powerrail_type,
+                            id,
+                            specific_values.connectors)
     return powerRailCreationFunction
 
-NEGATED_VALUE = lambda x: x if x is not None else False
-MODIFIER_VALUE = lambda x: x if x is not None else 'none'
+
+def NEGATED_VALUE(x):
+    return x if x is not None else False
+
+
+def MODIFIER_VALUE(x):
+    return x if x is not None else 'none'
+
 
 CONTACT_TYPES = {(True, "none"): CONTACT_REVERSE,
                  (False, "rising"): CONTACT_RISING,
                  (False, "falling"): CONTACT_FALLING}
 
+
 def contactCreationFunction(viewer, id, specific_values):
     contact_type = CONTACT_TYPES.get((NEGATED_VALUE(specific_values.negated),
                                       MODIFIER_VALUE(specific_values.edge)),
                                      CONTACT_NORMAL)
     return LD_Contact(viewer, contact_type, specific_values.name, id)
 
+
 COIL_TYPES = {(True, "none", "none"): COIL_REVERSE,
               (False, "none", "set"): COIL_SET,
               (False, "none", "reset"): COIL_RESET,
               (False, "rising", "none"): COIL_RISING,
               (False, "falling", "none"): COIL_FALLING}
 
+
 def coilCreationFunction(viewer, id, specific_values):
     coil_type = COIL_TYPES.get((NEGATED_VALUE(specific_values.negated),
                                 MODIFIER_VALUE(specific_values.edge),
@@ -132,36 +162,47 @@
                                COIL_NORMAL)
     return LD_Coil(viewer, coil_type, specific_values.name, id)
 
+
 def stepCreationFunction(viewer, id, specific_values):
-    step = SFC_Step(viewer, specific_values.name,
-                            specific_values.initial, id)
+    step = SFC_Step(viewer,
+                    specific_values.name,
+                    specific_values.initial,
+                    id)
     if specific_values.action is not None:
         step.AddAction()
         connector = step.GetActionConnector()
         connector.SetPosition(wx.Point(*specific_values.action.position))
     return step
 
+
 def transitionCreationFunction(viewer, id, specific_values):
-    transition = SFC_Transition(viewer, specific_values.condition_type,
-                                        specific_values.condition,
-                                        specific_values.priority, id)
+    transition = SFC_Transition(viewer,
+                                specific_values.condition_type,
+                                specific_values.condition,
+                                specific_values.priority,
+                                id)
     return transition
 
+
 divergence_types = [SELECTION_DIVERGENCE,
                     SELECTION_CONVERGENCE, SIMULTANEOUS_DIVERGENCE, SIMULTANEOUS_CONVERGENCE]
 
+
 def GetDivergenceCreationFunction(divergence_type):
     def divergenceCreationFunction(viewer, id, specific_values):
         return SFC_Divergence(viewer, divergence_type,
-                                      specific_values.connectors, id)
+                              specific_values.connectors, id)
     return divergenceCreationFunction
 
+
 def jumpCreationFunction(viewer, id, specific_values):
     return SFC_Jump(viewer, specific_values.target, id)
 
+
 def actionBlockCreationFunction(viewer, id, specific_values):
     return SFC_ActionBlock(viewer, specific_values.actions, id)
 
+
 ElementCreationFunctions = {
     "input": GetVariableCreationFunction(INPUT),
     "output": GetVariableCreationFunction(OUTPUT),
@@ -183,6 +224,7 @@
     "actionBlock": actionBlockCreationFunction,
 }
 
+
 def sort_blocks(block_infos1, block_infos2):
     x1, y1 = block_infos1[0].GetPosition()
     x2, y2 = block_infos2[0].GetPosition()
@@ -191,24 +233,27 @@
     else:
         return cmp(y1, y2)
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                       Graphic elements Viewer base class
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 # ID Constants for alignment menu items
-[ID_VIEWERALIGNMENTMENUITEMS0, ID_VIEWERALIGNMENTMENUITEMS1,
- ID_VIEWERALIGNMENTMENUITEMS2, ID_VIEWERALIGNMENTMENUITEMS4,
- ID_VIEWERALIGNMENTMENUITEMS5, ID_VIEWERALIGNMENTMENUITEMS6,
+[
+    ID_VIEWERALIGNMENTMENUITEMS0, ID_VIEWERALIGNMENTMENUITEMS1,
+    ID_VIEWERALIGNMENTMENUITEMS2, ID_VIEWERALIGNMENTMENUITEMS4,
+    ID_VIEWERALIGNMENTMENUITEMS5, ID_VIEWERALIGNMENTMENUITEMS6,
 ] = [wx.NewId() for _init_coll_AlignmentMenu_Items in range(6)]
 
 # ID Constants for contextual menu items
-[ID_VIEWERCONTEXTUALMENUITEMS0, ID_VIEWERCONTEXTUALMENUITEMS1,
- ID_VIEWERCONTEXTUALMENUITEMS2, ID_VIEWERCONTEXTUALMENUITEMS3,
- ID_VIEWERCONTEXTUALMENUITEMS5, ID_VIEWERCONTEXTUALMENUITEMS6,
- ID_VIEWERCONTEXTUALMENUITEMS8, ID_VIEWERCONTEXTUALMENUITEMS9,
- ID_VIEWERCONTEXTUALMENUITEMS11, ID_VIEWERCONTEXTUALMENUITEMS12,
- ID_VIEWERCONTEXTUALMENUITEMS14, ID_VIEWERCONTEXTUALMENUITEMS16,
- ID_VIEWERCONTEXTUALMENUITEMS17,
+[
+    ID_VIEWERCONTEXTUALMENUITEMS0, ID_VIEWERCONTEXTUALMENUITEMS1,
+    ID_VIEWERCONTEXTUALMENUITEMS2, ID_VIEWERCONTEXTUALMENUITEMS3,
+    ID_VIEWERCONTEXTUALMENUITEMS5, ID_VIEWERCONTEXTUALMENUITEMS6,
+    ID_VIEWERCONTEXTUALMENUITEMS8, ID_VIEWERCONTEXTUALMENUITEMS9,
+    ID_VIEWERCONTEXTUALMENUITEMS11, ID_VIEWERCONTEXTUALMENUITEMS12,
+    ID_VIEWERCONTEXTUALMENUITEMS14, ID_VIEWERCONTEXTUALMENUITEMS16,
+    ID_VIEWERCONTEXTUALMENUITEMS17,
 ] = [wx.NewId() for _init_coll_ContextualMenu_Items in range(13)]
 
 
@@ -229,11 +274,11 @@
         message = None
         try:
             values = eval(data)
-        except:
-            message = _("Invalid value \"%s\" for viewer block")%data
+        except Exception:
+            message = _("Invalid value \"%s\" for viewer block") % data
             values = None
-        if not isinstance(values, TupleType):
-            message = _("Invalid value \"%s\" for viewer block")%data
+        if not isinstance(values, tuple):
+            message = _("Invalid value \"%s\" for viewer block") % data
             values = None
         if values is not None:
             if values[1] == "debug":
@@ -241,13 +286,12 @@
             elif values[1] == "program":
                 message = _("Programs can't be used by other POUs!")
             elif values[1] in ["function", "functionBlock"]:
-                words = tagname.split("::")
                 if pou_name == values[0]:
-                    message = _("\"%s\" can't use itself!")%pou_name
+                    message = _("\"%s\" can't use itself!") % pou_name
                 elif pou_type == "function" and values[1] != "function":
                     message = _("Function Blocks can't be used in Functions!")
                 elif self.ParentWindow.Controler.PouIsUsedBy(pou_name, values[0], self.ParentWindow.Debug):
-                    message = _("\"{a1}\" is already used by \"{a2}\"!").format(a1 = pou_name, a2 = values[0])
+                    message = _("\"{a1}\" is already used by \"{a2}\"!").format(a1=pou_name, a2=values[0])
                 else:
                     blockname = values[2]
                     if len(values) > 3:
@@ -257,18 +301,18 @@
                     if values[1] != "function" and blockname == "":
                         blockname = self.ParentWindow.GenerateNewName(blocktype=values[0])
                     if blockname.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]:
-                        message = _("\"%s\" pou already exists!")%blockname
+                        message = _("\"%s\" pou already exists!") % blockname
                     elif blockname.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(tagname, self.ParentWindow.Debug)]:
-                        message = _("\"%s\" element for this pou already exists!")%blockname
+                        message = _("\"%s\" element for this pou already exists!") % blockname
                     else:
                         id = self.ParentWindow.GetNewId()
-                        block = FBD_Block(self.ParentWindow, values[0], blockname, id, inputs = blockinputs)
+                        block = FBD_Block(self.ParentWindow, values[0], blockname, id, inputs=blockinputs)
                         width, height = block.GetMinSize()
                         if scaling is not None:
-                            x = round(float(x) / float(scaling[0])) * scaling[0]
-                            y = round(float(y) / float(scaling[1])) * scaling[1]
-                            width = round(float(width) / float(scaling[0]) + 0.5) * scaling[0]
-                            height = round(float(height) / float(scaling[1]) + 0.5) * scaling[1]
+                            x = round(x / scaling[0]) * scaling[0]
+                            y = round(y / scaling[1]) * scaling[1]
+                            width = round(width / scaling[0] + 0.5) * scaling[0]
+                            height = round(height / scaling[1] + 0.5) * scaling[1]
                         block.SetPosition(x, y)
                         block.SetSize(width, height)
                         self.ParentWindow.AddBlock(block)
@@ -284,10 +328,12 @@
                 if pou_type == "program":
                     location = values[0]
                     if not location.startswith("%"):
-                        dialog = wx.SingleChoiceDialog(self.ParentWindow.ParentWindow,
-                              _("Select a variable class:"), _("Variable class"),
-                              [_("Input"), _("Output"), _("Memory")],
-                              wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
+                        dialog = wx.SingleChoiceDialog(
+                            self.ParentWindow.ParentWindow,
+                            _("Select a variable class:"),
+                            _("Variable class"),
+                            [_("Input"), _("Output"), _("Memory")],
+                            wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
                         if dialog.ShowModal() == wx.ID_OK:
                             selected = dialog.GetSelection()
                         else:
@@ -312,7 +358,7 @@
                     if var_name is None:
                         return
                     elif var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]:
-                        message = _("\"%s\" pou already exists!")%var_name
+                        message = _("\"%s\" pou already exists!") % var_name
                     elif not var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(tagname, self.ParentWindow.Debug)]:
                         if location[1] == "Q":
                             var_class = OUTPUT
@@ -327,7 +373,7 @@
                         self.ParentWindow.ParentWindow.RefreshPouInstanceVariablesPanel()
                         self.ParentWindow.AddVariableBlock(x, y, scaling, var_class, var_name, var_type)
                     else:
-                        message = _("\"%s\" element for this pou already exists!")%var_name
+                        message = _("\"%s\" element for this pou already exists!") % var_name
             elif values[1] == "NamedConstant":
                 if pou_type == "program":
                     initval = values[0]
@@ -342,7 +388,7 @@
                     if var_name is None:
                         return
                     elif var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]:
-                        message = _("\"%s\" pou already exists!")%var_name
+                        message = _("\"%s\" pou already exists!") % var_name
                     elif not var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(tagname, self.ParentWindow.Debug)]:
                         var_class = INPUT
                         var_type = values[2]
@@ -351,7 +397,7 @@
                         self.ParentWindow.ParentWindow.RefreshPouInstanceVariablesPanel()
                         self.ParentWindow.AddVariableBlock(x, y, scaling, var_class, var_name, var_type)
                     else:
-                        message = _("\"%s\" element for this pou already exists!")%var_name
+                        message = _("\"%s\" element for this pou already exists!") % var_name
             elif values[1] == "Global":
                 var_name = values[0]
                 dlg = wx.TextEntryDialog(
@@ -364,14 +410,14 @@
                 if var_name is None:
                     return
                 elif var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]:
-                    message = _("\"%s\" pou already exists!")%var_name
+                    message = _("\"%s\" pou already exists!") % var_name
                 elif not var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(tagname, self.ParentWindow.Debug)]:
                     self.ParentWindow.Controler.AddEditedElementPouExternalVar(tagname, values[2], var_name)
                     self.ParentWindow.RefreshVariablePanel()
                     self.ParentWindow.ParentWindow.RefreshPouInstanceVariablesPanel()
                     self.ParentWindow.AddVariableBlock(x, y, scaling, INPUT, var_name, values[2])
                 else:
-                    message = _("\"%s\" element for this pou already exists!")%var_name
+                    message = _("\"%s\" element for this pou already exists!") % var_name
             elif values[1] == "Constant":
                 self.ParentWindow.AddVariableBlock(x, y, scaling, INPUT, values[0], None)
             elif values[3] == tagname:
@@ -420,23 +466,76 @@
         return AddVariableFunction
 
     def ShowMessage(self, message):
-        message = wx.MessageDialog(self.ParentWindow, message, _("Error"), wx.OK|wx.ICON_ERROR)
+        message = wx.MessageDialog(self.ParentWindow, message, _("Error"), wx.OK | wx.ICON_ERROR)
         message.ShowModal()
         message.Destroy()
 
-"""
-Class that implements a Viewer based on a wx.ScrolledWindow for drawing and
-manipulating graphic elements
-"""
+
+class DebugInstanceName(DebugDataConsumer):
+    VALUE_TRANSLATION = None
+
+    def __init__(self, parent):
+        DebugDataConsumer.__init__(self)
+        self.Parent = parent
+        self.ActionLastState = None
+        self.ActionState = None
+        self.x_offset = 2
+        self.y_offset = 2
+
+        if self.VALUE_TRANSLATION is None:
+            self.__class__.VALUE_TRANSLATION = {True: _("Active"), False: _("Inactive")}
+
+    def SetValue(self, value):
+        self.ActionState = value
+        if self.ActionState != self.ActionLastState:
+            self.ActionLastState = self.ActionState
+            wx.CallAfter(self.Parent.ElementNeedRefresh, self)
+
+    def GetInstanceName(self):
+        return _("Debug: %s") % self.Parent.InstancePath
+
+    def GetRedrawRect(self):
+        x, y = self.Parent.CalcUnscrolledPosition(self.x_offset, self.y_offset)
+        dc = self.Parent.GetLogicalDC()
+        ipw, _iph = dc.GetTextExtent(self.GetInstanceName())
+        vw, vh = 0, 0
+        for value in self.VALUE_TRANSLATION.itervalues():
+            w, h = dc.GetTextExtent(" (%s)" % value)
+            vw = max(vw, w)
+            vh = max(vh, h)
+        return wx.Rect(ipw + x, y, vw, vh)
+
+    def Draw(self, dc):
+        scalex, scaley = dc.GetUserScale()
+        dc.SetUserScale(1, 1)
+        x, y = self.Parent.CalcUnscrolledPosition(self.x_offset, self.y_offset)
+
+        text = self.GetInstanceName()
+        if self.ActionState is not None:
+            text += " ("
+
+        dc.DrawText(text, x, y)
+        tw, _th = dc.GetTextExtent(text)
+        if self.ActionState is not None:
+
+            text = self.VALUE_TRANSLATION[self.ActionState]
+            if self.ActionState:
+                dc.SetTextForeground(wx.GREEN)
+            dc.DrawText(text, x + tw, y)
+            if self.ActionState:
+                dc.SetTextForeground(wx.BLACK)
+            tw = tw + dc.GetTextExtent(text)[0]
+
+            text = ")"
+            dc.DrawText(text, x + tw, y)
+        dc.SetUserScale(scalex, scaley)
+
 
 class Viewer(EditorPanel, DebugViewer):
-
-    if wx.VERSION < (2, 6, 0):
-        def Bind(self, event, function, id = None):
-            if id is not None:
-                event(self, id, function)
-            else:
-                event(self, function)
+    """
+    Class that implements a Viewer based on a wx.ScrolledWindow for drawing and
+    manipulating graphic elements
+    """
 
     # Add list of menu items to the given menu
     def AddMenuItems(self, menu, items):
@@ -452,7 +551,7 @@
     # Add Block Pin Menu items to the given menu
     def AddBlockPinMenuItems(self, menu, connector):
         [ID_NO_MODIFIER, ID_NEGATED, ID_RISING_EDGE,
-         ID_FALLING_EDGE] = [wx.NewId() for i in xrange(4)]
+         ID_FALLING_EDGE] = [wx.NewId() for dummy in xrange(4)]
 
         # Create menu items
         self.AddMenuItems(menu, [
@@ -476,9 +575,10 @@
 
     # Add Alignment Menu items to the given menu
     def AddAlignmentMenuItems(self, menu):
-        [ID_ALIGN_LEFT, ID_ALIGN_CENTER, ID_ALIGN_RIGHT,
-         ID_ALIGN_TOP, ID_ALIGN_MIDDLE, ID_ALIGN_BOTTOM,
-        ] = [wx.NewId() for i in xrange(6)]
+        [
+            ID_ALIGN_LEFT, ID_ALIGN_CENTER, ID_ALIGN_RIGHT,
+            ID_ALIGN_TOP, ID_ALIGN_MIDDLE, ID_ALIGN_BOTTOM,
+        ] = [wx.NewId() for dummy in xrange(6)]
 
         # Create menu items
         self.AddMenuItems(menu, [
@@ -492,8 +592,9 @@
 
     # Add Wire Menu items to the given menu
     def AddWireMenuItems(self, menu, delete=False, replace=False):
-        [ID_ADD_SEGMENT, ID_DELETE_SEGMENT, ID_REPLACE_WIRE,
-         ] = [wx.NewId() for i in xrange(3)]
+        [
+            ID_ADD_SEGMENT, ID_DELETE_SEGMENT, ID_REPLACE_WIRE,
+        ] = [wx.NewId() for dummy in xrange(3)]
 
         # Create menu items
         self.AddMenuItems(menu, [
@@ -506,7 +607,7 @@
 
     # Add Divergence Menu items to the given menu
     def AddDivergenceMenuItems(self, menu, delete=False):
-        [ID_ADD_BRANCH, ID_DELETE_BRANCH] = [wx.NewId() for i in xrange(2)]
+        [ID_ADD_BRANCH, ID_DELETE_BRANCH] = [wx.NewId() for dummy in xrange(2)]
 
         # Create menu items
         self.AddMenuItems(menu, [
@@ -518,7 +619,7 @@
     # Add Add Menu items to the given menu
     def AddAddMenuItems(self, menu):
         [ID_ADD_BLOCK, ID_ADD_VARIABLE, ID_ADD_CONNECTION,
-         ID_ADD_COMMENT] = [wx.NewId() for i in xrange(4)]
+         ID_ADD_COMMENT] = [wx.NewId() for dummy in xrange(4)]
 
         # Create menu items
         self.AddMenuItems(menu, [
@@ -528,8 +629,9 @@
             None])
 
         if self.CurrentLanguage != "FBD":
-            [ID_ADD_POWER_RAIL, ID_ADD_CONTACT, ID_ADD_COIL,
-            ] = [wx.NewId() for i in xrange(3)]
+            [
+                ID_ADD_POWER_RAIL, ID_ADD_CONTACT, ID_ADD_COIL,
+            ] = [wx.NewId() for dummy in xrange(3)]
 
             # Create menu items
             self.AddMenuItems(menu, [
@@ -538,14 +640,15 @@
 
             if self.CurrentLanguage != "SFC":
                 self.AddMenuItems(menu, [
-                     (ID_ADD_COIL, wx.ITEM_NORMAL, _(u'Coil'), '', self.GetAddMenuCallBack(self.AddNewCoil))])
+                    (ID_ADD_COIL, wx.ITEM_NORMAL, _(u'Coil'), '', self.GetAddMenuCallBack(self.AddNewCoil))])
 
             menu.AppendSeparator()
 
         if self.CurrentLanguage == "SFC":
-            [ID_ADD_INITIAL_STEP, ID_ADD_STEP, ID_ADD_TRANSITION,
-             ID_ADD_ACTION_BLOCK, ID_ADD_DIVERGENCE, ID_ADD_JUMP,
-            ] = [wx.NewId() for i in xrange(6)]
+            [
+                ID_ADD_INITIAL_STEP, ID_ADD_STEP, ID_ADD_TRANSITION,
+                ID_ADD_ACTION_BLOCK, ID_ADD_DIVERGENCE, ID_ADD_JUMP,
+            ] = [wx.NewId() for dummy in xrange(6)]
 
             # Create menu items
             self.AddMenuItems(menu, [
@@ -558,23 +661,23 @@
                 None])
 
         self.AddMenuItems(menu, [
-             (ID_ADD_COMMENT, wx.ITEM_NORMAL, _(u'Comment'), '', self.GetAddMenuCallBack(self.AddNewComment))])
+            (ID_ADD_COMMENT, wx.ITEM_NORMAL, _(u'Comment'), '', self.GetAddMenuCallBack(self.AddNewComment))])
 
     # Add Default Menu items to the given menu
     def AddDefaultMenuItems(self, menu, edit=False, block=False):
         if block:
-            [ID_EDIT_BLOCK, ID_DELETE, ID_ADJUST_BLOCK_SIZE] = [wx.NewId() for i in xrange(3)]
+            [ID_EDIT_BLOCK, ID_DELETE, ID_ADJUST_BLOCK_SIZE] = [wx.NewId() for dummy in xrange(3)]
 
             # Create menu items
             self.AddMenuItems(menu, [
-                 (ID_EDIT_BLOCK, wx.ITEM_NORMAL, _(u'Edit Block'), '', self.OnEditBlockMenu),
-                 (ID_ADJUST_BLOCK_SIZE, wx.ITEM_NORMAL, _(u'Adjust Block Size'), '', self.OnAdjustBlockSizeMenu),
-                 (ID_DELETE, wx.ITEM_NORMAL, _(u'Delete'), '', self.OnDeleteMenu)])
+                (ID_EDIT_BLOCK, wx.ITEM_NORMAL, _(u'Edit Block'), '', self.OnEditBlockMenu),
+                (ID_ADJUST_BLOCK_SIZE, wx.ITEM_NORMAL, _(u'Adjust Block Size'), '', self.OnAdjustBlockSizeMenu),
+                (ID_DELETE, wx.ITEM_NORMAL, _(u'Delete'), '', self.OnDeleteMenu)])
 
             menu.Enable(ID_EDIT_BLOCK, edit)
 
         else:
-            [ID_CLEAR_EXEC_ORDER, ID_RESET_EXEC_ORDER] = [wx.NewId() for i in xrange(2)]
+            [ID_CLEAR_EXEC_ORDER, ID_RESET_EXEC_ORDER] = [wx.NewId() for dummy in xrange(2)]
 
             # Create menu items
             if self.CurrentLanguage == 'FBD':
@@ -589,13 +692,13 @@
 
         menu.AppendSeparator()
 
-        [ID_CUT, ID_COPY, ID_PASTE] = [wx.NewId() for i in xrange(3)]
+        [ID_CUT, ID_COPY, ID_PASTE] = [wx.NewId() for dummy in xrange(3)]
 
         # Create menu items
         self.AddMenuItems(menu, [
-             (ID_CUT, wx.ITEM_NORMAL, _(u'Cut'), '', self.GetClipboardCallBack(self.Cut)),
-             (ID_COPY, wx.ITEM_NORMAL, _(u'Copy'), '', self.GetClipboardCallBack(self.Copy)),
-             (ID_PASTE, wx.ITEM_NORMAL, _(u'Paste'), '', self.GetAddMenuCallBack(self.Paste))])
+            (ID_CUT, wx.ITEM_NORMAL, _(u'Cut'), '', self.GetClipboardCallBack(self.Cut)),
+            (ID_COPY, wx.ITEM_NORMAL, _(u'Copy'), '', self.GetClipboardCallBack(self.Copy)),
+            (ID_PASTE, wx.ITEM_NORMAL, _(u'Paste'), '', self.GetAddMenuCallBack(self.Paste))])
 
         menu.Enable(ID_CUT, block)
         menu.Enable(ID_COPY, block)
@@ -603,12 +706,12 @@
 
     def _init_Editor(self, prnt):
         self.Editor = wx.ScrolledWindow(prnt, name="Viewer",
-            pos=wx.Point(0, 0), size=wx.Size(0, 0),
-            style=wx.HSCROLL | wx.VSCROLL)
+                                        pos=wx.Point(0, 0), size=wx.Size(0, 0),
+                                        style=wx.HSCROLL | wx.VSCROLL)
         self.Editor.ParentWindow = self
 
     # Create a new Viewer
-    def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""):
+    def __init__(self, parent, tagname, window, controler, debug=False, instancepath=""):
         self.VARIABLE_PANEL_TYPE = controler.GetPouType(tagname.split("::")[1])
 
         EditorPanel.__init__(self, parent, tagname, window, controler, debug)
@@ -616,7 +719,7 @@
 
         # Adding a rubberband to Viewer
         self.rubberBand = RubberBand(viewer=self)
-        self.Editor.SetBackgroundColour(wx.Colour(255,255,255))
+        self.Editor.SetBackgroundColour(wx.Colour(255, 255, 255))
         self.Editor.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
         self.ResetView()
         self.LastClientSize = None
@@ -635,6 +738,7 @@
         self.InstancePath = instancepath
         self.StartMousePos = None
         self.StartScreenPos = None
+        self.InstanceName = DebugInstanceName(self)
 
         # Prevent search for highlighted element to be called too often
         self.LastHighlightCheckTime = gettime()
@@ -662,17 +766,16 @@
         self.ElementRefreshList_lock = Lock()
 
         dc = wx.ClientDC(self.Editor)
-        font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
-        dc.SetFont(font)
-        width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
-        while width > 260:
+        while True:
+            font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName=faces["mono"])
+            dc.SetFont(font)
+            width, _height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+            if width < 260:
+                break
             faces["size"] -= 1
-            font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
-            dc.SetFont(font)
-            width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
-        self.SetFont(font)
-        self.MiniTextDC = wx.MemoryDC()
-        self.MiniTextDC.SetFont(wx.Font(faces["size"] * 0.75, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["helv"]))
+        self.Editor.SetFont(font)
+        self.MiniTextDC = wx.MemoryDC(wx.EmptyBitmap(1, 1))
+        self.MiniTextDC.SetFont(wx.Font(faces["size"] * 0.75, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName=faces["helv"]))
 
         self.CurrentScale = None
         self.SetScale(ZOOM_FACTORS.index(1.0), False)
@@ -709,14 +812,13 @@
 
     def SetCurrentCursor(self, cursor):
         if self.Mode != MODE_MOTION:
-            global CURSORS
             if self.CurrentCursor != cursor:
                 self.CurrentCursor = cursor
                 self.Editor.SetCursor(CURSORS[cursor])
 
     def GetScrolledRect(self, rect):
         rect.x, rect.y = self.Editor.CalcScrolledPosition(int(rect.x * self.ViewScale[0]),
-                                                   int(rect.y * self.ViewScale[1]))
+                                                          int(rect.y * self.ViewScale[1]))
         rect.width = int(rect.width * self.ViewScale[0]) + 2
         rect.height = int(rect.height * self.ViewScale[1]) + 2
         return rect
@@ -759,7 +861,7 @@
                 self.Editor.Freeze()
                 if mouse_event is None:
                     client_size = self.Editor.GetClientSize()
-                    mouse_pos = wx.Point(client_size[0] / 2, client_size[1] / 2)
+                    mouse_pos = wx.Point(client_size[0] // 2, client_size[1] // 2)
                     mouse_event = wx.MouseEvent(wx.EVT_MOUSEWHEEL.typeId)
                     mouse_event.x = mouse_pos.x
                     mouse_event.y = mouse_pos.y
@@ -792,10 +894,7 @@
         else:
             dc = wx.ClientDC(self.Editor)
         dc.SetFont(self.GetFont())
-        if wx.VERSION >= (2, 6, 0):
-            self.Editor.DoPrepareDC(dc)
-        else:
-            self.Editor.PrepareDC(dc)
+        self.Editor.DoPrepareDC(dc)
         dc.SetUserScale(self.ViewScale[0], self.ViewScale[1])
         return dc
 
@@ -839,9 +938,9 @@
     def GetMiniFont(self):
         return self.MiniTextDC.GetFont()
 
-#-------------------------------------------------------------------------------
-#                         Element management functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                         Element management functions
+    # -------------------------------------------------------------------------------
 
     def AddBlock(self, block):
         self.Blocks[block.GetId()] = block
@@ -895,7 +994,7 @@
                block.GetName() == name:
                 blocks.append(block)
         return blocks
-    
+
     def GetConnectorByName(self, name):
         for block in self.Blocks.itervalues():
             if isinstance(block, FBD_Connector) and\
@@ -904,7 +1003,7 @@
                 return block
         return None
 
-    def RefreshVisibleElements(self, xp = None, yp = None):
+    def RefreshVisibleElements(self, xp=None, yp=None):
         x, y = self.Editor.CalcUnscrolledPosition(0, 0)
         if xp is not None:
             x = xp * self.Editor.GetScrollPixelsPerUnit()[0]
@@ -931,14 +1030,14 @@
                 blockname = block.GetName()
                 connectorname = element.GetName()
                 if blockname != "":
-                    iec_path = "%s.%s.%s"%(instance_path, blockname, connectorname)
+                    iec_path = "%s.%s.%s" % (instance_path, blockname, connectorname)
                 else:
                     if connectorname == "":
-                        iec_path = "%s.%s%d"%(instance_path, block.GetType(), block.GetId())
+                        iec_path = "%s.%s%d" % (instance_path, block.GetType(), block.GetId())
                     else:
-                        iec_path = "%s.%s%d_%s"%(instance_path, block.GetType(), block.GetId(), connectorname)
+                        iec_path = "%s.%s%d_%s" % (instance_path, block.GetType(), block.GetId(), connectorname)
             elif isinstance(block, FBD_Variable):
-                iec_path = "%s.%s"%(instance_path, block.GetName())
+                iec_path = "%s.%s" % (instance_path, block.GetName())
             elif isinstance(block, FBD_Connector):
                 connection = self.GetConnectorByName(block.GetName())
                 if connection is not None:
@@ -946,14 +1045,14 @@
                     if len(connector.Wires) == 1:
                         iec_path = self.GetElementIECPath(connector.Wires[0][0])
         elif isinstance(element, LD_Contact):
-            iec_path = "%s.%s"%(instance_path, element.GetName())
+            iec_path = "%s.%s" % (instance_path, element.GetName())
         elif isinstance(element, SFC_Step):
-            iec_path = "%s.%s.X"%(instance_path, element.GetName())
+            iec_path = "%s.%s.X" % (instance_path, element.GetName())
         elif isinstance(element, SFC_Transition):
             connectors = element.GetConnectors()
             previous_steps = self.GetPreviousSteps(connectors["inputs"])
             next_steps = self.GetNextSteps(connectors["outputs"])
-            iec_path = "%s.%s->%s"%(instance_path, ",".join(previous_steps), ",".join(next_steps))
+            iec_path = "%s.%s->%s" % (instance_path, ",".join(previous_steps), ",".join(next_steps))
         return iec_path
 
     def GetWireModifier(self, wire):
@@ -972,9 +1071,19 @@
                 return connector.GetEdge()
         return "none"
 
-#-------------------------------------------------------------------------------
-#                              Reset functions
-#-------------------------------------------------------------------------------
+    def CorrectElementSize(self, element, width, height):
+        min_width, min_height = element.GetMinSize()
+        if width < min_width:
+            width = min_width
+        if height < min_height:
+            height = min_height
+        if element.Size != (width, height):
+            element.SetSize(width, height)
+            element.RefreshModel()
+
+    # -------------------------------------------------------------------------------
+    #                              Reset functions
+    # -------------------------------------------------------------------------------
 
     # Resets Viewer lists
     def ResetView(self):
@@ -1092,35 +1201,9 @@
             self.RefreshVisibleElements()
             self.Editor.Refresh(False)
 
-
-#-------------------------------------------------------------------------------
-#                          Refresh functions
-#-------------------------------------------------------------------------------
-
-    VALUE_TRANSLATION = {True: _("Active"), False: _("Inactive")}
-
-    def SetValue(self, value):
-        if self.Value != value:
-            self.Value = value
-
-            xstart, ystart = self.GetViewStart()
-            window_size = self.Editor.GetClientSize()
-            refresh_rect = self.GetRedrawRect()
-            if (xstart * SCROLLBAR_UNIT <= refresh_rect.x + refresh_rect.width and
-                xstart * SCROLLBAR_UNIT + window_size[0] >= refresh_rect.x and
-                ystart * SCROLLBAR_UNIT <= refresh_rect.y + refresh_rect.height and
-                ystart * SCROLLBAR_UNIT + window_size[1] >= refresh_rect.y):
-                self.ElementNeedRefresh(self)
-
-    def GetRedrawRect(self):
-        dc = self.GetLogicalDC()
-        ipw, iph = dc.GetTextExtent(_("Debug: %s") % self.InstancePath)
-        vw, vh = 0, 0
-        for value in self.VALUE_TRANSLATION.itervalues():
-            w, h = dc.GetTextExtent("(%s)" % value)
-            vw = max(vw, w)
-            vh = max(vh, h)
-        return wx.Rect(ipw + 4, 2, vw, vh)
+    # -------------------------------------------------------------------------------
+    #                          Refresh functions
+    # -------------------------------------------------------------------------------
 
     def ElementNeedRefresh(self, element):
         self.ElementRefreshList_lock.acquire()
@@ -1150,9 +1233,6 @@
     def RefreshView(self, variablepanel=True, selection=None):
         EditorPanel.RefreshView(self, variablepanel)
 
-        if self.TagName.split("::")[0] == "A" and self.Debug:
-            self.AddDataConsumer("%s.Q" % self.InstancePath.upper(), self)
-
         if self.ToolTipElement is not None:
             self.ToolTipElement.DestroyToolTip()
             self.ToolTipElement = None
@@ -1163,20 +1243,22 @@
         self.Flush()
         self.ResetView()
         self.ResetBuffer()
-        instance = {}
+
         # List of ids of already loaded blocks
-        instances = self.Controler.GetEditedElementInstancesInfos(self.TagName, debug = self.Debug)
+        instances = self.Controler.GetEditedElementInstancesInfos(self.TagName, debug=self.Debug)
         # Load Blocks until they are all loaded
         while len(instances) > 0:
             self.loadInstance(instances.popitem(0)[1], instances, selection)
 
-        if (selection is not None and
-            isinstance(self.SelectedElement, Graphic_Group)):
+        if selection is not None and isinstance(self.SelectedElement, Graphic_Group):
             self.SelectedElement.RefreshWireExclusion()
             self.SelectedElement.RefreshBoundingBox()
 
         self.RefreshScrollBars()
 
+        if self.TagName.split("::")[0] == "A" and self.Debug:
+            self.AddDataConsumer("%s.Q" % self.InstancePath.upper(), self.InstanceName)
+
         for wire in self.Wires:
             if not wire.IsConnectedCompatible():
                 wire.SetValid(False)
@@ -1213,7 +1295,7 @@
     def GetPreviousSteps(self, connectors):
         steps = []
         for connector in connectors:
-            for wire, handle in connector.GetWires():
+            for wire, _handle in connector.GetWires():
                 previous = wire.GetOtherConnected(connector).GetParentBlock()
                 if isinstance(previous, SFC_Step):
                     steps.append(previous.GetName())
@@ -1225,7 +1307,7 @@
     def GetNextSteps(self, connectors):
         steps = []
         for connector in connectors:
-            for wire, handle in connector.GetWires():
+            for wire, _handle in connector.GetWires():
                 next = wire.GetOtherConnected(connector).GetParentBlock()
                 if isinstance(next, SFC_Step):
                     steps.append(next.GetName())
@@ -1256,8 +1338,10 @@
             maxy = max(maxy, extent.y + extent.height)
         maxx = int(maxx * self.ViewScale[0])
         maxy = int(maxy * self.ViewScale[1])
-        self.Editor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
-            round(maxx / SCROLLBAR_UNIT) + width_incr, round(maxy / SCROLLBAR_UNIT) + height_incr,
+        self.Editor.SetScrollbars(
+            SCROLLBAR_UNIT, SCROLLBAR_UNIT,
+            round(maxx / SCROLLBAR_UNIT) + width_incr,
+            round(maxy / SCROLLBAR_UNIT) + height_incr,
             xstart, ystart, True)
 
     def EnsureVisible(self, block):
@@ -1274,13 +1358,13 @@
 
         xpos, ypos = xstart, ystart
         if block_minx < screen_minx and block_maxx < screen_maxx:
-            xpos -= (screen_minx - block_minx) / SCROLLBAR_UNIT + 1
+            xpos -= (screen_minx - block_minx) // SCROLLBAR_UNIT + 1
         elif block_maxx > screen_maxx and block_minx > screen_minx:
-            xpos += (block_maxx - screen_maxx) / SCROLLBAR_UNIT + 1
+            xpos += (block_maxx - screen_maxx) // SCROLLBAR_UNIT + 1
         if block_miny < screen_miny and block_maxy < screen_maxy:
-            ypos -= (screen_miny - block_miny) / SCROLLBAR_UNIT + 1
+            ypos -= (screen_miny - block_miny) // SCROLLBAR_UNIT + 1
         elif block_maxy > screen_maxy and block_miny > screen_miny:
-            ypos += (block_maxy - screen_maxy) / SCROLLBAR_UNIT + 1
+            ypos += (block_maxy - screen_maxy) // SCROLLBAR_UNIT + 1
         self.Scroll(xpos, ypos)
 
     def SelectInGroup(self, element):
@@ -1299,7 +1383,7 @@
     def loadInstance(self, instance, remaining_instances, selection):
         self.current_id = max(self.current_id, instance.id)
         creation_function = ElementCreationFunctions.get(instance.type, None)
-        connectors = {"inputs" : [], "outputs" : []}
+        connectors = {"inputs": [], "outputs": []}
         specific_values = instance.specific_values
         if creation_function is not None:
             element = creation_function(self, instance.id, specific_values)
@@ -1338,10 +1422,11 @@
                 connectors["outputs"].pop(0)
                 executionControl = True
             block_name = specific_values.name if specific_values.name is not None else ""
-            element = FBD_Block(self, instance.type, block_name,
-                      instance.id, len(connectors["inputs"]),
-                      connectors=connectors, executionControl=executionControl,
-                      executionOrder=specific_values.execution_order)
+            element = FBD_Block(
+                self, instance.type, block_name,
+                instance.id, len(connectors["inputs"]),
+                connectors=connectors, executionControl=executionControl,
+                executionOrder=specific_values.execution_order)
         if isinstance(element, Comment):
             self.AddComment(element)
         else:
@@ -1353,7 +1438,7 @@
             connector_pos = wx.Point(*output_connector.position)
             if isinstance(element, FBD_Block):
                 connector = element.GetConnector(connector_pos,
-                    output_name = output_connector.name)
+                                                 output_name=output_connector.name)
             elif i < len(connectors["outputs"]):
                 connector = connectors["outputs"][i]
             else:
@@ -1369,7 +1454,7 @@
             connector_pos = wx.Point(*input_connector.position)
             if isinstance(element, FBD_Block):
                 connector = element.GetConnector(connector_pos,
-                    input_name = input_connector.name)
+                                                 input_name=input_connector.name)
             elif i < len(connectors["inputs"]):
                 connector = connectors["inputs"][i]
             else:
@@ -1384,6 +1469,7 @@
                 if not self.CreateWires(connector, instance.id, input_connector.links, remaining_instances, selection):
                     element.RefreshModel()
         element.RefreshConnectors()
+        self.CorrectElementSize(element, instance.width, instance.height)
         if selection is not None and selection[0].get(instance.id, False):
             self.SelectInGroup(element)
 
@@ -1414,20 +1500,18 @@
                     wire = Wire(self)
                     wire.SetPoints(points)
                 else:
-                    wire = Wire(self,
-                        [wx.Point(*start_connector.GetPosition()),
-                         start_connector.GetDirection()],
-                        [wx.Point(*end_connector.GetPosition()),
-                         end_connector.GetDirection()])
+                    wire = Wire(
+                        self,
+                        [wx.Point(*start_connector.GetPosition()), start_connector.GetDirection()],
+                        [wx.Point(*end_connector.GetPosition()),   end_connector.GetDirection()])
                 start_connector.Wires.append((wire, 0))
                 end_connector.Wires.append((wire, -1))
                 wire.StartConnected = start_connector
                 wire.EndConnected = end_connector
                 connected.RefreshConnectors()
                 self.AddWire(wire)
-                if selection is not None and (\
-                   selection[1].get((id, refLocalId), False) or \
-                   selection[1].get((refLocalId, id), False)):
+                if selection is not None and (selection[1].get((id, refLocalId), False) or
+                                              selection[1].get((refLocalId, id), False)):
                     self.SelectInGroup(wire)
             else:
                 links_connected = False
@@ -1440,12 +1524,12 @@
     def IsEndType(self, type):
         return self.Controler.IsEndType(type)
 
-    def GetBlockType(self, type, inputs = None):
+    def GetBlockType(self, type, inputs=None):
         return self.Controler.GetBlockType(type, inputs, self.Debug)
 
-#-------------------------------------------------------------------------------
-#                          Search Element functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Search Element functions
+    # -------------------------------------------------------------------------------
 
     def FindBlock(self, event):
         dc = self.GetLogicalDC()
@@ -1463,7 +1547,7 @@
                 return wire
         return None
 
-    def FindElement(self, event, exclude_group = False, connectors = True):
+    def FindElement(self, event, exclude_group=False, connectors=True):
         dc = self.GetLogicalDC()
         pos = event.GetLogicalPosition(dc)
         if self.SelectedElement and not (exclude_group and isinstance(self.SelectedElement, Graphic_Group)):
@@ -1474,12 +1558,12 @@
                 return element
         return None
 
-    def FindBlockConnector(self, pos, direction = None, exclude = None):
-        result, error = self.FindBlockConnectorWithError(pos, direction, exclude)
+    def FindBlockConnector(self, pos, direction=None, exclude=None):
+        result, _error = self.FindBlockConnectorWithError(pos, direction, exclude)
         return result
 
-    def FindBlockConnectorWithError(self, pos, direction = None, exclude = None):
-        error = False        
+    def FindBlockConnectorWithError(self, pos, direction=None, exclude=None):
+        error = False
         startblock = None
         for block in self.Blocks.itervalues():
             connector = block.TestConnector(pos, direction, exclude)
@@ -1492,7 +1576,7 @@
                     error = True
                 return connector, error
         return None, error
-    
+
     def FindElementById(self, id):
         block = self.Blocks.get(id, None)
         if block is not None:
@@ -1516,12 +1600,13 @@
         self.SelectedElement.SetElements(self.GetElements())
         self.SelectedElement.SetSelected(True)
 
-#-------------------------------------------------------------------------------
-#                           Popup menu functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                           Popup menu functions
+    # -------------------------------------------------------------------------------
 
     def GetForceVariableMenuFunction(self, iec_path, element):
         iec_type = self.GetDataType(iec_path)
+
         def ForceVariableFunction(event):
             if iec_type is not None:
                 dialog = ForceVariableDialog(self.ParentWindow, iec_type, str(element.GetValue()))
@@ -1559,10 +1644,12 @@
                 menu.Enable(new_id, True)
             else:
                 menu.Enable(new_id, False)
+            if self.Editor.HasCapture():
+                self.Editor.ReleaseMouse()
             self.Editor.PopupMenu(menu)
             menu.Destroy()
 
-    def PopupBlockMenu(self, connector = None):
+    def PopupBlockMenu(self, connector=None):
         menu = wx.Menu(title='')
         if connector is not None and connector.IsCompatible("BOOL"):
             self.AddBlockPinMenuItems(menu, connector)
@@ -1613,7 +1700,8 @@
             if self.SelectedElement.GetStartConnected() in connected
             else self.SelectedElement.GetStartConnected())
 
-        self.AddWireMenuItems(menu, delete,
+        self.AddWireMenuItems(
+            menu, delete,
             start_connector.GetDirection() == EAST and
             not isinstance(start_connector.GetParentBlock(), SFC_Step))
 
@@ -1646,9 +1734,9 @@
         self.Editor.PopupMenu(menu)
         menu.Destroy()
 
-#-------------------------------------------------------------------------------
-#                            Menu items functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                            Menu items functions
+    # -------------------------------------------------------------------------------
 
     def OnAlignLeftMenu(self, event):
         if self.SelectedElement is not None and isinstance(self.SelectedElement, Graphic_Group):
@@ -1722,9 +1810,7 @@
 
     def OnReplaceWireMenu(self, event):
         # Check that selected element is a wire before applying replace
-        if (self.SelectedElement is not None and
-            self.IsWire(self.SelectedElement)):
-
+        if self.SelectedElement is not None and self.IsWire(self.SelectedElement):
             # Get wire redraw bbox to erase it from screen
             wire = self.SelectedElement
             redraw_rect = wire.GetRedrawRect()
@@ -1744,7 +1830,7 @@
 
             # Get a new default connection name
             connection_name = self.Controler.GenerateNewName(
-                    self.TagName, None, "Connection%d", 0)
+                self.TagName, None, "Connection%d", 0)
 
             # Create a connector to connect to wire
             id = self.GetNewId()
@@ -1754,7 +1840,6 @@
             # Calculate position of connector at the right of start connector
             connector = connection.GetConnectors()["inputs"][0]
             rel_pos = connector.GetRelPosition()
-            direction = connector.GetDirection()
             start_point = start_connector.GetPosition(False)
             end_point = (start_point[0] + LD_WIRE_SIZE, start_point[1])
             connection.SetPosition(end_point[0] - rel_pos[0],
@@ -1787,7 +1872,6 @@
             # Calculate position of connection at the left of end connector
             connector = connection.GetConnectors()["outputs"][0]
             rel_pos = connector.GetRelPosition()
-            direction = connector.GetDirection()
             end_point = end_connector.GetPosition(False)
             start_point = (end_point[0] - LD_WIRE_SIZE, end_point[1])
             connection.SetPosition(start_point[0] - rel_pos[0],
@@ -1795,8 +1879,8 @@
 
             # Add Wire to Viewer and connect it to blocks
             new_wire = Wire(self,
-                [wx.Point(*start_point), connector.GetDirection()],
-                [wx.Point(*end_point), end_connector.GetDirection()])
+                            [wx.Point(*start_point), connector.GetDirection()],
+                            [wx.Point(*end_point), end_connector.GetDirection()])
             self.AddWire(new_wire)
             connector.Connect((new_wire, 0), False)
             end_connector.Connect((new_wire, -1), False)
@@ -1834,7 +1918,7 @@
 
     def OnEditBlockMenu(self, event):
         if self.SelectedElement is not None:
-            self.ParentWindow.EditProjectElement(ITEM_POU, "P::%s"%self.SelectedElement.GetType())
+            self.ParentWindow.EditProjectElement(ITEM_POU, "P::%s" % self.SelectedElement.GetType())
 
     def OnAdjustBlockSizeMenu(self, event):
         if self.SelectedElement is not None:
@@ -1867,6 +1951,7 @@
 
     def GetAddToWireMenuCallBack(self, func, *args):
         args += (self.SelectedElement,)
+
         def AddToWireMenuCallBack(event):
             func(wx.Rect(0, 0, 0, 0), *args)
         return AddToWireMenuCallBack
@@ -1876,16 +1961,16 @@
             wx.CallAfter(func)
         return ClipboardCallback
 
-#-------------------------------------------------------------------------------
-#                          Mouse event functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Mouse event functions
+    # -------------------------------------------------------------------------------
 
     def OnViewerMouseEvent(self, event):
         self.ResetBuffer()
         if event.Leaving() and self.ToolTipElement is not None:
             self.ToolTipElement.DestroyToolTip()
         elif (not event.Entering() and
-            gettime() - self.LastToolTipCheckTime > REFRESH_PERIOD):
+              gettime() - self.LastToolTipCheckTime > REFRESH_PERIOD):
             self.LastToolTipCheckTime = gettime()
             element = None
             if not event.Leaving() and not event.LeftUp() and not event.LeftDClick():
@@ -1942,7 +2027,7 @@
                         if element is None or element.TestHandle(event) == (0, 0):
                             connector = self.FindBlockConnector(pos, self.SelectedElement.GetConnectionDirection())
                         if connector is not None:
-                            event.Dragging = lambda : True
+                            event.Dragging = lambda: True
                             self.SelectedElement.OnMotion(event, dc, self.Scaling)
                         if self.SelectedElement.EndConnected is not None:
                             self.SelectedElement.ResetPoints()
@@ -1965,10 +2050,11 @@
                         WEST: [WEST, EAST],
                         NORTH: [NORTH, SOUTH],
                         SOUTH: [SOUTH, NORTH]}[connector.GetDirection()]
-                    wire = Wire(self, *map(list, zip(
-                                           [wx.Point(pos.x, pos.y),
-                                            wx.Point(scaled_pos.x, scaled_pos.y)],
-                                           directions)))
+                    wire = Wire(self,
+                                *map(list, zip(
+                                    [wx.Point(pos.x, pos.y),
+                                     wx.Point(scaled_pos.x, scaled_pos.y)],
+                                    directions)))
                     wire.oldPos = scaled_pos
                     wire.Handle = (HANDLE_POINT, 0)
                     wire.ProcessDragging(0, 0, event, None)
@@ -2081,8 +2167,8 @@
                         # Popup contextual menu
                         menu = wx.Menu()
                         self.AddMenuItems(menu,
-                            [(wx.NewId(), wx.ITEM_NORMAL, text, '', callback)
-                             for text, callback in items])
+                                          [(wx.NewId(), wx.ITEM_NORMAL, text, '', callback)
+                                           for text, callback in items])
                         self.PopupMenu(menu)
 
                     self.SelectedElement.StartConnected.HighlightParentBlock(False)
@@ -2188,16 +2274,18 @@
                             "functionBlock": ITEM_FUNCTIONBLOCK,
                         }.get(self.Controler.GetPouType(instance_type))
                         if pou_type is not None and instance_type in self.Controler.GetProjectPouNames(self.Debug):
-                            self.ParentWindow.OpenDebugViewer(pou_type,
-                                "%s.%s"%(self.GetInstancePath(True), self.SelectedElement.GetName()),
-                                self.Controler.ComputePouName(instance_type))
+                            self.ParentWindow.OpenDebugViewer(
+                                pou_type,
+                                "%s.%s" % (self.GetInstancePath(True), self.SelectedElement.GetName()),
+                                ComputePouName(instance_type))
                 else:
                     iec_path = self.GetElementIECPath(self.SelectedElement)
                     if iec_path is not None:
                         if isinstance(self.SelectedElement, Wire):
                             if self.SelectedElement.EndConnected is not None:
-                                self.ParentWindow.OpenDebugViewer(ITEM_VAR_LOCAL, iec_path,
-                                        self.SelectedElement.EndConnected.GetType())
+                                self.ParentWindow.OpenDebugViewer(
+                                    ITEM_VAR_LOCAL, iec_path,
+                                    self.SelectedElement.EndConnected.GetType())
                         else:
                             self.ParentWindow.OpenDebugViewer(ITEM_VAR_LOCAL, iec_path, "BOOL")
             elif event.ControlDown() and not event.ShiftDown():
@@ -2207,8 +2295,9 @@
                     else:
                         instance_type = None
                     if instance_type in self.Controler.GetProjectPouNames(self.Debug):
-                        self.ParentWindow.EditProjectElement(ITEM_POU,
-                                self.Controler.ComputePouName(instance_type))
+                        self.ParentWindow.EditProjectElement(
+                            ITEM_POU,
+                            ComputePouName(instance_type))
                     else:
                         self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
             elif event.ControlDown() and event.ShiftDown():
@@ -2223,7 +2312,6 @@
     def OnViewerMotion(self, event):
         if self.Editor.HasCapture() and not event.Dragging():
             return
-        refresh = False
         dc = self.GetLogicalDC()
         pos = GetScaledEventPosition(event, dc, self.Scaling)
         if event.MiddleIsDown() or self.Mode == MODE_MOTION:
@@ -2231,8 +2319,8 @@
                 new_pos = event.GetPosition()
                 xmax = self.GetScrollRange(wx.HORIZONTAL) - self.GetScrollThumb(wx.HORIZONTAL)
                 ymax = self.GetScrollRange(wx.VERTICAL) - self.GetScrollThumb(wx.VERTICAL)
-                scrollx = max(0, self.StartScreenPos[0] - (new_pos[0] - self.StartMousePos[0]) / SCROLLBAR_UNIT)
-                scrolly = max(0, self.StartScreenPos[1] - (new_pos[1] - self.StartMousePos[1]) / SCROLLBAR_UNIT)
+                scrollx = max(0, self.StartScreenPos[0] - (new_pos[0] - self.StartMousePos[0]) // SCROLLBAR_UNIT)
+                scrolly = max(0, self.StartScreenPos[1] - (new_pos[1] - self.StartMousePos[1]) // SCROLLBAR_UNIT)
                 if scrollx > xmax or scrolly > ymax:
                     self.RefreshScrollBars(max(0, scrollx - xmax), max(0, scrolly - ymax))
                     self.Scroll(scrollx, scrolly)
@@ -2241,8 +2329,7 @@
                     self.RefreshScrollBars()
                 self.RefreshVisibleElements()
         else:
-            if (not event.Dragging() and
-                gettime() - self.LastHighlightCheckTime > REFRESH_PERIOD):
+            if not event.Dragging() and (gettime() - self.LastHighlightCheckTime) > REFRESH_PERIOD:
                 self.LastHighlightCheckTime = gettime()
                 highlighted = self.FindElement(event, connectors=False)
                 if self.HighlightedElement is not None and self.HighlightedElement != highlighted:
@@ -2259,8 +2346,8 @@
             elif not self.Debug and self.Mode == MODE_SELECTION and self.SelectedElement is not None:
                 if self.DrawingWire:
                     connector, errorHighlight = self.FindBlockConnectorWithError(pos, self.SelectedElement.GetConnectionDirection(), self.SelectedElement.EndConnected)
-                    self.SelectedElement.ErrHighlight = errorHighlight;
-                    if not connector or self.SelectedElement.EndConnected == None:
+                    self.SelectedElement.ErrHighlight = errorHighlight
+                    if not connector or self.SelectedElement.EndConnected is None:
                         self.SelectedElement.ResetPoints()
                         movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
                         self.SelectedElement.GeneratePoints()
@@ -2322,11 +2409,11 @@
             elif position.y > window_size[1] - SCROLL_ZONE:
                 move_window.y = 1
             if move_window.x != 0 or move_window.y != 0:
-                self.RefreshVisibleElements(xp = xstart + move_window.x, yp = ystart + move_window.y)
+                self.RefreshVisibleElements(xp=xstart + move_window.x, yp=ystart + move_window.y)
                 self.Scroll(xstart + move_window.x, ystart + move_window.y)
                 self.RefreshScrollBars(move_window.x, move_window.y)
 
-    def BlockCompatibility(self, startblock=None, endblock=None, direction = None):
+    def BlockCompatibility(self, startblock=None, endblock=None, direction=None):
         return True
 
     def GetPopupMenuItems(self):
@@ -2354,29 +2441,29 @@
                 items.append((_(u'Divergence'), self.GetAddToWireMenuCallBack(self.AddNewDivergence,
                                                                               poss_div_types)))
         elif start_direction == EAST:
+            items.extend([
+                (_(u'Block'), self.GetAddToWireMenuCallBack(self.AddNewBlock)),
+                (_(u'Connection'), self.GetAddToWireMenuCallBack(self.AddNewConnection))])
+
+            if self.CurrentLanguage != "FBD":
+                items.append((_(u'Contact'), self.GetAddToWireMenuCallBack(self.AddNewContact)))
+
+            if self.CurrentLanguage == "LD":
                 items.extend([
-                    (_(u'Block'), self.GetAddToWireMenuCallBack(self.AddNewBlock)),
-                    (_(u'Connection'), self.GetAddToWireMenuCallBack(self.AddNewConnection))])
-
-                if self.CurrentLanguage != "FBD":
-                    items.append((_(u'Contact'), self.GetAddToWireMenuCallBack(self.AddNewContact)))
-
-                if self.CurrentLanguage == "LD":
-                    items.extend([
-                        (_(u'Coil'), self.GetAddToWireMenuCallBack(self.AddNewCoil)),
-                        (_(u'Power Rail'), self.GetAddToWireMenuCallBack(self.AddNewPowerRail))])
-
-                if self.CurrentLanguage == "SFC":
-                    items.append(
-                        (_(u'Transition'), self.GetAddToWireMenuCallBack(self.AddNewTransition, True)))
-                else:
-                    items.append(
-                        (_(u'Variable'), self.GetAddToWireMenuCallBack(self.AddNewVariable, True)))
+                    (_(u'Coil'), self.GetAddToWireMenuCallBack(self.AddNewCoil)),
+                    (_(u'Power Rail'), self.GetAddToWireMenuCallBack(self.AddNewPowerRail))])
+
+            if self.CurrentLanguage == "SFC":
+                items.append(
+                    (_(u'Transition'), self.GetAddToWireMenuCallBack(self.AddNewTransition, True)))
+            else:
+                items.append(
+                    (_(u'Variable'), self.GetAddToWireMenuCallBack(self.AddNewVariable, True)))
         return items
 
-#-------------------------------------------------------------------------------
-#                          Keyboard event functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Keyboard event functions
+    # -------------------------------------------------------------------------------
 
     ARROW_KEY_MOVE = {
         wx.WXK_LEFT: (-1, 0),
@@ -2404,7 +2491,7 @@
             self.RefreshRect(self.GetScrolledRect(rect), False)
         elif not self.Debug and keycode == wx.WXK_RETURN and self.SelectedElement is not None:
             self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
-        elif self.ARROW_KEY_MOVE.has_key(keycode):
+        elif keycode in self.ARROW_KEY_MOVE:
             move = self.ARROW_KEY_MOVE[keycode]
             if event.ControlDown() and event.ShiftDown():
                 self.Scroll({-1: 0, 0: xpos, 1: xmax}[move[0]],
@@ -2452,19 +2539,19 @@
         else:
             event.Skip()
 
-#-------------------------------------------------------------------------------
-#                  Model adding functions from Drop Target
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                  Model adding functions from Drop Target
+    # -------------------------------------------------------------------------------
 
     def AddVariableBlock(self, x, y, scaling, var_class, var_name, var_type):
         id = self.GetNewId()
         variable = FBD_Variable(self, var_class, var_name, var_type, id)
         width, height = variable.GetMinSize()
         if scaling is not None:
-            x = round(float(x) / float(scaling[0])) * scaling[0]
-            y = round(float(y) / float(scaling[1])) * scaling[1]
-            width = round(float(width) / float(scaling[0]) + 0.5) * scaling[0]
-            height = round(float(height) / float(scaling[1]) + 0.5) * scaling[1]
+            x = round(x / scaling[0]) * scaling[0]
+            y = round(y / scaling[1]) * scaling[1]
+            width = round(width / scaling[0] + 0.5) * scaling[0]
+            height = round(height / scaling[1] + 0.5) * scaling[1]
         variable.SetPosition(x, y)
         variable.SetSize(width, height)
         self.AddBlock(variable)
@@ -2475,14 +2562,14 @@
         self.RefreshVisibleElements()
         self.Editor.Refresh(False)
 
-#-------------------------------------------------------------------------------
-#                          Model adding functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Model adding functions
+    # -------------------------------------------------------------------------------
 
     def GetScaledSize(self, width, height):
         if self.Scaling is not None:
-            width = round(float(width) / float(self.Scaling[0]) + 0.4) * self.Scaling[0]
-            height = round(float(height) / float(self.Scaling[1]) + 0.4) * self.Scaling[1]
+            width = round(width / self.Scaling[0] + 0.4) * self.Scaling[0]
+            height = round(height / self.Scaling[1] + 0.4) * self.Scaling[1]
         return width, height
 
     def AddNewElement(self, element, bbox, wire=None, connector=None):
@@ -2522,10 +2609,11 @@
             id = self.GetNewId()
             values = dialog.GetValues()
             values.setdefault("name", "")
-            block = FBD_Block(self, values["type"], values["name"], id,
-                    values["extension"], values["inputs"],
-                    executionControl = values["executionControl"],
-                    executionOrder = values["executionOrder"])
+            block = FBD_Block(
+                self, values["type"], values["name"], id,
+                values["extension"], values["inputs"],
+                executionControl=values["executionControl"],
+                executionOrder=values["executionOrder"])
             self.Controler.AddEditedElementBlock(self.TagName, id, values["type"], values.get("name", None))
             connector = None
             if wire is not None:
@@ -2535,6 +2623,8 @@
                         connector = input_connector
                         break
             self.AddNewElement(block, bbox, wire, connector)
+            self.RefreshVariablePanel()
+            self.ParentWindow.RefreshPouInstanceVariablesPanel()
         dialog.Destroy()
 
     def AddNewVariable(self, bbox, exclude_input=False, wire=None):
@@ -2571,18 +2661,15 @@
             self.AddNewElement(connection, bbox, wire)
 
     def AddNewComment(self, bbox):
-        dialog = wx.TextEntryDialog(self.ParentWindow,
-                                    _("Edit comment"),
-                                    _("Please enter comment text"),
-                                    "", wx.OK|wx.CANCEL|wx.TE_MULTILINE)
-        dialog.SetClientSize(wx.Size(400, 200))
+        dialog = CommentEditDialog(self.ParentWindow,
+                                   self.GetFont())
         if dialog.ShowModal() == wx.ID_OK:
             value = dialog.GetValue()
             id = self.GetNewId()
             comment = Comment(self, value, id)
             comment.SetPosition(bbox.x, bbox.y)
             min_width, min_height = comment.GetMinSize()
-            comment.SetSize(*self.GetScaledSize(max(min_width,bbox.width),max(min_height,bbox.height)))
+            comment.SetSize(*self.GetScaledSize(max(min_width, bbox.width), max(min_height, bbox.height)))
             self.AddComment(comment)
             self.Controler.AddEditedElementComment(self.TagName, id)
             self.RefreshCommentModel(comment)
@@ -2638,11 +2725,11 @@
     def AddNewStep(self, bbox, initial=False, wire=None):
         if wire is not None:
             values = {
-                "name": self.Controler.GenerateNewName(
-                    self.TagName, None, "Step%d", 0),
-                "input": True,
+                "name":   self.Controler.GenerateNewName(self.TagName, None, "Step%d", 0),
+                "input":  True,
                 "output": True,
-                "action":False}
+                "action": False
+            }
         else:
             dialog = SFCStepDialog(self.ParentWindow, self.Controler, self.TagName, initial)
             dialog.SetPreviewFont(self.GetFont())
@@ -2685,7 +2772,7 @@
                 connector = transition.GetConnectors()["inputs"][0]
             self.AddNewElement(transition, bbox, wire, connector)
 
-    def AddNewDivergence(self, bbox, poss_div_types = None, wire=None):
+    def AddNewDivergence(self, bbox, poss_div_types=None, wire=None):
         dialog = SFCDivergenceDialog(self.ParentWindow, self.Controler, self.TagName, poss_div_types)
         dialog.SetPreviewFont(self.GetFont())
         dialog.SetMinElementSize((bbox.width, bbox.height))
@@ -2703,8 +2790,10 @@
             if isinstance(block, SFC_Step):
                 choices.append(block.GetName())
         dialog = wx.SingleChoiceDialog(self.ParentWindow,
-              _("Add a new jump"), _("Please choose a target"),
-              choices, wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
+                                       _("Add a new jump"),
+                                       _("Please choose a target"),
+                                       choices,
+                                       wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
         if dialog.ShowModal() == wx.ID_OK:
             id = self.GetNewId()
             jump = SFC_Jump(self, dialog.GetStringSelection(), id)
@@ -2724,20 +2813,22 @@
             self.AddNewElement(actionblock, bbox, wire)
         dialog.Destroy()
 
-#-------------------------------------------------------------------------------
-#                          Edit element content functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Edit element content functions
+    # -------------------------------------------------------------------------------
 
     def EditBlockContent(self, block):
         dialog = FBDBlockDialog(self.ParentWindow, self.Controler, self.TagName)
         dialog.SetPreviewFont(self.GetFont())
         dialog.SetMinElementSize(block.GetSize())
-        old_values = {"name" : block.GetName(),
-                      "type" : block.GetType(),
-                      "extension" : block.GetExtension(),
-                      "inputs" : block.GetInputTypes(),
-                      "executionControl" : block.GetExecutionControl(),
-                      "executionOrder" : block.GetExecutionOrder()}
+        old_values = {
+            "name":             block.GetName(),
+            "type":             block.GetType(),
+            "extension":        block.GetExtension(),
+            "inputs":           block.GetInputTypes(),
+            "executionControl": block.GetExecutionControl(),
+            "executionOrder":   block.GetExecutionOrder()
+        }
         dialog.SetValues(old_values)
         if dialog.ShowModal() == wx.ID_OK:
             new_values = dialog.GetValues()
@@ -2747,7 +2838,7 @@
             else:
                 block.SetName("")
             block.SetSize(*self.GetScaledSize(new_values["width"], new_values["height"]))
-            block.SetType(new_values["type"], new_values["extension"], executionControl = new_values["executionControl"])
+            block.SetType(new_values["type"], new_values["extension"], executionControl=new_values["executionControl"])
             block.SetExecutionOrder(new_values["executionOrder"])
             rect = rect.Union(block.GetRedrawRect())
             self.RefreshBlockModel(block)
@@ -2766,8 +2857,11 @@
         dialog = FBDVariableDialog(self.ParentWindow, self.Controler, self.TagName)
         dialog.SetPreviewFont(self.GetFont())
         dialog.SetMinElementSize(variable.GetSize())
-        old_values = {"expression" : variable.GetName(), "class" : variable.GetType(),
-                      "executionOrder" : variable.GetExecutionOrder()}
+        old_values = {
+            "expression":     variable.GetName(),
+            "class":          variable.GetType(),
+            "executionOrder": variable.GetExecutionOrder()
+        }
         dialog.SetValues(old_values)
         if dialog.ShowModal() == wx.ID_OK:
             new_values = dialog.GetValues()
@@ -2795,7 +2889,7 @@
         dialog = ConnectionDialog(self.ParentWindow, self.Controler, self.TagName, True)
         dialog.SetPreviewFont(self.GetFont())
         dialog.SetMinElementSize(connection.GetSize())
-        values = {"name" : connection.GetName(), "type" : connection.GetType()}
+        values = {"name": connection.GetName(), "type": connection.GetType()}
         dialog.SetValues(values)
         result = dialog.ShowModal()
         dialog.Destroy()
@@ -2827,8 +2921,8 @@
         dialog = LDElementDialog(self.ParentWindow, self.Controler, self.TagName, "contact")
         dialog.SetPreviewFont(self.GetFont())
         dialog.SetMinElementSize(contact.GetSize())
-        dialog.SetValues({"variable" : contact.GetName(),
-                          "modifier" : contact.GetType()})
+        dialog.SetValues({"variable": contact.GetName(),
+                          "modifier": contact.GetType()})
         if dialog.ShowModal() == wx.ID_OK:
             values = dialog.GetValues()
             rect = contact.GetRedrawRect(1, 1)
@@ -2847,8 +2941,8 @@
         dialog = LDElementDialog(self.ParentWindow, self.Controler, self.TagName, "coil")
         dialog.SetPreviewFont(self.GetFont())
         dialog.SetMinElementSize(coil.GetSize())
-        dialog.SetValues({"variable" : coil.GetName(),
-                          "modifier" : coil.GetType()})
+        dialog.SetValues({"variable": coil.GetName(),
+                          "modifier": coil.GetType()})
         if dialog.ShowModal() == wx.ID_OK:
             values = dialog.GetValues()
             rect = coil.GetRedrawRect(1, 1)
@@ -2871,7 +2965,7 @@
         dialog.SetValues({
             "type": powerrail.GetType(),
             "pin_number": len(powerrail.GetConnectors()[
-                    ("outputs" if powerrail_type == LEFTRAIL else "inputs")])})
+                ("outputs" if powerrail_type == LEFTRAIL else "inputs")])})
         if dialog.ShowModal() == wx.ID_OK:
             values = dialog.GetValues()
             rect = powerrail.GetRedrawRect(1, 1)
@@ -2895,10 +2989,10 @@
         dialog.SetMinElementSize(step.GetSize())
         connectors = step.GetConnectors()
         dialog.SetValues({
-            "name" : step.GetName(),
+            "name": step.GetName(),
             "input": len(connectors["inputs"]) > 0,
             "output": len(connectors["outputs"]) > 0,
-            "action": step.GetActionConnector() != None})
+            "action": step.GetActionConnector() is not None})
         if dialog.ShowModal() == wx.ID_OK:
             values = dialog.GetValues()
             rect = step.GetRedrawRect(1, 1)
@@ -2915,7 +3009,7 @@
                                 rect = rect.Union(block.GetRedrawRect())
                                 block.Refresh(rect)
             step.SetName(new_name)
-            
+
             if values["input"]:
                 step.AddInput()
             else:
@@ -2940,11 +3034,15 @@
         dialog = SFCTransitionDialog(self.ParentWindow, self.Controler, self.TagName, self.GetDrawingMode() == FREEDRAWING_MODE)
         dialog.SetPreviewFont(self.GetFont())
         dialog.SetMinElementSize(transition.GetSize())
-        dialog.SetValues({"type":transition.GetType(),"value":transition.GetCondition(), "priority":transition.GetPriority()})
+        dialog.SetValues({
+            "type":     transition.GetType(),
+            "value":    transition.GetCondition(),
+            "priority": transition.GetPriority()
+        })
         if dialog.ShowModal() == wx.ID_OK:
             values = dialog.GetValues()
             rect = transition.GetRedrawRect(1, 1)
-            transition.SetType(values["type"],values["value"])
+            transition.SetType(values["type"], values["value"])
             transition.SetPriority(values["priority"])
             rect = rect.Union(transition.GetRedrawRect())
             self.RefreshTransitionModel(transition)
@@ -2960,8 +3058,10 @@
             if isinstance(block, SFC_Step):
                 choices.append(block.GetName())
         dialog = wx.SingleChoiceDialog(self.ParentWindow,
-              _("Edit jump target"), _("Please choose a target"),
-              choices, wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
+                                       _("Edit jump target"),
+                                       _("Please choose a target"),
+                                       choices,
+                                       wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
         try:
             indx = choices.index(jump.GetTarget())
             dialog.SetSelection(indx)
@@ -3000,12 +3100,10 @@
         dialog.Destroy()
 
     def EditCommentContent(self, comment):
-        dialog = wx.TextEntryDialog(self.ParentWindow,
-                                    _("Edit comment"),
-                                    _("Please enter comment text"),
-                                    comment.GetContent(),
-                                    wx.OK|wx.CANCEL|wx.TE_MULTILINE)
-        dialog.SetClientSize(wx.Size(400, 200))
+        dialog = CommentEditDialog(self.ParentWindow,
+                                   self.GetFont(),
+                                   comment.GetContent(),
+                                   comment.GetSize())
         if dialog.ShowModal() == wx.ID_OK:
             value = dialog.GetValue()
             rect = comment.GetRedrawRect(1, 1)
@@ -3019,9 +3117,9 @@
             comment.Refresh(rect)
         dialog.Destroy()
 
-#-------------------------------------------------------------------------------
-#                          Model update functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                          Model update functions
+    # -------------------------------------------------------------------------------
 
     def RefreshBlockModel(self, block):
         blockid = block.GetId()
@@ -3168,11 +3266,9 @@
         infos["connector"] = actionblock.GetConnector()
         self.Controler.SetEditedElementActionBlockInfos(self.TagName, actionblockid, infos)
 
-
-#-------------------------------------------------------------------------------
-#                          Model delete functions
-#-------------------------------------------------------------------------------
-
+    # -------------------------------------------------------------------------------
+    #                          Model delete functions
+    # -------------------------------------------------------------------------------
 
     def DeleteBlock(self, block):
         elements = []
@@ -3319,10 +3415,9 @@
         self.RemoveBlock(actionblock)
         self.Controler.RemoveEditedElementInstance(self.TagName, actionblock.GetId())
 
-
-#-------------------------------------------------------------------------------
-#                            Editing functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                            Editing functions
+    # -------------------------------------------------------------------------------
 
     def Cut(self):
         if not self.Debug and (self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement) or isinstance(self.SelectedElement, Graphic_Group)):
@@ -3359,13 +3454,13 @@
                 middle = True
                 new_pos = [bbx.x, bbx.y]
             result = self.Controler.PasteEditedElementInstances(self.TagName, element, new_pos, middle, self.Debug)
-            if not isinstance(result, (StringType, UnicodeType)):
+            if not isinstance(result, string_types):
                 self.RefreshBuffer()
                 self.RefreshView(selection=result)
                 self.RefreshVariablePanel()
                 self.ParentWindow.RefreshPouInstanceVariablesPanel()
             else:
-                message = wx.MessageDialog(self.Editor, result, "Error", wx.OK|wx.ICON_ERROR)
+                message = wx.MessageDialog(self.Editor, result, "Error", wx.OK | wx.ICON_ERROR)
                 message.ShowModal()
                 message.Destroy()
 
@@ -3380,7 +3475,7 @@
             return True
         return False
 
-    def GenerateNewName(self, element=None, blocktype=None, exclude={}):
+    def GenerateNewName(self, element=None, blocktype=None, exclude=None):
         if element is not None and isinstance(element, SFC_Step):
             format = "Step%d"
         else:
@@ -3453,9 +3548,9 @@
                 self.Controler.AddEditedElementActionBlock(self.TagName, block.GetId())
                 self.RefreshActionBlockModel(block)
 
-#-------------------------------------------------------------------------------
-#                         Find and Replace functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                         Find and Replace functions
+    # -------------------------------------------------------------------------------
 
     def Find(self, direction, search_params):
         if self.SearchParams != search_params:
@@ -3464,8 +3559,8 @@
             self.SearchParams = search_params
             self.SearchResults = []
             blocks = []
-            for infos, start, end, text in self.Controler.SearchInPou(self.TagName, search_params, self.Debug):
-                if (infos[0] == self.TagName or self.TagName.split("::")[0] in ['A', 'T']) and infos[1] is not 'name':
+            for infos, start, end, _text in self.Controler.SearchInPou(self.TagName, search_params, self.Debug):
+                if (infos[0] == self.TagName or self.TagName.split("::")[0] in ['A', 'T']) and infos[1] != 'name':
                     if infos[1] in ["var_local", "var_input", "var_output", "var_inout"]:
                         self.SearchResults.append((infos[1:], start, end, SEARCH_RESULT_HIGHLIGHT))
                     else:
@@ -3496,9 +3591,9 @@
                 self.RemoveHighlight(*self.CurrentFindHighlight)
             self.CurrentFindHighlight = None
 
-#-------------------------------------------------------------------------------
-#                        Highlights showing functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                        Highlights showing functions
+    # -------------------------------------------------------------------------------
 
     def OnRefreshHighlightsTimer(self, event):
         self.RefreshView()
@@ -3537,9 +3632,9 @@
                 if block is not None:
                     block.AddHighlight(infos[2:], start, end, highlight_type)
 
-#-------------------------------------------------------------------------------
-#                            Drawing functions
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                            Drawing functions
+    # -------------------------------------------------------------------------------
 
     def OnScrollWindow(self, event):
         if self.Editor.HasCapture() and self.StartMousePos is not None:
@@ -3549,9 +3644,9 @@
             self.Editor.Freeze()
             wx.CallAfter(self.Editor.Thaw)
         elif event.GetOrientation() == wx.HORIZONTAL:
-            self.RefreshVisibleElements(xp = event.GetPosition())
+            self.RefreshVisibleElements(xp=event.GetPosition())
         else:
-            self.RefreshVisibleElements(yp = event.GetPosition())
+            self.RefreshVisibleElements(yp=event.GetPosition())
 
         # Handle scroll in debug to fully redraw area and ensuring
         # instance path is fully draw without flickering
@@ -3574,16 +3669,15 @@
             if event.ShiftDown():
                 x, y = self.GetViewStart()
                 xp = max(0, min(x - rotation * 3, self.Editor.GetVirtualSize()[0] / self.Editor.GetScrollPixelsPerUnit()[0]))
-                self.RefreshVisibleElements(xp = xp)
+                self.RefreshVisibleElements(xp=xp)
                 self.Scroll(xp, y)
             elif event.ControlDown():
-                dc = self.GetLogicalDC()
-                self.SetScale(self.CurrentScale + rotation, mouse_event = event)
+                self.SetScale(self.CurrentScale + rotation, mouse_event=event)
                 self.ParentWindow.RefreshDisplayMenu()
             else:
                 x, y = self.GetViewStart()
                 yp = max(0, min(y - rotation * 3, self.Editor.GetVirtualSize()[1] / self.Editor.GetScrollPixelsPerUnit()[1]))
-                self.RefreshVisibleElements(yp = yp)
+                self.RefreshVisibleElements(yp=yp)
                 self.Scroll(x, yp)
 
     def OnMoveWindow(self, event):
@@ -3594,7 +3688,7 @@
             self.RefreshVisibleElements()
         event.Skip()
 
-    def DoDrawing(self, dc, printing = False):
+    def DoDrawing(self, dc, printing=False):
         if printing:
             if getattr(dc, "printing", False):
                 font = wx.Font(self.GetFont().GetPointSize(), wx.MODERN, wx.NORMAL, wx.NORMAL)
@@ -3618,12 +3712,14 @@
             dc.SetPen(self.PagePen)
             xstart, ystart = self.GetViewStart()
             window_size = self.Editor.GetClientSize()
-            for x in xrange(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], int(window_size[0] / self.ViewScale[0]), self.PageSize[0]):
-                dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, int(ystart * SCROLLBAR_UNIT / self.ViewScale[0]),
-                            xstart * SCROLLBAR_UNIT + x + 1, int((ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[0]))
-            for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], int(window_size[1] / self.ViewScale[1]), self.PageSize[1]):
-                dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1,
-                            int((xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[1]), ystart * SCROLLBAR_UNIT + y + 1)
+            if self.PageSize[0] != 0:
+                for x in xrange(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], int(window_size[0] / self.ViewScale[0]), self.PageSize[0]):
+                    dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, int(ystart * SCROLLBAR_UNIT / self.ViewScale[0]),
+                                xstart * SCROLLBAR_UNIT + x + 1, int((ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[0]))
+            if self.PageSize[1] != 0:
+                for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], int(window_size[1] / self.ViewScale[1]), self.PageSize[1]):
+                    dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1,
+                                int((xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[1]), ystart * SCROLLBAR_UNIT + y + 1)
 
         # Draw all elements
         for comment in self.Comments.itervalues():
@@ -3631,11 +3727,11 @@
                 comment.Draw(dc)
         for wire in self.Wires.iterkeys():
             if wire != self.SelectedElement and (wire.IsVisible() or printing):
-                 if not self.Debug or wire.GetValue() != True:
+                if not self.Debug or not wire.GetValue():
                     wire.Draw(dc)
         if self.Debug:
             for wire in self.Wires.iterkeys():
-                if wire != self.SelectedElement and (wire.IsVisible() or printing) and wire.GetValue() == True:
+                if wire != self.SelectedElement and (wire.IsVisible() or printing) and wire.GetValue():
                     wire.Draw(dc)
         for block in self.Blocks.itervalues():
             if block != self.SelectedElement and (block.IsVisible() or printing):
@@ -3646,28 +3742,7 @@
 
         if not printing:
             if self.Debug:
-                scalex, scaley = dc.GetUserScale()
-                dc.SetUserScale(1, 1)
-
-                is_action = self.TagName.split("::")[0] == "A"
-                text = _("Debug: %s") % self.InstancePath
-                if is_action and self.Value is not None:
-                    text += " ("
-                text_offset_x, text_offset_y = self.CalcUnscrolledPosition(2, 2)
-                dc.DrawText(text, text_offset_x, text_offset_y)
-                if is_action and self.Value is not None:
-                    value_text = self.VALUE_TRANSLATION[self.Value]
-                    tw, th = dc.GetTextExtent(text)
-                    if self.Value:
-                        dc.SetTextForeground(wx.GREEN)
-                    dc.DrawText(value_text, text_offset_x + tw, text_offset_y)
-                    if self.Value:
-                        dc.SetTextForeground(wx.BLACK)
-                    vw, vh = dc.GetTextExtent(value_text)
-                    dc.DrawText(")", text_offset_x + tw + vw + 2, text_offset_y)
-
-                dc.SetUserScale(scalex, scaley)
-
+                self.InstanceName.Draw(dc)
             if self.rubberBand.IsShown():
                 self.rubberBand.Draw(dc)
             dc.EndDrawing()
@@ -3679,5 +3754,3 @@
         if self.Debug:
             DebugViewer.RefreshNewData(self)
         event.Skip()
-
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/CommonEtherCATFunction.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,1606 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+
+# This file is part of Beremiz
+#
+# Copyright (C) 2013: Real-Time & Embedded Systems (RTES) Lab. University of Seoul, Korea
+#
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+from __future__ import division
+from builtins import str as text
+import codecs
+import wx
+
+
+mailbox_protocols = ["AoE", "EoE", "CoE", "FoE", "SoE", "VoE"]
+
+
+def ExtractHexDecValue(value):
+    """
+     convert numerical value in string format into decimal or hex format.
+     @param value : hex or decimal data
+     @return integer data
+    """
+    try:
+        return int(value)
+    except Exception:
+        pass
+    try:
+        return int(value.replace("#", "0"), 16)
+
+    except Exception:
+        raise ValueError(_("Invalid value for HexDecValue \"%s\"") % value)
+
+
+def ExtractName(names, default=None):
+    """
+     Extract "name" field from XML entries.
+     @param names : XML entry
+     @default : if it fails to extract from the designated XML entry, return the default value ("None").
+     @return default or the name extracted
+    """
+    if len(names) == 1:
+        return names[0].getcontent()
+    else:
+        for name in names:
+            if name.getLcId() == 1033:
+                return name.getcontent()
+    return default
+
+# --------------------------------------------------
+#         Remote Exec Etherlab Commands
+# --------------------------------------------------
+
+
+# --------------------- for master ---------------------------
+MASTER_STATE = """
+import commands
+result = commands.getoutput("ethercat master")
+returnVal =result
+"""
+
+# --------------------- for slave ----------------------------
+# ethercat state -p (slave position) (state (INIT, PREOP, SAFEOP, OP))
+SLAVE_STATE = """
+import commands
+result = commands.getoutput("ethercat state -p %d %s")
+returnVal = result
+"""
+
+# ethercat slave
+GET_SLAVE = """
+import commands
+result = commands.getoutput("ethercat slaves")
+returnVal =result
+"""
+
+# ethercat xml -p (slave position)
+SLAVE_XML = """
+import commands
+result = commands.getoutput("ethercat xml -p %d")
+returnVal = result
+"""
+
+# ethercat sdos -p (slave position)
+SLAVE_SDO = """
+import commands
+result = commands.getoutput("ethercat sdos -p %d")
+returnVal =result
+"""
+
+# ethercat upload -p (slave position) (main index) (sub index)
+GET_SLOW_SDO = """
+import commands
+result = commands.getoutput("ethercat upload -p %d %s %s")
+returnVal =result
+"""
+
+# ethercat download -p (slave position) (main index) (sub index) (value)
+SDO_DOWNLOAD = """
+import commands
+result = commands.getoutput("ethercat download --type %s -p %d %s %s %s")
+returnVal =result
+"""
+
+# ethercat sii_read -p (slave position)
+SII_READ = """
+import commands
+result = commands.getoutput("ethercat sii_read -p %d")
+returnVal =result
+"""
+
+# ethercat reg_read -p (slave position) (address) (size)
+REG_READ = """
+import commands
+result = commands.getoutput("ethercat reg_read -p %d %s %s")
+returnVal =result
+"""
+
+# ethercat sii_write -p (slave position) - (contents)
+SII_WRITE = """
+import subprocess
+process = subprocess.Popen(
+    ["ethercat", "-f", "sii_write", "-p", "%d", "-"],
+    stdin=subprocess.PIPE)
+process.communicate(sii_data)
+returnVal = process.returncode
+"""
+
+# ethercat reg_write -p (slave position) -t (uinit16) (address) (data)
+REG_WRITE = """
+import commands
+result = commands.getoutput("ethercat reg_write -p %d -t uint16 %s %s")
+returnVal =result
+"""
+
+# ethercat rescan -p (slave position)
+RESCAN = """
+import commands
+result = commands.getoutput("ethercat rescan -p %d")
+returnVal =result
+"""
+
+
+# --------------------------------------------------
+#    Common Method For EtherCAT Management
+# --------------------------------------------------
+class _CommonSlave(object):
+
+    # ----- Data Structure for ethercat management ----
+    SlaveState = ""
+
+    # category of SDO data
+    DatatypeDescription, CommunicationObject, ManufacturerSpecific, \
+        ProfileSpecific, Reserved, AllSDOData = range(6)
+
+    # store the execution result of "ethercat sdos" command into SaveSDOData.
+    SaveSDOData = []
+
+    # Flags for checking "write" permission of OD entries
+    CheckPREOP = False
+    CheckSAFEOP = False
+    CheckOP = False
+
+    # Save PDO Data
+    TxPDOInfo = []
+    TxPDOCategory = []
+    RxPDOInfo = []
+    RxPDOCategory = []
+
+    # Save EEPROM Data
+    SiiData = ""
+
+    # Save Register Data
+    RegData = ""
+    CrtRegSpec = {"ESCType": "",
+                  "FMMUNumber": "",
+                  "SMNumber": "",
+                  "PDIType": ""}
+
+    def __init__(self, controler):
+        """
+        Constructor
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+        self.Controler = controler
+        self.HexDecode = codecs.getdecoder("hex_codec")
+        self.ClearSDODataSet()
+
+    # -------------------------------------------------------------------------------
+    #                        Used Master State
+    # -------------------------------------------------------------------------------
+    def GetMasterState(self):
+        """
+        Execute "ethercat master" command and parse the execution result
+        @return MasterState
+        """
+
+        # exectute "ethercat master" command
+        _error, return_val = self.Controler.RemoteExec(MASTER_STATE, return_val=None)
+        master_state = {}
+        # parse the reslut
+        for each_line in return_val.splitlines():
+            if len(each_line) > 0:
+                chunks = each_line.strip().split(':', 1)
+                key = chunks[0]
+                value = []
+                if len(chunks) > 1:
+                    value = chunks[1].split()
+                if '(attached)' in value:
+                    value.remove('(attached)')
+                master_state[key] = value
+
+        return master_state
+
+    # -------------------------------------------------------------------------------
+    #                        Used Slave State
+    # -------------------------------------------------------------------------------
+    def RequestSlaveState(self, command):
+        """
+        Set slave state to the specified one using "ethercat states -p %d %s" command.
+        Command example : "ethercat states -p 0 PREOP" (target slave position and target state are given.)
+        @param command : target slave state
+        """
+        _error, _return_val = self.Controler.RemoteExec(
+            SLAVE_STATE % (self.Controler.GetSlavePos(), command),
+            return_val=None)
+
+    def GetSlaveStateFromSlave(self):
+        """
+        Get slave information using "ethercat slaves" command and store the information into internal data structure
+        (self.SlaveState) for "Slave State"
+        return_val example : 0  0:0  PREOP  +  EL9800 (V4.30) (PIC24, SPI, ET1100)
+        """
+        _error, return_val = self.Controler.RemoteExec(GET_SLAVE, return_val=None)
+        self.SlaveState = return_val
+        return return_val
+
+    # -------------------------------------------------------------------------------
+    #                        Used SDO Management
+    # -------------------------------------------------------------------------------
+    def GetSlaveSDOFromSlave(self):
+        """
+        Get SDO objects information of current slave using "ethercat sdos -p %d" command.
+        Command example : "ethercat sdos -p 0"
+        @return return_val : execution results of "ethercat sdos" command (need to be parsed later)
+        """
+        _error, return_val = self.Controler.RemoteExec(SLAVE_SDO % (self.Controler.GetSlavePos()), return_val=None)
+        return return_val
+
+    def SDODownload(self, data_type, idx, sub_idx, value):
+        """
+        Set an SDO object value to user-specified value using "ethercat download" command.
+        Command example : "ethercat download --type int32 -p 0 0x8020 0x12 0x00000000"
+        @param data_type : data type of SDO entry
+        @param idx : index of the SDO entry
+        @param sub_idx : subindex of the SDO entry
+        @param value : value of SDO entry
+        """
+        _error, _return_val = self.Controler.RemoteExec(
+            SDO_DOWNLOAD % (data_type, self.Controler.GetSlavePos(), idx, sub_idx, value),
+            return_val=None)
+
+    def BackupSDODataSet(self):
+        """
+        Back-up current SDO entry information to restore the SDO data
+        in case that the user cancels SDO update operation.
+        """
+        self.BackupDatatypeDescription = self.SaveDatatypeDescription
+        self.BackupCommunicationObject = self.SaveCommunicationObject
+        self.BackupManufacturerSpecific = self.SaveManufacturerSpecific
+        self.BackupProfileSpecific = self.SaveProfileSpecific
+        self.BackupReserved = self.SaveReserved
+        self.BackupAllSDOData = self.SaveAllSDOData
+
+    def ClearSDODataSet(self):
+        """
+        Clear the specified SDO entry information.
+        """
+        for dummy in range(6):
+            self.SaveSDOData.append([])
+
+    # -------------------------------------------------------------------------------
+    #                        Used PDO Monitoring
+    # -------------------------------------------------------------------------------
+    def RequestPDOInfo(self):
+        """
+        Load slave information from RootClass (XML data) and parse the information (calling SlavePDOData() method).
+        """
+        # Load slave information from ESI XML file (def EthercatMaster.py)
+        slave = self.Controler.CTNParent.GetSlave(self.Controler.GetSlavePos())
+
+        type_infos = slave.getType()
+        device, _alignment = self.Controler.CTNParent.GetModuleInfos(type_infos)
+        # Initialize PDO data set
+        self.ClearDataSet()
+
+        # if 'device' object is valid, call SavePDOData() to parse PDO data
+        if device is not None:
+            self.SavePDOData(device)
+
+    def SavePDOData(self, device):
+        """
+        Parse PDO data and store the results in TXPDOCategory and RXPDOCategory
+        Tx(Rx)PDOCategory : index, name, entry number
+        Tx(Rx)Info : entry index, sub index, name, length, type
+        @param device : Slave information extracted from ESI XML file
+        """
+        # Parsing TXPDO entries
+        for pdo, _pdo_info in ([(pdo, "Inputs") for pdo in device.getTxPdo()]):
+            # Save pdo_index, entry, and name of each entry
+            pdo_index = ExtractHexDecValue(pdo.getIndex().getcontent())
+            entries = pdo.getEntry()
+            pdo_name = ExtractName(pdo.getName())
+
+            # Initialize entry number count
+            count = 0
+
+            # Parse entries
+            for entry in entries:
+                # Save index and subindex
+                index = ExtractHexDecValue(entry.getIndex().getcontent())
+                subindex = ExtractHexDecValue(entry.getSubIndex())
+                # if entry name exists, save entry data
+                if ExtractName(entry.getName()) is not None:
+                    entry_infos = {
+                        "entry_index": index,
+                        "subindex": subindex,
+                        "name": ExtractName(entry.getName()),
+                        "bitlen": entry.getBitLen(),
+                        "type": entry.getDataType().getcontent()
+                    }
+                    self.TxPDOInfo.append(entry_infos)
+                    count += 1
+
+            categorys = {"pdo_index": pdo_index, "name": pdo_name, "number_of_entry": count}
+            self.TxPDOCategory.append(categorys)
+
+        # Parsing RxPDO entries
+        for pdo, _pdo_info in ([(rxpdo, "Outputs") for rxpdo in device.getRxPdo()]):
+            # Save pdo_index, entry, and name of each entry
+            pdo_index = ExtractHexDecValue(pdo.getIndex().getcontent())
+            entries = pdo.getEntry()
+            pdo_name = ExtractName(pdo.getName())
+
+            # Initialize entry number count
+            count = 0
+
+            # Parse entries
+            for entry in entries:
+                # Save index and subindex
+                index = ExtractHexDecValue(entry.getIndex().getcontent())
+                subindex = ExtractHexDecValue(entry.getSubIndex())
+                # if entry name exists, save entry data
+                if ExtractName(entry.getName()) is not None:
+                    entry_infos = {
+                        "entry_index": index,
+                        "subindex": subindex,
+                        "name": ExtractName(entry.getName()),
+                        "bitlen": str(entry.getBitLen()),
+                        "type": entry.getDataType().getcontent()
+                    }
+                    self.RxPDOInfo.append(entry_infos)
+                    count += 1
+
+            categorys = {"pdo_index": pdo_index, "name": pdo_name, "number_of_entry": count}
+            self.RxPDOCategory.append(categorys)
+
+    def GetTxPDOCategory(self):
+        """
+        Get TxPDOCategory data structure (Meta informaton of TxPDO).
+        TxPDOCategorys : index, name, number of entries
+        @return TxPDOCategorys
+        """
+        return self.TxPDOCategory
+
+    def GetRxPDOCategory(self):
+        """
+        Get RxPDOCategory data structure (Meta information of RxPDO).
+        RxPDOCategorys : index, name, number of entries
+        @return RxPDOCategorys
+        """
+        return self.RxPDOCategory
+
+    def GetTxPDOInfo(self):
+        """
+        Get TxPDOInfo data structure (Detailed information on TxPDO entries).
+        TxPDOInfos : entry index, sub index, name, length, type
+        @return TxPDOInfos
+        """
+        return self.TxPDOInfo
+
+    def GetRxPDOInfo(self):
+        """
+        Get RxPDOInfo data structure (Detailed information on RxPDO entries).
+        RxPDOInfos : entry index, sub index, name, length, type
+        @return RxPDOInfos
+        """
+        return self.RxPDOInfo
+
+    def ClearDataSet(self):
+        """
+        Initialize PDO management data structure.
+        """
+        self.TxPDOInfos = []
+        self.TxPDOCategorys = []
+        self.RxPDOInfos = []
+        self.RxPDOCategorys = []
+
+    # -------------------------------------------------------------------------------
+    #                        Used EEPROM Management
+    # -------------------------------------------------------------------------------
+    # Base data types in ETG2000; format = {"Name": "BitSize"}
+    BaseDataTypeDict = {"BOOL": "01",
+                        "SINT": "02",
+                        "INT": "03",
+                        "DINT": "04",
+                        "USINT": "05",
+                        "UINT": "06",
+                        "UDINT": "07",
+                        "REAL": "08",
+                        "INT24": "10",
+                        "LREAL": "11",
+                        "INT40": "12",
+                        "INT48": "13",
+                        "INT56": "14",
+                        "LINT": "15",
+                        "UINT24": "16",
+                        "UINT40": "18",
+                        "UINT48": "19",
+                        "UINT56": "1a",
+                        "ULINT": "1b",
+                        "BITARR8": "2d",
+                        "BITARR16": "2e",
+                        "BITARR32": "2f",
+                        "BIT1": "30",
+                        "BIT2": "31",
+                        "BIT3": "32",
+                        "BIT4": "33",
+                        "BIT5": "34",
+                        "BIT6": "35",
+                        "BIT7": "36",
+                        "BIT8": "37"}
+
+    def GetSmartViewInfos(self):
+        """
+        Parse XML data for "Smart View" of EEPROM contents.
+        @return smartview_infos : EEPROM contents dictionary
+        """
+
+        smartview_infos = {"eeprom_size": 128,
+                           "pdi_type": 0,
+                           "device_emulation": "False",
+                           "vendor_id": '0x00000000',
+                           "product_code": '0x00000000',
+                           "revision_no": '0x00000000',
+                           "serial_no": '0x00000000',
+                           "supported_mailbox": "",
+                           "mailbox_bootstrapconf_outstart": '0',
+                           "mailbox_bootstrapconf_outlength": '0',
+                           "mailbox_bootstrapconf_instart": '0',
+                           "mailbox_bootstrapconf_inlength": '0',
+                           "mailbox_standardconf_outstart": '0',
+                           "mailbox_standardconf_outlength": '0',
+                           "mailbox_standardconf_instart": '0',
+                           "mailbox_standardconf_inlength": '0'}
+
+        slave = self.Controler.CTNParent.GetSlave(self.Controler.GetSlavePos())
+        type_infos = slave.getType()
+        device, _alignment = self.Controler.CTNParent.GetModuleInfos(type_infos)
+
+        # 'device' represents current slave device selected by user
+        if device is not None:
+            for eeprom_element in device.getEeprom().getcontent():
+                # get EEPROM size; <Device>-<Eeprom>-<ByteSize>
+                if eeprom_element["name"] == "ByteSize":
+                    smartview_infos["eeprom_size"] = eeprom_element
+
+                elif eeprom_element["name"] == "ConfigData":
+                    configData_data = self.DecimalToHex(eeprom_element)
+                    # get PDI type; <Device>-<Eeprom>-<ConfigData> address 0x00
+                    smartview_infos["pdi_type"] = int(configData_data[0:2], 16)
+                    # get state of device emulation; <Device>-<Eeprom>-<ConfigData> address 0x01
+                    if "{:0>8b}".format(int(configData_data[2:4], 16))[7] == '1':
+                        smartview_infos["device_emulation"] = "True"
+
+                elif eeprom_element["name"] == "BootStrap":
+                    bootstrap_data = "{:0>16x}".format(eeprom_element)
+                    # get bootstrap configuration; <Device>-<Eeprom>-<BootStrap>
+                    for cfg, iter in [("mailbox_bootstrapconf_outstart", 0),
+                                      ("mailbox_bootstrapconf_outlength", 1),
+                                      ("mailbox_bootstrapconf_instart", 2),
+                                      ("mailbox_bootstrapconf_inlength", 3)]:
+                        smartview_infos[cfg] = str(int(bootstrap_data[4*iter+2:4*(iter+1)]+bootstrap_data[4*iter:4*iter+2], 16))
+
+            # get protocol (profile) types supported by mailbox; <Device>-<Mailbox>
+            mb = device.getMailbox()
+            if mb is not None:
+                for mailbox_protocol in mailbox_protocols:
+                    if getattr(mb, "get%s" % mailbox_protocol)() is not None:
+                        smartview_infos["supported_mailbox"] += "%s,  " % mailbox_protocol
+            smartview_infos["supported_mailbox"] = smartview_infos["supported_mailbox"].strip(", ")
+
+            # get standard configuration of mailbox; <Device>-<Sm>
+            for sm_element in device.getSm():
+                if sm_element.getcontent() == "MBoxOut":
+                    smartview_infos["mailbox_standardconf_outstart"] = str(ExtractHexDecValue(sm_element.getStartAddress()))
+                    smartview_infos["mailbox_standardconf_outlength"] = str(ExtractHexDecValue(sm_element.getDefaultSize()))
+                elif sm_element.getcontent() == "MBoxIn":
+                    smartview_infos["mailbox_standardconf_instart"] = str(ExtractHexDecValue(sm_element.getStartAddress()))
+                    smartview_infos["mailbox_standardconf_inlength"] = str(ExtractHexDecValue(sm_element.getDefaultSize()))
+                else:
+                    pass
+
+            # get device identity from <Device>-<Type>
+            #  vendor ID; by default, pre-defined value in self.ModulesLibrary
+            #             if device type in 'vendor' item equals to actual slave device type, set 'vendor_id' to vendor ID.
+            for vendor_id, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
+                for available_device in vendor["groups"][vendor["groups"].keys()[0]]["devices"]:
+                    if available_device[0] == type_infos["device_type"]:
+                        smartview_infos["vendor_id"] = "0x" + "{:0>8x}".format(vendor_id)
+
+            #  product code;
+            if device.getType().getProductCode() is not None:
+                product_code = device.getType().getProductCode()
+                smartview_infos["product_code"] = "0x"+"{:0>8x}".format(ExtractHexDecValue(product_code))
+
+            #  revision number;
+            if device.getType().getRevisionNo() is not None:
+                revision_no = device.getType().getRevisionNo()
+                smartview_infos["revision_no"] = "0x"+"{:0>8x}".format(ExtractHexDecValue(revision_no))
+
+            #  serial number;
+            if device.getType().getSerialNo() is not None:
+                serial_no = device.getType().getSerialNo()
+                smartview_infos["serial_no"] = "0x"+"{:0>8x}".format(ExtractHexDecValue(serial_no))
+
+            return smartview_infos
+
+        else:
+            return None
+
+    def DecimalToHex(self, decnum):
+        """
+        Convert decimal value into hexadecimal representation.
+        @param decnum : decimal value
+        @return hex_data : hexadecimal representation of input value in decimal
+        """
+        value = "%x" % decnum
+        value_len = len(value)
+        if (value_len % 2) == 0:
+            hex_len = value_len
+        else:
+            hex_len = (value_len // 2) * 2 + 2
+
+        hex_data = ("{:0>"+str(hex_len)+"x}").format(decnum)
+
+        return hex_data
+
+    def SiiRead(self):
+        """
+        Get slave EEPROM contents maintained by master device using "ethercat sii_read -p %d" command.
+        Command example : "ethercat sii_read -p 0"
+        @return return_val : result of "ethercat sii_read" (binary data)
+        """
+        _error, return_val = self.Controler.RemoteExec(SII_READ % (self.Controler.GetSlavePos()), return_val=None)
+        self.SiiData = return_val
+        return return_val
+
+    def SiiWrite(self, binary):
+        """
+        Overwrite slave EEPROM contents using "ethercat sii_write -p %d" command.
+        Command example : "ethercat sii_write -p 0 - (binary contents)"
+        @param binary : EEPROM contents in binary data format
+        @return return_val : result of "ethercat sii_write" (If it succeeds, the return value is NULL.)
+        """
+        _error, return_val = self.Controler.RemoteExec(
+            SII_WRITE % (self.Controler.GetSlavePos()),
+            return_val=None,
+            sii_data=binary)
+        return return_val
+
+    def LoadData(self):
+        """
+        Loading data from EEPROM use Sii_Read Method
+        @return self.BinaryCode : slave EEPROM data in binary format (zero-padded)
+        """
+        return_val = self.Controler.CommonMethod.SiiRead()
+        self.BinaryCode = return_val
+        self.Controler.SiiData = self.BinaryCode
+
+        # append zero-filled padding data up to EEPROM size
+        for dummy in range(self.SmartViewInfosFromXML["eeprom_size"] - len(self.BinaryCode)):
+            self.BinaryCode = self.BinaryCode + self.HexDecode('ff')[0]
+
+        return self.BinaryCode
+
+    def HexRead(self, binary):
+        """
+        Convert binary digit representation into hexadecimal representation for "Hex View" menu.
+        @param binary : binary digits
+        @return hexCode : hexadecimal digits
+        @return hexview_table_row, hexview_table_col : Grid size for "Hex View" UI
+        """
+        row_code = []
+        row_text = ""
+        row = 0
+        hex_code = []
+
+        hexview_table_col = 17
+
+        for index in range(0, len(binary)):
+            if len(binary[index]) != 1:
+                break
+            else:
+                digithexstr = hex(ord(binary[index]))
+
+                tempvar2 = digithexstr[2:4]
+                if len(tempvar2) == 1:
+                    tempvar2 = "0" + tempvar2
+                row_code.append(tempvar2)
+
+                if int(digithexstr, 16) >= 32 and int(digithexstr, 16) <= 126:
+                    row_text = row_text + chr(int(digithexstr, 16))
+                else:
+                    row_text = row_text + "."
+
+                if index != 0:
+                    if len(row_code) == (hexview_table_col - 1):
+                        row_code.append(row_text)
+                        hex_code.append(row_code)
+                        row_text = ""
+                        row_code = []
+                        row = row + 1
+
+        hexview_table_row = row
+
+        return hex_code, hexview_table_row, hexview_table_col
+
+    def GenerateEEPROMList(self, data, direction, length):
+        """
+        Generate EEPROM data list by reconstructing 'data' string.
+        example : data="12345678", direction=0, length=8 -> eeprom_list=['12', '34', '56', '78']
+                  data="12345678", direction=1, length=8 -> eeprom_list=['78', '56', '34', '12']
+        @param data : string to be reconstructed
+        @param direction : endianness
+        @param length : data length
+        @return eeprom_list : reconstructed list data structure
+        """
+        eeprom_list = []
+
+        if direction is 0 or 1:
+            for dummy in range(length//2):
+                if data == "":
+                    eeprom_list.append("00")
+                else:
+                    eeprom_list.append(data[direction*(length-2):direction*(length-2)+2])
+                data = data[(1-direction)*2:length-direction*2]
+                length -= 2
+        return eeprom_list
+
+    def XmlToEeprom(self):
+        """
+        Extract slave EEPROM contents using slave ESI XML file.
+          - Mandatory parts
+          - String category : ExtractEEPROMStringCategory()
+          - General category : ExtractEEPROMGeneralCategory()
+          - FMMU category : ExtractEEPROMFMMUCategory
+          - SyncM category : ExtractEEPROMSyncMCategory()
+          - Tx/RxPDO category : ExtractEEPROMPDOCategory()
+          - DC category : ExtractEEPROMDCCategory()
+        @return eeprom_binary
+        """
+        eeprom = []
+        data = ""
+        eeprom_size = 0
+        eeprom_binary = ""
+
+        # 'device' is the slave device of the current EtherCAT slave plugin
+        slave = self.Controler.CTNParent.GetSlave(self.Controler.GetSlavePos())
+        type_infos = slave.getType()
+        device, _alignment = self.Controler.CTNParent.GetModuleInfos(type_infos)
+
+        if device is not None:
+            # get ConfigData for EEPROM offset 0x0000-0x000d; <Device>-<Eeprom>-<ConfigData>
+            for eeprom_element in device.getEeprom().getcontent():
+                if eeprom_element["name"] == "ConfigData":
+                    data = self.DecimalToHex(eeprom_element)
+            eeprom += self.GenerateEEPROMList(data, 0, 28)
+
+            # calculate CRC for EEPROM offset 0x000e-0x000f
+            crc = 0x48
+            for segment in eeprom:
+                for i in range(8):
+                    bit = crc & 0x80
+                    crc = (crc << 1) | ((int(segment, 16) >> (7 - i)) & 0x01)
+                    if bit:
+                        crc ^= 0x07
+            for dummy in range(8):
+                bit = crc & 0x80
+                crc <<= 1
+                if bit:
+                    crc ^= 0x07
+            eeprom.append(hex(crc)[len(hex(crc))-3:len(hex(crc))-1])
+            eeprom.append("00")
+
+            # get VendorID for EEPROM offset 0x0010-0x0013;
+            data = ""
+            for vendor_id, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
+                for available_device in vendor["groups"][vendor["groups"].keys()[0]]["devices"]:
+                    if available_device[0] == type_infos["device_type"]:
+                        data = "{:0>8x}".format(vendor_id)
+            eeprom += self.GenerateEEPROMList(data, 1, 8)
+
+            # get Product Code for EEPROM offset 0x0014-0x0017;
+            data = ""
+            if device.getType().getProductCode() is not None:
+                data = "{:0>8x}".format(ExtractHexDecValue(device.getType().getProductCode()))
+            eeprom += self.GenerateEEPROMList(data, 1, 8)
+
+            # get Revision Number for EEPROM offset 0x0018-0x001b;
+            data = ""
+            if device.getType().getRevisionNo() is not None:
+                data = "{:0>8x}".format(ExtractHexDecValue(device.getType().getRevisionNo()))
+            eeprom += self.GenerateEEPROMList(data, 1, 8)
+
+            # get Serial Number for EEPROM 0x001c-0x001f;
+            data = ""
+            if device.getType().getSerialNo() is not None:
+                data = "{:0>8x}".format(ExtractHexDecValue(device.getType().getSerialNo()))
+            eeprom += self.GenerateEEPROMList(data, 1, 8)
+
+            # get Execution Delay for EEPROM 0x0020-0x0021; not analyzed yet
+            eeprom.append("00")
+            eeprom.append("00")
+
+            # get Port0/1 Delay for EEPROM offset 0x0022-0x0025; not analyzed yet
+            eeprom.append("00")
+            eeprom.append("00")
+            eeprom.append("00")
+            eeprom.append("00")
+
+            # reserved for EEPROM offset 0x0026-0x0027;
+            eeprom.append("00")
+            eeprom.append("00")
+
+            # get BootStrap for EEPROM offset 0x0028-0x002e; <Device>-<Eeprom>-<BootStrap>
+            data = ""
+            for eeprom_element in device.getEeprom().getcontent():
+                if eeprom_element["name"] == "BootStrap":
+                    data = "{:0>16x}".format(eeprom_element)
+            eeprom += self.GenerateEEPROMList(data, 0, 16)
+
+            # get Standard Mailbox for EEPROM offset 0x0030-0x0037; <Device>-<sm>
+            data = ""
+            standard_send_mailbox_offset = None
+            standard_send_mailbox_size = None
+            standard_receive_mailbox_offset = None
+            standard_receive_mailbox_size = None
+            for sm_element in device.getSm():
+                if sm_element.getcontent() == "MBoxOut":
+                    standard_receive_mailbox_offset = "{:0>4x}".format(ExtractHexDecValue(sm_element.getStartAddress()))
+                    standard_receive_mailbox_size = "{:0>4x}".format(ExtractHexDecValue(sm_element.getDefaultSize()))
+                elif sm_element.getcontent() == "MBoxIn":
+                    standard_send_mailbox_offset = "{:0>4x}".format(ExtractHexDecValue(sm_element.getStartAddress()))
+                    standard_send_mailbox_size = "{:0>4x}".format(ExtractHexDecValue(sm_element.getDefaultSize()))
+
+            if standard_receive_mailbox_offset is None:
+                eeprom.append("00")
+                eeprom.append("00")
+            else:
+                eeprom.append(standard_receive_mailbox_offset[2:4])
+                eeprom.append(standard_receive_mailbox_offset[0:2])
+            if standard_receive_mailbox_size is None:
+                eeprom.append("00")
+                eeprom.append("00")
+            else:
+                eeprom.append(standard_receive_mailbox_size[2:4])
+                eeprom.append(standard_receive_mailbox_size[0:2])
+            if standard_send_mailbox_offset is None:
+                eeprom.append("00")
+                eeprom.append("00")
+            else:
+                eeprom.append(standard_send_mailbox_offset[2:4])
+                eeprom.append(standard_send_mailbox_offset[0:2])
+            if standard_send_mailbox_size is None:
+                eeprom.append("00")
+                eeprom.append("00")
+            else:
+                eeprom.append(standard_send_mailbox_size[2:4])
+                eeprom.append(standard_send_mailbox_size[0:2])
+
+            # get supported mailbox protocols for EEPROM offset 0x0038-0x0039;
+            data = 0
+            mb = device.getMailbox()
+            if mb is not None:
+                for bit, mbprot in enumerate(mailbox_protocols):
+                    if getattr(mb, "get%s" % mbprot)() is not None:
+                        data += 1 << bit
+            data = "{:0>4x}".format(data)
+            eeprom.append(data[2:4])
+            eeprom.append(data[0:2])
+
+            # resereved for EEPROM offset 0x003a-0x007b;
+            for i in range(0x007b-0x003a+0x0001):
+                eeprom.append("00")
+
+            # get EEPROM size for EEPROM offset 0x007c-0x007d;
+            data = ""
+            for eeprom_element in device.getEeprom().getcontent():
+                if eeprom_element["name"] == "ByteSize":
+                    eeprom_size = int(str(eeprom_element))
+                    data = "{:0>4x}".format(int(eeprom_element)//1024*8-1)
+
+            if data == "":
+                eeprom.append("00")
+                eeprom.append("00")
+            else:
+                eeprom.append(data[2:4])
+                eeprom.append(data[0:2])
+
+            # Version for EEPROM 0x007e-0x007f;
+            #  According to "EtherCAT Slave Device Description(V0.3.0)"
+            eeprom.append("01")
+            eeprom.append("00")
+
+            # append String Category data
+            for data in self.ExtractEEPROMStringCategory(device):
+                eeprom.append(data)
+
+            # append General Category data
+            for data in self.ExtractEEPROMGeneralCategory(device):
+                eeprom.append(data)
+
+            # append FMMU Category data
+            for data in self.ExtractEEPROMFMMUCategory(device):
+                eeprom.append(data)
+
+            # append SyncM Category data
+            for data in self.ExtractEEPROMSyncMCategory(device):
+                eeprom.append(data)
+
+            # append TxPDO Category data
+            for data in self.ExtractEEPROMPDOCategory(device, "TxPdo"):
+                eeprom.append(data)
+
+            # append RxPDO Category data
+            for data in self.ExtractEEPROMPDOCategory(device, "RxPdo"):
+                eeprom.append(data)
+
+            # append DC Category data
+            for data in self.ExtractEEPROMDCCategory(device):
+                eeprom.append(data)
+
+            # append padding
+            padding = eeprom_size-len(eeprom)
+            for i in range(padding):
+                eeprom.append("ff")
+
+            # convert binary code
+            for index in range(eeprom_size):
+                eeprom_binary = eeprom_binary + self.HexDecode(eeprom[index])[0]
+
+            return eeprom_binary
+
+    def ExtractEEPROMStringCategory(self, device):
+        """
+        Extract "Strings" category data from slave ESI XML and generate EEPROM image data.
+        @param device : 'device' object in the slave ESI XML
+        @return eeprom : "Strings" category EEPROM image data
+        """
+        eeprom = []
+        self.Strings = []
+        data = ""
+        count = 0        # string counter
+        padflag = False  # padding flag if category length is odd
+
+        # index information for General Category in EEPROM
+        self.GroupIdx = 0
+        self.ImgIdx = 0
+        self.OrderIdx = 0
+        self.NameIdx = 0
+
+        # flag for preventing duplicated vendor specific data
+        typeflag = False
+        grouptypeflag = False
+        groupnameflag = False
+        devnameflag = False
+        imageflag = False
+
+        # vendor specific data
+        #   element1; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Type>
+        #   vendor_specific_data : vendor specific data (binary type)
+        vendor_specific_data = ""
+        #   vendor_spec_strings : list of vendor specific "strings" for preventing duplicated strings
+        vendor_spec_strings = []
+        for element in device.getType().getcontent():
+            data += element
+        if data != "" and isinstance(data, text):
+            for vendor_spec_string in vendor_spec_strings:
+                if data == vendor_spec_string:
+                    self.OrderIdx = vendor_spec_strings.index(data)+1
+                    typeflag = True
+                    break
+            if typeflag is False:
+                count += 1
+                self.Strings.append(data)
+                vendor_spec_strings.append(data)
+                typeflag = True
+                self.OrderIdx = count
+                vendor_specific_data += "{:0>2x}".format(len(data))
+                for character in range(len(data)):
+                    vendor_specific_data += "{:0>2x}".format(ord(data[character]))
+        data = ""
+
+        #  element2-1; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<GroupType>
+        data = device.getGroupType()
+        if data is not None and isinstance(data, text):
+            for vendor_spec_string in vendor_spec_strings:
+                if data == vendor_spec_string:
+                    self.GroupIdx = vendor_spec_strings.index(data)+1
+                    grouptypeflag = True
+                    break
+            if grouptypeflag is False:
+                count += 1
+                self.Strings.append(data)
+                vendor_spec_strings.append(data)
+                grouptypeflag = True
+                self.GroupIdx = count
+                vendor_specific_data += "{:0>2x}".format(len(data))
+                for character in range(len(data)):
+                    vendor_specific_data += "{:0>2x}".format(ord(data[character]))
+
+        #  element2-2; <EtherCATInfo>-<Groups>-<Group>-<Type>
+        if grouptypeflag is False:
+            if self.Controler.CTNParent.CTNParent.ModulesLibrary.Library is not None:
+                for _vendor_id, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
+                    for group_type, group_etc in vendor["groups"].iteritems():
+                        for device_item in group_etc["devices"]:
+                            if device == device_item[1]:
+                                data = group_type
+                if data is not None and isinstance(data, text):
+                    for vendor_spec_string in vendor_spec_strings:
+                        if data == vendor_spec_string:
+                            self.GroupIdx = vendor_spec_strings.index(data)+1
+                            grouptypeflag = True
+                            break
+                    if grouptypeflag is False:
+                        count += 1
+                        self.Strings.append(data)
+                        vendor_spec_strings.append(data)
+                        grouptypeflag = True
+                        self.GroupIdx = count
+                        vendor_specific_data += "{:0>2x}".format(len(data))
+                        for character in range(len(data)):
+                            vendor_specific_data += "{:0>2x}".format(ord(data[character]))
+        data = ""
+
+        #  element3; <EtherCATInfo>-<Descriptions>-<Groups>-<Group>-<Name(LcId is "1033")>
+        if self.Controler.CTNParent.CTNParent.ModulesLibrary.Library is not None:
+            for _vendorId, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
+                for group_type, group_etc in vendor["groups"].iteritems():
+                    for device_item in group_etc["devices"]:
+                        if device == device_item[1]:
+                            data = group_etc["name"]
+        if data != "" and isinstance(data, text):
+            for vendor_spec_string in vendor_spec_strings:
+                if data == vendor_spec_string:
+                    groupnameflag = True
+                    break
+            if groupnameflag is False:
+                count += 1
+                self.Strings.append(data)
+                vendor_spec_strings.append(data)
+                groupnameflag = True
+                vendor_specific_data += "{:0>2x}".format(len(data))
+                for character in range(len(data)):
+                    vendor_specific_data += "{:0>2x}".format(ord(data[character]))
+        data = ""
+
+        #  element4; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Name(LcId is "1033" or "1"?)>
+        for element in device.getName():
+            if element.getLcId() == 1 or element.getLcId() == 1033:
+                data = element.getcontent()
+        if data != "" and isinstance(data, text):
+            for vendor_spec_string in vendor_spec_strings:
+                if data == vendor_spec_string:
+                    self.NameIdx = vendor_spec_strings.index(data)+1
+                    devnameflag = True
+                    break
+            if devnameflag is False:
+                count += 1
+                self.Strings.append(data)
+                vendor_spec_strings.append(data)
+                devnameflag = True
+                self.NameIdx = count
+                vendor_specific_data += "{:0>2x}".format(len(data))
+                for character in range(len(data)):
+                    vendor_specific_data += "{:0>2x}".format(ord(data[character]))
+        data = ""
+
+        #  element5-1; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Image16x14>
+        if device.getcontent() is not None:
+            data = device.getcontent()
+            if data is not None and isinstance(data, text):
+                for vendor_spec_string in vendor_spec_strings:
+                    if data == vendor_spec_string:
+                        self.ImgIdx = vendor_spec_strings.index(data)+1
+                        imageflag = True
+                        break
+                if imageflag is False:
+                    count += 1
+                    self.Strings.append(data)
+                    vendor_spec_strings.append(data)
+                    imageflag = True
+                    self.ImgIdx = count
+                    vendor_specific_data += "{:0>2x}".format(len(data))
+                    for character in range(len(data)):
+                        vendor_specific_data += "{:0>2x}".format(ord(data[character]))
+
+        #  element5-2; <EtherCATInfo>-<Descriptions>-<Groups>-<Group>-<Image16x14>
+        if imageflag is False:
+            if self.Controler.CTNParent.CTNParent.ModulesLibrary.Library is not None:
+                for _vendor_id, vendor in self.Controler.CTNParent.CTNParent.ModulesLibrary.Library.iteritems():
+                    for group_type, group_etc in vendor["groups"].iteritems():
+                        for device_item in group_etc["devices"]:
+                            if device == device_item[1]:
+                                data = group_etc
+                if data is not None and isinstance(data, text):
+                    for vendor_spec_string in vendor_spec_strings:
+                        if data == vendor_spec_string:
+                            self.ImgIdx = vendor_spec_strings.index(data)+1
+                            imageflag = True
+                            break
+                    if imageflag is False:
+                        count += 1
+                        self.Strings.append(data)
+                        vendor_spec_strings.append(data)
+                        imageflag = True
+                        self.ImgIdx = count
+                        vendor_specific_data += "{:0>2x}".format(len(data))
+                        for character in range(len(data)):
+                            vendor_specific_data += "{:0>2x}".format(ord(data[character]))
+        data = ""
+
+        # DC related elements
+        #  <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Dc>-<OpMode>-<Name>
+        dc_related_elements = ""
+        if device.getDc() is not None:
+            for element in device.getDc().getOpMode():
+                data = element.getName()
+                if data != "":
+                    count += 1
+                    self.Strings.append(data)
+                    dc_related_elements += "{:0>2x}".format(len(data))
+                    for character in range(len(data)):
+                        dc_related_elements += "{:0>2x}".format(ord(data[character]))
+                    data = ""
+
+        # Input elements(TxPDO)
+        #  <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<TxPdo>; Name
+        input_elements = ""
+        inputs = []
+        for element in device.getTxPdo():
+            for name in element.getName():
+                data = name.getcontent()
+            for input in inputs:
+                if data == input:
+                    data = ""
+            if data != "":
+                count += 1
+                self.Strings.append(data)
+                inputs.append(data)
+                input_elements += "{:0>2x}".format(len(data))
+                for character in range(len(data)):
+                    input_elements += "{:0>2x}".format(ord(data[character]))
+                data = ""
+            for entry in element.getEntry():
+                for name in entry.getName():
+                    data = name.getcontent()
+                for input in inputs:
+                    if data == input:
+                        data = ""
+                if data != "":
+                    count += 1
+                    self.Strings.append(data)
+                    inputs.append(data)
+                    input_elements += "{:0>2x}".format(len(data))
+                    for character in range(len(data)):
+                        input_elements += "{:0>2x}".format(ord(data[character]))
+                    data = ""
+
+        # Output elements(RxPDO)
+        #  <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<RxPdo>; Name
+        output_elements = ""
+        outputs = []
+        for element in device.getRxPdo():
+            for name in element.getName():
+                data = name.getcontent()
+            for output in outputs:
+                if data == output:
+                    data = ""
+            if data != "":
+                count += 1
+                self.Strings.append(data)
+                outputs.append(data)
+                output_elements += "{:0>2x}".format(len(data))
+                for character in range(len(data)):
+                    output_elements += "{:0>2x}".format(ord(data[character]))
+                data = ""
+            for entry in element.getEntry():
+                for name in entry.getName():
+                    data = name.getcontent()
+                for output in outputs:
+                    if data == output:
+                        data = ""
+                if data != "":
+                    count += 1
+                    self.Strings.append(data)
+                    outputs.append(data)
+                    output_elements += "{:0>2x}".format(len(data))
+                    for character in range(len(data)):
+                        output_elements += "{:0>2x}".format(ord(data[character]))
+                    data = ""
+
+        # form eeprom data
+        #  category header
+        eeprom.append("0a")
+        eeprom.append("00")
+        #  category length (word); 1 word is 4 bytes. "+2" is the length of string's total number
+        length = len(vendor_specific_data + dc_related_elements + input_elements + output_elements) + 2
+        if length % 4 == 0:
+            pass
+        else:
+            length += length % 4
+            padflag = True
+        eeprom.append("{:0>4x}".format(length//4)[2:4])
+        eeprom.append("{:0>4x}".format(length//4)[0:2])
+        #  total numbers of strings
+        eeprom.append("{:0>2x}".format(count))
+        for element in [vendor_specific_data,
+                        dc_related_elements,
+                        input_elements,
+                        output_elements]:
+            for dummy in range(len(element)//2):
+                if element == "":
+                    eeprom.append("00")
+                else:
+                    eeprom.append(element[0:2])
+                element = element[2:len(element)]
+        # padding if length is odd bytes
+        if padflag is True:
+            eeprom.append("ff")
+
+        return eeprom
+
+    def ExtractEEPROMGeneralCategory(self, device):
+        """
+        Extract "General" category data from slave ESI XML and generate EEPROM image data.
+        @param device : 'device' object in the slave ESI XML
+        @return eeprom : "Strings" category EEPROM image data
+        """
+        eeprom = []
+
+        # category header
+        eeprom.append("1e")
+        eeprom.append("00")
+
+        # category length
+        eeprom.append("10")
+        eeprom.append("00")
+
+        # word 1 : Group Type index and Image index in STRINGS Category
+        eeprom.append("{:0>2x}".format(self.GroupIdx))
+        eeprom.append("{:0>2x}".format(self.ImgIdx))
+
+        # word 2 : Device Type index and Device Name index in STRINGS Category
+        eeprom.append("{:0>2x}".format(self.OrderIdx))
+        eeprom.append("{:0>2x}".format(self.NameIdx))
+
+        # word 3 : Physical Layer Port info. and CoE Details
+        eeprom.append("01")  # Physical Layer Port info - assume 01
+        #  CoE Details; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Mailbox>-<CoE>
+        coe_details = 0
+        mb = device.getMailbox()
+        coe_details = 1  # sdo enabled
+        if mb is not None:
+            coe = mb.getCoE()
+            if coe is not None:
+                for bit, flag in enumerate(["SdoInfo", "PdoAssign", "PdoConfig",
+                                            "PdoUpload", "CompleteAccess"]):
+                    if getattr(coe, "get%s" % flag)() is not None:
+                        coe_details += 1 << bit
+        eeprom.append("{:0>2x}".format(coe_details))
+
+        # word 4 : FoE Details and EoE Details
+        #  FoE Details; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Mailbox>-<FoE>
+        if mb is not None and mb.getFoE() is not None:
+            eeprom.append("01")
+        else:
+            eeprom.append("00")
+        #  EoE Details; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Mailbox>-<EoE>
+        if mb is not None and mb.getEoE() is not None:
+            eeprom.append("01")
+        else:
+            eeprom.append("00")
+
+        # word 5 : SoE Channels(reserved) and DS402 Channels
+        #  SoE Details; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Mailbox>-<SoE>
+        if mb is not None and mb.getSoE() is not None:
+            eeprom.append("01")
+        else:
+            eeprom.append("00")
+        #  DS402Channels; <EtherCATInfo>-<Descriptions>-<Devices>-<Device>-<Mailbox>-<CoE>: DS402Channels
+        ds402ch = False
+        if mb is not None:
+            coe = mb.getCoE()
+            if coe is not None:
+                ds402ch = coe.getDS402Channels()
+        eeprom.append("01" if ds402ch in [True, 1] else "00")
+
+        # word 6 : SysmanClass(reserved) and Flags
+        eeprom.append("00")  # reserved
+        #  Flags
+        en_safeop = False
+        en_lrw = False
+        if device.getType().getTcCfgModeSafeOp() is True \
+           or device.getType().getTcCfgModeSafeOp() == 1:
+            en_safeop = True
+        if device.getType().getUseLrdLwr() is True \
+           or device.getType().getUseLrdLwr() == 1:
+            en_lrw = True
+
+        flags = "0b"+"000000"+str(int(en_lrw))+str(int(en_safeop))
+        eeprom.append("{:0>2x}".format(int(flags, 2)))
+
+        # word 7 : Current On EBus (assume 0x0000)
+        eeprom.append("00")
+        eeprom.append("00")
+        # after word 7; couldn't analyze yet
+        eeprom.append("03")
+        eeprom.append("00")
+        eeprom.append("11")
+        eeprom.append("00")
+        eeprom.append("00")
+        eeprom.append("00")
+        eeprom.append("00")
+        eeprom.append("00")
+        eeprom.append("00")
+        eeprom.append("00")
+        eeprom.append("00")
+        eeprom.append("00")
+        eeprom.append("00")
+        eeprom.append("00")
+        eeprom.append("00")
+        eeprom.append("00")
+        eeprom.append("00")
+        eeprom.append("00")
+
+        return eeprom
+
+    def ExtractEEPROMFMMUCategory(self, device):
+        """
+        Extract "FMMU" category data from slave ESI XML and generate EEPROM image data.
+        @param device : 'device' object in the slave ESI XML
+        @return eeprom : "Strings" category EEPROM image data
+        """
+        eeprom = []
+        data = ""
+        count = 0  # number of FMMU
+        padflag = False
+
+        for fmmu in device.getFmmu():
+            count += 1
+            if fmmu.getcontent() == "Outputs":
+                data += "01"
+            if fmmu.getcontent() == "Inputs":
+                data += "02"
+            if fmmu.getcontent() == "MBoxState":
+                data += "03"
+
+        # construct of EEPROM data
+        if data != "":
+            #  category header
+            eeprom.append("28")
+            eeprom.append("00")
+            #  category length
+            if count % 2 == 1:
+                padflag = True
+                eeprom.append("{:0>4x}".format((count+1)//2)[2:4])
+                eeprom.append("{:0>4x}".format((count+1)//2)[0:2])
+            else:
+                eeprom.append("{:0>4x}".format((count)//2)[2:4])
+                eeprom.append("{:0>4x}".format((count)//2)[0:2])
+            for dummy in range(count):
+                if data == "":
+                    eeprom.append("00")
+                else:
+                    eeprom.append(data[0:2])
+                data = data[2:len(data)]
+            #  padding if length is odd bytes
+            if padflag is True:
+                eeprom.append("ff")
+
+        return eeprom
+
+    def ExtractEEPROMSyncMCategory(self, device):
+        """
+        Extract "SyncM" category data from slave ESI XML and generate EEPROM image data.
+        @param device : 'device' object in the slave ESI XML
+        @return eeprom : "Strings" category EEPROM image data
+        """
+        eeprom = []
+        data = ""
+        number = {"MBoxOut": "01", "MBoxIn": "02", "Outputs": "03", "Inputs": "04"}
+
+        for sm in device.getSm():
+            for attr in [sm.getStartAddress(),
+                         sm.getDefaultSize(),
+                         sm.getControlByte()]:
+                if attr is not None:
+                    data += "{:0>4x}".format(ExtractHexDecValue(attr))[2:4]
+                    data += "{:0>4x}".format(ExtractHexDecValue(attr))[0:2]
+                else:
+                    data += "0000"
+            if sm.getEnable() == "1" or sm.getEnable() is True:
+                data += "01"
+            else:
+                data += "00"
+            data += number[sm.getcontent()]
+
+        if data != "":
+            #  category header
+            eeprom.append("29")
+            eeprom.append("00")
+            #  category length
+            eeprom.append("{:0>4x}".format(len(data)//4)[2:4])
+            eeprom.append("{:0>4x}".format(len(data)//4)[0:2])
+            for dummy in range(len(data)//2):
+                if data == "":
+                    eeprom.append("00")
+                else:
+                    eeprom.append(data[0:2])
+                data = data[2:len(data)]
+
+        return eeprom
+
+    def ExtractEEPROMPDOCategory(self, device, pdotype):
+        """
+        Extract ""PDO (Tx, Rx)"" category data from slave ESI XML and generate EEPROM image data.
+        @param device : 'device' object in the slave ESI XML
+        @param pdotype : identifier whether "TxPDO" or "RxPDO".
+        @return eeprom : "Strings" category EEPROM image data
+        """
+        eeprom = []
+        data = ""
+        count = 0
+        en_fixed = False
+        en_mandatory = False
+        en_virtual = False
+
+        for element in eval("device.get%s()" % pdotype):
+            #  PDO Index
+            data += "{:0>4x}".format(ExtractHexDecValue(element.getIndex().getcontent()))[2:4]
+            data += "{:0>4x}".format(ExtractHexDecValue(element.getIndex().getcontent()))[0:2]
+            #  Number of Entries
+            data += "{:0>2x}".format(len(element.getEntry()))
+            #  About Sync Manager
+            if element.getSm() is not None:
+                data += "{:0>2x}".format(element.getSm())
+            else:
+                data += "ff"
+            #  Reference to DC Synch (according to ET1100 documentation) - assume 0
+            data += "00"
+            #  Name Index
+            objname = ""
+            for name in element.getName():
+                objname = name.getcontent()
+            for name in self.Strings:
+                count += 1
+                if objname == name:
+                    break
+            if len(self.Strings)+1 == count:
+                data += "00"
+            else:
+                data += "{:0>2x}".format(count)
+            count = 0
+            #  Flags; by Fixed, Mandatory, Virtual attributes ?
+            if element.getFixed() is True or 1:
+                en_fixed = True
+            if element.getMandatory() is True or 1:
+                en_mandatory = True
+            if element.getVirtual() is True or element.getVirtual():
+                en_virtual = True
+            data += str(int(en_fixed)) + str(int(en_mandatory)) + str(int(en_virtual)) + "0"
+
+            for entry in element.getEntry():
+                #   Entry Index
+                data += "{:0>4x}".format(ExtractHexDecValue(entry.getIndex().getcontent()))[2:4]
+                data += "{:0>4x}".format(ExtractHexDecValue(entry.getIndex().getcontent()))[0:2]
+                #   Subindex
+                data += "{:0>2x}".format(int(entry.getSubIndex()))
+                #   Entry Name Index
+                objname = ""
+                for name in entry.getName():
+                    objname = name.getcontent()
+                for name in self.Strings:
+                    count += 1
+                    if objname == name:
+                        break
+                if len(self.Strings)+1 == count:
+                    data += "00"
+                else:
+                    data += "{:0>2x}".format(count)
+                count = 0
+                #   DataType
+                if entry.getDataType() is not None:
+                    if entry.getDataType().getcontent() in self.BaseDataTypeDict:
+                        data += self.BaseDataTypeDict[entry.getDataType().getcontent()]
+                    else:
+                        data += "00"
+                else:
+                    data += "00"
+                #   BitLen
+                if entry.getBitLen() is not None:
+                    data += "{:0>2x}".format(int(entry.getBitLen()))
+                else:
+                    data += "00"
+                #   Flags; by Fixed attributes ?
+                en_fixed = False
+                if entry.getFixed() is True or entry.getFixed() == 1:
+                    en_fixed = True
+                data += str(int(en_fixed)) + "000"
+
+        if data != "":
+            #  category header
+            if pdotype == "TxPdo":
+                eeprom.append("32")
+            elif pdotype == "RxPdo":
+                eeprom.append("33")
+            else:
+                eeprom.append("00")
+            eeprom.append("00")
+            #  category length
+            eeprom.append("{:0>4x}".format(len(data)//4)[2:4])
+            eeprom.append("{:0>4x}".format(len(data)//4)[0:2])
+            data = str(data.lower())
+            for dummy in range(len(data)//2):
+                if data == "":
+                    eeprom.append("00")
+                else:
+                    eeprom.append(data[0:2])
+                data = data[2:len(data)]
+
+        return eeprom
+
+    def ExtractEEPROMDCCategory(self, device):
+        """
+        Extract "DC(Distributed Clock)" category data from slave ESI XML and generate EEPROM image data.
+        @param device : 'device' object in the slave ESI XML
+        @return eeprom : "Strings" category EEPROM image data
+        """
+        eeprom = []
+        data = ""
+        count = 0
+        namecount = 0
+
+        if device.getDc() is not None:
+            for element in device.getDc().getOpMode():
+                count += 1
+                #  assume that word 1-7 are 0x0000
+                data += "0000"
+                data += "0000"
+                data += "0000"
+                data += "0000"
+                data += "0000"
+                data += "0000"
+                data += "0000"
+                #  word 8-10
+                #  AssignActivate
+                if element.getAssignActivate() is not None:
+                    data += "{:0>4x}".format(ExtractHexDecValue(element.getAssignActivate()))[2:4]
+                    data += "{:0>4x}".format(ExtractHexDecValue(element.getAssignActivate()))[0:2]
+                else:
+                    data += "0000"
+                #  Factor of CycleTimeSync0 ? and default is 1?
+                if element.getCycleTimeSync0() is not None:
+                    if element.getCycleTimeSync0().getFactor() is not None:
+                        data += "{:0>2x}".format(int(element.getCycleTimeSync0().getFactor()))
+                        data += "00"
+                    else:
+                        data += "0100"
+                else:
+                    data += "0100"
+                #  Index of Name in STRINGS Category
+                #  Name Index
+                objname = ""
+                for name in element.getName():
+                    objname += name
+                for name in self.Strings:
+                    namecount += 1
+                    if objname == name:
+                        break
+                if len(self.Strings)+1 == namecount:
+                    data += "00"
+                else:
+                    data += "{:0>2x}".format(namecount)
+                namecount = 0
+                data += "00"
+                #  assume that word 11-12 are 0x0000
+                data += "0000"
+                data += "0000"
+
+        if data != "":
+            #  category header
+            eeprom.append("3c")
+            eeprom.append("00")
+            #  category length
+            eeprom.append("{:0>4x}".format(len(data)//4)[2:4])
+            eeprom.append("{:0>4x}".format(len(data)//4)[0:2])
+            data = str(data.lower())
+            for dummy in range(len(data)//2):
+                if data == "":
+                    eeprom.append("00")
+                else:
+                    eeprom.append(data[0:2])
+                data = data[2:len(data)]
+
+        return eeprom
+
+    # -------------------------------------------------------------------------------
+    #                        Used Register Access
+    # -------------------------------------------------------------------------------
+    def RegRead(self, offset, length):
+        """
+        Read slave ESC register content using "ethercat reg_read -p %d %s %s" command.
+        Command example : "ethercat reg_read -p 0 0x0c00 0x0400"
+        @param offset : register address
+        @param length : register length
+        @return return_val : register data
+        """
+        _error, return_val = self.Controler.RemoteExec(
+            REG_READ % (self.Controler.GetSlavePos(), offset, length),
+            return_val=None)
+        return return_val
+
+    def RegWrite(self, address, data):
+        """
+        Write data to slave ESC register using "ethercat reg_write -p %d %s %s" command.
+        Command example : "ethercat reg_write -p 0 0x0c04 0x0001"
+        @param address : register address
+        @param data : data to write
+        @return return_val : the execution result of "ethercat reg_write" (for error check)
+        """
+        _error, return_val = self.Controler.RemoteExec(
+            REG_WRITE % (self.Controler.GetSlavePos(), address, data),
+            return_val=None)
+        return return_val
+
+    def Rescan(self):
+        """
+        Synchronize EEPROM data in master controller with the data in slave device after EEPROM write.
+        Command example : "ethercat rescan -p 0"
+        """
+        _error, _return_val = self.Controler.RemoteExec(RESCAN % (self.Controler.GetSlavePos()), return_val=None)
+
+    # -------------------------------------------------------------------------------
+    #                        Common Use Methods
+    # -------------------------------------------------------------------------------
+    def CheckConnect(self, cyclic_flag):
+        """
+        Check connection status (1) between Beremiz and the master (2) between the master and the slave.
+        @param cyclic_flag: 0 - one shot, 1 - periodic
+        @return True or False
+        """
+        if self.Controler.GetCTRoot()._connector is not None:
+            # Check connection between the master and the slave.
+            # Command example : "ethercat xml -p 0"
+            _error, return_val = self.Controler.RemoteExec(SLAVE_XML % (self.Controler.GetSlavePos()), return_val=None)
+            number_of_lines = return_val.split("\n")
+            if len(number_of_lines) <= 2:  # No slave connected to the master controller
+                if not cyclic_flag:
+                    self.CreateErrorDialog(_('No connected slaves'))
+                return False
+
+            elif len(number_of_lines) > 2:
+                return True
+        else:
+            # The master controller is not connected to Beremiz host
+            if not cyclic_flag:
+                self.CreateErrorDialog(_('PLC not connected!'))
+            return False
+
+    def CreateErrorDialog(self, mention):
+        """
+        Create a dialog to indicate error or warning.
+        @param mention : Error String
+        """
+        app_frame = self.Controler.GetCTRoot().AppFrame
+        dlg = wx.MessageDialog(app_frame, mention,
+                               _(' Warning...'),
+                               wx.OK | wx.ICON_INFORMATION)
+        dlg.ShowModal()
+        dlg.Destroy()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/ConfigEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,1431 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz
+#
+# Copyright (C) 2011-2014: Laurent BESSARD, Edouard TISSERANT
+#                          RTES Lab : CRKim, JBLee, youcu
+#                          Higen Motor : Donggu Kang
+#
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+from __future__ import division
+import os
+import re
+
+import wx
+import wx.grid
+import wx.gizmos
+import wx.lib.buttons
+
+from plcopen.structures import IEC_KEYWORDS, TestIdentifier
+from controls import CustomGrid, CustomTable, FolderTree
+from controls.CustomStyledTextCtrl import NAVIGATION_KEYS
+from editors.ConfTreeNodeEditor import ConfTreeNodeEditor, SCROLLBAR_UNIT
+from util.BitmapLibrary import GetBitmap
+from util.TranslationCatalogs import NoTranslate
+
+# -----------------------------------------------------------------------
+from etherlab.EtherCATManagementEditor import EtherCATManagementTreebook, MasterStatePanelClass
+# -----------------------------------------------------------------------
+
+[ETHERCAT_VENDOR, ETHERCAT_GROUP, ETHERCAT_DEVICE] = range(3)
+
+
+def AppendMenu(parent, help, id, kind, text):
+    if wx.VERSION >= (2, 6, 0):
+        parent.Append(help=help, id=id, kind=kind, text=text)
+    else:
+        parent.Append(helpString=help, id=id, kind=kind, item=text)
+
+
+def GetVariablesTableColnames(position=False):
+    _ = NoTranslate
+    colname = ["#"]
+    if position:
+        colname.append(_("Position"))
+    return colname + [_("Name"), _("Index"), _("SubIndex"), _("Type"), _("Access")]
+
+
+ACCESS_TYPES = {
+    'ro': 'R',
+    'wo': 'W',
+    'rw': 'R/W'}
+
+
+def GetAccessValue(access, pdo_mapping):
+    value = "SDO: %s" % ACCESS_TYPES.get(access, "")
+    if pdo_mapping != "":
+        value += ", PDO: %s" % pdo_mapping
+    return value
+
+
+VARIABLES_FILTERS = [
+    (_("All"), (0x0000, 0xffff)),
+    (_("Communication Parameters"), (0x1000, 0x1fff)),
+    (_("Manufacturer Specific"), (0x2000, 0x5fff)),
+    (_("Standardized Device Profile"), (0x6000, 0x9fff))]
+
+VARIABLE_INDEX_FILTER_FORMAT = _("Variable Index: #x%4.4X")
+
+ETHERCAT_INDEX_MODEL = re.compile("#x([0-9a-fA-F]{0,4})$")
+ETHERCAT_SUBINDEX_MODEL = re.compile("#x([0-9a-fA-F]{0,2})$")
+LOCATION_MODEL = re.compile(r"(?:%[IQM](?:[XBWLD]?([0-9]+(?:\.[0-9]+)*)))$")
+
+
+class NodeVariablesSizer(wx.FlexGridSizer):
+
+    def __init__(self, parent, controler, position_column=False):
+        wx.FlexGridSizer.__init__(self, cols=1, hgap=0, rows=2, vgap=5)
+        self.AddGrowableCol(0)
+        self.AddGrowableRow(1)
+
+        self.Controler = controler
+        self.PositionColumn = position_column
+
+        self.VariablesFilter = wx.ComboBox(parent, style=wx.TE_PROCESS_ENTER)
+        self.VariablesFilter.Bind(wx.EVT_COMBOBOX, self.OnVariablesFilterChanged)
+        self.VariablesFilter.Bind(wx.EVT_TEXT_ENTER, self.OnVariablesFilterChanged)
+        self.VariablesFilter.Bind(wx.EVT_CHAR, self.OnVariablesFilterKeyDown)
+        self.AddWindow(self.VariablesFilter, flag=wx.GROW)
+
+        self.VariablesGrid = wx.gizmos.TreeListCtrl(parent,
+                                                    style=wx.TR_DEFAULT_STYLE |
+                                                    wx.TR_ROW_LINES |
+                                                    wx.TR_COLUMN_LINES |
+                                                    wx.TR_HIDE_ROOT |
+                                                    wx.TR_FULL_ROW_HIGHLIGHT)
+        self.VariablesGrid.GetMainWindow().Bind(wx.EVT_LEFT_DOWN,
+                                                self.OnVariablesGridLeftClick)
+        self.AddWindow(self.VariablesGrid, flag=wx.GROW)
+
+        self.Filters = []
+        for desc, value in VARIABLES_FILTERS:
+            self.VariablesFilter.Append(desc)
+            self.Filters.append(value)
+
+        self.VariablesFilter.SetSelection(0)
+        self.CurrentFilter = self.Filters[0]
+        self.VariablesFilterFirstCharacter = True
+
+        if position_column:
+            for colname, colsize, colalign in zip(GetVariablesTableColnames(position_column),
+                                                  [40, 80, 350, 80, 100, 80, 150],
+                                                  [wx.ALIGN_RIGHT, wx.ALIGN_RIGHT, wx.ALIGN_LEFT,
+                                                   wx.ALIGN_RIGHT, wx.ALIGN_RIGHT, wx.ALIGN_LEFT,
+                                                   wx.ALIGN_LEFT]):
+                self.VariablesGrid.AddColumn(_(colname), colsize, colalign)
+            self.VariablesGrid.SetMainColumn(2)
+        else:
+            for colname, colsize, colalign in zip(GetVariablesTableColnames(),
+                                                  [40, 350, 80, 100, 80, 150],
+                                                  [wx.ALIGN_RIGHT, wx.ALIGN_LEFT, wx.ALIGN_RIGHT,
+                                                   wx.ALIGN_RIGHT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]):
+                self.VariablesGrid.AddColumn(_(colname), colsize, colalign)
+            self.VariablesGrid.SetMainColumn(1)
+
+    def RefreshView(self):
+        entries = self.Controler.GetSlaveVariables(self.CurrentFilter)
+        self.RefreshVariablesGrid(entries)
+
+    def RefreshVariablesGrid(self, entries):
+        root = self.VariablesGrid.GetRootItem()
+        if not root.IsOk():
+            root = self.VariablesGrid.AddRoot(_("Slave entries"))
+        self.GenerateVariablesGridBranch(root, entries, GetVariablesTableColnames(self.PositionColumn))
+        self.VariablesGrid.Expand(root)
+
+    def GenerateVariablesGridBranch(self, root, entries, colnames, idx=0):
+        item, root_cookie = self.VariablesGrid.GetFirstChild(root)
+
+        no_more_items = not item.IsOk()
+        for entry in entries:
+            idx += 1
+            if no_more_items:
+                item = self.VariablesGrid.AppendItem(root, "")
+            for col, colname in enumerate(colnames):
+                if col == 0:
+                    self.VariablesGrid.SetItemText(item, str(idx), 0)
+                else:
+                    value = entry.get(colname, "")
+                    if colname == "Access":
+                        value = GetAccessValue(value, entry.get("PDOMapping", ""))
+                    self.VariablesGrid.SetItemText(item, value, col)
+            if entry["PDOMapping"] == "":
+                self.VariablesGrid.SetItemBackgroundColour(item, wx.LIGHT_GREY)
+            else:
+                self.VariablesGrid.SetItemBackgroundColour(item, wx.WHITE)
+            self.VariablesGrid.SetItemPyData(item, entry)
+            idx = self.GenerateVariablesGridBranch(item, entry["children"], colnames, idx)
+            if not no_more_items:
+                item, root_cookie = self.VariablesGrid.GetNextChild(root, root_cookie)
+                no_more_items = not item.IsOk()
+
+        if not no_more_items:
+            to_delete = []
+            while item.IsOk():
+                to_delete.append(item)
+                item, root_cookie = self.VariablesGrid.GetNextChild(root, root_cookie)
+            for item in to_delete:
+                self.VariablesGrid.Delete(item)
+
+        return idx
+
+    def OnVariablesFilterChanged(self, event):
+        filter = self.VariablesFilter.GetSelection()
+        if filter != -1:
+            self.CurrentFilter = self.Filters[filter]
+            self.RefreshView()
+        else:
+            try:
+                value = self.VariablesFilter.GetValue()
+                if value == "":
+                    self.CurrentFilter = self.Filters[0]
+                    self.VariablesFilter.SetSelection(0)
+                else:
+                    result = ETHERCAT_INDEX_MODEL.match(value)
+                    if result is not None:
+                        value = result.group(1)
+                    index = int(value, 16)
+                    self.CurrentFilter = (index, index)
+                    self.VariablesFilter.SetValue(VARIABLE_INDEX_FILTER_FORMAT % index)
+                self.RefreshView()
+            except Exception:
+                if self.CurrentFilter in self.Filters:
+                    self.VariablesFilter.SetSelection(self.Filters.index(self.CurrentFilter))
+                else:
+                    self.VariablesFilter.SetValue(VARIABLE_INDEX_FILTER_FORMAT % self.CurrentFilter[0])
+        self.VariablesFilterFirstCharacter = True
+        event.Skip()
+
+    def OnVariablesFilterKeyDown(self, event):
+        if self.VariablesFilterFirstCharacter:
+            keycode = event.GetKeyCode()
+            if keycode not in [wx.WXK_RETURN,
+                               wx.WXK_NUMPAD_ENTER]:
+                self.VariablesFilterFirstCharacter = False
+                if keycode not in NAVIGATION_KEYS:
+                    self.VariablesFilter.SetValue("")
+            if keycode not in [wx.WXK_DELETE,
+                               wx.WXK_NUMPAD_DELETE,
+                               wx.WXK_BACK]:
+                event.Skip()
+        else:
+            event.Skip()
+
+    def OnVariablesGridLeftClick(self, event):
+        item, _flags, col = self.VariablesGrid.HitTest(event.GetPosition())
+        if item.IsOk():
+            entry = self.VariablesGrid.GetItemPyData(item)
+            data_type = entry.get("Type", "")
+            data_size = self.Controler.GetSizeOfType(data_type)
+
+            if col == -1 and data_size is not None:
+                pdo_mapping = entry.get("PDOMapping", "")
+                access = entry.get("Access", "")
+                entry_index = self.Controler.ExtractHexDecValue(entry.get("Index", "0"))
+                entry_subindex = self.Controler.ExtractHexDecValue(entry.get("SubIndex", "0"))
+                location = self.Controler.GetCurrentLocation()
+                if self.PositionColumn:
+                    slave_pos = self.Controler.ExtractHexDecValue(entry.get("Position", "0"))
+                    location += (slave_pos,)
+                    node_name = self.Controler.GetSlaveName(slave_pos)
+                else:
+                    node_name = self.Controler.CTNName()
+
+                if pdo_mapping != "":
+                    var_name = "%s_%4.4x_%2.2x" % (node_name, entry_index, entry_subindex)
+                    if pdo_mapping == "T":
+                        dir = "%I"
+                    else:
+                        dir = "%Q"
+                    location = "%s%s" % (dir, data_size) + \
+                               ".".join(map(str, location + (entry_index, entry_subindex)))
+
+                    data = wx.TextDataObject(str((location, "location", data_type, var_name, "", access)))
+                    dragSource = wx.DropSource(self.VariablesGrid)
+                    dragSource.SetData(data)
+                    dragSource.DoDragDrop()
+                    return
+
+                elif self.PositionColumn:
+                    location = self.Controler.GetCurrentLocation() +\
+                               (slave_pos, entry_index, entry_subindex)
+                    data = wx.TextDataObject(str((location, "variable", access)))
+                    dragSource = wx.DropSource(self.VariablesGrid)
+                    dragSource.SetData(data)
+                    dragSource.DoDragDrop()
+                    return
+
+        event.Skip()
+
+
+class NodeEditor(ConfTreeNodeEditor):
+
+    CONFNODEEDITOR_TABS = [
+        (_("Ethercat node"), "_create_EthercatNodeEditor"),
+        # Add Notebook Tab for EtherCAT Management Treebook
+        (_("EtherCAT Management"), "_create_EtherCATManagementEditor")
+        ]
+
+    def _create_EthercatNodeEditor(self, prnt):
+        self.EthercatNodeEditor = wx.Panel(prnt, style=wx.TAB_TRAVERSAL)
+
+        main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
+        main_sizer.AddGrowableCol(0)
+        main_sizer.AddGrowableRow(1)
+
+        variables_label = wx.StaticText(self.EthercatNodeEditor,
+                                        label=_('Variable entries:'))
+        main_sizer.AddWindow(variables_label, border=10, flag=wx.TOP | wx.LEFT | wx.RIGHT)
+
+        self.NodeVariables = NodeVariablesSizer(self.EthercatNodeEditor, self.Controler)
+        main_sizer.AddSizer(self.NodeVariables, border=10,
+                            flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
+        self.EthercatNodeEditor.SetSizer(main_sizer)
+
+        return self.EthercatNodeEditor
+
+    def __init__(self, parent, controler, window):
+        ConfTreeNodeEditor.__init__(self, parent, controler, window)
+
+        # add Contoler for use EthercatSlave.py Method
+        self.Controler = controler
+
+    def GetBufferState(self):
+        return False, False
+
+    def RefreshView(self):
+        ConfTreeNodeEditor.RefreshView(self)
+
+        self.NodeVariables.RefreshView()
+
+    # -------------------For EtherCAT Management ----------------------------------------------
+    def _create_EtherCATManagementEditor(self, prnt):
+        self.EtherCATManagementEditor = wx.ScrolledWindow(prnt,
+                                                          style=wx.TAB_TRAVERSAL | wx.HSCROLL | wx.VSCROLL)
+        self.EtherCATManagementEditor.Bind(wx.EVT_SIZE, self.OnResize)
+
+        self.EtherCATManagermentEditor_Main_Sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
+        self.EtherCATManagermentEditor_Main_Sizer.AddGrowableCol(0)
+        self.EtherCATManagermentEditor_Main_Sizer.AddGrowableRow(0)
+
+        self.EtherCATManagementTreebook = EtherCATManagementTreebook(self.EtherCATManagementEditor, self.Controler, self)
+
+        self.EtherCATManagermentEditor_Main_Sizer.AddSizer(self.EtherCATManagementTreebook, border=10, flag=wx.GROW)
+
+        self.EtherCATManagementEditor.SetSizer(self.EtherCATManagermentEditor_Main_Sizer)
+        return self.EtherCATManagementEditor
+
+    def OnResize(self, event):
+        self.EtherCATManagementEditor.GetBestSize()
+        xstart, ystart = self.EtherCATManagementEditor.GetViewStart()
+        window_size = self.EtherCATManagementEditor.GetClientSize()
+        maxx, maxy = self.EtherCATManagementEditor.GetMinSize()
+        posx = max(0, min(xstart, (maxx - window_size[0]) // SCROLLBAR_UNIT))
+        posy = max(0, min(ystart, (maxy - window_size[1]) // SCROLLBAR_UNIT))
+        self.EtherCATManagementEditor.Scroll(posx, posy)
+        self.EtherCATManagementEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
+                                                    maxx // SCROLLBAR_UNIT,
+                                                    maxy // SCROLLBAR_UNIT,
+                                                    posx, posy)
+        event.Skip()
+    # -------------------------------------------------------------------------------------------------------
+
+
+CIA402NodeEditor = NodeEditor
+
+
+def GetProcessVariablesTableColnames():
+    _ = NoTranslate
+    return ["#", _("Name"),
+            _("Read from (nodeid, index, subindex)"),
+            _("Write to (nodeid, index, subindex)"),
+            _("Description")]
+
+
+class ProcessVariablesTable(CustomTable):
+
+    def GetValue(self, row, col):
+        if row < self.GetNumberRows():
+            if col == 0:
+                return row + 1
+            colname = self.GetColLabelValue(col, False)
+            if colname.startswith("Read from"):
+                value = self.data[row].get("ReadFrom", "")
+                if value == "":
+                    return value
+                return "%d, #x%0.4X, #x%0.2X" % value
+            elif colname.startswith("Write to"):
+                value = self.data[row].get("WriteTo", "")
+                if value == "":
+                    return value
+                return "%d, #x%0.4X, #x%0.2X" % value
+            return self.data[row].get(colname, "")
+
+    def SetValue(self, row, col, value):
+        if col < len(self.colnames):
+            colname = self.GetColLabelValue(col, False)
+            if colname.startswith("Read from"):
+                self.data[row]["ReadFrom"] = value
+            elif colname.startswith("Write to"):
+                self.data[row]["WriteTo"] = value
+            else:
+                self.data[row][colname] = value
+
+    def _updateColAttrs(self, grid):
+        """
+        wx.grid.Grid -> update the column attributes to add the
+        appropriate renderer given the column name.
+
+        Otherwise default to the default renderer.
+        """
+        for row in range(self.GetNumberRows()):
+            for col in range(self.GetNumberCols()):
+                editor = None
+                renderer = None
+                colname = self.GetColLabelValue(col, False)
+                if colname in ["Name", "Description"]:
+                    editor = wx.grid.GridCellTextEditor()
+                    renderer = wx.grid.GridCellStringRenderer()
+                    grid.SetReadOnly(row, col, False)
+                else:
+                    grid.SetReadOnly(row, col, True)
+
+                grid.SetCellEditor(row, col, editor)
+                grid.SetCellRenderer(row, col, renderer)
+
+            self.ResizeRow(grid, row)
+
+
+class ProcessVariableDropTarget(wx.TextDropTarget):
+
+    def __init__(self, parent):
+        wx.TextDropTarget.__init__(self)
+        self.ParentWindow = parent
+
+    def OnDropText(self, x, y, data):
+        self.ParentWindow.Select()
+        x, y = self.ParentWindow.ProcessVariablesGrid.CalcUnscrolledPosition(x, y)
+        col = self.ParentWindow.ProcessVariablesGrid.XToCol(x)
+        row = self.ParentWindow.ProcessVariablesGrid.YToRow(y - self.ParentWindow.ProcessVariablesGrid.GetColLabelSize())
+        message = None
+        try:
+            values = eval(data)
+        except Exception:
+            message = _("Invalid value \"%s\" for process variable") % data
+            values = None
+        if not isinstance(values, tuple):
+            message = _("Invalid value \"%s\" for process variable") % data
+            values = None
+        if values is not None and col != wx.NOT_FOUND and row != wx.NOT_FOUND and 2 <= col <= 3:
+            location = None
+            if values[1] == "location":
+                result = LOCATION_MODEL.match(values[0])
+                if result is not None:
+                    location = map(int, result.group(1).split('.'))
+                master_location = self.ParentWindow.GetMasterLocation()
+                if master_location == tuple(location[:len(master_location)]) and \
+                   len(location) - len(master_location) == 3:
+                    values = tuple(location[len(master_location):])
+                    var_type = self.ParentWindow.Controler.GetSlaveVariableDataType(*values)
+                    if col == 2:
+                        other_values = self.ParentWindow.ProcessVariablesTable.GetValueByName(row, "WriteTo")
+                    else:
+                        other_values = self.ParentWindow.ProcessVariablesTable.GetValueByName(row, "ReadFrom")
+                    if other_values != "":
+                        other_type = self.ParentWindow.Controler.GetSlaveVariableDataType(*other_values)
+                    else:
+                        other_type = None
+                    if other_type is None or var_type == other_type:
+                        if col == 2:
+                            self.ParentWindow.ProcessVariablesTable.SetValueByName(row, "ReadFrom", values)
+                        else:
+                            self.ParentWindow.ProcessVariablesTable.SetValueByName(row, "WriteTo", values)
+                        self.ParentWindow.SaveProcessVariables()
+                        self.ParentWindow.RefreshProcessVariables()
+                    else:
+                        message = _("'Read from' and 'Write to' variables types are not compatible")
+                else:
+                    message = _("Invalid value \"%s\" for process variable") % data
+
+        if message is not None:
+            wx.CallAfter(self.ShowMessage, message)
+
+    def ShowMessage(self, message):
+        message = wx.MessageDialog(self.ParentWindow, message, _("Error"), wx.OK | wx.ICON_ERROR)
+        message.ShowModal()
+        message.Destroy()
+
+
+def GetStartupCommandsTableColnames():
+    _ = NoTranslate
+    return [_("Position"), _("Index"), _("Subindex"), _("Value"), _("Description")]
+
+
+class StartupCommandDropTarget(wx.TextDropTarget):
+
+    def __init__(self, parent):
+        wx.TextDropTarget.__init__(self)
+        self.ParentWindow = parent
+
+    def OnDropText(self, x, y, data):
+        self.ParentWindow.Select()
+        message = None
+        try:
+            values = eval(data)
+        except Exception:
+            message = _("Invalid value \"%s\" for startup command") % data
+            values = None
+        if not isinstance(values, tuple):
+            message = _("Invalid value \"%s\" for startup command") % data
+            values = None
+        if values is not None:
+            location = None
+            if values[1] == "location":
+                result = LOCATION_MODEL.match(values[0])
+                if result is not None and len(values) > 5:
+                    location = map(int, result.group(1).split('.'))
+                    access = values[5]
+            elif values[1] == "variable":
+                location = values[0]
+                access = values[2]
+            if location is not None:
+                master_location = self.ParentWindow.GetMasterLocation()
+                if master_location == tuple(location[:len(master_location)]) and \
+                   len(location) - len(master_location) == 3:
+                    if access in ["wo", "rw"]:
+                        self.ParentWindow.AddStartupCommand(*location[len(master_location):])
+                    else:
+                        message = _("Entry can't be write through SDO")
+                else:
+                    message = _("Invalid value \"%s\" for startup command") % data
+
+        if message is not None:
+            wx.CallAfter(self.ShowMessage, message)
+
+    def ShowMessage(self, message):
+        message = wx.MessageDialog(self.ParentWindow, message, _("Error"), wx.OK | wx.ICON_ERROR)
+        message.ShowModal()
+        message.Destroy()
+
+
+class StartupCommandsTable(CustomTable):
+
+    """
+    A custom wx.grid.Grid Table using user supplied data
+    """
+    def __init__(self, parent, data, colnames):
+        # The base class must be initialized *first*
+        CustomTable.__init__(self, parent, data, colnames)
+        self.old_value = None
+
+    def GetValue(self, row, col):
+        if row < self.GetNumberRows():
+            colname = self.GetColLabelValue(col, False)
+            value = self.data[row].get(colname, "")
+            if colname == "Index":
+                return "#x%0.4X" % value
+            elif colname == "Subindex":
+                return "#x%0.2X" % value
+            return value
+
+    def SetValue(self, row, col, value):
+        if col < len(self.colnames):
+            colname = self.GetColLabelValue(col, False)
+            if colname in ["Index", "Subindex"]:
+                if colname == "Index":
+                    result = ETHERCAT_INDEX_MODEL.match(value)
+                else:
+                    result = ETHERCAT_SUBINDEX_MODEL.match(value)
+                if result is None:
+                    return
+                value = int(result.group(1), 16)
+            elif colname == "Value":
+                value = int(value)
+            elif colname == "Position":
+                self.old_value = self.data[row][colname]
+                value = int(value)
+            self.data[row][colname] = value
+
+    def GetOldValue(self):
+        return self.old_value
+
+    def _updateColAttrs(self, grid):
+        """
+        wx.grid.Grid -> update the column attributes to add the
+        appropriate renderer given the column name.
+
+        Otherwise default to the default renderer.
+        """
+        for row in range(self.GetNumberRows()):
+            for col in range(self.GetNumberCols()):
+                editor = None
+                renderer = None
+                colname = self.GetColLabelValue(col, False)
+                if colname in ["Position", "Value"]:
+                    editor = wx.grid.GridCellNumberEditor()
+                    renderer = wx.grid.GridCellNumberRenderer()
+                else:
+                    editor = wx.grid.GridCellTextEditor()
+                    renderer = wx.grid.GridCellStringRenderer()
+
+                grid.SetCellEditor(row, col, editor)
+                grid.SetCellRenderer(row, col, renderer)
+                grid.SetReadOnly(row, col, False)
+
+            self.ResizeRow(grid, row)
+
+    def GetCommandIndex(self, position, command_idx):
+        for row, command in enumerate(self.data):
+            if command["Position"] == position and command["command_idx"] == command_idx:
+                return row
+        return None
+
+
+class MasterNodesVariablesSizer(NodeVariablesSizer):
+
+    def __init__(self, parent, controler):
+        NodeVariablesSizer.__init__(self, parent, controler, True)
+
+        self.CurrentNodesFilter = {}
+
+    def SetCurrentNodesFilter(self, nodes_filter):
+        self.CurrentNodesFilter = nodes_filter
+
+    def RefreshView(self):
+        if self.CurrentNodesFilter is not None:
+            args = self.CurrentNodesFilter.copy()
+            args["limits"] = self.CurrentFilter
+            entries = self.Controler.GetNodesVariables(**args)
+            self.RefreshVariablesGrid(entries)
+
+
+NODE_POSITION_FILTER_FORMAT = _("Node Position: %d")
+
+
+class MasterEditor(ConfTreeNodeEditor):
+
+    CONFNODEEDITOR_TABS = [
+        (_("Network"), "_create_EthercatMasterEditor"),
+        (_("Master State"), "_create_MasterStateEditor")
+        ]
+
+    def _create_MasterStateEditor(self, prnt):
+        self.MasterStateEditor = wx.ScrolledWindow(prnt, style=wx.TAB_TRAVERSAL | wx.HSCROLL | wx.VSCROLL)
+        self.MasterStateEditor.Bind(wx.EVT_SIZE, self.OnResize)
+
+        self.MasterStateEditor_Panel_Main_Sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
+        self.MasterStateEditor_Panel_Main_Sizer.AddGrowableCol(0)
+        self.MasterStateEditor_Panel_Main_Sizer.AddGrowableRow(0)
+
+        self.MasterStateEditor_Panel = MasterStatePanelClass(self.MasterStateEditor, self.Controler)
+
+        self.MasterStateEditor_Panel_Main_Sizer.AddSizer(self.MasterStateEditor_Panel, border=10, flag=wx.GROW)
+
+        self.MasterStateEditor.SetSizer(self.MasterStateEditor_Panel_Main_Sizer)
+        return self.MasterStateEditor
+
+    def _create_EthercatMasterEditor(self, prnt):
+        self.EthercatMasterEditor = wx.ScrolledWindow(prnt,
+                                                      style=wx.TAB_TRAVERSAL | wx.HSCROLL | wx.VSCROLL)
+        self.EthercatMasterEditor.Bind(wx.EVT_SIZE, self.OnResize)
+
+        self.EthercatMasterEditorSizer = wx.BoxSizer(wx.VERTICAL)
+
+        self.NodesFilter = wx.ComboBox(self.EthercatMasterEditor,
+                                       style=wx.TE_PROCESS_ENTER)
+        self.Bind(wx.EVT_COMBOBOX, self.OnNodesFilterChanged, self.NodesFilter)
+        self.Bind(wx.EVT_TEXT_ENTER, self.OnNodesFilterChanged, self.NodesFilter)
+        self.NodesFilter.Bind(wx.EVT_CHAR, self.OnNodesFilterKeyDown)
+
+        process_variables_header = wx.BoxSizer(wx.HORIZONTAL)
+
+        process_variables_label = wx.StaticText(self.EthercatMasterEditor,
+                                                label=_("Process variables mapped between nodes:"))
+        process_variables_header.AddWindow(process_variables_label, 1,
+                                           flag=wx.ALIGN_CENTER_VERTICAL)
+
+        for name, bitmap, help in [
+                ("AddVariableButton", "add_element", _("Add process variable")),
+                ("DeleteVariableButton", "remove_element", _("Remove process variable")),
+                ("UpVariableButton", "up", _("Move process variable up")),
+                ("DownVariableButton", "down", _("Move process variable down"))]:
+            button = wx.lib.buttons.GenBitmapButton(self.EthercatMasterEditor, bitmap=GetBitmap(bitmap),
+                                                    size=wx.Size(28, 28), style=wx.NO_BORDER)
+            button.SetToolTipString(help)
+            setattr(self, name, button)
+            process_variables_header.AddWindow(button, border=5, flag=wx.LEFT)
+
+        self.ProcessVariablesGrid = CustomGrid(self.EthercatMasterEditor, style=wx.VSCROLL)
+        self.ProcessVariablesGrid.SetMinSize(wx.Size(0, 150))
+        self.ProcessVariablesGrid.SetDropTarget(ProcessVariableDropTarget(self))
+        self.ProcessVariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
+                                       self.OnProcessVariablesGridCellChange)
+        self.ProcessVariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK,
+                                       self.OnProcessVariablesGridCellLeftClick)
+        self.ProcessVariablesGrid.Bind(wx.EVT_KEY_DOWN, self.OnProcessVariablesGridKeyDown)
+
+        startup_commands_header = wx.BoxSizer(wx.HORIZONTAL)
+
+        startup_commands_label = wx.StaticText(self.EthercatMasterEditor,
+                                               label=_("Startup service variables assignments:"))
+        startup_commands_header.AddWindow(startup_commands_label, 1,
+                                          flag=wx.ALIGN_CENTER_VERTICAL)
+
+        for name, bitmap, help in [
+                ("AddCommandButton", "add_element", _("Add startup service variable")),
+                ("DeleteCommandButton", "remove_element", _("Remove startup service variable"))]:
+            button = wx.lib.buttons.GenBitmapButton(self.EthercatMasterEditor, bitmap=GetBitmap(bitmap),
+                                                    size=wx.Size(28, 28), style=wx.NO_BORDER)
+            button.SetToolTipString(help)
+            setattr(self, name, button)
+            startup_commands_header.AddWindow(button, border=5, flag=wx.LEFT)
+
+        self.StartupCommandsGrid = CustomGrid(self.EthercatMasterEditor, style=wx.VSCROLL)
+        self.StartupCommandsGrid.SetDropTarget(StartupCommandDropTarget(self))
+        self.StartupCommandsGrid.SetMinSize(wx.Size(0, 150))
+        self.StartupCommandsGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
+                                      self.OnStartupCommandsGridCellChange)
+        self.StartupCommandsGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN,
+                                      self.OnStartupCommandsGridEditorShow)
+
+        self.NodesVariables = MasterNodesVariablesSizer(self.EthercatMasterEditor, self.Controler)
+
+        main_staticbox = wx.StaticBox(self.EthercatMasterEditor, label=_("Node filter:"))
+        staticbox_sizer = wx.StaticBoxSizer(main_staticbox, wx.VERTICAL)
+        self.EthercatMasterEditorSizer.AddSizer(staticbox_sizer, 0, border=10, flag=wx.GROW | wx.ALL)
+
+        main_staticbox_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=6, vgap=0)
+        main_staticbox_sizer.AddGrowableCol(0)
+        main_staticbox_sizer.AddGrowableRow(2)
+        main_staticbox_sizer.AddGrowableRow(4)
+        main_staticbox_sizer.AddGrowableRow(5)
+        staticbox_sizer.AddSizer(main_staticbox_sizer, 1, flag=wx.GROW)
+        main_staticbox_sizer.AddWindow(self.NodesFilter, border=5, flag=wx.GROW | wx.ALL)
+        main_staticbox_sizer.AddSizer(process_variables_header, border=5,
+                                      flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
+        main_staticbox_sizer.AddWindow(self.ProcessVariablesGrid, 1,
+                                       border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
+        main_staticbox_sizer.AddSizer(startup_commands_header,
+                                      border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
+        main_staticbox_sizer.AddWindow(self.StartupCommandsGrid, 1,
+                                       border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
+
+        second_staticbox = wx.StaticBox(self.EthercatMasterEditor, label=_("Nodes variables filter:"))
+        second_staticbox_sizer = wx.StaticBoxSizer(second_staticbox, wx.VERTICAL)
+        second_staticbox_sizer.AddSizer(self.NodesVariables, 1, border=5, flag=wx.GROW | wx.ALL)
+
+        main_staticbox_sizer.AddSizer(second_staticbox_sizer, 1,
+                                      border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
+
+        self.EthercatMasterEditor.SetSizer(self.EthercatMasterEditorSizer)
+
+        return self.EthercatMasterEditor
+
+    def __init__(self, parent, controler, window):
+        ConfTreeNodeEditor.__init__(self, parent, controler, window)
+
+        # ------------------------------------------------------------------
+        self.Controler = controler
+        # ------------------------------------------------------------------
+
+        self.ProcessVariables = []
+        self.CellShown = None
+        self.NodesFilterFirstCharacter = True
+
+        self.ProcessVariablesDefaultValue = {"Name": "", "ReadFrom": "", "WriteTo": "", "Description": ""}
+        self.ProcessVariablesTable = ProcessVariablesTable(self, [], GetProcessVariablesTableColnames())
+        self.ProcessVariablesColSizes = [40, 100, 150, 150, 200]
+        self.ProcessVariablesColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT]
+
+        self.ProcessVariablesGrid.SetTable(self.ProcessVariablesTable)
+        self.ProcessVariablesGrid.SetButtons({"Add": self.AddVariableButton,
+                                              "Delete": self.DeleteVariableButton,
+                                              "Up": self.UpVariableButton,
+                                              "Down": self.DownVariableButton})
+
+        def _AddVariablesElement(new_row):
+            self.ProcessVariablesTable.InsertRow(new_row, self.ProcessVariablesDefaultValue.copy())
+            self.SaveProcessVariables()
+            self.ProcessVariablesTable.ResetView(self.ProcessVariablesGrid)
+            return new_row
+        setattr(self.ProcessVariablesGrid, "_AddRow", _AddVariablesElement)
+
+        def _DeleteVariablesElement(row):
+            self.ProcessVariablesTable.RemoveRow(row)
+            self.SaveProcessVariables()
+            self.ProcessVariablesTable.ResetView(self.ProcessVariablesGrid)
+        setattr(self.ProcessVariablesGrid, "_DeleteRow", _DeleteVariablesElement)
+
+        def _MoveVariablesElement(row, move):
+            new_row = self.ProcessVariablesTable.MoveRow(row, move)
+            if new_row != row:
+                self.SaveProcessVariables()
+                self.ProcessVariablesTable.ResetView(self.ProcessVariablesGrid)
+            return new_row
+        setattr(self.ProcessVariablesGrid, "_MoveRow", _MoveVariablesElement)
+
+        _refresh_buttons = getattr(self.ProcessVariablesGrid, "RefreshButtons")
+
+        def _RefreshButtons():
+            if self.NodesFilter.GetSelection() == 0:
+                _refresh_buttons()
+            else:
+                self.AddVariableButton.Enable(False)
+                self.DeleteVariableButton.Enable(False)
+                self.UpVariableButton.Enable(False)
+                self.DownVariableButton.Enable(False)
+        setattr(self.ProcessVariablesGrid, "RefreshButtons", _RefreshButtons)
+
+        self.ProcessVariablesGrid.SetRowLabelSize(0)
+        for col in range(self.ProcessVariablesTable.GetNumberCols()):
+            attr = wx.grid.GridCellAttr()
+            attr.SetAlignment(self.ProcessVariablesColAlignements[col], wx.ALIGN_CENTRE)
+            self.ProcessVariablesGrid.SetColAttr(col, attr)
+            self.ProcessVariablesGrid.SetColMinimalWidth(col, self.ProcessVariablesColSizes[col])
+            self.ProcessVariablesGrid.AutoSizeColumn(col, False)
+        self.ProcessVariablesGrid.RefreshButtons()
+
+        self.StartupCommandsDefaultValue = {"Position": 0, "Index": 0, "Subindex": 0, "Value": 0, "Description": ""}
+        self.StartupCommandsTable = StartupCommandsTable(self, [], GetStartupCommandsTableColnames())
+        self.StartupCommandsColSizes = [100, 100, 50, 100, 200]
+        self.StartupCommandsColAlignements = [wx.ALIGN_CENTER, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT, wx.ALIGN_RIGHT, wx.ALIGN_LEFT]
+
+        self.StartupCommandsGrid.SetTable(self.StartupCommandsTable)
+        self.StartupCommandsGrid.SetButtons({"Add": self.AddCommandButton,
+                                             "Delete": self.DeleteCommandButton})
+
+        def _AddCommandsElement(new_row):
+            command = self.StartupCommandsDefaultValue.copy()
+            command_idx = self.Controler.AppendStartupCommand(command)
+            self.RefreshStartupCommands()
+            self.RefreshBuffer()
+            return self.StartupCommandsTable.GetCommandIndex(command["Position"], command_idx)
+        setattr(self.StartupCommandsGrid, "_AddRow", _AddCommandsElement)
+
+        def _DeleteCommandsElement(row):
+            command = self.StartupCommandsTable.GetRow(row)
+            self.Controler.RemoveStartupCommand(command["Position"], command["command_idx"])
+            self.RefreshStartupCommands()
+            self.RefreshBuffer()
+        setattr(self.StartupCommandsGrid, "_DeleteRow", _DeleteCommandsElement)
+
+        self.StartupCommandsGrid.SetRowLabelSize(0)
+        for col in range(self.StartupCommandsTable.GetNumberCols()):
+            attr = wx.grid.GridCellAttr()
+            attr.SetAlignment(self.StartupCommandsColAlignements[col], wx.ALIGN_CENTRE)
+            self.StartupCommandsGrid.SetColAttr(col, attr)
+            self.StartupCommandsGrid.SetColMinimalWidth(col, self.StartupCommandsColSizes[col])
+            self.StartupCommandsGrid.AutoSizeColumn(col, False)
+        self.StartupCommandsGrid.RefreshButtons()
+
+    def RefreshBuffer(self):
+        self.ParentWindow.RefreshTitle()
+        self.ParentWindow.RefreshFileMenu()
+        self.ParentWindow.RefreshEditMenu()
+        self.ParentWindow.RefreshPageTitles()
+
+    def GetBufferState(self):
+        return self.Controler.GetBufferState()
+
+    def Undo(self):
+        self.Controler.LoadPrevious()
+        self.RefreshView()
+
+    def Redo(self):
+        self.Controler.LoadNext()
+        self.RefreshView()
+
+    def RefreshView(self):
+        ConfTreeNodeEditor.RefreshView(self)
+
+        self.RefreshNodesFilter()
+        self.RefreshProcessVariables()
+        self.RefreshStartupCommands()
+        self.NodesVariables.RefreshView()
+
+    def RefreshNodesFilter(self):
+        value = self.NodesFilter.GetValue()
+        self.NodesFilter.Clear()
+        self.NodesFilter.Append(_("All"))
+        self.NodesFilterValues = [{}]
+        for vendor_id, vendor_name in self.Controler.GetLibraryVendors():
+            self.NodesFilter.Append(_("%s's nodes") % vendor_name)
+            self.NodesFilterValues.append({"vendor": vendor_id})
+        self.NodesFilter.Append(_("CIA402 nodes"))
+        self.NodesFilterValues.append({"slave_profile": 402})
+        if value in self.NodesFilter.GetStrings():
+            self.NodesFilter.SetStringSelection(value)
+        else:
+            try:
+                int(value)
+                self.NodesFilter.SetValue(value)
+            except Exception:
+                self.NodesFilter.SetSelection(0)
+        self.RefreshCurrentNodesFilter()
+
+    def RefreshCurrentNodesFilter(self):
+        filter = self.NodesFilter.GetSelection()
+        if filter != -1:
+            self.CurrentNodesFilter = self.NodesFilterValues[filter]
+        else:
+            try:
+                value = self.NodesFilter.GetValue()
+                if value == "":
+                    self.CurrentNodesFilter = self.NodesFilterValues[0]
+                    self.NodesFilter.SetSelection(0)
+                else:
+                    position = int(self.NodesFilter.GetValue())
+                    self.CurrentNodesFilter = {"slave_pos": position}
+                    self.NodesFilter.SetValue(NODE_POSITION_FILTER_FORMAT % position)
+            except Exception:
+                if self.CurrentNodesFilter in self.NodesFilterValues:
+                    self.NodesFilter.SetSelection(self.NodesFilterValues.index(self.CurrentNodesFilter))
+                else:
+                    self.NodesFilter.SetValue(NODE_POSITION_FILTER_FORMAT % self.CurrentNodesFilter["slave_pos"])
+        self.NodesFilterFirstCharacter = True
+        self.NodesVariables.SetCurrentNodesFilter(self.CurrentNodesFilter)
+
+    def RefreshProcessVariables(self):
+        if self.CurrentNodesFilter is not None:
+            self.ProcessVariables = self.Controler.GetProcessVariables()
+            slaves = self.Controler.GetSlaves(**self.CurrentNodesFilter)
+            data = []
+            for variable in self.ProcessVariables:
+                if variable["ReadFrom"] == "" or variable["ReadFrom"][0] in slaves or \
+                   variable["WriteTo"] == "" or variable["WriteTo"][0] in slaves:
+                    data.append(variable)
+            self.ProcessVariablesTable.SetData(data)
+            self.ProcessVariablesTable.ResetView(self.ProcessVariablesGrid)
+            self.ProcessVariablesGrid.RefreshButtons()
+
+    def SaveProcessVariables(self):
+        if self.CurrentNodesFilter is not None:
+            if len(self.CurrentNodesFilter) > 0:
+                self.Controler.SetProcessVariables(self.ProcessVariables)
+            else:
+                self.Controler.SetProcessVariables(self.ProcessVariablesTable.GetData())
+            self.RefreshBuffer()
+
+    def RefreshStartupCommands(self, position=None, command_idx=None):
+        if self.CurrentNodesFilter is not None:
+            col = max(self.StartupCommandsGrid.GetGridCursorCol(), 0)
+            self.StartupCommandsTable.SetData(
+                self.Controler.GetStartupCommands(**self.CurrentNodesFilter))
+            self.StartupCommandsTable.ResetView(self.StartupCommandsGrid)
+            if position is not None and command_idx is not None:
+                self.SelectStartupCommand(position, command_idx, col)
+
+    def SelectStartupCommand(self, position, command_idx, col):
+        self.StartupCommandsGrid.SetSelectedCell(
+            self.StartupCommandsTable.GetCommandIndex(position, command_idx),
+            col)
+
+    def GetMasterLocation(self):
+        return self.Controler.GetCurrentLocation()
+
+    def AddStartupCommand(self, position, index, subindex):
+        col = max(self.StartupCommandsGrid.GetGridCursorCol(), 0)
+        command = self.StartupCommandsDefaultValue.copy()
+        command["Position"] = position
+        command["Index"] = index
+        command["Subindex"] = subindex
+        command_idx = self.Controler.AppendStartupCommand(command)
+        self.RefreshStartupCommands()
+        self.RefreshBuffer()
+        self.SelectStartupCommand(position, command_idx, col)
+
+    def OnNodesFilterChanged(self, event):
+        self.RefreshCurrentNodesFilter()
+        if self.CurrentNodesFilter is not None:
+            self.RefreshProcessVariables()
+            self.RefreshStartupCommands()
+            self.NodesVariables.RefreshView()
+        event.Skip()
+
+    def OnNodesFilterKeyDown(self, event):
+        if self.NodesFilterFirstCharacter:
+            keycode = event.GetKeyCode()
+            if keycode not in [wx.WXK_RETURN,
+                               wx.WXK_NUMPAD_ENTER]:
+                self.NodesFilterFirstCharacter = False
+                if keycode not in NAVIGATION_KEYS:
+                    self.NodesFilter.SetValue("")
+            if keycode not in [wx.WXK_DELETE,
+                               wx.WXK_NUMPAD_DELETE,
+                               wx.WXK_BACK]:
+                event.Skip()
+        else:
+            event.Skip()
+
+    def OnProcessVariablesGridCellChange(self, event):
+        row, col = event.GetRow(), event.GetCol()
+        colname = self.ProcessVariablesTable.GetColLabelValue(col, False)
+        value = self.ProcessVariablesTable.GetValue(row, col)
+        message = None
+        if colname == "Name":
+            if not TestIdentifier(value):
+                message = _("\"%s\" is not a valid identifier!") % value
+            elif value.upper() in IEC_KEYWORDS:
+                message = _("\"%s\" is a keyword. It can't be used!") % value
+            elif value.upper() in [var["Name"].upper() for idx, var in enumerate(self.ProcessVariablesTable.GetData()) if idx != row]:
+                message = _("An variable named \"%s\" already exists!") % value
+        if message is None:
+            self.SaveProcessVariables()
+            wx.CallAfter(self.ProcessVariablesTable.ResetView, self.ProcessVariablesGrid)
+            event.Skip()
+        else:
+            dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
+            dialog.ShowModal()
+            dialog.Destroy()
+            event.Veto()
+
+    def OnProcessVariablesGridCellLeftClick(self, event):
+        row = event.GetRow()
+        if event.GetCol() == 0:
+            var_name = self.ProcessVariablesTable.GetValueByName(row, "Name")
+            var_type = self.Controler.GetSlaveVariableDataType(
+                *self.ProcessVariablesTable.GetValueByName(row, "ReadFrom"))
+            data_size = self.Controler.GetSizeOfType(var_type)
+            number = self.ProcessVariablesTable.GetValueByName(row, "Number")
+            location = "%%M%s" % data_size + \
+                       ".".join(map(str, self.Controler.GetCurrentLocation() + (number,)))
+
+            data = wx.TextDataObject(str((location, "location", var_type, var_name, "")))
+            dragSource = wx.DropSource(self.ProcessVariablesGrid)
+            dragSource.SetData(data)
+            dragSource.DoDragDrop()
+        event.Skip()
+
+    def OnProcessVariablesGridKeyDown(self, event):
+        keycode = event.GetKeyCode()
+        col = self.ProcessVariablesGrid.GetGridCursorCol()
+        row = self.ProcessVariablesGrid.GetGridCursorRow()
+        colname = self.ProcessVariablesTable.GetColLabelValue(col, False)
+        if keycode in (wx.WXK_DELETE, wx.WXK_NUMPAD_DELETE) and \
+           (colname.startswith("Read from") or colname.startswith("Write to")):
+            self.ProcessVariablesTable.SetValue(row, col, "")
+            self.SaveProcessVariables()
+            wx.CallAfter(self.ProcessVariablesTable.ResetView, self.ProcessVariablesGrid)
+        else:
+            event.Skip()
+
+    def OnStartupCommandsGridEditorShow(self, event):
+        self.CellShown = event.GetRow(), event.GetCol()
+        event.Skip()
+
+    def OnStartupCommandsGridCellChange(self, event):
+        row, col = event.GetRow(), event.GetCol()
+        if self.CellShown == (row, col):
+            self.CellShown = None
+            colname = self.StartupCommandsTable.GetColLabelValue(col, False)
+            value = self.StartupCommandsTable.GetValue(row, col)
+            message = None
+            if colname == "Position":
+                if value not in self.Controler.GetSlaves():
+                    message = _("No slave defined at position %d!") % value
+                old_value = self.StartupCommandsTable.GetOldValue()
+                command = self.StartupCommandsTable.GetRow(row)
+                if message is None and old_value != command["Position"]:
+                    self.Controler.RemoveStartupCommand(
+                        self.StartupCommandsTable.GetOldValue(),
+                        command["command_idx"], False)
+                    command_idx = self.Controler.AppendStartupCommand(command)
+                    wx.CallAfter(self.RefreshStartupCommands, command["Position"], command_idx)
+            else:
+                command = self.StartupCommandsTable.GetRow(row)
+                self.Controler.SetStartupCommandInfos(command)
+                if colname in ["Index", "SubIndex"]:
+                    wx.CallAfter(self.RefreshStartupCommands, command["Position"], command["command_idx"])
+            if message is None:
+                self.RefreshBuffer()
+                event.Skip()
+            else:
+                dialog = wx.MessageDialog(self, message, _("Error"), wx.OK | wx.ICON_ERROR)
+                dialog.ShowModal()
+                dialog.Destroy()
+                event.Veto()
+        else:
+            event.Veto()
+
+    def OnResize(self, event):
+        self.EthercatMasterEditor.GetBestSize()
+        xstart, ystart = self.EthercatMasterEditor.GetViewStart()
+        window_size = self.EthercatMasterEditor.GetClientSize()
+        maxx, maxy = self.EthercatMasterEditorSizer.GetMinSize()
+        posx = max(0, min(xstart, (maxx - window_size[0]) // SCROLLBAR_UNIT))
+        posy = max(0, min(ystart, (maxy - window_size[1]) // SCROLLBAR_UNIT))
+        self.EthercatMasterEditor.Scroll(posx, posy)
+        self.EthercatMasterEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
+                                                maxx // SCROLLBAR_UNIT,
+                                                maxy // SCROLLBAR_UNIT,
+                                                posx, posy)
+        event.Skip()
+
+    # def OnButtonClick(self, event):
+    #    self.MasterState = self.Controler.getMasterState()
+    #    if self.MasterState:
+    #        self.Phase.SetValue(self.MasterState["phase"])
+    #        self.Active.SetValue(self.MasterState["active"])
+    #        self.SlaveCount.SetValue(self.MasterState["slave"])
+    #        self.MacAddress.SetValue(self.MasterState["MAC"])
+    #        self.LinkState.SetValue(self.MasterState["link"])
+    #        self.TxFrames.SetValue(self.MasterState["TXframe"])
+    #        self.RxFrames.SetValue(self.MasterState["RXframe"])
+    #        self.TxByte.SetValue(self.MasterState["TXbyte"])
+    #        self.TxError.SetValue(self.MasterState["TXerror"])
+    #        self.LostFrames.SetValue(self.MasterState["lost"])
+
+    #        self.TxFrameRate1.SetValue(self.MasterState["TXframerate1"])
+    #        self.TxFrameRate2.SetValue(self.MasterState["TXframerate2"])
+    #        self.TxFrameRate3.SetValue(self.MasterState["TXframerate3"])
+    #        self.TxRate1.SetValue(self.MasterState["TXrate1"])
+    #        self.TxRate2.SetValue(self.MasterState["TXrate2"])
+    #        self.TxRate3.SetValue(self.MasterState["TXrate3"])
+    #        self.LossRate1.SetValue(self.MasterState["loss1"])
+    #        self.LossRate2.SetValue(self.MasterState["loss2"])
+    #        self.LossRate3.SetValue(self.MasterState["loss3"])
+    #        self.FrameLoss1.SetValue(self.MasterState["frameloss1"])
+    #        self.FrameLoss2.SetValue(self.MasterState["frameloss2"])
+    #        self.FrameLoss3.SetValue(self.MasterState["frameloss3"])
+
+
+class LibraryEditorSizer(wx.FlexGridSizer):
+
+    def __init__(self, parent, module_library, buttons):
+        wx.FlexGridSizer.__init__(self, cols=1, hgap=0, rows=4, vgap=5)
+
+        self.ModuleLibrary = module_library
+        self.ParentWindow = parent
+
+        self.AddGrowableCol(0)
+        self.AddGrowableRow(1)
+        self.AddGrowableRow(3)
+
+        ESI_files_label = wx.StaticText(parent,
+                                        label=_("ESI Files:"))
+        self.AddWindow(ESI_files_label, border=10,
+                       flag=wx.TOP | wx.LEFT | wx.RIGHT)
+
+        folder_tree_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=0)
+        folder_tree_sizer.AddGrowableCol(0)
+        folder_tree_sizer.AddGrowableRow(0)
+        self.AddSizer(folder_tree_sizer, border=10,
+                      flag=wx.GROW | wx.LEFT | wx.RIGHT)
+
+        self.ESIFiles = FolderTree(parent, self.GetPath(), editable=False)
+        self.ESIFiles.SetFilter(".xml")
+        folder_tree_sizer.AddWindow(self.ESIFiles, flag=wx.GROW)
+
+        buttons_sizer = wx.BoxSizer(wx.VERTICAL)
+        folder_tree_sizer.AddSizer(buttons_sizer,
+                                   flag=wx.ALIGN_CENTER_VERTICAL)
+
+        for idx, (name, bitmap, help, callback) in enumerate(buttons):
+            button = wx.lib.buttons.GenBitmapButton(parent,
+                                                    bitmap=GetBitmap(bitmap),
+                                                    size=wx.Size(28, 28),
+                                                    style=wx.NO_BORDER)
+            button.SetToolTipString(help)
+            setattr(self, name, button)
+            if idx > 0:
+                flag = wx.TOP
+            else:
+                flag = 0
+            if callback is None:
+                callback = getattr(self, "On" + name, None)
+            if callback is not None:
+                parent.Bind(wx.EVT_BUTTON, callback, button)
+            buttons_sizer.AddWindow(button, border=10, flag=flag)
+
+        modules_label = wx.StaticText(parent,
+                                      label=_("Modules library:"))
+        self.AddSizer(modules_label, border=10,
+                      flag=wx.LEFT | wx.RIGHT)
+
+        self.ModulesGrid = wx.gizmos.TreeListCtrl(parent,
+                                                  style=wx.TR_DEFAULT_STYLE |
+                                                  wx.TR_ROW_LINES |
+                                                  wx.TR_COLUMN_LINES |
+                                                  wx.TR_HIDE_ROOT |
+                                                  wx.TR_FULL_ROW_HIGHLIGHT)
+        self.ModulesGrid.GetMainWindow().Bind(wx.EVT_LEFT_DOWN,
+                                              self.OnModulesGridLeftDown)
+        self.ModulesGrid.Bind(wx.EVT_TREE_BEGIN_LABEL_EDIT,
+                              self.OnModulesGridBeginLabelEdit)
+        self.ModulesGrid.Bind(wx.EVT_TREE_END_LABEL_EDIT,
+                              self.OnModulesGridEndLabelEdit)
+        self.ModulesGrid.GetHeaderWindow().Bind(wx.EVT_MOTION,
+                                                self.OnModulesGridHeaderMotion)
+        self.AddWindow(self.ModulesGrid, border=10,
+                       flag=wx.GROW | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
+        for colname, colsize, colalign in zip(
+                [_("Name")] + [param_infos["column_label"]
+                               for _param, param_infos in
+                               self.ModuleLibrary.MODULES_EXTRA_PARAMS],
+                [400] + [param_infos["column_size"]
+                         for _param, param_infos in
+                         self.ModuleLibrary.MODULES_EXTRA_PARAMS],
+                [wx.ALIGN_LEFT] + [wx.ALIGN_RIGHT] * len(self.ModuleLibrary.MODULES_EXTRA_PARAMS)):
+            self.ModulesGrid.AddColumn(_(colname), colsize, colalign, edit=True)
+        self.ModulesGrid.SetMainColumn(0)
+
+        self.CurrentSelectedCol = None
+        self.LastToolTipCol = None
+
+    def GetPath(self):
+        return self.ModuleLibrary.GetPath()
+
+    def SetControlMinSize(self, size):
+        self.ESIFiles.SetMinSize(size)
+        self.ModulesGrid.SetMinSize(size)
+
+    def GetSelectedFilePath(self):
+        return self.ESIFiles.GetPath()
+
+    def RefreshView(self):
+        self.ESIFiles.RefreshTree()
+        self.RefreshModulesGrid()
+
+    def RefreshModulesGrid(self):
+        root = self.ModulesGrid.GetRootItem()
+        if not root.IsOk():
+            root = self.ModulesGrid.AddRoot("Modules")
+        self.GenerateModulesGridBranch(root,
+                                       self.ModuleLibrary.GetModulesLibrary(),
+                                       GetVariablesTableColnames())
+        self.ModulesGrid.Expand(root)
+
+    def GenerateModulesGridBranch(self, root, modules, colnames):
+        item, root_cookie = self.ModulesGrid.GetFirstChild(root)
+
+        no_more_items = not item.IsOk()
+        for module in modules:
+            if no_more_items:
+                item = self.ModulesGrid.AppendItem(root, "")
+            self.ModulesGrid.SetItemText(item, module["name"], 0)
+            if module["infos"] is not None:
+                for param_idx, (param, _param_infos) in enumerate(self.ModuleLibrary.MODULES_EXTRA_PARAMS):
+                    self.ModulesGrid.SetItemText(item,
+                                                 str(module["infos"][param]),
+                                                 param_idx + 1)
+            else:
+                self.ModulesGrid.SetItemBackgroundColour(item, wx.LIGHT_GREY)
+            self.ModulesGrid.SetItemPyData(item, module["infos"])
+            self.GenerateModulesGridBranch(item, module["children"], colnames)
+            if not no_more_items:
+                item, root_cookie = self.ModulesGrid.GetNextChild(root, root_cookie)
+                no_more_items = not item.IsOk()
+
+        if not no_more_items:
+            to_delete = []
+            while item.IsOk():
+                to_delete.append(item)
+                item, root_cookie = self.ModulesGrid.GetNextChild(root, root_cookie)
+            for item in to_delete:
+                self.ModulesGrid.Delete(item)
+
+    def OnImportButton(self, event):
+        dialog = wx.FileDialog(self.ParentWindow,
+                               _("Choose an XML file"),
+                               os.getcwd(), "",
+                               _("XML files (*.xml)|*.xml|All files|*.*"),
+                               wx.OPEN)
+
+        if dialog.ShowModal() == wx.ID_OK:
+            filepath = dialog.GetPath()
+            if self.ModuleLibrary.ImportModuleLibrary(filepath):
+                wx.CallAfter(self.RefreshView)
+            else:
+                message = wx.MessageDialog(self,
+                                           _("No such XML file: %s\n") % filepath,
+                                           _("Error"),
+                                           wx.OK | wx.ICON_ERROR)
+                message.ShowModal()
+                message.Destroy()
+        dialog.Destroy()
+
+        event.Skip()
+
+    def OnDeleteButton(self, event):
+        filepath = self.GetSelectedFilePath()
+        if os.path.isfile(filepath):
+            _folder, filename = os.path.split(filepath)
+
+            dialog = wx.MessageDialog(self.ParentWindow,
+                                      _("Do you really want to delete the file '%s'?") % filename,
+                                      _("Delete File"),
+                                      wx.YES_NO | wx.ICON_QUESTION)
+            remove = dialog.ShowModal() == wx.ID_YES
+            dialog.Destroy()
+
+            if remove:
+                os.remove(filepath)
+                self.ModuleLibrary.LoadModules()
+                wx.CallAfter(self.RefreshView)
+        event.Skip()
+
+    def OnModulesGridLeftDown(self, event):
+        item, _flags, col = self.ModulesGrid.HitTest(event.GetPosition())
+        if item.IsOk():
+            entry_infos = self.ModulesGrid.GetItemPyData(item)
+            if entry_infos is not None and col > 0:
+                self.CurrentSelectedCol = col
+            else:
+                self.CurrentSelectedCol = None
+        else:
+            self.CurrentSelectedCol = None
+        event.Skip()
+
+    def OnModulesGridBeginLabelEdit(self, event):
+        item = event.GetItem()
+        if item.IsOk():
+            entry_infos = self.ModulesGrid.GetItemPyData(item)
+            if entry_infos is not None:
+                event.Skip()
+            else:
+                event.Veto()
+        else:
+            event.Veto()
+
+    def OnModulesGridEndLabelEdit(self, event):
+        item = event.GetItem()
+        if item.IsOk() and self.CurrentSelectedCol is not None:
+            entry_infos = self.ModulesGrid.GetItemPyData(item)
+            if entry_infos is not None and self.CurrentSelectedCol > 0:
+                param, param_infos = self.ModuleLibrary.MODULES_EXTRA_PARAMS[self.CurrentSelectedCol - 1]
+                stripped_column_label = param_infos["column_label"].split('(')[0].strip()
+                try:
+                    self.ModuleLibrary.SetModuleExtraParam(
+                        entry_infos["vendor"],
+                        entry_infos["product_code"],
+                        entry_infos["revision_number"],
+                        param,
+                        int(event.GetLabel()))
+                    wx.CallAfter(self.RefreshModulesGrid)
+                    event.Skip()
+                except ValueError:
+                    message = wx.MessageDialog(self,
+                                               _("Module %s must be an integer!") % stripped_column_label,
+                                               _("Error"),
+                                               wx.OK | wx.ICON_ERROR)
+                    message.ShowModal()
+                    message.Destroy()
+                    event.Veto()
+            else:
+                event.Veto()
+        else:
+            event.Veto()
+
+    def OnModulesGridHeaderMotion(self, event):
+        _item, _flags, col = self.ModulesGrid.HitTest(event.GetPosition())
+        if col != self.LastToolTipCol and self.LastToolTipCol is not None:
+            self.ModulesGrid.GetHeaderWindow().SetToolTip(None)
+            self.LastToolTipCol = None
+        if col > 0 and self.LastToolTipCol != col:
+            self.LastToolTipCol = col
+            _param, param_infos = self.ModuleLibrary.MODULES_EXTRA_PARAMS[col - 1]
+            wx.CallAfter(self.ModulesGrid.GetHeaderWindow().SetToolTipString,
+                         param_infos["description"])
+        event.Skip()
+
+
+class DatabaseManagementDialog(wx.Dialog):
+
+    def __init__(self, parent, database):
+        wx.Dialog.__init__(self, parent,
+                           size=wx.Size(700, 500),
+                           title=_('ESI Files Database management'),
+                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
+
+        main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
+        main_sizer.AddGrowableCol(0)
+        main_sizer.AddGrowableRow(0)
+
+        self.DatabaseSizer = LibraryEditorSizer(
+            self, database,
+            [
+                ("ImportButton", "ImportESI", _("Import file to ESI files database"), None),
+                ("DeleteButton", "remove_element", _("Remove file from database"), None)
+            ])
+        self.DatabaseSizer.SetControlMinSize(wx.Size(0, 0))
+        main_sizer.AddSizer(self.DatabaseSizer, border=10,
+                            flag=wx.GROW | wx.TOP | wx.LEFT | wx.RIGHT)
+
+        button_sizer = self.CreateButtonSizer(wx.OK | wx.CANCEL | wx.CENTRE)
+        button_sizer.GetAffirmativeButton().SetLabel(_("Add file to project"))
+        button_sizer.GetCancelButton().SetLabel(_("Close"))
+        main_sizer.AddSizer(button_sizer, border=10,
+                            flag=wx.ALIGN_RIGHT | wx.BOTTOM | wx.LEFT | wx.RIGHT)
+
+        self.SetSizer(main_sizer)
+
+        self.DatabaseSizer.RefreshView()
+
+    def GetValue(self):
+        return self.DatabaseSizer.GetSelectedFilePath()
+
+
+class LibraryEditor(ConfTreeNodeEditor):
+
+    CONFNODEEDITOR_TABS = [
+        (_("Modules Library"), "_create_ModuleLibraryEditor")]
+
+    def _create_ModuleLibraryEditor(self, prnt):
+        self.ModuleLibraryEditor = wx.ScrolledWindow(prnt,
+                                                     style=wx.TAB_TRAVERSAL | wx.HSCROLL | wx.VSCROLL)
+        self.ModuleLibraryEditor.Bind(wx.EVT_SIZE, self.OnResize)
+
+        self.ModuleLibrarySizer = LibraryEditorSizer(
+            self.ModuleLibraryEditor,
+            self.Controler.GetModulesLibraryInstance(),
+            [
+                ("ImportButton", "ImportESI", _("Import ESI file"), None),
+                ("AddButton", "ImportDatabase", _("Add file from ESI files database"), self.OnAddButton),
+                ("DeleteButton", "remove_element", _("Remove file from library"), None)
+            ])
+        self.ModuleLibrarySizer.SetControlMinSize(wx.Size(0, 200))
+        self.ModuleLibraryEditor.SetSizer(self.ModuleLibrarySizer)
+
+        return self.ModuleLibraryEditor
+
+    def __init__(self, parent, controler, window):
+        ConfTreeNodeEditor.__init__(self, parent, controler, window)
+
+        self.RefreshView()
+
+    def RefreshView(self):
+        ConfTreeNodeEditor.RefreshView(self)
+        self.ModuleLibrarySizer.RefreshView()
+
+    def OnAddButton(self, event):
+        dialog = DatabaseManagementDialog(self,
+                                          self.Controler.GetModulesDatabaseInstance())
+
+        if dialog.ShowModal() == wx.ID_OK:
+            module_library = self.Controler.GetModulesLibraryInstance()
+            module_library.ImportModuleLibrary(dialog.GetValue())
+
+        dialog.Destroy()
+
+        wx.CallAfter(self.ModuleLibrarySizer.RefreshView)
+
+        event.Skip()
+
+    def OnResize(self, event):
+        self.ModuleLibraryEditor.GetBestSize()
+        xstart, ystart = self.ModuleLibraryEditor.GetViewStart()
+        window_size = self.ModuleLibraryEditor.GetClientSize()
+        maxx, maxy = self.ModuleLibraryEditor.GetMinSize()
+        posx = max(0, min(xstart, (maxx - window_size[0]) // SCROLLBAR_UNIT))
+        posy = max(0, min(ystart, (maxy - window_size[1]) // SCROLLBAR_UNIT))
+        self.ModuleLibraryEditor.Scroll(posx, posy)
+        self.ModuleLibraryEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
+                                               maxx // SCROLLBAR_UNIT,
+                                               maxy // SCROLLBAR_UNIT,
+                                               posx, posy)
+        event.Skip()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/EtherCATBase.xsd	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,654 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSpy v2006 sp2 U (http://www.altova.com) by Beckmann (BECKHOFF Automation GmbH) -->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+	<xs:complexType name="AccessType">
+		<xs:simpleContent>
+			<xs:extension base="xs:NMTOKEN">
+				<xs:attribute name="ReadRestrictions">
+					<xs:simpleType>
+						<xs:restriction base="xs:NMTOKEN">
+							<xs:enumeration value="PreOp"/>
+							<xs:enumeration value="PreOP_SafeOP"/>
+							<xs:enumeration value="PreOP_OP"/>
+							<xs:enumeration value="SafeOP"/>
+							<xs:enumeration value="SafeOP_OP"/>
+							<xs:enumeration value="OP"/>
+						</xs:restriction>
+					</xs:simpleType>
+				</xs:attribute>
+				<xs:attribute name="WriteRestrictions">
+					<xs:simpleType>
+						<xs:restriction base="xs:NMTOKEN">
+							<xs:enumeration value="PreOp"/>
+							<xs:enumeration value="PreOP_SafeOP"/>
+							<xs:enumeration value="PreOP_OP"/>
+							<xs:enumeration value="SafeOP"/>
+							<xs:enumeration value="SafeOP_OP"/>
+							<xs:enumeration value="OP"/>
+						</xs:restriction>
+					</xs:simpleType>
+				</xs:attribute>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<xs:complexType name="ArrayInfoType">
+		<xs:sequence>
+			<xs:element name="LBound" type="xs:integer"/>
+			<xs:element name="Elements" type="xs:integer"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="DataTypeType">
+		<xs:sequence>
+			<xs:element name="Index" type="HexDecValue" minOccurs="0"/>
+			<xs:element name="Name" type="xs:string"/>
+			<xs:element name="BaseType" type="xs:string" minOccurs="0"/>
+			<xs:element name="Comment" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="BitSize" type="xs:int"/>
+			<xs:choice minOccurs="0">
+				<xs:element name="ArrayInfo" type="ArrayInfoType" minOccurs="0" maxOccurs="3"/>
+				<xs:element name="SubItem" type="SubItemType" minOccurs="0" maxOccurs="unbounded"/>
+				<xs:element name="EnumInfo" type="EnumInfoType" minOccurs="0" maxOccurs="unbounded"/>
+			</xs:choice>
+			<xs:element name="Properties" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="Property" type="PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Xml" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="PropertyType">
+		<xs:sequence>
+			<xs:element name="Name" type="xs:string"/>
+			<xs:element name="Value" type="xs:string" minOccurs="0"/>
+			<xs:element name="Desc" type="NameType" minOccurs="0"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="SubItemType">
+		<xs:sequence>
+			<xs:element name="SubIdx" type="HexDecValue" minOccurs="0"/>
+			<xs:element name="Name" type="xs:string"/>
+			<xs:element name="DisplayName" type="NameType" minOccurs="0" maxOccurs="unbounded">
+				<xs:annotation>
+					<xs:documentation>for future use</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="Type" type="xs:string"/>
+			<xs:element name="Comment" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="BitSize" type="xs:int"/>
+			<xs:element name="BitOffs" type="xs:int"/>
+			<xs:choice minOccurs="0">
+				<xs:element name="DefaultString" type="xs:string" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>obsolete</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="DefaultData" type="xs:hexBinary" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>obsolete</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:sequence minOccurs="0">
+					<xs:element name="MinValue" type="HexDecValue" minOccurs="0">
+						<xs:annotation>
+							<xs:documentation>obsolete</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+					<xs:element name="MaxValue" type="HexDecValue" minOccurs="0">
+						<xs:annotation>
+							<xs:documentation>obsolete</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+					<xs:element name="DefaultValue" type="HexDecValue" minOccurs="0">
+						<xs:annotation>
+							<xs:documentation>obsolete</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+				</xs:sequence>
+			</xs:choice>
+			<xs:element name="Flags" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="Access" minOccurs="0">
+							<xs:complexType>
+								<xs:simpleContent>
+									<xs:restriction base="AccessType">
+										<xs:pattern value="ro"/>
+										<xs:pattern value="rw"/>
+										<xs:pattern value="wo"/>
+									</xs:restriction>
+								</xs:simpleContent>
+							</xs:complexType>
+						</xs:element>
+						<xs:element name="Category" minOccurs="0">
+							<xs:simpleType>
+								<xs:restriction base="xs:NMTOKEN">
+									<xs:enumeration value="m"/>
+									<xs:enumeration value="o"/>
+									<xs:enumeration value="c"/>
+								</xs:restriction>
+							</xs:simpleType>
+						</xs:element>
+						<xs:element name="PdoMapping" minOccurs="0">
+							<xs:simpleType>
+								<xs:restriction base="xs:NMTOKEN">
+									<xs:enumeration value="T"/>
+									<xs:enumeration value="R"/>
+									<xs:enumeration value="TR"/>
+									<xs:enumeration value="RT"/>
+									<xs:enumeration value="t"/>
+									<xs:enumeration value="r"/>
+									<xs:enumeration value="tr"/>
+									<xs:enumeration value="rt"/>
+								</xs:restriction>
+							</xs:simpleType>
+						</xs:element>
+						<xs:element name="SafetyMapping" minOccurs="0">
+							<xs:simpleType>
+								<xs:restriction base="xs:NMTOKEN">
+									<xs:enumeration value="si"/>
+									<xs:enumeration value="SI"/>
+									<xs:enumeration value="so"/>
+									<xs:enumeration value="SO"/>
+									<xs:enumeration value="sio"/>
+									<xs:enumeration value="SIO"/>
+									<xs:enumeration value="sp"/>
+									<xs:enumeration value="SP"/>
+								</xs:restriction>
+							</xs:simpleType>
+						</xs:element>
+						<xs:element name="Attribute" type="HexDecValue" minOccurs="0"/>
+						<xs:element name="Backup" type="xs:int" minOccurs="0"/>
+						<xs:element name="Setting" type="xs:int" minOccurs="0"/>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Property" type="PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="Xml" minOccurs="0">
+				<xs:annotation>
+					<xs:documentation>obsolete</xs:documentation>
+				</xs:annotation>
+				<xs:complexType>
+					<xs:sequence>
+						<xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="EnumInfoType">
+		<xs:sequence>
+			<xs:element name="Text" type="NameType" maxOccurs="unbounded"/>
+			<xs:element name="Enum" type="xs:int"/>
+			<xs:element name="Comment" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="NameType">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attribute name="LcId" type="xs:integer" use="optional" default="1033"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<xs:complexType name="DictionaryType">
+		<xs:sequence>
+			<xs:element name="DataTypes" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="DataType" type="DataTypeType" minOccurs="0" maxOccurs="unbounded">
+							<xs:key name="SubItemKey">
+								<xs:selector xpath="./SubItem"/>
+								<xs:field xpath="Name"/>
+							</xs:key>
+						</xs:element>
+					</xs:sequence>
+				</xs:complexType>
+				<xs:key name="DataTypeKey">
+					<xs:selector xpath="./DataType"/>
+					<xs:field xpath="Name"/>
+				</xs:key>
+				<xs:keyref name="BaseTypeRef" refer="DataTypeKey">
+					<xs:selector xpath="./DataType"/>
+					<xs:field xpath="BaseType"/>
+				</xs:keyref>
+				<xs:keyref name="SubItemTypeRef" refer="DataTypeKey">
+					<xs:selector xpath="./DataType/SubItem"/>
+					<xs:field xpath="Type"/>
+				</xs:keyref>
+			</xs:element>
+			<xs:element name="Objects">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="Object" type="ObjectType" minOccurs="0" maxOccurs="unbounded"/>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:simpleType name="HexDecValue">
+		<xs:restriction base="xs:string">
+			<xs:pattern value="[+-]?[0-9]{1,}"/>
+			<xs:pattern value="#x[0-9|a-f|A-F]{1,}"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:complexType name="ObjectType">
+		<xs:sequence>
+			<xs:element name="Index">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="HexDecValue">
+							<xs:attribute name="DependOnSlot" type="xs:boolean" use="optional"/>
+							<xs:attribute name="DependOnSlotGroup" type="xs:boolean" use="optional"/>
+							<xs:attribute name="OverwrittenByModule" type="xs:boolean" use="optional"/>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Name" type="NameType" maxOccurs="unbounded"/>
+			<xs:element name="Comment" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="Type" type="xs:string"/>
+			<xs:element name="BitSize" type="xs:int"/>
+			<xs:element name="Info" type="ObjectInfoType" minOccurs="0"/>
+			<xs:element name="Flags" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="Access" minOccurs="0">
+							<xs:complexType>
+								<xs:simpleContent>
+									<xs:restriction base="AccessType">
+										<xs:pattern value="ro"/>
+										<xs:pattern value="rw"/>
+										<xs:pattern value="wo"/>
+									</xs:restriction>
+								</xs:simpleContent>
+							</xs:complexType>
+						</xs:element>
+						<xs:element name="Category" minOccurs="0">
+							<xs:simpleType>
+								<xs:restriction base="xs:NMTOKEN">
+									<xs:enumeration value="m"/>
+									<xs:enumeration value="o"/>
+									<xs:enumeration value="c"/>
+								</xs:restriction>
+							</xs:simpleType>
+						</xs:element>
+						<xs:element name="PdoMapping" minOccurs="0">
+							<xs:simpleType>
+								<xs:restriction base="xs:NMTOKEN">
+									<xs:enumeration value="T"/>
+									<xs:enumeration value="R"/>
+									<xs:enumeration value="TR"/>
+									<xs:enumeration value="RT"/>
+									<xs:enumeration value="t"/>
+									<xs:enumeration value="r"/>
+									<xs:enumeration value="tr"/>
+									<xs:enumeration value="rt"/>
+								</xs:restriction>
+							</xs:simpleType>
+						</xs:element>
+						<xs:element name="SafetyMapping" minOccurs="0">
+							<xs:simpleType>
+								<xs:restriction base="xs:NMTOKEN">
+									<xs:enumeration value="si"/>
+									<xs:enumeration value="SI"/>
+									<xs:enumeration value="so"/>
+									<xs:enumeration value="SO"/>
+									<xs:enumeration value="sio"/>
+									<xs:enumeration value="SIO"/>
+									<xs:enumeration value="sp"/>
+									<xs:enumeration value="SP"/>
+								</xs:restriction>
+							</xs:simpleType>
+						</xs:element>
+						<xs:element name="Attribute" type="HexDecValue" minOccurs="0"/>
+						<xs:element name="Transition" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>obsolete</xs:documentation>
+							</xs:annotation>
+							<xs:simpleType>
+								<xs:restriction base="xs:NMTOKEN">
+									<xs:enumeration value="IP"/>
+									<xs:enumeration value="PS"/>
+									<xs:enumeration value="SO"/>
+								</xs:restriction>
+							</xs:simpleType>
+						</xs:element>
+						<xs:element name="SdoAccess" minOccurs="0">
+							<xs:simpleType>
+								<xs:restriction base="xs:NMTOKEN">
+									<xs:enumeration value="CompleteAccess"/>
+									<xs:enumeration value="SubIndexAccess"/>
+								</xs:restriction>
+							</xs:simpleType>
+						</xs:element>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Properties" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="Property" type="PropertyType" minOccurs="0" maxOccurs="unbounded"/>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Xml" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ObjectInfoType">
+		<xs:sequence minOccurs="0">
+			<xs:choice>
+				<xs:element name="DefaultString" type="xs:string" minOccurs="0"/>
+				<xs:sequence minOccurs="0">
+					<xs:element name="MinData" type="xs:hexBinary" minOccurs="0"/>
+					<xs:element name="MaxData" type="xs:hexBinary" minOccurs="0"/>
+					<xs:element name="DefaultData" type="xs:hexBinary" minOccurs="0"/>
+				</xs:sequence>
+				<xs:sequence minOccurs="0">
+					<xs:element name="MinValue" type="HexDecValue" minOccurs="0"/>
+					<xs:element name="MaxValue" type="HexDecValue" minOccurs="0"/>
+					<xs:element name="DefaultValue" type="HexDecValue" minOccurs="0"/>
+				</xs:sequence>
+				<xs:element name="SubItem" minOccurs="0" maxOccurs="unbounded">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="Name" type="xs:string"/>
+							<xs:element name="Info" type="ObjectInfoType"/>
+						</xs:sequence>
+					</xs:complexType>
+				</xs:element>
+			</xs:choice>
+			<xs:element name="Unit" type="HexDecValue" minOccurs="0"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="EntryType">
+		<xs:sequence>
+			<xs:element name="Index">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="HexDecValue">
+							<xs:attribute name="DependOnSlot" type="xs:boolean" use="optional"/>
+							<xs:attribute name="DependOnSlotGroup" type="xs:boolean" use="optional"/>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="SubIndex" type="HexDecValue" minOccurs="0"/>
+			<xs:element name="BitLen" type="xs:int"/>
+			<xs:element name="Name" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+			<xs:element name="DataType" minOccurs="0">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="xs:string">
+							<xs:attribute name="DScale" use="optional">
+								<xs:simpleType>
+									<xs:restriction base="xs:string">
+										<xs:enumeration value="+/-10"/>
+										<xs:enumeration value="0-10"/>
+										<xs:enumeration value="0-20"/>
+										<xs:enumeration value="4-20"/>
+										<xs:enumeration value="0.1°"/>
+										<xs:enumeration value="0-10(16)"/>
+										<xs:enumeration value="0-20(16)"/>
+										<xs:enumeration value="4-20(16)"/>
+										<xs:enumeration value="0.01°"/>
+										<xs:enumeration value="0-5"/>
+										<xs:enumeration value="0-30"/>
+										<xs:enumeration value="0-50"/>
+										<xs:enumeration value="+/-5"/>
+										<xs:enumeration value="+/-2.5"/>
+										<xs:enumeration value="+/-100"/>
+										<xs:enumeration value="0-5(16)"/>
+										<xs:enumeration value="0-30(16)"/>
+										<xs:enumeration value="0-50(16)"/>
+										<xs:enumeration value="+/-75mV"/>
+									</xs:restriction>
+								</xs:simpleType>
+							</xs:attribute>
+							<xs:attribute name="SwapData" use="optional">
+								<xs:simpleType>
+									<xs:restriction base="xs:NMTOKEN">
+										<xs:enumeration value="Swap_HB_LB"/>
+										<xs:enumeration value="Swap_HW_LW"/>
+										<xs:enumeration value="Swap_HB_LB_HW_LW"/>
+									</xs:restriction>
+								</xs:simpleType>
+							</xs:attribute>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="PdoType">
+		<xs:sequence>
+			<xs:element name="Index">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="HexDecValue">
+							<xs:attribute name="DependOnSlot" type="xs:boolean" use="optional"/>
+							<xs:attribute name="DependOnSlotGroup" type="xs:boolean" use="optional"/>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Name" type="NameType" maxOccurs="unbounded"/>
+			<xs:element name="Exclude" minOccurs="0" maxOccurs="unbounded">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="HexDecValue">
+							<xs:attribute name="DependOnSlot" type="xs:boolean" use="optional"/>
+							<xs:attribute name="DependOnSlotGroup" type="xs:boolean" use="optional"/>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Entry" minOccurs="0" maxOccurs="unbounded">
+				<xs:complexType>
+					<xs:complexContent>
+						<xs:extension base="EntryType">
+							<xs:attribute name="Fixed" type="xs:boolean" use="optional"/>
+						</xs:extension>
+					</xs:complexContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="ExcludedSm" type="xs:int" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+		<xs:attribute name="Fixed" type="xs:boolean" use="optional"/>
+		<xs:attribute name="Mandatory" type="xs:boolean" use="optional"/>
+		<xs:attribute name="Virtual" type="xs:boolean" use="optional"/>
+		<xs:attribute name="Sm" type="xs:int" use="optional"/>
+		<xs:attribute name="Su" type="xs:int" use="optional"/>
+		<xs:attribute name="PdoOrder" type="xs:int" use="optional">
+			<xs:annotation>
+				<xs:documentation>obsolete</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="OSFac" type="xs:int" use="optional"/>
+		<xs:attribute name="OSMin" type="xs:int" use="optional"/>
+		<xs:attribute name="OSMax" type="xs:int" use="optional"/>
+		<xs:attribute name="OSIndexInc" type="xs:int" use="optional"/>
+		<xs:attribute name="OverwrittenByModule" type="xs:boolean" use="optional"/>
+	</xs:complexType>
+	<xs:complexType name="VendorSpecificType">
+		<xs:sequence>
+			<xs:any namespace="##any" processContents="skip" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ProfileType">
+		<xs:sequence>
+			<xs:element name="ProfileNo" type="xs:int" minOccurs="0"/>
+			<xs:element name="AddInfo" type="xs:int" minOccurs="0"/>
+			<xs:choice minOccurs="0">
+				<xs:element name="ChannelCount" type="xs:int"/>
+				<xs:element name="ChannelInfo" maxOccurs="unbounded">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="ProfileNo" type="xs:int"/>
+							<xs:element name="AddInfo" type="xs:int" minOccurs="0"/>
+							<xs:element name="DisplayName" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+						</xs:sequence>
+						<xs:attribute name="OverwrittenByModule" type="xs:boolean" use="optional"/>
+					</xs:complexType>
+				</xs:element>
+			</xs:choice>
+			<xs:choice minOccurs="0">
+				<xs:element name="DictionaryFile" type="xs:string" minOccurs="0"/>
+				<xs:element name="Dictionary" type="DictionaryType" minOccurs="0">
+					<xs:keyref name="ObjectTypesRef" refer="DataTypesKey">
+						<xs:selector xpath="./Objects/Object"/>
+						<xs:field xpath="Type"/>
+					</xs:keyref>
+					<xs:key name="DataTypesKey">
+						<xs:selector xpath="./DataTypes/DataType"/>
+						<xs:field xpath="Name"/>
+					</xs:key>
+				</xs:element>
+			</xs:choice>
+			<xs:element name="DiagMessages" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="DiagMessage" maxOccurs="unbounded">
+							<xs:complexType>
+								<xs:sequence>
+									<xs:element name="TextId" type="HexDecValue"/>
+									<xs:element name="MessageText" type="NameType" maxOccurs="unbounded"/>
+								</xs:sequence>
+							</xs:complexType>
+						</xs:element>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="VendorSpecific" type="VendorSpecificType" minOccurs="0"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="VendorType">
+		<xs:sequence>
+			<xs:element name="Id" type="HexDecValue"/>
+			<xs:element name="Name" type="NameType" maxOccurs="unbounded"/>
+			<xs:element name="Comment" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="URL" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="DescriptionURL" type="xs:string" minOccurs="0"/>
+			<xs:choice>
+				<xs:element name="Image16x14" type="xs:string" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>obsolete</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="ImageFile16x14" type="xs:string" minOccurs="0"/>
+				<xs:element name="ImageData16x14" type="xs:hexBinary" minOccurs="0"/>
+			</xs:choice>
+			<xs:element name="VendorSpecific" type="VendorSpecificType" minOccurs="0"/>
+		</xs:sequence>
+		<xs:attribute name="UniqueName" type="xs:string" use="optional">
+			<xs:annotation>
+				<xs:documentation>obsolete</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+	</xs:complexType>
+	<xs:complexType name="ModuleType">
+		<xs:sequence>
+			<xs:element name="Type">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="xs:string">
+							<xs:attribute name="ModuleIdent" type="HexDecValue" use="required"/>
+							<xs:attribute name="ModuleClass" type="xs:string" use="optional"/>
+							<xs:attribute name="ModulePdoGroup" type="xs:int" use="optional"/>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Name" type="NameType" maxOccurs="unbounded"/>
+			<xs:element name="RxPdo" type="PdoType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="TxPdo" type="PdoType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="SafetyParaMapping" type="PdoType" minOccurs="0"/>
+			<xs:element name="Mailbox" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="CoE" minOccurs="0">
+							<xs:complexType>
+								<xs:sequence>
+									<xs:element name="InitCmd" minOccurs="0" maxOccurs="unbounded">
+										<xs:complexType>
+											<xs:sequence>
+												<xs:element name="Transition" maxOccurs="unbounded">
+													<xs:simpleType>
+														<xs:restriction base="xs:NMTOKEN">
+															<xs:enumeration value="PS"/>
+															<xs:enumeration value="SO"/>
+															<xs:enumeration value="SP"/>
+															<xs:enumeration value="OP"/>
+															<xs:enumeration value="OS"/>
+														</xs:restriction>
+													</xs:simpleType>
+												</xs:element>
+												<xs:element name="Index">
+													<xs:complexType>
+														<xs:simpleContent>
+															<xs:extension base="HexDecValue">
+																<xs:attribute name="DependOnSlot" type="xs:boolean" use="optional"/>
+																<xs:attribute name="DependOnSlotGroup" type="xs:boolean" use="optional"/>
+															</xs:extension>
+														</xs:simpleContent>
+													</xs:complexType>
+												</xs:element>
+												<xs:element name="SubIndex" type="HexDecValue"/>
+												<xs:element name="Data">
+													<xs:complexType>
+														<xs:simpleContent>
+															<xs:extension base="xs:hexBinary">
+																<xs:attribute name="AdaptAutomatically" type="xs:boolean" use="optional"/>
+															</xs:extension>
+														</xs:simpleContent>
+													</xs:complexType>
+												</xs:element>
+												<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+											</xs:sequence>
+											<xs:attribute name="Fixed" type="xs:boolean" use="optional"/>
+											<xs:attribute name="CompleteAccess" type="xs:boolean" use="optional"/>
+										</xs:complexType>
+									</xs:element>
+								</xs:sequence>
+								<xs:attribute name="SdoInfo" type="xs:boolean" use="optional"/>
+								<xs:attribute name="PdoAssign" type="xs:boolean" use="optional"/>
+								<xs:attribute name="PdoConfig" type="xs:boolean" use="optional"/>
+								<xs:attribute name="PdoUpload" type="xs:boolean" use="optional"/>
+								<xs:attribute name="CompleteAccess" type="xs:boolean" use="optional"/>
+								<xs:attribute name="EdsFile" type="xs:string" use="optional"/>
+								<xs:attribute name="SegmentedSdo" type="xs:boolean" use="optional"/>
+								<xs:attribute name="ModuleOD" type="xs:boolean" use="optional"/>
+							</xs:complexType>
+						</xs:element>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Profile" type="ProfileType" minOccurs="0"/>
+			<xs:element name="DcOpModeName" type="xs:string" minOccurs="0"/>
+			<xs:choice minOccurs="0">
+				<xs:element name="Image16x14" type="xs:string" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>obsolete</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="ImageFile16x14" type="xs:string" minOccurs="0"/>
+				<xs:element name="ImageData16x14" type="xs:hexBinary" minOccurs="0"/>
+			</xs:choice>
+			<xs:element name="VendorSpecific" type="VendorSpecificType" minOccurs="0"/>
+		</xs:sequence>
+	</xs:complexType>
+</xs:schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/EtherCATConfig.xsd	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,1122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+	<xs:element name="EtherCATConfig">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="Config">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="Master">
+								<xs:annotation>
+									<xs:documentation>Description of the master </xs:documentation>
+								</xs:annotation>
+								<xs:complexType>
+									<xs:sequence>
+										<xs:element name="Info">
+											<xs:annotation>
+												<xs:documentation>General information abaout the master</xs:documentation>
+											</xs:annotation>
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="Name" type="xs:string">
+														<xs:annotation>
+															<xs:documentation>name of the master</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="Destination" type="xs:hexBinary">
+														<xs:annotation>
+															<xs:documentation>destination MAC address</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="Source" type="xs:hexBinary">
+														<xs:annotation>
+															<xs:documentation>source MAC address</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="EtherType" type="xs:hexBinary" minOccurs="0">
+														<xs:annotation>
+															<xs:documentation>Ether type.</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+												</xs:sequence>
+											</xs:complexType>
+										</xs:element>
+										<xs:element name="MailboxStates" minOccurs="0">
+											<xs:annotation>
+												<xs:documentation>If this tag exists the master checks the mailbox of one or more slaves for new messages during the cylcic process data communication.</xs:documentation>
+											</xs:annotation>
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="StartAddr" type="xs:int">
+														<xs:annotation>
+															<xs:documentation>Start address of the logical address area, that is configured to the written bit of the input mailibox sync manager. In the cyclic frame the master will then include a LRD command with laddr = StartAddr.</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="Count" type="xs:int">
+														<xs:annotation>
+															<xs:documentation>Number of slave devices of which the state of the mailbox is tested by the master.</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+												</xs:sequence>
+											</xs:complexType>
+										</xs:element>
+										<xs:element name="EoE" minOccurs="0">
+											<xs:annotation>
+												<xs:documentation>Ethernet over EtherCAT settings</xs:documentation>
+											</xs:annotation>
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="MaxPorts" type="xs:int"/>
+													<xs:element name="MaxFrames" type="xs:int"/>
+													<xs:element name="MaxMACs" type="xs:int"/>
+												</xs:sequence>
+											</xs:complexType>
+										</xs:element>
+										<xs:element name="InitCmds" minOccurs="0">
+											<xs:annotation>
+												<xs:documentation>Initialization commands that are directed at all slaves.</xs:documentation>
+											</xs:annotation>
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="InitCmd" type="ECatCmdType" minOccurs="0" maxOccurs="unbounded"/>
+												</xs:sequence>
+											</xs:complexType>
+										</xs:element>
+									</xs:sequence>
+								</xs:complexType>
+							</xs:element>
+							<xs:element name="Slave" minOccurs="0" maxOccurs="unbounded">
+								<xs:annotation>
+									<xs:documentation>Description of one or more EtherCAT slave devices.</xs:documentation>
+								</xs:annotation>
+								<xs:complexType>
+									<xs:sequence>
+										<xs:element name="Info">
+											<xs:annotation>
+												<xs:documentation>General information about the EtherCAT slave device</xs:documentation>
+											</xs:annotation>
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="Name" type="xs:string">
+														<xs:annotation>
+															<xs:documentation>Name of  the slave device. </xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:sequence minOccurs="0">
+														<xs:annotation>
+															<xs:documentation>Slave device has EtherCAT Slave Controller</xs:documentation>
+														</xs:annotation>
+														<xs:element name="PhysAddr" type="xs:int">
+															<xs:annotation>
+																<xs:documentation>Fixed EtherCAT address of the slave device.</xs:documentation>
+															</xs:annotation>
+														</xs:element>
+														<xs:element name="AutoIncAddr" type="xs:int">
+															<xs:annotation>
+																<xs:documentation>Auto Increment address of the slave device.</xs:documentation>
+															</xs:annotation>
+														</xs:element>
+														<xs:element name="Physics" type="PhysicsType">
+															<xs:annotation>
+																<xs:documentation>Physics at the individual ports(A,B,C,D) of the slave.</xs:documentation>
+															</xs:annotation>
+														</xs:element>
+													</xs:sequence>
+													<xs:element name="VendorId" type="xs:int">
+														<xs:annotation>
+															<xs:documentation>EtherCAT VendorId. VendorId, ProductCode and RevisionNo are used to identify a specific slave.</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="ProductCode" type="xs:int"/>
+													<xs:element name="RevisionNo" type="xs:int"/>
+													<xs:element name="SerialNo" type="xs:int"/>
+													<xs:element name="ProductRevision" type="xs:string" minOccurs="0">
+														<xs:annotation>
+															<xs:documentation>User friendly name generated from ProductCode  and RevisionNo with the help of a vendor specific algorithmn</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+												</xs:sequence>
+											</xs:complexType>
+										</xs:element>
+										<xs:element name="ProcessData" minOccurs="0">
+											<xs:annotation>
+												<xs:documentation>Description of the process data of this slave</xs:documentation>
+											</xs:annotation>
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="Send" minOccurs="0" maxOccurs="unbounded">
+														<xs:annotation>
+															<xs:documentation>Description of the output process data</xs:documentation>
+														</xs:annotation>
+														<xs:complexType>
+															<xs:sequence>
+																<xs:element name="BitStart" type="xs:int">
+																	<xs:annotation>
+																		<xs:documentation>Start address of the process data of this slave in the output image of the master</xs:documentation>
+																	</xs:annotation>
+																</xs:element>
+																<xs:element name="BitLength" type="xs:int">
+																	<xs:annotation>
+																		<xs:documentation>Length of the send process data</xs:documentation>
+																	</xs:annotation>
+																</xs:element>
+															</xs:sequence>
+														</xs:complexType>
+													</xs:element>
+													<xs:element name="Recv" minOccurs="0" maxOccurs="unbounded">
+														<xs:annotation>
+															<xs:documentation>Description of the input process data</xs:documentation>
+														</xs:annotation>
+														<xs:complexType>
+															<xs:sequence>
+																<xs:element name="BitStart" type="xs:int">
+																	<xs:annotation>
+																		<xs:documentation>Start address of the process data of this slave in the inpute image of the master</xs:documentation>
+																	</xs:annotation>
+																</xs:element>
+																<xs:element name="BitLength" type="xs:int">
+																	<xs:annotation>
+																		<xs:documentation>Length of the recv process data</xs:documentation>
+																	</xs:annotation>
+																</xs:element>
+															</xs:sequence>
+														</xs:complexType>
+													</xs:element>
+													<xs:element name="Sm0" type="SyncManagerSettings" minOccurs="0">
+														<xs:annotation>
+															<xs:documentation>Settings of sync manager 0</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="Sm1" type="SyncManagerSettings" minOccurs="0">
+														<xs:annotation>
+															<xs:documentation>Settings of sync manager 1</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="Sm2" type="SyncManagerSettings" minOccurs="0">
+														<xs:annotation>
+															<xs:documentation>Settings of sync manager 2</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="Sm3" type="SyncManagerSettings" minOccurs="0">
+														<xs:annotation>
+															<xs:documentation>Settings of sync manager 3</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:choice minOccurs="0" maxOccurs="unbounded">
+														<xs:element name="RxPdo" type="PdoType">
+															<xs:annotation>
+																<xs:documentation>Ouput Pdos</xs:documentation>
+															</xs:annotation>
+														</xs:element>
+														<xs:element name="TxPdo" type="PdoType">
+															<xs:annotation>
+																<xs:documentation>Input Pdos</xs:documentation>
+															</xs:annotation>
+														</xs:element>
+													</xs:choice>
+												</xs:sequence>
+											</xs:complexType>
+										</xs:element>
+										<xs:element name="Mailbox" minOccurs="0">
+											<xs:annotation>
+												<xs:documentation>Mailbox settings</xs:documentation>
+											</xs:annotation>
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="Send" type="MailboxSendInfoType">
+														<xs:annotation>
+															<xs:documentation>Output mailbox settings</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="Recv" type="MailboxRecvInfoType">
+														<xs:annotation>
+															<xs:documentation>Input mailbox settings</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="BootStrap" minOccurs="0">
+														<xs:complexType>
+															<xs:sequence>
+																<xs:element name="Send" type="MailboxSendInfoType">
+																	<xs:annotation>
+																		<xs:documentation>Output mailbox settings for bootstrap state</xs:documentation>
+																	</xs:annotation>
+																</xs:element>
+																<xs:element name="Recv" type="MailboxRecvInfoType">
+																	<xs:annotation>
+																		<xs:documentation>Input mailbox settings for bootstrap state</xs:documentation>
+																	</xs:annotation>
+																</xs:element>
+															</xs:sequence>
+														</xs:complexType>
+													</xs:element>
+													<xs:element name="Protocol" minOccurs="0" maxOccurs="unbounded">
+														<xs:annotation>
+															<xs:documentation>Supported protocols</xs:documentation>
+														</xs:annotation>
+														<xs:simpleType>
+															<xs:restriction base="xs:NMTOKEN">
+																<xs:enumeration value="AoE"/>
+																<xs:enumeration value="EoE"/>
+																<xs:enumeration value="CoE"/>
+																<xs:enumeration value="SoE"/>
+																<xs:enumeration value="FoE"/>
+																<xs:enumeration value="VoE"/>
+															</xs:restriction>
+														</xs:simpleType>
+													</xs:element>
+													<xs:element name="CoE" minOccurs="0">
+														<xs:complexType>
+															<xs:sequence>
+																<xs:element name="InitCmds" minOccurs="0">
+																	<xs:complexType>
+																		<xs:sequence>
+																			<xs:element name="InitCmd" minOccurs="0" maxOccurs="unbounded">
+																				<xs:annotation>
+																					<xs:documentation>SDO download cmds</xs:documentation>
+																				</xs:annotation>
+																				<xs:complexType>
+																					<xs:sequence>
+																						<xs:element name="Transition" type="TransitionType" maxOccurs="unbounded">
+																							<xs:annotation>
+																								<xs:documentation>init cmd will be send at the defined transitions</xs:documentation>
+																							</xs:annotation>
+																						</xs:element>
+																						<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+																						<xs:element name="Timeout" type="xs:int">
+																							<xs:annotation>
+																								<xs:documentation>Timeout in ms</xs:documentation>
+																							</xs:annotation>
+																						</xs:element>
+																						<xs:element name="Ccs" type="xs:int"/>
+																						<xs:element name="Index" type="xs:int">
+																							<xs:annotation>
+																								<xs:documentation>SDO index</xs:documentation>
+																							</xs:annotation>
+																						</xs:element>
+																						<xs:element name="SubIndex" type="xs:int">
+																							<xs:annotation>
+																								<xs:documentation>SDO subindex</xs:documentation>
+																							</xs:annotation>
+																						</xs:element>
+																						<xs:element name="Data" type="xs:hexBinary" minOccurs="0">
+																							<xs:annotation>
+																								<xs:documentation>SDO data</xs:documentation>
+																							</xs:annotation>
+																						</xs:element>
+																						<xs:element name="Disabled" type="xs:boolean" minOccurs="0">
+																							<xs:annotation>
+																								<xs:documentation>If true the init command should not be sent</xs:documentation>
+																							</xs:annotation>
+																						</xs:element>
+																					</xs:sequence>
+																					<xs:attribute name="Fixed" type="xs:boolean" use="optional"/>
+																					<xs:attribute name="CompleteAccess" type="xs:boolean" use="optional"/>
+																				</xs:complexType>
+																			</xs:element>
+																		</xs:sequence>
+																	</xs:complexType>
+																</xs:element>
+																<xs:element name="Profile" type="ProfileType" minOccurs="0"/>
+															</xs:sequence>
+														</xs:complexType>
+													</xs:element>
+													<xs:element name="SoE" minOccurs="0">
+														<xs:complexType>
+															<xs:sequence>
+																<xs:element name="InitCmds" minOccurs="0">
+																	<xs:complexType>
+																		<xs:sequence>
+																			<xs:element name="InitCmd" minOccurs="0" maxOccurs="unbounded">
+																				<xs:annotation>
+																					<xs:documentation>service channel write req</xs:documentation>
+																				</xs:annotation>
+																				<xs:complexType>
+																					<xs:sequence>
+																						<xs:element name="Transition" maxOccurs="unbounded">
+																							<xs:annotation>
+																								<xs:documentation>init cmd will be send at the defined transitions</xs:documentation>
+																							</xs:annotation>
+																							<xs:simpleType>
+																								<xs:restriction base="xs:NMTOKEN">
+																									<xs:enumeration value="PS"/>
+																									<xs:enumeration value="SO"/>
+																									<xs:enumeration value="SP"/>
+																									<xs:enumeration value="OP"/>
+																									<xs:enumeration value="OS"/>
+																								</xs:restriction>
+																							</xs:simpleType>
+																						</xs:element>
+																						<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+																						<xs:element name="Timeout" type="xs:int">
+																							<xs:annotation>
+																								<xs:documentation>Timeout in ms</xs:documentation>
+																							</xs:annotation>
+																						</xs:element>
+																						<xs:element name="OpCode" type="xs:int">
+																							<xs:annotation>
+																								<xs:documentation>Op Code</xs:documentation>
+																							</xs:annotation>
+																						</xs:element>
+																						<xs:element name="DriveNo" type="xs:int">
+																							<xs:annotation>
+																								<xs:documentation>Drive number</xs:documentation>
+																							</xs:annotation>
+																						</xs:element>
+																						<xs:element name="IDN" type="xs:int">
+																							<xs:annotation>
+																								<xs:documentation>IDN to write</xs:documentation>
+																							</xs:annotation>
+																						</xs:element>
+																						<xs:element name="Elements" type="xs:int"/>
+																						<xs:element name="Attribute" type="xs:int"/>
+																						<xs:element name="Data" type="xs:hexBinary" minOccurs="0">
+																							<xs:annotation>
+																								<xs:documentation>data to write</xs:documentation>
+																							</xs:annotation>
+																						</xs:element>
+																						<xs:element name="Disabled" type="xs:boolean" minOccurs="0">
+																							<xs:annotation>
+																								<xs:documentation>If true the init command should not be sent</xs:documentation>
+																							</xs:annotation>
+																						</xs:element>
+																					</xs:sequence>
+																					<xs:attribute name="Fixed" type="xs:boolean" use="optional" default="0"/>
+																				</xs:complexType>
+																			</xs:element>
+																		</xs:sequence>
+																	</xs:complexType>
+																</xs:element>
+															</xs:sequence>
+														</xs:complexType>
+													</xs:element>
+													<xs:element name="AoE" minOccurs="0">
+														<xs:complexType>
+															<xs:sequence>
+																<xs:element name="InitCmds" minOccurs="0">
+																	<xs:complexType>
+																		<xs:sequence>
+																			<xs:element name="InitCmd" type="MailboxCmdType" minOccurs="0" maxOccurs="unbounded"/>
+																		</xs:sequence>
+																	</xs:complexType>
+																</xs:element>
+																<xs:element name="NetId" type="xs:string" minOccurs="0"/>
+															</xs:sequence>
+														</xs:complexType>
+													</xs:element>
+													<xs:element name="EoE" minOccurs="0">
+														<xs:complexType>
+															<xs:sequence>
+																<xs:element name="InitCmds" minOccurs="0">
+																	<xs:complexType>
+																		<xs:sequence>
+																			<xs:element name="InitCmd" type="MailboxCmdType" minOccurs="0" maxOccurs="unbounded"/>
+																		</xs:sequence>
+																	</xs:complexType>
+																</xs:element>
+															</xs:sequence>
+														</xs:complexType>
+													</xs:element>
+													<xs:element name="FoE" minOccurs="0">
+														<xs:complexType>
+															<xs:sequence>
+																<xs:element name="InitCmds" minOccurs="0">
+																	<xs:complexType>
+																		<xs:sequence>
+																			<xs:element name="InitCmd" type="MailboxCmdType" minOccurs="0" maxOccurs="unbounded"/>
+																		</xs:sequence>
+																	</xs:complexType>
+																</xs:element>
+															</xs:sequence>
+														</xs:complexType>
+													</xs:element>
+													<xs:element name="VoE" minOccurs="0">
+														<xs:complexType>
+															<xs:sequence>
+																<xs:element name="InitCmds" minOccurs="0">
+																	<xs:complexType>
+																		<xs:sequence>
+																			<xs:element name="InitCmd" type="MailboxCmdType" minOccurs="0" maxOccurs="unbounded"/>
+																		</xs:sequence>
+																	</xs:complexType>
+																</xs:element>
+															</xs:sequence>
+														</xs:complexType>
+													</xs:element>
+												</xs:sequence>
+												<xs:attribute name="DataLinkLayer" type="xs:boolean"/>
+											</xs:complexType>
+										</xs:element>
+										<xs:element name="InitCmds" minOccurs="0">
+											<xs:annotation>
+												<xs:documentation>Initialization commands that are necessary for the slave device to run-up.</xs:documentation>
+											</xs:annotation>
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="InitCmd" type="ECatCmdType" minOccurs="0" maxOccurs="unbounded"/>
+												</xs:sequence>
+											</xs:complexType>
+										</xs:element>
+										<xs:element name="PreviousPort" minOccurs="0" maxOccurs="unbounded">
+											<xs:annotation>
+												<xs:documentation>Possible previous port. The current previous port is set with the Selected attribute</xs:documentation>
+											</xs:annotation>
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="DeviceId" type="xs:int" minOccurs="0">
+														<xs:annotation>
+															<xs:documentation>deprecated</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="Port">
+														<xs:annotation>
+															<xs:documentation>Port of the previous slave device this device is connected to</xs:documentation>
+														</xs:annotation>
+														<xs:simpleType>
+															<xs:restriction base="xs:NMTOKEN">
+																<xs:enumeration value="B"/>
+																<xs:enumeration value="C"/>
+																<xs:enumeration value="D"/>
+															</xs:restriction>
+														</xs:simpleType>
+													</xs:element>
+													<xs:element name="PhysAddr" type="xs:int" minOccurs="0">
+														<xs:annotation>
+															<xs:documentation>Fixed EtherCAT Address of slave device</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+												</xs:sequence>
+												<xs:attribute name="Selected" type="xs:int" use="optional" default="0"/>
+											</xs:complexType>
+										</xs:element>
+										<xs:element name="HotConnect" minOccurs="0">
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="GroupMemberCnt" type="xs:int"/>
+													<xs:element name="IdentifyCmd" type="ECatCmdType" maxOccurs="unbounded"/>
+												</xs:sequence>
+											</xs:complexType>
+										</xs:element>
+										<xs:element name="DC" minOccurs="0">
+											<xs:annotation>
+												<xs:documentation>Distributed clock settings</xs:documentation>
+											</xs:annotation>
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="ReferenceClock" type="xs:boolean">
+														<xs:annotation>
+															<xs:documentation>Determines if this device is the reference clock</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="CycleTime0" type="xs:int"/>
+													<xs:element name="CycleTime1" type="xs:int"/>
+													<xs:element name="ShiftTime" type="xs:int"/>
+												</xs:sequence>
+											</xs:complexType>
+										</xs:element>
+									</xs:sequence>
+								</xs:complexType>
+							</xs:element>
+							<xs:element name="Cyclic" minOccurs="0" maxOccurs="unbounded">
+								<xs:annotation>
+									<xs:documentation>Cycles in which frames are sent</xs:documentation>
+								</xs:annotation>
+								<xs:complexType>
+									<xs:sequence>
+										<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+										<xs:element name="CycleTime" type="xs:int" minOccurs="0">
+											<xs:annotation>
+												<xs:documentation>Cycle time of the task sending the frames</xs:documentation>
+											</xs:annotation>
+										</xs:element>
+										<xs:element name="Priority" type="xs:int" minOccurs="0">
+											<xs:annotation>
+												<xs:documentation>Priority of the task sending the frames</xs:documentation>
+											</xs:annotation>
+										</xs:element>
+										<xs:element name="TaskId" type="xs:string" minOccurs="0">
+											<xs:annotation>
+												<xs:documentation>Id of the task sending the frames</xs:documentation>
+											</xs:annotation>
+										</xs:element>
+										<xs:element name="Frame" maxOccurs="unbounded">
+											<xs:annotation>
+												<xs:documentation>Frames to be sent in this cycle</xs:documentation>
+											</xs:annotation>
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+													<xs:element name="Cmd" maxOccurs="unbounded">
+														<xs:annotation>
+															<xs:documentation>EtherCAT sub command</xs:documentation>
+														</xs:annotation>
+														<xs:complexType>
+															<xs:sequence>
+																<xs:element name="State" maxOccurs="4">
+																	<xs:annotation>
+																		<xs:documentation>Master state the command should be sent in. If the command should not be sent in the current master state one can either remove this command form the frame or set Cmd to Nop.</xs:documentation>
+																	</xs:annotation>
+																	<xs:simpleType>
+																		<xs:restriction base="xs:NMTOKEN">
+																			<xs:enumeration value="INIT"/>
+																			<xs:enumeration value="PREOP"/>
+																			<xs:enumeration value="SAFEOP"/>
+																			<xs:enumeration value="OP"/>
+																		</xs:restriction>
+																	</xs:simpleType>
+																</xs:element>
+																<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+																<xs:element name="Cmd" type="xs:int"/>
+																<xs:choice>
+																	<xs:sequence>
+																		<xs:element name="Adp" type="xs:int" minOccurs="0">
+																			<xs:annotation>
+																				<xs:documentation>Adress position. Either Auto Increment Address or fixed EtherCAT Address</xs:documentation>
+																			</xs:annotation>
+																		</xs:element>
+																		<xs:element name="Ado" type="xs:int">
+																			<xs:annotation>
+																				<xs:documentation>Offset in DPRAM of the EtherCAT Slave Controller</xs:documentation>
+																			</xs:annotation>
+																		</xs:element>
+																	</xs:sequence>
+																	<xs:element name="Addr" type="xs:int">
+																		<xs:annotation>
+																			<xs:documentation>Logical Address</xs:documentation>
+																		</xs:annotation>
+																	</xs:element>
+																</xs:choice>
+																<xs:choice>
+																	<xs:element name="Data" type="xs:hexBinary">
+																		<xs:annotation>
+																			<xs:documentation>Data that should sent</xs:documentation>
+																		</xs:annotation>
+																	</xs:element>
+																	<xs:element name="DataLength" type="xs:int">
+																		<xs:annotation>
+																			<xs:documentation>Length of the data that should be sent. The data is then filled with 0.</xs:documentation>
+																		</xs:annotation>
+																	</xs:element>
+																</xs:choice>
+																<xs:element name="Cnt" type="xs:int" minOccurs="0">
+																	<xs:annotation>
+																		<xs:documentation>Expected working counter.</xs:documentation>
+																	</xs:annotation>
+																</xs:element>
+																<xs:element name="InputOffs" type="xs:int">
+																	<xs:annotation>
+																		<xs:documentation>Offset in the input image</xs:documentation>
+																	</xs:annotation>
+																</xs:element>
+																<xs:element name="OutputOffs" type="xs:int">
+																	<xs:annotation>
+																		<xs:documentation>Offset in the output image</xs:documentation>
+																	</xs:annotation>
+																</xs:element>
+																<xs:element name="CopyInfos" type="CopyInfosType" minOccurs="0">
+																	<xs:annotation>
+																		<xs:documentation>Copy information for slave to slave communication. The master has to copy valid input data of this command from the source offest (bit offs in the complete process image) to a destination offset.</xs:documentation>
+																	</xs:annotation>
+																</xs:element>
+															</xs:sequence>
+														</xs:complexType>
+													</xs:element>
+												</xs:sequence>
+											</xs:complexType>
+										</xs:element>
+									</xs:sequence>
+								</xs:complexType>
+							</xs:element>
+							<xs:element name="ProcessImage" minOccurs="0">
+								<xs:annotation>
+									<xs:documentation>Description of the process image of the master</xs:documentation>
+								</xs:annotation>
+								<xs:complexType>
+									<xs:sequence>
+										<xs:element name="Inputs" minOccurs="0">
+											<xs:annotation>
+												<xs:documentation>Input process image of the master</xs:documentation>
+											</xs:annotation>
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="ByteSize" type="xs:int">
+														<xs:annotation>
+															<xs:documentation>Size of the input image</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="Variable" type="VariableType" minOccurs="0" maxOccurs="unbounded">
+														<xs:annotation>
+															<xs:documentation>Input variables</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+												</xs:sequence>
+											</xs:complexType>
+										</xs:element>
+										<xs:element name="Outputs" minOccurs="0">
+											<xs:annotation>
+												<xs:documentation>Output process image of the master</xs:documentation>
+											</xs:annotation>
+											<xs:complexType>
+												<xs:sequence>
+													<xs:element name="ByteSize" type="xs:int">
+														<xs:annotation>
+															<xs:documentation>Size of the output image</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+													<xs:element name="Variable" type="VariableType" minOccurs="0" maxOccurs="unbounded">
+														<xs:annotation>
+															<xs:documentation>Output variables</xs:documentation>
+														</xs:annotation>
+													</xs:element>
+												</xs:sequence>
+											</xs:complexType>
+										</xs:element>
+									</xs:sequence>
+								</xs:complexType>
+							</xs:element>
+						</xs:sequence>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attribute name="Version" type="xs:string" use="optional">
+				<xs:annotation>
+					<xs:documentation>Schema version (actual 1.3)</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+		</xs:complexType>
+	</xs:element>
+	<xs:complexType name="ECatCmdType">
+		<xs:sequence>
+			<xs:element name="Transition" type="TransitionType" minOccurs="0" maxOccurs="unbounded">
+				<xs:annotation>
+					<xs:documentation>Transition this command should be sent in</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="BeforeSlave" type="xs:boolean" minOccurs="0">
+				<xs:annotation>
+					<xs:documentation>If BeforeSlave is true this command will be sent before the slave init commands defined for this transition</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+			<xs:element name="Requires" minOccurs="0">
+				<xs:annotation>
+					<xs:documentation>If Requires is set to cycle, this command has to be sent in a seperate cycle. If Requires is set to cycle, this command has to be sent in a seperate frame. </xs:documentation>
+				</xs:annotation>
+				<xs:simpleType>
+					<xs:restriction base="xs:NMTOKEN">
+						<xs:enumeration value="frame"/>
+						<xs:enumeration value="cycle"/>
+					</xs:restriction>
+				</xs:simpleType>
+			</xs:element>
+			<xs:element name="Cmd" type="xs:int">
+				<xs:annotation>
+					<xs:documentation>EtherCAT Command Id</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:choice>
+				<xs:sequence>
+					<xs:element name="Adp" type="xs:int" minOccurs="0">
+						<xs:annotation>
+							<xs:documentation>Adress position. Either Auto Increment Address or fixed EtherCAT Address</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+					<xs:element name="Ado" type="xs:int">
+						<xs:annotation>
+							<xs:documentation>Offset in DPRAM of the EtherCAT Slave Controller</xs:documentation>
+						</xs:annotation>
+					</xs:element>
+				</xs:sequence>
+				<xs:element name="Addr" type="xs:int">
+					<xs:annotation>
+						<xs:documentation>Logical Address</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:choice>
+			<xs:choice>
+				<xs:element name="Data" type="xs:hexBinary">
+					<xs:annotation>
+						<xs:documentation>Data that should sent</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="DataLength" type="xs:int">
+					<xs:annotation>
+						<xs:documentation>Length of the data that should be sent. The data is then filled with 0.</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+			</xs:choice>
+			<xs:element name="Cnt" type="xs:int" minOccurs="0">
+				<xs:annotation>
+					<xs:documentation>Expected working counter. If the returned working counter is not equal to this value the init command fails.</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="Retries" type="xs:int" minOccurs="0">
+				<xs:annotation>
+					<xs:documentation>Defines how many times the master should retry sending the command before the init command fails.</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="Validate" minOccurs="0">
+				<xs:annotation>
+					<xs:documentation>If validate is set the returned data has to be validated by the master.</xs:documentation>
+				</xs:annotation>
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="Data" type="xs:hexBinary">
+							<xs:annotation>
+								<xs:documentation>Binary data with which the returned data has to be compared with.</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="DataMask" type="xs:hexBinary" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>If a data mask is set, the returned data and the data mask is combined with an AND operatore, before comparing the data.</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="Timeout" type="xs:int">
+							<xs:annotation>
+								<xs:documentation>Timeout in ms. Determis how long the master retries to read out the date, if the validation has failed.</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="SyncManagerSettings">
+		<xs:sequence>
+			<xs:element name="Type">
+				<xs:annotation>
+					<xs:documentation>Type of Sync Manager (e.g. Outputs)</xs:documentation>
+				</xs:annotation>
+				<xs:simpleType>
+					<xs:restriction base="xs:NMTOKEN">
+						<xs:enumeration value="MBoxOut"/>
+						<xs:enumeration value="MBoxIn"/>
+						<xs:enumeration value="Outputs"/>
+						<xs:enumeration value="Inputs"/>
+					</xs:restriction>
+				</xs:simpleType>
+			</xs:element>
+			<xs:element name="MinSize" type="xs:int" minOccurs="0"/>
+			<xs:element name="MaxSize" type="xs:int" minOccurs="0"/>
+			<xs:element name="DefaultSize" type="xs:int" minOccurs="0"/>
+			<xs:element name="StartAddress" type="xs:int"/>
+			<xs:element name="ControlByte" type="xs:int"/>
+			<xs:element name="Enable" type="xs:boolean"/>
+			<xs:element name="Virtual" type="xs:boolean" minOccurs="0"/>
+			<xs:element name="Watchdog" type="xs:int" minOccurs="0">
+				<xs:annotation>
+					<xs:documentation>Watchdog setting of the sync manager</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="Pdo" type="xs:int" minOccurs="0" maxOccurs="unbounded">
+				<xs:annotation>
+					<xs:documentation>Pdo indices</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:simpleType name="HexDecValue">
+		<xs:restriction base="xs:string">
+			<xs:pattern value="[+-]?[0-9]{1,}"/>
+			<xs:pattern value="#x[0-9|a-f|A-F]{1,}"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:complexType name="NameType">
+		<xs:simpleContent>
+			<xs:extension base="xs:string">
+				<xs:attribute name="LcId" type="xs:integer" default="1033"/>
+			</xs:extension>
+		</xs:simpleContent>
+	</xs:complexType>
+	<xs:complexType name="PdoType">
+		<xs:sequence>
+			<xs:element name="Index">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="HexDecValue">
+							<xs:attribute name="DependOnSlot" type="xs:boolean">
+								<xs:annotation>
+									<xs:documentation>The index of the PDO will be adapted depend on the slot number and the SlotPdoIncrement value in the Slots-part of the device description</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+							<xs:attribute name="DependOnSlotGroup" type="xs:boolean">
+								<xs:annotation>
+									<xs:documentation>The index of the PDO will be adapted depend on the slot group number and the SlotGroupPdoIncrement value in the Slots-part of the device description</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Name" type="NameType" maxOccurs="unbounded"/>
+			<xs:element name="Exclude" minOccurs="0" maxOccurs="unbounded">
+				<xs:annotation>
+					<xs:documentation>List of pdo indicies that are excluded if this pdo is in sync manager</xs:documentation>
+				</xs:annotation>
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="HexDecValue">
+							<xs:attribute name="DependOnSlot" type="xs:boolean">
+								<xs:annotation>
+									<xs:documentation>The index of the Exclude PDO will be adapted depend on the slot number and the SlotPdoIncrement value in the Slots-part of the device description</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+							<xs:attribute name="DependOnSlotGroup" type="xs:boolean">
+								<xs:annotation>
+									<xs:documentation>The index of the Exclude-PDO will be adapted depend on the slot group number and the SlotPdoIncrement value in the Slots-part of the device description</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Entry" minOccurs="0" maxOccurs="unbounded">
+				<xs:complexType>
+					<xs:complexContent>
+						<xs:extension base="EntryType">
+							<xs:attribute name="Fixed" type="xs:boolean"/>
+						</xs:extension>
+					</xs:complexContent>
+				</xs:complexType>
+			</xs:element>
+		</xs:sequence>
+		<xs:attribute name="Fixed" type="xs:boolean" use="optional">
+			<xs:annotation>
+				<xs:documentation>pdo is not configurable</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="Mandatory" type="xs:boolean" use="optional">
+			<xs:annotation>
+				<xs:documentation>pdo must be configured in a sync manager</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="Virtual" type="xs:boolean" use="optional">
+			<xs:annotation>
+				<xs:documentation>pdo will be configured internally (based on the configured variables)</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="Sm" type="xs:int" use="optional">
+			<xs:annotation>
+				<xs:documentation>default sync manager for this pdo (if set, this PDO will be include in the process image)</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="Su" type="xs:int" use="optional">
+			<xs:annotation>
+				<xs:documentation>default sync unit for this pdo</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="PdoOrder" type="xs:int" use="optional"/>
+		<xs:attribute name="OSFac" type="xs:int" use="optional">
+			<xs:annotation>
+				<xs:documentation>default oversampling factor</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="OSMin" type="xs:int" use="optional">
+			<xs:annotation>
+				<xs:documentation>min. oversampling factor</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="OSMax" type="xs:int" use="optional">
+			<xs:annotation>
+				<xs:documentation>max. oversampling factor</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="OSIndexInc" type="xs:int" use="optional">
+			<xs:annotation>
+				<xs:documentation>oversampling increment for entry indicies</xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+		<xs:attribute name="OverwrittenByModule" type="xs:boolean">
+			<xs:annotation>
+				<xs:documentation>If this attribute is True, the PDO shall not be considered if the configurator supports the modular device description because this PDO will be defined via the module definition (only for configurators supporting V1.3). </xs:documentation>
+			</xs:annotation>
+		</xs:attribute>
+	</xs:complexType>
+	<xs:complexType name="EntryType">
+		<xs:sequence>
+			<xs:element name="Index">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="HexDecValue">
+							<xs:attribute name="DependOnSlot" type="xs:boolean">
+								<xs:annotation>
+									<xs:documentation>The index will be adapted depend on the slot number and the SlotIndexIncrement value in the Slots-part of the device description</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+							<xs:attribute name="DependOnSlotGroup" type="xs:boolean">
+								<xs:annotation>
+									<xs:documentation>The index will be adapted depend on the slot group number and the SlotGroupIndexIncrement value in the Slots-part of the device description</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="SubIndex" type="HexDecValue" minOccurs="0">
+				<xs:annotation>
+					<xs:documentation>Default value = 0</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="BitLen" type="xs:int"/>
+			<xs:element name="Name" type="NameType" minOccurs="0" maxOccurs="unbounded">
+				<xs:annotation>
+					<xs:documentation>Name is mandatory if Index != 0</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+			<xs:element name="DataType" minOccurs="0">
+				<xs:annotation>
+					<xs:documentation>DataType is mandatory if Index != 0</xs:documentation>
+				</xs:annotation>
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="xs:string">
+							<xs:attribute name="DScale" use="optional">
+								<xs:simpleType>
+									<xs:restriction base="xs:string">
+										<xs:enumeration value="+/-10"/>
+										<xs:enumeration value="0-10"/>
+										<xs:enumeration value="0-20"/>
+										<xs:enumeration value="4-20"/>
+										<xs:enumeration value="0.1°"/>
+									</xs:restriction>
+								</xs:simpleType>
+							</xs:attribute>
+							<xs:attribute name="SwapData" type="xs:boolean" use="optional">
+								<xs:annotation>
+									<xs:documentation>1 = swap hi and lo bytes; 2 = swap hi and lo words; 3 =  swap both</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:simpleType name="TransitionType">
+		<xs:restriction base="xs:NMTOKEN">
+			<xs:enumeration value="II"/>
+			<xs:enumeration value="IP"/>
+			<xs:enumeration value="PP"/>
+			<xs:enumeration value="PO"/>
+			<xs:enumeration value="PS"/>
+			<xs:enumeration value="PI"/>
+			<xs:enumeration value="SS"/>
+			<xs:enumeration value="SP"/>
+			<xs:enumeration value="SO"/>
+			<xs:enumeration value="SI"/>
+			<xs:enumeration value="OS"/>
+			<xs:enumeration value="OP"/>
+			<xs:enumeration value="OI"/>
+			<xs:enumeration value="IB"/>
+			<xs:enumeration value="BI"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:complexType name="VariableType">
+		<xs:sequence>
+			<xs:element name="Name" type="xs:string">
+				<xs:annotation>
+					<xs:documentation>Name of the variable</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+			<xs:element name="DataType" type="xs:string" minOccurs="0">
+				<xs:annotation>
+					<xs:documentation>Datatype of the variable</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="BitSize" type="xs:int">
+				<xs:annotation>
+					<xs:documentation>Size of the variable in bits</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="BitOffs" type="xs:int">
+				<xs:annotation>
+					<xs:documentation>Bit offset of the variable in the image</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="VendorSpecificType">
+		<xs:sequence>
+			<xs:any namespace="##any" processContents="skip" maxOccurs="unbounded"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="ProfileType">
+		<xs:sequence>
+			<xs:element name="ChannelInfo" maxOccurs="unbounded">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="ProfileNo" type="xs:int"/>
+						<xs:element name="AddInfo" type="xs:string" minOccurs="0"/>
+						<xs:element name="DisplayName" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+					</xs:sequence>
+					<xs:attribute name="OverwrittenByModule" type="xs:boolean">
+						<xs:annotation>
+							<xs:documentation>If this attribute is True, the object shall not be considered if the configurator supports the modular device description because this object will be defined via the module definition (only for configurators supporting V1.3). </xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="VendorSpecific" type="VendorSpecificType" minOccurs="0"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:simpleType name="PhysicsType">
+		<xs:restriction base="xs:string">
+			<xs:pattern value="[Y,K, ,B]{0,4}"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:complexType name="MailboxCmdType">
+		<xs:sequence>
+			<xs:element name="Transition" type="TransitionType" maxOccurs="unbounded">
+				<xs:annotation>
+					<xs:documentation>init cmd will be send at the defined transitions</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+			<xs:element name="Timeout" type="xs:int">
+				<xs:annotation>
+					<xs:documentation>Timeout in ms</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="Data" type="xs:hexBinary">
+				<xs:annotation>
+					<xs:documentation>data of the mailbox cmd (excl. the mailbox)</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+			<xs:element name="Disabled" type="xs:boolean" minOccurs="0">
+				<xs:annotation>
+					<xs:documentation>If true the init command should not be sent</xs:documentation>
+				</xs:annotation>
+			</xs:element>
+		</xs:sequence>
+		<xs:attribute name="Fixed" type="xs:boolean" use="optional" default="0"/>
+	</xs:complexType>
+	<xs:complexType name="MailboxSendInfoType">
+		<xs:sequence>
+			<xs:element name="Start" type="xs:int"/>
+			<xs:element name="Length" type="xs:int"/>
+			<xs:element name="ShortSend" type="xs:boolean" minOccurs="0"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="MailboxRecvInfoType">
+		<xs:sequence>
+			<xs:element name="Start" type="xs:int"/>
+			<xs:element name="Length" type="xs:int"/>
+			<xs:element name="PollTime" type="xs:int" minOccurs="0"/>
+			<xs:element name="StatusBitAddr" type="xs:int" minOccurs="0"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="CopyInfosType">
+		<xs:sequence>
+			<xs:element name="CopyInfo" minOccurs="0" maxOccurs="unbounded">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="SrcBitOffs" type="HexDecValue"/>
+						<xs:element name="DstBitOffs" type="HexDecValue"/>
+						<xs:element name="BitSize" type="HexDecValue"/>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+		</xs:sequence>
+	</xs:complexType>
+</xs:schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/EtherCATInfo.xsd	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,955 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+	<xs:include schemaLocation="EtherCATBase.xsd"/>
+	<xs:element name="EtherCATInfo">
+		<xs:complexType>
+			<xs:sequence>
+				<xs:element name="InfoReference" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+				<xs:element name="Vendor">
+					<xs:complexType>
+						<xs:complexContent>
+							<xs:extension base="VendorType">
+								<xs:attribute name="FileVersion" type="xs:int"/>
+							</xs:extension>
+						</xs:complexContent>
+					</xs:complexType>
+				</xs:element>
+				<xs:element name="Descriptions">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="Groups">
+								<xs:complexType>
+									<xs:sequence>
+										<xs:element name="Group" minOccurs="0" maxOccurs="unbounded">
+											<xs:complexType>
+												<xs:complexContent>
+													<xs:extension base="GroupType">
+														<xs:attribute name="SortOrder" type="xs:int">
+															<xs:annotation>
+																<xs:documentation>Helps to display multiple groups in the order intended by the vendor</xs:documentation>
+															</xs:annotation>
+														</xs:attribute>
+														<xs:attribute name="ParentGroup" type="xs:string">
+															<xs:annotation>
+																<xs:documentation>Type of an optional parent group - only for additional display order possibilities</xs:documentation>
+															</xs:annotation>
+														</xs:attribute>
+													</xs:extension>
+												</xs:complexContent>
+											</xs:complexType>
+										</xs:element>
+									</xs:sequence>
+								</xs:complexType>
+							</xs:element>
+							<xs:element name="Devices">
+								<xs:complexType>
+									<xs:sequence>
+										<xs:element name="Device" minOccurs="0" maxOccurs="unbounded">
+											<xs:complexType>
+												<xs:complexContent>
+													<xs:extension base="DeviceType">
+														<xs:attribute name="Invisible" type="xs:boolean" use="optional"/>
+														<xs:attribute name="Physics" type="PhysicsType" use="required"/>
+														<xs:attribute name="Crc32" type="HexDecValue" use="optional"/>
+													</xs:extension>
+												</xs:complexContent>
+											</xs:complexType>
+										</xs:element>
+									</xs:sequence>
+								</xs:complexType>
+							</xs:element>
+							<xs:element name="Modules" minOccurs="0">
+								<xs:complexType>
+									<xs:sequence>
+										<xs:element name="Module" minOccurs="0" maxOccurs="unbounded">
+											<xs:complexType>
+												<xs:complexContent>
+													<xs:extension base="ModuleType">
+														<xs:attribute name="Crc32" type="HexDecValue" use="optional"/>
+													</xs:extension>
+												</xs:complexContent>
+											</xs:complexType>
+										</xs:element>
+									</xs:sequence>
+								</xs:complexType>
+							</xs:element>
+						</xs:sequence>
+					</xs:complexType>
+				</xs:element>
+			</xs:sequence>
+			<xs:attribute name="Version" type="xs:string" use="optional">
+				<xs:annotation>
+					<xs:documentation>Schema version (1.4)</xs:documentation>
+				</xs:annotation>
+			</xs:attribute>
+		</xs:complexType>
+	</xs:element>
+	<xs:complexType name="DeviceType">
+		<xs:sequence>
+			<xs:element name="Type">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="xs:string">
+							<xs:attribute name="ProductCode" type="HexDecValue" use="optional"/>
+							<xs:attribute name="RevisionNo" type="HexDecValue" use="optional"/>
+							<xs:attribute name="SerialNo" type="HexDecValue" use="optional"/>
+							<xs:attribute name="CheckProductCode" use="optional">
+								<xs:simpleType>
+									<xs:restriction base="xs:NMTOKEN">
+										<xs:enumeration value="NONE"/>
+										<xs:enumeration value="EQ"/>
+									</xs:restriction>
+								</xs:simpleType>
+							</xs:attribute>
+							<xs:attribute name="CheckRevisionNo" use="optional">
+								<xs:simpleType>
+									<xs:restriction base="xs:NMTOKEN">
+										<xs:enumeration value="NONE"/>
+										<xs:enumeration value="EQ"/>
+										<xs:enumeration value="EQ_OR_G"/>
+										<xs:enumeration value="LW_EQ"/>
+										<xs:enumeration value="LW_EQ_HW_EQ_OR_G"/>
+										<xs:enumeration value="HW_EQ"/>
+										<xs:enumeration value="HW_EQ_LW_EQ_OR_G"/>
+									</xs:restriction>
+								</xs:simpleType>
+							</xs:attribute>
+							<xs:attribute name="CheckSerialNo" use="optional">
+								<xs:simpleType>
+									<xs:restriction base="xs:NMTOKEN">
+										<xs:enumeration value="NONE"/>
+										<xs:enumeration value="EQ"/>
+									</xs:restriction>
+								</xs:simpleType>
+							</xs:attribute>
+							<xs:attribute name="TcSmClass" type="xs:string" use="optional">
+								<xs:annotation>
+									<xs:documentation>obsolete</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+							<xs:attribute name="TcCfgModeSafeOp" type="xs:boolean" use="optional">
+								<xs:annotation>
+									<xs:documentation>obsolete</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+							<xs:attribute name="UseLrdLwr" type="xs:boolean" use="optional"/>
+							<xs:attribute name="ModulePdoGroup" type="xs:int" use="optional"/>
+							<xs:attribute name="DownloadModuleList" type="xs:boolean" use="optional">
+								<xs:annotation>
+									<xs:documentation>for future use</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="HideType" minOccurs="0" maxOccurs="unbounded">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="xs:string">
+							<xs:attribute name="ProductCode" type="HexDecValue" use="optional"/>
+							<xs:attribute name="RevisionNo" type="HexDecValue" use="optional"/>
+							<xs:attribute name="ProductRevision" type="xs:string" use="optional">
+								<xs:annotation>
+									<xs:documentation>obsolete</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="AlternativeType" minOccurs="0" maxOccurs="unbounded">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="xs:string">
+							<xs:attribute name="ProductCode" type="HexDecValue" use="optional">
+								<xs:annotation>
+									<xs:documentation>for future use</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+							<xs:attribute name="RevisionNo" type="HexDecValue" use="optional">
+								<xs:annotation>
+									<xs:documentation>for future use</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="SubDevice" minOccurs="0" maxOccurs="unbounded">
+				<xs:annotation>
+					<xs:documentation> </xs:documentation>
+				</xs:annotation>
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="xs:string">
+							<xs:attribute name="ProductCode" type="HexDecValue" use="optional">
+								<xs:annotation>
+									<xs:documentation>for future use</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+							<xs:attribute name="RevisionNo" type="HexDecValue" use="optional">
+								<xs:annotation>
+									<xs:documentation>for future use</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+							<xs:attribute name="PreviousDevice" type="xs:int" use="optional"/>
+							<xs:attribute name="PreviousPortNo" type="xs:int" use="optional"/>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Name" type="NameType" maxOccurs="unbounded"/>
+			<xs:element name="Comment" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="URL" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="Info" type="InfoType" minOccurs="0"/>
+			<xs:element name="GroupType" type="xs:string"/>
+			<xs:element name="Profile" minOccurs="0" maxOccurs="unbounded">
+				<xs:complexType>
+					<xs:complexContent>
+						<xs:extension base="ProfileType">
+							<xs:attribute name="Channel" type="xs:int" use="optional">
+								<xs:annotation>
+									<xs:documentation>obsolete</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+						</xs:extension>
+					</xs:complexContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Fmmu" minOccurs="0" maxOccurs="unbounded">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="xs:string">
+							<xs:attribute name="OpOnly" type="xs:boolean" use="optional">
+								<xs:annotation>
+									<xs:documentation>obsolete</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+							<xs:attribute name="Sm" type="xs:int" use="optional"/>
+							<xs:attribute name="Su" type="xs:int" use="optional"/>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Sm" minOccurs="0" maxOccurs="unbounded">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="xs:string">
+							<xs:attribute name="MinSize" type="HexDecValue" use="optional"/>
+							<xs:attribute name="MaxSize" type="HexDecValue" use="optional"/>
+							<xs:attribute name="DefaultSize" type="HexDecValue" use="optional"/>
+							<xs:attribute name="StartAddress" type="HexDecValue" use="optional"/>
+							<xs:attribute name="ControlByte" type="HexDecValue" use="optional"/>
+							<xs:attribute name="Enable" type="HexDecValue" use="optional"/>
+							<xs:attribute name="OneByteMode" type="xs:boolean" use="optional">
+								<xs:annotation>
+									<xs:documentation>obsolete</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+							<xs:attribute name="Virtual" type="xs:boolean" use="optional"/>
+							<xs:attribute name="Watchdog" type="xs:boolean" use="optional">
+								<xs:annotation>
+									<xs:documentation>obsolete</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+							<xs:attribute name="OpOnly" type="xs:boolean" use="optional"/>
+							<xs:attribute name="FixedAssignment" type="xs:boolean" use="optional">
+								<xs:annotation>
+									<xs:documentation>obsolete</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Su" minOccurs="0" maxOccurs="unbounded">
+				<xs:complexType>
+					<xs:simpleContent>
+						<xs:extension base="xs:string">
+							<xs:attribute name="SeparateSu" type="xs:boolean" use="optional"/>
+							<xs:attribute name="SeparateFrame" type="xs:boolean" use="optional"/>
+							<xs:attribute name="DependOnInputState" type="xs:boolean" use="optional">
+								<xs:annotation>
+									<xs:documentation>for future use</xs:documentation>
+								</xs:annotation>
+							</xs:attribute>
+							<xs:attribute name="FrameRepeatSupport" type="xs:boolean" use="optional"/>
+						</xs:extension>
+					</xs:simpleContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="RxPdo" type="PdoType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="TxPdo" type="PdoType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="Mailbox" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="AoE" minOccurs="0">
+							<xs:complexType>
+								<xs:sequence>
+									<xs:element name="InitCmd" minOccurs="0" maxOccurs="unbounded">
+										<xs:complexType>
+											<xs:sequence>
+												<xs:element name="Transition" maxOccurs="unbounded">
+													<xs:simpleType>
+														<xs:restriction base="xs:NMTOKEN">
+															<xs:enumeration value="PS"/>
+															<xs:enumeration value="SO"/>
+															<xs:enumeration value="SP"/>
+															<xs:enumeration value="OP"/>
+															<xs:enumeration value="OS"/>
+														</xs:restriction>
+													</xs:simpleType>
+												</xs:element>
+												<xs:element name="Data" type="xs:hexBinary"/>
+												<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+											</xs:sequence>
+										</xs:complexType>
+									</xs:element>
+								</xs:sequence>
+								<xs:attribute name="AdsRouter" type="xs:boolean" use="optional"/>
+								<xs:attribute name="GenerateOwnNetId" type="xs:boolean" use="optional"/>
+								<xs:attribute name="InitializeOwnNetId" type="xs:boolean" use="optional"/>
+							</xs:complexType>
+						</xs:element>
+						<xs:element name="EoE" minOccurs="0">
+							<xs:complexType>
+								<xs:sequence>
+									<xs:element name="InitCmd" minOccurs="0" maxOccurs="unbounded">
+										<xs:complexType>
+											<xs:sequence>
+												<xs:element name="Transition" maxOccurs="unbounded">
+													<xs:simpleType>
+														<xs:restriction base="xs:NMTOKEN">
+															<xs:enumeration value="PS"/>
+															<xs:enumeration value="SO"/>
+															<xs:enumeration value="SP"/>
+															<xs:enumeration value="OP"/>
+															<xs:enumeration value="OS"/>
+														</xs:restriction>
+													</xs:simpleType>
+												</xs:element>
+												<xs:element name="Type" type="xs:int"/>
+												<xs:element name="Data" type="xs:hexBinary"/>
+												<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+											</xs:sequence>
+										</xs:complexType>
+									</xs:element>
+								</xs:sequence>
+								<xs:attribute name="IP" type="xs:boolean" use="optional" default="0"/>
+								<xs:attribute name="MAC" type="xs:boolean" use="optional" default="0"/>
+								<xs:attribute name="TimeStamp" type="xs:boolean" use="optional" default="0"/>
+							</xs:complexType>
+						</xs:element>
+						<xs:element name="CoE" minOccurs="0">
+							<xs:complexType>
+								<xs:sequence>
+									<xs:element name="Object" minOccurs="0" maxOccurs="unbounded">
+										<xs:annotation>
+											<xs:documentation>obsolete</xs:documentation>
+										</xs:annotation>
+										<xs:complexType>
+											<xs:sequence>
+												<xs:element name="Index" type="xs:int">
+													<xs:annotation>
+														<xs:documentation>obsolete</xs:documentation>
+													</xs:annotation>
+												</xs:element>
+												<xs:element name="SubIndex" type="xs:int">
+													<xs:annotation>
+														<xs:documentation>obsolete</xs:documentation>
+													</xs:annotation>
+												</xs:element>
+												<xs:element name="Data" type="xs:hexBinary">
+													<xs:annotation>
+														<xs:documentation>obsolete</xs:documentation>
+													</xs:annotation>
+												</xs:element>
+												<xs:element name="Comment" type="xs:string" minOccurs="0">
+													<xs:annotation>
+														<xs:documentation>obsolete</xs:documentation>
+													</xs:annotation>
+												</xs:element>
+											</xs:sequence>
+										</xs:complexType>
+									</xs:element>
+									<xs:element name="InitCmd" minOccurs="0" maxOccurs="unbounded">
+										<xs:complexType>
+											<xs:sequence>
+												<xs:element name="Transition" maxOccurs="unbounded">
+													<xs:simpleType>
+														<xs:restriction base="xs:NMTOKEN">
+															<xs:enumeration value="PS"/>
+															<xs:enumeration value="SO"/>
+															<xs:enumeration value="SP"/>
+															<xs:enumeration value="OP"/>
+															<xs:enumeration value="OS"/>
+														</xs:restriction>
+													</xs:simpleType>
+												</xs:element>
+												<xs:element name="Index" type="HexDecValue"/>
+												<xs:element name="SubIndex" type="HexDecValue"/>
+												<xs:element name="Data">
+													<xs:complexType>
+														<xs:simpleContent>
+															<xs:extension base="xs:hexBinary">
+																<xs:attribute name="AdaptAutomatically" type="xs:boolean" use="optional"/>
+															</xs:extension>
+														</xs:simpleContent>
+													</xs:complexType>
+												</xs:element>
+												<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+											</xs:sequence>
+											<xs:attribute name="Fixed" type="xs:boolean" use="optional">
+												<xs:annotation>
+													<xs:documentation>obsolete</xs:documentation>
+												</xs:annotation>
+											</xs:attribute>
+											<xs:attribute name="CompleteAccess" type="xs:boolean" use="optional"/>
+											<xs:attribute name="OverwrittenByModule" type="xs:boolean" use="optional"/>
+										</xs:complexType>
+									</xs:element>
+								</xs:sequence>
+								<xs:attribute name="SdoInfo" type="xs:boolean" use="optional"/>
+								<xs:attribute name="PdoAssign" type="xs:boolean" use="optional"/>
+								<xs:attribute name="PdoConfig" type="xs:boolean" use="optional"/>
+								<xs:attribute name="PdoUpload" type="xs:boolean" use="optional"/>
+								<xs:attribute name="CompleteAccess" type="xs:boolean" use="optional"/>
+								<xs:attribute name="EdsFile" type="xs:string" use="optional"/>
+								<xs:attribute name="DS402Channels" type="xs:int" use="optional">
+									<xs:annotation>
+										<xs:documentation>obsolete</xs:documentation>
+									</xs:annotation>
+								</xs:attribute>
+								<xs:attribute name="SegmentedSdo" type="xs:boolean" use="optional"/>
+								<xs:attribute name="DiagHistory" type="xs:boolean" use="optional"/>
+							</xs:complexType>
+						</xs:element>
+						<xs:element name="FoE" minOccurs="0"/>
+						<xs:element name="SoE" minOccurs="0">
+							<xs:complexType>
+								<xs:sequence>
+									<xs:element name="InitCmd" minOccurs="0" maxOccurs="unbounded">
+										<xs:complexType>
+											<xs:sequence>
+												<xs:element name="Transition" maxOccurs="unbounded">
+													<xs:simpleType>
+														<xs:restriction base="xs:NMTOKEN">
+															<xs:enumeration value="PS"/>
+															<xs:enumeration value="SO"/>
+															<xs:enumeration value="SP"/>
+															<xs:enumeration value="OP"/>
+															<xs:enumeration value="OS"/>
+														</xs:restriction>
+													</xs:simpleType>
+												</xs:element>
+												<xs:element name="IDN" type="xs:int"/>
+												<xs:element name="Data" type="xs:hexBinary"/>
+												<xs:element name="Comment" type="xs:string" minOccurs="0"/>
+											</xs:sequence>
+											<xs:attribute name="Chn" type="xs:int" use="optional" default="0"/>
+										</xs:complexType>
+									</xs:element>
+								</xs:sequence>
+								<xs:attribute name="ChannelCount" type="xs:int" use="optional"/>
+								<xs:attribute name="DriveFollowsBit3Support" type="xs:boolean" use="optional"/>
+							</xs:complexType>
+						</xs:element>
+						<xs:element name="VoE" minOccurs="0">
+							<xs:complexType>
+								<xs:sequence>
+									<xs:any minOccurs="0" maxOccurs="unbounded"/>
+								</xs:sequence>
+							</xs:complexType>
+						</xs:element>
+						<xs:element name="VendorSpecific" type="VendorSpecificType" minOccurs="0"/>
+					</xs:sequence>
+					<xs:attribute name="DataLinkLayer" type="xs:boolean" use="optional" default="0"/>
+					<xs:attribute name="RealTimeMode" type="xs:boolean" use="optional" default="0">
+						<xs:annotation>
+							<xs:documentation>for future use</xs:documentation>
+						</xs:annotation>
+					</xs:attribute>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Dc" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="OpMode" minOccurs="0" maxOccurs="unbounded">
+							<xs:complexType>
+								<xs:sequence>
+									<xs:element name="Name" type="xs:string"/>
+									<xs:element name="Desc" type="xs:string" minOccurs="0"/>
+									<xs:element name="AssignActivate" type="HexDecValue"/>
+									<xs:element name="CycleTimeSync0" minOccurs="0">
+										<xs:complexType>
+											<xs:simpleContent>
+												<xs:extension base="xs:int">
+													<xs:attribute name="Factor" type="xs:int" use="optional"/>
+												</xs:extension>
+											</xs:simpleContent>
+										</xs:complexType>
+									</xs:element>
+									<xs:element name="ShiftTimeSync0" minOccurs="0">
+										<xs:complexType>
+											<xs:simpleContent>
+												<xs:extension base="xs:int">
+													<xs:attribute name="Factor" type="xs:int" use="optional"/>
+													<xs:attribute name="Input" type="xs:boolean" use="optional"/>
+													<xs:attribute name="OutputDelayTime" type="xs:int" use="optional"/>
+													<xs:attribute name="InputDelayTime" type="xs:int" use="optional"/>
+												</xs:extension>
+											</xs:simpleContent>
+										</xs:complexType>
+									</xs:element>
+									<xs:element name="CycleTimeSync1" minOccurs="0">
+										<xs:complexType>
+											<xs:simpleContent>
+												<xs:extension base="xs:int">
+													<xs:attribute name="Factor" type="xs:int" use="optional"/>
+												</xs:extension>
+											</xs:simpleContent>
+										</xs:complexType>
+									</xs:element>
+									<xs:element name="ShiftTimeSync1" minOccurs="0">
+										<xs:complexType>
+											<xs:simpleContent>
+												<xs:extension base="xs:int">
+													<xs:attribute name="Factor" type="xs:int" use="optional">
+														<xs:annotation>
+															<xs:documentation>for future use</xs:documentation>
+														</xs:annotation>
+													</xs:attribute>
+													<xs:attribute name="Input" type="xs:boolean" use="optional"/>
+													<xs:attribute name="OutputDelayTime" type="xs:int" use="optional"/>
+													<xs:attribute name="InputDelayTime" type="xs:int" use="optional"/>
+												</xs:extension>
+											</xs:simpleContent>
+										</xs:complexType>
+									</xs:element>
+									<xs:element name="Sm" minOccurs="0" maxOccurs="unbounded">
+										<xs:complexType>
+											<xs:sequence>
+												<xs:element name="SyncType" type="xs:int" minOccurs="0">
+													<xs:annotation>
+														<xs:documentation>obsolete</xs:documentation>
+													</xs:annotation>
+												</xs:element>
+												<xs:element name="CycleTime" minOccurs="0">
+													<xs:annotation>
+														<xs:documentation>obsolete</xs:documentation>
+													</xs:annotation>
+													<xs:complexType>
+														<xs:simpleContent>
+															<xs:extension base="xs:int">
+																<xs:attribute name="Factor" type="xs:int" use="optional">
+																	<xs:annotation>
+																		<xs:documentation>obsolete</xs:documentation>
+																	</xs:annotation>
+																</xs:attribute>
+															</xs:extension>
+														</xs:simpleContent>
+													</xs:complexType>
+												</xs:element>
+												<xs:element name="ShiftTime" minOccurs="0">
+													<xs:annotation>
+														<xs:documentation>obsolete</xs:documentation>
+													</xs:annotation>
+													<xs:complexType>
+														<xs:simpleContent>
+															<xs:extension base="xs:int">
+																<xs:attribute name="MinAfterSync" type="xs:int" use="optional">
+																	<xs:annotation>
+																		<xs:documentation>obsolete</xs:documentation>
+																	</xs:annotation>
+																</xs:attribute>
+																<xs:attribute name="MinBeforeFrame" type="xs:int" use="optional">
+																	<xs:annotation>
+																		<xs:documentation>obsolete</xs:documentation>
+																	</xs:annotation>
+																</xs:attribute>
+															</xs:extension>
+														</xs:simpleContent>
+													</xs:complexType>
+												</xs:element>
+												<xs:element name="Pdo" minOccurs="0" maxOccurs="unbounded">
+													<xs:complexType>
+														<xs:simpleContent>
+															<xs:extension base="HexDecValue">
+																<xs:attribute name="OSFac" type="xs:int"/>
+															</xs:extension>
+														</xs:simpleContent>
+													</xs:complexType>
+												</xs:element>
+											</xs:sequence>
+											<xs:attribute name="No" type="xs:int" use="required"/>
+										</xs:complexType>
+									</xs:element>
+									<xs:element name="VendorSpecific" type="VendorSpecificType" minOccurs="0"/>
+								</xs:sequence>
+							</xs:complexType>
+						</xs:element>
+						<xs:element name="VendorSpecific" type="VendorSpecificType" minOccurs="0"/>
+					</xs:sequence>
+					<xs:attribute name="UnknownFRMW" type="xs:boolean" use="optional"/>
+					<xs:attribute name="Unknown64Bit" type="xs:boolean" use="optional"/>
+					<xs:attribute name="ExternalRefClock" type="xs:boolean" use="optional"/>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Slots" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="Slot" type="SlotType" minOccurs="0" maxOccurs="unbounded"/>
+						<xs:element name="ModulePdoGroup" minOccurs="0" maxOccurs="unbounded">
+							<xs:complexType>
+								<xs:simpleContent>
+									<xs:extension base="xs:string">
+										<xs:attribute name="Alignment" type="xs:int" use="optional"/>
+										<xs:attribute name="RxPdo" type="HexDecValue" use="optional"/>
+										<xs:attribute name="TxPdo" type="HexDecValue" use="optional"/>
+									</xs:extension>
+								</xs:simpleContent>
+							</xs:complexType>
+						</xs:element>
+					</xs:sequence>
+					<xs:attribute name="MaxSlotCount" type="HexDecValue" use="optional"/>
+					<xs:attribute name="MaxSlotGroupCount" type="HexDecValue" use="optional"/>
+					<xs:attribute name="SlotPdoIncrement" type="HexDecValue" use="optional"/>
+					<xs:attribute name="SlotGroupPdoIncrement" type="HexDecValue" use="optional"/>
+					<xs:attribute name="SlotIndexIncrement" type="HexDecValue" use="optional"/>
+					<xs:attribute name="SlotGroupIndexIncrement" type="HexDecValue" use="optional"/>
+					<xs:attribute name="IdentifyModuleBy">
+						<xs:annotation>
+							<xs:documentation>obsolete</xs:documentation>
+						</xs:annotation>
+						<xs:simpleType>
+							<xs:restriction base="xs:NMTOKEN">
+								<xs:enumeration value="ModuleIdent"/>
+								<xs:enumeration value="IdentityObjekt"/>
+							</xs:restriction>
+						</xs:simpleType>
+					</xs:attribute>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="ESC" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="Reg0108" type="HexDecValue" minOccurs="0"/>
+						<xs:element name="Reg0400" type="HexDecValue" minOccurs="0"/>
+						<xs:element name="Reg0410" type="HexDecValue" minOccurs="0"/>
+						<xs:element name="Reg0420" type="HexDecValue" minOccurs="0"/>
+						<xs:element name="VendorSpecific" type="VendorSpecificType" minOccurs="0"/>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Eeprom" minOccurs="0">
+				<xs:complexType>
+					<xs:complexContent>
+						<xs:extension base="EepromType">
+							<xs:attribute name="AssignToPdi" type="xs:boolean"/>
+						</xs:extension>
+					</xs:complexContent>
+				</xs:complexType>
+			</xs:element>
+			<xs:choice minOccurs="0">
+				<xs:element name="Image16x14" type="xs:string" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>obsolete</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="ImageFile16x14" type="xs:string" minOccurs="0"/>
+				<xs:element name="ImageData16x14" type="xs:hexBinary" minOccurs="0"/>
+			</xs:choice>
+			<xs:element name="VendorSpecific" type="VendorSpecificType" minOccurs="0"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="GroupType">
+		<xs:sequence>
+			<xs:element name="Type" type="xs:string"/>
+			<xs:element name="Name" type="NameType" maxOccurs="unbounded"/>
+			<xs:element name="Comment" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:choice>
+				<xs:element name="Image16x14" type="xs:string" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>obsolete</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="ImageFile16x14" type="xs:string" minOccurs="0"/>
+				<xs:element name="ImageData16x14" type="xs:hexBinary" minOccurs="0"/>
+			</xs:choice>
+			<xs:element name="VendorSpecific" type="VendorSpecificType" minOccurs="0"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="EepromType">
+		<xs:sequence>
+			<xs:choice>
+				<xs:element name="Data" type="xs:hexBinary"/>
+				<xs:sequence>
+					<xs:element name="ByteSize" type="xs:int"/>
+					<xs:element name="ConfigData" type="xs:hexBinary"/>
+					<xs:element name="BootStrap" type="xs:hexBinary" minOccurs="0"/>
+					<xs:element name="Category" minOccurs="0" maxOccurs="unbounded">
+						<xs:complexType>
+							<xs:sequence>
+								<xs:element name="CatNo">
+									<xs:complexType>
+										<xs:simpleContent>
+											<xs:extension base="xs:int"/>
+										</xs:simpleContent>
+									</xs:complexType>
+								</xs:element>
+								<xs:choice>
+									<xs:element name="Data" type="xs:hexBinary"/>
+									<xs:element name="DataString" type="xs:string"/>
+									<xs:element name="DataUINT" type="xs:int"/>
+									<xs:element name="DataUDINT" type="xs:int"/>
+								</xs:choice>
+							</xs:sequence>
+							<xs:attribute name="PreserveOnlineData" type="xs:boolean" use="optional"/>
+						</xs:complexType>
+					</xs:element>
+				</xs:sequence>
+			</xs:choice>
+			<xs:element name="VendorSpecific" type="VendorSpecificType" minOccurs="0"/>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:complexType name="InfoType">
+		<xs:sequence>
+			<xs:element name="Electrical" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="EBusCurrent" type="xs:int"/>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="StateMachine" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="Timeout" minOccurs="0">
+							<xs:complexType>
+								<xs:sequence>
+									<xs:element name="PreopTimeout" type="xs:int"/>
+									<xs:element name="SafeopOpTimeout" type="xs:int"/>
+									<xs:element name="BackToInitTimeout" type="xs:int"/>
+									<xs:element name="BackToSafeopTimeout" type="xs:int"/>
+								</xs:sequence>
+							</xs:complexType>
+						</xs:element>
+						<xs:element name="Behavior" minOccurs="0">
+							<xs:complexType>
+								<xs:attribute name="StartToInit" type="xs:boolean" use="optional"/>
+								<xs:attribute name="StartToPreop" type="xs:boolean" use="optional"/>
+								<xs:attribute name="StartToSafeop" type="xs:boolean" use="optional"/>
+								<xs:attribute name="StartToSafeopNoSync" type="xs:boolean" use="optional"/>
+							</xs:complexType>
+						</xs:element>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Mailbox" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="Timeout">
+							<xs:complexType>
+								<xs:sequence>
+									<xs:element name="RequestTimeout" type="xs:int"/>
+									<xs:element name="ResponseTimeout" type="xs:int"/>
+								</xs:sequence>
+							</xs:complexType>
+						</xs:element>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="EtherCATController" minOccurs="0">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="DpramSize" type="xs:int" default="4096" minOccurs="0"/>
+						<xs:element name="SmCount" type="xs:int" minOccurs="0"/>
+						<xs:element name="FmmuCount" type="xs:int" minOccurs="0"/>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="Port" minOccurs="0" maxOccurs="4">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="Type">
+							<xs:simpleType>
+								<xs:restriction base="xs:NMTOKEN">
+									<xs:enumeration value="MII"/>
+									<xs:enumeration value="EBUS"/>
+									<xs:enumeration value="NONE"/>
+								</xs:restriction>
+							</xs:simpleType>
+						</xs:element>
+						<xs:element name="Connector" type="xs:string" minOccurs="0"/>
+						<xs:element name="Label" type="xs:string" minOccurs="0"/>
+						<xs:element name="RxDelay" type="xs:int" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>in 100ps</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="TxDelay" type="xs:int" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>in 100ps</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="PhysicalPhyAddr" type="xs:int" minOccurs="0"/>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="ExecutionUnit" minOccurs="0" maxOccurs="2">
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="Type">
+							<xs:simpleType>
+								<xs:restriction base="xs:NMTOKEN">
+									<xs:enumeration value="PRIMARY"/>
+									<xs:enumeration value="SECONDARY"/>
+									<xs:enumeration value="NONE"/>
+								</xs:restriction>
+							</xs:simpleType>
+						</xs:element>
+						<xs:element name="RxDelay" type="xs:int" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>in 100ps</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="TxDelay" type="xs:int" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>in 100ps</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+			<xs:element name="VendorSpecific" type="VendorSpecificType" minOccurs="0"/>
+			<xs:element name="StationAliasSupported" minOccurs="0">
+				<xs:annotation>
+					<xs:documentation>obsolete</xs:documentation>
+				</xs:annotation>
+				<xs:simpleType>
+					<xs:restriction base="xs:NMTOKEN">
+						<xs:enumeration value="NO_SUPPORT"/>
+						<xs:enumeration value="REGISTER_SUPPORT"/>
+						<xs:enumeration value="PROCESSDATA_SUPPORT"/>
+					</xs:restriction>
+				</xs:simpleType>
+			</xs:element>
+			<xs:element name="IdentificationAdo" type="HexDecValue" minOccurs="0"/>
+			<xs:element name="DeviceFeature" minOccurs="0" maxOccurs="unbounded">
+				<xs:annotation>
+					<xs:documentation>for future use</xs:documentation>
+				</xs:annotation>
+				<xs:complexType>
+					<xs:sequence>
+						<xs:element name="Name" type="xs:string">
+							<xs:annotation>
+								<xs:documentation>for future use</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="Value" type="xs:string" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>for future use</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="Description" type="xs:string" minOccurs="0">
+							<xs:annotation>
+								<xs:documentation>for future use</xs:documentation>
+							</xs:annotation>
+						</xs:element>
+						<xs:element name="Register" minOccurs="0" maxOccurs="unbounded">
+							<xs:annotation>
+								<xs:documentation>for future use</xs:documentation>
+							</xs:annotation>
+							<xs:complexType>
+								<xs:sequence>
+									<xs:element name="StartAddress" type="xs:int">
+										<xs:annotation>
+											<xs:documentation>for future use;
+in bytes</xs:documentation>
+										</xs:annotation>
+									</xs:element>
+									<xs:element name="Length" type="xs:int">
+										<xs:annotation>
+											<xs:documentation>for future use;
+in bytes</xs:documentation>
+										</xs:annotation>
+									</xs:element>
+									<xs:element name="BitMask" type="HexDecValue" minOccurs="0">
+										<xs:annotation>
+											<xs:documentation>for future use</xs:documentation>
+										</xs:annotation>
+									</xs:element>
+								</xs:sequence>
+							</xs:complexType>
+						</xs:element>
+					</xs:sequence>
+				</xs:complexType>
+			</xs:element>
+		</xs:sequence>
+	</xs:complexType>
+	<xs:simpleType name="PhysicsType">
+		<xs:restriction base="xs:string">
+			<xs:pattern value="[Y,K, ]{0,4}"/>
+		</xs:restriction>
+	</xs:simpleType>
+	<xs:complexType name="SlotType">
+		<xs:sequence>
+			<xs:element name="Name" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:choice>
+				<xs:element name="ModuleIdent" maxOccurs="unbounded">
+					<xs:complexType>
+						<xs:simpleContent>
+							<xs:extension base="HexDecValue">
+								<xs:attribute name="Default" type="HexDecValue" use="optional"/>
+							</xs:extension>
+						</xs:simpleContent>
+					</xs:complexType>
+				</xs:element>
+				<xs:element name="ModuleClass" maxOccurs="unbounded">
+					<xs:complexType>
+						<xs:sequence>
+							<xs:element name="Class" type="xs:string"/>
+							<xs:element name="VendorId" type="HexDecValue" minOccurs="0"/>
+							<xs:element name="Name" type="NameType" minOccurs="0" maxOccurs="unbounded"/>
+							<xs:choice minOccurs="0">
+								<xs:element name="Image16x14" type="xs:string" minOccurs="0">
+									<xs:annotation>
+										<xs:documentation>obsolete</xs:documentation>
+									</xs:annotation>
+								</xs:element>
+								<xs:element name="ImageFile16x14" type="xs:string" minOccurs="0"/>
+								<xs:element name="ImageData16x14" type="xs:hexBinary" minOccurs="0"/>
+							</xs:choice>
+						</xs:sequence>
+					</xs:complexType>
+				</xs:element>
+			</xs:choice>
+			<xs:choice minOccurs="0">
+				<xs:element name="Image16x14" type="xs:string" minOccurs="0">
+					<xs:annotation>
+						<xs:documentation>obsolete</xs:documentation>
+					</xs:annotation>
+				</xs:element>
+				<xs:element name="ImageFile16x14" type="xs:string" minOccurs="0"/>
+				<xs:element name="ImageData16x14" type="xs:hexBinary" minOccurs="0"/>
+			</xs:choice>
+		</xs:sequence>
+		<xs:attribute name="SlotGroup" type="HexDecValue" use="optional"/>
+		<xs:attribute name="MinInstances" type="HexDecValue" use="required"/>
+		<xs:attribute name="MaxInstances" type="HexDecValue" use="required"/>
+		<xs:attribute name="SlotPdoIncrement" type="HexDecValue" use="optional"/>
+		<xs:attribute name="SlotGroupPdoIncrement" type="HexDecValue" use="optional"/>
+		<xs:attribute name="SlotIndexIncrement" type="HexDecValue" use="optional"/>
+		<xs:attribute name="SlotGroupIndexIncrement" type="HexDecValue" use="optional"/>
+		<xs:attribute name="TreeView" use="optional">
+			<xs:simpleType>
+				<xs:restriction base="xs:NMTOKEN">
+					<xs:enumeration value="SLOTGROUP"/>
+					<xs:enumeration value="SLOT"/>
+					<xs:enumeration value="PDO"/>
+				</xs:restriction>
+			</xs:simpleType>
+		</xs:attribute>
+	</xs:complexType>
+</xs:schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/EtherCATManagementEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2161 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz
+#
+# Copyright (C) 2013: Real-Time & Embedded Systems (RTES) Lab., University of Seoul
+#
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+from __future__ import division
+import os
+import string
+from xml.dom import minidom
+
+import wx
+import wx.grid
+import wx.gizmos
+import wx.lib.buttons
+
+# --------------------------------------------------------------------
+from controls import CustomGrid, CustomTable
+from runtime import PlcStatus
+# --------------------------------------------------------------------
+
+# ------------ for register management ---------------
+
+from util.TranslationCatalogs import NoTranslate
+# -------------------------------------------------------------
+
+
+# ----------------------------- For Sync Manager Table -----------------------------------
+def GetSyncManagersTableColnames():
+    """
+    Returns column names of SyncManager Table in Slave state panel.
+    """
+    _ = NoTranslate
+    return ["#", _("Name"), _("Start Address"), _("Default Size"), _("Control Byte"), _("Enable")]
+
+
+# -------------------------------------------------------------------------------
+#                    Sync Managers Table
+# -------------------------------------------------------------------------------
+class SyncManagersTable(CustomTable):
+    def GetValue(self, row, col):
+        if row < self.GetNumberRows():
+            if col == 0:
+                return row
+            return self.data[row].get(self.GetColLabelValue(col, False), "")
+
+
+# -------------------------------------------------------------------------------
+#                    EtherCAT Management Treebook
+# -------------------------------------------------------------------------------
+class EtherCATManagementTreebook(wx.Treebook):
+    def __init__(self, parent, controler, node_editor):
+        """
+        Constructor
+        @param parent: Reference to the parent wx.ScrolledWindow object
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        @param node_editor: Reference to Beremiz frame
+        """
+        wx.Treebook.__init__(self, parent, -1, size=wx.DefaultSize, style=wx.BK_DEFAULT)
+        self.parent = parent
+        self.Controler = controler
+        self.NodeEditor = node_editor
+
+        self.EtherCATManagementClassObject = {}
+
+        # fill EtherCAT Management Treebook
+        panels = [
+            ("Slave State",        SlaveStatePanelClass, []),
+            ("SDO Management",     SDOPanelClass, []),
+            ("PDO Monitoring",     PDOPanelClass, []),
+            ("ESC Management",     EEPROMAccessPanel, [
+                ("Smart View", SlaveSiiSmartView),
+                ("Hex View", HexView)]),
+            ("Register Access",     RegisterAccessPanel, [])
+        ]
+        for pname, pclass, subs in panels:
+            self.AddPage(pclass(self, self.Controler), pname)
+            for spname, spclass in subs:
+                self.AddSubPage(spclass(self, self.Controler), spname)
+
+
+# -------------------------------------------------------------------------------
+#                    For SlaveState Panel
+# -------------------------------------------------------------------------------
+class SlaveStatePanelClass(wx.Panel):
+    def __init__(self, parent, controler):
+        """
+        Constructor
+        @param parent: Reference to the parent EtherCATManagementTreebook class
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+        wx.Panel.__init__(self, parent, -1, (0, 0), size=wx.DefaultSize, style=wx.SUNKEN_BORDER)
+        self.Controler = controler
+        self.parent = parent
+
+        # initialize SlaveStatePanel UI dictionaries
+        self.StaticBoxDic = {}
+        self.StaticTextDic = {}
+        self.TextCtrlDic = {}
+        self.ButtonDic = {}
+
+        # iniitalize BoxSizer and FlexGridSizer
+        self.SizerDic = {
+            "SlaveState_main_sizer": wx.BoxSizer(wx.VERTICAL),
+            "SlaveState_inner_main_sizer": wx.FlexGridSizer(cols=1, hgap=50, rows=3, vgap=10),
+            "SlaveInfosDetailsInnerSizer": wx.FlexGridSizer(cols=4, hgap=10, rows=2, vgap=10),
+            "SyncManagerInnerSizer": wx.FlexGridSizer(cols=1, hgap=5, rows=1, vgap=5),
+            "SlaveState_sizer": wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10),
+            "SlaveState_up_sizer": wx.FlexGridSizer(cols=4, hgap=10, rows=2, vgap=10),
+            "SlaveState_down_sizer": wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=10)}
+
+        # initialize StaticBox and StaticBoxSizer
+        for box_name, box_label in [
+                ("SlaveInfosDetailsBox", "Slave Informations"),
+                ("SyncManagerBox", "Sync Manager"),
+                ("SlaveStateBox", "Slave State Transition && Monitoring")]:
+            self.StaticBoxDic[box_name] = wx.StaticBox(self, label=_(box_label))
+            self.SizerDic[box_name] = wx.StaticBoxSizer(self.StaticBoxDic[box_name])
+
+        for statictext_name, statictext_label, textctrl_name in [
+                ("VendorLabel", "Vendor:", "vendor"),
+                ("ProductcodeLabel", "Product code:", "product_code"),
+                ("RevisionnumberLabel", "Slave Count:", "revision_number"),
+                ("PhysicsLabel", "Physics:", "physics")]:
+            self.StaticTextDic[statictext_name] = wx.StaticText(self, label=_(statictext_label))
+            self.TextCtrlDic[textctrl_name] = wx.TextCtrl(self, size=wx.Size(130, 24), style=wx.TE_READONLY)
+            self.SizerDic["SlaveInfosDetailsInnerSizer"].AddMany([self.StaticTextDic[statictext_name],
+                                                                  self.TextCtrlDic[textctrl_name]])
+
+        self.SizerDic["SlaveInfosDetailsBox"].AddSizer(self.SizerDic["SlaveInfosDetailsInnerSizer"])
+
+        self.SyncManagersGrid = CustomGrid(self, size=wx.Size(605, 155), style=wx.VSCROLL)
+
+        self.SizerDic["SyncManagerInnerSizer"].Add(self.SyncManagersGrid)
+        self.SizerDic["SyncManagerBox"].Add(self.SizerDic["SyncManagerInnerSizer"])
+
+        buttons = [
+            ("InitButton",   0, "INIT", "State Transition to \"Init\" State",     self.OnButtonClick, []),
+            ("PreOPButton",  1, "PREOP", "State Transition to \"PreOP\" State",   self.OnButtonClick, [
+                ("TargetStateLabel", "Target State:", "TargetState")]),
+            ("SafeOPButton", 2, "SAFEOP", "State Transition to \"SafeOP\" State", self.OnButtonClick, []),
+            ("OPButton",     3, "OP",  "State Transition to \"OP\" State",        self.OnButtonClick, [
+                ("CurrentStateLabel", "Current State:", "CurrentState")])
+        ]
+        for button_name, button_id, button_label, button_tooltipstring, event_method, sub_item in buttons:
+            self.ButtonDic[button_name] = wx.Button(self, id=button_id, label=_(button_label))
+            self.ButtonDic[button_name].Bind(wx.EVT_BUTTON, event_method)
+            self.ButtonDic[button_name].SetToolTipString(button_tooltipstring)
+            self.SizerDic["SlaveState_up_sizer"].Add(self.ButtonDic[button_name])
+            for statictext_name, statictext_label, textctrl_name in sub_item:
+                self.StaticTextDic[statictext_name] = wx.StaticText(self, label=_(statictext_label))
+                self.TextCtrlDic[textctrl_name] = wx.TextCtrl(self, size=wx.DefaultSize, style=wx.TE_READONLY)
+                self.SizerDic["SlaveState_up_sizer"].AddMany([self.StaticTextDic[statictext_name],
+                                                              self.TextCtrlDic[textctrl_name]])
+
+        for button_name, button_label, button_tooltipstring, event_method in [
+                ("StartTimerButton", "Start State Monitoring", "Slave State Update Restart", self.StartTimer),
+                ("StopTimerButton", "Stop State Monitoring", "Slave State Update Stop", self.CurrentStateThreadStop)]:
+            self.ButtonDic[button_name] = wx.Button(self, label=_(button_label))
+            self.ButtonDic[button_name].Bind(wx.EVT_BUTTON, event_method)
+            self.ButtonDic[button_name].SetToolTipString(button_tooltipstring)
+            self.SizerDic["SlaveState_down_sizer"].Add(self.ButtonDic[button_name])
+
+        self.SizerDic["SlaveState_sizer"].AddMany([self.SizerDic["SlaveState_up_sizer"],
+                                                   self.SizerDic["SlaveState_down_sizer"]])
+
+        self.SizerDic["SlaveStateBox"].Add(self.SizerDic["SlaveState_sizer"])
+
+        self.SizerDic["SlaveState_inner_main_sizer"].AddMany([
+            self.SizerDic["SlaveInfosDetailsBox"], self.SizerDic["SyncManagerBox"],
+            self.SizerDic["SlaveStateBox"]])
+
+        self.SizerDic["SlaveState_main_sizer"].Add(self.SizerDic["SlaveState_inner_main_sizer"])
+
+        self.SetSizer(self.SizerDic["SlaveState_main_sizer"])
+
+        # register a timer for periodic exectuion of slave state update (period: 1000 ms)
+        self.Bind(wx.EVT_TIMER, self.GetCurrentState)
+
+        self.CreateSyncManagerTable()
+
+        self.Centre()
+
+    def CreateSyncManagerTable(self):
+        """
+        Create grid for "SyncManager"
+        """
+        # declare Table object
+        self.SyncManagersTable = SyncManagersTable(self, [], GetSyncManagersTableColnames())
+        self.SyncManagersGrid.SetTable(self.SyncManagersTable)
+        # set grid alignment attr. (CENTER)
+        self.SyncManagersGridColAlignements = [wx.ALIGN_CENTRE, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE,
+                                               wx.ALIGN_CENTRE, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE]
+        # set grid size
+        self.SyncManagersGridColSizes = [40, 150, 100, 100, 100, 100]
+        self.SyncManagersGrid.SetRowLabelSize(0)
+        for col in range(self.SyncManagersTable.GetNumberCols()):
+            attr = wx.grid.GridCellAttr()
+            attr.SetAlignment(self.SyncManagersGridColAlignements[col], wx.ALIGN_CENTRE)
+            self.SyncManagersGrid.SetColAttr(col, attr)
+            self.SyncManagersGrid.SetColMinimalWidth(col, self.SyncManagersGridColSizes[col])
+            self.SyncManagersGrid.AutoSizeColumn(col, False)
+
+        self.RefreshSlaveInfos()
+
+    def RefreshSlaveInfos(self):
+        """
+        Fill data in "Slave Information" and "SyncManager"
+        """
+        slave_infos = self.Controler.GetSlaveInfos()
+        sync_manager_section = ["vendor", "product_code", "revision_number", "physics"]
+        if slave_infos is not None:
+            # this method is same as "TextCtrl.SetValue"
+            for textctrl_name in sync_manager_section:
+                self.TextCtrlDic[textctrl_name].SetValue(slave_infos[textctrl_name])
+            self.SyncManagersTable.SetData(slave_infos["sync_managers"])
+            self.SyncManagersTable.ResetView(self.SyncManagersGrid)
+        else:
+            for textctrl_name in sync_manager_section:
+                self.TextCtrlDic[textctrl_name].SetValue("")
+            self.SyncManagersTable.SetData([])
+            self.SyncManagersTable.ResetView(self.SyncManagersGrid)
+
+    def OnButtonClick(self, event):
+        """
+        Event handler for slave state transition button click (Init, PreOP, SafeOP, OP button)
+        @param event : wx.EVT_BUTTON object
+        """
+        check_connect_flag = self.Controler.CommonMethod.CheckConnect(False)
+        if check_connect_flag:
+            state_dic = ["INIT", "PREOP", "SAFEOP", "OP"]
+
+            # If target state is one of {INIT, PREOP, SAFEOP}, request slave state transition immediately.
+            if event.GetId() < 3:
+                self.Controler.CommonMethod.RequestSlaveState(state_dic[event.GetId()])
+                self.TextCtrlDic["TargetState"].SetValue(state_dic[event.GetId()])
+
+            # If target state is OP, first check "PLC status".
+            #  (1) If current PLC status is "Started", then request slave state transition
+            #  (2) Otherwise, show error message and return
+            else:
+                status, _log_count = self.Controler.GetCTRoot()._connector.GetPLCstatus()
+                if status == PlcStatus.Started:
+                    self.Controler.CommonMethod.RequestSlaveState("OP")
+                    self.TextCtrlDic["TargetState"].SetValue("OP")
+                else:
+                    self.Controler.CommonMethod.CreateErrorDialog(_("PLC is Not Started"))
+
+    def GetCurrentState(self, event):
+        """
+        Timer event handler for periodic slave state monitoring (Default period: 1 sec = 1000 msec).
+        @param event : wx.TIMER object
+        """
+        check_connect_flag = self.Controler.CommonMethod.CheckConnect(True)
+        if check_connect_flag:
+            returnVal = self.Controler.CommonMethod.GetSlaveStateFromSlave()
+            line = returnVal.split("\n")
+            try:
+                self.SetCurrentState(line[self.Controler.GetSlavePos()])
+            except Exception:
+                pass
+
+    def SetCurrentState(self, line):
+        """
+        Show current slave state using the executiob result of "ethercat slaves" command.
+        @param line : result of "ethercat slaves" command
+        """
+        state_array = ["INIT", "PREOP", "SAFEOP", "OP"]
+        try:
+            # parse the execution result of  "ethercat slaves" command
+            # Result example : 0  0:0  PREOP  +  EL9800 (V4.30) (PIC24, SPI, ET1100)
+            token = line.split("  ")
+            if token[2] in state_array:
+                self.TextCtrlDic["CurrentState"].SetValue(token[2])
+        except Exception:
+            pass
+
+    def StartTimer(self, event):
+        """
+        Event handler for "Start State Monitoring" button.
+          - start slave state monitoring thread
+        @param event : wx.EVT_BUTTON object
+        """
+        self.SlaveStateThread = wx.Timer(self)
+        # set timer period (1000 ms)
+        self.SlaveStateThread.Start(1000)
+
+    def CurrentStateThreadStop(self, event):
+        """
+        Event handler for "Stop State Monitoring" button.
+          - stop slave state monitoring thread
+        @param event : wx.EVT_BUTTON object
+        """
+        try:
+            self.SlaveStateThread.Stop()
+        except Exception:
+            pass
+
+
+# -------------------------------------------------------------------------------
+#                    For SDO Management Panel
+# -------------------------------------------------------------------------------
+class SDOPanelClass(wx.Panel):
+    def __init__(self, parent, controler):
+        """
+        Constructor
+        @param parent: Reference to the parent EtherCATManagementTreebook class
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+        wx.Panel.__init__(self, parent, -1)
+
+        self.DatatypeDescription, self.CommunicationObject, self.ManufacturerSpecific, \
+            self.ProfileSpecific, self.Reserved, self.AllSDOData = range(6)
+
+        self.Controler = controler
+
+        self.SDOManagementMainSizer = wx.BoxSizer(wx.VERTICAL)
+        self.SDOManagementInnerMainSizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10)
+
+        self.SDOUpdate = wx.Button(self, label=_('update'))
+        self.SDOUpdate.Bind(wx.EVT_BUTTON, self.SDOInfoUpdate)
+
+        self.CallSDONoteBook = SDONoteBook(self, controler=self.Controler)
+        self.SDOManagementInnerMainSizer.Add(self.SDOUpdate)
+        self.SDOManagementInnerMainSizer.Add(self.CallSDONoteBook, wx.ALL | wx.EXPAND)
+
+        self.SDOManagementMainSizer.Add(self.SDOManagementInnerMainSizer)
+
+        self.SetSizer(self.SDOManagementMainSizer)
+
+    def SDOInfoUpdate(self, event):
+        """
+        Evenet handler for SDO "update" button.
+          - Load SDO data from current slave
+        @param event : wx.EVT_BUTTON object
+        """
+        self.Controler.CommonMethod.SaveSDOData = []
+        self.Controler.CommonMethod.ClearSDODataSet()
+        self.SDOFlag = False
+
+        # Check whether beremiz connected or not.
+        check_connect_flag = self.Controler.CommonMethod.CheckConnect(False)
+        if check_connect_flag:
+            self.SDOs = self.Controler.CommonMethod.GetSlaveSDOFromSlave()
+            # SDOFlag is "False", user click "Cancel" button
+            self.SDOFlag = self.SDOParser()
+
+            if self.SDOFlag:
+                self.CallSDONoteBook.CreateNoteBook()
+                self.Refresh()
+
+    def SDOParser(self):
+        """
+        Parse SDO data set that obtain "SDOInfoUpdate" Method
+        @return True or False
+        """
+
+        slaveSDO_progress = wx.ProgressDialog(_("Slave SDO Monitoring"), _("Now Uploading..."),
+                                              maximum=len(self.SDOs.splitlines()),
+                                              parent=self,
+                                              style=wx.PD_CAN_ABORT | wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME |
+                                              wx.PD_ESTIMATED_TIME | wx.PD_REMAINING_TIME |
+                                              wx.PD_AUTO_HIDE | wx.PD_SMOOTH)
+
+        # If keep_going flag is False, SDOParser method is stop and return "False".
+        keep_going = True
+        count = 0
+
+        # SDO data example
+        # SDO 0x1000, "Device type"
+        # 0x1000:00,r-r-r-,uint32,32 bit,"Device type",0x00020192, 131474
+        for details_line in self.SDOs.splitlines():
+            count += 1
+            line_token = details_line.split("\"")
+            # len(line_token[2]) case : SDO 0x1000, "Device type"
+            if len(line_token[2]) == 0:
+                title_name = line_token[1]
+            # else case : 0x1000:00,r-r-r-,uint32,32 bit,"Device type",0x00020192, 131474
+            else:
+                # line_token = ['0x1000:00,r-r-r-,uint32,32 bit,', 'Device type', ',0x00020192, 131474']
+                token_head, name, token_tail = line_token
+
+                # token_head = ['0x1000:00', 'r-r-r-', 'uint32', '32 bit', '']
+                token_head = token_head.split(",")
+                ful_idx, access, type, size, _empty = token_head
+                # ful_idx.split(":") = ['0x1000', '00']
+                idx, sub_idx = ful_idx.split(":")
+
+                # token_tail = ['', '0x00020192', '131474']
+                token_tail = token_tail.split(",")
+                try:
+                    _empty, hex_val, _dec_val = token_tail
+
+                # SDO data is not return "dec value"
+                # line example :
+                # 0x1702:01,rwr-r-,uint32,32 bit," 1st mapping", ----
+                except Exception:
+                    _empty, hex_val = token_tail
+
+                name_after_check = self.StringTest(name)
+
+                # convert hex type
+                sub_idx = "0x" + sub_idx
+
+                if type == "octet_string":
+                    hex_val = ' ---- '
+
+                # SResult of SlaveSDO data parsing. (data type : dictionary)
+                self.Data = {'idx': idx.strip(), 'subIdx': sub_idx.strip(), 'access': access.strip(),
+                             'type': type.strip(), 'size': size.strip(),  'name': name_after_check.strip("\""),
+                             'value': hex_val.strip(), "category": title_name.strip("\"")}
+
+                category_divide_value = [0x1000, 0x2000, 0x6000, 0xa000, 0xffff]
+
+                for count in range(len(category_divide_value)):
+                    if int(idx, 0) < category_divide_value[count]:
+                        self.Controler.CommonMethod.SaveSDOData[count].append(self.Data)
+                        break
+
+                self.Controler.CommonMethod.SaveSDOData[self.AllSDOData].append(self.Data)
+
+            if count >= len(self.SDOs.splitlines()) // 2:
+                (keep_going, _skip) = slaveSDO_progress.Update(count, "Please waiting a moment!!")
+            else:
+                (keep_going, _skip) = slaveSDO_progress.Update(count)
+
+            # If user click "Cancel" loop suspend immediately
+            if not keep_going:
+                break
+
+        slaveSDO_progress.Destroy()
+        return keep_going
+
+    def StringTest(self, check_string):
+        """
+        Test value 'name' is alphanumeric
+        @param check_string : input data for check
+        @return result : output data after check
+        """
+        # string.printable is print this result
+        # '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+        # !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c
+        allow_range = string.printable
+        result = check_string
+        for i in range(0, len(check_string)):
+            # string.isalnum() is check whether string is alphanumeric or not
+            if check_string[len(check_string)-1-i:len(check_string)-i] in allow_range:
+                result = check_string[:len(check_string) - i]
+                break
+        return result
+
+
+# -------------------------------------------------------------------------------
+#                    For SDO Notebook (divide category)
+# -------------------------------------------------------------------------------
+class SDONoteBook(wx.Notebook):
+    def __init__(self, parent, controler):
+        """
+        Constructor
+        @param parent: Reference to the parent SDOPanelClass class
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+        wx.Notebook.__init__(self, parent, id=-1, size=(850, 500))
+        self.Controler = controler
+        self.parent = parent
+
+        self.CreateNoteBook()
+
+    def CreateNoteBook(self):
+        """
+        Create each NoteBook page, divided SDO index
+        According to EtherCAT Communication(03/2011), 158p
+        """
+        self.Data = []
+        count = 1
+
+        page_texts = [("all", self.parent.AllSDOData),
+                      ("0x0000 - 0x0ff", self.parent.DatatypeDescription),
+                      ("0x1000 - 0x1fff", self.parent.CommunicationObject),
+                      ("0x2000 - 0x5fff", self.parent.ManufacturerSpecific),
+                      ("0x6000 - 0x9fff", self.parent.ProfileSpecific),
+                      ("0xa000 - 0xffff", self.parent.Reserved)]
+
+        # page_tooltip_string = ["SDO Index 0x0000 - 0x0fff : Data Type Description",
+        #                        "SDO Index 0x1000 - 0x1fff : Communication object",
+        #                        "SDO Index 0x2000 - 0x5fff : Manufacturer specific",
+        #                        "SDO Index 0x6000 - 0x9fff : Profile specific",
+        #                        "SDO Index 0xa000 - 0xffff : Reserved",
+        #                        "All SDO Object"]
+
+        self.DeleteAllPages()
+
+        for txt, count in page_texts:
+            self.Data = self.Controler.CommonMethod.SaveSDOData[count]
+            self.Win = SlaveSDOTable(self, self.Data)
+            self.AddPage(self.Win, txt)
+
+
+# -------------------------------------------------------------------------------
+#                    For SDO Grid (fill index, subindex, etc...)
+# -------------------------------------------------------------------------------
+class SlaveSDOTable(wx.grid.Grid):
+    def __init__(self, parent, data):
+        """
+        Constructor
+        @param parent: Reference to the parent SDOPanelClass class
+        @param data: SDO data after parsing "SDOParser" method
+        """
+        wx.grid.Grid.__init__(self, parent, -1, size=(830, 490),
+                              style=wx.EXPAND | wx.ALIGN_CENTRE_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
+
+        self.Controler = parent.Controler
+        self.parent = parent
+        self.SDOFlag = True
+        if data is None:
+            self.SDOs = []
+        else:
+            self.SDOs = data
+
+        self.CreateGrid(len(self.SDOs), 8)
+        SDOCellSize = [(0, 65), (1, 65), (2, 50), (3, 55),
+                       (4, 40), (5, 200), (6, 250), (7, 85)]
+
+        for (index, size) in SDOCellSize:
+            self.SetColSize(index, size)
+
+        self.SetRowLabelSize(0)
+
+        SDOTableLabel = [(0, "Index"), (1, "Subindex"), (2, "Access"),
+                         (3, "Type"), (4, "Size"), (5, "Category"),
+                         (6, "Name"), (7, "Value")]
+
+        for (index, label) in SDOTableLabel:
+            self.SetColLabelValue(index, label)
+            self.SetColLabelAlignment(index, wx.ALIGN_CENTRE)
+
+        attr = wx.grid.GridCellAttr()
+
+        # for SDO download
+        self.Bind(wx.grid.EVT_GRID_CELL_LEFT_DCLICK, self.SDOModifyDialog)
+
+        for i in range(7):
+            self.SetColAttr(i, attr)
+
+        self.SetColLabelAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER)
+
+        self.SetTableValue()
+
+    def SetTableValue(self):
+        """
+        Cell is filled by new parsing data
+        """
+        sdo_list = ['idx', 'subIdx', 'access', 'type', 'size', 'category', 'name', 'value']
+        for row_idx in range(len(self.SDOs)):
+            for col_idx in range(len(self.SDOs[row_idx])):
+                self.SetCellValue(row_idx, col_idx, self.SDOs[row_idx][sdo_list[col_idx]])
+                self.SetReadOnly(row_idx, col_idx, True)
+                if col_idx < 5:
+                    self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
+
+    def CheckSDODataAccess(self, row):
+        """
+        CheckSDODataAccess method is checking that access data has "w"
+        Access field consist 6 char, if mean
+           rw      rw     rw
+        (preop) (safeop) (op)
+        Example Access field : rwrwrw, rwrw--
+        @param row : Selected cell by user
+        @return Write_flag : If data has "w", flag is true
+        """
+        write_flag = False
+        check = self.SDOs[row]['access']
+        if check[1:2] == 'w':
+            self.Controler.CommonMethod.Check_PREOP = True
+            write_flag = True
+        if check[3:4] == 'w':
+            self.Controler.CommonMethod.Check_SAFEOP = True
+            write_flag = True
+        if check[5:] == 'w':
+            self.Controler.CommonMethod.Check_OP = True
+            write_flag = True
+
+        return write_flag
+
+    def DecideSDODownload(self, state):
+        """
+        compare current state and "access" field,
+        result notify SDOModifyDialog method
+        @param state : current slave state
+        @return True or False
+        """
+        # Example of 'state' parameter : "0  0:0  PREOP  +  EL9800 (V4.30) (PIC24, SPI, ET1100)"
+        state = state[self.Controler.GetSlavePos()].split("  ")[2]
+        if state == "PREOP" and self.Controler.CommonMethod.Check_PREOP:
+            return True
+        elif state == "SAFEOP" and self.Controler.CommonMethod.Check_SAFEOP:
+            return True
+        elif state == "OP" and self.Controler.CommonMethod.Check_OP:
+            return True
+
+        return False
+
+    def ClearStateFlag(self):
+        """
+        Initialize StateFlag
+        StateFlag is notice SDOData access each slave state
+        """
+        self.Controler.CommonMethod.Check_PREOP = False
+        self.Controler.CommonMethod.Check_SAFEOP = False
+        self.Controler.CommonMethod.Check_OP = False
+
+    def SDOModifyDialog(self, event):
+        """
+        Create dialog for SDO value modify
+        if user enter data, perform command "ethercat download"
+        @param event : wx.grid.EVT_GRID_CELL_LEFT_DCLICK object
+        """
+        self.ClearStateFlag()
+
+        # CheckSDODataAccess is checking that OD(Object Dictionary) has "w"
+        if event.GetCol() == 7 and self.CheckSDODataAccess(event.GetRow()):
+            dlg = wx.TextEntryDialog(
+                self,
+                _("Enter hex or dec value (if enter dec value, it automatically conversed hex value)"),
+                "SDOModifyDialog",
+                style=wx.OK | wx.CANCEL)
+
+            start_value = self.GetCellValue(event.GetRow(), event.GetCol())
+            dlg.SetValue(start_value)
+
+            if dlg.ShowModal() == wx.ID_OK:
+                try:
+                    int(dlg.GetValue(), 0)
+                    # check "Access" field
+                    if self.DecideSDODownload(self.Controler.CommonMethod.SlaveState[self.Controler.GetSlavePos()]):
+                        # Request "SDODownload"
+                        self.Controler.CommonMethod.SDODownload(
+                            self.SDOs[event.GetRow()]['type'],
+                            self.SDOs[event.GetRow()]['idx'],
+                            self.SDOs[event.GetRow()]['subIdx'],
+                            dlg.GetValue())
+
+                        self.SetCellValue(event.GetRow(), event.GetCol(), hex(int(dlg.GetValue(), 0)))
+                    else:
+                        self.Controler.CommonMethod.CreateErrorDialog(_('You cannot SDO download this state'))
+                # Error occured process of "int(variable)"
+                # User input is not hex, dec value
+                except ValueError:
+                    self.Controler.CommonMethod.CreateErrorDialog(_('You can input only hex, dec value'))
+
+
+# -------------------------------------------------------------------------------
+#                 For PDO Monitoring Panel
+# PDO Class UI  : Panel -> Choicebook (RxPDO, TxPDO) ->
+#                 Notebook (PDO Index) -> Grid (PDO entry)
+# -------------------------------------------------------------------------------
+class PDOPanelClass(wx.Panel):
+    def __init__(self, parent, controler):
+        """
+        Constructor
+        @param parent: Reference to the parent EtherCATManagementTreebook class
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+        wx.Panel.__init__(self, parent, -1)
+        self.Controler = controler
+
+        self.PDOMonitoringEditorMainSizer = wx.BoxSizer(wx.VERTICAL)
+        self.PDOMonitoringEditorInnerMainSizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10)
+
+        self.CallPDOChoicebook = PDOChoicebook(self, controler=self.Controler)
+        self.PDOMonitoringEditorInnerMainSizer.Add(self.CallPDOChoicebook, wx.ALL)
+
+        self.PDOMonitoringEditorMainSizer.Add(self.PDOMonitoringEditorInnerMainSizer)
+
+        self.SetSizer(self.PDOMonitoringEditorMainSizer)
+
+    def PDOInfoUpdate(self):
+        """
+        Call RequestPDOInfo method and create Choicebook
+        """
+        self.Controler.CommonMethod.RequestPDOInfo()
+        self.CallPDOChoicebook.Destroy()
+        self.CallPDOChoicebook = PDOChoicebook(self, controler=self.Controler)
+        self.Refresh()
+
+
+# -------------------------------------------------------------------------------
+#                    For PDO Choicebook (divide Tx, Rx PDO)
+# -------------------------------------------------------------------------------
+class PDOChoicebook(wx.Choicebook):
+    def __init__(self, parent, controler):
+        """
+        Constructor
+        @param parent: Reference to the parent PDOPanelClass class
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+        wx.Choicebook.__init__(self, parent, id=-1, size=(500, 500), style=wx.CHB_DEFAULT)
+        self.Controler = controler
+
+        RxWin = PDONoteBook(self, controler=self.Controler, name="Rx")
+        TxWin = PDONoteBook(self, controler=self.Controler, name="Tx")
+        self.AddPage(RxWin, "RxPDO")
+        self.AddPage(TxWin, "TxPDO")
+
+
+# -------------------------------------------------------------------------------
+#                    For PDO Notebook (divide PDO index)
+# -------------------------------------------------------------------------------
+class PDONoteBook(wx.Notebook):
+    def __init__(self, parent, name, controler):
+        """
+        Constructor
+        @param parent: Reference to the parent PDOChoicebook class
+        @param name: identifier whether RxPDO or TxPDO
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+        wx.Notebook.__init__(self, parent, id=-1, size=(640, 400))
+        self.Controler = controler
+
+        count = 0
+        page_texts = []
+
+        self.Controler.CommonMethod.RequestPDOInfo()
+
+        if name == "Tx":
+            # obtain pdo_info and pdo_entry
+            # pdo_info include (PDO index, name, number of entry)
+            pdo_info = self.Controler.CommonMethod.GetTxPDOCategory()
+            pdo_entry = self.Controler.CommonMethod.GetTxPDOInfo()
+            for tmp in pdo_info:
+                title = str(hex(tmp['pdo_index']))
+                page_texts.append(title)
+        # RX PDO case
+        else:
+            pdo_info = self.Controler.CommonMethod.GetRxPDOCategory()
+            pdo_entry = self.Controler.CommonMethod.GetRxPDOInfo()
+            for tmp in pdo_info:
+                title = str(hex(tmp['pdo_index']))
+                page_texts.append(title)
+
+        # Add page depending on the number of pdo_info
+        for txt in page_texts:
+            win = PDOEntryTable(self, pdo_info, pdo_entry, count)
+            self.AddPage(win, txt)
+            count += 1
+
+
+# -------------------------------------------------------------------------------
+#                    For PDO Grid (fill entry index, subindex etc...)
+# -------------------------------------------------------------------------------
+class PDOEntryTable(wx.grid.Grid):
+    def __init__(self, parent, info, entry, count):
+        """
+        Constructor
+        @param parent: Reference to the parent PDONoteBook class
+        @param info : data structure including entry index, sub index, name, length, type
+        @param entry : data structure including index, name, entry number
+        @param count : page number
+        """
+        wx.grid.Grid.__init__(self, parent, -1, size=(500, 400), pos=wx.Point(0, 0),
+                              style=wx.EXPAND | wx.ALIGN_CENTRE_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
+
+        self.Controler = parent.Controler
+
+        self.PDOInfo = info
+        self.PDOEntry = entry
+        self.Count = count
+
+        self.CreateGrid(self.PDOInfo[self.Count]['number_of_entry'], 5)
+        self.SetColLabelSize(25)
+        self.SetRowLabelSize(0)
+
+        PDOTableLabel = [(0, "Index"), (1, "Subindex"), (2, "Length"),
+                         (3, "Type"), (4, "Name")]
+
+        for (index, label) in PDOTableLabel:
+            self.SetColLabelValue(index, label)
+
+        PDOCellSize = [(0, 45), (1, 65), (2, 55), (3, 40), (4, 300)]
+
+        for (index, size) in PDOCellSize:
+            self.SetColSize(index, size)
+            self.SetColLabelAlignment(index, wx.ALIGN_LEFT)
+
+        attr = wx.grid.GridCellAttr()
+
+        for i in range(5):
+            self.SetColAttr(i, attr)
+
+        self.SetTableValue()
+
+    def SetTableValue(self):
+        """
+        Cell is filled by new parsing data in XML
+        """
+        list_index = 0
+        # number of entry
+        for i in range(self.Count + 1):
+            list_index += self.PDOInfo[i]['number_of_entry']
+
+        start_value = list_index - self.PDOInfo[self.Count]['number_of_entry']
+
+        pdo_list = ['entry_index', 'subindex', 'bitlen', 'type', 'name']
+        for row_idx in range(self.PDOInfo[self.Count]['number_of_entry']):
+            for col_idx in range(len(self.PDOEntry[row_idx])):
+                # entry index is converted hex value.
+                if col_idx == 0:
+                    self.SetCellValue(row_idx, col_idx, hex(self.PDOEntry[start_value][pdo_list[col_idx]]))
+                else:
+                    self.SetCellValue(row_idx, col_idx, str(self.PDOEntry[start_value][pdo_list[col_idx]]))
+                if col_idx != 4:
+                    self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
+                else:
+                    self.SetCellAlignment(row_idx, col_idx, wx.ALIGN_LEFT, wx.ALIGN_CENTRE)
+                self.SetReadOnly(row_idx, col_idx, True)
+                self.SetRowSize(row_idx, 25)
+            start_value += 1
+
+
+# -------------------------------------------------------------------------------
+#                    For EEPROM Access Main Panel
+#                 (This class explain EEPROM Access)
+# -------------------------------------------------------------------------------
+class EEPROMAccessPanel(wx.Panel):
+    def __init__(self, parent, controler):
+        """
+        Constructor
+        @param parent: Reference to the parent EtherCATManagementTreebook class
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+        wx.Panel.__init__(self, parent, -1)
+        sizer = wx.FlexGridSizer(cols=1, hgap=20, rows=3, vgap=20)
+
+        line = wx.StaticText(self, -1, "\n  EEPROM Access is composed to SmartView and HexView. \
+                                              \n\n   - SmartView shows Config Data, Device Identity, Mailbox settings, etc. \
+                                              \n\n   - HexView shows EEPROM's contents.")
+
+        sizer.Add(line)
+
+        self.SetSizer(sizer)
+
+
+# -------------------------------------------------------------------------------
+#                    For Smart View Panel
+# -------------------------------------------------------------------------------
+class SlaveSiiSmartView(wx.Panel):
+    def __init__(self, parent, controler):
+        """
+        Constructor
+        @param parent: Reference to the parent EtherCATManagementTreebook class
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+        wx.Panel.__init__(self, parent, -1)
+        self.parent = parent
+        self.Controler = controler
+
+        self.PDIType = {
+            0: ['none', '00000000'],
+            4: ['Digital I/O', '00000100'],
+            5: ['SPI Slave', '00000101'],
+            7: ['EtherCAT Bridge (port3)', '00000111'],
+            8: ['uC async. 16bit', '00001000'],
+            9: ['uC async. 8bit', '00001001'],
+            10: ['uC sync. 16bit', '00001010'],
+            11: ['uC sync. 8bit', '00001011'],
+            16: ['32 Digtal Input and 0 Digital Output', '00010000'],
+            17: ['24 Digtal Input and 8 Digital Output', '00010001'],
+            18: ['16 Digtal Input and 16 Digital Output', '00010010'],
+            19: ['8 Digtal Input and 24 Digital Output', '00010011'],
+            20: ['0 Digtal Input and 32 Digital Output', '00010100'],
+            128: ['On-chip bus', '11111111']
+        }
+
+        sizer = wx.FlexGridSizer(cols=1, hgap=5, rows=2, vgap=5)
+        button_sizer = wx.FlexGridSizer(cols=2, hgap=5, rows=1, vgap=5)
+
+        for button, mapping_method in [("Write EEPROM", self.WriteToEEPROM),
+                                       ("Read EEPROM", self.ReadFromEEPROM)]:
+            btn = wx.Button(self, -1, button, size=(150, 40))
+            button_sizer.Add(btn, border=10, flag=wx.ALL)
+            btn.Bind(wx.EVT_BUTTON, mapping_method)
+
+        self.TreeListCtrl = SmartViewTreeListCtrl(self, self.Controler)
+
+        sizer.Add(button_sizer, border=10, flag=wx.ALL)
+        sizer.Add(self.TreeListCtrl, border=10, flag=wx.ALL)
+        self.SetSizer(sizer)
+
+        self.Create_SmartView()
+
+    def Create_SmartView(self):
+        """
+        SmartView shows information based on XML as initial value.
+        """
+        self.Controler.CommonMethod.SmartViewInfosFromXML = self.Controler.CommonMethod.GetSmartViewInfos()
+        self.SetXMLData()
+
+    def WriteToEEPROM(self, event):
+        """
+        Open binary file (user select) and write the selected binary data to EEPROM
+        @param event : wx.EVT_BUTTON object
+        """
+        # Check whether beremiz connected or not, and whether status is "Started" or not.
+        check_connect_flag = self.Controler.CommonMethod.CheckConnect(False)
+        if check_connect_flag:
+            status, _log_count = self.Controler.GetCTRoot()._connector.GetPLCstatus()
+            if status is not PlcStatus.Started:
+                dialog = wx.FileDialog(self, _("Choose a binary file"), os.getcwd(), "",  _("bin files (*.bin)|*.bin"), wx.OPEN)
+
+                if dialog.ShowModal() == wx.ID_OK:
+                    filepath = dialog.GetPath()
+                    try:
+                        binfile = open(filepath, "rb")
+                        self.SiiBinary = binfile.read()
+                        dialog.Destroy()
+
+                        self.Controler.CommonMethod.SiiWrite(self.SiiBinary)
+                        # refresh data structure kept by master
+                        self.Controler.CommonMethod.Rescan()
+                        # save binary data as inner global data of beremiz
+                        # for fast loading when slave plugin node is reopened.
+                        self.Controler.CommonMethod.SiiData = self.SiiBinary
+                        self.SetEEPROMData()
+                    except Exception:
+                        self.Controler.CommonMethod.CreateErrorDialog(_('The file does not exist!'))
+                        dialog.Destroy()
+
+    def ReadFromEEPROM(self, event):
+        """
+        Refresh displayed data based on slave EEPROM and save binary file through dialog
+        @param event : wx.EVT_BUTTON object
+        """
+        # Check whether beremiz connected or not.
+        check_connect_flag = self.Controler.CommonMethod.CheckConnect(False)
+        if check_connect_flag:
+            self.SiiBinary = self.Controler.CommonMethod.LoadData()
+            self.SetEEPROMData()
+            dialog = wx.FileDialog(self, _("Save as..."), os.getcwd(),
+                                   "slave0.bin",  _("bin files (*.bin)|*.bin|All files|*.*"),
+                                   wx.SAVE | wx.OVERWRITE_PROMPT)
+
+            if dialog.ShowModal() == wx.ID_OK:
+                filepath = dialog.GetPath()
+                binfile = open(filepath, "wb")
+                binfile.write(self.SiiBinary)
+                binfile.close()
+
+            dialog.Destroy()
+
+    def SetXMLData(self):
+        """
+        Set data based on XML initially
+        """
+        # Config Data: EEPROM Size, PDI Type, Device Emulation
+        # Find PDI Type in pdiType dictionary
+        cnt_pdi_type = self.Controler.CommonMethod.SmartViewInfosFromXML["pdi_type"]
+        for i in self.PDIType.keys():
+            if cnt_pdi_type == i:
+                cnt_pdi_type = self.PDIType[i][0]
+                break
+        #  Set Config Data
+        for treelist, data in [("EEPROM Size (Bytes)",
+                                str(self.Controler.CommonMethod.SmartViewInfosFromXML["eeprom_size"])),
+                               ("PDI Type",
+                                cnt_pdi_type),
+                               ("Device Emulation",
+                                self.Controler.CommonMethod.SmartViewInfosFromXML["device_emulation"])]:
+            self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.ConfigData[treelist], data, 1)
+
+        # Device Identity: Vendor ID, Product Code, Revision No., Serial No.
+        #  Set Device Identity
+        for treelist, data in [("Vendor ID", self.Controler.CommonMethod.SmartViewInfosFromXML["vendor_id"]),
+                               ("Product Code", self.Controler.CommonMethod.SmartViewInfosFromXML["product_code"]),
+                               ("Revision No.", self.Controler.CommonMethod.SmartViewInfosFromXML["revision_no"]),
+                               ("Serial No.", self.Controler.CommonMethod.SmartViewInfosFromXML["serial_no"])]:
+            self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.DeviceIdentity[treelist], data, 1)
+
+        # Mailbox: Supported Mailbox, Bootstrap Configuration, Standard Configuration
+        #  Set Mailbox
+        for treelist, data in [("Supported Mailbox", self.Controler.CommonMethod.SmartViewInfosFromXML["supported_mailbox"]),
+                               ("Bootstrap Configuration", ""),
+                               ("Standard Configuration", "")]:
+            self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.Mailbox[treelist], data, 1)
+        #  Set Bootstrap Configuration: Receive Offset, Receive Size, Send Offset, Send Size
+        for treelist, data in [("Receive Offset", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_bootstrapconf_outstart"]),
+                               ("Receive Size", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_bootstrapconf_outlength"]),
+                               ("Send Offset", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_bootstrapconf_instart"]),
+                               ("Send Size", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_bootstrapconf_inlength"])]:
+            self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.BootstrapConfig[treelist], data, 1)
+        #  Set Standard Configuration: Receive Offset, Receive Size, Send Offset, Send Size
+        for treelist, data in [("Receive Offset", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_standardconf_outstart"]),
+                               ("Receive Size", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_standardconf_outlength"]),
+                               ("Send Offset", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_standardconf_instart"]),
+                               ("Send Size", self.Controler.CommonMethod.SmartViewInfosFromXML["mailbox_standardconf_inlength"])]:
+            self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.StandardConfig[treelist], data, 1)
+
+    def SetEEPROMData(self):
+        """
+        Set data based on slave EEPROM.
+        """
+        # sii_dict = { Parameter : (WordAddress, WordSize) }
+        sii_dict = {
+            'PDIControl':                          ('0', 1),
+            'PDIConfiguration':                    ('1', 1),
+            'PulseLengthOfSYNCSignals':            ('2', 1),
+            'ExtendedPDIConfiguration':            ('3', 1),
+            'ConfiguredStationAlias':              ('4', 1),
+            'Checksum':                            ('7', 1),
+            'VendorID':                            ('8', 2),
+            'ProductCode':                         ('a', 2),
+            'RevisionNumber':                      ('c', 2),
+            'SerialNumber':                        ('e', 2),
+            'Execution Delay':                     ('10', 1),
+            'Port0Delay':                          ('11', 1),
+            'Port1Delay':                          ('12', 1),
+            'BootstrapReceiveMailboxOffset':       ('14', 1),
+            'BootstrapReceiveMailboxSize':         ('15', 1),
+            'BootstrapSendMailboxOffset':          ('16', 1),
+            'BootstrapSendMailboxSize':            ('17', 1),
+            'StandardReceiveMailboxOffset':        ('18', 1),
+            'StandardReceiveMailboxSize':          ('19', 1),
+            'StandardSendMailboxOffset':           ('1a', 1),
+            'StandardSendMailboxSize':             ('1b', 1),
+            'MailboxProtocol':                     ('1c', 1),
+            'Size':                                ('3e', 1),
+            'Version':                             ('3f', 1),
+            'First Category Type/Vendor Specific': ('40', 1),
+            'Following Category Word Size':        ('41', 1),
+            'Category Data':                       ('42', 1),
+        }
+
+        # Config Data: EEPROM Size, PDI Type, Device Emulation
+        # EEPROM's data in address '0x003f' is Size of EEPROM in KBit-1
+        eeprom_size = str((int(self.GetWordAddressData(sii_dict.get('Size'), 10))+1)//8*1024)
+        # Find PDI Type in pdiType dictionary
+        cnt_pdi_type = int(self.GetWordAddressData(sii_dict.get('PDIControl'), 16).split('x')[1][2:4], 16)
+        for i in self.PDIType.keys():
+            if cnt_pdi_type == i:
+                cnt_pdi_type = self.PDIType[i][0]
+                break
+        #  Get Device Emulation
+        device_emulation = str(bool(int("{:0>16b}".format(int(self.GetWordAddressData(sii_dict.get('PDIControl'), 16), 16))[7])))
+        #  Set Config Data
+        for treelist, data in [("EEPROM Size (Bytes)", eeprom_size),
+                               ("PDI Type", cnt_pdi_type),
+                               ("Device Emulation", device_emulation)]:
+            self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.ConfigData[treelist], data, 1)
+
+        # Device Identity: Vendor ID, Product Code, Revision No., Serial No.
+        #  Set Device Identity
+        for treelist, data in [
+                ("Vendor ID", self.GetWordAddressData(sii_dict.get('VendorID'), 16)),
+                ("Product Code", self.GetWordAddressData(sii_dict.get('ProductCode'), 16)),
+                ("Revision No.", self.GetWordAddressData(sii_dict.get('RevisionNumber'), 16)),
+                ("Serial No.", self.GetWordAddressData(sii_dict.get('SerialNumber'), 16))]:
+            self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.DeviceIdentity[treelist], data, 1)
+
+        # Mailbox
+        # EEORPOM's word address '1c' indicates supported mailbox protocol.
+        # each value of mailbox protocol :
+        # VoE(0x0020), SoE(0x0010), FoE(0x0008), CoE(0x0004), EoE(0x0002), AoE(0x0001)
+        supported_mailbox = ""
+        mailbox_protocol = ["VoE,  ", "SoE,  ", "FoE,  ", "CoE,  ", "EoE,  ", "AoE,  "]
+        mailbox_data = "{:0>8b}".format(int(self.GetWordAddressData(sii_dict.get('MailboxProtocol'), 16), 16))
+        for protocol in range(6):
+            if mailbox_data[protocol+2] == '1':
+                supported_mailbox += mailbox_protocol[protocol]
+        supported_mailbox = supported_mailbox.strip(",  ")
+        #  Set Mailbox
+        for treelist, data in [("Supported Mailbox", supported_mailbox),
+                               ("Bootstrap Configuration", ""),
+                               ("Standard Configuration", "")]:
+            self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.Mailbox[treelist], data, 1)
+        #  Set Bootstrap Configuration: Receive Offset, Receive Size, Send Offset, Send Size
+        for treelist, data in [
+                ("Receive Offset", self.GetWordAddressData(sii_dict.get('BootstrapReceiveMailboxOffset'), 10)),
+                ("Receive Size", self.GetWordAddressData(sii_dict.get('BootstrapReceiveMailboxSize'), 10)),
+                ("Send Offset", self.GetWordAddressData(sii_dict.get('BootstrapSendMailboxOffset'), 10)),
+                ("Send Size", self.GetWordAddressData(sii_dict.get('BootstrapSendMailboxSize'), 10))]:
+            self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.BootstrapConfig[treelist], data, 1)
+        #  Set Standard Configuration: Receive Offset, Receive Size, Send Offset, Send Size
+        for treelist, data in [
+                ("Receive Offset", self.GetWordAddressData(sii_dict.get('StandardReceiveMailboxOffset'), 10)),
+                ("Receive Size", self.GetWordAddressData(sii_dict.get('StandardReceiveMailboxSize'), 10)),
+                ("Send Offset", self.GetWordAddressData(sii_dict.get('StandardSendMailboxOffset'), 10)),
+                ("Send Size", self.GetWordAddressData(sii_dict.get('StandardSendMailboxSize'), 10))]:
+            self.TreeListCtrl.Tree.SetItemText(self.TreeListCtrl.StandardConfig[treelist], data, 1)
+
+    def MakeStaticBoxSizer(self, boxlabel):
+        """
+        Make StaticBoxSizer
+        @param boxlabel : label of box sizer
+        @return sizer : the StaticBoxSizer labeled 'boxlabel'
+        """
+        box = wx.StaticBox(self, -1, boxlabel)
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+
+        return sizer
+
+    def GetWordAddressData(self, dict_tuple, format):
+        """
+        This method converts word address data from EEPROM binary.
+        @param dict_tuple : element of 'sii_dict' dictionary in SetEEPROMData()
+        @param format : format of data. It can be 16(hex), 10(decimal) and 2(binary).
+        @return formatted value
+        """
+        offset = int(str(dict_tuple[0]), 16) * 2
+        length = int(str(dict_tuple[1]), 16) * 2
+        list = []
+        data = ''
+        for index in range(length):
+            hexdata = hex(ord(self.SiiBinary[offset + index]))[2:]
+            list.append(hexdata.zfill(2))
+
+        list.reverse()
+        data = list[0:length]
+
+        if format == 16:
+            return '0x' + ''.join(data)
+        elif format == 10:
+            return str(int(str(''.join(data)), 16))
+        elif format == 2:
+            ''.join(data)
+
+
+# -------------------------------------------------------------------------------
+#                    For Smart View TreeListCtrl
+# -------------------------------------------------------------------------------
+class SmartViewTreeListCtrl(wx.Panel):
+    def __init__(self, parent, Controler):
+        """
+        Constructor
+        @param parent: Reference to the parent SlaveSiiSmartView class
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+
+        wx.Panel.__init__(self, parent, -1, size=(350, 500))
+
+        self.Tree = wx.gizmos.TreeListCtrl(self, -1, size=(350, 500),
+                                           style=(wx.TR_DEFAULT_STYLE |
+                                                  wx.TR_FULL_ROW_HIGHLIGHT |
+                                                  wx.TR_HIDE_ROOT |
+                                                  wx.TR_COLUMN_LINES |
+                                                  wx.TR_ROW_LINES))
+
+        self.Tree.AddColumn("Description", width=200)
+        self.Tree.AddColumn("Value", width=140)
+        self.Tree.SetMainColumn(0)
+
+        self.Root = self.Tree.AddRoot("")
+
+        # Add item
+        #  Level 1 nodes
+        self.Level1Nodes = {}
+        for lv1 in ["Config Data", "Device Identity", "Mailbox"]:
+            self.Level1Nodes[lv1] = self.Tree.AppendItem(self.Root, lv1)
+
+        #  Level 2 nodes
+        #   Config Data
+        self.ConfigData = {}
+        for lv2 in ["EEPROM Size (Bytes)", "PDI Type", "Device Emulation"]:
+            self.ConfigData[lv2] = self.Tree.AppendItem(self.Level1Nodes["Config Data"], lv2)
+        #   Device Identity
+        self.DeviceIdentity = {}
+        for lv2 in ["Vendor ID", "Product Code", "Revision No.", "Serial No."]:
+            self.DeviceIdentity[lv2] = self.Tree.AppendItem(self.Level1Nodes["Device Identity"], lv2)
+        #   Mailbox
+        self.Mailbox = {}
+        for lv2 in ["Supported Mailbox", "Bootstrap Configuration", "Standard Configuration"]:
+            self.Mailbox[lv2] = self.Tree.AppendItem(self.Level1Nodes["Mailbox"], lv2)
+
+        #  Level 3 nodes
+        #   Children of Bootstrap Configuration
+        self.BootstrapConfig = {}
+        for lv3 in ["Receive Offset", "Receive Size", "Send Offset", "Send Size"]:
+            self.BootstrapConfig[lv3] = self.Tree.AppendItem(self.Mailbox["Bootstrap Configuration"], lv3)
+        #   Children of Standard Configuration
+        self.StandardConfig = {}
+        for lv3 in ["Receive Offset", "Receive Size", "Send Offset", "Send Size"]:
+            self.StandardConfig[lv3] = self.Tree.AppendItem(self.Mailbox["Standard Configuration"], lv3)
+
+        # Expand Tree
+        for tree in [self.Root,
+                     self.Level1Nodes["Config Data"],
+                     self.Level1Nodes["Device Identity"],
+                     self.Level1Nodes["Mailbox"],
+                     self.Mailbox["Bootstrap Configuration"],
+                     self.Mailbox["Standard Configuration"]]:
+            self.Tree.Expand(tree)
+
+
+# -------------------------------------------------------------------------------
+#                         For Hex View Panel
+#            shows EEPROM binary as hex data and characters.
+# -------------------------------------------------------------------------------
+class HexView(wx.Panel):
+    def __init__(self, parent, controler):
+        """
+        Constructor
+        @param parent: Reference to the parent EtherCATManagementTreebook class
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+        wx.Panel.__init__(self, parent, -1)
+        self.parent = parent
+        self.Controler = controler
+
+        self.HexRow = 8
+        self.HexCol = 17
+
+        self.HexViewSizer = {"view": wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=10),
+                             "siiButton": wx.BoxSizer()}
+        self.HexViewButton = {}
+
+        for key, evt_handler in [
+                ("Sii Upload", self.OnButtonSiiUpload),
+                ("Sii Download", self.OnButtonSiiDownload),
+                ("Write to File", self.OnButtonWriteToBinFile),
+                ("Read from File", self.OnButtonReadFromBinFile),
+                ("XML to EEPROM Image", self.OnButtonXmlToEEPROMImg)]:
+            self.HexViewButton[key] = wx.Button(self, -1, key)
+            self.HexViewButton[key].Bind(wx.EVT_BUTTON, evt_handler)
+            self.HexViewSizer["siiButton"].Add(self.HexViewButton[key])
+
+        self.SiiBinary = self.Controler.CommonMethod.XmlToEeprom()
+        self.HexCode, self.HexRow, self.HexCol = self.Controler.CommonMethod.HexRead(self.SiiBinary)
+        self.SiiGrid = SiiGridTable(self, self.Controler, self.HexRow, self.HexCol)
+        self.HexViewSizer["view"].AddMany([self.HexViewSizer["siiButton"], self.SiiGrid])
+        self.SiiGrid.CreateGrid(self.HexRow, self.HexCol)
+        self.SetSizer(self.HexViewSizer["view"])
+        self.HexViewSizer["view"].FitInside(self.parent.parent)
+        self.parent.parent.FitInside()
+        self.SiiGrid.SetValue(self.HexCode)
+        self.SiiGrid.Update()
+
+    def UpdateSiiGridTable(self, row, col):
+        """
+        Destroy existing grid and recreate
+        @param row, col : Hex View grid size
+        """
+        self.HexViewSizer["view"].Detach(self.SiiGrid)
+        self.SiiGrid.Destroy()
+        self.SiiGrid = SiiGridTable(self, self.Controler, row, col)
+        self.HexViewSizer["view"].Add(self.SiiGrid)
+        self.SiiGrid.CreateGrid(row, col)
+        self.SetSizer(self.HexViewSizer["view"])
+        self.HexViewSizer["view"].FitInside(self.parent.parent)
+        self.parent.parent.FitInside()
+
+    def OnButtonSiiUpload(self, event):
+        """
+        Load EEPROM data from slave and refresh Hex View grid
+        Binded to 'Sii Upload' button.
+        @param event : wx.EVT_BUTTON object
+        """
+        # Check whether beremiz connected or not.
+        check_connect_flag = self.Controler.CommonMethod.CheckConnect(False)
+        if check_connect_flag:
+            # load from EEPROM data and parsing
+            self.SiiBinary = self.Controler.CommonMethod.LoadData()
+            self.HexCode, self.HexRow, self.HexCol = self.Controler.CommonMethod.HexRead(self.SiiBinary)
+            self.UpdateSiiGridTable(self.HexRow, self.HexCol)
+            self.SiiGrid.SetValue(self.HexCode)
+            self.SiiGrid.Update()
+
+    def OnButtonSiiDownload(self, event):
+        """
+        Write current EEPROM data to slave and refresh data structure kept by master
+        Binded to 'Sii Download' button.
+        @param event : wx.EVT_BUTTON object
+        """
+        # Check whether beremiz connected or not,
+        # and whether status is "Started" or not.
+        check_connect_flag = self.Controler.CommonMethod.CheckConnect(False)
+        if check_connect_flag:
+            status, _log_count = self.Controler.GetCTRoot()._connector.GetPLCstatus()
+            if status is not PlcStatus.Started:
+                self.Controler.CommonMethod.SiiWrite(self.SiiBinary)
+                self.Controler.CommonMethod.Rescan()
+
+    def OnButtonWriteToBinFile(self, event):
+        """
+        Save current EEPROM data to binary file through FileDialog
+        Binded to 'Write to File' button.
+        @param event : wx.EVT_BUTTON object
+        """
+        dialog = wx.FileDialog(self, _("Save as..."), os.getcwd(), "slave0.bin",
+                               _("bin files (*.bin)|*.bin|All files|*.*"), wx.SAVE | wx.OVERWRITE_PROMPT)
+
+        if dialog.ShowModal() == wx.ID_OK:
+            filepath = dialog.GetPath()
+            binfile = open(filepath, "wb")
+            binfile.write(self.SiiBinary)
+            binfile.close()
+
+        dialog.Destroy()
+
+    def OnButtonReadFromBinFile(self, event):
+        """
+        Load binary file through FileDialog
+        Binded to 'Read from File' button.
+        @param event : wx.EVT_BUTTON object
+        """
+        dialog = wx.FileDialog(self, _("Choose a binary file"), os.getcwd(), "",
+                               _("bin files (*.bin)|*.bin"), wx.OPEN)
+
+        if dialog.ShowModal() == wx.ID_OK:
+            filepath = dialog.GetPath()
+
+            try:
+                binfile = open(filepath, "rb")
+                self.SiiBinary = binfile.read()
+                self.HexCode, self.HexRow, self.HexCol = self.Controler.CommonMethod.HexRead(self.SiiBinary)
+                self.UpdateSiiGridTable(self.HexRow, self.HexCol)
+                self.SiiGrid.SetValue(self.HexCode)
+                self.SiiGrid.Update()
+            except Exception:
+                self.Controler.CommonMethod.CreateErrorDialog(_('The file does not exist!'))
+
+        dialog.Destroy()
+
+    def OnButtonXmlToEEPROMImg(self, event):
+        """
+        Create EEPROM data based XML data that current imported
+        Binded to 'XML to EEPROM' button.
+        @param event : wx.EVT_BUTTON object
+        """
+        self.SiiBinary = self.Controler.CommonMethod.XmlToEeprom()
+        self.HexCode, self.HexRow, self.HexCol = self.Controler.CommonMethod.HexRead(self.SiiBinary)
+        self.UpdateSiiGridTable(self.HexRow, self.HexCol)
+        self.SiiGrid.SetValue(self.HexCode)
+        self.SiiGrid.Update()
+
+
+# -------------------------------------------------------------------------------
+#                    For Hex View grid (fill hex data)
+# -------------------------------------------------------------------------------
+class SiiGridTable(wx.grid.Grid):
+    def __init__(self, parent, controler, row, col):
+        """
+        Constructor
+        @param parent: Reference to the parent HexView class
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        @param row, col: Hex View grid size
+        """
+        self.parent = parent
+        self.Controler = controler
+        self.Row = row
+        self.Col = col
+
+        wx.grid.Grid.__init__(self, parent, -1, size=(830, 450),
+                              style=wx.ALIGN_CENTRE_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
+
+    def SetValue(self, value):
+        """
+        Set data in the table
+        @param value: EEPROM data list of which element is 1 Byte hex data
+        """
+        # set label name and size
+        self.SetRowLabelSize(100)
+        for col in range(self.Col):
+            if col == 16:
+                self.SetColLabelValue(16, "Text View")
+                self.SetColSize(16, (self.GetSize().x-120)*4//20)
+            else:
+                self.SetColLabelValue(col, '%s' % col)
+                self.SetColSize(col, (self.GetSize().x-120)//20)
+
+        # set data into table
+        row = col = 0
+        for row_idx in value:
+            col = 0
+            self.SetRowLabelValue(row, "0x"+"{:0>4x}".format(row*(self.Col-1)))
+            for hex in row_idx:
+                self.SetCellValue(row, col, hex)
+
+                if col == 16:
+                    self.SetCellAlignment(row, col, wx.ALIGN_LEFT, wx.ALIGN_CENTER)
+                else:
+                    self.SetCellAlignment(row, col, wx.ALIGN_CENTRE, wx.ALIGN_CENTER)
+
+                self.SetReadOnly(row, col, True)
+                col = col + 1
+            row = row + 1
+
+
+# -------------------------------------------------------------------------------
+#                    For Register Access Panel
+# -------------------------------------------------------------------------------
+class RegisterAccessPanel(wx.Panel):
+    def __init__(self, parent, controler):
+        """
+        Constructor
+        @param parent: EEPROMAccessPanel object
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+        self.parent = parent
+        self.Controler = controler
+        self.__init_data()
+
+        wx.Panel.__init__(self, parent, -1)
+
+        sizer = wx.FlexGridSizer(cols=1, hgap=20, rows=2, vgap=5)
+        button_sizer = wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=10)
+
+        self.ReloadButton = wx.Button(self, -1, "Reload")
+        self.CompactViewCheckbox = wx.CheckBox(self, -1, "Compact View")
+        self.RegisterNotebook = RegisterNotebook(self, self.Controler)
+
+        button_sizer.AddMany([self.ReloadButton, self.CompactViewCheckbox])
+        sizer.AddMany([button_sizer, self.RegisterNotebook])
+        self.SetSizer(sizer)
+
+        self.ReloadButton.Bind(wx.EVT_BUTTON, self.OnReloadButton)
+        self.CompactViewCheckbox.Bind(wx.EVT_CHECKBOX, self.ToggleCompactViewCheckbox)
+
+        for index in range(4):
+            self.RegisterNotebook.RegPage[index].MainTable.CreateGrid(self.MainRow[index], self.MainCol)
+            self.RegisterNotebook.RegPage[index].MainTable.SetValue(self, 0, index*512, (index+1)*512)
+
+        # data default setting
+        if self.Controler.CommonMethod.RegData == "":
+            self.CompactViewCheckbox.Disable()
+            for index in range(4):
+                self.RegisterNotebook.RegPage[index].MainTable.SetValue(self, 0, index*512, (index+1)*512)
+        else:  # If data was saved,
+            self.BasicSetData()
+            self.ParseData()
+            for index in range(4):
+                self.RegisterNotebook.RegPage[index].MainTable.SetValue(self, self.RegMonitorData, index*512, (index+1)*512)
+
+    def __init_data(self):
+        """
+        Declare initial data.
+        """
+        # flag for compact view
+        self.CompactFlag = False
+
+        # main grid의 rows and cols
+        self.MainRow = [512, 512, 512, 512]
+        self.MainCol = 4
+
+        # main grids' data range
+        self.PageRange = []
+        for index in range(4):
+            self.PageRange.append([512*index, 512*(index+1)])
+
+        #  Previous value of register data for register description configuration
+        self.PreRegSpec = {"ESCType": "",
+                           "FMMUNumber": "",
+                           "SMNumber": "",
+                           "PDIType": ""}
+
+    def LoadData(self):
+        """
+        Get data from the register.
+        """
+        self.Controler.CommonMethod.RegData = ""
+        # ethercat reg_read
+        # ex : ethercat reg_read -p 0 0x0000 0x0001
+        # return value : 0x11
+        for index in range(4):
+            self.Controler.CommonMethod.RegData = self.Controler.CommonMethod.RegData + " " + self.Controler.CommonMethod.RegRead("0x"+"{:0>4x}".format(index*1024), "0x0400")
+
+        # store previous value
+        # (ESC type, port number of FMMU, port number of SM, and PDI type))
+        for reg_spec in ["ESCType", "FMMUNumber", "SMNumber", "PDIType"]:
+            self.PreRegSpec[reg_spec] = self.Controler.CommonMethod.CrtRegSpec[reg_spec]
+
+        # update registers' description
+        # (ESC type, port number of FMMU, port number of SM, and PDI type)
+        for reg_spec, address in [("ESCType", "0x0000"),
+                                  ("FMMUNumber", "0x0004"),
+                                  ("SMNumber", "0x0005"),
+                                  ("PDIType", "0x0140")]:
+            self.Controler.CommonMethod.CrtRegSpec[reg_spec] = self.Controler.CommonMethod.RegRead(address, "0x0001")
+
+        # Enable compactView checkbox
+        self.CompactViewCheckbox.Enable()
+
+    def BasicSetData(self):
+        """
+        Get and save the description of registers.
+        It's done by parsing register_information.xml.
+        """
+        # parse the above register's value
+        # If the value is 0x12, the result is 12
+        self.ESCType = self.Controler.CommonMethod.CrtRegSpec["ESCType"].split('x')[1]
+        self.PDIType = self.Controler.CommonMethod.CrtRegSpec["PDIType"].split('x')[1]
+        # If the value is 0x12, the result is 18 (It's converted to decimal value)
+        self.FMMUNumber = int(self.Controler.CommonMethod.CrtRegSpec["FMMUNumber"], 16)
+        self.SMNumber = int(self.Controler.CommonMethod.CrtRegSpec["SMNumber"], 16)
+
+        # initialize description dictionary of register main table and register sub table.
+        self.RegisterDescriptionDict = {}
+        self.RegisterSubGridDict = {}
+
+        # ./EthercatMaster/register_information.xml contains register description.
+        if wx.Platform == '__WXMSW__':
+            reg_info_file = open("../../EthercatMaster/register_information.xml", 'r')
+        else:
+            reg_info_file = open("./EthercatMaster/register_information.xml", 'r')
+        reg_info_tree = minidom.parse(reg_info_file)
+        reg_info_file.close()
+
+        # parse register description
+        for register_info in reg_info_tree.childNodes:
+            for register in register_info.childNodes:
+                if register.nodeType == reg_info_tree.ELEMENT_NODE and register.nodeName == "Register":
+                    # If it depends on the property(ESC type, PDI type, FMMU number, SM number)
+                    for property, type, value in [("esc", "type", self.ESCType),
+                                                  ("pdi", "type", self.PDIType),
+                                                  ("fmmu", "number", self.FMMUNumber),
+                                                  ("sm", "number", self.SMNumber)]:
+                        if property in register.attributes.keys():
+                            if type == "type":
+                                if register.attributes[property].value == value:
+                                    self.GetRegisterInfo(reg_info_tree, register)
+                                    break
+                            else:  # type == "number"
+                                if register.attributes[property].value < value:
+                                    self.GetRegisterInfo(reg_info_tree, register)
+                                    break
+                        else:
+                            self.GetRegisterInfo(reg_info_tree, register)
+                            break
+
+    def GetRegisterInfo(self, reg_info_tree, register):
+        """
+        Save the register's description into the dictionary.
+        reg_info_tree is based on the register_information.xml.
+        @param reg_info_tree: XML tree
+        @param register: register which you want to get the description
+        """
+        # temporary variables for register main table idescription dictionary
+        reg_index = ""
+        reg_main_description = ""
+
+        for data in register.childNodes:
+            if data.nodeType == reg_info_tree.ELEMENT_NODE and data.nodeName == "Index":
+                for index in data.childNodes:
+                    reg_index = index.nodeValue
+            if data.nodeType == reg_info_tree.ELEMENT_NODE and data.nodeName == "Description":
+                for description in data.childNodes:
+                    reg_main_description = description.nodeValue
+
+            # Add description for register main table
+            if reg_index != "" and reg_main_description != "":
+                self.RegisterDescriptionDict[reg_index] = reg_main_description
+
+            if data.nodeType == reg_info_tree.ELEMENT_NODE and data.nodeName == "Details":
+                # declare register sub table description dictionary about this index
+                self.RegisterSubGridDict[reg_index] = []
+
+                for detail in data.childNodes:
+                    if detail.nodeType == reg_info_tree.ELEMENT_NODE and detail.nodeName == "Detail":
+                        # If it depends on the property(ESC type, PDI type, FMMU number, SM number)
+                        for property, type, value in [("esc", "type", self.ESCType),
+                                                      ("pdi", "type", self.PDIType),
+                                                      ("fmmu", "number", self.FMMUNumber),
+                                                      ("sm", "number", self.SMNumber)]:
+                            if property in detail.attributes.keys():
+                                if type == "type":
+                                    if detail.attributes[property].value == value:
+                                        self.GetRegisterDetailInfo(reg_info_tree, reg_index, detail)
+                                        break
+                                else:  # type == "number"
+                                    if detail.attributes[property].value < value:
+                                        self.GetRegisterDetailInfo(reg_info_tree, reg_index, detail)
+                                        break
+                            else:
+                                self.GetRegisterDetailInfo(reg_info_tree, reg_index, detail)
+                                break
+
+    def GetRegisterDetailInfo(self, reg_info_tree, reg_index, detail):
+        """
+        Get the resgister's detailed description(for sub table) from the reg_info_tree.
+        @param reg_info_tree: XML tree (register_information.xml)
+        @param reg_index: index of the register
+        @param detail: description of the register
+        """
+        # temporary variables for register sub table description dictionary
+        # - It is initialized in every sub description
+        reg_bit_range = ""
+        reg_sub_description = ""
+        reg_enum_dictionary = {}
+
+        for detail_data in detail.childNodes:
+            if detail_data.nodeType == reg_info_tree.ELEMENT_NODE and detail_data.nodeName == "Range":
+                for range in detail_data.childNodes:
+                    reg_bit_range = range.nodeValue
+            if detail_data.nodeType == reg_info_tree.ELEMENT_NODE and detail_data.nodeName == "Description":
+                for description in detail_data.childNodes:
+                    reg_sub_description = description.nodeValue
+
+            if detail_data.nodeType == reg_info_tree.ELEMENT_NODE and detail_data.nodeName == "Enum":
+                for enum in detail_data.childNodes:
+                    if enum.nodeType == reg_info_tree.ELEMENT_NODE and enum.nodeName == "item":
+
+                        # temporary variables for a description of each value
+                        # For example, if the bit is 1, it is 'enabled'('On', 'True', etc.),
+                        # otherwise 'disabled'('Off', 'False', etc.).
+                        reg_sub_value = ""
+                        reg_sub_value_description = ""
+
+                        for item in enum.childNodes:
+                            if item.nodeType == reg_info_tree.ELEMENT_NODE and item.nodeName == "value":
+                                for value in item.childNodes:
+                                    reg_sub_value = value.nodeValue
+                            if item.nodeType == reg_info_tree.ELEMENT_NODE and item.nodeName == "Description":
+                                for description in item.childNodes:
+                                    reg_sub_value_description = description.nodeValue
+
+                            # Add a description of each value to register enum dictionary
+                            if reg_sub_value != "" and reg_sub_value_description != "":
+                                reg_enum_dictionary[reg_sub_value] = reg_sub_value_description
+
+        # add a description to register sub table description dictionary
+        if reg_bit_range != "" and reg_sub_description != "":
+            self.RegisterSubGridDict[reg_index].append([reg_bit_range,
+                                                        reg_sub_description,
+                                                        reg_enum_dictionary])
+
+    def ParseData(self):
+        """
+        Transform the data into dec, hex, string, and description
+        """
+        row_data = []
+        self.RegMonitorData = []
+        reg_word = ""
+
+        reg_data = self.Controler.CommonMethod.RegData.split()
+
+        # loop for register(0x0000:0x0fff)
+        for address in range(0x1000):
+            # arrange 2 Bytes of register data
+            reg_word = reg_data[address].split('x')[1] + reg_word
+            if (address % 2) == 1:
+                # append address
+                hex_address = "{:0>4x}".format(address-1)
+                row_data.append(hex_address)
+
+                # append description
+                if hex_address in self.RegisterDescriptionDict:
+                    row_data.append(self.RegisterDescriptionDict[hex_address])
+                else:
+                    row_data.append("")
+
+                # append Decimal value
+                row_data.append(str(int(reg_word, 16)))
+
+                # append Hex value
+                row_data.append('0x'+reg_word)
+
+                # append ASCII value
+                char_data = ""
+                for iter in range(2):
+                    if int(reg_word[iter*2:iter*2+2], 16) >= 32 and int(reg_word[iter*2:iter*2+2], 16) <= 126:
+                        char_data = char_data + chr(int(reg_word[iter*2:iter*2+2], 16))
+                    else:
+                        char_data = char_data + "."
+                row_data.append(char_data)
+
+                self.RegMonitorData.append(row_data)
+                reg_word = ""  # initialize regWord
+                row_data = []
+
+    def OnReloadButton(self, event):
+        """
+        Handle the click event of the 'Reload' button.
+        Get the data from registers again, and update the table.
+        @param event: wx.EVT_BUTTON object
+        """
+        # Check whether beremiz connected or not.
+        check_connect_flag = self.Controler.CommonMethod.CheckConnect(False)
+        if check_connect_flag:
+            self.LoadData()
+            self.BasicSetData()
+            self.ParseData()
+            # set data into UI
+            if self.CompactFlag:
+                self.ToggleCompactViewCheckbox(True)
+            else:
+                for index in range(4):
+                    self.RegisterNotebook.RegPage[index].UpdateMainTable(self.MainRow[index], self.MainCol,
+                                                                         self.PageRange[index][0], self.PageRange[index][1],
+                                                                         self.RegMonitorData)
+
+    def ToggleCompactViewCheckbox(self, event):
+        """
+        Handles the event of the 'Compact view' check box.
+        If it's checked, show only the registers that have a description.
+        If not, show all the registers.
+        @param event: wx.EVT_CHECKBOX object
+        """
+
+        # If "Compact View" Checkbox is True
+        # 'event' is argument of this method or event of checkbox.
+        if event is True or event.GetEventObject().GetValue():
+            self.CompactFlag = True
+
+            reg_compact_data = []
+            page_row = [0, 0, 0, 0]
+            for index in range(4):
+                self.PageRange[index] = [0, 0]
+
+            for reg_row_data in self.RegMonitorData:
+                if reg_row_data[1] != "":
+                    # data structure for "compact view"
+                    reg_compact_data.append(reg_row_data)
+                    # count for each register notebooks' row
+                    # It compare with register's address.
+                    for index in range(4):
+                        if int('0x'+reg_row_data[0], 16) < (index+1)*1024:
+                            page_row[index] += 1
+                            break
+
+            # Setting tables' rows and cols, range for compact view
+            for index in range(4):
+                self.MainRow[index] = page_row[index]
+                self.PageRange[index][1] = page_row[index]
+                for iter in range(index):
+                    self.PageRange[index][0] += page_row[iter]
+                    self.PageRange[index][1] += page_row[iter]
+
+            # Update table
+            for index in range(4):
+                self.RegisterNotebook.RegPage[index].UpdateMainTable(
+                    self.MainRow[index],
+                    self.MainCol,
+                    self.PageRange[index][0],
+                    self.PageRange[index][1],
+                    reg_compact_data)
+
+        # Compact View Checkbox is False
+        else:
+            self.CompactFlag = False
+            # Setting original rows, cols and range
+            self.MainRow = [512, 512, 512, 512]
+            self.PageRange = []
+
+            for index in range(4):
+                self.PageRange.append([512*index, 512*(index+1)])
+
+            # Update table
+            for index in range(4):
+                self.RegisterNotebook.RegPage[index].UpdateMainTable(
+                    self.MainRow[index],
+                    self.MainCol,
+                    self.PageRange[index][0],
+                    self.PageRange[index][1],
+                    self.RegMonitorData)
+
+
+# -------------------------------------------------------------------------------
+#                    For Register Access Notebook (divide index range)
+# -------------------------------------------------------------------------------
+class RegisterNotebook(wx.Notebook):
+    def __init__(self, parent, controler):
+        """
+        Constructor
+        @param parent: RegisterAccessPanel object
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+        wx.Notebook.__init__(self, parent, id=-1)
+
+        self.parent = parent
+        self.Controler = controler
+
+        # Initialize pages
+        self.RegPage = []
+        pages = 4
+        for dummy in range(pages):
+            self.RegPage.append(None)
+
+        for index in range(pages):
+            self.RegPage[index] = RegisterNotebookPanel(self, self.Controler,
+                                                        parent.MainRow[index], parent.MainCol)
+            self.AddPage(self.RegPage[index],
+                         "0x"+"{:0>4x}".format(index*1024)+" - 0x"+"{:0>4x}".format((index+1)*1024-1))
+
+
+# -------------------------------------------------------------------------------
+#                    For Register Access Notebook Panel
+#                  (Main UI : including main, sub table)
+# -------------------------------------------------------------------------------
+class RegisterNotebookPanel(wx.Panel):
+    def __init__(self, parent, controler, row, col):
+        """
+        Constructor
+        @param parent: RegisterAccessPanel object
+        @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        @param row, col: size of the table
+        """
+        wx.Panel.__init__(self, parent, -1)
+
+        self.parent = parent
+        self.Controler = controler
+        self.Row = row
+        self.Col = col
+        sub_row = 0
+        sub_col = 4
+
+        self.Sizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=30)
+
+        self.MainTable = RegisterMainTable(self, self.Row, self.Col, self.Controler)
+        self.SubTable = RegisterSubTable(self, sub_row, sub_col)
+
+        self.SubTable.CreateGrid(sub_row, sub_col)
+        self.SubTable.SetValue(self, [])
+
+        self.Sizer.AddMany([self.MainTable, self.SubTable])
+
+        self.SetSizer(self.Sizer)
+
+    def UpdateMainTable(self, row, col, low_index, high_index, data):
+        """
+        Updates main table.
+        It's done by deleting the main table and creating it again.
+        @param row, col: size of the table
+        @param low_index: the lowest index of the page
+        @param high_index: the highest index of the page
+        @param data: data
+        """
+        self.MainTable.Destroy()
+        self.MainTable = RegisterMainTable(self, row, col, self.Controler)
+        self.Sizer.Detach(self.SubTable)
+        self.Sizer.AddMany([self.MainTable, self.SubTable])
+        self.SetSizer(self.Sizer)
+        self.MainTable.CreateGrid(row, col)
+        self.MainTable.SetValue(self, data, low_index, high_index)
+        self.MainTable.Update()
+
+    def UpdateSubTable(self, row, col, data):
+        """
+        Updates sub table.
+        It's done by deleting the sub table and creating it again.
+        @param row, col: size of the table
+        @param data: data
+        """
+        self.SubTable.Destroy()
+        self.SubTable = RegisterSubTable(self, row, col)
+        self.Sizer.Detach(self.MainTable)
+        self.Sizer.AddMany([self.MainTable, self.SubTable])
+        self.Sizer.Layout()
+        self.SetSizer(self.Sizer)
+        self.SubTable.CreateGrid(row, col)
+        self.SubTable.SetValue(self, data)
+        self.SubTable.Update()
+
+
+# -------------------------------------------------------------------------------
+#                    For Register Access Notebook Panel (Main Table)
+# -------------------------------------------------------------------------------
+class RegisterMainTable(wx.grid.Grid):
+    def __init__(self, parent, row, col, controler):
+        """
+            Constructor
+            @param parent: RegisterNotebook object
+            @param row, col: size of the table
+            @param controler: _EthercatSlaveCTN class in EthercatSlave.py
+            """
+        self.parent = parent
+        self.Data = {}
+        self.Row = row
+        self.Col = col
+        self.Controler = controler
+        self.RegisterAccessPanel = self.parent.parent.parent
+
+        wx.grid.Grid.__init__(self, parent, -1, size=(820, 300),
+                              style=wx.EXPAND | wx.ALIGN_CENTRE_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
+
+        for evt, mapping_method in [(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnSelectCell),
+                                    (wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnSelectCell),
+                                    (wx.grid.EVT_GRID_CELL_LEFT_DCLICK, self.OnRegModifyDialog)]:
+            self.Bind(evt, mapping_method)
+
+    def SetValue(self, parent, reg_monitor_data, low_index, high_index):
+        """
+            Set the RegMonitorData into the main table.
+            @param parent: RegisterNotebook object
+            @param reg_monitor_data: data
+            @param low_index: the lowest index of the page
+            @param high_index: the highest index of the page
+            """
+        self.RegMonitorData = reg_monitor_data
+
+        # set label name and size
+        register_maintable_label = [(0, "Description"), (1, "Dec"),
+                                    (2, "Hex"), (3, "Char")]
+
+        for (index, label) in register_maintable_label:
+            self.SetColLabelValue(index, label)
+
+        self.SetColSize(0, 200)
+
+        # if reg_monitor_data is 0, it is initialization of register access.
+        if reg_monitor_data == 0:
+            return 0
+
+        # set data into UI
+        row = col = 0
+        for row_index in reg_monitor_data[low_index:high_index]:
+            col = 0
+            self.SetRowLabelValue(row, row_index[0])
+            for data_index in range(4):
+                self.SetCellValue(row, col, row_index[data_index+1])
+                self.SetCellAlignment(row, col, wx.ALIGN_CENTRE, wx.ALIGN_CENTER)
+                self.SetReadOnly(row, col, True)
+                col = col + 1
+            row = row + 1
+
+    def OnSelectCell(self, event):
+        """
+            Handles the event of the cell of the main table.
+            @param event: wx.grid object (left click)
+            """
+        # if reg_monitor_data is 0, it is initialization of register access.
+        if self.RegMonitorData == 0:
+            event.Skip()
+            return 0
+
+        sub_row = 0
+        sub_col = 4
+
+        address = self.GetRowLabelValue(event.GetRow())
+
+        reg_sub_grid_data = []
+
+        BIT_RANGE, NAME, DESCRIPTIONS = range(3)
+
+        # Check if this register's detail description is exist or not,
+        # and create data structure for the detail description table ; sub grid
+        if address in self.RegisterAccessPanel.RegisterSubGridDict:
+            for element in self.RegisterAccessPanel.RegisterSubGridDict[address]:
+                row_data = []
+                row_data.append(element[BIT_RANGE])
+                row_data.append(element[NAME])
+                bin_data = "{:0>16b}".format(int(self.GetCellValue(event.GetRow(), 1)))
+                value_range = element[BIT_RANGE].split('-')
+                value = (bin_data[8:16][::-1]+bin_data[0:8][::-1])[int(value_range[0]):(int(value_range[-1])+1)][::-1]
+                row_data.append(str(int(('0b'+str(value)), 2)))
+                if value in element[DESCRIPTIONS]:
+                    row_data.append(element[DESCRIPTIONS][value])
+                else:
+                    row_data.append('')
+                reg_sub_grid_data.append(row_data)
+                sub_row = sub_row + 1
+
+        self.parent.UpdateSubTable(sub_row, sub_col, reg_sub_grid_data)
+        # event.Skip() updates UI of selecting cell
+        event.Skip()
+
+    def OnRegModifyDialog(self, event):
+        """
+        Handle the event of the cell of the main table.
+        Display the window where the user modifies the value of the cell.
+        @param event: wx.grid object (double click)
+            """
+        # user can enter a value in case that user double-clicked 'Dec' or 'Hex' value.
+        if event.GetCol() == 1 or event.GetCol() == 2:
+            dlg = wx.TextEntryDialog(self, _("Enter hex(0xnnnn) or dec(n) value"),
+                                     _("Register Modify Dialog"), style=wx.OK | wx.CANCEL)
+
+            # Setting value in initial dialog value
+            start_value = self.GetCellValue(event.GetRow(), event.GetCol())
+            dlg.SetValue(start_value)
+
+            if dlg.ShowModal() == wx.ID_OK:
+                try:
+                    # It int(input) success, this input is dev or hex value.
+                    # Otherwise, it's error, so it goes except.
+                    int(dlg.GetValue(), 0)
+
+                    # reg_write
+                    # ex) ethercat reg_write -p 0 -t uint16 0x0000 0x0000
+                    return_val = self.Controler.CommonMethod.RegWrite('0x'+self.GetRowLabelValue(event.GetRow()), dlg.GetValue())
+
+                    if len(return_val) == 0:
+                        # set dec
+                        self.SetCellValue(event.GetRow(), 1, str(int(dlg.GetValue(), 0)))
+                        # set hex
+                        hex_data = '0x'+"{:0>4x}".format(int(dlg.GetValue(), 0))
+                        self.SetCellValue(event.GetRow(), 2, hex_data)
+                        # set char
+                        char_data = ""
+                        # If hex_data is been able to convert to ascii code, append ascii code.
+                        for iter in range(2):
+                            if int(hex_data[(iter+1)*2:(iter+2)*2], 16) >= 32 and int(hex_data[(iter+1)*2:(iter+2)*2], 16) <= 126:
+                                char_data = char_data + chr(int(hex_data[(iter+1)*2:(iter+2)*2], 16))
+                            else:
+                                char_data = char_data + "."
+
+                        self.SetCellValue(event.GetRow(), 3, char_data)
+
+                    else:
+                        self.Controler.CommonMethod.CreateErrorDialog(_('You can\'t modify it. This register is read-only or it\'s not connected.'))
+
+                except ValueError:
+                    self.Controler.CommonMethod.CreateErrorDialog(_('You entered wrong value. You can enter dec or hex value only.'))
+
+
+# -------------------------------------------------------------------------------
+#                    For Register Access Notebook Panel (Sub Table)
+# -------------------------------------------------------------------------------
+class RegisterSubTable(wx.grid.Grid):
+    def __init__(self, parent, row, col):
+        """
+         Constructor
+         @param parent: RegisterNotebook object
+         @param row, col: size of the table
+        """
+        self.parent = parent
+        self.Data = {}
+        self.Row = row
+        self.Col = col
+
+        wx.grid.Grid.__init__(self, parent, -1, size=(820, 150),
+                              style=wx.EXPAND | wx.ALIGN_CENTRE_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL)
+
+    def SetValue(self, parent, data):
+        """
+            Set the data into the subtable.
+            @param parent: RegisterNotebook object
+            @param data: data
+            """
+        # lset label name and size
+        Register_SubTable_Label = [(0, "Bits"), (1, "Name"),
+                                   (2, "Value"), (3, "Enum")]
+
+        for (index, label) in Register_SubTable_Label:
+            self.SetColLabelValue(index, label)
+
+        self.SetColSize(1, 200)
+        self.SetColSize(3, 200)
+
+        # set data into table
+        row = col = 0
+        for rowData in data:
+            col = 0
+            for element in rowData:
+                self.SetCellValue(row, col, element)
+                self.SetCellAlignment(row, col, wx.ALIGN_CENTRE, wx.ALIGN_CENTER)
+                self.SetReadOnly(row, col, True)
+                col = col + 1
+            row = row + 1
+
+
+# -------------------------------------------------------------------------------
+#                    For Master State Panel
+# -------------------------------------------------------------------------------
+class MasterStatePanelClass(wx.Panel):
+    def __init__(self, parent, controler):
+        """
+        Constructor
+        @param parent: wx.ScrollWindow object
+        @Param controler: _EthercatSlaveCTN class in EthercatSlave.py
+        """
+        wx.Panel.__init__(self, parent, -1, (0, 0),
+                          size=wx.DefaultSize, style=wx.SUNKEN_BORDER)
+        self.Controler = controler
+        self.parent = parent
+        self.StaticBox = {}
+        self.StaticText = {}
+        self.TextCtrl = {}
+
+        # ----------------------- Main Sizer and Update Button --------------------------------------------
+        self.MasterStateSizer = {"main": wx.BoxSizer(wx.VERTICAL)}
+        for key, attr in [
+                ("innerMain",           [1, 10, 2, 10]),
+                ("innerTopHalf",        [2, 10, 1, 10]),
+                ("innerBottomHalf",     [2, 10, 1, 10]),
+                ("innerMasterState",    [2, 10, 3, 10]),
+                ("innerDeviceInfo",     [4, 10, 3, 10]),
+                ("innerFrameInfo",      [4, 10, 5, 10])]:
+            self.MasterStateSizer[key] = wx.FlexGridSizer(cols=attr[0], hgap=attr[1], rows=attr[2], vgap=attr[3])
+
+        self.UpdateButton = wx.Button(self, label=_('Update'))
+        self.UpdateButton.Bind(wx.EVT_BUTTON, self.OnButtonClick)
+
+        for key, label in [
+                ('masterState', 'EtherCAT Master State'),
+                ('deviceInfo', 'Ethernet Network Card Information'),
+                ('frameInfo', 'Network Frame Information')]:
+            self.StaticBox[key] = wx.StaticBox(self, label=_(label))
+            self.MasterStateSizer[key] = wx.StaticBoxSizer(self.StaticBox[key])
+
+        # ----------------------- Master State -----------------------------------------------------------
+        for key, label in [
+                ('Phase', 'Phase:'),
+                ('Active', 'Active:'),
+                ('Slaves', 'Slave Count:')]:
+            self.StaticText[key] = wx.StaticText(self, label=_(label))
+            self.TextCtrl[key] = wx.TextCtrl(self, size=wx.Size(130, 24), style=wx.TE_READONLY)
+            self.MasterStateSizer['innerMasterState'].AddMany([self.StaticText[key], self.TextCtrl[key]])
+
+        self.MasterStateSizer['masterState'].AddSizer(self.MasterStateSizer['innerMasterState'])
+
+        # ----------------------- Ethernet Network Card Information ---------------------------------------
+        for key, label in [
+                ('Main', 'MAC Address:'),
+                ('Link', 'Link State:'),
+                ('Tx frames', 'Tx Frames:'),
+                ('Rx frames', 'Rx Frames:'),
+                ('Lost frames', 'Lost Frames:')]:
+            self.StaticText[key] = wx.StaticText(self, label=_(label))
+            self.TextCtrl[key] = wx.TextCtrl(self, size=wx.Size(130, 24), style=wx.TE_READONLY)
+            self.MasterStateSizer['innerDeviceInfo'].AddMany([self.StaticText[key], self.TextCtrl[key]])
+
+        self.MasterStateSizer['deviceInfo'].AddSizer(self.MasterStateSizer['innerDeviceInfo'])
+
+        # ----------------------- Network Frame Information -----------------------------------------------
+        for key, label in [
+                ('Tx frame rate [1/s]', 'Tx Frame Rate [1/s]:'),
+                ('Rx frame rate [1/s]', 'Tx Rate [kByte/s]:'),
+                ('Loss rate [1/s]', 'Loss Rate [1/s]:'),
+                ('Frame loss [%]', 'Frame Loss [%]:')]:
+            self.StaticText[key] = wx.StaticText(self, label=_(label))
+            self.MasterStateSizer['innerFrameInfo'].Add(self.StaticText[key])
+            self.TextCtrl[key] = {}
+            for index in ['0', '1', '2']:
+                self.TextCtrl[key][index] = wx.TextCtrl(self, size=wx.Size(130, 24), style=wx.TE_READONLY)
+                self.MasterStateSizer['innerFrameInfo'].Add(self.TextCtrl[key][index])
+
+        self.MasterStateSizer['frameInfo'].AddSizer(self.MasterStateSizer['innerFrameInfo'])
+
+        # --------------------------------- Main Sizer ----------------------------------------------------
+        for key, sub, in [
+                ('innerTopHalf', ['masterState', 'deviceInfo']),
+                ('innerBottomHalf', ['frameInfo']),
+                ('innerMain', ['innerTopHalf', 'innerBottomHalf'])
+        ]:
+            for key2 in sub:
+                self.MasterStateSizer[key].AddSizer(self.MasterStateSizer[key2])
+
+        self.MasterStateSizer['main'].AddSizer(self.UpdateButton)
+        self.MasterStateSizer['main'].AddSizer(self.MasterStateSizer['innerMain'])
+
+        self.SetSizer(self.MasterStateSizer['main'])
+
+    def OnButtonClick(self, event):
+        """
+        Handle the event of the 'Update' button.
+        Update the data of the master state.
+        @param event: wx.EVT_BUTTON object
+        """
+        if self.Controler.GetCTRoot()._connector is not None:
+            self.MasterState = self.Controler.CommonMethod.GetMasterState()
+            # Update each TextCtrl
+            if self.MasterState:
+                for key in self.TextCtrl:
+                    if isinstance(self.TextCtrl[key], dict):
+                        for index in self.TextCtrl[key]:
+                            self.TextCtrl[key][index].SetValue(self.MasterState[key][int(index)])
+                    else:
+                        self.TextCtrl[key].SetValue(self.MasterState[key][0])
+        else:
+            self.Controler.CommonMethod.CreateErrorDialog(_('PLC not connected!'))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/EthercatCFileGenerator.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,583 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz
+#
+# Copyright (C) 2011-2014: Laurent BESSARD, Edouard TISSERANT
+#                          RTES Lab : CRKim, JBLee, youcu
+#                          Higen Motor : Donggu Kang
+#
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+from __future__ import division
+import os
+
+from etherlab.EthercatSlave import ExtractHexDecValue, DATATYPECONVERSION, ExtractName
+
+SLAVE_PDOS_CONFIGURATION_DECLARATION = """
+/* Slave %(slave)d, "%(device_type)s"
+ * Vendor ID:       0x%(vendor).8x
+ * Product code:    0x%(product_code).8x
+ * Revision number: 0x%(revision_number).8x
+ */
+
+ec_pdo_entry_info_t slave_%(slave)d_pdo_entries[] = {
+%(pdos_entries_infos)s
+};
+
+ec_pdo_info_t slave_%(slave)d_pdos[] = {
+%(pdos_infos)s
+};
+
+ec_sync_info_t slave_%(slave)d_syncs[] = {
+%(pdos_sync_infos)s
+    {0xff}
+};
+"""
+
+SLAVE_CONFIGURATION_TEMPLATE = """
+    if (!(slave%(slave)d = ecrt_master_slave_config(master, %(alias)d, %(position)d, 0x%(vendor).8x, 0x%(product_code).8x))) {
+        SLOGF(LOG_CRITICAL, "EtherCAT failed to get slave %(device_type)s configuration at alias %(alias)d and position %(position)d.");
+        goto ecat_failed;
+    }
+
+    if (ecrt_slave_config_pdos(slave%(slave)d, EC_END, slave_%(slave)d_syncs)) {
+        SLOGF(LOG_CRITICAL, "EtherCAT failed to configure PDOs for slave %(device_type)s at alias %(alias)d and position %(position)d.");
+        goto ecat_failed;
+    }
+"""
+
+SLAVE_INITIALIZATION_TEMPLATE = """
+    {
+        uint8_t value[%(data_size)d];
+        EC_WRITE_%(data_type)s((uint8_t *)value, %(data)s);
+        if (ecrt_master_sdo_download(master, %(slave)d, 0x%(index).4x, 0x%(subindex).2x, (uint8_t *)value, %(data_size)d, &abort_code)) {
+            SLOGF(LOG_CRITICAL, "EtherCAT Failed to initialize slave %(device_type)s at alias %(alias)d and position %(position)d. Error: %%d", abort_code);
+            goto ecat_failed;
+        }
+    }
+"""
+
+SLAVE_OUTPUT_PDO_DEFAULT_VALUE = """
+    {
+        uint8_t value[%(data_size)d];
+        if (ecrt_master_sdo_upload(master, %(slave)d, 0x%(index).4x, 0x%(subindex).2x, (uint8_t *)value, %(data_size)d, &result_size, &abort_code)) {
+            SLOGF(LOG_CRITICAL, "EtherCAT failed to get default value for output PDO in slave %(device_type)s at alias %(alias)d and position %(position)d. Error: %%ud", abort_code);
+            goto ecat_failed;
+        }
+        %(real_var)s = EC_READ_%(data_type)s((uint8_t *)value);
+    }
+"""
+
+
+def ConfigureVariable(entry_infos, str_completion):
+    entry_infos["data_type"] = DATATYPECONVERSION.get(entry_infos["var_type"], None)
+    if entry_infos["data_type"] is None:
+        msg = _("Type of location \"%s\" not yet supported!") % entry_infos["var_name"]
+        raise ValueError(msg)
+
+    if not entry_infos.get("no_decl", False):
+        if "real_var" in entry_infos:
+            str_completion["located_variables_declaration"].append(
+                "IEC_%(var_type)s %(real_var)s;" % entry_infos)
+        else:
+            entry_infos["real_var"] = "beremiz" + entry_infos["var_name"]
+            str_completion["located_variables_declaration"].extend(
+                ["IEC_%(var_type)s %(real_var)s;" % entry_infos,
+                 "IEC_%(var_type)s *%(var_name)s = &%(real_var)s;" % entry_infos])
+        for declaration in entry_infos.get("extra_declarations", []):
+            entry_infos["extra_decl"] = declaration
+            str_completion["located_variables_declaration"].append(
+                "IEC_%(var_type)s *%(extra_decl)s = &%(real_var)s;" % entry_infos)
+    elif "real_var" not in entry_infos:
+        entry_infos["real_var"] = "beremiz" + entry_infos["var_name"]
+
+    str_completion["used_pdo_entry_offset_variables_declaration"].append(
+        "unsigned int slave%(slave)d_%(index).4x_%(subindex).2x;" % entry_infos)
+
+    if entry_infos["data_type"] == "BIT":
+        str_completion["used_pdo_entry_offset_variables_declaration"].append(
+            "unsigned int slave%(slave)d_%(index).4x_%(subindex).2x_bit;" % entry_infos)
+
+        str_completion["used_pdo_entry_configuration"].append(
+            ("    {%(alias)d, %(position)d, 0x%(vendor).8x, 0x%(product_code).8x, " +
+             "0x%(index).4x, %(subindex)d, &slave%(slave)d_%(index).4x_%(subindex).2x, " +
+             "&slave%(slave)d_%(index).4x_%(subindex).2x_bit},") % entry_infos)
+
+        if entry_infos["dir"] == "I":
+            str_completion["retrieve_variables"].append(
+                ("    %(real_var)s = EC_READ_BIT(domain1_pd + slave%(slave)d_%(index).4x_%(subindex).2x, " +
+                 "slave%(slave)d_%(index).4x_%(subindex).2x_bit);") % entry_infos)
+        elif entry_infos["dir"] == "Q":
+            str_completion["publish_variables"].append(
+                ("    EC_WRITE_BIT(domain1_pd + slave%(slave)d_%(index).4x_%(subindex).2x, " +
+                 "slave%(slave)d_%(index).4x_%(subindex).2x_bit, %(real_var)s);") % entry_infos)
+
+    else:
+        str_completion["used_pdo_entry_configuration"].append(
+            ("    {%(alias)d, %(position)d, 0x%(vendor).8x, 0x%(product_code).8x, 0x%(index).4x, " +
+             "%(subindex)d, &slave%(slave)d_%(index).4x_%(subindex).2x},") % entry_infos)
+
+        if entry_infos["dir"] == "I":
+            str_completion["retrieve_variables"].append(
+                ("    %(real_var)s = EC_READ_%(data_type)s(domain1_pd + " +
+                 "slave%(slave)d_%(index).4x_%(subindex).2x);") % entry_infos)
+        elif entry_infos["dir"] == "Q":
+            str_completion["publish_variables"].append(
+                ("    EC_WRITE_%(data_type)s(domain1_pd + slave%(slave)d_%(index).4x_%(subindex).2x, " +
+                 "%(real_var)s);") % entry_infos)
+
+
+def ExclusionSortFunction(x, y):
+    if x["matching"] == y["matching"]:
+        if x["assigned"] and not y["assigned"]:
+            return -1
+        elif not x["assigned"] and y["assigned"]:
+            return 1
+        return cmp(x["count"], y["count"])
+    return -cmp(x["matching"], y["matching"])
+
+
+class _EthercatCFileGenerator(object):
+
+    def __init__(self, controler):
+        self.Controler = controler
+
+        self.Slaves = []
+        self.UsedVariables = {}
+
+    def __del__(self):
+        self.Controler = None
+
+    def DeclareSlave(self, slave_index, slave):
+        self.Slaves.append((slave_index, slave.getInfo().getAutoIncAddr(), slave))
+
+    def DeclareVariable(self, slave_index, index, subindex, iec_type, dir, name, no_decl=False):
+        slave_variables = self.UsedVariables.setdefault(slave_index, {})
+
+        entry_infos = slave_variables.get((index, subindex), None)
+        if entry_infos is None:
+            slave_variables[(index, subindex)] = {
+                "infos": (iec_type, dir, name, no_decl, []),
+                "mapped": False}
+            return name
+        elif entry_infos["infos"][:2] == (iec_type, dir):
+            if name != entry_infos["infos"][2]:
+                if dir == "I":
+                    entry_infos["infos"][4].append(name)
+                    return entry_infos["infos"][2]
+                else:
+                    msg = _("Output variables can't be defined with different locations ({a1} and {a2})").\
+                          format(a1=entry_infos["infos"][2], a2=name)
+                    raise ValueError(msg)
+        else:
+            raise ValueError(_("Definition conflict for location \"%s\"") % name)
+
+    def GenerateCFile(self, filepath, location_str, master_number):
+
+        # Extract etherlab master code template
+        plc_etherlab_filepath = os.path.join(os.path.split(__file__)[0], "plc_etherlab.c")
+        plc_etherlab_file = open(plc_etherlab_filepath, 'r')
+        plc_etherlab_code = plc_etherlab_file.read()
+        plc_etherlab_file.close()
+
+        # Initialize strings for formatting master code template
+        str_completion = {
+            "location": location_str,
+            "master_number": master_number,
+            "located_variables_declaration": [],
+            "used_pdo_entry_offset_variables_declaration": [],
+            "used_pdo_entry_configuration": [],
+            "pdos_configuration_declaration": "",
+            "slaves_declaration": "",
+            "slaves_configuration": "",
+            "slaves_output_pdos_default_values_extraction": "",
+            "slaves_initialization": "",
+            "retrieve_variables": [],
+            "publish_variables": [],
+        }
+
+        # Initialize variable storing variable mapping state
+        for slave_entries in self.UsedVariables.itervalues():
+            for entry_infos in slave_entries.itervalues():
+                entry_infos["mapped"] = False
+
+        # Sort slaves by position (IEC_Channel)
+        self.Slaves.sort()
+        # Initialize dictionary storing alias auto-increment position values
+        alias = {}
+
+        # Generating code for each slave
+        for (slave_idx, slave_alias, slave) in self.Slaves:
+            type_infos = slave.getType()
+
+            # Defining slave alias and auto-increment position
+            if alias.get(slave_alias) is not None:
+                alias[slave_alias] += 1
+            else:
+                alias[slave_alias] = 0
+            slave_pos = (slave_alias, alias[slave_alias])
+
+            # Extract slave device informations
+            device, module_extra_params = self.Controler.GetModuleInfos(type_infos)
+            if device is None:
+                msg = _("No informations found for device %s!") \
+                      % (type_infos["device_type"])
+                raise ValueError(msg)
+
+            # Extract slaves variables to be mapped
+            slave_variables = self.UsedVariables.get(slave_idx, {})
+
+            # Extract slave device object dictionary entries
+            device_entries = device.GetEntriesList()
+
+            # Adding code for declaring slave in master code template strings
+            for element in ["vendor", "product_code", "revision_number"]:
+                type_infos[element] = ExtractHexDecValue(type_infos[element])
+            type_infos.update(dict(zip(["slave", "alias", "position"], (slave_idx,) + slave_pos)))
+
+            # Extract slave device CoE informations
+            device_coe = device.getCoE()
+            if device_coe is not None:
+
+                # If device support CanOpen over Ethernet, adding code for calling
+                # init commands when initializing slave in master code template strings
+                initCmds = []
+                for initCmd in device_coe.getInitCmd():
+                    initCmds.append({
+                        "Index": ExtractHexDecValue(initCmd.getIndex()),
+                        "Subindex": ExtractHexDecValue(initCmd.getSubIndex()),
+                        "Value": initCmd.getData().getcontent()})
+                initCmds.extend(slave.getStartupCommands())
+                for initCmd in initCmds:
+                    index = initCmd["Index"]
+                    subindex = initCmd["Subindex"]
+                    entry = device_entries.get((index, subindex), None)
+                    if entry is not None:
+                        data_size = entry["BitSize"] // 8
+                        data_str = ("0x%%.%dx" % (data_size * 2)) % initCmd["Value"]
+                        init_cmd_infos = {
+                            "index": index,
+                            "subindex": subindex,
+                            "data": data_str,
+                            "data_type": DATATYPECONVERSION.get(entry["Type"]),
+                            "data_size": data_size
+                        }
+                        init_cmd_infos.update(type_infos)
+                        str_completion["slaves_initialization"] += SLAVE_INITIALIZATION_TEMPLATE % init_cmd_infos
+
+                # Extract slave device PDO configuration capabilities
+                PdoAssign = device_coe.getPdoAssign()
+                PdoConfig = device_coe.getPdoConfig()
+            else:
+                PdoAssign = PdoConfig = False
+
+            # Test if slave has a configuration or need one
+            if len(device.getTxPdo() + device.getRxPdo()) > 0 or len(slave_variables) > 0 and PdoConfig and PdoAssign:
+
+                str_completion["slaves_declaration"] += "static ec_slave_config_t *slave%(slave)d = NULL;\n" % type_infos
+                str_completion["slaves_configuration"] += SLAVE_CONFIGURATION_TEMPLATE % type_infos
+
+                # Initializing
+                pdos_infos = {
+                    "pdos_entries_infos": [],
+                    "pdos_infos": [],
+                    "pdos_sync_infos": [],
+                }
+                pdos_infos.update(type_infos)
+
+                sync_managers = []
+                for sync_manager_idx, sync_manager in enumerate(device.getSm()):
+                    sync_manager_infos = {
+                        "index": sync_manager_idx,
+                        "name": sync_manager.getcontent(),
+                        "slave": slave_idx,
+                        "pdos": [],
+                        "pdos_number": 0,
+                    }
+
+                    sync_manager_control_byte = ExtractHexDecValue(sync_manager.getControlByte())
+                    sync_manager_direction = sync_manager_control_byte & 0x0c
+                    sync_manager_watchdog = sync_manager_control_byte & 0x40
+                    if sync_manager_direction:
+                        sync_manager_infos["sync_manager_type"] = "EC_DIR_OUTPUT"
+                    else:
+                        sync_manager_infos["sync_manager_type"] = "EC_DIR_INPUT"
+                    if sync_manager_watchdog:
+                        sync_manager_infos["watchdog"] = "EC_WD_ENABLE"
+                    else:
+                        sync_manager_infos["watchdog"] = "EC_WD_DISABLE"
+
+                    sync_managers.append(sync_manager_infos)
+
+                pdos_index = []
+                exclusive_pdos = {}
+                selected_pdos = []
+                for pdo, pdo_type in ([(pdo, "Inputs") for pdo in device.getTxPdo()] +
+                                      [(pdo, "Outputs") for pdo in device.getRxPdo()]):
+
+                    pdo_index = ExtractHexDecValue(pdo.getIndex().getcontent())
+                    pdos_index.append(pdo_index)
+
+                    excluded_list = pdo.getExclude()
+                    if len(excluded_list) > 0:
+                        exclusion_list = [pdo_index]
+                        for excluded in excluded_list:
+                            exclusion_list.append(ExtractHexDecValue(excluded.getcontent()))
+                        exclusion_list.sort()
+
+                        exclusion_scope = exclusive_pdos.setdefault(tuple(exclusion_list), [])
+
+                        entries = pdo.getEntry()
+                        pdo_mapping_match = {
+                            "index": pdo_index,
+                            "matching": 0,
+                            "count": len(entries),
+                            "assigned": pdo.getSm() is not None
+                        }
+                        exclusion_scope.append(pdo_mapping_match)
+
+                        for entry in entries:
+                            index = ExtractHexDecValue(entry.getIndex().getcontent())
+                            subindex = ExtractHexDecValue(entry.getSubIndex())
+                            if slave_variables.get((index, subindex), None) is not None:
+                                pdo_mapping_match["matching"] += 1
+
+                        if pdo.getFixed() is not True:
+                            pdo_mapping_match["matching"] += \
+                                module_extra_params["max_pdo_size"] - \
+                                pdo_mapping_match["count"]
+
+                    elif pdo.getMandatory():
+                        selected_pdos.append(pdo_index)
+
+                excluded_pdos = []
+                for exclusion_scope in exclusive_pdos.itervalues():
+                    exclusion_scope.sort(ExclusionSortFunction)
+                    start_excluding_index = 0
+                    if exclusion_scope[0]["matching"] > 0:
+                        selected_pdos.append(exclusion_scope[0]["index"])
+                        start_excluding_index = 1
+                    excluded_pdos.extend([
+                        pdo["index"]
+                        for pdo in exclusion_scope[start_excluding_index:]
+                        if PdoAssign or not pdo["assigned"]])
+
+                for pdo, pdo_type in ([(pdo, "Inputs") for pdo in device.getTxPdo()] +
+                                      [(pdo, "Outputs") for pdo in device.getRxPdo()]):
+                    entries = pdo.getEntry()
+
+                    pdo_index = ExtractHexDecValue(pdo.getIndex().getcontent())
+                    if pdo_index in excluded_pdos:
+                        continue
+
+                    pdo_needed = pdo_index in selected_pdos
+
+                    entries_infos = []
+
+                    for entry in entries:
+                        index = ExtractHexDecValue(entry.getIndex().getcontent())
+                        subindex = ExtractHexDecValue(entry.getSubIndex())
+                        entry_infos = {
+                            "index": index,
+                            "subindex": subindex,
+                            "name": ExtractName(entry.getName()),
+                            "bitlen": entry.getBitLen(),
+                        }
+                        entry_infos.update(type_infos)
+                        entries_infos.append("    {0x%(index).4x, 0x%(subindex).2x, %(bitlen)d}, /* %(name)s */" % entry_infos)
+
+                        entry_declaration = slave_variables.get((index, subindex), None)
+                        if entry_declaration is not None and not entry_declaration["mapped"]:
+                            pdo_needed = True
+
+                            entry_infos.update(dict(zip(["var_type", "dir", "var_name", "no_decl", "extra_declarations"],
+                                                        entry_declaration["infos"])))
+                            entry_declaration["mapped"] = True
+
+                            entry_type = entry.getDataType().getcontent()
+                            if entry_infos["var_type"] != entry_type:
+                                message = _("Wrong type for location \"%s\"!") % entry_infos["var_name"]
+                                if self.Controler.GetSizeOfType(entry_infos["var_type"]) != \
+                                   self.Controler.GetSizeOfType(entry_type):
+                                    raise ValueError(message)
+                                else:
+                                    self.Controler.GetCTRoot().logger.write_warning(_("Warning: ") + message + "\n")
+
+                            if (entry_infos["dir"] == "I" and pdo_type != "Inputs") or \
+                               (entry_infos["dir"] == "Q" and pdo_type != "Outputs"):
+                                raise ValueError(_("Wrong direction for location \"%s\"!") % entry_infos["var_name"])
+
+                            ConfigureVariable(entry_infos, str_completion)
+
+                        elif pdo_type == "Outputs" and entry.getDataType() is not None and device_coe is not None:
+                            data_type = entry.getDataType().getcontent()
+                            entry_infos["dir"] = "Q"
+                            entry_infos["data_size"] = max(1, entry_infos["bitlen"] // 8)
+                            entry_infos["data_type"] = DATATYPECONVERSION.get(data_type)
+                            entry_infos["var_type"] = data_type
+                            entry_infos["real_var"] = "slave%(slave)d_%(index).4x_%(subindex).2x_default" % entry_infos
+
+                            ConfigureVariable(entry_infos, str_completion)
+
+                            str_completion["slaves_output_pdos_default_values_extraction"] += \
+                                SLAVE_OUTPUT_PDO_DEFAULT_VALUE % entry_infos
+
+                    if pdo_needed:
+                        for excluded in pdo.getExclude():
+                            excluded_index = ExtractHexDecValue(excluded.getcontent())
+                            if excluded_index not in excluded_pdos:
+                                excluded_pdos.append(excluded_index)
+
+                        sm = pdo.getSm()
+                        if sm is None:
+                            for sm_idx, sync_manager in enumerate(sync_managers):
+                                if sync_manager["name"] == pdo_type:
+                                    sm = sm_idx
+                        if sm is None:
+                            raise ValueError(_("No sync manager available for %s pdo!") % pdo_type)
+
+                        sync_managers[sm]["pdos_number"] += 1
+                        sync_managers[sm]["pdos"].append(
+                            {"slave": slave_idx,
+                             "index": pdo_index,
+                             "name": ExtractName(pdo.getName()),
+                             "type": pdo_type,
+                             "entries": entries_infos,
+                             "entries_number": len(entries_infos),
+                             "fixed": pdo.getFixed() is True})
+
+                if PdoConfig and PdoAssign:
+                    dynamic_pdos = {}
+                    dynamic_pdos_number = 0
+                    for category, min_index, max_index in [("Inputs", 0x1600, 0x1800),
+                                                           ("Outputs", 0x1a00, 0x1C00)]:
+                        for sync_manager in sync_managers:
+                            if sync_manager["name"] == category:
+                                category_infos = dynamic_pdos.setdefault(category, {})
+                                category_infos["sync_manager"] = sync_manager
+                                category_infos["pdos"] = [pdo for pdo in category_infos["sync_manager"]["pdos"]
+                                                          if not pdo["fixed"] and pdo["type"] == category]
+                                category_infos["current_index"] = min_index
+                                category_infos["max_index"] = max_index
+                                break
+
+                    for (index, subindex), entry_declaration in slave_variables.iteritems():
+
+                        if not entry_declaration["mapped"]:
+                            entry = device_entries.get((index, subindex), None)
+                            if entry is None:
+                                msg = _("Unknown entry index 0x{a1:.4x}, subindex 0x{a2:.2x} for device {a3}").\
+                                      format(a1=index, a2=subindex, a3=type_infos["device_type"])
+                                raise ValueError(msg)
+
+                            entry_infos = {
+                                "index": index,
+                                "subindex": subindex,
+                                "name": entry["Name"],
+                                "bitlen": entry["BitSize"],
+                            }
+                            entry_infos.update(type_infos)
+
+                            entry_infos.update(dict(zip(["var_type", "dir", "var_name", "no_decl", "extra_declarations"],
+                                                        entry_declaration["infos"])))
+                            entry_declaration["mapped"] = True
+
+                            if entry_infos["var_type"] != entry["Type"]:
+                                message = _("Wrong type for location \"%s\"!") % entry_infos["var_name"]
+                                if self.Controler.GetSizeOfType(entry_infos["var_type"]) != \
+                                   self.Controler.GetSizeOfType(entry["Type"]):
+                                    raise ValueError(message)
+                                else:
+                                    self.Controler.GetCTRoot().logger.write_warning(message + "\n")
+
+                            if entry_infos["dir"] == "I" and entry["PDOMapping"] in ["T", "RT"]:
+                                pdo_type = "Inputs"
+                            elif entry_infos["dir"] == "Q" and entry["PDOMapping"] in ["R", "RT"]:
+                                pdo_type = "Outputs"
+                            else:
+                                msg = _("Wrong direction for location \"%s\"!") \
+                                      % entry_infos["var_name"]
+                                raise ValueError(msg)
+
+                            if pdo_type not in dynamic_pdos:
+                                msg = _("No Sync manager defined for %s!") % pdo_type
+                                raise ValueError(msg)
+
+                            ConfigureVariable(entry_infos, str_completion)
+
+                            if len(dynamic_pdos[pdo_type]["pdos"]) > 0:
+                                pdo = dynamic_pdos[pdo_type]["pdos"][0]
+                            elif module_extra_params["add_pdo"]:
+                                while dynamic_pdos[pdo_type]["current_index"] in pdos_index:
+                                    dynamic_pdos[pdo_type]["current_index"] += 1
+                                if dynamic_pdos[pdo_type]["current_index"] >= dynamic_pdos[pdo_type]["max_index"]:
+                                    raise ValueError(_("No more free PDO index available for %s!") % pdo_type)
+                                pdos_index.append(dynamic_pdos[pdo_type]["current_index"])
+
+                                dynamic_pdos_number += 1
+                                pdo = {"slave": slave_idx,
+                                       "index": dynamic_pdos[pdo_type]["current_index"],
+                                       "name": "Dynamic PDO %d" % dynamic_pdos_number,
+                                       "type": pdo_type,
+                                       "entries": [],
+                                       "entries_number": 0,
+                                       "fixed": False}
+                                dynamic_pdos[pdo_type]["sync_manager"]["pdos_number"] += 1
+                                dynamic_pdos[pdo_type]["sync_manager"]["pdos"].append(pdo)
+                                dynamic_pdos[pdo_type]["pdos"].append(pdo)
+                            else:
+                                break
+
+                            pdo["entries"].append("    {0x%(index).4x, 0x%(subindex).2x, %(bitlen)d}, /* %(name)s */" % entry_infos)
+                            if entry_infos["bitlen"] < module_extra_params["pdo_alignment"]:
+                                pdo["entries"].append("    {0x0000, 0x00, %d}, /* None */" % (
+                                    module_extra_params["pdo_alignment"] - entry_infos["bitlen"]))
+                            pdo["entries_number"] += 1
+
+                            if pdo["entries_number"] == module_extra_params["max_pdo_size"]:
+                                dynamic_pdos[pdo_type]["pdos"].pop(0)
+
+                pdo_offset = 0
+                entry_offset = 0
+                for sync_manager_infos in sync_managers:
+
+                    for pdo_infos in sync_manager_infos["pdos"]:
+                        pdo_infos["offset"] = entry_offset
+                        pdo_entries = pdo_infos["entries"]
+                        pdos_infos["pdos_infos"].append(
+                            ("    {0x%(index).4x, %(entries_number)d, " +
+                             "slave_%(slave)d_pdo_entries + %(offset)d}, /* %(name)s */") % pdo_infos)
+                        entry_offset += len(pdo_entries)
+                        pdos_infos["pdos_entries_infos"].extend(pdo_entries)
+
+                    sync_manager_infos["offset"] = pdo_offset
+                    pdo_offset_shift = sync_manager_infos["pdos_number"]
+                    pdos_infos["pdos_sync_infos"].append(
+                        ("    {%(index)d, %(sync_manager_type)s, %(pdos_number)d, " +
+                         ("slave_%(slave)d_pdos + %(offset)d" if pdo_offset_shift else "NULL") +
+                         ", %(watchdog)s},") % sync_manager_infos)
+                    pdo_offset += pdo_offset_shift
+
+                for element in ["pdos_entries_infos", "pdos_infos", "pdos_sync_infos"]:
+                    pdos_infos[element] = "\n".join(pdos_infos[element])
+
+                str_completion["pdos_configuration_declaration"] += SLAVE_PDOS_CONFIGURATION_DECLARATION % pdos_infos
+
+            for (index, subindex), entry_declaration in slave_variables.iteritems():
+                if not entry_declaration["mapped"]:
+                    message = _("Entry index 0x{a1:.4x}, subindex 0x{a2:.2x} not mapped for device {a3}").\
+                              format(a1=index, a2=subindex, a3=type_infos["device_type"])
+                    self.Controler.GetCTRoot().logger.write_warning(_("Warning: ") + message + "\n")
+
+        for element in ["used_pdo_entry_offset_variables_declaration",
+                        "used_pdo_entry_configuration",
+                        "located_variables_declaration",
+                        "retrieve_variables",
+                        "publish_variables"]:
+            str_completion[element] = "\n".join(str_completion[element])
+
+        etherlabfile = open(filepath, 'w')
+        etherlabfile.write(plc_etherlab_code % str_completion)
+        etherlabfile.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/EthercatCIA402Slave.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,372 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz
+#
+# Copyright (C) 2011-2014: Laurent BESSARD, Edouard TISSERANT
+#                          RTES Lab : CRKim, JBLee, youcu
+#                          Higen Motor : Donggu Kang
+#
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+import os
+
+import wx
+
+from PLCControler import LOCATION_CONFNODE, LOCATION_VAR_INPUT
+
+from MotionLibrary import AxisXSD
+from etherlab.EthercatSlave import _EthercatSlaveCTN, _CommonSlave
+from etherlab.ConfigEditor import CIA402NodeEditor
+
+# Definition of node variables that have to be mapped in PDO
+# [(name, index, subindex, type,
+#   direction for master ('I': input, 'Q': output)),...]
+NODE_VARIABLES = [
+    ("ControlWord",             0x6040, 0x00, "UINT", "Q"),
+    ("TargetPosition",          0x607a, 0x00, "DINT", "Q"),
+    ("TargetVelocity",          0x60ff, 0x00, "DINT", "Q"),
+    ("TargetTorque",            0x6071, 0x00, "INT",  "Q"),
+    ("ModesOfOperation",        0x6060, 0x00, "SINT", "Q"),
+    ("StatusWord",              0x6041, 0x00, "UINT", "I"),
+    ("ModesOfOperationDisplay", 0x6061, 0x00, "SINT", "I"),
+    ("ActualPosition",          0x6064, 0x00, "DINT", "I"),
+    ("ActualVelocity",          0x606c, 0x00, "DINT", "I"),
+    ("ActualTorque",            0x6077, 0x00, "INT",  "I"),
+]
+
+# Definition of optional node variables that can be added to PDO mapping.
+# A checkbox will be displayed for each section in node configuration panel to
+# enable them
+# [(section_name,
+#   [{'description', (name, index, subindex, type,
+#                     direction for master ('I': input, 'Q': output)),
+#     'retrieve', string_template_for_retrieve_variable (None: not retrieved,
+#                                 default string template if not defined),
+#     'publish', string_template_for_publish_variable (None: not published,
+#                                 default string template if not defined),
+#    },...]
+EXTRA_NODE_VARIABLES = [
+    ("ErrorCode", [
+        {"description": ("ErrorCode", 0x603F, 0x00, "UINT", "I"),
+         "publish": None}
+        ]),
+    ("DigitalInputs", [
+        {"description": ("DigitalInputs", 0x60FD, 0x00, "UDINT", "I"),
+         "publish": None}
+        ]),
+    ("DigitalOutputs", [
+        {"description": ("DigitalOutputs", 0x60FE, 0x00, "UDINT", "Q"),
+         "retrieve": None}
+        ]),
+    ("TouchProbe", [
+        {"description": ("TouchProbeFunction", 0x60B8, 0x00, "UINT", "Q"),
+         "retrieve": None},
+        {"description": ("TouchProbeStatus", 0x60B9, 0x00, "UINT", "I"),
+         "publish": None},
+        {"description": ("TouchProbePos1PosValue", 0x60BA, 0x00, "DINT", "I"),
+         "publish": None},
+        {"description": ("TouchProbePos1NegValue", 0x60BB, 0x00, "DINT", "I"),
+         "publish": None},
+        ]),
+]
+
+# List of parameters name in no configuration panel for optional variable
+# sections
+EXTRA_NODE_VARIABLES_DICT = {
+    "Enable" + name: params
+    for name, params in EXTRA_NODE_VARIABLES}
+
+# List of block to define to interface MCL to fieldbus for specific functions
+FIELDBUS_INTERFACE_GLOBAL_INSTANCES = [
+    {"blocktype": "GetTorqueLimit",
+     "inputs": [],
+     "outputs": [{"name": "TorqueLimitPos", "type": "UINT"},
+                 {"name": "TorqueLimitNeg", "type": "UINT"}]},
+    {"blocktype": "SetTorqueLimit",
+     "inputs": [{"name": "TorqueLimitPos", "type": "UINT"},
+                {"name": "TorqueLimitNeg", "type": "UINT"}],
+     "outputs": []},
+]
+
+# --------------------------------------------------
+#                 Ethercat CIA402 Node
+# --------------------------------------------------
+
+
+class _EthercatCIA402SlaveCTN(_EthercatSlaveCTN):
+    XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
+    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+      <xsd:element name="CIA402SlaveParams">
+        <xsd:complexType>
+          %s
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:schema>
+    """ % ("\n".join(["""\
+          <xsd:attribute name="Enable%s" type="xsd:boolean"
+                         use="optional" default="false"/>""" % category
+                      for category, variables in EXTRA_NODE_VARIABLES]) + AxisXSD)
+
+    NODE_PROFILE = 402
+    EditorType = CIA402NodeEditor
+
+    ConfNodeMethods = [
+        {
+            "bitmap": "CIA402AxisRef",
+            "name": _("Axis Ref"),
+            "tooltip": _("Initiate Drag'n drop of Axis ref located variable"),
+            "method": "_getCIA402AxisRef",
+            "push": True,
+        },
+        {
+            "bitmap": "CIA402NetPos",
+            "name": _("Axis Pos"),
+            "tooltip": _("Initiate Drag'n drop of Network position located variable"),
+            "method": "_getCIA402NetworkPosition",
+            "push": True,
+        },
+    ]
+
+# --------------------------------------------------
+#    class code
+# --------------------------------------------------
+
+    def __init__(self):
+        _EthercatSlaveCTN.__init__(self)
+
+        # ----------- call ethercat mng. function --------------
+        self.CommonMethod = _CommonSlave(self)
+
+    def GetIconName(self):
+        return "CIA402Slave"
+
+    def SetParamsAttribute(self, path, value):
+        if path == "CIA402SlaveParams.Type":
+            path = "SlaveParams.Type"
+        elif path == "CIA402SlaveParams.Alias":
+            path = "SlaveParams.Alias"
+        return _EthercatSlaveCTN.SetParamsAttribute(self, path, value)
+
+    def GetVariableLocationTree(self):
+        axis_name = self.CTNName()
+        current_location = self.GetCurrentLocation()
+        children = [
+            {
+                "name": name_frmt % (axis_name),
+                "type": LOCATION_VAR_INPUT,
+                "size": "W",
+                "IEC_type": iec_type,
+                "var_name": var_name_frmt % axis_name,
+                "location": location_frmt % (".".join(map(str, current_location))),
+                "description": "",
+                "children": []
+            }
+            for name_frmt, iec_type, var_name_frmt, location_frmt in [
+                ("%s Network Position", "UINT", "%s_pos", "%%IW%s"),
+                ("%s Axis Ref", "AXIS_REF", "%s", "%%IW%s.402")
+            ]
+        ]
+        children.extend(self.CTNParent.GetDeviceLocationTree(self.GetSlavePos(),
+                                                             current_location,
+                                                             axis_name))
+        return {
+            "name": axis_name,
+            "type": LOCATION_CONFNODE,
+            "location": self.GetFullIEC_Channel(),
+            "children": children,
+        }
+
+    def CTNGlobalInstances(self):
+        current_location = self.GetCurrentLocation()
+        return [("%s_%s" % (block_infos["blocktype"],
+                            "_".join(map(str, current_location))),
+                 "EtherLab%s" % block_infos["blocktype"], "")
+                for block_infos in FIELDBUS_INTERFACE_GLOBAL_INSTANCES]
+
+    def StartDragNDrop(self, data):
+        data_obj = wx.TextDataObject(str(data))
+        dragSource = wx.DropSource(self.GetCTRoot().AppFrame)
+        dragSource.SetData(data_obj)
+        dragSource.DoDragDrop()
+
+    def _getCIA402NetworkPosition(self):
+        self.StartDragNDrop(
+            ("%%IW%s" % ".".join(map(str, self.GetCurrentLocation())),
+             "location", "UINT", self.CTNName() + "_Pos", ""))
+
+    def _getCIA402AxisRef(self):
+        self.StartDragNDrop(
+            ("%%IW%s.402" % ".".join(map(str, self.GetCurrentLocation())),
+             "location", "AXIS_REF", self.CTNName(), ""))
+
+    def CTNGenerate_C(self, buildpath, locations):
+        current_location = self.GetCurrentLocation()
+
+        location_str = "_".join(map(str, current_location))
+        slave_pos = self.GetSlavePos()
+
+        # Open CIA402 node code template file
+        plc_cia402node_filepath = os.path.join(os.path.split(__file__)[0],
+                                               "plc_cia402node.c")
+        plc_cia402node_file = open(plc_cia402node_filepath, 'r')
+        plc_cia402node_code = plc_cia402node_file.read()
+        plc_cia402node_file.close()
+
+        # Init list of generated strings for each code template file section
+        fieldbus_interface_declaration = []
+        fieldbus_interface_definition = []
+        init_axis_params = []
+        extra_variables_retrieve = []
+        extra_variables_publish = []
+        extern_located_variables_declaration = []
+        entry_variables = []
+        init_entry_variables = []
+
+        # Fieldbus interface code sections
+        for blocktype_infos in FIELDBUS_INTERFACE_GLOBAL_INSTANCES:
+            blocktype = blocktype_infos["blocktype"]
+            ucase_blocktype = blocktype.upper()
+            blockname = "_".join([ucase_blocktype, location_str])
+
+            extract_inputs = "\n".join([
+                """\
+                __SET_VAR(%s->, %s,, %s);""" % (blockname, input_name, input_value)
+                for (input_name, input_value) in
+                [("EXECUTE", "__GET_VAR(data__->EXECUTE)")] + [
+                    (input["name"].upper(),
+                     "__GET_VAR(data__->%s)" % input["name"].upper())
+                    for input in blocktype_infos["inputs"]
+                ]])
+
+            return_outputs = "\n".join([
+                """\
+                __SET_VAR(data__->,%(output_name)s,,
+                __GET_VAR(%(blockname)s->%(output_name)s));""" % {
+                    "output_name": output_name,
+                    "blockname": blockname
+                }
+                for output_name in ["DONE", "BUSY", "ERROR"] + [
+                    output["name"].upper()
+                    for output in blocktype_infos["outputs"]]
+            ])
+
+            loc_dict = {
+                "ucase_blocktype": ucase_blocktype,
+                "blocktype": blocktype,
+                "blockname": blockname,
+                "location_str": location_str,
+                "extract_inputs": extract_inputs,
+                "return_outputs": return_outputs,
+            }
+
+            fieldbus_interface_declaration.append("""
+extern void ETHERLAB%(ucase_blocktype)s_body__(ETHERLAB%(ucase_blocktype)s* data__);
+void __%(blocktype)s_%(location_str)s(MC_%(ucase_blocktype)s *data__) {
+__DECLARE_GLOBAL_PROTOTYPE(ETHERLAB%(ucase_blocktype)s, %(blockname)s);
+ETHERLAB%(ucase_blocktype)s* %(blockname)s = __GET_GLOBAL_%(blockname)s();
+__SET_VAR(%(blockname)s->, POS,, AxsPub.axis->NetworkPosition);
+%(extract_inputs)s
+ETHERLAB%(ucase_blocktype)s_body__(%(blockname)s);
+%(return_outputs)s
+}""" % loc_dict)
+
+            fieldbus_interface_definition.append("""\
+        AxsPub.axis->__mcl_func_MC_%(blocktype)s = __%(blocktype)s_%(location_str)s;\
+""" % loc_dict)
+
+        # Get a copy list of default variables to map
+        variables = NODE_VARIABLES[:]
+
+        # Set AxisRef public struct members value
+        node_params = self.CTNParams[1].getElementInfos(self.CTNParams[0])
+        for param in node_params["children"]:
+            param_name = param["name"]
+
+            # Param is optional variables section enable flag
+            extra_node_variable_infos = EXTRA_NODE_VARIABLES_DICT.get(param_name)
+            if extra_node_variable_infos is not None:
+                param_name = param_name.replace("Enable", "") + "Enabled"
+
+                if not param["value"]:
+                    continue
+
+                # Optional variables section is enabled
+                for variable_infos in extra_node_variable_infos:
+                    var_name = variable_infos["description"][0]
+
+                    # Add each variables defined in section description to the
+                    # list of variables to map
+                    variables.append(variable_infos["description"])
+
+                    # Add code to publish or retrive variable
+                    coded = [
+                        ("retrieve",
+                         extra_variables_retrieve,
+                         "    AxsPub.axis->%(var_name)s = *(AxsPub.%(var_name)s);"),
+                        ("publish",
+                         extra_variables_publish,
+                         "    *(AxsPub.%(var_name)s) = AxsPub.axis->%(var_name)s;")
+                    ]
+                    for var_exchange_dir, _str_list, default_template in coded:
+                        template = variable_infos.get(var_exchange_dir, default_template)
+                        if template is not None:
+                            extra_variables_publish.append(template % locals())
+
+            # Set AxisRef public struct member value if defined
+            if param["value"] is not None:
+                param_value = ({True: "1", False: "0"}[param["value"]]
+                               if param["type"] == "boolean"
+                               else str(param["value"]))
+
+                init_axis_params.append("""\
+                AxsPub.axis->%(param_name)s = %(param_value)s;""" % {
+                    "param_value": param_value,
+                    "param_name": param_name,
+                })
+
+        # Add each variable in list of variables to map to master list of
+        # variables to add to network configuration
+        for name, index, subindex, var_type, dir in variables:
+            var_size = self.GetSizeOfType(var_type)
+            loc_dict = {
+                "var_size": var_size,
+                "var_type": var_type,
+                "name:": name,
+                "location_str": location_str,
+                "index": index,
+                "subindex": subindex,
+            }
+            var_name = """\
+__%(dir)s%(var_size)s%(location_str)s_%(index)d_%(subindex)d""" % loc_dict
+            loc_dict["var_name"] = var_name
+
+            extern_located_variables_declaration.append(
+                "IEC_%(var_type)s *%(var_name)s;" % loc_dict)
+            entry_variables.append(
+                "    IEC_%(var_type)s *%(name)s;" % loc_dict)
+            init_entry_variables.append(
+                "    AxsPub.%(name)s = %(var_name)s;" % loc_dict)
+
+            self.CTNParent.FileGenerator.DeclareVariable(
+                slave_pos, index, subindex, var_type, dir, var_name)
+
+        # Add newline between string in list of generated strings for sections
+        [fieldbus_interface_declaration, fieldbus_interface_definition,
+         init_axis_params, extra_variables_retrieve, extra_variables_publish,
+         extern_located_variables_declaration, entry_variables,
+         init_entry_variables] = map("\n".join, [
+             fieldbus_interface_declaration, fieldbus_interface_definition,
+             init_axis_params, extra_variables_retrieve, extra_variables_publish,
+             extern_located_variables_declaration, entry_variables,
+             init_entry_variables])
+
+        # Write generated content to CIA402 node file
+        Gen_CIA402Nodefile_path = os.path.join(buildpath,
+                                               "cia402node_%s.c" % location_str)
+        cia402nodefile = open(Gen_CIA402Nodefile_path, 'w')
+        cia402nodefile.write(plc_cia402node_code % locals())
+        cia402nodefile.close()
+
+        return [(Gen_CIA402Nodefile_path, '"-I%s"' % os.path.abspath(self.GetCTRoot().GetIECLibPath()))], "", True
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/EthercatMaster.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,827 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz
+#
+# Copyright (C) 2011-2014: Laurent BESSARD, Edouard TISSERANT
+#                          RTES Lab : CRKim, JBLee, youcu
+#                          Higen Motor : Donggu Kang
+#
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+import os
+from copy import deepcopy
+from functools import reduce
+from lxml import etree
+
+import wx
+
+from xmlclass import *
+
+from PLCControler import UndoBuffer, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT
+from ConfigTreeNode import ConfigTreeNode
+from dialogs import BrowseValuesLibraryDialog
+from IDEFrame import TITLE, FILEMENU, PROJECTTREE
+from POULibrary import POULibrary
+
+from etherlab.ConfigEditor import MasterEditor
+from etherlab.EthercatCFileGenerator import _EthercatCFileGenerator
+from etherlab.EthercatSlave import \
+    _EthercatSlaveCTN, \
+    ExtractHexDecValue, \
+    GenerateHexDecValue, \
+    TYPECONVERSION, \
+    VARCLASSCONVERSION, \
+    _CommonSlave
+
+try:
+    from etherlab.EthercatCIA402Slave import _EthercatCIA402SlaveCTN
+    HAS_MCL = True
+except Exception:
+    HAS_MCL = False
+
+# --------------------------------------------------
+#         Remote Exec Etherlab Commands
+# --------------------------------------------------
+
+SCAN_COMMAND = """
+import commands
+result = commands.getoutput("ethercat slaves")
+slaves = []
+for slave_line in result.splitlines():
+    chunks = slave_line.split()
+    idx, pos, state, flag = chunks[:4]
+    name = " ".join(chunks[4:])
+    alias, position = pos.split(":")
+    slave = {"idx": int(idx),
+             "alias": int(alias),
+             "position": int(position),
+             "name": name}
+    details = commands.getoutput("ethercat slaves -p %d -v" % slave["idx"])
+    for details_line in details.splitlines():
+        details_line = details_line.strip()
+        for header, param in [("Vendor Id:", "vendor_id"),
+                              ("Product code:", "product_code"),
+                              ("Revision number:", "revision_number")]:
+            if details_line.startswith(header):
+                slave[param] = details_line.split()[-1]
+                break
+    slaves.append(slave)
+returnVal = slaves
+"""
+
+# --------------------------------------------------
+#      Etherlab Specific Blocks Library
+# --------------------------------------------------
+
+
+def GetLocalPath(filename):
+    return os.path.join(os.path.split(__file__)[0], filename)
+
+
+class EtherlabLibrary(POULibrary):
+    def GetLibraryPath(self):
+        return GetLocalPath("pous.xml")
+
+    def Generate_C(self, buildpath, varlist, IECCFLAGS):
+        etherlab_ext_file = open(GetLocalPath("etherlab_ext.c"), 'r')
+        etherlab_ext_code = etherlab_ext_file.read()
+        etherlab_ext_file.close()
+
+        Gen_etherlabfile_path = os.path.join(buildpath, "etherlab_ext.c")
+        ethelabfile = open(Gen_etherlabfile_path, 'w')
+        ethelabfile.write(etherlab_ext_code)
+        ethelabfile.close()
+
+        return ((["etherlab_ext"], [(Gen_etherlabfile_path, IECCFLAGS)], True), "",
+                ("runtime_etherlab.py", open(GetLocalPath("runtime_etherlab.py"))))
+
+# --------------------------------------------------
+#                 Ethercat MASTER
+# --------------------------------------------------
+
+
+EtherCATConfigParser = GenerateParserFromXSD(os.path.join(os.path.dirname(__file__), "EtherCATConfig.xsd"))
+
+
+def sort_commands(x, y):
+    if x["Index"] == y["Index"]:
+        return cmp(x["Subindex"], y["Subindex"])
+    return cmp(x["Index"], y["Index"])
+
+
+cls = EtherCATConfigParser.GetElementClass("Slave", "Config")
+if cls:
+
+    def getType(self):
+        slave_info = self.getInfo()
+        return {"device_type": slave_info.getName(),
+                "vendor": GenerateHexDecValue(slave_info.getVendorId()),
+                "product_code": GenerateHexDecValue(slave_info.getProductCode(), 16),
+                "revision_number": GenerateHexDecValue(slave_info.getRevisionNo(), 16)}
+    setattr(cls, "getType", getType)
+
+    def setType(self, type_infos):
+        slave_info = self.getInfo()
+        slave_info.setName(type_infos["device_type"])
+        slave_info.setVendorId(ExtractHexDecValue(type_infos["vendor"]))
+        slave_info.setProductCode(ExtractHexDecValue(type_infos["product_code"]))
+        slave_info.setRevisionNo(ExtractHexDecValue(type_infos["revision_number"]))
+    setattr(cls, "setType", setType)
+
+    def getInitCmds(self, create_default=False):
+        Mailbox = self.getMailbox()
+        if Mailbox is None:
+            if create_default:
+                self.addMailbox()
+                Mailbox = self.getMailbox()
+            else:
+                return None
+        CoE = Mailbox.getCoE()
+        if CoE is None:
+            if create_default:
+                Mailbox.addCoE()
+                CoE = Mailbox.getCoE()
+            else:
+                return None
+        InitCmds = CoE.getInitCmds()
+        if InitCmds is None and create_default:
+            CoE.addInitCmds()
+            InitCmds = CoE.getInitCmds()
+        return InitCmds
+    setattr(cls, "getInitCmds", getInitCmds)
+
+    def getStartupCommands(self):
+        pos = self.getInfo().getPhysAddr()
+        InitCmds = self.getInitCmds()
+        if InitCmds is None:
+            return []
+        commands = []
+        for idx, InitCmd in enumerate(InitCmds.getInitCmd()):
+            comment = InitCmd.getComment()
+            if comment is None:
+                comment = ""
+            commands.append({
+                "command_idx": idx,
+                "Position": pos,
+                "Index": InitCmd.getIndex(),
+                "Subindex": InitCmd.getSubIndex(),
+                "Value": InitCmd.getData(),
+                "Description": comment})
+        commands.sort(sort_commands)
+        return commands
+    setattr(cls, "getStartupCommands", getStartupCommands)
+
+    def appendStartupCommand(self, command_infos):
+        InitCmds = self.getInitCmds(True)
+        command = EtherCATConfigParser.CreateElement("InitCmd", "InitCmds", 1)
+        InitCmds.appendInitCmd(command)
+        command.setIndex(command_infos["Index"])
+        command.setSubIndex(command_infos["Subindex"])
+        command.setData(command_infos["Value"])
+        command.setComment(command_infos["Description"])
+        return len(InitCmds.getInitCmd()) - 1
+    setattr(cls, "appendStartupCommand", appendStartupCommand)
+
+    def setStartupCommand(self, command_infos):
+        InitCmds = self.getInitCmds()
+        if InitCmds is not None:
+            commands = InitCmds.getInitCmd()
+            if command_infos["command_idx"] < len(commands):
+                command = commands[command_infos["command_idx"]]
+                command.setIndex(command_infos["Index"])
+                command.setSubIndex(command_infos["Subindex"])
+                command.setData(command_infos["Value"])
+                command.setComment(command_infos["Description"])
+    setattr(cls, "setStartupCommand", setStartupCommand)
+
+    def removeStartupCommand(self, command_idx):
+        InitCmds = self.getInitCmds()
+        if InitCmds is not None:
+            if command_idx < len(InitCmds.getInitCmd()):
+                InitCmds.removeInitCmd(command_idx)
+    setattr(cls, "removeStartupCommand", removeStartupCommand)
+
+ProcessVariablesXSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
+    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+      <xsd:element name="ProcessVariables">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="variable" minOccurs="0" maxOccurs="unbounded">
+              <xsd:complexType>
+                <xsd:sequence>
+                  <xsd:element name="ReadFrom" type="LocationDesc" minOccurs="0"/>
+                  <xsd:element name="WriteTo" type="LocationDesc" minOccurs="0"/>
+                </xsd:sequence>
+                <xsd:attribute name="Name" type="xsd:string" use="required"/>
+                <xsd:attribute name="Comment" type="xsd:string" use="required"/>
+              </xsd:complexType>
+            </xsd:element>
+          </xsd:sequence>
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:complexType name="LocationDesc">
+        <xsd:attribute name="Position" type="xsd:integer" use="required"/>
+        <xsd:attribute name="Index" type="xsd:integer" use="required"/>
+        <xsd:attribute name="SubIndex" type="xsd:integer" use="required"/>
+      </xsd:complexType>
+    </xsd:schema>
+"""
+
+ProcessVariablesParser = GenerateParserFromXSDstring(ProcessVariablesXSD)
+
+
+class _EthercatCTN(object):
+
+    CTNChildrenTypes = [("EthercatSlave", _EthercatSlaveCTN, "Ethercat Slave")]
+    if HAS_MCL:
+        CTNChildrenTypes.append(("EthercatCIA402Slave", _EthercatCIA402SlaveCTN, "Ethercat CIA402 Slave"))
+    EditorType = MasterEditor
+
+    def __init__(self):
+        config_filepath = self.ConfigFileName()
+        config_is_saved = False
+        self.Config = None
+        if os.path.isfile(config_filepath):
+            config_xmlfile = open(config_filepath, 'r')
+            try:
+                self.Config, error = \
+                    EtherCATConfigParser.LoadXMLString(config_xmlfile.read())
+                if error is None:
+                    config_is_saved = True
+            except Exception as e:
+                error = str(e)
+            config_xmlfile.close()
+
+            if error is not None:
+                self.GetCTRoot().logger.write_error(
+                    _("Couldn't load %s network configuration file.") % self.CTNName())
+
+        if self.Config is None:
+            self.Config = EtherCATConfigParser.CreateElement("EtherCATConfig")
+
+        process_filepath = self.ProcessVariablesFileName()
+        process_is_saved = False
+        self.ProcessVariables = None
+        if os.path.isfile(process_filepath):
+            process_xmlfile = open(process_filepath, 'r')
+            try:
+                self.ProcessVariables, error = \
+                    ProcessVariablesParser.LoadXMLString(process_xmlfile.read())
+                if error is None:
+                    process_is_saved = True
+            except Exception as e:
+                error = str(e)
+            process_xmlfile.close()
+
+            if error is not None:
+                self.GetCTRoot().logger.write_error(
+                    _("Couldn't load %s network process variables file.") % self.CTNName())
+
+        if self.ProcessVariables is None:
+            self.ProcessVariables = ProcessVariablesParser.CreateElement("ProcessVariables")
+
+        if config_is_saved and process_is_saved:
+            self.CreateBuffer(True)
+        else:
+            self.CreateBuffer(False)
+            self.OnCTNSave()
+
+        # ----------- call ethercat mng. function --------------
+        self.CommonMethod = _CommonSlave(self)
+
+    def GetIconName(self):
+        return "Ethercat"
+
+    def GetContextualMenuItems(self):
+        return [(_("Add Ethercat Slave"), _("Add Ethercat Slave to Master"), self.OnAddEthercatSlave)]
+
+    def OnAddEthercatSlave(self, event):
+        app_frame = self.GetCTRoot().AppFrame
+        dialog = BrowseValuesLibraryDialog(app_frame,
+                                           _("Ethercat Slave Type"),
+                                           self.GetSlaveTypesLibrary())
+        if dialog.ShowModal() == wx.ID_OK:
+            type_infos = dialog.GetValueInfos()
+            device, _module_extra_params = self.GetModuleInfos(type_infos)
+            if device is not None:
+                if HAS_MCL and _EthercatCIA402SlaveCTN.NODE_PROFILE in device.GetProfileNumbers():
+                    ConfNodeType = "EthercatCIA402Slave"
+                else:
+                    ConfNodeType = "EthercatSlave"
+                new_child = self.CTNAddChild("%s_0" % ConfNodeType, ConfNodeType)
+                new_child.SetParamsAttribute("SlaveParams.Type", type_infos)
+                self.CTNRequestSave()
+                new_child._OpenView()
+                app_frame._Refresh(TITLE, FILEMENU, PROJECTTREE)
+        dialog.Destroy()
+
+    def ExtractHexDecValue(self, value):
+        return ExtractHexDecValue(value)
+
+    def GetSizeOfType(self, type):
+        return TYPECONVERSION.get(self.GetCTRoot().GetBaseType(type), None)
+
+    def ConfigFileName(self):
+        return os.path.join(self.CTNPath(), "config.xml")
+
+    def ProcessVariablesFileName(self):
+        return os.path.join(self.CTNPath(), "process_variables.xml")
+
+    def FilterSlave(self, slave, vendor=None, slave_pos=None, slave_profile=None):
+        if slave_pos is not None and slave.getInfo().getPhysAddr() != slave_pos:
+            return False
+        type_infos = slave.getType()
+        if vendor is not None and ExtractHexDecValue(type_infos["vendor"]) != vendor:
+            return False
+        device, _module_extra_params = self.GetModuleInfos(type_infos)
+        if slave_profile is not None and slave_profile not in device.GetProfileNumbers():
+            return False
+        return True
+
+    def GetSlaveName(self, slave_pos):
+        CTNChild = self.GetChildByIECLocation((slave_pos,))
+        if CTNChild is not None:
+            return CTNChild.CTNName()
+        return self.CTNName()
+
+    def GetSlaves(self, vendor=None, slave_pos=None, slave_profile=None):
+        slaves = []
+        for slave in self.Config.getConfig().getSlave():
+            if self.FilterSlave(slave, vendor, slave_pos, slave_profile):
+                slaves.append(slave.getInfo().getPhysAddr())
+        slaves.sort()
+        return slaves
+
+    def GetSlave(self, slave_pos):
+        for slave in self.Config.getConfig().getSlave():
+            slave_info = slave.getInfo()
+            if slave_info.getPhysAddr() == slave_pos:
+                return slave
+        return None
+
+    def GetStartupCommands(self, vendor=None, slave_pos=None, slave_profile=None):
+        commands = []
+        for slave in self.Config.getConfig().getSlave():
+            if self.FilterSlave(slave, vendor, slave_pos, slave_profile):
+                commands.append((slave.getInfo().getPhysAddr(), slave.getStartupCommands()))
+        commands.sort()
+        return reduce(lambda x, y: x + y[1], commands, [])
+
+    def AppendStartupCommand(self, command_infos):
+        slave = self.GetSlave(command_infos["Position"])
+        if slave is not None:
+            command_idx = slave.appendStartupCommand(command_infos)
+            self.BufferModel()
+            return command_idx
+        return None
+
+    def SetStartupCommandInfos(self, command_infos):
+        slave = self.GetSlave(command_infos["Position"])
+        if slave is not None:
+            slave.setStartupCommand(command_infos)
+            self.BufferModel()
+
+    def RemoveStartupCommand(self, slave_pos, command_idx, buffer=True):
+        slave = self.GetSlave(slave_pos)
+        if slave is not None:
+            slave.removeStartupCommand(command_idx)
+            if buffer:
+                self.BufferModel()
+
+    def SetProcessVariables(self, variables):
+        vars = []
+        for var in variables:
+            variable = ProcessVariablesParser.CreateElement("variable", "ProcessVariables")
+            variable.setName(var["Name"])
+            variable.setComment(var["Description"])
+            if var["ReadFrom"] != "":
+                position, index, subindex = var["ReadFrom"]
+                if variable.getReadFrom() is None:
+                    variable.addReadFrom()
+                read_from = variable.getReadFrom()
+                read_from.setPosition(position)
+                read_from.setIndex(index)
+                read_from.setSubIndex(subindex)
+            elif variable.getReadFrom() is not None:
+                variable.deleteReadFrom()
+            if var["WriteTo"] != "":
+                position, index, subindex = var["WriteTo"]
+                if variable.getWriteTo() is None:
+                    variable.addWriteTo()
+                write_to = variable.getWriteTo()
+                write_to.setPosition(position)
+                write_to.setIndex(index)
+                write_to.setSubIndex(subindex)
+            elif variable.getWriteTo() is not None:
+                variable.deleteWriteTo()
+            vars.append(variable)
+        self.ProcessVariables.setvariable(vars)
+        self.BufferModel()
+
+    def GetProcessVariables(self):
+        variables = []
+        idx = 0
+        for variable in self.ProcessVariables.getvariable():
+            var = {"Name": variable.getName(),
+                   "Number": idx,
+                   "Description": variable.getComment()}
+            read_from = variable.getReadFrom()
+            if read_from is not None:
+                var["ReadFrom"] = (read_from.getPosition(),
+                                   read_from.getIndex(),
+                                   read_from.getSubIndex())
+            else:
+                var["ReadFrom"] = ""
+            write_to = variable.getWriteTo()
+            if write_to is not None:
+                var["WriteTo"] = (write_to.getPosition(),
+                                  write_to.getIndex(),
+                                  write_to.getSubIndex())
+            else:
+                var["WriteTo"] = ""
+            variables.append(var)
+            idx += 1
+        return variables
+
+    def _ScanNetwork(self):
+        app_frame = self.GetCTRoot().AppFrame
+
+        execute = True
+        if len(self.Children) > 0:
+            dialog = wx.MessageDialog(
+                app_frame,
+                _("The current network configuration will be deleted.\nDo you want to continue?"),
+                _("Scan Network"),
+                wx.YES_NO | wx.ICON_QUESTION)
+            execute = dialog.ShowModal() == wx.ID_YES
+            dialog.Destroy()
+
+        if execute:
+            error, returnVal = self.RemoteExec(SCAN_COMMAND, returnVal=None)
+            if error != 0:
+                dialog = wx.MessageDialog(app_frame, returnVal, _("Error"), wx.OK | wx.ICON_ERROR)
+                dialog.ShowModal()
+                dialog.Destroy()
+            elif returnVal is not None:
+                for child in self.IECSortedChildren():
+                    self._doRemoveChild(child)
+
+                for slave in returnVal:
+                    type_infos = {
+                        "vendor": slave["vendor_id"],
+                        "product_code": slave["product_code"],
+                        "revision_number": slave["revision_number"],
+                    }
+                    device, _module_extra_params = self.GetModuleInfos(type_infos)
+                    if device is not None:
+                        if HAS_MCL and _EthercatCIA402SlaveCTN.NODE_PROFILE in device.GetProfileNumbers():
+                            CTNType = "EthercatCIA402Slave"
+                        else:
+                            CTNType = "EthercatSlave"
+                        self.CTNAddChild("slave%s" % slave["idx"], CTNType, slave["idx"])
+                        self.SetSlaveAlias(slave["idx"], slave["alias"])
+                        type_infos["device_type"] = device.getType().getcontent()
+                        self.SetSlaveType(slave["idx"], type_infos)
+
+                if app_frame:
+                    app_frame.RefreshProjectTree()
+
+    def CTNAddChild(self, CTNName, CTNType, IEC_Channel=0):
+        """
+        Create the confnodes that may be added as child to this node self
+        @param CTNType: string desining the confnode class name (get name from CTNChildrenTypes)
+        @param CTNName: string for the name of the confnode instance
+        """
+        newConfNodeOpj = ConfigTreeNode.CTNAddChild(self, CTNName, CTNType, IEC_Channel)
+
+        slave = self.GetSlave(newConfNodeOpj.BaseParams.getIEC_Channel())
+        if slave is None:
+            slave = EtherCATConfigParser.CreateElement("Slave", "Config")
+            self.Config.getConfig().appendSlave(slave)
+            slave_infos = slave.getInfo()
+            slave_infos.setName("undefined")
+            slave_infos.setPhysAddr(newConfNodeOpj.BaseParams.getIEC_Channel())
+            slave_infos.setAutoIncAddr(0)
+            self.BufferModel()
+            self.OnCTNSave()
+
+        return newConfNodeOpj
+
+    def _doRemoveChild(self, CTNInstance):
+        slave_pos = CTNInstance.GetSlavePos()
+        config = self.Config.getConfig()
+        for idx, slave in enumerate(config.getSlave()):
+            slave_infos = slave.getInfo()
+            if slave_infos.getPhysAddr() == slave_pos:
+                config.removeSlave(idx)
+                self.BufferModel()
+                self.OnCTNSave()
+        ConfigTreeNode._doRemoveChild(self, CTNInstance)
+
+    def SetSlavePosition(self, slave_pos, new_pos):
+        slave = self.GetSlave(slave_pos)
+        if slave is not None:
+            slave_info = slave.getInfo()
+            slave_info.setPhysAddr(new_pos)
+            for variable in self.ProcessVariables.getvariable():
+                read_from = variable.getReadFrom()
+                if read_from is not None and read_from.getPosition() == slave_pos:
+                    read_from.setPosition(new_pos)
+                write_to = variable.getWriteTo()
+                if write_to is not None and write_to.getPosition() == slave_pos:
+                    write_to.setPosition(new_pos)
+            self.CreateBuffer(True)
+            self.CTNRequestSave()
+            if self._View is not None:
+                self._View.RefreshView()
+                self._View.RefreshBuffer()
+
+    def GetSlaveAlias(self, slave_pos):
+        slave = self.GetSlave(slave_pos)
+        if slave is not None:
+            slave_info = slave.getInfo()
+            return slave_info.getAutoIncAddr()
+        return None
+
+    def SetSlaveAlias(self, slave_pos, alias):
+        slave = self.GetSlave(slave_pos)
+        if slave is not None:
+            slave_info = slave.getInfo()
+            slave_info.setAutoIncAddr(alias)
+            self.BufferModel()
+
+    def GetSlaveType(self, slave_pos):
+        slave = self.GetSlave(slave_pos)
+        if slave is not None:
+            return slave.getType()
+        return None
+
+    def SetSlaveType(self, slave_pos, type_infos):
+        slave = self.GetSlave(slave_pos)
+        if slave is not None:
+            slave.setType(type_infos)
+            self.BufferModel()
+
+    def GetSlaveInfos(self, slave_pos):
+        slave = self.GetSlave(slave_pos)
+        if slave is not None:
+            type_infos = slave.getType()
+            device, _module_extra_params = self.GetModuleInfos(type_infos)
+            if device is not None:
+                infos = type_infos.copy()
+                infos.update({"physics": device.getPhysics(),
+                              "sync_managers": device.GetSyncManagers(),
+                              "entries": self.GetSlaveVariables(device)})
+                return infos
+        return None
+
+    def GetSlaveVariables(self, slave_pos=None, limits=None, device=None):
+        if device is None and slave_pos is not None:
+            slave = self.GetSlave(slave_pos)
+            if slave is not None:
+                type_infos = slave.getType()
+                device, _module_extra_params = self.GetModuleInfos(type_infos)
+        if device is not None:
+            entries = device.GetEntriesList(limits)
+            entries_list = entries.items()
+            entries_list.sort()
+            entries = []
+            current_index = None
+            current_entry = {}
+            for (index, _subindex), entry in entries_list:
+                entry["children"] = []
+                if slave_pos is not None:
+                    entry["Position"] = str(slave_pos)
+                if index != current_index:
+                    current_index = index
+                    current_entry = entry
+                    entries.append(entry)
+                elif current_entry:
+                    current_entry["children"].append(entry)
+                else:
+                    entries.append(entry)
+            return entries
+        return []
+
+    def GetSlaveVariableDataType(self, slave_pos, index, subindex):
+        slave = self.GetSlave(slave_pos)
+        if slave is not None:
+            device, _module_extra_params = self.GetModuleInfos(slave.getType())
+            if device is not None:
+                entries = device.GetEntriesList()
+                entry_infos = entries.get((index, subindex))
+                if entry_infos is not None:
+                    return entry_infos["Type"]
+        return None
+
+    def GetNodesVariables(self, vendor=None, slave_pos=None, slave_profile=None, limits=None):
+        entries = []
+        for slave_position in self.GetSlaves():
+            if slave_pos is not None and slave_position != slave_pos:
+                continue
+            slave = self.GetSlave(slave_position)
+            type_infos = slave.getType()
+            if vendor is not None and ExtractHexDecValue(type_infos["vendor"]) != vendor:
+                continue
+            device, _module_extra_params = self.GetModuleInfos(type_infos)
+            if slave_profile is not None and slave_profile not in device.GetProfileNumbers():
+                continue
+            entries.extend(self.GetSlaveVariables(slave_position, limits, device))
+        return entries
+
+    def GetModuleInfos(self, type_infos):
+        return self.CTNParent.GetModuleInfos(type_infos)
+
+    def GetSlaveTypesLibrary(self, profile_filter=None):
+        return self.CTNParent.GetModulesLibrary(profile_filter)
+
+    def GetLibraryVendors(self):
+        return self.CTNParent.GetVendors()
+
+    def GetDeviceLocationTree(self, slave_pos, current_location, device_name):
+        slave = self.GetSlave(slave_pos)
+        vars = []
+        if slave is not None:
+            type_infos = slave.getType()
+
+            device, _module_extra_params = self.GetModuleInfos(type_infos)
+            if device is not None:
+                sync_managers = []
+                for sync_manager in device.getSm():
+                    sync_manager_control_byte = ExtractHexDecValue(sync_manager.getControlByte())
+                    sync_manager_direction = sync_manager_control_byte & 0x0c
+                    if sync_manager_direction:
+                        sync_managers.append(LOCATION_VAR_OUTPUT)
+                    else:
+                        sync_managers.append(LOCATION_VAR_INPUT)
+
+                entries = device.GetEntriesList().items()
+                entries.sort()
+                for (index, subindex), entry in entries:
+                    var_size = self.GetSizeOfType(entry["Type"])
+                    if var_size is not None:
+                        var_class = VARCLASSCONVERSION.get(entry["PDOMapping"], None)
+                        if var_class is not None:
+                            if var_class == LOCATION_VAR_INPUT:
+                                var_dir = "%I"
+                            else:
+                                var_dir = "%Q"
+
+                            vars.append({
+                                "name": "0x%4.4x-0x%2.2x: %s" % (index, subindex, entry["Name"]),
+                                "type": var_class,
+                                "size": var_size,
+                                "IEC_type": entry["Type"],
+                                "var_name": "%s_%4.4x_%2.2x" % ("_".join(device_name.split()), index, subindex),
+                                "location": "%s%s%s" % (var_dir, var_size, ".".join(map(str, current_location +
+                                                                                        (index, subindex)))),
+                                "description": "",
+                                "children": [],
+                            })
+
+        return vars
+
+    def CTNTestModified(self):
+        return self.ChangesToSave or not self.ModelIsSaved()
+
+    def OnCTNSave(self, from_project_path=None):
+        config_filepath = self.ConfigFileName()
+
+        config_xmlfile = open(config_filepath, "w")
+        config_xmlfile.write(etree.tostring(
+            self.Config,
+            pretty_print=True,
+            xml_declaration=True,
+            encoding='utf-8'))
+        config_xmlfile.close()
+
+        process_filepath = self.ProcessVariablesFileName()
+
+        process_xmlfile = open(process_filepath, "w")
+        process_xmlfile.write(etree.tostring(
+            self.ProcessVariables,
+            pretty_print=True,
+            xml_declaration=True,
+            encoding='utf-8'))
+        process_xmlfile.close()
+
+        self.Buffer.CurrentSaved()
+        return True
+
+    def GetProcessVariableName(self, location, var_type):
+        return "__M%s_%s" % (self.GetSizeOfType(var_type), "_".join(map(str, location)))
+
+    def _Generate_C(self, buildpath, locations):
+        current_location = self.GetCurrentLocation()
+        # define a unique name for the generated C file
+        location_str = "_".join(map(str, current_location))
+
+        Gen_Ethercatfile_path = os.path.join(buildpath, "ethercat_%s.c" % location_str)
+
+        self.FileGenerator = _EthercatCFileGenerator(self)
+
+        LocationCFilesAndCFLAGS, LDFLAGS, extra_files = ConfigTreeNode._Generate_C(self, buildpath, locations)
+
+        for idx, variable in enumerate(self.ProcessVariables.getvariable()):
+            name = None
+            var_type = None
+            read_from = variable.getReadFrom()
+            write_to = variable.getWriteTo()
+            if read_from is not None:
+                pos = read_from.getPosition()
+                index = read_from.getIndex()
+                subindex = read_from.getSubIndex()
+                location = current_location + (idx, )
+                var_type = self.GetSlaveVariableDataType(pos, index, subindex)
+                name = self.FileGenerator.DeclareVariable(pos, index, subindex,
+                                                          var_type, "I",
+                                                          self.GetProcessVariableName(location, var_type))
+            if write_to is not None:
+                pos = write_to.getPosition()
+                index = write_to.getIndex()
+                subindex = write_to.getSubIndex()
+                if name is None:
+                    location = current_location + (idx, )
+                    var_type = self.GetSlaveVariableDataType(pos, index, subindex)
+                    name = self.GetProcessVariableName(location, var_type)
+                self.FileGenerator.DeclareVariable(pos, index, subindex, var_type, "Q", name, True)
+
+        self.FileGenerator.GenerateCFile(Gen_Ethercatfile_path, location_str, self.BaseParams.getIEC_Channel())
+
+        LocationCFilesAndCFLAGS.insert(
+            0,
+            (current_location,
+             [(Gen_Ethercatfile_path, '"-I%s"' % os.path.abspath(self.GetCTRoot().GetIECLibPath()))],
+             True))
+        LDFLAGS.append("-lethercat_rtdm -lrtdm")
+
+        return LocationCFilesAndCFLAGS, LDFLAGS, extra_files
+
+    ConfNodeMethods = [
+        {
+            "bitmap": "ScanNetwork",
+            "name": _("Scan Network"),
+            "tooltip": _("Scan Network"),
+            "method": "_ScanNetwork",
+        },
+    ]
+
+    def CTNGenerate_C(self, buildpath, locations):
+        current_location = self.GetCurrentLocation()
+
+        slaves = self.GetSlaves()
+        for slave_pos in slaves:
+            slave = self.GetSlave(slave_pos)
+            if slave is not None:
+                self.FileGenerator.DeclareSlave(slave_pos, slave)
+
+        for location in locations:
+            loc = location["LOC"][len(current_location):]
+            slave_pos = loc[0]
+            if slave_pos in slaves and len(loc) == 3 and location["DIR"] != "M":
+                self.FileGenerator.DeclareVariable(
+                    slave_pos, loc[1], loc[2], location["IEC_TYPE"], location["DIR"], location["NAME"])
+
+        return [], "", False
+
+# -------------------------------------------------------------------------------
+#                      Current Buffering Management Functions
+# -------------------------------------------------------------------------------
+
+    def Copy(self, model):
+        """Return a copy of the config"""
+        return deepcopy(model)
+
+    def CreateBuffer(self, saved):
+        self.Buffer = UndoBuffer(
+            (EtherCATConfigParser.Dumps(self.Config),
+             ProcessVariablesParser.Dumps(self.ProcessVariables)),
+            saved)
+
+    def BufferModel(self):
+        self.Buffer.Buffering(
+            (EtherCATConfigParser.Dumps(self.Config),
+             ProcessVariablesParser.Dumps(self.ProcessVariables)))
+
+    def ModelIsSaved(self):
+        if self.Buffer is not None:
+            return self.Buffer.IsCurrentSaved()
+        else:
+            return True
+
+    def LoadPrevious(self):
+        config, process_variables = self.Buffer.Previous()
+        self.Config = EtherCATConfigParser.Loads(config)
+        self.ProcessVariables = ProcessVariablesParser.Loads(process_variables)
+
+    def LoadNext(self):
+        config, process_variables = self.Buffer.Next()
+        self.Config = EtherCATConfigParser.Loads(config)
+        self.ProcessVariables = ProcessVariablesParser.Loads(process_variables)
+
+    def GetBufferState(self):
+        first = self.Buffer.IsFirst()
+        last = self.Buffer.IsLast()
+        return not first, not last
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/EthercatSlave.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,169 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz
+#
+# Copyright (C) 2011-2014: Laurent BESSARD, Edouard TISSERANT
+#                          RTES Lab : CRKim, JBLee, youcu
+#                          Higen Motor : Donggu Kang
+#
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+
+from PLCControler import LOCATION_CONFNODE, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY
+from ConfigTreeNode import ConfigTreeNode
+
+from etherlab.ConfigEditor import NodeEditor
+
+# ------------------------------------------
+from etherlab.CommonEtherCATFunction import _CommonSlave
+# ------------------------------------------
+
+
+TYPECONVERSION = {"BOOL": "X", "SINT": "B", "INT": "W", "DINT": "D", "LINT": "L",
+                  "USINT": "B", "UINT": "W", "UDINT": "D", "ULINT": "L",
+                  "BYTE": "B", "WORD": "W", "DWORD": "D", "LWORD": "L"}
+
+DATATYPECONVERSION = {"BOOL": "BIT", "SINT": "S8", "INT": "S16", "DINT": "S32", "LINT": "S64",
+                      "USINT": "U8", "UINT": "U16", "UDINT": "U32", "ULINT": "U64",
+                      "BYTE": "U8", "WORD": "U16", "DWORD": "U32", "LWORD": "U64"}
+
+VARCLASSCONVERSION = {"T": LOCATION_VAR_INPUT, "R": LOCATION_VAR_OUTPUT, "RT": LOCATION_VAR_MEMORY}
+
+
+def ExtractHexDecValue(value):
+    try:
+        return int(value)
+    except Exception:
+        pass
+    try:
+        return int(value.replace("#", "0"), 16)
+    except Exception:
+        raise ValueError("Invalid value for HexDecValue \"%s\"" % value)
+
+
+def GenerateHexDecValue(value, base=10):
+    if base == 10:
+        return str(value)
+    elif base == 16:
+        return "#x%.8x" % value
+    else:
+        raise ValueError("Not supported base")
+
+
+def ExtractName(names, default=None):
+    if len(names) == 1:
+        return names[0].getcontent()
+    else:
+        for name in names:
+            if name.getLcId() == 1033:
+                return name.getcontent()
+    return default
+
+
+# --------------------------------------------------
+#                    Ethercat Node
+# --------------------------------------------------
+
+class _EthercatSlaveCTN(object):
+    NODE_PROFILE = None
+    EditorType = NodeEditor
+
+    def __init__(self):
+        # ----------- call ethercat mng. function --------------
+        self.CommonMethod = _CommonSlave(self)
+
+    def GetIconName(self):
+        return "Slave"
+
+    def ExtractHexDecValue(self, value):
+        return ExtractHexDecValue(value)
+
+    def GetSizeOfType(self, type):
+        return TYPECONVERSION.get(self.GetCTRoot().GetBaseType(type), None)
+
+    def GetSlavePos(self):
+        return self.BaseParams.getIEC_Channel()
+
+    def GetParamsAttributes(self, path=None):
+        if path:
+            parts = path.split(".", 1)
+            if self.MandatoryParams and parts[0] == self.MandatoryParams[0]:
+                return self.MandatoryParams[1].getElementInfos(parts[0], parts[1])
+            elif self.CTNParams and parts[0] == self.CTNParams[0]:
+                return self.CTNParams[1].getElementInfos(parts[0], parts[1])
+        else:
+            params = []
+            if self.CTNParams:
+                params.append(self.CTNParams[1].getElementInfos(self.CTNParams[0]))
+            else:
+                params.append({
+                    'use': 'required',
+                    'type': 'element',
+                    'name': 'SlaveParams',
+                    'value': None,
+                    'children': []
+                })
+
+            slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos())
+            params[0]['children'].insert(
+                0,
+                {
+                    'use': 'optional',
+                    'type': self.CTNParent.GetSlaveTypesLibrary(self.NODE_PROFILE),
+                    'name': 'Type',
+                    'value': (slave_type["device_type"], slave_type)
+                })
+            params[0]['children'].insert(
+                1,
+                {
+                    'use': 'optional',
+                    'type': 'unsignedLong',
+                    'name': 'Alias',
+                    'value': self.CTNParent.GetSlaveAlias(self.GetSlavePos())
+                })
+            return params
+
+    def SetParamsAttribute(self, path, value):
+        self.GetSlaveInfos()
+        position = self.BaseParams.getIEC_Channel()
+
+        if path == "SlaveParams.Type":
+            self.CTNParent.SetSlaveType(position, value)
+            slave_type = self.CTNParent.GetSlaveType(self.GetSlavePos())
+            value = (slave_type["device_type"], slave_type)
+            # if self._View is not None:
+            #     wx.CallAfter(self._View.EtherCATManagementTreebook.SlaveStatePanel.RefreshSlaveInfos())
+            #     self._View.EtherCATManagementTreebook.SlaveStatePanel.RefreshSlaveInfos()
+            #     self._View.EtherCATManagementTreebook.PDOMonitoringPanel.PDOInfoUpdate()
+            #     self._View.EtherCATManagementTreebook.SmartView.Create_SmartView()
+            return value, True
+        elif path == "SlaveParams.Alias":
+            self.CTNParent.SetSlaveAlias(position, value)
+            return value, True
+
+        value, refresh = ConfigTreeNode.SetParamsAttribute(self, path, value)
+
+        # Filter IEC_Channel, Slave_Type and Alias that have specific behavior
+        if path == "BaseParams.IEC_Channel" and value != position:
+            self.CTNParent.SetSlavePosition(position, value)
+
+        return value, refresh
+
+    def GetSlaveInfos(self):
+        return self.CTNParent.GetSlaveInfos(self.GetSlavePos())
+
+    def GetSlaveVariables(self, limits):
+        return self.CTNParent.GetSlaveVariables(self.GetSlavePos(), limits)
+
+    def GetVariableLocationTree(self):
+        return {
+            "name": self.BaseParams.getName(),
+            "type": LOCATION_CONFNODE,
+            "location": self.GetFullIEC_Channel(),
+            "children": self.CTNParent.GetDeviceLocationTree(self.GetSlavePos(), self.GetCurrentLocation(), self.BaseParams.getName())
+        }
+
+    def CTNGenerate_C(self, buildpath, locations):
+        return [], "", False
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/README	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,1 @@
+Ethercat
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,7 @@
+from __future__ import absolute_import
+
+from etherlab.etherlab import *
+from util.BitmapLibrary import AddBitmapFolder
+import util.paths as paths
+
+AddBitmapFolder(os.path.join(paths.AbsDir(__file__), "images"))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/entries_list.xslt	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,1 @@
+<xsl:stylesheet xmlns:func="http://exslt.org/functions" xmlns:dyn="http://exslt.org/dynamic" xmlns:str="http://exslt.org/strings" xmlns:math="http://exslt.org/math" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="ns" xmlns:yml="http://fdik.org/yml" xmlns:set="http://exslt.org/sets" version="1.0" xmlns:ns="entries_list_ns" exclude-result-prefixes="ns" xmlns:regexp="http://exslt.org/regular-expressions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml"/><xsl:variable name="space" select="'                                                                                                                                                                                                        '"/><xsl:param name="autoindent" select="4"/><xsl:param name="min_index"/><xsl:param name="max_index"/><xsl:template match="text()"><xsl:param name="_indent" select="0"/></xsl:template><xsl:template match="Device"><xsl:param name="_indent" select="0"/><xsl:apply-templates select="Profile/Dictionary/Objects/Object"><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/></xsl:apply-templates><xsl:for-each select="RxPdo"><xsl:call-template name="pdo_entries"><xsl:with-param name="direction" select="'Receive'"/></xsl:call-template></xsl:for-each><xsl:for-each select="TxPdo"><xsl:call-template name="pdo_entries"><xsl:with-param name="direction" select="'Transmit'"/></xsl:call-template></xsl:for-each></xsl:template><xsl:template match="Object"><xsl:param name="_indent" select="0"/><xsl:variable name="index"><xsl:value-of select="ns:HexDecValue(Index/text())"/></xsl:variable><xsl:variable name="entry_name"><xsl:value-of select="ns:EntryName(Name)"/></xsl:variable><xsl:choose><xsl:when test="$index &gt;= $min_index and $index &lt;= $max_index"><xsl:variable name="datatype_name"><xsl:value-of select="Type/text()"/></xsl:variable><xsl:choose><xsl:when test="ancestor::Dictionary/child::DataTypes/DataType[Name/text()=$datatype_name][SubItem]"><xsl:apply-templates select="ancestor::Dictionary/child::DataTypes/DataType[Name/text()=$datatype_name][SubItem]"><xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/><xsl:with-param name="index"><xsl:value-of select="$index"/></xsl:with-param><xsl:with-param name="entry_name"><xsl:value-of select="$entry_name"/></xsl:with-param></xsl:apply-templates></xsl:when><xsl:otherwise><xsl:variable name="subindex"><xsl:text>0</xsl:text></xsl:variable><xsl:variable name="entry"><xsl:value-of select="ns:AddEntry($index, $subindex, $entry_name, $datatype_name, BitSize/text(), Flags/Access/text(), Flags/PdoMapping/text())"/></xsl:variable></xsl:otherwise></xsl:choose></xsl:when></xsl:choose></xsl:template><xsl:template match="DataType"><xsl:param name="_indent" select="0"/><xsl:param name="index"/><xsl:param name="entry_name"/><xsl:for-each select="SubItem"><xsl:variable name="subindex"><xsl:value-of select="ns:HexDecValue(SubIdx/text())"/></xsl:variable><xsl:variable name="subentry_name"><xsl:value-of select="$entry_name"/><xsl:text> - </xsl:text><xsl:value-of select="ns:EntryName(DisplayName, Name/text())"/></xsl:variable><xsl:variable name="entry"><xsl:value-of select="ns:AddEntry($index, $subindex, $subentry_name, Type/text(), BitSize/text(), Flags/Access/text(), Flags/PdoMapping/text())"/></xsl:variable></xsl:for-each></xsl:template><xsl:template name="pdo_entries"><xsl:param name="_indent" select="0"/><xsl:param name="direction"/><xsl:variable name="pdo_index"><xsl:value-of select="ns:HexDecValue(Index/text())"/></xsl:variable><xsl:variable name="pdo_name"><xsl:value-of select="ns:EntryName(Name)"/></xsl:variable><xsl:for-each select="Entry"><xsl:variable name="index"><xsl:value-of select="ns:HexDecValue(Index/text())"/></xsl:variable><xsl:choose><xsl:when test="$index &gt;= $min_index and $index &lt;= $max_index"><xsl:variable name="subindex"><xsl:value-of select="ns:HexDecValue(SubIndex/text())"/></xsl:variable><xsl:variable name="subentry_name"><xsl:value-of select="ns:EntryName(Name)"/></xsl:variable><xsl:variable name="access"><xsl:choose><xsl:when test="$direction='Transmit'"><xsl:text>ro</xsl:text></xsl:when><xsl:otherwise><xsl:text>wo</xsl:text></xsl:otherwise></xsl:choose></xsl:variable><xsl:variable name="pdo_mapping"><xsl:choose><xsl:when test="$direction='Transmit'"><xsl:text>T</xsl:text></xsl:when><xsl:otherwise><xsl:text>R</xsl:text></xsl:otherwise></xsl:choose></xsl:variable><xsl:variable name="entry"><xsl:value-of select="ns:AddEntry($index, $subindex, $subentry_name, DataType/text(), BitLen/text(), $access, $pdo_mapping, $pdo_index, $pdo_name, $direction)"/></xsl:variable></xsl:when></xsl:choose></xsl:for-each></xsl:template></xsl:stylesheet>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/entries_list.ysl2	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,100 @@
+/*
+
+Stylesheet used to list EtherCat dictionnary entries.
+
+Copyright (C) 2011-2014: Laurent BESSARD
+
+Distributed under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+See COPYING file for copyrights details.
+
+*/
+
+include yslt.yml2
+estylesheet xmlns:ns="entries_list_ns" 
+            extension-element-prefixes="ns" 
+            exclude-result-prefixes="ns" {
+    
+    param "min_index";
+    param "max_index";
+    
+    template "text()";
+    
+    template "Device" {
+        apply "Profile/Dictionary/Objects/Object";
+        foreach "RxPdo" {
+            call "pdo_entries" with "direction", "'Receive'";
+        }
+        foreach "TxPdo" {
+            call "pdo_entries" with "direction", "'Transmit'";
+        }
+    }
+    
+    template "Object" {
+        variable "index" > «ns:HexDecValue(Index/text())»
+        variable "entry_name" > «ns:EntryName(Name)»
+        choose {
+            when "$index >= $min_index and $index <= $max_index" {
+                variable "datatype_name" > «Type/text()»
+                choose {
+                    when "ancestor::Dictionary/child::DataTypes/DataType[Name/text()=$datatype_name][SubItem]" {
+                        apply "ancestor::Dictionary/child::DataTypes/DataType[Name/text()=$datatype_name][SubItem]" {
+                            with "index" > «$index»
+                            with "entry_name" > «$entry_name»
+                        }
+                    }
+                    otherwise {
+                        variable "subindex" > 0
+                        variable "entry" {
+                            > «ns:AddEntry($index, $subindex, $entry_name, $datatype_name, BitSize/text(), Flags/Access/text(), Flags/PdoMapping/text())»
+                        }
+                    }
+                }
+            }
+        }
+    }
+    
+    template "DataType" {
+        param "index";
+        param "entry_name";
+        foreach "SubItem" {
+            variable "subindex" > «ns:HexDecValue(SubIdx/text())»
+            variable "subentry_name" > «$entry_name» - «ns:EntryName(DisplayName, Name/text())»
+            variable "entry" {
+                > «ns:AddEntry($index, $subindex, $subentry_name, Type/text(), BitSize/text(), Flags/Access/text(), Flags/PdoMapping/text())»
+            }
+        }
+    }
+    
+    function "pdo_entries" {
+        param "direction";
+        variable "pdo_index" > «ns:HexDecValue(Index/text())»
+        variable "pdo_name" > «ns:EntryName(Name)»
+        foreach "Entry" {
+            variable "index" > «ns:HexDecValue(Index/text())»
+            choose {
+                when "$index >= $min_index and $index <= $max_index" {
+                    variable "subindex" > «ns:HexDecValue(SubIndex/text())»
+                    variable "subentry_name" > «ns:EntryName(Name)»
+                    variable "access" {
+                        choose {
+                            when "$direction='Transmit'" > ro
+                            otherwise > wo
+                        }
+                    }
+                    variable "pdo_mapping" {
+                        choose {
+                            when "$direction='Transmit'" > T
+                            otherwise > R
+                        }
+                    }
+                    variable "entry" {
+                        > «ns:AddEntry($index, $subindex, $subentry_name, DataType/text(), BitLen/text(), $access, $pdo_mapping, $pdo_index, $pdo_name, $direction)»
+                    }
+                }
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/etherlab.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,459 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz
+#
+# Copyright (C) 2011-2014: Laurent BESSARD, Edouard TISSERANT
+#                          RTES Lab : CRKim, JBLee, youcu
+#                          Higen Motor : Donggu Kang
+#
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+import os
+import shutil
+import csv
+from builtins import str as text
+
+from lxml import etree
+import wx
+
+from xmlclass import *
+
+from ConfigTreeNode import XSDSchemaErrorMessage
+
+from etherlab.EthercatSlave import ExtractHexDecValue, ExtractName
+from etherlab.EthercatMaster import _EthercatCTN
+from etherlab.ConfigEditor import LibraryEditor, ETHERCAT_VENDOR, ETHERCAT_GROUP, ETHERCAT_DEVICE
+
+ScriptDirectory = os.path.split(os.path.realpath(__file__))[0]
+
+# --------------------------------------------------
+#                 Ethercat ConfNode
+# --------------------------------------------------
+
+EtherCATInfoParser = GenerateParserFromXSD(os.path.join(os.path.dirname(__file__), "EtherCATInfo.xsd"))
+
+
+def EtherCATInfo_XPath(xpath):
+    return etree.XPath(xpath)
+
+
+def HexDecValue(context, *args):
+    return str(ExtractHexDecValue(args[0][0]))
+
+
+def EntryName(context, *args):
+    return ExtractName(args[0], args[1][0] if len(args) > 1 else None)
+
+
+ENTRY_INFOS_KEYS = [
+    ("Index", lambda x: "#x%4.4X" % int(x), "#x0000"),
+    ("SubIndex", str, "0"),
+    ("Name", str, ""),
+    ("Type", str, ""),
+    ("BitSize", int, 0),
+    ("Access", str, ""),
+    ("PDOMapping", str, ""),
+    ("PDO index", str, ""),
+    ("PDO name", str, ""),
+    ("PDO type", str, "")]
+
+
+class EntryListFactory(object):
+
+    def __init__(self, entries):
+        self.Entries = entries
+
+    def AddEntry(self, context, *args):
+        index, subindex = map(lambda x: int(x[0]), args[:2])
+        new_entry_infos = {
+            key: translate(arg[0]) if len(arg) > 0 else default
+            for (key, translate, default), arg
+            in zip(ENTRY_INFOS_KEYS, args)}
+
+        if (index, subindex) != (0, 0):
+            entry_infos = self.Entries.get((index, subindex))
+            if entry_infos is not None:
+                for param in ["PDO index", "PDO name", "PDO type"]:
+                    value = new_entry_infos.get(param)
+                    if value is not None:
+                        entry_infos[param] = value
+            else:
+                self.Entries[(index, subindex)] = new_entry_infos
+
+
+entries_list_xslt = etree.parse(
+    os.path.join(ScriptDirectory, "entries_list.xslt"))
+
+cls = EtherCATInfoParser.GetElementClass("DeviceType")
+if cls:
+
+    profile_numbers_xpath = EtherCATInfo_XPath("Profile/ProfileNo")
+
+    def GetProfileNumbers(self):
+        return [number.text for number in profile_numbers_xpath(self)]
+    setattr(cls, "GetProfileNumbers", GetProfileNumbers)
+
+    def getCoE(self):
+        mailbox = self.getMailbox()
+        if mailbox is not None:
+            return mailbox.getCoE()
+        return None
+    setattr(cls, "getCoE", getCoE)
+
+    def GetEntriesList(self, limits=None):
+        entries = {}
+
+        factory = EntryListFactory(entries)
+
+        entries_list_xslt_tree = etree.XSLT(
+            entries_list_xslt, extensions={
+                ("entries_list_ns", "AddEntry"): factory.AddEntry,
+                ("entries_list_ns", "HexDecValue"): HexDecValue,
+                ("entries_list_ns", "EntryName"): EntryName})
+        entries_list_xslt_tree(self, **dict(zip(
+            ["min_index", "max_index"],
+            map(lambda x: etree.XSLT.strparam(str(x)),
+                limits if limits is not None else [0x0000, 0xFFFF])
+            )))
+
+        return entries
+    setattr(cls, "GetEntriesList", GetEntriesList)
+
+    def GetSyncManagers(self):
+        sync_managers = []
+        for sync_manager in self.getSm():
+            sync_manager_infos = {}
+            for name, value in [("Name", sync_manager.getcontent()),
+                                ("Start Address", sync_manager.getStartAddress()),
+                                ("Default Size", sync_manager.getDefaultSize()),
+                                ("Control Byte", sync_manager.getControlByte()),
+                                ("Enable", sync_manager.getEnable())]:
+                if value is None:
+                    value = ""
+                sync_manager_infos[name] = value
+            sync_managers.append(sync_manager_infos)
+        return sync_managers
+    setattr(cls, "GetSyncManagers", GetSyncManagers)
+
+
+def GroupItemCompare(x, y):
+    if x["type"] == y["type"]:
+        if x["type"] == ETHERCAT_GROUP:
+            return cmp(x["order"], y["order"])
+        else:
+            return cmp(x["name"], y["name"])
+    elif x["type"] == ETHERCAT_GROUP:
+        return -1
+    return 1
+
+
+def SortGroupItems(group):
+    for item in group["children"]:
+        if item["type"] == ETHERCAT_GROUP:
+            SortGroupItems(item)
+    group["children"].sort(GroupItemCompare)
+
+
+class ModulesLibrary(object):
+
+    MODULES_EXTRA_PARAMS = [
+        (
+            "pdo_alignment",
+            {
+                "column_label": _("PDO alignment"),
+                "column_size": 150,
+                "default": 8,
+                "description": _("Minimal size in bits between 2 pdo entries")
+            }
+        ),
+        (
+            "max_pdo_size",
+            {
+                "column_label": _("Max entries by PDO"),
+                "column_size": 150,
+                "default": 255,
+                "description": _("""Maximal number of entries mapped in a PDO
+including empty entries used for PDO alignment""")
+            }
+        ),
+        (
+            "add_pdo",
+            {
+                "column_label": _("Creating new PDO"),
+                "column_size": 150,
+                "default": 0,
+                "description": _("""Adding a PDO not defined in default configuration
+for mapping needed location variables
+(1 if possible)""")
+            }
+        )
+    ]
+
+    def __init__(self, path, parent_library=None):
+        self.Path = path
+        if not os.path.exists(self.Path):
+            os.makedirs(self.Path)
+        self.ParentLibrary = parent_library
+
+        if parent_library is not None:
+            self.LoadModules()
+        else:
+            self.Library = None
+        self.LoadModulesExtraParams()
+
+    def GetPath(self):
+        return self.Path
+
+    def GetModulesExtraParamsFilePath(self):
+        return os.path.join(self.Path, "modules_extra_params.cfg")
+
+    groups_xpath = EtherCATInfo_XPath("Descriptions/Groups/Group")
+    devices_xpath = EtherCATInfo_XPath("Descriptions/Devices/Device")
+
+    def LoadModules(self):
+        self.Library = {}
+
+        files = os.listdir(self.Path)
+        for file in files:
+            filepath = os.path.join(self.Path, file)
+            if os.path.isfile(filepath) and os.path.splitext(filepath)[-1] == ".xml":
+                self.modules_infos = None
+
+                xmlfile = open(filepath, 'r')
+                try:
+                    self.modules_infos, error = EtherCATInfoParser.LoadXMLString(xmlfile.read())
+                    if error is not None:
+                        self.GetCTRoot().logger.write_warning(
+                            XSDSchemaErrorMessage % (filepath + error))
+                except Exception as exc:
+                    self.modules_infos, error = None, text(exc)
+                xmlfile.close()
+
+                if self.modules_infos is not None:
+                    vendor = self.modules_infos.getVendor()
+
+                    vendor_category = self.Library.setdefault(
+                        ExtractHexDecValue(vendor.getId()),
+                        {"name": ExtractName(vendor.getName(), _("Miscellaneous")),
+                         "groups": {}})
+
+                    for group in self.groups_xpath(self.modules_infos):
+                        group_type = group.getType()
+
+                        vendor_category["groups"].setdefault(
+                            group_type,
+                            {
+                                "name": ExtractName(group.getName(), group_type),
+                                "parent": group.getParentGroup(),
+                                "order": group.getSortOrder(),
+                                # "value": group.getcontent()["value"],
+                                "devices": [],
+                            })
+
+                    for device in self.devices_xpath(self.modules_infos):
+                        device_group = device.getGroupType()
+                        if device_group not in vendor_category["groups"]:
+                            raise ValueError("Not such group \"%s\"" % device_group)
+                        vendor_category["groups"][device_group]["devices"].append(
+                            (device.getType().getcontent(), device))
+
+                else:
+
+                    self.GetCTRoot().logger.write_error(
+                        _("Couldn't load {a1} XML file:\n{a2}").format(a1=filepath, a2=error))
+
+        return self.Library
+
+    def GetModulesLibrary(self, profile_filter=None):
+        if self.Library is None:
+            self.LoadModules()
+        library = []
+        for vendor_id, vendor in self.Library.iteritems():
+            groups = []
+            children_dict = {}
+            for group_type, group in vendor["groups"].iteritems():
+                group_infos = {"name": group["name"],
+                               "order": group["order"],
+                               "type": ETHERCAT_GROUP,
+                               "infos": None,
+                               "children": children_dict.setdefault(group_type, [])}
+                device_dict = {}
+                for device_type, device in group["devices"]:
+                    if profile_filter is None or profile_filter in device.GetProfileNumbers():
+                        product_code = device.getType().getProductCode()
+                        revision_number = device.getType().getRevisionNo()
+                        module_infos = {"device_type": device_type,
+                                        "vendor": vendor_id,
+                                        "product_code": product_code,
+                                        "revision_number": revision_number}
+                        module_infos.update(self.GetModuleExtraParams(vendor_id, product_code, revision_number))
+                        device_infos = {"name": ExtractName(device.getName()),
+                                        "type": ETHERCAT_DEVICE,
+                                        "infos": module_infos,
+                                        "children": []}
+                        group_infos["children"].append(device_infos)
+                        device_type_occurrences = device_dict.setdefault(device_type, [])
+                        device_type_occurrences.append(device_infos)
+                for device_type_occurrences in device_dict.itervalues():
+                    if len(device_type_occurrences) > 1:
+                        for occurrence in device_type_occurrences:
+                            occurrence["name"] += _(" (rev. %s)") % occurrence["infos"]["revision_number"]
+                if len(group_infos["children"]) > 0:
+                    if group["parent"] is not None:
+                        parent_children = children_dict.setdefault(group["parent"], [])
+                        parent_children.append(group_infos)
+                    else:
+                        groups.append(group_infos)
+            if len(groups) > 0:
+                library.append({"name": vendor["name"],
+                                "type": ETHERCAT_VENDOR,
+                                "infos": None,
+                                "children": groups})
+        library.sort(lambda x, y: cmp(x["name"], y["name"]))
+        return library
+
+    def GetVendors(self):
+        return [(vendor_id, vendor["name"]) for vendor_id, vendor in self.Library.items()]
+
+    def GetModuleInfos(self, module_infos):
+        vendor = ExtractHexDecValue(module_infos["vendor"])
+        vendor_infos = self.Library.get(vendor)
+        if vendor_infos is not None:
+            for _group_name, group_infos in vendor_infos["groups"].iteritems():
+                for device_type, device_infos in group_infos["devices"]:
+                    product_code = ExtractHexDecValue(device_infos.getType().getProductCode())
+                    revision_number = ExtractHexDecValue(device_infos.getType().getRevisionNo())
+                    if product_code == ExtractHexDecValue(module_infos["product_code"]) and \
+                       revision_number == ExtractHexDecValue(module_infos["revision_number"]):
+                        self.cntdevice = device_infos
+                        self.cntdeviceType = device_type
+                        return device_infos, self.GetModuleExtraParams(vendor, product_code, revision_number)
+        return None, None
+
+    def ImportModuleLibrary(self, filepath):
+        if os.path.isfile(filepath):
+            shutil.copy(filepath, self.Path)
+            self.LoadModules()
+            return True
+        return False
+
+    def LoadModulesExtraParams(self):
+        self.ModulesExtraParams = {}
+
+        csvfile_path = self.GetModulesExtraParamsFilePath()
+        if os.path.exists(csvfile_path):
+            csvfile = open(csvfile_path, "rb")
+            sample = csvfile.read(1024)
+            csvfile.seek(0)
+            dialect = csv.Sniffer().sniff(sample)
+            has_header = csv.Sniffer().has_header(sample)
+            reader = csv.reader(csvfile, dialect)
+            for row in reader:
+                if has_header:
+                    has_header = False
+                else:
+                    params_values = {}
+                    for (param, _param_infos), value in zip(
+                            self.MODULES_EXTRA_PARAMS, row[3:]):
+                        if value != "":
+                            params_values[param] = int(value)
+                    self.ModulesExtraParams[
+                        tuple(map(int, row[:3]))] = params_values
+            csvfile.close()
+
+    def SaveModulesExtraParams(self):
+        csvfile = open(self.GetModulesExtraParamsFilePath(), "wb")
+        extra_params = [param for param, _params_infos in self.MODULES_EXTRA_PARAMS]
+        writer = csv.writer(csvfile, delimiter=';')
+        writer.writerow(['Vendor', 'product_code', 'revision_number'] + extra_params)
+        for (vendor, product_code, revision_number), module_extra_params in self.ModulesExtraParams.iteritems():
+            writer.writerow([vendor, product_code, revision_number] +
+                            [module_extra_params.get(param, '')
+                             for param in extra_params])
+        csvfile.close()
+
+    def SetModuleExtraParam(self, vendor, product_code, revision_number, param, value):
+        vendor = ExtractHexDecValue(vendor)
+        product_code = ExtractHexDecValue(product_code)
+        revision_number = ExtractHexDecValue(revision_number)
+
+        module_infos = (vendor, product_code, revision_number)
+        self.ModulesExtraParams.setdefault(module_infos, {})
+        self.ModulesExtraParams[module_infos][param] = value
+
+        self.SaveModulesExtraParams()
+
+    def GetModuleExtraParams(self, vendor, product_code, revision_number):
+        vendor = ExtractHexDecValue(vendor)
+        product_code = ExtractHexDecValue(product_code)
+        revision_number = ExtractHexDecValue(revision_number)
+
+        if self.ParentLibrary is not None:
+            extra_params = self.ParentLibrary.GetModuleExtraParams(vendor, product_code, revision_number)
+        else:
+            extra_params = {}
+
+        extra_params.update(self.ModulesExtraParams.get((vendor, product_code, revision_number), {}))
+
+        for param, param_infos in self.MODULES_EXTRA_PARAMS:
+            extra_params.setdefault(param, param_infos["default"])
+
+        return extra_params
+
+
+USERDATA_DIR = wx.StandardPaths.Get().GetUserDataDir()
+if wx.Platform != '__WXMSW__':
+    USERDATA_DIR += '_files'
+
+ModulesDatabase = ModulesLibrary(
+    os.path.join(USERDATA_DIR, "ethercat_modules"))
+
+
+class RootClass(object):
+
+    CTNChildrenTypes = [("EthercatNode", _EthercatCTN, "Ethercat Master")]
+    EditorType = LibraryEditor
+
+    def __init__(self):
+        self.ModulesLibrary = None
+        self.LoadModulesLibrary()
+
+    def GetIconName(self):
+        return "Ethercat"
+
+    def GetModulesLibraryPath(self, project_path=None):
+        if project_path is None:
+            project_path = self.CTNPath()
+        return os.path.join(project_path, "modules")
+
+    def OnCTNSave(self, from_project_path=None):
+        if from_project_path is not None:
+            shutil.copytree(self.GetModulesLibraryPath(from_project_path),
+                            self.GetModulesLibraryPath())
+        return True
+
+    def CTNGenerate_C(self, buildpath, locations):
+        return [], "", False
+
+    def LoadModulesLibrary(self):
+        if self.ModulesLibrary is None:
+            self.ModulesLibrary = ModulesLibrary(self.GetModulesLibraryPath(), ModulesDatabase)
+        else:
+            self.ModulesLibrary.LoadModulesLibrary()
+
+    def GetModulesDatabaseInstance(self):
+        return ModulesDatabase
+
+    def GetModulesLibraryInstance(self):
+        return self.ModulesLibrary
+
+    def GetModulesLibrary(self, profile_filter=None):
+        return self.ModulesLibrary.GetModulesLibrary(profile_filter)
+
+    def GetVendors(self):
+        return self.ModulesLibrary.GetVendors()
+
+    def GetModuleInfos(self, module_infos):
+        return self.ModulesLibrary.GetModuleInfos(module_infos)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/etherlab_ext.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,56 @@
+/*
+
+Template C code used to produce target Ethercat C code.
+
+Copyright (C) 2011-2014: Laurent BESSARD, Edouard TISSERANT
+
+Distributed under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+See COPYING file for copyrights details.
+
+*/
+
+#include "iec_types_all.h"
+
+#define FREE 0
+#define ACQUIRED 1
+#define ANSWERED 2
+
+long SDOLock = FREE;
+extern long AtomicCompareExchange(long* atomicvar,long compared, long exchange);
+
+int AcquireSDOLock() {
+	return AtomicCompareExchange(&SDOLock, FREE, ACQUIRED) == FREE;
+}
+
+void SDOAnswered() {
+	AtomicCompareExchange(&SDOLock, ACQUIRED, ANSWERED);
+}
+
+int HasAnswer() {
+	return SDOLock == ANSWERED;
+}
+
+void ReleaseSDOLock() {
+	AtomicCompareExchange(&SDOLock, ANSWERED, FREE);
+}
+
+int __init_etherlab_ext()
+{
+    SDOLock = FREE;
+    return 0;
+}
+
+void __cleanup_etherlab_ext()
+{
+}
+
+void __retrieve_etherlab_ext()
+{
+}
+
+void __publish_etherlab_ext()
+{
+}
Binary file etherlab/images/CIA402AxisRef.png has changed
Binary file etherlab/images/CIA402NetPos.png has changed
Binary file etherlab/images/CIA402Slave.png has changed
Binary file etherlab/images/Ethercat.png has changed
Binary file etherlab/images/ImportDatabase.png has changed
Binary file etherlab/images/ImportESI.png has changed
Binary file etherlab/images/ScanNetwork.png has changed
Binary file etherlab/images/Slave.png has changed
Binary file etherlab/images/editCIA402Slave.png has changed
Binary file etherlab/images/editSlave.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/images/genicons.sh	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+INKSCAPE=inkscape
+
+for i in `cat icons.svg |grep -o -e '%%[^%]*%%'|sed 's/%//g'` 
+do
+ if [ $i.png -nt icons.svg ]; then
+ 	echo "Skip $i"
+ else
+	rm  -f $i.png
+	echo "$INKSCAPE" icons.svg -z -e $i.png -i $i
+	"$INKSCAPE" icons.svg -z -e $i.png -i $i
+ fi
+done
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/images/icons.svg	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,64538 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.0"
+   width="744.09448"
+   height="1052.3622"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="icons.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <metadata
+     id="metadata13810">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     inkscape:window-height="1056"
+     inkscape:window-width="1920"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     guidetolerance="10.0"
+     gridtolerance="10000"
+     objecttolerance="10.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     showgrid="false"
+     inkscape:zoom="2.8284272"
+     inkscape:cx="713.91791"
+     inkscape:cy="892.4378"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:current-layer="svg2"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid16717"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="148.96237,952.40201"
+       id="guide16428" />
+  </sodipodi:namedview>
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient2345">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2347" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2349" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient34137">
+      <stop
+         id="stop34139"
+         style="stop-color:#80bd2b;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop34141"
+         style="stop-color:#b1d68e;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4327">
+      <stop
+         id="stop4329"
+         style="stop-color:#0000ff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4331"
+         style="stop-color:#0000ff;stop-opacity:1"
+         offset="0.5" />
+      <stop
+         id="stop4333"
+         style="stop-color:#0000ff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4588">
+      <stop
+         id="stop4590"
+         style="stop-color:#494949;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4592"
+         style="stop-color:#262626;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="19"
+       y1="11"
+       x2="19"
+       y2="23"
+       id="linearGradient4325"
+       xlink:href="#linearGradient4327"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-1,0,0,-1,245.5,70)" />
+    <linearGradient
+       id="linearGradient8662">
+      <stop
+         id="stop8664"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop8666"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1764">
+      <stop
+         id="stop1765"
+         style="stop-color:#e3f9ff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1766"
+         style="stop-color:#8fb6cb;stop-opacity:1"
+         offset="0.36194703" />
+      <stop
+         id="stop1767"
+         style="stop-color:#438ec5;stop-opacity:1"
+         offset="0.62534887" />
+      <stop
+         id="stop1768"
+         style="stop-color:#477daf;stop-opacity:1"
+         offset="0.72607356" />
+      <stop
+         id="stop1769"
+         style="stop-color:#020407;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4215">
+      <stop
+         id="stop4216"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4217"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2689">
+      <stop
+         id="stop2691"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2690"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1971">
+      <stop
+         id="stop1974"
+         style="stop-color:#000000;stop-opacity:0.40784314"
+         offset="0" />
+      <stop
+         id="stop1973"
+         style="stop-color:#000000;stop-opacity:0.07909604"
+         offset="0.6477778" />
+      <stop
+         id="stop1972"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2162">
+      <stop
+         id="stop2164"
+         style="stop-color:#777777;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2166"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2009">
+      <stop
+         id="stop2011"
+         style="stop-color:#e6d500;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2010"
+         style="stop-color:#ffba61;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2006">
+      <stop
+         id="stop2008"
+         style="stop-color:#e6da1e;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2007"
+         style="stop-color:#fff99b;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2002">
+      <stop
+         id="stop2004"
+         style="stop-color:#000000;stop-opacity:0.3137255"
+         offset="0" />
+      <stop
+         id="stop2003"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <defs
+       id="defs1762">
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient1845"
+         xlink:href="#linearGradient2002"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient1305"
+         xlink:href="#linearGradient2009"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient2173"
+         xlink:href="#linearGradient2006"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         id="linearGradient15673">
+        <stop
+           id="stop15674"
+           style="stop-color:#b18e4b;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop15675"
+           style="stop-color:#f7dca0;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient15676">
+        <stop
+           id="stop15677"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop15678"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient1778">
+        <stop
+           id="stop15680"
+           style="stop-color:#000000;stop-opacity:0.14835165"
+           offset="0" />
+        <stop
+           id="stop1780"
+           style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+           offset="0.5" />
+        <stop
+           id="stop1781"
+           style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+           offset="0.75" />
+        <stop
+           id="stop15683"
+           style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+           offset="0.875" />
+        <stop
+           id="stop15684"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient15685">
+        <stop
+           id="stop2187"
+           style="stop-color:#b18e4b;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop1786"
+           style="stop-color:#f7dca0;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="28.814428"
+         y1="-1.616316"
+         x2="47.366039"
+         y2="22.769617"
+         id="linearGradient15688"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.764292,1.3084)" />
+      <linearGradient
+         x1="30.722504"
+         y1="28.135216"
+         x2="39.78149"
+         y2="27.315481"
+         id="linearGradient15689"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.475459,2.103232)" />
+      <linearGradient
+         x1="30.382267"
+         y1="7.5329666"
+         x2="47.366039"
+         y2="22.769617"
+         id="linearGradient15690"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+      <linearGradient
+         x1="25.954844"
+         y1="25.071495"
+         x2="39.781502"
+         y2="27.315489"
+         id="linearGradient15691"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.475459,2.103231)" />
+      <defs
+         id="defs3263">
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient4114"
+           xlink:href="#linearGradient1302"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient4111"
+           xlink:href="#linearGradient1305"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           id="linearGradient3699">
+          <stop
+             id="stop3700"
+             style="stop-color:#e6da1e;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop3701"
+             style="stop-color:#b5ab17;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0.28441054"
+           y1="0.88272494"
+           x2="0.32513002"
+           y2="0.10505857"
+           id="linearGradient2222"
+           xlink:href="#linearGradient4114" />
+        <linearGradient
+           x1="-0.0078431377"
+           y1="-1.244898"
+           x2="0.59607846"
+           y2="0.3605442"
+           id="linearGradient2313"
+           xlink:href="#linearGradient1513" />
+        <linearGradient
+           x1="-0.4509804"
+           y1="-0.15053764"
+           x2="0.47058824"
+           y2="0.36559141"
+           id="linearGradient2314"
+           xlink:href="#linearGradient1513" />
+        <linearGradient
+           x1="0.45882353"
+           y1="1.2772278"
+           x2="0.6901961"
+           y2="-0.2970297"
+           id="linearGradient1516"
+           xlink:href="#linearGradient2122" />
+        <linearGradient
+           x1="-0.18232045"
+           y1="-0.43962848"
+           x2="0.68508285"
+           y2="0.42414862"
+           id="linearGradient2223"
+           xlink:href="#linearGradient1513" />
+        <linearGradient
+           id="linearGradient2122">
+          <stop
+             id="stop2123"
+             style="stop-color:#000000;stop-opacity:0.40784314"
+             offset="0" />
+          <stop
+             id="stop2124"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="1.3783784"
+           y1="0.25386998"
+           x2="0.58378381"
+           y2="0.13003096"
+           id="linearGradient2138"
+           xlink:href="#linearGradient2122" />
+        <linearGradient
+           x1="-0.14213198"
+           y1="-0.28792569"
+           x2="0.49753696"
+           y2="0.35603714"
+           id="linearGradient2224"
+           xlink:href="#linearGradient1513" />
+        <linearGradient
+           x1="0.99512196"
+           y1="0.64396286"
+           x2="0.32682925"
+           y2="0.3003096"
+           id="linearGradient1512"
+           xlink:href="#linearGradient1918" />
+        <linearGradient
+           x1="0.27843139"
+           y1="-0.063694268"
+           x2="0.4509804"
+           y2="0.61146498"
+           id="linearGradient2315"
+           xlink:href="#linearGradient1513" />
+        <linearGradient
+           id="linearGradient2317">
+          <stop
+             id="stop2318"
+             style="stop-color:#d6d6d6;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2322"
+             style="stop-color:#eaeaea;stop-opacity:1"
+             offset="0.25769231" />
+          <stop
+             id="stop2320"
+             style="stop-color:#919191;stop-opacity:1"
+             offset="0.7059449" />
+          <stop
+             id="stop2321"
+             style="stop-color:#d2d2d2;stop-opacity:1"
+             offset="0.73347497" />
+          <stop
+             id="stop2319"
+             style="stop-color:#a6a6a6;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0.47450981"
+           y1="0.21771218"
+           x2="0.80392158"
+           y2="0.5202952"
+           id="linearGradient2316"
+           xlink:href="#linearGradient2317" />
+        <linearGradient
+           id="linearGradient1513">
+          <stop
+             id="stop1514"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop1515"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0.41568628"
+           y1="0.27687296"
+           x2="0.59607846"
+           y2="0.44299674"
+           id="linearGradient2121"
+           xlink:href="#linearGradient1513" />
+        <radialGradient
+           cx="0.5"
+           cy="0.5"
+           r="0.5"
+           fx="0.38431373"
+           fy="0.47619048"
+           id="radialGradient2541"
+           xlink:href="#linearGradient1918" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient1918"
+           xlink:href="#linearGradient1845"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <radialGradient
+           cx="0.5"
+           cy="0.5"
+           r="0.5"
+           fx="0.50588238"
+           fy="0.5"
+           id="radialGradient1502"
+           xlink:href="#linearGradient1918" />
+        <linearGradient
+           x1="0.54355544"
+           y1="1.1365328"
+           x2="0.36095273"
+           y2="0.042242367"
+           id="linearGradient2312"
+           xlink:href="#linearGradient4111" />
+      </defs>
+    </defs>
+    <defs
+       id="defs1239">
+      <linearGradient
+         id="linearGradient1694">
+        <stop
+           id="stop1695"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop1696"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient1683">
+        <stop
+           id="stop1684"
+           style="stop-color:#68db0c;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop1685"
+           style="stop-color:#387606;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="242.39842"
+         y1="1035.3337"
+         x2="242.39842"
+         y2="636.25543"
+         id="linearGradient1686"
+         xlink:href="#linearGradient1683"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.475472,0.677749)" />
+      <linearGradient
+         x1="240.86183"
+         y1="635.74658"
+         x2="240.86183"
+         y2="1038.9441"
+         id="linearGradient1690"
+         xlink:href="#linearGradient1683"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.475472,0.677749)" />
+      <linearGradient
+         x1="244.8598"
+         y1="827.01349"
+         x2="244.8598"
+         y2="646.06177"
+         id="linearGradient1692"
+         xlink:href="#linearGradient1694"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.479463,0.675921)" />
+      <linearGradient
+         x1="242.39842"
+         y1="1035.3337"
+         x2="242.39842"
+         y2="636.25543"
+         id="linearGradient1249"
+         xlink:href="#linearGradient1683"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.475472,0.677749)" />
+      <linearGradient
+         x1="244.8598"
+         y1="827.01349"
+         x2="244.8598"
+         y2="646.06177"
+         id="linearGradient1251"
+         xlink:href="#linearGradient1694"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.479463,0.675921)" />
+    </defs>
+    <defs
+       id="defs3913">
+      <linearGradient
+         id="linearGradient3426">
+        <stop
+           id="stop3428"
+           style="stop-color:#97f1fd;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3430"
+           style="stop-color:#41cdff;stop-opacity:0.70103091"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3316">
+        <stop
+           id="stop3318"
+           style="stop-color:#46b3ff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3324"
+           style="stop-color:#1d72c9;stop-opacity:1"
+           offset="0.02" />
+        <stop
+           id="stop3326"
+           style="stop-color:#64cff4;stop-opacity:1"
+           offset="0.51499999" />
+        <stop
+           id="stop3330"
+           style="stop-color:#65d1f7;stop-opacity:1"
+           offset="0.66750002" />
+        <stop
+           id="stop3328"
+           style="stop-color:#196dc7;stop-opacity:1"
+           offset="0.92000002" />
+        <stop
+           id="stop3320"
+           style="stop-color:#196dc7;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3450">
+        <stop
+           id="stop3452"
+           style="stop-color:#fdfdfd;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3454"
+           style="stop-color:#fdfdfd;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3222">
+        <stop
+           id="stop3224"
+           style="stop-color:#4cb0e7;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3242"
+           style="stop-color:#4cb0e7;stop-opacity:1"
+           offset="0.22999999" />
+        <stop
+           id="stop3230"
+           style="stop-color:#4cb0e7;stop-opacity:0.85416669"
+           offset="0.45999998" />
+        <stop
+           id="stop3232"
+           style="stop-color:#4cb0e7;stop-opacity:0.48627451"
+           offset="0.69" />
+        <stop
+           id="stop3226"
+           style="stop-color:#4cb0e7;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3210">
+        <stop
+           id="stop3212"
+           style="stop-color:#186bc7;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3218"
+           style="stop-color:#186bc7;stop-opacity:1"
+           offset="0.80000001" />
+        <stop
+           id="stop3214"
+           style="stop-color:#1c74cb;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3339">
+        <stop
+           id="stop3341"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3349"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3256">
+        <stop
+           id="stop3258"
+           style="stop-color:#3d9cde;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3260"
+           style="stop-color:#3d9cde;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient3278"
+         xlink:href="#linearGradient2701"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         id="linearGradient4152">
+        <stop
+           id="stop4154"
+           style="stop-color:#452b3b;stop-opacity:0.625"
+           offset="0" />
+        <stop
+           id="stop4162"
+           style="stop-color:#3d2634;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3951">
+        <stop
+           id="stop3952"
+           style="stop-color:#bae965;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3953"
+           style="stop-color:#3ea200;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3954">
+        <stop
+           id="stop3955"
+           style="stop-color:#419eea;stop-opacity:0.17525773"
+           offset="0" />
+        <stop
+           id="stop3956"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="127.20275"
+         y1="204.81982"
+         x2="127.20274"
+         y2="24.505402"
+         id="linearGradient16278"
+         xlink:href="#linearGradient3033"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.01305,0,0,0.991129,-5.931173e-2,-5.288592e-2)" />
+      <linearGradient
+         x1="44.283791"
+         y1="73.288513"
+         x2="82.516937"
+         y2="189.99525"
+         id="linearGradient6845"
+         xlink:href="#linearGradient2361"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.011062,-3.746607e-7,3.665072e-7,0.989059,-27.3395,14.01538)" />
+      <linearGradient
+         x1="127.20275"
+         y1="204.81982"
+         x2="127.20274"
+         y2="24.505402"
+         id="linearGradient2573"
+         xlink:href="#linearGradient3033"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.01305,0,0,0.991129,293.9396,6.667073)" />
+      <linearGradient
+         x1="127.20275"
+         y1="204.81982"
+         x2="127.20274"
+         y2="24.505402"
+         id="linearGradient3961"
+         xlink:href="#linearGradient3033"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.012419,0,0,0.991129,-4.085928e-2,-0.232926)" />
+      <radialGradient
+         cx="85.957253"
+         cy="210.79567"
+         r="37.276581"
+         fx="85.957253"
+         fy="210.79567"
+         id="radialGradient1549"
+         xlink:href="#linearGradient4152"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="571.38983"
+         y1="26.003492"
+         x2="617.64648"
+         y2="26.003492"
+         id="linearGradient1551"
+         xlink:href="#linearGradient3278"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.129252,2.553762e-2,-0.529639,2.680625,77.22195,33.96969)" />
+      <linearGradient
+         x1="219.50113"
+         y1="175.30165"
+         x2="221.50146"
+         y2="167.48764"
+         id="linearGradient1553"
+         xlink:href="#linearGradient3256"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.51649,0.102048,-0.132542,0.670826,77.22195,33.96969)" />
+      <radialGradient
+         cx="87.631248"
+         cy="237.26122"
+         r="43.63213"
+         fx="87.631248"
+         fy="237.26122"
+         id="radialGradient1555"
+         xlink:href="#linearGradient3339"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.588621,0.1163,-0.1163,0.588621,77.22195,33.96969)" />
+      <radialGradient
+         cx="87.397926"
+         cy="211.57301"
+         r="48.997337"
+         fx="87.397926"
+         fy="211.57301"
+         id="radialGradient1557"
+         xlink:href="#linearGradient3210"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="70.037247"
+         y1="164.93237"
+         x2="97.897255"
+         y2="229.45192"
+         id="linearGradient1559"
+         xlink:href="#linearGradient3222"
+         gradientUnits="userSpaceOnUse" />
+      <radialGradient
+         cx="85.957253"
+         cy="210.79567"
+         r="37.276581"
+         fx="85.957253"
+         fy="210.79567"
+         id="radialGradient1561"
+         xlink:href="#linearGradient3222"
+         gradientUnits="userSpaceOnUse" />
+      <radialGradient
+         cx="43.683193"
+         cy="239.96632"
+         r="66.20385"
+         fx="43.683193"
+         fy="239.96632"
+         id="radialGradient1563"
+         xlink:href="#linearGradient3450"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.810027,0.160046,-8.451149e-2,0.427732,77.22195,33.96969)" />
+      <linearGradient
+         x1="163.29898"
+         y1="67.545593"
+         x2="255.82567"
+         y2="67.5457"
+         id="linearGradient1565"
+         xlink:href="#linearGradient3316"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.488869,9.659087e-2,-0.140031,0.708728,77.22791,33.93952)" />
+      <linearGradient
+         x1="191.88382"
+         y1="31.25923"
+         x2="133.69394"
+         y2="30.521313"
+         id="linearGradient1567"
+         xlink:href="#linearGradient3426"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.546073,0.107893,-0.125362,0.634484,77.16253,34.26298)" />
+      <radialGradient
+         cx="85.957253"
+         cy="210.79567"
+         r="37.276581"
+         fx="85.957253"
+         fy="210.79567"
+         id="radialGradient1603"
+         xlink:href="#linearGradient4152"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="571.38983"
+         y1="26.003492"
+         x2="617.64648"
+         y2="26.003492"
+         id="linearGradient1605"
+         xlink:href="#linearGradient3278"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.129252,2.553762e-2,-0.529639,2.680625,77.22195,33.96969)" />
+      <linearGradient
+         x1="219.50113"
+         y1="175.30165"
+         x2="221.50146"
+         y2="167.48764"
+         id="linearGradient1607"
+         xlink:href="#linearGradient3256"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.51649,0.102048,-0.132542,0.670826,77.22195,33.96969)" />
+      <radialGradient
+         cx="87.631248"
+         cy="237.26122"
+         r="43.63213"
+         fx="87.631248"
+         fy="237.26122"
+         id="radialGradient1609"
+         xlink:href="#linearGradient3339"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.588621,0.1163,-0.1163,0.588621,77.22195,33.96969)" />
+      <radialGradient
+         cx="87.397926"
+         cy="211.57301"
+         r="48.997337"
+         fx="87.397926"
+         fy="211.57301"
+         id="radialGradient1611"
+         xlink:href="#linearGradient3210"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="70.037247"
+         y1="164.93237"
+         x2="97.897255"
+         y2="229.45192"
+         id="linearGradient1613"
+         xlink:href="#linearGradient3222"
+         gradientUnits="userSpaceOnUse" />
+      <radialGradient
+         cx="85.957253"
+         cy="210.79567"
+         r="37.276581"
+         fx="85.957253"
+         fy="210.79567"
+         id="radialGradient1615"
+         xlink:href="#linearGradient3222"
+         gradientUnits="userSpaceOnUse" />
+      <radialGradient
+         cx="43.683193"
+         cy="239.96632"
+         r="66.20385"
+         fx="43.683193"
+         fy="239.96632"
+         id="radialGradient1617"
+         xlink:href="#linearGradient3450"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.810027,0.160046,-8.451149e-2,0.427732,77.22195,33.96969)" />
+      <linearGradient
+         x1="163.29898"
+         y1="67.545593"
+         x2="255.82567"
+         y2="67.5457"
+         id="linearGradient1619"
+         xlink:href="#linearGradient3316"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.488869,9.659087e-2,-0.140031,0.708728,77.22791,33.93952)" />
+      <linearGradient
+         x1="191.88382"
+         y1="31.25923"
+         x2="133.69394"
+         y2="30.521313"
+         id="linearGradient1621"
+         xlink:href="#linearGradient3426"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.546073,0.107893,-0.125362,0.634484,77.16253,34.26298)" />
+      <radialGradient
+         cx="85.957253"
+         cy="210.79567"
+         r="37.276581"
+         fx="85.957253"
+         fy="210.79567"
+         id="radialGradient2455"
+         xlink:href="#linearGradient4152"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="571.38983"
+         y1="26.003492"
+         x2="617.64648"
+         y2="26.003492"
+         id="linearGradient2457"
+         xlink:href="#linearGradient3278"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.129252,2.553762e-2,-0.529639,2.680625,77.22195,33.96969)" />
+      <linearGradient
+         x1="219.50113"
+         y1="175.30165"
+         x2="221.50146"
+         y2="167.48764"
+         id="linearGradient2459"
+         xlink:href="#linearGradient3256"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.51649,0.102048,-0.132542,0.670826,77.22195,33.96969)" />
+      <radialGradient
+         cx="87.631248"
+         cy="237.26122"
+         r="43.63213"
+         fx="87.631248"
+         fy="237.26122"
+         id="radialGradient2461"
+         xlink:href="#linearGradient3339"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.588621,0.1163,-0.1163,0.588621,77.22195,33.96969)" />
+      <radialGradient
+         cx="87.397926"
+         cy="211.57301"
+         r="48.997337"
+         fx="87.397926"
+         fy="211.57301"
+         id="radialGradient2463"
+         xlink:href="#linearGradient3210"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="70.037247"
+         y1="164.93237"
+         x2="97.897255"
+         y2="229.45192"
+         id="linearGradient2465"
+         xlink:href="#linearGradient3222"
+         gradientUnits="userSpaceOnUse" />
+      <radialGradient
+         cx="85.957253"
+         cy="210.79567"
+         r="37.276581"
+         fx="85.957253"
+         fy="210.79567"
+         id="radialGradient2467"
+         xlink:href="#linearGradient3222"
+         gradientUnits="userSpaceOnUse" />
+      <radialGradient
+         cx="43.683193"
+         cy="239.96632"
+         r="66.20385"
+         fx="43.683193"
+         fy="239.96632"
+         id="radialGradient2469"
+         xlink:href="#linearGradient3450"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.810027,0.160046,-8.451149e-2,0.427732,77.22195,33.96969)" />
+      <linearGradient
+         x1="163.29898"
+         y1="67.545593"
+         x2="255.82567"
+         y2="67.5457"
+         id="linearGradient2471"
+         xlink:href="#linearGradient3316"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.488869,9.659087e-2,-0.140031,0.708728,77.22791,33.93952)" />
+      <linearGradient
+         x1="191.88382"
+         y1="31.25923"
+         x2="133.69394"
+         y2="30.521313"
+         id="linearGradient2473"
+         xlink:href="#linearGradient3426"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.546073,0.107893,-0.125362,0.634484,77.16253,34.26298)" />
+    </defs>
+    <linearGradient
+       id="linearGradient2701">
+      <stop
+         id="stop2705"
+         style="stop-color:#409fdf;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2704"
+         style="stop-color:#49b8f9;stop-opacity:1"
+         offset="0.29999998" />
+      <stop
+         id="stop2703"
+         style="stop-color:#329be3;stop-opacity:1"
+         offset="0.63" />
+      <stop
+         id="stop2702"
+         style="stop-color:#196dbf;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <defs
+       id="defs6850">
+      <linearGradient
+         id="linearGradient5193">
+        <stop
+           id="stop5195"
+           style="stop-color:#d1bc59;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop20347"
+           style="stop-color:#d1bd59;stop-opacity:1"
+           offset="0.25" />
+        <stop
+           id="stop5197"
+           style="stop-color:#d1bc59;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="819.63959"
+         y1="14.81208"
+         x2="848.96228"
+         y2="14.81208"
+         id="linearGradient2763"
+         xlink:href="#linearGradient5193"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.109617,0,0,0.662256,32.79593,16.28407)" />
+      <linearGradient
+         id="linearGradient5209">
+        <stop
+           id="stop5211"
+           style="stop-color:#f18989;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop5213"
+           style="stop-color:#f18989;stop-opacity:1"
+           offset="0.25" />
+        <stop
+           id="stop5215"
+           style="stop-color:#f18989;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="819.63959"
+         y1="14.81208"
+         x2="848.96228"
+         y2="14.81208"
+         id="linearGradient2761"
+         xlink:href="#linearGradient5209"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.109617,0,0,0.524868,32.79593,0.867834)" />
+      <linearGradient
+         id="linearGradient5155">
+        <stop
+           id="stop5157"
+           style="stop-color:#f3c807;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop5203"
+           style="stop-color:#f3c806;stop-opacity:1"
+           offset="0.25" />
+        <stop
+           id="stop5159"
+           style="stop-color:#f3c807;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="819.63959"
+         y1="14.81208"
+         x2="848.96228"
+         y2="14.81208"
+         id="linearGradient2759"
+         xlink:href="#linearGradient5155"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.109617,0,0,6.644721,32.79593,34.8001)" />
+      <linearGradient
+         id="linearGradient5109">
+        <stop
+           id="stop5111"
+           style="stop-color:#b8a24c;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop5129"
+           style="stop-color:#b8a24c;stop-opacity:1"
+           offset="0.40000001" />
+        <stop
+           id="stop5119"
+           style="stop-color:#ffef9e;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="131.74854"
+         y1="9.0417776"
+         x2="148.30858"
+         y2="9.0417776"
+         id="linearGradient2757"
+         xlink:href="#linearGradient5109"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.927362,0,0,1.552792,0,11.35285)" />
+      <linearGradient
+         id="linearGradient5137">
+        <stop
+           id="stop5139"
+           style="stop-color:#e3ae03;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop5147"
+           style="stop-color:#d6a30d;stop-opacity:1"
+           offset="0.32000002" />
+        <stop
+           id="stop5141"
+           style="stop-color:#edc02a;stop-opacity:1"
+           offset="0.32000002" />
+        <stop
+           id="stop5149"
+           style="stop-color:#f5d842;stop-opacity:1"
+           offset="0.68000007" />
+        <stop
+           id="stop5151"
+           style="stop-color:#fcefa2;stop-opacity:1"
+           offset="0.68000007" />
+        <stop
+           id="stop5143"
+           style="stop-color:#fffcc7;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="131.74854"
+         y1="9.0417776"
+         x2="148.30858"
+         y2="9.0417776"
+         id="linearGradient2755"
+         xlink:href="#linearGradient5137"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.927362,0,0,15.58168,0,-14.80945)" />
+      <linearGradient
+         id="linearGradient5083">
+        <stop
+           id="stop5085"
+           style="stop-color:#df6e6e;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop5097"
+           style="stop-color:#df6e6e;stop-opacity:1"
+           offset="0.36000001" />
+        <stop
+           id="stop5087"
+           style="stop-color:#fbcaca;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="131.74854"
+         y1="9.0417776"
+         x2="148.30858"
+         y2="9.0417776"
+         id="linearGradient2753"
+         xlink:href="#linearGradient5083"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.927362,1.078328)" />
+      <linearGradient
+         id="linearGradient5343">
+        <stop
+           id="stop5345"
+           style="stop-color:#7c7c7c;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop5347"
+           style="stop-color:#f4f4f4;stop-opacity:0.73333335"
+           offset="0.31" />
+        <stop
+           id="stop5349"
+           style="stop-color:#f4f4f4;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="178.51599"
+         y1="199.43317"
+         x2="183.6143"
+         y2="197.06558"
+         id="linearGradient2751"
+         xlink:href="#linearGradient5343"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.794696,0,0,1.766969,-14.69767,-106.0447)" />
+      <linearGradient
+         id="linearGradient5335">
+        <stop
+           id="stop5337"
+           style="stop-color:#2a2418;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop5339"
+           style="stop-color:#1f1e19;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="154.48143"
+         y1="193.61372"
+         x2="164.54382"
+         y2="195.9593"
+         id="linearGradient2749"
+         xlink:href="#linearGradient5335"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.830193,0,0,1.351318,-1.79228,-23.8588)" />
+      <linearGradient
+         id="linearGradient5248">
+        <stop
+           id="stop5250"
+           style="stop-color:#f4e9c8;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop5254"
+           style="stop-color:#f4eac8;stop-opacity:0.73195875"
+           offset="0.31" />
+        <stop
+           id="stop5252"
+           style="stop-color:#f4e9c8;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="178.51599"
+         y1="199.43317"
+         x2="183.6143"
+         y2="197.06558"
+         id="linearGradient2747"
+         xlink:href="#linearGradient5248"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.830193,0,0,1.351318,-21.16717,-23.90756)" />
+      <linearGradient
+         id="linearGradient5230">
+        <stop
+           id="stop5232"
+           style="stop-color:#d1b579;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop5234"
+           style="stop-color:#f4e9c8;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="154.48143"
+         y1="193.61372"
+         x2="164.54382"
+         y2="195.9593"
+         id="linearGradient2745"
+         xlink:href="#linearGradient5230"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.830193,0,0,1.351318,-1.79228,-23.8588)" />
+      <linearGradient
+         id="linearGradient2231">
+        <stop
+           id="stop2233"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop2235"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient2219">
+        <stop
+           id="stop2221"
+           style="stop-color:#000000;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop2223"
+           style="stop-color:#555555;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient2361">
+        <stop
+           id="stop2363"
+           style="stop-color:#15d1ff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop2365"
+           style="stop-color:#1faeff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3033">
+        <stop
+           id="stop3035"
+           style="stop-color:#419eea;stop-opacity:0.17525773"
+           offset="0" />
+        <stop
+           id="stop3037"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="127.20275"
+         y1="204.81982"
+         x2="127.20274"
+         y2="24.505402"
+         id="linearGradient6917"
+         xlink:href="#linearGradient3033"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.01305,0,0,0.991129,-5.9312e-2,-5.288592e-2)" />
+    </defs>
+    <defs
+       id="defs1304">
+      <linearGradient
+         id="linearGradient2068">
+        <stop
+           id="stop2070"
+           style="stop-color:#8a8a8a;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop2069"
+           style="stop-color:#cecece;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient2065"
+         xlink:href="#linearGradient7901"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         id="linearGradient1311">
+        <stop
+           id="stop1312"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop1313"
+           style="stop-color:#fafbff;stop-opacity:1"
+           offset="0.25" />
+        <stop
+           id="stop1314"
+           style="stop-color:#f0f2fa;stop-opacity:1"
+           offset="0.5" />
+        <stop
+           id="stop1315"
+           style="stop-color:#e1e1e1;stop-opacity:1"
+           offset="0.75" />
+        <stop
+           id="stop1316"
+           style="stop-color:#f5f6ff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient1317">
+        <stop
+           id="stop1318"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop1319"
+           style="stop-color:#d0d1d9;stop-opacity:1"
+           offset="0.5" />
+        <stop
+           id="stop1320"
+           style="stop-color:#878b9b;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient1324">
+        <stop
+           id="stop1325"
+           style="stop-color:#e8e8e8;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop1326"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="-191.46153"
+         y1="37.372372"
+         x2="-165.58835"
+         y2="37.372372"
+         id="linearGradient1327"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient1328"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <radialGradient
+         cx="-77.367622"
+         cy="42.633839"
+         r="216.26619"
+         fx="-80.036034"
+         fy="44.468376"
+         id="radialGradient1329"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+      <defs
+         id="defs1330">
+        <linearGradient
+           id="linearGradient1331">
+          <stop
+             id="stop2355"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2356"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient1334">
+          <stop
+             id="stop1335"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop1336"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop1337"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop1338"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop1339"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient1340">
+          <stop
+             id="stop1341"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop1342"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="133.07144"
+           y1="28.231943"
+           x2="118.58411"
+           y2="13.431207"
+           id="linearGradient1343"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+        <linearGradient
+           x1="30.722504"
+           y1="28.135216"
+           x2="39.78149"
+           y2="27.315481"
+           id="linearGradient1344"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103232)" />
+        <radialGradient
+           cx="4.9853168"
+           cy="108.47158"
+           r="34.222183"
+           fx="5.2520976"
+           fy="108.73115"
+           id="radialGradient1345"
+           xlink:href="#linearGradient2877"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="36.826332"
+           y1="75.332558"
+           x2="25.761681"
+           y2="135.90358"
+           id="linearGradient1346"
+           xlink:href="#linearGradient2877"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+        <linearGradient
+           x1="78.675774"
+           y1="47.411823"
+           x2="64.05336"
+           y2="34.302757"
+           id="linearGradient1347"
+           xlink:href="#linearGradient4281"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+        <defs
+           id="defs1348">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient1349"
+             xlink:href="#linearGradient3296"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+        </defs>
+      </defs>
+      <linearGradient
+         x1="88.712402"
+         y1="138.15012"
+         x2="104.81104"
+         y2="151.63045"
+         id="linearGradient1367"
+         xlink:href="#linearGradient3305"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient4561"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient4562"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="88.712402"
+         y1="138.15012"
+         x2="104.81104"
+         y2="151.63045"
+         id="linearGradient4563"
+         xlink:href="#linearGradient3305"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+      <radialGradient
+         cx="-77.367622"
+         cy="42.633839"
+         r="216.26619"
+         fx="-80.036034"
+         fy="44.468376"
+         id="radialGradient4564"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+      <defs
+         id="defs1145">
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient1535"
+           xlink:href="#linearGradient2068"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+      </defs>
+      <defs
+         id="defs1281">
+        <linearGradient
+           id="linearGradient4230">
+          <stop
+             id="stop4231"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop4232"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient1291">
+          <stop
+             id="stop1292"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop1293"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient1432">
+          <stop
+             id="stop1295"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop1296"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop1297"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop1298"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop1299"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient1438"
+           xlink:href="#linearGradient2065"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="133.07144"
+           y1="28.231943"
+           x2="118.58411"
+           y2="13.431207"
+           id="linearGradient1306"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+        <linearGradient
+           x1="28.814428"
+           y1="-1.616316"
+           x2="47.366039"
+           y2="22.769617"
+           id="linearGradient2353"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.764292,1.3084)" />
+        <linearGradient
+           x1="30.722504"
+           y1="28.135216"
+           x2="39.78149"
+           y2="27.315481"
+           id="linearGradient1309"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103232)" />
+        <linearGradient
+           x1="30.382267"
+           y1="7.5329666"
+           x2="47.366039"
+           y2="22.769617"
+           id="linearGradient2360"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+        <linearGradient
+           x1="25.954844"
+           y1="25.071495"
+           x2="39.781502"
+           y2="27.315489"
+           id="linearGradient2368"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103231)" />
+      </defs>
+      <radialGradient
+         cx="23.756607"
+         cy="60.078049"
+         r="21.026033"
+         fx="23.756607"
+         fy="60.078049"
+         id="radialGradient1434"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+      <linearGradient
+         x1="31.82851"
+         y1="61.778381"
+         x2="33.198818"
+         y2="6.859036"
+         id="linearGradient1435"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+      <radialGradient
+         cx="92.478806"
+         cy="20.827066"
+         r="45.889046"
+         fx="92.478806"
+         fy="20.827066"
+         id="radialGradient1436"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+      <linearGradient
+         x1="-99.585236"
+         y1="45.831169"
+         x2="-61.536983"
+         y2="45.831169"
+         id="linearGradient1437"
+         xlink:href="#linearGradient1720"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.511388,1.955462)" />
+      <linearGradient
+         x1="108.49871"
+         y1="17.573528"
+         x2="185.22578"
+         y2="24.330959"
+         id="linearGradient1455"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+    </defs>
+    <linearGradient
+       x1="-94.151642"
+       y1="379.97745"
+       x2="-100.4097"
+       y2="374.03232"
+       id="linearGradient1982"
+       xlink:href="#linearGradient1870"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.088448,0.91874)" />
+    <defs
+       id="defs1132">
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient4873"
+         xlink:href="#linearGradient1863"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient1741"
+         xlink:href="#linearGradient2560"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient1724"
+         xlink:href="#linearGradient1926"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient1716"
+         xlink:href="#linearGradient1302"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         x1="96.346039"
+         y1="84.428337"
+         x2="121.44556"
+         y2="65.093857"
+         id="linearGradient1715"
+         xlink:href="#linearGradient1716"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.962035,0,0,1.039463,0.899729,-0.17995)" />
+      <linearGradient
+         x1="104.09006"
+         y1="83.359146"
+         x2="123.82494"
+         y2="70.956947"
+         id="linearGradient1723"
+         xlink:href="#linearGradient1724"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.028242,0.972534)" />
+      <linearGradient
+         x1="100.76616"
+         y1="77.379333"
+         x2="125.25793"
+         y2="77.379333"
+         id="linearGradient1730"
+         xlink:href="#linearGradient1724"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.028607,0.972188)" />
+      <linearGradient
+         x1="97.345161"
+         y1="112.84396"
+         x2="99.20697"
+         y2="115.81121"
+         id="linearGradient1740"
+         xlink:href="#linearGradient1741"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.206907,0.828564)"
+         spreadMethod="reflect" />
+      <linearGradient
+         x1="168.2516"
+         y1="181.01073"
+         x2="185.96996"
+         y2="172.51707"
+         id="linearGradient4872"
+         xlink:href="#linearGradient4873"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.959874,0,0,1.041804,24.17578,34.86402)" />
+      <linearGradient
+         x1="97.281265"
+         y1="84.255211"
+         x2="127.84677"
+         y2="61.142742"
+         id="linearGradient5507"
+         xlink:href="#linearGradient1716"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.962035,1.039463)" />
+      <linearGradient
+         x1="104.09006"
+         y1="83.359146"
+         x2="123.82494"
+         y2="70.956947"
+         id="linearGradient5523"
+         xlink:href="#linearGradient1724"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.028242,0.972534)" />
+      <linearGradient
+         x1="100.76616"
+         y1="77.379333"
+         x2="125.25793"
+         y2="77.379333"
+         id="linearGradient5524"
+         xlink:href="#linearGradient1724"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.028607,0.972188)" />
+      <linearGradient
+         x1="97.281265"
+         y1="84.255211"
+         x2="127.84677"
+         y2="61.142742"
+         id="linearGradient5525"
+         xlink:href="#linearGradient1716"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.962035,1.039463)" />
+    </defs>
+    <defs
+       id="defs1710">
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient2354"
+         xlink:href="#linearGradient1884"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         id="linearGradient1714">
+        <stop
+           id="stop1715"
+           style="stop-color:#000000;stop-opacity:0.14835165"
+           offset="0" />
+        <stop
+           id="stop1703"
+           style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+           offset="0.5" />
+        <stop
+           id="stop1704"
+           style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+           offset="0.75" />
+        <stop
+           id="stop1705"
+           style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+           offset="0.875" />
+        <stop
+           id="stop1719"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient1720">
+        <stop
+           id="stop1721"
+           style="stop-color:#b18e4b;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop1722"
+           style="stop-color:#f7dca0;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="133.07144"
+         y1="28.231943"
+         x2="118.58411"
+         y2="13.431207"
+         id="linearGradient1726"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+      <linearGradient
+         x1="30.722504"
+         y1="28.135216"
+         x2="39.78149"
+         y2="27.315481"
+         id="linearGradient2358"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.475459,2.103232)" />
+      <radialGradient
+         cx="4.9853168"
+         cy="108.47158"
+         r="34.222183"
+         fx="5.2520976"
+         fy="108.73115"
+         id="radialGradient1160"
+         xlink:href="#linearGradient2877"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+         spreadMethod="pad" />
+      <linearGradient
+         x1="36.826332"
+         y1="75.332558"
+         x2="25.761681"
+         y2="135.90358"
+         id="linearGradient1161"
+         xlink:href="#linearGradient2877"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+      <linearGradient
+         x1="78.675774"
+         y1="47.411823"
+         x2="64.05336"
+         y2="34.302757"
+         id="linearGradient1162"
+         xlink:href="#linearGradient4281"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+      <defs
+         id="defs1095">
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient2877"
+           xlink:href="#linearGradient3296"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           id="linearGradient4281">
+          <stop
+             id="stop4282"
+             style="stop-color:#43b0e2;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop4283"
+             style="stop-color:#43b0e2;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+      </defs>
+    </defs>
+    <linearGradient
+       id="linearGradient1696">
+      <stop
+         id="stop1697"
+         style="stop-color:#e8e8e8;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1698"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1700">
+      <stop
+         id="stop1701"
+         style="stop-color:#b8b8b8;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1702"
+         style="stop-color:#b8b8b8;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3296">
+      <stop
+         id="stop20210"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop20212"
+         style="stop-color:#d0d1d9;stop-opacity:1"
+         offset="0.5" />
+      <stop
+         id="stop20214"
+         style="stop-color:#878b9b;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3305">
+      <stop
+         id="stop3306"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3309"
+         style="stop-color:#fafbff;stop-opacity:1"
+         offset="0.25" />
+      <stop
+         id="stop3307"
+         style="stop-color:#f0f2fa;stop-opacity:1"
+         offset="0.5" />
+      <stop
+         id="stop3310"
+         style="stop-color:#e1e1e1;stop-opacity:1"
+         offset="0.75" />
+      <stop
+         id="stop3308"
+         style="stop-color:#f5f6ff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1302">
+      <stop
+         id="stop1304"
+         style="stop-color:#ffbc96;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1303"
+         style="stop-color:#ffeafe;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1926">
+      <stop
+         id="stop1928"
+         style="stop-color:#ffd7c0;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1927"
+         style="stop-color:#ffbc96;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1930">
+      <stop
+         id="stop1931"
+         style="stop-color:#ff9870;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1932"
+         style="stop-color:#ffd8c9;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2560">
+      <stop
+         id="stop2562"
+         style="stop-color:#868686;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2561"
+         style="stop-color:#e2e2e2;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1863">
+      <stop
+         id="stop1866"
+         style="stop-color:#d88721;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1865"
+         style="stop-color:#a85c00;stop-opacity:1"
+         offset="0.5" />
+      <stop
+         id="stop1864"
+         style="stop-color:#643e0e;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1870">
+      <stop
+         id="stop1871"
+         style="stop-color:#c86f32;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1872"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1884">
+      <stop
+         id="stop1886"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1885"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient7901">
+      <stop
+         id="stop7903"
+         style="stop-color:#b18e4b;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop7902"
+         style="stop-color:#f7dca0;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2780">
+      <stop
+         id="stop2782"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2781"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2774">
+      <stop
+         id="stop2779"
+         style="stop-color:#d6d6d6;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2778"
+         style="stop-color:#eaeaea;stop-opacity:1"
+         offset="0.25769231" />
+      <stop
+         id="stop2777"
+         style="stop-color:#919191;stop-opacity:1"
+         offset="0.7059449" />
+      <stop
+         id="stop2776"
+         style="stop-color:#d2d2d2;stop-opacity:1"
+         offset="0.73347497" />
+      <stop
+         id="stop2775"
+         style="stop-color:#a6a6a6;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2150">
+      <stop
+         id="stop2152"
+         style="stop-color:#ffbc96;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2151"
+         style="stop-color:#ffeafe;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4066">
+      <stop
+         id="stop4068"
+         style="stop-color:#000000;stop-opacity:0.3137255"
+         offset="0" />
+      <stop
+         id="stop4067"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4063">
+      <stop
+         id="stop4065"
+         style="stop-color:#ffffff;stop-opacity:0.74901962"
+         offset="0" />
+      <stop
+         id="stop4064"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <defs
+       id="defs2365">
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient4802"
+         xlink:href="#linearGradient4066"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         id="linearGradient3936">
+        <stop
+           id="stop3938"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3937"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3933">
+        <stop
+           id="stop3935"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop3934"
+           style="stop-color:#7d8787;stop-opacity:0.1451"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3916">
+        <stop
+           id="stop3918"
+           style="stop-color:#000000;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3917"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3913">
+        <stop
+           id="stop3915"
+           style="stop-color:#57575a;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3914"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3703">
+        <stop
+           id="stop3706"
+           style="stop-color:#9db8d2;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3705"
+           style="stop-color:#6988b7;stop-opacity:0.375"
+           offset="0.5" />
+        <stop
+           id="stop3704"
+           style="stop-color:#929395;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3681">
+        <stop
+           id="stop3683"
+           style="stop-color:#2e97af;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3682"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient2021"
+         xlink:href="#linearGradient4063"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         id="linearGradient1395">
+        <stop
+           id="stop1397"
+           style="stop-color:#adc0d2;stop-opacity:0.91764706"
+           offset="0" />
+        <stop
+           id="stop1396"
+           style="stop-color:#4b6983;stop-opacity:0.77319586"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient2394">
+        <stop
+           id="stop2395"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop2396"
+           style="stop-color:#fafbff;stop-opacity:1"
+           offset="0.25" />
+        <stop
+           id="stop2397"
+           style="stop-color:#f0f2fa;stop-opacity:1"
+           offset="0.5" />
+        <stop
+           id="stop2398"
+           style="stop-color:#e1e1e1;stop-opacity:1"
+           offset="0.75" />
+        <stop
+           id="stop2399"
+           style="stop-color:#f5f6ff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient2400">
+        <stop
+           id="stop2401"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop2402"
+           style="stop-color:#d0d1d9;stop-opacity:1"
+           offset="0.5" />
+        <stop
+           id="stop2403"
+           style="stop-color:#878b9b;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient2407">
+        <stop
+           id="stop2408"
+           style="stop-color:#e8e8e8;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop2409"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient2410"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <radialGradient
+         cx="-77.367622"
+         cy="42.633839"
+         r="216.26619"
+         fx="-80.036034"
+         fy="44.468376"
+         id="radialGradient2411"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+      <defs
+         id="defs2412">
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient2413"
+           xlink:href="#linearGradient3936"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           id="linearGradient2414">
+          <stop
+             id="stop2415"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop2416"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop2417"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop2418"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop2419"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient2420">
+          <stop
+             id="stop2421"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2422"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="133.07144"
+           y1="28.231943"
+           x2="118.58411"
+           y2="13.431207"
+           id="linearGradient2423"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+        <linearGradient
+           x1="30.722504"
+           y1="28.135216"
+           x2="39.78149"
+           y2="27.315481"
+           id="linearGradient2424"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103232)" />
+        <radialGradient
+           cx="4.9853168"
+           cy="108.47158"
+           r="34.222183"
+           fx="5.2520976"
+           fy="108.73115"
+           id="radialGradient2425"
+           xlink:href="#linearGradient2877"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="36.826332"
+           y1="75.332558"
+           x2="25.761681"
+           y2="135.90358"
+           id="linearGradient2426"
+           xlink:href="#linearGradient2877"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+        <linearGradient
+           x1="78.675774"
+           y1="47.411823"
+           x2="64.05336"
+           y2="34.302757"
+           id="linearGradient2427"
+           xlink:href="#linearGradient4281"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+        <defs
+           id="defs2428">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient2429"
+             xlink:href="#linearGradient3296"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+        </defs>
+      </defs>
+      <linearGradient
+         x1="88.712402"
+         y1="138.15012"
+         x2="104.81104"
+         y2="151.63045"
+         id="linearGradient2447"
+         xlink:href="#linearGradient3305"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+      <defs
+         id="defs847">
+        <linearGradient
+           id="linearGradient1202">
+          <stop
+             id="stop1203"
+             style="stop-color:#000000;stop-opacity:0.22314049"
+             offset="0" />
+          <stop
+             id="stop1204"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient1443"
+           xlink:href="#linearGradient3703"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient1439"
+           xlink:href="#linearGradient1395"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           id="linearGradient1125">
+          <stop
+             id="stop1126"
+             style="stop-color:#000000;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop1127"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient1045"
+           xlink:href="#linearGradient2021"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           id="linearGradient870">
+          <stop
+             id="stop871"
+             style="stop-color:#83a67f;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop872"
+             style="stop-color:#eaeaea;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient864"
+           xlink:href="#linearGradient3916"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0.47368422"
+           y1="0.1171875"
+           x2="0.59649122"
+           y2="1.21875"
+           id="linearGradient867"
+           xlink:href="#linearGradient1443" />
+        <linearGradient
+           x1="0.63380283"
+           y1="0.11764706"
+           x2="0.62676054"
+           y2="0.74369746"
+           id="linearGradient873"
+           xlink:href="#linearGradient870" />
+        <linearGradient
+           x1="0.56690139"
+           y1="-0.29629636"
+           x2="0.66549295"
+           y2="0.65432096"
+           id="linearGradient1044"
+           xlink:href="#linearGradient1045" />
+        <linearGradient
+           x1="0.78195488"
+           y1="0.3828125"
+           x2="0.57894737"
+           y2="0.609375"
+           id="linearGradient1123"
+           xlink:href="#linearGradient1045" />
+        <linearGradient
+           x1="0.21097578"
+           y1="-1.2339019"
+           x2="1.2504174"
+           y2="-0.10575413"
+           id="linearGradient1124"
+           xlink:href="#linearGradient1125"
+           gradientTransform="scale(1.096129,0.912302)" />
+        <linearGradient
+           x1="-0.21705426"
+           y1="0.5546875"
+           x2="1.5399107"
+           y2="0.5546875"
+           id="linearGradient1388"
+           xlink:href="#linearGradient1125" />
+        <linearGradient
+           x1="0.23239437"
+           y1="-0.2389937"
+           x2="0.62676054"
+           y2="0.8490566"
+           id="linearGradient172616"
+           xlink:href="#linearGradient1045" />
+        <radialGradient
+           cx="0.44718307"
+           cy="0.51748252"
+           r="0.57398623"
+           fx="0.63028163"
+           fy="0.16783214"
+           id="radialGradient1438"
+           xlink:href="#linearGradient1439" />
+        <radialGradient
+           cx="0.46126762"
+           cy="0.5403226"
+           r="0.51062703"
+           fx="0.50704223"
+           fy="0.20025954"
+           id="radialGradient1446"
+           xlink:href="#linearGradient1443" />
+        <linearGradient
+           id="linearGradient1201"
+           xlink:href="#linearGradient1202" />
+      </defs>
+      <linearGradient
+         x1="57.667629"
+         y1="84.017433"
+         x2="60.490723"
+         y2="111.23763"
+         id="linearGradient2085"
+         xlink:href="#linearGradient2021"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.08132,0.924795)" />
+      <linearGradient
+         x1="-2602.7705"
+         y1="6138.4531"
+         x2="9707.4707"
+         y2="6138.2944"
+         id="linearGradient2330"
+         xlink:href="#linearGradient3650"
+         gradientUnits="userSpaceOnUse" />
+      <defs
+         id="defs1129">
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient3655"
+           xlink:href="#linearGradient3933"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient3650"
+           xlink:href="#linearGradient3681"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient3558"
+           xlink:href="#linearGradient3913"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <defs
+           id="defs890">
+          <clipPath
+             id="clip2">
+            <polygon
+               points="17084,18485 16474,17828 15861,17169 15244,16508 14623,15843 13998,15175 13369,14505 12735,13831 12097,13154 11455,12473 10808,11789 10157,11102 9501,10412 9517,10188 9741,9851 10061,9507 10369,9259 10554,9215 11207,9890 11877,10561 12558,11228 13247,11891 13940,12550 14633,13207 15321,13859 16001,14509 16668,15156 17320,15800 17951,16442 18559,17082 18536,17278 18315,17593 17977,17949 17605,18268 17279,18472 17084,18485 "
+               id="polygon892" />
+          </clipPath>
+        </defs>
+        <linearGradient
+           x1="0.22399895"
+           y1="0.42968741"
+           x2="0.41599995"
+           y2="0.24999991"
+           id="linearGradient3561"
+           xlink:href="#linearGradient3558" />
+        <linearGradient
+           x1="0.39199805"
+           y1="0.52343756"
+           x2="0.66400015"
+           y2="0.51562506"
+           id="linearGradient3562"
+           xlink:href="#linearGradient3655" />
+        <linearGradient
+           x1="-0.24806577"
+           y1="0.53907728"
+           x2="0.86046565"
+           y2="0.53906298"
+           id="linearGradient3653"
+           xlink:href="#linearGradient3650" />
+      </defs>
+      <radialGradient
+         cx="41.875938"
+         cy="37.865574"
+         r="12.562782"
+         fx="42.023739"
+         fy="37.865574"
+         id="radialGradient4616"
+         xlink:href="#linearGradient2002"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="520.57166"
+         y1="506.28723"
+         x2="520.57166"
+         y2="466.2785"
+         id="linearGradient4617"
+         xlink:href="#linearGradient1697"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="522.94183"
+         y1="469.49918"
+         x2="522.94183"
+         y2="505.0845"
+         id="linearGradient4618"
+         xlink:href="#linearGradient1697"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="520.57166"
+         y1="506.28723"
+         x2="520.57166"
+         y2="466.2785"
+         id="linearGradient4619"
+         xlink:href="#linearGradient1735"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="44.930588"
+         y1="56.725216"
+         x2="45.511845"
+         y2="185.05675"
+         id="linearGradient4620"
+         xlink:href="#linearGradient1702"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.694118,0,0,0.651906,0,-2.410339)" />
+      <defs
+         id="defs4057">
+        <linearGradient
+           id="linearGradient62849">
+          <stop
+             id="stop62851"
+             style="stop-color:#e6d500;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop62853"
+             style="stop-color:#ffba61;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient62855">
+          <stop
+             id="stop62857"
+             style="stop-color:#e6da1e;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop62859"
+             style="stop-color:#fff99b;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient62861"
+           xlink:href="#linearGradient4802"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           id="linearGradient1735">
+          <stop
+             id="stop1736"
+             style="stop-color:#ccff5f;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop1737"
+             style="stop-color:#69db0e;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient1702">
+          <stop
+             id="stop4071"
+             style="stop-color:#ffffff;stop-opacity:0.69072163"
+             offset="0" />
+          <stop
+             id="stop4072"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient1697">
+          <stop
+             id="stop4074"
+             style="stop-color:#69db0e;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop1699"
+             style="stop-color:#397607;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="520.57166"
+           y1="506.28723"
+           x2="520.57166"
+           y2="466.2785"
+           id="linearGradient4076"
+           xlink:href="#linearGradient1697"
+           gradientUnits="userSpaceOnUse" />
+        <radialGradient
+           cx="522.89532"
+           cy="481.86633"
+           r="15.301119"
+           fx="522.89911"
+           fy="473.03323"
+           id="radialGradient1706"
+           xlink:href="#linearGradient1702"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="522.94183"
+           y1="469.49918"
+           x2="522.94183"
+           y2="505.0845"
+           id="linearGradient1710"
+           xlink:href="#linearGradient1697"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="213.82799"
+           y1="183.48366"
+           x2="214.59154"
+           y2="463.47311"
+           id="linearGradient1717"
+           xlink:href="#linearGradient1702"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+        <linearGradient
+           x1="27.119711"
+           y1="-353.75928"
+           x2="27.018383"
+           y2="-316.47729"
+           id="linearGradient2599"
+           xlink:href="#linearGradient1702"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(2.89873,-0.344979)" />
+        <radialGradient
+           cx="41.875938"
+           cy="37.865574"
+           r="12.562782"
+           fx="42.023739"
+           fy="37.865574"
+           id="radialGradient1882"
+           xlink:href="#linearGradient1845"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="10.68618"
+           y1="22.702703"
+           x2="11.660023"
+           y2="4.1041274"
+           id="linearGradient2601"
+           xlink:href="#linearGradient1302"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.016203,0.984055)" />
+        <linearGradient
+           x1="16.88386"
+           y1="28.772741"
+           x2="12.516754"
+           y2="2.6018224"
+           id="linearGradient2602"
+           xlink:href="#linearGradient1305"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.016203,0.984055)" />
+        <defs
+           id="defs62880">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient62882"
+             xlink:href="#linearGradient2002"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient62884"
+             xlink:href="#linearGradient2009"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient2606"
+             xlink:href="#linearGradient2006"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient2607">
+            <stop
+               id="stop2608"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2609"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient4095"
+             xlink:href="#linearGradient2780"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient62891">
+            <stop
+               id="stop4099"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop62894"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop62896"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop4102"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop4103"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4104">
+            <stop
+               id="stop4105"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop62902"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="28.814428"
+             y1="-1.616316"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient2622"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.764292,1.3084)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient4108"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <linearGradient
+             x1="30.382267"
+             y1="7.5329666"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient2624"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+          <linearGradient
+             x1="25.954844"
+             y1="25.071495"
+             x2="39.781502"
+             y2="27.315489"
+             id="linearGradient2625"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103231)" />
+          <defs
+             id="defs62908">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient62910"
+               xlink:href="#linearGradient1302"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient62912"
+               xlink:href="#linearGradient1305"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient62914">
+              <stop
+                 id="stop62916"
+                 style="stop-color:#e6da1e;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop62918"
+                 style="stop-color:#b5ab17;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0.28441054"
+               y1="0.88272494"
+               x2="0.32513002"
+               y2="0.10505857"
+               id="linearGradient62920"
+               xlink:href="#linearGradient4114" />
+            <linearGradient
+               x1="-0.0078431377"
+               y1="-1.244898"
+               x2="0.59607846"
+               y2="0.3605442"
+               id="linearGradient62922"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="-0.4509804"
+               y1="-0.15053764"
+               x2="0.47058824"
+               y2="0.36559141"
+               id="linearGradient62924"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="0.45882353"
+               y1="1.2772278"
+               x2="0.6901961"
+               y2="-0.2970297"
+               id="linearGradient62926"
+               xlink:href="#linearGradient2122" />
+            <linearGradient
+               x1="-0.18232045"
+               y1="-0.43962848"
+               x2="0.68508285"
+               y2="0.42414862"
+               id="linearGradient62928"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               id="linearGradient62930">
+              <stop
+                 id="stop62932"
+                 style="stop-color:#000000;stop-opacity:0.40784314"
+                 offset="0" />
+              <stop
+                 id="stop62934"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="1.3783784"
+               y1="0.25386998"
+               x2="0.58378381"
+               y2="0.13003096"
+               id="linearGradient62936"
+               xlink:href="#linearGradient2122" />
+            <linearGradient
+               x1="-0.14213198"
+               y1="-0.28792569"
+               x2="0.49753696"
+               y2="0.35603714"
+               id="linearGradient62938"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="0.99512196"
+               y1="0.64396286"
+               x2="0.32682925"
+               y2="0.3003096"
+               id="linearGradient62940"
+               xlink:href="#linearGradient1918" />
+            <linearGradient
+               x1="0.27843139"
+               y1="-0.063694268"
+               x2="0.4509804"
+               y2="0.61146498"
+               id="linearGradient62942"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               id="linearGradient62944">
+              <stop
+                 id="stop62946"
+                 style="stop-color:#d6d6d6;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop62948"
+                 style="stop-color:#eaeaea;stop-opacity:1"
+                 offset="0.25769231" />
+              <stop
+                 id="stop62950"
+                 style="stop-color:#919191;stop-opacity:1"
+                 offset="0.7059449" />
+              <stop
+                 id="stop62952"
+                 style="stop-color:#d2d2d2;stop-opacity:1"
+                 offset="0.73347497" />
+              <stop
+                 id="stop62954"
+                 style="stop-color:#a6a6a6;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0.47450981"
+               y1="0.21771218"
+               x2="0.80392158"
+               y2="0.5202952"
+               id="linearGradient62956"
+               xlink:href="#linearGradient2317" />
+            <linearGradient
+               id="linearGradient62958">
+              <stop
+                 id="stop62960"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop62962"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0.41568628"
+               y1="0.27687296"
+               x2="0.59607846"
+               y2="0.44299674"
+               id="linearGradient62964"
+               xlink:href="#linearGradient1513" />
+            <radialGradient
+               cx="0.5"
+               cy="0.5"
+               r="0.5"
+               fx="0.38431373"
+               fy="0.47619048"
+               id="radialGradient62966"
+               xlink:href="#linearGradient1918" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient62968"
+               xlink:href="#linearGradient1845"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <radialGradient
+               cx="0.5"
+               cy="0.5"
+               r="0.5"
+               fx="0.50588238"
+               fy="0.5"
+               id="radialGradient62970"
+               xlink:href="#linearGradient1918" />
+            <linearGradient
+               x1="0.54355544"
+               y1="1.1365328"
+               x2="0.36095273"
+               y2="0.042242367"
+               id="linearGradient62972"
+               xlink:href="#linearGradient4111" />
+          </defs>
+        </defs>
+      </defs>
+    </defs>
+    <defs
+       id="defs1911">
+      <linearGradient
+         id="linearGradient1912">
+        <stop
+           id="stop1919"
+           style="stop-color:#000000;stop-opacity:0.31638417"
+           offset="0" />
+        <stop
+           id="stop1920"
+           style="stop-color:#000000;stop-opacity:0.07909604"
+           offset="0.5" />
+        <stop
+           id="stop1921"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <radialGradient
+         cx="0.5"
+         cy="0.5"
+         r="0.5"
+         fx="0.21951219"
+         fy="0.25"
+         id="radialGradient1916"
+         xlink:href="#linearGradient1918" />
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient1917"
+         xlink:href="#linearGradient2774"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         id="linearGradient1927">
+        <stop
+           id="stop1929"
+           style="stop-color:#000000;stop-opacity:0.40784314"
+           offset="0" />
+        <stop
+           id="stop1930"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient1931">
+        <stop
+           id="stop1933"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop1934"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient1509">
+        <stop
+           id="stop1510"
+           style="stop-color:#000000;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop1511"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="0.99512196"
+         y1="0.64396286"
+         x2="0.32682925"
+         y2="0.3003096"
+         id="linearGradient1940"
+         xlink:href="#linearGradient1918" />
+      <linearGradient
+         x1="0.21960784"
+         y1="1.8369565"
+         x2="0.49411765"
+         y2="0.17391305"
+         id="linearGradient1941"
+         xlink:href="#linearGradient2122" />
+      <linearGradient
+         x1="-0.0070921984"
+         y1="-0.53947371"
+         x2="0.78823531"
+         y2="0.76666665"
+         id="linearGradient1518"
+         xlink:href="#linearGradient2122" />
+      <linearGradient
+         x1="3.6666667"
+         y1="0.296875"
+         x2="0.25925925"
+         y2="0.375"
+         id="linearGradient1519"
+         xlink:href="#linearGradient1513" />
+      <linearGradient
+         x1="0.71770334"
+         y1="0.140625"
+         x2="0.45933014"
+         y2="0.4765625"
+         id="linearGradient2105"
+         xlink:href="#linearGradient1513" />
+      <linearGradient
+         x1="0.74117649"
+         y1="0.040816326"
+         x2="0.70588237"
+         y2="0.45918366"
+         id="linearGradient2106"
+         xlink:href="#linearGradient1513" />
+      <linearGradient
+         x1="0.41568628"
+         y1="0.27687296"
+         x2="0.59607846"
+         y2="0.44299674"
+         id="linearGradient1946"
+         xlink:href="#linearGradient1513" />
+      <linearGradient
+         x1="1.3783784"
+         y1="0.25386998"
+         x2="0.58378381"
+         y2="0.13003096"
+         id="linearGradient1947"
+         xlink:href="#linearGradient2122" />
+      <linearGradient
+         x1="-0.10588235"
+         y1="-0.10497238"
+         x2="0.58431375"
+         y2="0.55248618"
+         id="linearGradient1948"
+         xlink:href="#linearGradient1513" />
+      <linearGradient
+         x1="-0.25352111"
+         y1="-0.109375"
+         x2="0.67605633"
+         y2="0.4609375"
+         id="linearGradient1949"
+         xlink:href="#linearGradient1513" />
+      <linearGradient
+         x1="-0.14213198"
+         y1="-0.28792569"
+         x2="0.49753696"
+         y2="0.35603714"
+         id="linearGradient1950"
+         xlink:href="#linearGradient1513" />
+      <linearGradient
+         x1="0.45882353"
+         y1="-0.58685446"
+         x2="0.65490198"
+         y2="0.45070422"
+         id="linearGradient1951"
+         xlink:href="#linearGradient1513" />
+      <linearGradient
+         x1="-0.0078431377"
+         y1="-1.244898"
+         x2="0.59607846"
+         y2="0.3605442"
+         id="linearGradient1952"
+         xlink:href="#linearGradient1513" />
+      <linearGradient
+         x1="0.3764706"
+         y1="-0.84042555"
+         x2="0.56078434"
+         y2="0.52127659"
+         id="linearGradient1953"
+         xlink:href="#linearGradient1513" />
+      <linearGradient
+         x1="-0.23645321"
+         y1="-0.5078125"
+         x2="0.36453202"
+         y2="0.6328125"
+         id="linearGradient1954"
+         xlink:href="#linearGradient1513" />
+      <linearGradient
+         x1="0.47450981"
+         y1="0.21771218"
+         x2="0.80392158"
+         y2="0.5202952"
+         id="linearGradient1955"
+         xlink:href="#linearGradient2317" />
+      <linearGradient
+         x1="0.90810812"
+         y1="0.55727553"
+         x2="0.49189189"
+         y2="0.44891641"
+         id="linearGradient2324"
+         xlink:href="#linearGradient2122" />
+      <radialGradient
+         cx="0.5"
+         cy="0.5"
+         r="0.5"
+         fx="0.38431373"
+         fy="0.47619048"
+         id="radialGradient1957"
+         xlink:href="#linearGradient1918" />
+    </defs>
+    <linearGradient
+       x1="106.69141"
+       y1="21.871695"
+       x2="117.74989"
+       y2="32.055485"
+       id="linearGradient2898"
+       xlink:href="#linearGradient1513"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.895098,1.117196)" />
+    <linearGradient
+       id="linearGradient1770">
+      <stop
+         id="stop1771"
+         style="stop-color:#000000;stop-opacity:0.67843139"
+         offset="0" />
+      <stop
+         id="stop1772"
+         style="stop-color:#000000;stop-opacity:0.32941177"
+         offset="0.56999999" />
+      <stop
+         id="stop1773"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1761">
+      <stop
+         id="stop1762"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1763"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1758">
+      <stop
+         id="stop1759"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1760"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1755">
+      <stop
+         id="stop1756"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1757"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1012">
+      <stop
+         id="stop1013"
+         style="stop-color:#000000;stop-opacity:0.30578512"
+         offset="0" />
+      <stop
+         id="stop1014"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient865">
+      <stop
+         id="stop866"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop868"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2871">
+      <stop
+         id="stop2872"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2873"
+         style="stop-color:#000000;stop-opacity:0.73076922"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2678">
+      <stop
+         id="stop2680"
+         style="stop-color:#22282d;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2679"
+         style="stop-color:#3c3e43;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <defs
+       id="defs3503">
+      <linearGradient
+         id="linearGradient172100">
+        <stop
+           id="stop172102"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop172104"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient172106">
+        <stop
+           id="stop172108"
+           style="stop-color:#c86f32;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop172110"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient172112">
+        <stop
+           id="stop172114"
+           style="stop-color:#d88721;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop172116"
+           style="stop-color:#a85c00;stop-opacity:1"
+           offset="0.5" />
+        <stop
+           id="stop172118"
+           style="stop-color:#643e0e;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient172120">
+        <stop
+           id="stop172122"
+           style="stop-color:#868686;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop172124"
+           style="stop-color:#e2e2e2;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient172126">
+        <stop
+           id="stop172128"
+           style="stop-color:#ff9870;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop172130"
+           style="stop-color:#ffd8c9;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient172132">
+        <stop
+           id="stop172134"
+           style="stop-color:#ffd7c0;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop172136"
+           style="stop-color:#ffbc96;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient172138">
+        <stop
+           id="stop172140"
+           style="stop-color:#ffbc96;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop172142"
+           style="stop-color:#ffeafe;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient172144">
+        <stop
+           id="stop172146"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop172148"
+           style="stop-color:#fafbff;stop-opacity:1"
+           offset="0.25" />
+        <stop
+           id="stop172150"
+           style="stop-color:#f0f2fa;stop-opacity:1"
+           offset="0.5" />
+        <stop
+           id="stop172152"
+           style="stop-color:#e1e1e1;stop-opacity:1"
+           offset="0.75" />
+        <stop
+           id="stop172154"
+           style="stop-color:#f5f6ff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient172156"
+         xlink:href="#linearGradient13845"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         id="linearGradient3539">
+        <stop
+           id="stop172159"
+           style="stop-color:#e8e8e8;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop172161"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient1703"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <radialGradient
+         cx="-77.367622"
+         cy="42.633839"
+         r="216.26619"
+         fx="-80.036034"
+         fy="44.468376"
+         id="radialGradient1708"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+      <defs
+         id="defs172165">
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient3546"
+           xlink:href="#linearGradient1884"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           id="linearGradient172168">
+          <stop
+             id="stop172170"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop3549"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop3550"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop3551"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop172175"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient3553">
+          <stop
+             id="stop172178"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop172180"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="133.07144"
+           y1="28.231943"
+           x2="118.58411"
+           y2="13.431207"
+           id="linearGradient172182"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+        <linearGradient
+           x1="30.722504"
+           y1="28.135216"
+           x2="39.78149"
+           y2="27.315481"
+           id="linearGradient3557"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103232)" />
+        <radialGradient
+           cx="4.9853168"
+           cy="108.47158"
+           r="34.222183"
+           fx="5.2520976"
+           fy="108.73115"
+           id="radialGradient172185"
+           xlink:href="#linearGradient2877"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="36.826332"
+           y1="75.332558"
+           x2="25.761681"
+           y2="135.90358"
+           id="linearGradient172187"
+           xlink:href="#linearGradient2877"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+        <linearGradient
+           x1="78.675774"
+           y1="47.411823"
+           x2="64.05336"
+           y2="34.302757"
+           id="linearGradient172189"
+           xlink:href="#linearGradient4281"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+        <defs
+           id="defs172191">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient172193"
+             xlink:href="#linearGradient3296"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+        </defs>
+      </defs>
+      <linearGradient
+         x1="88.712402"
+         y1="138.15012"
+         x2="104.81104"
+         y2="151.63045"
+         id="linearGradient19854"
+         xlink:href="#linearGradient3305"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+      <defs
+         id="defs172208">
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient172210"
+           xlink:href="#linearGradient1863"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient172212"
+           xlink:href="#linearGradient2560"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient172214"
+           xlink:href="#linearGradient1926"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient172216"
+           xlink:href="#linearGradient1302"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="96.346039"
+           y1="84.428337"
+           x2="121.44556"
+           y2="65.093857"
+           id="linearGradient172218"
+           xlink:href="#linearGradient1716"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.962035,0,0,1.039463,0.899729,-0.17995)" />
+        <linearGradient
+           x1="104.09006"
+           y1="83.359146"
+           x2="123.82494"
+           y2="70.956947"
+           id="linearGradient172220"
+           xlink:href="#linearGradient1724"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.028242,0.972534)" />
+        <linearGradient
+           x1="100.76616"
+           y1="77.379333"
+           x2="125.25793"
+           y2="77.379333"
+           id="linearGradient172222"
+           xlink:href="#linearGradient1724"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.028607,0.972188)" />
+        <linearGradient
+           x1="97.345161"
+           y1="112.84396"
+           x2="99.20697"
+           y2="115.81121"
+           id="linearGradient172224"
+           xlink:href="#linearGradient1741"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.206907,0.828564)"
+           spreadMethod="reflect" />
+        <linearGradient
+           x1="168.2516"
+           y1="181.01073"
+           x2="185.96996"
+           y2="172.51707"
+           id="linearGradient172226"
+           xlink:href="#linearGradient4873"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.959874,0,0,1.041804,24.17578,34.86402)" />
+        <linearGradient
+           x1="97.281265"
+           y1="84.255211"
+           x2="127.84677"
+           y2="61.142742"
+           id="linearGradient172228"
+           xlink:href="#linearGradient1716"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.962035,1.039463)" />
+        <linearGradient
+           x1="104.09006"
+           y1="83.359146"
+           x2="123.82494"
+           y2="70.956947"
+           id="linearGradient172230"
+           xlink:href="#linearGradient1724"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.028242,0.972534)" />
+        <linearGradient
+           x1="100.76616"
+           y1="77.379333"
+           x2="125.25793"
+           y2="77.379333"
+           id="linearGradient172232"
+           xlink:href="#linearGradient1724"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.028607,0.972188)" />
+        <linearGradient
+           x1="97.281265"
+           y1="84.255211"
+           x2="127.84677"
+           y2="61.142742"
+           id="linearGradient172234"
+           xlink:href="#linearGradient1716"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.962035,1.039463)" />
+      </defs>
+      <linearGradient
+         x1="104.09006"
+         y1="83.359146"
+         x2="123.82494"
+         y2="70.956947"
+         id="linearGradient2579"
+         xlink:href="#linearGradient1926"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+      <linearGradient
+         x1="100.76616"
+         y1="77.379333"
+         x2="125.25793"
+         y2="77.379333"
+         id="linearGradient2580"
+         xlink:href="#linearGradient1926"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+      <linearGradient
+         x1="10.145814"
+         y1="21.762129"
+         x2="19.678274"
+         y2="15.811033"
+         id="linearGradient2581"
+         xlink:href="#linearGradient1930"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+      <linearGradient
+         x1="226.35037"
+         y1="198.74835"
+         x2="174.43694"
+         y2="217.6319"
+         id="linearGradient2582"
+         xlink:href="#linearGradient1926"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.959874,1.041804)" />
+      <linearGradient
+         x1="97.345161"
+         y1="112.84396"
+         x2="99.20697"
+         y2="115.81121"
+         id="linearGradient2583"
+         xlink:href="#linearGradient2560"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.206907,0.828564)"
+         spreadMethod="reflect" />
+      <linearGradient
+         x1="-94.151642"
+         y1="379.97745"
+         x2="-100.4097"
+         y2="374.03232"
+         id="linearGradient1873"
+         xlink:href="#linearGradient1870"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.088448,0.91874)" />
+      <linearGradient
+         x1="-13.15085"
+         y1="250.48668"
+         x2="-5.590662"
+         y2="258.31036"
+         id="linearGradient1878"
+         xlink:href="#linearGradient2560"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+      <linearGradient
+         x1="240.97612"
+         y1="200.61511"
+         x2="231.89941"
+         y2="205.45764"
+         id="linearGradient1883"
+         xlink:href="#linearGradient1884"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.866855,1.153596)" />
+      <linearGradient
+         x1="7.1050277"
+         y1="221.98289"
+         x2="46.488174"
+         y2="259.94464"
+         id="linearGradient1895"
+         xlink:href="#linearGradient1884"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+      <linearGradient
+         x1="7.1050277"
+         y1="221.98289"
+         x2="46.488174"
+         y2="259.94464"
+         id="linearGradient1897"
+         xlink:href="#linearGradient1884"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+      <linearGradient
+         x1="100.76616"
+         y1="77.379333"
+         x2="125.25793"
+         y2="77.379333"
+         id="linearGradient1937"
+         xlink:href="#linearGradient1926"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+    </defs>
+    <linearGradient
+       id="linearGradient13845">
+      <stop
+         id="stop13848"
+         style="stop-color:#cccccc;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop13888"
+         style="stop-color:#ceced2;stop-opacity:1"
+         offset="0.25" />
+      <stop
+         id="stop13847"
+         style="stop-color:#f5f6ff;stop-opacity:1"
+         offset="0.5" />
+      <stop
+         id="stop13900"
+         style="stop-color:#ceced2;stop-opacity:1"
+         offset="0.75" />
+      <stop
+         id="stop13846"
+         style="stop-color:#cccccc;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="0.50352114"
+       y1="0.22395833"
+       x2="0.77464789"
+       y2="0.54166669"
+       id="linearGradient3527"
+       xlink:href="#linearGradient838" />
+    <linearGradient
+       x1="0.42068964"
+       y1="0.5390625"
+       x2="0.51724136"
+       y2="0.4453125"
+       id="linearGradient3579"
+       xlink:href="#linearGradient850" />
+    <linearGradient
+       id="linearGradient3202">
+      <stop
+         id="stop3204"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3206"
+         style="stop-color:#fff520;stop-opacity:0.89108908"
+         offset="0.5" />
+      <stop
+         id="stop3208"
+         style="stop-color:#fff300;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="741.63898"
+       y1="169.4436"
+       x2="622.33325"
+       y2="287.73825"
+       id="linearGradient2960"
+       xlink:href="#linearGradient1492"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.114127,0,0,-0.125059,-30.07874,78.44512)" />
+    <linearGradient
+       id="linearGradient844">
+      <stop
+         id="stop845"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop848"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="0.71830988"
+       y1="0.0125"
+       x2="0.57394367"
+       y2="0.80000001"
+       id="linearGradient843"
+       xlink:href="#linearGradient844" />
+    <linearGradient
+       id="linearGradient838">
+      <stop
+         id="stop839"
+         style="stop-color:#a5a5a5;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop885"
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0.17875445" />
+      <stop
+         id="stop842"
+         style="stop-color:#656565;stop-opacity:1"
+         offset="0.4831771" />
+      <stop
+         id="stop841"
+         style="stop-color:#d5d5d5;stop-opacity:1"
+         offset="0.61641997" />
+      <stop
+         id="stop840"
+         style="stop-color:#454545;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient850">
+      <stop
+         id="stop851"
+         style="stop-color:#071422;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop853"
+         style="stop-color:#2c528a;stop-opacity:1"
+         offset="0.5" />
+      <stop
+         id="stop854"
+         style="stop-color:#a3bfdf;stop-opacity:1"
+         offset="0.75" />
+      <stop
+         id="stop852"
+         style="stop-color:#59708a;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1492">
+      <stop
+         id="stop1493"
+         style="stop-color:#dadada;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1496"
+         style="stop-color:#f1f1f1;stop-opacity:1"
+         offset="0.34923077" />
+      <stop
+         id="stop1494"
+         style="stop-color:#f0f0f0;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="728.96643"
+       y1="230.07422"
+       x2="351.7063"
+       y2="689.86005"
+       id="linearGradient1495"
+       xlink:href="#linearGradient1492"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.955425,1.046655)" />
+    <linearGradient
+       x1="0.42068964"
+       y1="0.5390625"
+       x2="0.51724136"
+       y2="0.4453125"
+       id="linearGradient1556"
+       xlink:href="#linearGradient850" />
+    <defs
+       id="defs12957">
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient8157"
+         xlink:href="#linearGradient14141"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+    </defs>
+    <defs
+       id="defs1210">
+      <linearGradient
+         id="linearGradient11635">
+        <stop
+           id="stop18744"
+           style="stop-color:#000000;stop-opacity:0.40784314"
+           offset="0" />
+        <stop
+           id="stop18746"
+           style="stop-color:#000000;stop-opacity:0.07909604"
+           offset="0.6477778" />
+        <stop
+           id="stop18748"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient10980">
+        <stop
+           id="stop10982"
+           style="stop-color:#000000;stop-opacity:0.70056498"
+           offset="0" />
+        <stop
+           id="stop10984"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient10986">
+        <stop
+           id="stop10988"
+           style="stop-color:#a4d8f7;stop-opacity:0.19607843"
+           offset="0" />
+        <stop
+           id="stop10990"
+           style="stop-color:#009bf7;stop-opacity:0.19607843"
+           offset="0.43156424" />
+        <stop
+           id="stop10992"
+           style="stop-color:#a4d8f7;stop-opacity:0.19607843"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient11011">
+        <stop
+           id="stop11013"
+           style="stop-color:#b18e4b;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop11015"
+           style="stop-color:#f7dca0;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient1231">
+        <stop
+           id="stop1232"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop1233"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient11020">
+        <stop
+           id="stop1235"
+           style="stop-color:#000000;stop-opacity:0.14835165"
+           offset="0" />
+        <stop
+           id="stop1236"
+           style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+           offset="0.5" />
+        <stop
+           id="stop1237"
+           style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+           offset="0.75" />
+        <stop
+           id="stop1238"
+           style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+           offset="0.875" />
+        <stop
+           id="stop1239"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient11027">
+        <stop
+           id="stop1241"
+           style="stop-color:#b18e4b;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop1242"
+           style="stop-color:#f7dca0;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <radialGradient
+         cx="23.756607"
+         cy="60.078049"
+         r="21.026033"
+         fx="23.756607"
+         fy="60.078049"
+         id="radialGradient11031"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+      <linearGradient
+         x1="31.82851"
+         y1="61.778381"
+         x2="33.198818"
+         y2="6.859036"
+         id="linearGradient11033"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+      <radialGradient
+         cx="92.478806"
+         cy="20.827066"
+         r="45.889046"
+         fx="92.478806"
+         fy="20.827066"
+         id="radialGradient11035"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+      <linearGradient
+         x1="133.07144"
+         y1="28.231943"
+         x2="118.58411"
+         y2="13.431207"
+         id="linearGradient1246"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+      <linearGradient
+         x1="108.49871"
+         y1="17.573528"
+         x2="185.22578"
+         y2="24.330959"
+         id="linearGradient11038"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+      <linearGradient
+         x1="28.814428"
+         y1="-1.616316"
+         x2="47.366039"
+         y2="22.769617"
+         id="linearGradient11040"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.764292,1.3084)" />
+      <linearGradient
+         x1="30.722504"
+         y1="28.135216"
+         x2="39.78149"
+         y2="27.315481"
+         id="linearGradient56811"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.475459,2.103232)" />
+      <linearGradient
+         x1="30.382267"
+         y1="7.5329666"
+         x2="47.366039"
+         y2="22.769617"
+         id="linearGradient11043"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+      <linearGradient
+         x1="25.954844"
+         y1="25.071495"
+         x2="39.781502"
+         y2="27.315489"
+         id="linearGradient11048"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.475459,2.103231)" />
+      <linearGradient
+         x1="1270.3132"
+         y1="4.8765283"
+         x2="1247.6848"
+         y2="0.72310239"
+         id="linearGradient1141"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.196965,0,0,22.09936,-123.6668,57.1888)" />
+      <linearGradient
+         x1="1270.3132"
+         y1="4.8765283"
+         x2="1247.6848"
+         y2="0.72310239"
+         id="linearGradient1142"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.196965,0,0,22.09936,-126.2638,57.1888)" />
+      <linearGradient
+         x1="151.44301"
+         y1="231.81441"
+         x2="-2.9360003"
+         y2="114.13249"
+         id="linearGradient1256"
+         xlink:href="#linearGradient1749"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.378999,0.333133,-0.193756,0.77637,41.54251,-28.91161)" />
+      <radialGradient
+         cx="24.825565"
+         cy="176.56438"
+         r="51.667702"
+         fx="30.802719"
+         fy="141.28563"
+         id="radialGradient1898"
+         xlink:href="#linearGradient1806"
+         gradientUnits="userSpaceOnUse" />
+      <radialGradient
+         cx="24.825565"
+         cy="176.56438"
+         r="51.667702"
+         fx="30.802719"
+         fy="141.28563"
+         id="radialGradient1899"
+         xlink:href="#linearGradient1806"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="99.38131"
+         y1="471.00742"
+         x2="79.887634"
+         y2="7.8479109"
+         id="linearGradient1900"
+         xlink:href="#linearGradient1511"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.207027,0.828482)" />
+      <linearGradient
+         x1="82.739059"
+         y1="10.948872"
+         x2="85.387894"
+         y2="175.15546"
+         id="linearGradient1901"
+         xlink:href="#linearGradient1891"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.270426,0.787138)" />
+      <linearGradient
+         x1="80.178177"
+         y1="-59.385899"
+         x2="64.522659"
+         y2="123.38317"
+         id="linearGradient11057"
+         xlink:href="#linearGradient1895"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.270426,0.787138)" />
+      <linearGradient
+         x1="108.49871"
+         y1="17.573528"
+         x2="185.22578"
+         y2="24.330959"
+         id="linearGradient11059"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+      <defs
+         id="defs11061">
+        <linearGradient
+           id="linearGradient11063">
+          <stop
+             id="stop11065"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop11067"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0.85714287"
+           y1="-0.4609375"
+           x2="0.65517241"
+           y2="0.734375"
+           id="linearGradient11069"
+           xlink:href="#linearGradient1722" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient11071"
+           xlink:href="#linearGradient1895"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0.67729086"
+           y1="-1.1290323"
+           x2="0.50597608"
+           y2="0.87096775"
+           id="linearGradient11073"
+           xlink:href="#linearGradient1518" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient11075"
+           xlink:href="#linearGradient1891"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0.70531398"
+           y1="-0.359375"
+           x2="0.73429954"
+           y2="1.4375"
+           id="linearGradient11077"
+           xlink:href="#linearGradient1544" />
+        <linearGradient
+           id="linearGradient11079">
+          <stop
+             id="stop11081"
+             style="stop-color:#000000;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop11083"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0.7720207"
+           y1="3.7954545"
+           x2="0.60621762"
+           y2="-0.14393939"
+           id="linearGradient11085"
+           xlink:href="#linearGradient1511" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient11087"
+           xlink:href="#linearGradient1971"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <radialGradient
+           cx="0.49032259"
+           cy="0.50649351"
+           r="0.46014288"
+           fx="0.54355401"
+           fy="0.1923077"
+           id="radialGradient11089"
+           xlink:href="#linearGradient1806" />
+      </defs>
+      <defs
+         id="defs1201" />
+      <defs
+         id="defs1248">
+        <linearGradient
+           id="linearGradient11580">
+          <stop
+             id="stop3730"
+             style="stop-color:#648ea9;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop3731"
+             style="stop-color:#81b7da;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient11583">
+          <stop
+             id="stop3726"
+             style="stop-color:#242424;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop3727"
+             style="stop-color:#4e4e4e;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient2540">
+          <stop
+             id="stop2542"
+             style="stop-color:#000000;stop-opacity:0.19791667"
+             offset="0" />
+          <stop
+             id="stop2541"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient1258">
+          <stop
+             id="stop1259"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop11109"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient1261">
+          <stop
+             id="stop1262"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop1263"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient11114">
+          <stop
+             id="stop1265"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop1266"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop11119"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop11122"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop1269"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient1270">
+          <stop
+             id="stop11128"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop11130"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="30.722504"
+           y1="28.135216"
+           x2="39.78149"
+           y2="27.315481"
+           id="linearGradient1273"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103232)" />
+        <defs
+           id="defs11133">
+          <linearGradient
+             id="linearGradient11136">
+            <stop
+               id="stop11138"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11140"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient11142">
+            <stop
+               id="stop11144"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop11146"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop11150"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop11152"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop11155"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient11159">
+            <stop
+               id="stop11161"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11165"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="23.756607"
+             cy="60.078049"
+             r="21.026033"
+             fx="23.756607"
+             fy="60.078049"
+             id="radialGradient11167"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.006281,0.993758)" />
+          <linearGradient
+             x1="31.82851"
+             y1="61.778381"
+             x2="33.198818"
+             y2="6.859036"
+             id="linearGradient11171"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.750054,0,0,1.072718,1.04579,2.663333)" />
+          <radialGradient
+             cx="92.478806"
+             cy="20.827066"
+             r="45.889046"
+             fx="92.478806"
+             fy="20.827066"
+             id="radialGradient11173"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.506767,1.973294)" />
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient11178"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+          <linearGradient
+             x1="108.49871"
+             y1="17.573528"
+             x2="185.22578"
+             y2="24.330959"
+             id="linearGradient11180"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+          <linearGradient
+             x1="28.814428"
+             y1="-1.616316"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient11182"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.764292,1.3084)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient11185"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <linearGradient
+             x1="30.382267"
+             y1="7.5329666"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient11188"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+          <linearGradient
+             x1="25.954844"
+             y1="25.071495"
+             x2="39.781502"
+             y2="27.315489"
+             id="linearGradient11190"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103231)" />
+          <radialGradient
+             cx="4.9853168"
+             cy="108.47158"
+             r="34.222183"
+             fx="5.2520976"
+             fy="108.73115"
+             id="radialGradient1417"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="36.826332"
+             y1="75.332558"
+             x2="25.761681"
+             y2="135.90358"
+             id="linearGradient11193"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+          <linearGradient
+             x1="78.675774"
+             y1="47.411823"
+             x2="64.05336"
+             y2="34.302757"
+             id="linearGradient56893"
+             xlink:href="#linearGradient4281"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+          <defs
+             id="defs1420">
+            <linearGradient
+               id="linearGradient1421">
+              <stop
+                 id="stop11198"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop11200"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop11202"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+          </defs>
+        </defs>
+        <defs
+           id="defs11210">
+          <linearGradient
+             id="linearGradient11212">
+            <stop
+               id="stop11214"
+               style="stop-color:#826647;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11216"
+               style="stop-color:#575147;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0.36627907"
+             y1="0.8125"
+             x2="0.36627907"
+             y2="0.1796875"
+             id="linearGradient11218"
+             xlink:href="#linearGradient1136"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="-0.109375"
+             y1="0.9140625"
+             x2="1.15625"
+             y2="0.1796875"
+             id="linearGradient11220"
+             xlink:href="#linearGradient1136" />
+        </defs>
+        <linearGradient
+           x1="179.83598"
+           y1="178.66379"
+           x2="200.25706"
+           y2="302.00961"
+           id="linearGradient1303"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.030776,0.970143)" />
+        <linearGradient
+           x1="181.35893"
+           y1="177.20132"
+           x2="202.65994"
+           y2="305.862"
+           id="linearGradient11226"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.026679,0.974015)" />
+        <linearGradient
+           x1="182.83167"
+           y1="175.80452"
+           x2="205.01575"
+           y2="309.7991"
+           id="linearGradient56914"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.022962,0.977554)" />
+        <linearGradient
+           x1="177.86378"
+           y1="181.4277"
+           x2="197.19272"
+           y2="298.17694"
+           id="linearGradient1307"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.036891,0.964422)" />
+        <linearGradient
+           x1="55.601124"
+           y1="-30.810305"
+           x2="40.876816"
+           y2="218.58856"
+           id="linearGradient1308"
+           xlink:href="#linearGradient1454"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.082134,0.9241)" />
+        <linearGradient
+           x1="64.116882"
+           y1="47.803505"
+           x2="37.547989"
+           y2="140.37704"
+           id="linearGradient56918"
+           xlink:href="#linearGradient1546"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.329487,0.75217)" />
+        <linearGradient
+           x1="83.123482"
+           y1="92.632271"
+           x2="77.120087"
+           y2="56.941833"
+           id="linearGradient1310"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.162115,0.8605)" />
+        <linearGradient
+           x1="48.88829"
+           y1="90.157753"
+           x2="99.629562"
+           y2="86.570915"
+           id="linearGradient56921"
+           xlink:href="#linearGradient1461"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.162115,0.8605)" />
+        <linearGradient
+           x1="57.724483"
+           y1="184.34286"
+           x2="55.957409"
+           y2="144.17274"
+           id="linearGradient1312"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.636328,0.611124)" />
+        <linearGradient
+           x1="55.045113"
+           y1="85.877014"
+           x2="109.27901"
+           y2="88.11335"
+           id="linearGradient1313"
+           xlink:href="#linearGradient1461"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.162536,0.860189)" />
+        <linearGradient
+           x1="66.679367"
+           y1="28.158081"
+           x2="66.679367"
+           y2="107.53253"
+           id="linearGradient1314"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.1618,0.860733)" />
+        <linearGradient
+           x1="47.242912"
+           y1="77.450203"
+           x2="109.62949"
+           y2="76.102692"
+           id="linearGradient1315"
+           xlink:href="#linearGradient1461"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.1618,0.860733)" />
+        <linearGradient
+           x1="71.901497"
+           y1="69.209007"
+           x2="85.293274"
+           y2="102.17883"
+           id="linearGradient1316"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.179599,0.847746)" />
+        <linearGradient
+           x1="55.239422"
+           y1="97.356407"
+           x2="25.40143"
+           y2="29.790384"
+           id="linearGradient56928"
+           xlink:href="#linearGradient1461"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.942585,1.060912)" />
+        <linearGradient
+           x1="53.647789"
+           y1="101.89593"
+           x2="53.647789"
+           y2="160.91232"
+           id="linearGradient1318"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.289244,0.775649)" />
+        <linearGradient
+           x1="69.363586"
+           y1="56.763401"
+           x2="71.684402"
+           y2="101.294"
+           id="linearGradient1319"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.20398,0.830579)" />
+        <linearGradient
+           x1="28.813946"
+           y1="221.79578"
+           x2="10.582993"
+           y2="235.65099"
+           id="linearGradient1320"
+           xlink:href="#linearGradient1551"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.709409,0.584998)" />
+        <radialGradient
+           cx="24.825565"
+           cy="176.56438"
+           r="42.859913"
+           fx="40.974991"
+           fy="162.11137"
+           id="radialGradient11243"
+           xlink:href="#linearGradient1806"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="693.25439"
+           y1="697.24719"
+           x2="657.74762"
+           y2="677.27399"
+           id="linearGradient11245"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.983783,1.016484)" />
+        <linearGradient
+           x1="681.34058"
+           y1="728.7738"
+           x2="641.37305"
+           y2="705.9129"
+           id="linearGradient11247"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.986777,1.0134)" />
+        <linearGradient
+           x1="649.57269"
+           y1="677.24323"
+           x2="630.47528"
+           y2="668.91809"
+           id="linearGradient11249"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988806,1.011321)" />
+        <linearGradient
+           x1="647.99902"
+           y1="693.73279"
+           x2="629.89734"
+           y2="683.8114"
+           id="linearGradient11251"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.975718,1.024886)" />
+        <linearGradient
+           x1="538.89514"
+           y1="277.2775"
+           x2="575.11407"
+           y2="342.66919"
+           id="linearGradient11253"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.998206,1.001797)" />
+        <linearGradient
+           x1="509.06769"
+           y1="327.76361"
+           x2="544.86011"
+           y2="399.38104"
+           id="linearGradient11255"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.972249,1.028543)" />
+        <linearGradient
+           x1="591.27606"
+           y1="330.16998"
+           x2="620.33301"
+           y2="382.54678"
+           id="linearGradient11257"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.044357,0.957527)" />
+        <linearGradient
+           x1="566.74347"
+           y1="415.15009"
+           x2="588.13922"
+           y2="458.04449"
+           id="linearGradient11259"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.03551,0.965707)" />
+        <defs
+           id="defs11261">
+          <linearGradient
+             x1="0.25179857"
+             y1="-0.0390625"
+             x2="0.53237408"
+             y2="0.5234375"
+             id="linearGradient11263"
+             xlink:href="#linearGradient4215" />
+          <linearGradient
+             x1="0.092198581"
+             y1="-0.2109375"
+             x2="0.4822695"
+             y2="0.4921875"
+             id="linearGradient11265"
+             xlink:href="#linearGradient4215" />
+          <linearGradient
+             x1="0.016528925"
+             y1="-0.4921875"
+             x2="0.51239669"
+             y2="0.5"
+             id="linearGradient11267"
+             xlink:href="#linearGradient4215" />
+          <linearGradient
+             x1="0.05511811"
+             y1="-0.3046875"
+             x2="0.53543305"
+             y2="0.5625"
+             id="linearGradient11269"
+             xlink:href="#linearGradient4215" />
+          <linearGradient
+             x1="1.2125034"
+             y1="0.78833276"
+             x2="0.5859077"
+             y2="0.44490069"
+             id="linearGradient11271"
+             xlink:href="#linearGradient4215"
+             gradientTransform="scale(0.999075,1.000926)" />
+          <linearGradient
+             id="linearGradient11273">
+            <stop
+               id="stop11275"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11277"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="1.1610887"
+             y1="0.61942029"
+             x2="0.47761098"
+             y2="0.3214713"
+             id="linearGradient11279"
+             xlink:href="#linearGradient4215"
+             gradientTransform="scale(1.003618,0.996395)" />
+          <linearGradient
+             x1="1.8455285"
+             y1="1.34375"
+             x2="0.47967479"
+             y2="0.5625"
+             id="linearGradient11281"
+             xlink:href="#linearGradient4021" />
+          <linearGradient
+             id="linearGradient11283">
+            <stop
+               id="stop11285"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11287"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="1.7519705"
+             y1="1.0528145"
+             x2="0.54093099"
+             y2="0.37158158"
+             id="linearGradient11290"
+             xlink:href="#linearGradient4021"
+             gradientTransform="scale(0.990884,1.0092)" />
+          <linearGradient
+             x1="0.24528302"
+             y1="1.6015625"
+             x2="0.28301886"
+             y2="-0.0234375"
+             id="linearGradient11292"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.89719623"
+             y1="-0.1484375"
+             x2="0.40186915"
+             y2="0.5546875"
+             id="linearGradient11294"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.90588236"
+             y1="-0.2734375"
+             x2="0.36470589"
+             y2="0.5078125"
+             id="linearGradient11296"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.56809336"
+             y1="-0.125"
+             x2="0.49027237"
+             y2="0.59375"
+             id="linearGradient11299"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="1.4128441"
+             y1="1.25"
+             x2="0.42201835"
+             y2="0.4140625"
+             id="linearGradient11302"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.084848486"
+             y1="1.1640625"
+             x2="0.53333336"
+             y2="0.359375"
+             id="linearGradient11304"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.76190478"
+             y1="-0.53125"
+             x2="0.6857143"
+             y2="0.5390625"
+             id="linearGradient11306"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             id="linearGradient11308">
+            <stop
+               id="stop11310"
+               style="stop-color:#ffffff;stop-opacity:0.83615822"
+               offset="0" />
+            <stop
+               id="stop11312"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="2.2054794"
+             y1="2.03125"
+             x2="0.56164384"
+             y2="-0.28125"
+             id="linearGradient11314"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.88832486"
+             y1="1.0390625"
+             x2="0.55837566"
+             y2="0.3046875"
+             id="linearGradient11316"
+             xlink:href="#linearGradient1806" />
+          <linearGradient
+             x1="0.85217392"
+             y1="0.9609375"
+             x2="0.86086959"
+             y2="0.296875"
+             id="linearGradient11318"
+             xlink:href="#linearGradient1806" />
+          <linearGradient
+             x1="0.064220183"
+             y1="1.4375"
+             x2="0.22018349"
+             y2="0.3125"
+             id="linearGradient11320"
+             xlink:href="#linearGradient3970" />
+          <linearGradient
+             id="linearGradient11322">
+            <stop
+               id="stop11324"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11333"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="1.1011236"
+             y1="0.7421875"
+             x2="0.033707865"
+             y2="0.5703125"
+             id="linearGradient11335"
+             xlink:href="#linearGradient3970" />
+          <linearGradient
+             id="linearGradient11337">
+            <stop
+               id="stop11339"
+               style="stop-color:#000000;stop-opacity:0.2937853"
+               offset="0" />
+            <stop
+               id="stop11341"
+               style="stop-color:#000000;stop-opacity:0.06214689"
+               offset="0.6477778" />
+            <stop
+               id="stop11343"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="0.49032259"
+             cy="0.50649351"
+             r="0.38170236"
+             fx="0.63414633"
+             fy="0.37777779"
+             id="radialGradient11345"
+             xlink:href="#linearGradient1806" />
+        </defs>
+        <linearGradient
+           x1="-191.46153"
+           y1="37.372372"
+           x2="-165.58835"
+           y2="37.372372"
+           id="linearGradient11352"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+        <defs
+           id="defs11354">
+          <linearGradient
+             id="linearGradient1560">
+            <stop
+               id="stop1561"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop1562"
+               style="stop-color:#fafbff;stop-opacity:1"
+               offset="0.25" />
+            <stop
+               id="stop1563"
+               style="stop-color:#f0f2fa;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop1564"
+               style="stop-color:#e1e1e1;stop-opacity:1"
+               offset="0.75" />
+            <stop
+               id="stop1565"
+               style="stop-color:#f5f6ff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient1566">
+            <stop
+               id="stop1567"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop1568"
+               style="stop-color:#d0d1d9;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop1569"
+               style="stop-color:#878b9b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient1570">
+            <stop
+               id="stop11367"
+               style="stop-color:#e8e8e8;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11371"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient1573"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient1574"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <defs
+             id="defs1575">
+            <linearGradient
+               id="linearGradient1576">
+              <stop
+                 id="stop1577"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1578"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient11379">
+              <stop
+                 id="stop11381"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop11383"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop11386"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop11388"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop1584"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1464">
+              <stop
+                 id="stop1586"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1587"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient57012"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient11395"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient11397"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient11399"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient11401"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs11403">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient11405"
+                 xlink:href="#linearGradient3296"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+            </defs>
+          </defs>
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient1609"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        </defs>
+        <linearGradient
+           x1="226.34392"
+           y1="866.83282"
+           x2="109.99118"
+           y2="627.57227"
+           id="linearGradient11418"
+           xlink:href="#linearGradient845"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.015083,0.985142)" />
+        <linearGradient
+           x1="405.49411"
+           y1="241.15977"
+           x2="405.49411"
+           y2="748.58954"
+           id="linearGradient11420"
+           xlink:href="#linearGradient850"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.961036,1.040544)" />
+        <linearGradient
+           x1="911.58417"
+           y1="626.5332"
+           x2="911.58417"
+           y2="471.98822"
+           id="linearGradient11422"
+           xlink:href="#linearGradient865"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.250806,0.799484)" />
+        <linearGradient
+           x1="275.91269"
+           y1="240.36499"
+           x2="337.76599"
+           y2="385.1778"
+           id="linearGradient11425"
+           xlink:href="#linearGradient845"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.214317,0.823508)" />
+        <linearGradient
+           x1="250.2383"
+           y1="350.13974"
+           x2="250.2383"
+           y2="280.09955"
+           id="linearGradient11427"
+           xlink:href="#linearGradient860"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.349063,0.741255)" />
+        <linearGradient
+           x1="309.547"
+           y1="292.84094"
+           x2="309.547"
+           y2="127.49744"
+           id="linearGradient11429"
+           xlink:href="#linearGradient860"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.194349,0.837276)" />
+        <linearGradient
+           x1="911.58417"
+           y1="626.5332"
+           x2="911.58417"
+           y2="471.98822"
+           id="linearGradient11431"
+           xlink:href="#linearGradient865"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.250806,0.799484)" />
+        <linearGradient
+           x1="517.80023"
+           y1="832.91492"
+           x2="742.3476"
+           y2="628.79071"
+           id="linearGradient11433"
+           xlink:href="#linearGradient845"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.975706,1.024899)" />
+        <linearGradient
+           x1="309.547"
+           y1="292.84094"
+           x2="309.547"
+           y2="127.49744"
+           id="linearGradient11435"
+           xlink:href="#linearGradient860"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.194349,0.837276)" />
+        <linearGradient
+           x1="309.547"
+           y1="292.84094"
+           x2="309.547"
+           y2="127.49744"
+           id="linearGradient11437"
+           xlink:href="#linearGradient860"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.194349,0.837276)" />
+        <linearGradient
+           x1="736.18683"
+           y1="646.92255"
+           x2="736.18683"
+           y2="478.88864"
+           id="linearGradient11439"
+           xlink:href="#linearGradient860"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.762621,1.311267)" />
+        <linearGradient
+           x1="184.0434"
+           y1="838.54852"
+           x2="142.93327"
+           y2="642.70612"
+           id="linearGradient11441"
+           xlink:href="#linearGradient860"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.026717,0.973979)" />
+        <linearGradient
+           x1="472.38922"
+           y1="807.86877"
+           x2="472.10596"
+           y2="746.31073"
+           id="linearGradient11444"
+           xlink:href="#linearGradient865"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.249987,0.800008)" />
+        <linearGradient
+           x1="254.96887"
+           y1="629.17017"
+           x2="277.04468"
+           y2="579.98926"
+           id="linearGradient11446"
+           xlink:href="#linearGradient865"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.892795,1.120079)" />
+        <linearGradient
+           x1="84.960785"
+           y1="92.151367"
+           x2="42.64373"
+           y2="53.360722"
+           id="linearGradient11448"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.321949,0.756459)" />
+        <linearGradient
+           x1="109.15074"
+           y1="2.1610787"
+           x2="134.0733"
+           y2="60.510494"
+           id="linearGradient11450"
+           xlink:href="#linearGradient845"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.835421,1.197001)" />
+        <linearGradient
+           x1="186.07457"
+           y1="23.533224"
+           x2="202.6377"
+           y2="23.47304"
+           id="linearGradient11454"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.388045,2.57702)" />
+        <linearGradient
+           x1="92.631454"
+           y1="54.989693"
+           x2="92.631454"
+           y2="50.608093"
+           id="linearGradient11456"
+           xlink:href="#linearGradient1757"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.787838,1.269296)" />
+        <radialGradient
+           cx="24.825565"
+           cy="176.56438"
+           r="42.859913"
+           fx="40.974991"
+           fy="162.11137"
+           id="radialGradient11458"
+           xlink:href="#linearGradient1806"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="693.25439"
+           y1="697.24719"
+           x2="657.74762"
+           y2="677.27399"
+           id="linearGradient1515"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.983783,1.016484)" />
+        <linearGradient
+           x1="681.34058"
+           y1="728.7738"
+           x2="641.37305"
+           y2="705.9129"
+           id="linearGradient11461"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.986777,1.0134)" />
+        <linearGradient
+           x1="649.57269"
+           y1="677.24323"
+           x2="630.47528"
+           y2="668.91809"
+           id="linearGradient11463"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988806,1.011321)" />
+        <linearGradient
+           x1="647.99902"
+           y1="693.73279"
+           x2="629.89734"
+           y2="683.8114"
+           id="linearGradient11465"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.975718,1.024886)" />
+        <linearGradient
+           x1="538.89514"
+           y1="277.2775"
+           x2="575.11407"
+           y2="342.66919"
+           id="linearGradient11467"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.998206,1.001797)" />
+        <linearGradient
+           x1="509.06769"
+           y1="327.76361"
+           x2="544.86011"
+           y2="399.38104"
+           id="linearGradient11469"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.972249,1.028543)" />
+        <linearGradient
+           x1="591.27606"
+           y1="330.16998"
+           x2="620.33301"
+           y2="382.54678"
+           id="linearGradient11471"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.044357,0.957527)" />
+        <linearGradient
+           x1="566.74347"
+           y1="415.15009"
+           x2="588.13922"
+           y2="458.04449"
+           id="linearGradient11473"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.03551,0.965707)" />
+        <linearGradient
+           x1="133.07144"
+           y1="28.231943"
+           x2="118.58411"
+           y2="13.431207"
+           id="linearGradient1523"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+        <linearGradient
+           x1="1270.3132"
+           y1="4.8765283"
+           x2="1247.6848"
+           y2="0.72310239"
+           id="linearGradient11476"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(9.440723e-2,10.59241)" />
+        <linearGradient
+           x1="1270.3132"
+           y1="4.8765283"
+           x2="1247.6848"
+           y2="0.72310239"
+           id="linearGradient11478"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+        <defs
+           id="defs11480">
+          <linearGradient
+             id="linearGradient11482">
+            <stop
+               id="stop11484"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11486"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient11488">
+            <stop
+               id="stop11490"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11492"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient11494">
+            <stop
+               id="stop11496"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop11498"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop11500"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop11502"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop11504"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient11506">
+            <stop
+               id="stop11508"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11510"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="23.756607"
+             cy="60.078049"
+             r="21.026033"
+             fx="23.756607"
+             fy="60.078049"
+             id="radialGradient1545"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+          <linearGradient
+             x1="31.82851"
+             y1="61.778381"
+             x2="33.198818"
+             y2="6.859036"
+             id="linearGradient1546"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+          <radialGradient
+             cx="92.478806"
+             cy="20.827066"
+             r="45.889046"
+             fx="92.478806"
+             fy="20.827066"
+             id="radialGradient1547"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient11518"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+          <linearGradient
+             x1="28.814428"
+             y1="-1.616316"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient1550"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.764292,1.3084)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient11522"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <linearGradient
+             x1="30.382267"
+             y1="7.5329666"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient1552"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+          <linearGradient
+             x1="25.954844"
+             y1="25.071495"
+             x2="39.781502"
+             y2="27.315489"
+             id="linearGradient57081"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103231)" />
+          <linearGradient
+             x1="31.82851"
+             y1="61.778381"
+             x2="33.198818"
+             y2="6.859036"
+             id="linearGradient1554"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+          <radialGradient
+             cx="24.825565"
+             cy="176.56438"
+             r="42.859913"
+             fx="40.974991"
+             fy="162.11137"
+             id="radialGradient11527"
+             xlink:href="#linearGradient1806"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="693.25439"
+             y1="697.24719"
+             x2="657.74762"
+             y2="677.27399"
+             id="linearGradient1674"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.983783,1.016484)" />
+          <linearGradient
+             x1="681.34058"
+             y1="728.7738"
+             x2="641.37305"
+             y2="705.9129"
+             id="linearGradient11531"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.986777,1.0134)" />
+          <linearGradient
+             x1="649.57269"
+             y1="677.24323"
+             x2="630.47528"
+             y2="668.91809"
+             id="linearGradient11534"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988806,1.011321)" />
+          <linearGradient
+             x1="647.99902"
+             y1="693.73279"
+             x2="629.89734"
+             y2="683.8114"
+             id="linearGradient11537"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.975718,1.024886)" />
+          <linearGradient
+             x1="538.89514"
+             y1="277.2775"
+             x2="575.11407"
+             y2="342.66919"
+             id="linearGradient11540"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.998206,1.001797)" />
+          <linearGradient
+             x1="509.06769"
+             y1="327.76361"
+             x2="544.86011"
+             y2="399.38104"
+             id="linearGradient11543"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.972249,1.028543)" />
+          <linearGradient
+             x1="591.27606"
+             y1="330.16998"
+             x2="620.33301"
+             y2="382.54678"
+             id="linearGradient1680"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.044357,0.957527)" />
+          <linearGradient
+             x1="566.74347"
+             y1="415.15009"
+             x2="588.13922"
+             y2="458.04449"
+             id="linearGradient11546"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.03551,0.965707)" />
+          <defs
+             id="defs11548">
+            <linearGradient
+               x1="0.25179857"
+               y1="-0.0390625"
+               x2="0.53237408"
+               y2="0.5234375"
+               id="linearGradient11550"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="0.092198581"
+               y1="-0.2109375"
+               x2="0.4822695"
+               y2="0.4921875"
+               id="linearGradient11552"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="0.016528925"
+               y1="-0.4921875"
+               x2="0.51239669"
+               y2="0.5"
+               id="linearGradient11554"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="0.05511811"
+               y1="-0.3046875"
+               x2="0.53543305"
+               y2="0.5625"
+               id="linearGradient11556"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="1.2125034"
+               y1="0.78833276"
+               x2="0.5859077"
+               y2="0.44490069"
+               id="linearGradient11559"
+               xlink:href="#linearGradient4215"
+               gradientTransform="scale(0.999075,1.000926)" />
+            <linearGradient
+               id="linearGradient11562">
+              <stop
+                 id="stop11564"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop11566"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="1.1610887"
+               y1="0.61942029"
+               x2="0.47761098"
+               y2="0.3214713"
+               id="linearGradient11568"
+               xlink:href="#linearGradient4215"
+               gradientTransform="scale(1.003618,0.996395)" />
+            <linearGradient
+               x1="1.8455285"
+               y1="1.34375"
+               x2="0.47967479"
+               y2="0.5625"
+               id="linearGradient11570"
+               xlink:href="#linearGradient4021" />
+            <linearGradient
+               id="linearGradient19068">
+              <stop
+                 id="stop19070"
+                 style="stop-color:#000000;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop19072"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="1.7519705"
+               y1="1.0528145"
+               x2="0.54093099"
+               y2="0.37158158"
+               id="linearGradient11578"
+               xlink:href="#linearGradient4021"
+               gradientTransform="scale(0.990884,1.0092)" />
+            <linearGradient
+               x1="0.24528302"
+               y1="1.6015625"
+               x2="0.28301886"
+               y2="-0.0234375"
+               id="linearGradient11581"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.89719623"
+               y1="-0.1484375"
+               x2="0.40186915"
+               y2="0.5546875"
+               id="linearGradient11584"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.90588236"
+               y1="-0.2734375"
+               x2="0.36470589"
+               y2="0.5078125"
+               id="linearGradient11586"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.56809336"
+               y1="-0.125"
+               x2="0.49027237"
+               y2="0.59375"
+               id="linearGradient11588"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="1.4128441"
+               y1="1.25"
+               x2="0.42201835"
+               y2="0.4140625"
+               id="linearGradient11590"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.084848486"
+               y1="1.1640625"
+               x2="0.53333336"
+               y2="0.359375"
+               id="linearGradient11592"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.76190478"
+               y1="-0.53125"
+               x2="0.6857143"
+               y2="0.5390625"
+               id="linearGradient11594"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               id="linearGradient11596">
+              <stop
+                 id="stop11598"
+                 style="stop-color:#ffffff;stop-opacity:0.83615822"
+                 offset="0" />
+              <stop
+                 id="stop11600"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="2.2054794"
+               y1="2.03125"
+               x2="0.56164384"
+               y2="-0.28125"
+               id="linearGradient11914"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.88832486"
+               y1="1.0390625"
+               x2="0.55837566"
+               y2="0.3046875"
+               id="linearGradient11603"
+               xlink:href="#linearGradient1806" />
+            <linearGradient
+               x1="0.85217392"
+               y1="0.9609375"
+               x2="0.86086959"
+               y2="0.296875"
+               id="linearGradient11605"
+               xlink:href="#linearGradient1806" />
+            <linearGradient
+               x1="0.064220183"
+               y1="1.4375"
+               x2="0.22018349"
+               y2="0.3125"
+               id="linearGradient11607"
+               xlink:href="#linearGradient3970" />
+            <linearGradient
+               id="linearGradient11609">
+              <stop
+                 id="stop11611"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop11613"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="1.1011236"
+               y1="0.7421875"
+               x2="0.033707865"
+               y2="0.5703125"
+               id="linearGradient11921"
+               xlink:href="#linearGradient3970" />
+            <linearGradient
+               id="linearGradient11616">
+              <stop
+                 id="stop19094"
+                 style="stop-color:#000000;stop-opacity:0.2937853"
+                 offset="0" />
+              <stop
+                 id="stop11619"
+                 style="stop-color:#000000;stop-opacity:0.06214689"
+                 offset="0.6477778" />
+              <stop
+                 id="stop11621"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <radialGradient
+               cx="0.49032259"
+               cy="0.50649351"
+               r="0.38170236"
+               fx="0.63414633"
+               fy="0.37777779"
+               id="radialGradient11623"
+               xlink:href="#linearGradient1806" />
+          </defs>
+        </defs>
+        <radialGradient
+           cx="24.825565"
+           cy="176.56438"
+           r="42.859913"
+           fx="40.974991"
+           fy="162.11137"
+           id="radialGradient11633"
+           xlink:href="#linearGradient1806"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="693.25439"
+           y1="697.24719"
+           x2="657.74762"
+           y2="677.27399"
+           id="linearGradient11984"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.983783,1.016484)" />
+        <linearGradient
+           x1="681.34058"
+           y1="728.7738"
+           x2="641.37305"
+           y2="705.9129"
+           id="linearGradient11637"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.986777,1.0134)" />
+        <linearGradient
+           x1="649.57269"
+           y1="677.24323"
+           x2="630.47528"
+           y2="668.91809"
+           id="linearGradient11639"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988806,1.011321)" />
+        <linearGradient
+           x1="647.99902"
+           y1="693.73279"
+           x2="629.89734"
+           y2="683.8114"
+           id="linearGradient59867"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.975718,1.024886)" />
+        <linearGradient
+           x1="538.89514"
+           y1="277.2775"
+           x2="575.11407"
+           y2="342.66919"
+           id="linearGradient11642"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.998206,1.001797)" />
+        <linearGradient
+           x1="509.06769"
+           y1="327.76361"
+           x2="544.86011"
+           y2="399.38104"
+           id="linearGradient11644"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.972249,1.028543)" />
+        <linearGradient
+           x1="591.27606"
+           y1="330.16998"
+           x2="620.33301"
+           y2="382.54678"
+           id="linearGradient11646"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.044357,0.957527)" />
+        <linearGradient
+           x1="566.74347"
+           y1="415.15009"
+           x2="588.13922"
+           y2="458.04449"
+           id="linearGradient11648"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.03551,0.965707)" />
+        <defs
+           id="defs1610">
+          <linearGradient
+             id="linearGradient920">
+            <stop
+               id="stop921"
+               style="stop-color:#000000;stop-opacity:0.24793388"
+               offset="0" />
+            <stop
+               id="stop922"
+               style="stop-color:#7f7f7f;stop-opacity:0"
+               offset="0.5" />
+            <stop
+               id="stop923"
+               style="stop-color:#ffffff;stop-opacity:0.61157024"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient1615">
+            <stop
+               id="stop1616"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop1617"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient1618">
+            <stop
+               id="stop1619"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop1620"
+               style="stop-color:#9a9a9a;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0.57205236"
+             y1="-0.31297702"
+             x2="0.57205236"
+             y2="0.74809158"
+             id="linearGradient57155"
+             xlink:href="#linearGradient1546" />
+          <linearGradient
+             x1="0.17209302"
+             y1="0.61392403"
+             x2="0.88837206"
+             y2="0.56329113"
+             id="linearGradient1622"
+             xlink:href="#linearGradient1461" />
+          <linearGradient
+             x1="0.65536726"
+             y1="0.64885503"
+             x2="0.57062149"
+             y2="0.1450382"
+             id="linearGradient11663"
+             xlink:href="#linearGradient1494" />
+          <linearGradient
+             id="linearGradient1624">
+            <stop
+               id="stop1625"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop1626"
+               style="stop-color:#000000;stop-opacity:0.28125"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0.78260869"
+             y1="0.96511632"
+             x2="0.7478261"
+             y2="0.17441867"
+             id="linearGradient1627"
+             xlink:href="#linearGradient1502" />
+          <linearGradient
+             x1="0.25581396"
+             y1="0.58860761"
+             x2="1.0232558"
+             y2="0.62025315"
+             id="linearGradient11669"
+             xlink:href="#linearGradient1461" />
+          <linearGradient
+             x1="0.13953489"
+             y1="0.51898736"
+             x2="1.0186046"
+             y2="0.5"
+             id="linearGradient11671"
+             xlink:href="#linearGradient1461" />
+          <linearGradient
+             x1="0.41340783"
+             y1="-0.17557251"
+             x2="0.41340783"
+             y2="0.94286799"
+             id="linearGradient11673"
+             xlink:href="#linearGradient1494" />
+          <linearGradient
+             x1="0.50819665"
+             y1="0.32824448"
+             x2="1.0601091"
+             y2="1.6870232"
+             id="linearGradient11675"
+             xlink:href="#linearGradient1494" />
+          <linearGradient
+             id="linearGradient11677">
+            <stop
+               id="stop1633"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop1634"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop1635"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0.19130436"
+             y1="-0.02307687"
+             x2="0.61739135"
+             y2="1.1115385"
+             id="linearGradient1641"
+             xlink:href="#linearGradient1461" />
+          <linearGradient
+             x1="0.46575344"
+             y1="0.15267175"
+             x2="0.46575344"
+             y2="1.7433255"
+             id="linearGradient1642"
+             xlink:href="#linearGradient1494" />
+          <linearGradient
+             id="linearGradient1643">
+            <stop
+               id="stop1644"
+               style="stop-color:#9d8f6a;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop1645"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0.496198" />
+            <stop
+               id="stop1646"
+               style="stop-color:#bfb5a5;stop-opacity:1"
+               offset="0.52539647" />
+            <stop
+               id="stop1647"
+               style="stop-color:#f7f7f7;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0.43455496"
+             y1="-0.52671754"
+             x2="0.56544501"
+             y2="1.9847329"
+             id="linearGradient1648"
+             xlink:href="#linearGradient1494" />
+          <linearGradient
+             id="linearGradient1649">
+            <stop
+               id="stop1650"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop1651"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0.48717949"
+             y1="0.60000002"
+             x2="0.043956045"
+             y2="0.93684208"
+             id="linearGradient1652"
+             xlink:href="#linearGradient1551" />
+          <linearGradient
+             id="linearGradient1047">
+            <stop
+               id="stop1048"
+               style="stop-color:#c7c7c7;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop1050"
+               style="stop-color:#d4d4d4;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop1051"
+               style="stop-color:#dbdbdb;stop-opacity:0.93388432"
+               offset="0.75" />
+            <stop
+               id="stop1049"
+               style="stop-color:#e2e2e2;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient907"
+             xlink:href="#linearGradient2540"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient896">
+            <stop
+               id="stop897"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop899"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient857">
+            <stop
+               id="stop858"
+               style="stop-color:#000000;stop-opacity:0.24705882"
+               offset="0" />
+            <stop
+               id="stop12036"
+               style="stop-color:#7f7f7f;stop-opacity:0"
+               offset="0.8888889" />
+            <stop
+               id="stop859"
+               style="stop-color:#ffffff;stop-opacity:0.61157024"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient57196">
+            <stop
+               id="stop57198"
+               style="stop-color:#727272;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop849"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0.62207639" />
+            <stop
+               id="stop12041"
+               style="stop-color:#5a5a5a;stop-opacity:1"
+               offset="0.63207638" />
+            <stop
+               id="stop846"
+               style="stop-color:#dfdfdf;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient840">
+            <stop
+               id="stop57204"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop57206"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0.38868448"
+             y1="0.14189366"
+             x2="0.40888888"
+             y2="0.359375"
+             id="linearGradient11715"
+             xlink:href="#linearGradient907" />
+          <linearGradient
+             x1="7.3357119e-16"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient856"
+             xlink:href="#linearGradient857" />
+          <linearGradient
+             x1="0.44311377"
+             y1="0.45806453"
+             x2="0.83832335"
+             y2="0.60645163"
+             id="linearGradient863"
+             xlink:href="#linearGradient857" />
+          <radialGradient
+             cx="0.5"
+             cy="0.5"
+             r="0.5"
+             fx="0.5"
+             fy="0.5"
+             id="radialGradient891"
+             xlink:href="#linearGradient844" />
+          <linearGradient
+             x1="0.3904762"
+             y1="1.015625"
+             x2="0.4952381"
+             y2="0.5703125"
+             id="linearGradient895"
+             xlink:href="#linearGradient896" />
+          <linearGradient
+             x1="0.20143886"
+             y1="0.16406251"
+             x2="0.79658836"
+             y2="0.53374529"
+             id="linearGradient905"
+             xlink:href="#linearGradient844" />
+          <linearGradient
+             x1="-0.034482758"
+             y1="0.140625"
+             x2="1.2965517"
+             y2="1.1328125"
+             id="linearGradient11722"
+             xlink:href="#linearGradient1047" />
+          <linearGradient
+             x1="0.63358778"
+             y1="0.9140625"
+             x2="0.50381678"
+             y2="0.515625"
+             id="linearGradient57215"
+             xlink:href="#linearGradient857" />
+          <linearGradient
+             id="linearGradient1684"
+             xlink:href="#linearGradient1454" />
+        </defs>
+        <linearGradient
+           x1="568.63257"
+           y1="330.88834"
+           x2="601.80719"
+           y2="343.34421"
+           id="linearGradient1788"
+           xlink:href="#linearGradient857"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.037921,0.963465)" />
+        <defs
+           id="defs1430">
+          <linearGradient
+             id="linearGradient57222">
+            <stop
+               id="stop1552"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop1553"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient1795">
+            <stop
+               id="stop1547"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop1548"
+               style="stop-color:#9a9a9a;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient12107">
+            <stop
+               id="stop1503"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop1506"
+               style="stop-color:#000000;stop-opacity:0.28125"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient1494">
+            <stop
+               id="stop1495"
+               style="stop-color:#9d8f6a;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11741"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0.496198" />
+            <stop
+               id="stop1498"
+               style="stop-color:#bfb5a5;stop-opacity:1"
+               offset="0.52539647" />
+            <stop
+               id="stop11744"
+               style="stop-color:#f7f7f7;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient1461">
+            <stop
+               id="stop1462"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop1464"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop1463"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient1454">
+            <stop
+               id="stop1455"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop1456"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="28.813946"
+             y1="221.79578"
+             x2="10.582993"
+             y2="235.65099"
+             id="linearGradient11753"
+             xlink:href="#linearGradient1551"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.709409,0.584998)" />
+          <linearGradient
+             x1="55.601124"
+             y1="-30.810305"
+             x2="40.876816"
+             y2="218.58856"
+             id="linearGradient11755"
+             xlink:href="#linearGradient1454"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.082134,0.9241)" />
+          <linearGradient
+             id="linearGradient1459"
+             xlink:href="#linearGradient1502" />
+          <linearGradient
+             x1="55.239422"
+             y1="97.356407"
+             x2="25.40143"
+             y2="29.790384"
+             id="linearGradient1460"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.942585,1.060912)" />
+          <linearGradient
+             x1="66.679367"
+             y1="28.158081"
+             x2="66.679367"
+             y2="107.53253"
+             id="linearGradient1465"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.1618,0.860733)" />
+          <linearGradient
+             x1="47.242912"
+             y1="77.450203"
+             x2="109.62949"
+             y2="76.102692"
+             id="linearGradient1466"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.1618,0.860733)" />
+          <linearGradient
+             x1="55.045113"
+             y1="85.877014"
+             x2="109.27901"
+             y2="88.11335"
+             id="linearGradient1467"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.162536,0.860189)" />
+          <linearGradient
+             x1="48.88829"
+             y1="90.157753"
+             x2="99.629562"
+             y2="86.570915"
+             id="linearGradient1468"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.162115,0.8605)" />
+          <linearGradient
+             x1="71.901497"
+             y1="69.209007"
+             x2="85.293274"
+             y2="102.17883"
+             id="linearGradient1469"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.179599,0.847746)" />
+          <linearGradient
+             x1="64.116882"
+             y1="47.803505"
+             x2="37.547989"
+             y2="140.37704"
+             id="linearGradient1471"
+             xlink:href="#linearGradient1546"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.329487,0.75217)" />
+          <linearGradient
+             x1="53.647789"
+             y1="101.89593"
+             x2="53.647789"
+             y2="160.91232"
+             id="linearGradient12132"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.289244,0.775649)" />
+          <linearGradient
+             x1="69.363586"
+             y1="56.763401"
+             x2="71.684402"
+             y2="101.294"
+             id="linearGradient12133"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.20398,0.830579)" />
+          <linearGradient
+             x1="177.86378"
+             y1="181.4277"
+             x2="197.19272"
+             y2="298.17694"
+             id="linearGradient57256"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.036891,0.964422)" />
+          <linearGradient
+             x1="57.724483"
+             y1="184.34286"
+             x2="55.957409"
+             y2="144.17274"
+             id="linearGradient11768"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.636328,0.611124)" />
+          <linearGradient
+             x1="83.123482"
+             y1="92.632271"
+             x2="77.120087"
+             y2="56.941833"
+             id="linearGradient1555"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.162115,0.8605)" />
+          <linearGradient
+             id="linearGradient11771"
+             xlink:href="#linearGradient1551" />
+        </defs>
+        <defs
+           id="defs1731">
+          <linearGradient
+             id="linearGradient9817">
+            <stop
+               id="stop9820"
+               style="stop-color:#000000;stop-opacity:0.7842105"
+               offset="0" />
+            <stop
+               id="stop9819"
+               style="stop-color:#000000;stop-opacity:0.06214689"
+               offset="0.6477778" />
+            <stop
+               id="stop9818"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient9125">
+            <stop
+               id="stop9127"
+               style="stop-color:#43b0e2;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop9126"
+               style="stop-color:#43b0e2;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient11783">
+            <stop
+               id="stop7797"
+               style="stop-color:#88b6d4;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop7798"
+               style="stop-color:#14354b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <defs
+             id="defs7819">
+            <linearGradient
+               id="linearGradient1743">
+              <stop
+                 id="stop1744"
+                 style="stop-color:#000000;stop-opacity:0.19791667"
+                 offset="0" />
+              <stop
+                 id="stop1745"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1746">
+              <stop
+                 id="stop1747"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1748"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1894">
+              <stop
+                 id="stop11795"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop11797"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1752">
+              <stop
+                 id="stop1753"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop1754"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop1755"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop12207"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop12208"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient12209">
+              <stop
+                 id="stop12210"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1761"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient1762"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <defs
+               id="defs1763">
+              <linearGradient
+                 id="linearGradient12214">
+                <stop
+                   id="stop12215"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop12216"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient1767">
+                <stop
+                   id="stop12218"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop12219"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop1770"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop12221"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop12222"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient1773">
+                <stop
+                   id="stop1774"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1775"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <radialGradient
+                 cx="23.756607"
+                 cy="60.078049"
+                 r="21.026033"
+                 fx="23.756607"
+                 fy="60.078049"
+                 id="radialGradient1776"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.006281,0.993758)" />
+              <linearGradient
+                 x1="31.82851"
+                 y1="61.778381"
+                 x2="33.198818"
+                 y2="6.859036"
+                 id="linearGradient1923"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.750054,0,0,1.072718,1.04579,2.663333)" />
+              <radialGradient
+                 cx="92.478806"
+                 cy="20.827066"
+                 r="45.889046"
+                 fx="92.478806"
+                 fy="20.827066"
+                 id="radialGradient1789"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.506767,1.973294)" />
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient1790"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="108.49871"
+                 y1="17.573528"
+                 x2="185.22578"
+                 y2="24.330959"
+                 id="linearGradient1791"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="28.814428"
+                 y1="-1.616316"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient1792"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.764292,1.3084)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient1793"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <linearGradient
+                 x1="30.382267"
+                 y1="7.5329666"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient1794"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+              <linearGradient
+                 x1="25.954844"
+                 y1="25.071495"
+                 x2="39.781502"
+                 y2="27.315489"
+                 id="linearGradient12234"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103231)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient1796"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient1797"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient1798"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs1799">
+                <linearGradient
+                   id="linearGradient1800">
+                  <stop
+                     id="stop1802"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop1810"
+                     style="stop-color:#d0d1d9;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop1813"
+                     style="stop-color:#878b9b;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient1814"
+                   xlink:href="#linearGradient9125"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+              </defs>
+            </defs>
+            <defs
+               id="defs1829">
+              <linearGradient
+                 id="linearGradient1830">
+                <stop
+                   id="stop11846"
+                   style="stop-color:#826647;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1832"
+                   style="stop-color:#575147;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.36627907"
+                 y1="0.8125"
+                 x2="0.36627907"
+                 y2="0.1796875"
+                 id="linearGradient11849"
+                 xlink:href="#linearGradient1136"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="-0.109375"
+                 y1="0.9140625"
+                 x2="1.15625"
+                 y2="0.1796875"
+                 id="linearGradient11851"
+                 xlink:href="#linearGradient1136" />
+            </defs>
+            <linearGradient
+               x1="179.83598"
+               y1="178.66379"
+               x2="200.25706"
+               y2="302.00961"
+               id="linearGradient11854"
+               xlink:href="#linearGradient1502"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.030776,0.970143)" />
+            <linearGradient
+               x1="178.64995"
+               y1="179.87529"
+               x2="198.41254"
+               y2="299.24384"
+               id="linearGradient11856"
+               xlink:href="#linearGradient1502"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.034428,0.966718)" />
+            <linearGradient
+               x1="181.35893"
+               y1="177.20132"
+               x2="202.65994"
+               y2="305.862"
+               id="linearGradient11858"
+               xlink:href="#linearGradient1502"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.026679,0.974015)" />
+            <linearGradient
+               x1="182.83167"
+               y1="175.80452"
+               x2="205.01575"
+               y2="309.7991"
+               id="linearGradient11860"
+               xlink:href="#linearGradient1502"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.022962,0.977554)" />
+            <linearGradient
+               x1="177.86378"
+               y1="181.4277"
+               x2="197.19272"
+               y2="298.17694"
+               id="linearGradient11862"
+               xlink:href="#linearGradient1502"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.036891,0.964422)" />
+            <linearGradient
+               x1="55.601124"
+               y1="-30.810305"
+               x2="40.876816"
+               y2="218.58856"
+               id="linearGradient11864"
+               xlink:href="#linearGradient1454"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.082134,0.9241)" />
+            <linearGradient
+               x1="64.116882"
+               y1="47.803505"
+               x2="37.547989"
+               y2="140.37704"
+               id="linearGradient11866"
+               xlink:href="#linearGradient1546"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.329487,0.75217)" />
+            <linearGradient
+               x1="83.123482"
+               y1="92.632271"
+               x2="77.120087"
+               y2="56.941833"
+               id="linearGradient11868"
+               xlink:href="#linearGradient1494"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.162115,0.8605)" />
+            <linearGradient
+               x1="48.88829"
+               y1="90.157753"
+               x2="99.629562"
+               y2="86.570915"
+               id="linearGradient1862"
+               xlink:href="#linearGradient1461"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.162115,0.8605)" />
+            <linearGradient
+               x1="57.724483"
+               y1="184.34286"
+               x2="55.957409"
+               y2="144.17274"
+               id="linearGradient12274"
+               xlink:href="#linearGradient1502"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.636328,0.611124)" />
+            <linearGradient
+               x1="55.045113"
+               y1="85.877014"
+               x2="109.27901"
+               y2="88.11335"
+               id="linearGradient11872"
+               xlink:href="#linearGradient1461"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.162536,0.860189)" />
+            <linearGradient
+               x1="66.679367"
+               y1="28.158081"
+               x2="66.679367"
+               y2="107.53253"
+               id="linearGradient12276"
+               xlink:href="#linearGradient1494"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.1618,0.860733)" />
+            <linearGradient
+               x1="47.242912"
+               y1="77.450203"
+               x2="109.62949"
+               y2="76.102692"
+               id="linearGradient12277"
+               xlink:href="#linearGradient1461"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.1618,0.860733)" />
+            <linearGradient
+               x1="71.901497"
+               y1="69.209007"
+               x2="85.293274"
+               y2="102.17883"
+               id="linearGradient1874"
+               xlink:href="#linearGradient1494"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.179599,0.847746)" />
+            <linearGradient
+               x1="55.239422"
+               y1="97.356407"
+               x2="25.40143"
+               y2="29.790384"
+               id="linearGradient11877"
+               xlink:href="#linearGradient1461"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.942585,1.060912)" />
+            <linearGradient
+               x1="53.647789"
+               y1="101.89593"
+               x2="53.647789"
+               y2="160.91232"
+               id="linearGradient1876"
+               xlink:href="#linearGradient1494"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.289244,0.775649)" />
+            <linearGradient
+               x1="69.363586"
+               y1="56.763401"
+               x2="71.684402"
+               y2="101.294"
+               id="linearGradient1877"
+               xlink:href="#linearGradient1494"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.20398,0.830579)" />
+            <linearGradient
+               x1="28.813946"
+               y1="221.79578"
+               x2="10.582993"
+               y2="235.65099"
+               id="linearGradient12282"
+               xlink:href="#linearGradient1551"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.709409,0.584998)" />
+            <radialGradient
+               cx="24.825565"
+               cy="176.56438"
+               r="42.859913"
+               fx="40.974991"
+               fy="162.11137"
+               id="radialGradient1879"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="693.25439"
+               y1="697.24719"
+               x2="657.74762"
+               y2="677.27399"
+               id="linearGradient1880"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.983783,1.016484)" />
+            <linearGradient
+               x1="681.34058"
+               y1="728.7738"
+               x2="641.37305"
+               y2="705.9129"
+               id="linearGradient1881"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.986777,1.0134)" />
+            <linearGradient
+               x1="649.57269"
+               y1="677.24323"
+               x2="630.47528"
+               y2="668.91809"
+               id="linearGradient11885"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988806,1.011321)" />
+            <linearGradient
+               x1="647.99902"
+               y1="693.73279"
+               x2="629.89734"
+               y2="683.8114"
+               id="linearGradient12287"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.975718,1.024886)" />
+            <linearGradient
+               x1="538.89514"
+               y1="277.2775"
+               x2="575.11407"
+               y2="342.66919"
+               id="linearGradient12288"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.998206,1.001797)" />
+            <linearGradient
+               x1="509.06769"
+               y1="327.76361"
+               x2="544.86011"
+               y2="399.38104"
+               id="linearGradient11889"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.972249,1.028543)" />
+            <linearGradient
+               x1="591.27606"
+               y1="330.16998"
+               x2="620.33301"
+               y2="382.54678"
+               id="linearGradient11891"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.044357,0.957527)" />
+            <linearGradient
+               x1="566.74347"
+               y1="415.15009"
+               x2="588.13922"
+               y2="458.04449"
+               id="linearGradient1887"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.03551,0.965707)" />
+            <defs
+               id="defs1888">
+              <linearGradient
+                 x1="0.25179857"
+                 y1="-0.0390625"
+                 x2="0.53237408"
+                 y2="0.5234375"
+                 id="linearGradient11895"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.092198581"
+                 y1="-0.2109375"
+                 x2="0.4822695"
+                 y2="0.4921875"
+                 id="linearGradient11897"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.016528925"
+                 y1="-0.4921875"
+                 x2="0.51239669"
+                 y2="0.5"
+                 id="linearGradient11899"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.05511811"
+                 y1="-0.3046875"
+                 x2="0.53543305"
+                 y2="0.5625"
+                 id="linearGradient12296"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="1.2125034"
+                 y1="0.78833276"
+                 x2="0.5859077"
+                 y2="0.44490069"
+                 id="linearGradient1898"
+                 xlink:href="#linearGradient4215"
+                 gradientTransform="scale(0.999075,1.000926)" />
+              <linearGradient
+                 id="linearGradient11903">
+                <stop
+                   id="stop1900"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1901"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.1610887"
+                 y1="0.61942029"
+                 x2="0.47761098"
+                 y2="0.3214713"
+                 id="linearGradient11907"
+                 xlink:href="#linearGradient4215"
+                 gradientTransform="scale(1.003618,0.996395)" />
+              <linearGradient
+                 x1="1.8455285"
+                 y1="1.34375"
+                 x2="0.47967479"
+                 y2="0.5625"
+                 id="linearGradient11909"
+                 xlink:href="#linearGradient4021" />
+              <linearGradient
+                 id="linearGradient1904">
+                <stop
+                   id="stop11912"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop11914"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.7519705"
+                 y1="1.0528145"
+                 x2="0.54093099"
+                 y2="0.37158158"
+                 id="linearGradient1907"
+                 xlink:href="#linearGradient4021"
+                 gradientTransform="scale(0.990884,1.0092)" />
+              <linearGradient
+                 x1="0.24528302"
+                 y1="1.6015625"
+                 x2="0.28301886"
+                 y2="-0.0234375"
+                 id="linearGradient11917"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.89719623"
+                 y1="-0.1484375"
+                 x2="0.40186915"
+                 y2="0.5546875"
+                 id="linearGradient19343"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.90588236"
+                 y1="-0.2734375"
+                 x2="0.36470589"
+                 y2="0.5078125"
+                 id="linearGradient1910"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.56809336"
+                 y1="-0.125"
+                 x2="0.49027237"
+                 y2="0.59375"
+                 id="linearGradient12310"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="1.4128441"
+                 y1="1.25"
+                 x2="0.42201835"
+                 y2="0.4140625"
+                 id="linearGradient11923"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.084848486"
+                 y1="1.1640625"
+                 x2="0.53333336"
+                 y2="0.359375"
+                 id="linearGradient11925"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.76190478"
+                 y1="-0.53125"
+                 x2="0.6857143"
+                 y2="0.5390625"
+                 id="linearGradient1914"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 id="linearGradient11928">
+                <stop
+                   id="stop1916"
+                   style="stop-color:#ffffff;stop-opacity:0.83615822"
+                   offset="0" />
+                <stop
+                   id="stop57387"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="2.2054794"
+                 y1="2.03125"
+                 x2="0.56164384"
+                 y2="-0.28125"
+                 id="linearGradient11932"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.88832486"
+                 y1="1.0390625"
+                 x2="0.55837566"
+                 y2="0.3046875"
+                 id="linearGradient11934"
+                 xlink:href="#linearGradient1806" />
+              <linearGradient
+                 x1="0.85217392"
+                 y1="0.9609375"
+                 x2="0.86086959"
+                 y2="0.296875"
+                 id="linearGradient1920"
+                 xlink:href="#linearGradient1806" />
+              <linearGradient
+                 x1="0.064220183"
+                 y1="1.4375"
+                 x2="0.22018349"
+                 y2="0.3125"
+                 id="linearGradient1921"
+                 xlink:href="#linearGradient3970" />
+              <linearGradient
+                 id="linearGradient11938">
+                <stop
+                   id="stop1923"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1924"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.1011236"
+                 y1="0.7421875"
+                 x2="0.033707865"
+                 y2="0.5703125"
+                 id="linearGradient11942"
+                 xlink:href="#linearGradient3970" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient12325"
+                 xlink:href="#linearGradient9817"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <radialGradient
+                 cx="0.49032259"
+                 cy="0.50649351"
+                 r="0.38170236"
+                 fx="0.63414633"
+                 fy="0.37777779"
+                 id="radialGradient1927"
+                 xlink:href="#linearGradient1806" />
+            </defs>
+            <linearGradient
+               x1="-191.46153"
+               y1="37.372372"
+               x2="-165.58835"
+               y2="37.372372"
+               id="linearGradient11948"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+            <defs
+               id="defs1983">
+              <linearGradient
+                 id="linearGradient57403">
+                <stop
+                   id="stop11952"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1986"
+                   style="stop-color:#fafbff;stop-opacity:1"
+                   offset="0.25" />
+                <stop
+                   id="stop1987"
+                   style="stop-color:#f0f2fa;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop1988"
+                   style="stop-color:#e1e1e1;stop-opacity:1"
+                   offset="0.75" />
+                <stop
+                   id="stop1989"
+                   style="stop-color:#f5f6ff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2075">
+                <stop
+                   id="stop19374"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop11961"
+                   style="stop-color:#d0d1d9;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop19377"
+                   style="stop-color:#878b9b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient1994">
+                <stop
+                   id="stop1995"
+                   style="stop-color:#e8e8e8;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1996"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient57417"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <radialGradient
+                 cx="-77.367622"
+                 cy="42.633839"
+                 r="216.26619"
+                 fx="-80.036034"
+                 fy="44.468376"
+                 id="radialGradient1998"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+              <defs
+                 id="defs1999">
+                <linearGradient
+                   id="linearGradient57421">
+                  <stop
+                     id="stop2001"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop2002"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient11976">
+                  <stop
+                     id="stop11978"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop2005"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop2006"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop11982"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop11984"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient11986">
+                  <stop
+                     id="stop11988"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop11990"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="133.07144"
+                   y1="28.231943"
+                   x2="118.58411"
+                   y2="13.431207"
+                   id="linearGradient2012"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                <linearGradient
+                   x1="30.722504"
+                   y1="28.135216"
+                   x2="39.78149"
+                   y2="27.315481"
+                   id="linearGradient2013"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103232)" />
+                <radialGradient
+                   cx="4.9853168"
+                   cy="108.47158"
+                   r="34.222183"
+                   fx="5.2520976"
+                   fy="108.73115"
+                   id="radialGradient2014"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="36.826332"
+                   y1="75.332558"
+                   x2="25.761681"
+                   y2="135.90358"
+                   id="linearGradient11995"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                <linearGradient
+                   x1="78.675774"
+                   y1="47.411823"
+                   x2="64.05336"
+                   y2="34.302757"
+                   id="linearGradient11997"
+                   xlink:href="#linearGradient4281"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                <defs
+                   id="defs2017">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient12000"
+                     xlink:href="#linearGradient3296"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                </defs>
+              </defs>
+              <linearGradient
+                 x1="88.712402"
+                 y1="138.15012"
+                 x2="104.81104"
+                 y2="151.63045"
+                 id="linearGradient12422"
+                 xlink:href="#linearGradient3305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            </defs>
+            <linearGradient
+               x1="226.34392"
+               y1="866.83282"
+               x2="109.99118"
+               y2="627.57227"
+               id="linearGradient2041"
+               xlink:href="#linearGradient845"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.015083,0.985142)" />
+            <linearGradient
+               x1="405.49411"
+               y1="241.15977"
+               x2="405.49411"
+               y2="748.58954"
+               id="linearGradient2042"
+               xlink:href="#linearGradient850"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.961036,1.040544)" />
+            <linearGradient
+               x1="911.58417"
+               y1="626.5332"
+               x2="911.58417"
+               y2="471.98822"
+               id="linearGradient2043"
+               xlink:href="#linearGradient865"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.250806,0.799484)" />
+            <linearGradient
+               x1="275.91269"
+               y1="240.36499"
+               x2="337.76599"
+               y2="385.1778"
+               id="linearGradient12012"
+               xlink:href="#linearGradient845"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.214317,0.823508)" />
+            <linearGradient
+               x1="250.2383"
+               y1="350.13974"
+               x2="250.2383"
+               y2="280.09955"
+               id="linearGradient2045"
+               xlink:href="#linearGradient860"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.349063,0.741255)" />
+            <linearGradient
+               x1="309.547"
+               y1="292.84094"
+               x2="309.547"
+               y2="127.49744"
+               id="linearGradient2046"
+               xlink:href="#linearGradient860"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.194349,0.837276)" />
+            <linearGradient
+               x1="911.58417"
+               y1="626.5332"
+               x2="911.58417"
+               y2="471.98822"
+               id="linearGradient12016"
+               xlink:href="#linearGradient865"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.250806,0.799484)" />
+            <linearGradient
+               x1="517.80023"
+               y1="832.91492"
+               x2="742.3476"
+               y2="628.79071"
+               id="linearGradient12018"
+               xlink:href="#linearGradient845"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.975706,1.024899)" />
+            <linearGradient
+               x1="309.547"
+               y1="292.84094"
+               x2="309.547"
+               y2="127.49744"
+               id="linearGradient2049"
+               xlink:href="#linearGradient860"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.194349,0.837276)" />
+            <linearGradient
+               x1="309.547"
+               y1="292.84094"
+               x2="309.547"
+               y2="127.49744"
+               id="linearGradient2050"
+               xlink:href="#linearGradient860"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.194349,0.837276)" />
+            <linearGradient
+               x1="736.18683"
+               y1="646.92255"
+               x2="736.18683"
+               y2="478.88864"
+               id="linearGradient12022"
+               xlink:href="#linearGradient860"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.762621,1.311267)" />
+            <linearGradient
+               x1="184.0434"
+               y1="838.54852"
+               x2="142.93327"
+               y2="642.70612"
+               id="linearGradient2052"
+               xlink:href="#linearGradient860"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.026717,0.973979)" />
+            <linearGradient
+               x1="472.38922"
+               y1="807.86877"
+               x2="472.10596"
+               y2="746.31073"
+               id="linearGradient12025"
+               xlink:href="#linearGradient865"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.249987,0.800008)" />
+            <linearGradient
+               x1="254.96887"
+               y1="629.17017"
+               x2="277.04468"
+               y2="579.98926"
+               id="linearGradient2054"
+               xlink:href="#linearGradient865"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.892795,1.120079)" />
+            <linearGradient
+               x1="84.960785"
+               y1="92.151367"
+               x2="42.64373"
+               y2="53.360722"
+               id="linearGradient2055"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.321949,0.756459)" />
+            <linearGradient
+               x1="109.15074"
+               y1="2.1610787"
+               x2="134.0733"
+               y2="60.510494"
+               id="linearGradient12445"
+               xlink:href="#linearGradient845"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.835421,1.197001)" />
+            <linearGradient
+               x1="186.07457"
+               y1="23.533224"
+               x2="202.6377"
+               y2="23.47304"
+               id="linearGradient12030"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.388045,2.57702)" />
+            <linearGradient
+               x1="92.631454"
+               y1="54.989693"
+               x2="92.631454"
+               y2="50.608093"
+               id="linearGradient2058"
+               xlink:href="#linearGradient1757"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.787838,1.269296)" />
+            <radialGradient
+               cx="24.825565"
+               cy="176.56438"
+               r="42.859913"
+               fx="40.974991"
+               fy="162.11137"
+               id="radialGradient2059"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="693.25439"
+               y1="697.24719"
+               x2="657.74762"
+               y2="677.27399"
+               id="linearGradient12034"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.983783,1.016484)" />
+            <linearGradient
+               x1="681.34058"
+               y1="728.7738"
+               x2="641.37305"
+               y2="705.9129"
+               id="linearGradient12450"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.986777,1.0134)" />
+            <linearGradient
+               x1="649.57269"
+               y1="677.24323"
+               x2="630.47528"
+               y2="668.91809"
+               id="linearGradient60186"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988806,1.011321)" />
+            <linearGradient
+               x1="647.99902"
+               y1="693.73279"
+               x2="629.89734"
+               y2="683.8114"
+               id="linearGradient12038"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.975718,1.024886)" />
+            <linearGradient
+               x1="538.89514"
+               y1="277.2775"
+               x2="575.11407"
+               y2="342.66919"
+               id="linearGradient12040"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.998206,1.001797)" />
+            <linearGradient
+               x1="509.06769"
+               y1="327.76361"
+               x2="544.86011"
+               y2="399.38104"
+               id="linearGradient57472"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.972249,1.028543)" />
+            <linearGradient
+               x1="591.27606"
+               y1="330.16998"
+               x2="620.33301"
+               y2="382.54678"
+               id="linearGradient2066"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.044357,0.957527)" />
+            <linearGradient
+               x1="566.74347"
+               y1="415.15009"
+               x2="588.13922"
+               y2="458.04449"
+               id="linearGradient12456"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.03551,0.965707)" />
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient12045"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+            <linearGradient
+               x1="1270.3132"
+               y1="4.8765283"
+               x2="1247.6848"
+               y2="0.72310239"
+               id="linearGradient2069"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(9.440723e-2,10.59241)" />
+            <linearGradient
+               x1="1270.3132"
+               y1="4.8765283"
+               x2="1247.6848"
+               y2="0.72310239"
+               id="linearGradient12459"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+            <defs
+               id="defs2071">
+              <linearGradient
+                 id="linearGradient12050">
+                <stop
+                   id="stop12052"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop12054"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient12056">
+                <stop
+                   id="stop2079"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop60202"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient12060">
+                <stop
+                   id="stop2082"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop2083"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop2084"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop12065"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop12067"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient12069">
+                <stop
+                   id="stop12071"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop12073"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <radialGradient
+                 cx="23.756607"
+                 cy="60.078049"
+                 r="21.026033"
+                 fx="23.756607"
+                 fy="60.078049"
+                 id="radialGradient2090"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+              <linearGradient
+                 x1="31.82851"
+                 y1="61.778381"
+                 x2="33.198818"
+                 y2="6.859036"
+                 id="linearGradient12076"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+              <radialGradient
+                 cx="92.478806"
+                 cy="20.827066"
+                 r="45.889046"
+                 fx="92.478806"
+                 fy="20.827066"
+                 id="radialGradient2092"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient2093"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+              <linearGradient
+                 x1="108.49871"
+                 y1="17.573528"
+                 x2="185.22578"
+                 y2="24.330959"
+                 id="linearGradient2094"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+              <linearGradient
+                 x1="28.814428"
+                 y1="-1.616316"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient2095"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.764292,1.3084)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient12082"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <linearGradient
+                 x1="30.382267"
+                 y1="7.5329666"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient2097"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+              <linearGradient
+                 x1="25.954844"
+                 y1="25.071495"
+                 x2="39.781502"
+                 y2="27.315489"
+                 id="linearGradient12085"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103231)" />
+              <linearGradient
+                 x1="31.82851"
+                 y1="61.778381"
+                 x2="33.198818"
+                 y2="6.859036"
+                 id="linearGradient12087"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+              <radialGradient
+                 cx="24.825565"
+                 cy="176.56438"
+                 r="42.859913"
+                 fx="40.974991"
+                 fy="162.11137"
+                 id="radialGradient2100"
+                 xlink:href="#linearGradient1806"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="693.25439"
+                 y1="697.24719"
+                 x2="657.74762"
+                 y2="677.27399"
+                 id="linearGradient12090"
+                 xlink:href="#linearGradient4021"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.983783,1.016484)" />
+              <linearGradient
+                 x1="681.34058"
+                 y1="728.7738"
+                 x2="641.37305"
+                 y2="705.9129"
+                 id="linearGradient60225"
+                 xlink:href="#linearGradient4021"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.986777,1.0134)" />
+              <linearGradient
+                 x1="649.57269"
+                 y1="677.24323"
+                 x2="630.47528"
+                 y2="668.91809"
+                 id="linearGradient12093"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.988806,1.011321)" />
+              <linearGradient
+                 x1="647.99902"
+                 y1="693.73279"
+                 x2="629.89734"
+                 y2="683.8114"
+                 id="linearGradient12095"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.975718,1.024886)" />
+              <linearGradient
+                 x1="538.89514"
+                 y1="277.2775"
+                 x2="575.11407"
+                 y2="342.66919"
+                 id="linearGradient12097"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.998206,1.001797)" />
+              <linearGradient
+                 x1="509.06769"
+                 y1="327.76361"
+                 x2="544.86011"
+                 y2="399.38104"
+                 id="linearGradient12099"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.972249,1.028543)" />
+              <linearGradient
+                 x1="591.27606"
+                 y1="330.16998"
+                 x2="620.33301"
+                 y2="382.54678"
+                 id="linearGradient2107"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.044357,0.957527)" />
+              <linearGradient
+                 x1="566.74347"
+                 y1="415.15009"
+                 x2="588.13922"
+                 y2="458.04449"
+                 id="linearGradient12102"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.03551,0.965707)" />
+              <defs
+                 id="defs2109">
+                <linearGradient
+                   x1="0.25179857"
+                   y1="-0.0390625"
+                   x2="0.53237408"
+                   y2="0.5234375"
+                   id="linearGradient2110"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="0.092198581"
+                   y1="-0.2109375"
+                   x2="0.4822695"
+                   y2="0.4921875"
+                   id="linearGradient2111"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="0.016528925"
+                   y1="-0.4921875"
+                   x2="0.51239669"
+                   y2="0.5"
+                   id="linearGradient60236"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="0.05511811"
+                   y1="-0.3046875"
+                   x2="0.53543305"
+                   y2="0.5625"
+                   id="linearGradient12108"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="1.2125034"
+                   y1="0.78833276"
+                   x2="0.5859077"
+                   y2="0.44490069"
+                   id="linearGradient12110"
+                   xlink:href="#linearGradient4215"
+                   gradientTransform="scale(0.999075,1.000926)" />
+                <linearGradient
+                   id="linearGradient12112">
+                  <stop
+                     id="stop60241"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop2117"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.1610887"
+                   y1="0.61942029"
+                   x2="0.47761098"
+                   y2="0.3214713"
+                   id="linearGradient12116"
+                   xlink:href="#linearGradient4215"
+                   gradientTransform="scale(1.003618,0.996395)" />
+                <linearGradient
+                   x1="1.8455285"
+                   y1="1.34375"
+                   x2="0.47967479"
+                   y2="0.5625"
+                   id="linearGradient12118"
+                   xlink:href="#linearGradient4021" />
+                <linearGradient
+                   id="linearGradient2120">
+                  <stop
+                     id="stop12121"
+                     style="stop-color:#000000;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop2122"
+                     style="stop-color:#000000;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.7519705"
+                   y1="1.0528145"
+                   x2="0.54093099"
+                   y2="0.37158158"
+                   id="linearGradient12124"
+                   xlink:href="#linearGradient4021"
+                   gradientTransform="scale(0.990884,1.0092)" />
+                <linearGradient
+                   x1="0.24528302"
+                   y1="1.6015625"
+                   x2="0.28301886"
+                   y2="-0.0234375"
+                   id="linearGradient57529"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.89719623"
+                   y1="-0.1484375"
+                   x2="0.40186915"
+                   y2="0.5546875"
+                   id="linearGradient2125"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.90588236"
+                   y1="-0.2734375"
+                   x2="0.36470589"
+                   y2="0.5078125"
+                   id="linearGradient2126"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.56809336"
+                   y1="-0.125"
+                   x2="0.49027237"
+                   y2="0.59375"
+                   id="linearGradient2127"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="1.4128441"
+                   y1="1.25"
+                   x2="0.42201835"
+                   y2="0.4140625"
+                   id="linearGradient2128"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.084848486"
+                   y1="1.1640625"
+                   x2="0.53333336"
+                   y2="0.359375"
+                   id="linearGradient12131"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.76190478"
+                   y1="-0.53125"
+                   x2="0.6857143"
+                   y2="0.5390625"
+                   id="linearGradient2130"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   id="linearGradient2131">
+                  <stop
+                     id="stop2132"
+                     style="stop-color:#ffffff;stop-opacity:0.83615822"
+                     offset="0" />
+                  <stop
+                     id="stop2133"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="2.2054794"
+                   y1="2.03125"
+                   x2="0.56164384"
+                   y2="-0.28125"
+                   id="linearGradient2134"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.88832486"
+                   y1="1.0390625"
+                   x2="0.55837566"
+                   y2="0.3046875"
+                   id="linearGradient2135"
+                   xlink:href="#linearGradient1806" />
+                <linearGradient
+                   x1="0.85217392"
+                   y1="0.9609375"
+                   x2="0.86086959"
+                   y2="0.296875"
+                   id="linearGradient2136"
+                   xlink:href="#linearGradient1806" />
+                <linearGradient
+                   x1="0.064220183"
+                   y1="1.4375"
+                   x2="0.22018349"
+                   y2="0.3125"
+                   id="linearGradient2137"
+                   xlink:href="#linearGradient3970" />
+                <linearGradient
+                   id="linearGradient12141">
+                  <stop
+                     id="stop2139"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop2140"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.1011236"
+                   y1="0.7421875"
+                   x2="0.033707865"
+                   y2="0.5703125"
+                   id="linearGradient12145"
+                   xlink:href="#linearGradient3970" />
+                <linearGradient
+                   id="linearGradient2149">
+                  <stop
+                     id="stop12148"
+                     style="stop-color:#000000;stop-opacity:0.2937853"
+                     offset="0" />
+                  <stop
+                     id="stop12150"
+                     style="stop-color:#000000;stop-opacity:0.06214689"
+                     offset="0.6477778" />
+                  <stop
+                     id="stop12152"
+                     style="stop-color:#000000;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <radialGradient
+                   cx="0.49032259"
+                   cy="0.50649351"
+                   r="0.38170236"
+                   fx="0.63414633"
+                   fy="0.37777779"
+                   id="radialGradient2153"
+                   xlink:href="#linearGradient1806" />
+              </defs>
+            </defs>
+            <radialGradient
+               cx="24.825565"
+               cy="176.56438"
+               r="42.859913"
+               fx="40.974991"
+               fy="162.11137"
+               id="radialGradient2205"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="693.25439"
+               y1="697.24719"
+               x2="657.74762"
+               y2="677.27399"
+               id="linearGradient12160"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.983783,1.016484)" />
+            <linearGradient
+               x1="681.34058"
+               y1="728.7738"
+               x2="641.37305"
+               y2="705.9129"
+               id="linearGradient2207"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.986777,1.0134)" />
+            <linearGradient
+               x1="649.57269"
+               y1="677.24323"
+               x2="630.47528"
+               y2="668.91809"
+               id="linearGradient12163"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988806,1.011321)" />
+            <linearGradient
+               x1="647.99902"
+               y1="693.73279"
+               x2="629.89734"
+               y2="683.8114"
+               id="linearGradient2209"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.975718,1.024886)" />
+            <linearGradient
+               x1="538.89514"
+               y1="277.2775"
+               x2="575.11407"
+               y2="342.66919"
+               id="linearGradient2210"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.998206,1.001797)" />
+            <linearGradient
+               x1="509.06769"
+               y1="327.76361"
+               x2="544.86011"
+               y2="399.38104"
+               id="linearGradient2211"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.972249,1.028543)" />
+            <linearGradient
+               x1="591.27606"
+               y1="330.16998"
+               x2="620.33301"
+               y2="382.54678"
+               id="linearGradient2212"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.044357,0.957527)" />
+            <linearGradient
+               x1="566.74347"
+               y1="415.15009"
+               x2="588.13922"
+               y2="458.04449"
+               id="linearGradient2213"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.03551,0.965707)" />
+            <defs
+               id="defs2214">
+              <linearGradient
+                 id="linearGradient2215">
+                <stop
+                   id="stop2216"
+                   style="stop-color:#000000;stop-opacity:0.24793388"
+                   offset="0" />
+                <stop
+                   id="stop2217"
+                   style="stop-color:#7f7f7f;stop-opacity:0"
+                   offset="0.5" />
+                <stop
+                   id="stop2218"
+                   style="stop-color:#ffffff;stop-opacity:0.61157024"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient12175">
+                <stop
+                   id="stop2220"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop12178"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient12180">
+                <stop
+                   id="stop57575"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2224"
+                   style="stop-color:#9a9a9a;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.57205236"
+                 y1="-0.31297702"
+                 x2="0.57205236"
+                 y2="0.74809158"
+                 id="linearGradient12184"
+                 xlink:href="#linearGradient1546" />
+              <linearGradient
+                 x1="0.17209302"
+                 y1="0.61392403"
+                 x2="0.88837206"
+                 y2="0.56329113"
+                 id="linearGradient2226"
+                 xlink:href="#linearGradient1461" />
+              <linearGradient
+                 x1="0.65536726"
+                 y1="0.64885503"
+                 x2="0.57062149"
+                 y2="0.1450382"
+                 id="linearGradient12187"
+                 xlink:href="#linearGradient1494" />
+              <linearGradient
+                 id="linearGradient2228">
+                <stop
+                   id="stop12190"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="0" />
+                <stop
+                   id="stop2230"
+                   style="stop-color:#000000;stop-opacity:0.28125"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.78260869"
+                 y1="0.96511632"
+                 x2="0.7478261"
+                 y2="0.17441867"
+                 id="linearGradient57584"
+                 xlink:href="#linearGradient1502" />
+              <linearGradient
+                 x1="0.25581396"
+                 y1="0.58860761"
+                 x2="1.0232558"
+                 y2="0.62025315"
+                 id="linearGradient2232"
+                 xlink:href="#linearGradient1461" />
+              <linearGradient
+                 x1="0.13953489"
+                 y1="0.51898736"
+                 x2="1.0186046"
+                 y2="0.5"
+                 id="linearGradient12195"
+                 xlink:href="#linearGradient1461" />
+              <linearGradient
+                 x1="0.41340783"
+                 y1="-0.17557251"
+                 x2="0.41340783"
+                 y2="0.94286799"
+                 id="linearGradient12197"
+                 xlink:href="#linearGradient1494" />
+              <linearGradient
+                 x1="0.50819665"
+                 y1="0.32824448"
+                 x2="1.0601091"
+                 y2="1.6870232"
+                 id="linearGradient2235"
+                 xlink:href="#linearGradient1494" />
+              <linearGradient
+                 id="linearGradient2236">
+                <stop
+                   id="stop2237"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="0" />
+                <stop
+                   id="stop12202"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop12204"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.19130436"
+                 y1="-0.02307687"
+                 x2="0.61739135"
+                 y2="1.1115385"
+                 id="linearGradient12206"
+                 xlink:href="#linearGradient1461" />
+              <linearGradient
+                 x1="0.46575344"
+                 y1="0.15267175"
+                 x2="0.46575344"
+                 y2="1.7433255"
+                 id="linearGradient2241"
+                 xlink:href="#linearGradient1494" />
+              <linearGradient
+                 id="linearGradient2242">
+                <stop
+                   id="stop2243"
+                   style="stop-color:#9d8f6a;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2244"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0.496198" />
+                <stop
+                   id="stop2245"
+                   style="stop-color:#bfb5a5;stop-opacity:1"
+                   offset="0.52539647" />
+                <stop
+                   id="stop2246"
+                   style="stop-color:#f7f7f7;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.43455496"
+                 y1="-0.52671754"
+                 x2="0.56544501"
+                 y2="1.9847329"
+                 id="linearGradient12215"
+                 xlink:href="#linearGradient1494" />
+              <linearGradient
+                 id="linearGradient12217">
+                <stop
+                   id="stop12220"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="0" />
+                <stop
+                   id="stop2250"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.48717949"
+                 y1="0.60000002"
+                 x2="0.043956045"
+                 y2="0.93684208"
+                 id="linearGradient2251"
+                 xlink:href="#linearGradient1551" />
+              <linearGradient
+                 id="linearGradient12224">
+                <stop
+                   id="stop2253"
+                   style="stop-color:#c7c7c7;stop-opacity:0"
+                   offset="0" />
+                <stop
+                   id="stop2254"
+                   style="stop-color:#d4d4d4;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop2255"
+                   style="stop-color:#dbdbdb;stop-opacity:0.93388432"
+                   offset="0.75" />
+                <stop
+                   id="stop12229"
+                   style="stop-color:#e2e2e2;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient2257"
+                 xlink:href="#linearGradient2540"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient12232">
+                <stop
+                   id="stop2259"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop12235"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2261">
+                <stop
+                   id="stop12238"
+                   style="stop-color:#000000;stop-opacity:0.24705882"
+                   offset="0" />
+                <stop
+                   id="stop12240"
+                   style="stop-color:#7f7f7f;stop-opacity:0"
+                   offset="0.8888889" />
+                <stop
+                   id="stop12242"
+                   style="stop-color:#ffffff;stop-opacity:0.61157024"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient12244">
+                <stop
+                   id="stop12246"
+                   style="stop-color:#727272;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop12248"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0.62207639" />
+                <stop
+                   id="stop2268"
+                   style="stop-color:#5a5a5a;stop-opacity:1"
+                   offset="0.63207638" />
+                <stop
+                   id="stop2269"
+                   style="stop-color:#dfdfdf;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient12252">
+                <stop
+                   id="stop2271"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2272"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.38868448"
+                 y1="0.14189366"
+                 x2="0.40888888"
+                 y2="0.359375"
+                 id="linearGradient12256"
+                 xlink:href="#linearGradient907" />
+              <linearGradient
+                 x1="7.3357119e-16"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient12258"
+                 xlink:href="#linearGradient857" />
+              <linearGradient
+                 x1="0.44311377"
+                 y1="0.45806453"
+                 x2="0.83832335"
+                 y2="0.60645163"
+                 id="linearGradient12260"
+                 xlink:href="#linearGradient857" />
+              <radialGradient
+                 cx="0.5"
+                 cy="0.5"
+                 r="0.5"
+                 fx="0.5"
+                 fy="0.5"
+                 id="radialGradient2276"
+                 xlink:href="#linearGradient844" />
+              <linearGradient
+                 x1="0.3904762"
+                 y1="1.015625"
+                 x2="0.4952381"
+                 y2="0.5703125"
+                 id="linearGradient57631"
+                 xlink:href="#linearGradient896" />
+              <linearGradient
+                 x1="0.20143886"
+                 y1="0.16406251"
+                 x2="0.79658836"
+                 y2="0.53374529"
+                 id="linearGradient12264"
+                 xlink:href="#linearGradient844" />
+              <linearGradient
+                 x1="-0.034482758"
+                 y1="0.140625"
+                 x2="1.2965517"
+                 y2="1.1328125"
+                 id="linearGradient12266"
+                 xlink:href="#linearGradient1047" />
+              <linearGradient
+                 x1="0.63358778"
+                 y1="0.9140625"
+                 x2="0.50381678"
+                 y2="0.515625"
+                 id="linearGradient12268"
+                 xlink:href="#linearGradient857" />
+              <linearGradient
+                 id="linearGradient12270"
+                 xlink:href="#linearGradient1454" />
+            </defs>
+            <defs
+               id="defs2326">
+              <linearGradient
+                 id="linearGradient12275">
+                <stop
+                   id="stop2328"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="0" />
+                <stop
+                   id="stop2329"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient12279">
+                <stop
+                   id="stop2331"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2332"
+                   style="stop-color:#9a9a9a;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2333">
+                <stop
+                   id="stop2334"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="0" />
+                <stop
+                   id="stop2335"
+                   style="stop-color:#000000;stop-opacity:0.28125"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2336">
+                <stop
+                   id="stop2337"
+                   style="stop-color:#9d8f6a;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2338"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0.496198" />
+                <stop
+                   id="stop2339"
+                   style="stop-color:#bfb5a5;stop-opacity:1"
+                   offset="0.52539647" />
+                <stop
+                   id="stop2340"
+                   style="stop-color:#f7f7f7;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2341">
+                <stop
+                   id="stop2342"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="0" />
+                <stop
+                   id="stop2343"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop2344"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient12295">
+                <stop
+                   id="stop2346"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop12298"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="28.813946"
+                 y1="221.79578"
+                 x2="10.582993"
+                 y2="235.65099"
+                 id="linearGradient2348"
+                 xlink:href="#linearGradient1551"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.709409,0.584998)" />
+              <linearGradient
+                 x1="55.601124"
+                 y1="-30.810305"
+                 x2="40.876816"
+                 y2="218.58856"
+                 id="linearGradient2349"
+                 xlink:href="#linearGradient1454"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.082134,0.9241)" />
+              <linearGradient
+                 id="linearGradient2350"
+                 xlink:href="#linearGradient1502" />
+              <linearGradient
+                 x1="55.239422"
+                 y1="97.356407"
+                 x2="25.40143"
+                 y2="29.790384"
+                 id="linearGradient2351"
+                 xlink:href="#linearGradient1461"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.942585,1.060912)" />
+              <linearGradient
+                 x1="66.679367"
+                 y1="28.158081"
+                 x2="66.679367"
+                 y2="107.53253"
+                 id="linearGradient2352"
+                 xlink:href="#linearGradient1494"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.1618,0.860733)" />
+              <linearGradient
+                 x1="47.242912"
+                 y1="77.450203"
+                 x2="109.62949"
+                 y2="76.102692"
+                 id="linearGradient12305"
+                 xlink:href="#linearGradient1461"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.1618,0.860733)" />
+              <linearGradient
+                 x1="55.045113"
+                 y1="85.877014"
+                 x2="109.27901"
+                 y2="88.11335"
+                 id="linearGradient2356"
+                 xlink:href="#linearGradient1461"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.162536,0.860189)" />
+              <linearGradient
+                 x1="48.88829"
+                 y1="90.157753"
+                 x2="99.629562"
+                 y2="86.570915"
+                 id="linearGradient2357"
+                 xlink:href="#linearGradient1461"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.162115,0.8605)" />
+              <linearGradient
+                 x1="71.901497"
+                 y1="69.209007"
+                 x2="85.293274"
+                 y2="102.17883"
+                 id="linearGradient2359"
+                 xlink:href="#linearGradient1494"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.179599,0.847746)" />
+              <linearGradient
+                 x1="64.116882"
+                 y1="47.803505"
+                 x2="37.547989"
+                 y2="140.37704"
+                 id="linearGradient57670"
+                 xlink:href="#linearGradient1546"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.329487,0.75217)" />
+              <linearGradient
+                 x1="53.647789"
+                 y1="101.89593"
+                 x2="53.647789"
+                 y2="160.91232"
+                 id="linearGradient2362"
+                 xlink:href="#linearGradient1494"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.289244,0.775649)" />
+              <linearGradient
+                 x1="69.363586"
+                 y1="56.763401"
+                 x2="71.684402"
+                 y2="101.294"
+                 id="linearGradient2363"
+                 xlink:href="#linearGradient1494"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.20398,0.830579)" />
+              <linearGradient
+                 x1="177.86378"
+                 y1="181.4277"
+                 x2="197.19272"
+                 y2="298.17694"
+                 id="linearGradient2364"
+                 xlink:href="#linearGradient1502"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.036891,0.964422)" />
+              <linearGradient
+                 x1="57.724483"
+                 y1="184.34286"
+                 x2="55.957409"
+                 y2="144.17274"
+                 id="linearGradient2365"
+                 xlink:href="#linearGradient1502"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.636328,0.611124)" />
+              <linearGradient
+                 x1="83.123482"
+                 y1="92.632271"
+                 x2="77.120087"
+                 y2="56.941833"
+                 id="linearGradient2366"
+                 xlink:href="#linearGradient1494"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.162115,0.8605)" />
+              <linearGradient
+                 id="linearGradient2367"
+                 xlink:href="#linearGradient1551" />
+            </defs>
+          </defs>
+        </defs>
+        <linearGradient
+           x1="37.525757"
+           y1="16.111349"
+           x2="146.28969"
+           y2="142.63091"
+           id="linearGradient3101"
+           xlink:href="#linearGradient7796"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.887702,0,0,0.887702,8.921979,8.690512)" />
+      </defs>
+      <linearGradient
+         x1="-191.46153"
+         y1="37.372372"
+         x2="-165.58835"
+         y2="37.372372"
+         id="linearGradient4684"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient4685"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient4686"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="88.712402"
+         y1="138.15012"
+         x2="104.81104"
+         y2="151.63045"
+         id="linearGradient4687"
+         xlink:href="#linearGradient3305"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+      <radialGradient
+         cx="-77.367622"
+         cy="42.633839"
+         r="216.26619"
+         fx="-80.036034"
+         fy="44.468376"
+         id="radialGradient4688"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+      <radialGradient
+         cx="42.007256"
+         cy="39.007645"
+         r="11.574221"
+         fx="42.280807"
+         fy="39.410465"
+         id="radialGradient4689"
+         xlink:href="#linearGradient1971"
+         gradientUnits="userSpaceOnUse" />
+      <radialGradient
+         cx="42.007256"
+         cy="39.007645"
+         r="11.574221"
+         fx="42.280807"
+         fy="39.410465"
+         id="radialGradient4690"
+         xlink:href="#linearGradient1971"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="304.42606"
+         y1="60.467949"
+         x2="115.38673"
+         y2="15.117607"
+         id="linearGradient12332"
+         xlink:href="#linearGradient1971"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.502124,1.99154)" />
+      <linearGradient
+         x1="-39.125107"
+         y1="-104.45421"
+         x2="48.062748"
+         y2="120.12055"
+         id="linearGradient12334"
+         xlink:href="#linearGradient2248"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.791243,1.263834)" />
+      <defs
+         id="defs4518">
+        <linearGradient
+           id="linearGradient4519">
+          <stop
+             id="stop12338"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop4521"
+             style="stop-color:#fafbff;stop-opacity:1"
+             offset="0.25" />
+          <stop
+             id="stop12341"
+             style="stop-color:#f0f2fa;stop-opacity:1"
+             offset="0.5" />
+          <stop
+             id="stop12343"
+             style="stop-color:#e1e1e1;stop-opacity:1"
+             offset="0.75" />
+          <stop
+             id="stop12345"
+             style="stop-color:#f5f6ff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient4525">
+          <stop
+             id="stop12348"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop4527"
+             style="stop-color:#d0d1d9;stop-opacity:1"
+             offset="0.5" />
+          <stop
+             id="stop4528"
+             style="stop-color:#878b9b;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient4532">
+          <stop
+             id="stop4533"
+             style="stop-color:#e8e8e8;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop4534"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient12355"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <radialGradient
+           cx="-77.367622"
+           cy="42.633839"
+           r="216.26619"
+           fx="-80.036034"
+           fy="44.468376"
+           id="radialGradient4537"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+        <defs
+           id="defs4538">
+          <linearGradient
+             id="linearGradient4539">
+            <stop
+               id="stop4540"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4541"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient57715">
+            <stop
+               id="stop4543"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop57718"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop4545"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop12366"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop12368"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient12370">
+            <stop
+               id="stop4549"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4550"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient4551"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient4552"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <radialGradient
+             cx="4.9853168"
+             cy="108.47158"
+             r="34.222183"
+             fx="5.2520976"
+             fy="108.73115"
+             id="radialGradient4553"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="36.826332"
+             y1="75.332558"
+             x2="25.761681"
+             y2="135.90358"
+             id="linearGradient12377"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+          <linearGradient
+             x1="78.675774"
+             y1="47.411823"
+             x2="64.05336"
+             y2="34.302757"
+             id="linearGradient12379"
+             xlink:href="#linearGradient4281"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+          <defs
+             id="defs12381">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient12383"
+               xlink:href="#linearGradient3296"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+          </defs>
+        </defs>
+        <linearGradient
+           x1="88.712402"
+           y1="138.15012"
+           x2="104.81104"
+           y2="151.63045"
+           id="linearGradient4575"
+           xlink:href="#linearGradient3305"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        <defs
+           id="defs12390">
+          <linearGradient
+             id="linearGradient12392">
+            <stop
+               id="stop12394"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop12396"
+               style="stop-color:#ffffff;stop-opacity:0.56179774"
+               offset="0.50793612" />
+            <stop
+               id="stop12398"
+               style="stop-color:#ffffff;stop-opacity:0.13725491"
+               offset="0.79061538" />
+            <stop
+               id="stop12400"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient12402">
+            <stop
+               id="stop12404"
+               style="stop-color:#ae1b1b;stop-opacity:0.99215686"
+               offset="0" />
+            <stop
+               id="stop12406"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4593">
+            <stop
+               id="stop12409"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop12411"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4596">
+            <stop
+               id="stop12414"
+               style="stop-color:#000000;stop-opacity:0.40784314"
+               offset="0" />
+            <stop
+               id="stop12416"
+               style="stop-color:#000000;stop-opacity:0.07344633"
+               offset="0.6477778" />
+            <stop
+               id="stop4599"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="0.50522649"
+             cy="0.54545456"
+             r="0.46065515"
+             fx="0.51611376"
+             fy="0.56148684"
+             id="radialGradient12419"
+             xlink:href="#linearGradient1806" />
+          <linearGradient
+             x1="1.9047619"
+             y1="0.79545456"
+             x2="-1.0952381"
+             y2="0.075757578"
+             id="linearGradient12425"
+             xlink:href="#linearGradient1806" />
+          <linearGradient
+             x1="-0.63529414"
+             y1="-1.2424242"
+             x2="0.25882354"
+             y2="1.060606"
+             id="linearGradient4604"
+             xlink:href="#linearGradient2248" />
+          <linearGradient
+             x1="0.46242774"
+             y1="0.32575756"
+             x2="0.41583115"
+             y2="0.32575756"
+             id="linearGradient12432"
+             xlink:href="#linearGradient1540" />
+          <linearGradient
+             x1="0.20784314"
+             y1="-2.0476191"
+             x2="0.54901963"
+             y2="0.60714287"
+             id="linearGradient12434"
+             xlink:href="#linearGradient2248" />
+          <radialGradient
+             cx="0.5"
+             cy="0.5"
+             r="0.5"
+             fx="0.5"
+             fy="0.5"
+             id="radialGradient12436"
+             xlink:href="#linearGradient1540" />
+        </defs>
+      </defs>
+    </defs>
+    <defs
+       id="defs1741">
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient12449"
+         xlink:href="#linearGradient14158"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         id="linearGradient12451">
+        <stop
+           id="stop12453"
+           style="stop-color:#e3f9ff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop12455"
+           style="stop-color:#8fb6cb;stop-opacity:1"
+           offset="0.36194703" />
+        <stop
+           id="stop12457"
+           style="stop-color:#438ec5;stop-opacity:1"
+           offset="0.62534887" />
+        <stop
+           id="stop12459"
+           style="stop-color:#477daf;stop-opacity:1"
+           offset="0.72607356" />
+        <stop
+           id="stop12461"
+           style="stop-color:#020407;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient12463">
+        <stop
+           id="stop12465"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop12467"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient12469">
+        <stop
+           id="stop12471"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop12473"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient12475">
+        <stop
+           id="stop12477"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop12479"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient12481">
+        <stop
+           id="stop12483"
+           style="stop-color:#000000;stop-opacity:0.67843139"
+           offset="0" />
+        <stop
+           id="stop12485"
+           style="stop-color:#000000;stop-opacity:0.32941177"
+           offset="0.56999999" />
+        <stop
+           id="stop12487"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient12489">
+        <stop
+           id="stop12491"
+           style="stop-color:#000000;stop-opacity:0.30578512"
+           offset="0" />
+        <stop
+           id="stop12493"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient12495">
+        <stop
+           id="stop12497"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop12499"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient12501">
+        <stop
+           id="stop12503"
+           style="stop-color:#e3f9ff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop12505"
+           style="stop-color:#73bee7;stop-opacity:1"
+           offset="0.36194703" />
+        <stop
+           id="stop12507"
+           style="stop-color:#438ec5;stop-opacity:1"
+           offset="0.62534887" />
+        <stop
+           id="stop12509"
+           style="stop-color:#477daf;stop-opacity:1"
+           offset="0.72607356" />
+        <stop
+           id="stop12511"
+           style="stop-color:#020407;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient12513">
+        <stop
+           id="stop12515"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop56630"
+           style="stop-color:#1d1d1d;stop-opacity:0.56078434"
+           offset="0.3804014" />
+        <stop
+           id="stop12519"
+           style="stop-color:#000000;stop-opacity:0.30208334"
+           offset="0.510472" />
+        <stop
+           id="stop12521"
+           style="stop-color:#000000;stop-opacity:0.21568628"
+           offset="0.64054263" />
+        <stop
+           id="stop12523"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <radialGradient
+         cx="227.00549"
+         cy="477.83307"
+         r="200.73203"
+         fx="240.38737"
+         fy="325.7662"
+         id="radialGradient12525"
+         xlink:href="#linearGradient1764"
+         gradientUnits="userSpaceOnUse" />
+      <radialGradient
+         cx="79.895966"
+         cy="77.944687"
+         r="68.379425"
+         fx="79.895966"
+         fy="77.944687"
+         id="radialGradient12527"
+         xlink:href="#linearGradient1770"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="0.72887325"
+         y1="-0.060344826"
+         x2="0.35915494"
+         y2="0.27586207"
+         id="linearGradient12529"
+         xlink:href="#linearGradient865" />
+      <linearGradient
+         x1="178.42355"
+         y1="199.48994"
+         x2="88.360741"
+         y2="112.48578"
+         id="linearGradient12531"
+         xlink:href="#linearGradient1761"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.069323,0,0,0.935172,-225,0)" />
+      <linearGradient
+         x1="43.39798"
+         y1="-53.39077"
+         x2="38.977112"
+         y2="40.053986"
+         id="linearGradient12533"
+         xlink:href="#linearGradient1755"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="77.291656"
+         y1="180.92995"
+         x2="53.211624"
+         y2="24.17461"
+         id="linearGradient12535"
+         xlink:href="#linearGradient1758"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         id="linearGradient12537"
+         xlink:href="#linearGradient1012" />
+      <linearGradient
+         x1="52.683483"
+         y1="104.09244"
+         x2="58.380398"
+         y2="252.54866"
+         id="linearGradient1481"
+         xlink:href="#linearGradient2678"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.334689,0,0,1.038479,-0.72121,-66.60727)" />
+      <linearGradient
+         x1="52.19524"
+         y1="64.818008"
+         x2="52.19524"
+         y2="122.69208"
+         id="linearGradient1482"
+         xlink:href="#linearGradient2689"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.111523,0,0,0.771568,-0.72121,-29.98157)" />
+      <linearGradient
+         x1="29.958502"
+         y1="-23.328955"
+         x2="29.958502"
+         y2="190.05157"
+         id="linearGradient1483"
+         xlink:href="#linearGradient2678"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.127153,0,0,0.781382,0.981463,-27.99057)" />
+      <linearGradient
+         x1="96.41098"
+         y1="57.341877"
+         x2="81.065781"
+         y2="196.048"
+         id="linearGradient1484"
+         xlink:href="#linearGradient2871"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.176531,0,0,0.821515,0,4.496065)" />
+      <linearGradient
+         x1="84.960785"
+         y1="92.151367"
+         x2="42.64373"
+         y2="53.360722"
+         id="linearGradient1496"
+         xlink:href="#linearGradient1749"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.321949,0.756459)" />
+      <linearGradient
+         x1="31.82851"
+         y1="61.778381"
+         x2="33.198818"
+         y2="6.859036"
+         id="linearGradient56647"
+         xlink:href="#linearGradient2678"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+      <linearGradient
+         x1="186.07457"
+         y1="23.533224"
+         x2="202.6377"
+         y2="23.47304"
+         id="linearGradient1498"
+         xlink:href="#linearGradient2689"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.388045,2.57702)" />
+      <linearGradient
+         x1="92.631454"
+         y1="54.989693"
+         x2="92.631454"
+         y2="50.608093"
+         id="linearGradient56650"
+         xlink:href="#linearGradient1757"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.787838,1.269296)" />
+      <linearGradient
+         x1="133.07144"
+         y1="28.231943"
+         x2="118.58411"
+         y2="13.431207"
+         id="linearGradient1500"
+         xlink:href="#linearGradient2678"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+      <linearGradient
+         x1="1270.3132"
+         y1="4.8765283"
+         x2="1247.6848"
+         y2="0.72310239"
+         id="linearGradient56653"
+         xlink:href="#linearGradient2678"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(9.440723e-2,10.59241)" />
+      <linearGradient
+         x1="1270.3132"
+         y1="4.8765283"
+         x2="1247.6848"
+         y2="0.72310239"
+         id="linearGradient1502"
+         xlink:href="#linearGradient2678"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+      <defs
+         id="defs1176">
+        <linearGradient
+           id="linearGradient12551">
+          <stop
+             id="stop12553"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop12555"
+             style="stop-color:#ffffff;stop-opacity:0.35164836"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient12557">
+          <stop
+             id="stop12559"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop12561"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient12563">
+          <stop
+             id="stop12565"
+             style="stop-color:#7e818c;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop12567"
+             style="stop-color:#d5dbed;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="-191.46153"
+           y1="37.372372"
+           x2="-165.58835"
+           y2="37.372372"
+           id="linearGradient12569"
+           xlink:href="#linearGradient2678"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient12571"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient12573"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <linearGradient
+           x1="88.712402"
+           y1="138.15012"
+           x2="104.81104"
+           y2="151.63045"
+           id="linearGradient56669"
+           xlink:href="#linearGradient3305"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        <radialGradient
+           cx="-77.367622"
+           cy="42.633839"
+           r="216.26619"
+           fx="-80.036034"
+           fy="44.468376"
+           id="radialGradient12576"
+           xlink:href="#linearGradient2678"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+        <linearGradient
+           x1="100.76616"
+           y1="77.379333"
+           x2="125.25793"
+           y2="77.379333"
+           id="linearGradient12578"
+           xlink:href="#linearGradient1926"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+        <linearGradient
+           x1="104.09006"
+           y1="83.359146"
+           x2="123.82494"
+           y2="70.956947"
+           id="linearGradient56673"
+           xlink:href="#linearGradient1926"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+        <linearGradient
+           x1="100.76616"
+           y1="77.379333"
+           x2="125.25793"
+           y2="77.379333"
+           id="linearGradient12581"
+           xlink:href="#linearGradient1926"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+        <linearGradient
+           x1="10.145814"
+           y1="21.762129"
+           x2="19.678274"
+           y2="15.811033"
+           id="linearGradient12583"
+           xlink:href="#linearGradient1930"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+        <linearGradient
+           x1="226.35037"
+           y1="198.74835"
+           x2="174.43694"
+           y2="217.6319"
+           id="linearGradient12585"
+           xlink:href="#linearGradient1926"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.959874,1.041804)" />
+        <linearGradient
+           x1="97.345161"
+           y1="112.84396"
+           x2="99.20697"
+           y2="115.81121"
+           id="linearGradient12587"
+           xlink:href="#linearGradient2560"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.206907,0.828564)"
+           spreadMethod="reflect" />
+        <linearGradient
+           x1="-13.15085"
+           y1="250.48668"
+           x2="-5.590662"
+           y2="258.31036"
+           id="linearGradient12589"
+           xlink:href="#linearGradient2560"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+        <linearGradient
+           x1="240.97612"
+           y1="200.61511"
+           x2="231.89941"
+           y2="205.45764"
+           id="linearGradient12591"
+           xlink:href="#linearGradient1884"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.866855,1.153596)" />
+        <linearGradient
+           x1="7.1050277"
+           y1="221.98289"
+           x2="46.488174"
+           y2="259.94464"
+           id="linearGradient12593"
+           xlink:href="#linearGradient1884"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+        <linearGradient
+           x1="7.1050277"
+           y1="221.98289"
+           x2="46.488174"
+           y2="259.94464"
+           id="linearGradient12595"
+           xlink:href="#linearGradient1884"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+        <defs
+           id="defs12597">
+          <linearGradient
+             id="linearGradient12599">
+            <stop
+               id="stop12601"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop12603"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient12605">
+            <stop
+               id="stop12607"
+               style="stop-color:#c86f32;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop12609"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient12611">
+            <stop
+               id="stop12613"
+               style="stop-color:#d88721;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop12615"
+               style="stop-color:#a85c00;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop12617"
+               style="stop-color:#643e0e;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient12619">
+            <stop
+               id="stop12621"
+               style="stop-color:#868686;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop12623"
+               style="stop-color:#e2e2e2;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient12625">
+            <stop
+               id="stop12627"
+               style="stop-color:#ff9870;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop12629"
+               style="stop-color:#ffd8c9;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient12631">
+            <stop
+               id="stop12633"
+               style="stop-color:#ffd7c0;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop12635"
+               style="stop-color:#ffbc96;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient12637">
+            <stop
+               id="stop12639"
+               style="stop-color:#ffbc96;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop12641"
+               style="stop-color:#ffeafe;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient12643">
+            <stop
+               id="stop12645"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop12647"
+               style="stop-color:#fafbff;stop-opacity:1"
+               offset="0.25" />
+            <stop
+               id="stop12649"
+               style="stop-color:#f0f2fa;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop12651"
+               style="stop-color:#e1e1e1;stop-opacity:1"
+               offset="0.75" />
+            <stop
+               id="stop12653"
+               style="stop-color:#f5f6ff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient12655">
+            <stop
+               id="stop12657"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop12659"
+               style="stop-color:#d0d1d9;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop12661"
+               style="stop-color:#878b9b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient12663">
+            <stop
+               id="stop12665"
+               style="stop-color:#e8e8e8;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop12667"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient1868"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient12670"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <defs
+             id="defs12672">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient12674"
+               xlink:href="#linearGradient1884"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient1872">
+              <stop
+                 id="stop12677"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop12679"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop12681"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop12683"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop12685"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient12687">
+              <stop
+                 id="stop12689"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop12691"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient12693"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient12695"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient12697"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient12699"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient12701"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs12703">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient12705"
+                 xlink:href="#linearGradient3296"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+            </defs>
+          </defs>
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient12729"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          <defs
+             id="defs12731">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient12733"
+               xlink:href="#linearGradient1863"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient12735"
+               xlink:href="#linearGradient2560"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient12737"
+               xlink:href="#linearGradient1926"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient12743"
+               xlink:href="#linearGradient1302"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="96.346039"
+               y1="84.428337"
+               x2="121.44556"
+               y2="65.093857"
+               id="linearGradient12745"
+               xlink:href="#linearGradient1716"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.962035,0,0,1.039463,0.899729,-0.17995)" />
+            <linearGradient
+               x1="104.09006"
+               y1="83.359146"
+               x2="123.82494"
+               y2="70.956947"
+               id="linearGradient12747"
+               xlink:href="#linearGradient1724"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.028242,0.972534)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient12749"
+               xlink:href="#linearGradient1724"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.028607,0.972188)" />
+            <linearGradient
+               x1="97.345161"
+               y1="112.84396"
+               x2="99.20697"
+               y2="115.81121"
+               id="linearGradient12751"
+               xlink:href="#linearGradient1741"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.206907,0.828564)"
+               spreadMethod="reflect" />
+            <linearGradient
+               x1="168.2516"
+               y1="181.01073"
+               x2="185.96996"
+               y2="172.51707"
+               id="linearGradient12753"
+               xlink:href="#linearGradient4873"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.959874,0,0,1.041804,24.17578,34.86402)" />
+            <linearGradient
+               x1="97.281265"
+               y1="84.255211"
+               x2="127.84677"
+               y2="61.142742"
+               id="linearGradient12755"
+               xlink:href="#linearGradient1716"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.962035,1.039463)" />
+            <linearGradient
+               x1="104.09006"
+               y1="83.359146"
+               x2="123.82494"
+               y2="70.956947"
+               id="linearGradient12757"
+               xlink:href="#linearGradient1724"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.028242,0.972534)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient12761"
+               xlink:href="#linearGradient1724"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.028607,0.972188)" />
+            <linearGradient
+               x1="97.281265"
+               y1="84.255211"
+               x2="127.84677"
+               y2="61.142742"
+               id="linearGradient12763"
+               xlink:href="#linearGradient1716"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.962035,1.039463)" />
+          </defs>
+          <linearGradient
+             x1="104.09006"
+             y1="83.359146"
+             x2="123.82494"
+             y2="70.956947"
+             id="linearGradient12769"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+          <linearGradient
+             x1="100.76616"
+             y1="77.379333"
+             x2="125.25793"
+             y2="77.379333"
+             id="linearGradient12771"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+          <linearGradient
+             x1="10.145814"
+             y1="21.762129"
+             x2="19.678274"
+             y2="15.811033"
+             id="linearGradient12773"
+             xlink:href="#linearGradient1930"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+          <linearGradient
+             x1="226.35037"
+             y1="198.74835"
+             x2="174.43694"
+             y2="217.6319"
+             id="linearGradient12775"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.959874,1.041804)" />
+          <linearGradient
+             x1="97.345161"
+             y1="112.84396"
+             x2="99.20697"
+             y2="115.81121"
+             id="linearGradient12777"
+             xlink:href="#linearGradient2560"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.206907,0.828564)"
+             spreadMethod="reflect" />
+          <linearGradient
+             x1="-94.151642"
+             y1="379.97745"
+             x2="-100.4097"
+             y2="374.03232"
+             id="linearGradient12779"
+             xlink:href="#linearGradient1870"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.088448,0.91874)" />
+          <linearGradient
+             x1="-13.15085"
+             y1="250.48668"
+             x2="-5.590662"
+             y2="258.31036"
+             id="linearGradient12781"
+             xlink:href="#linearGradient2560"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+          <linearGradient
+             x1="240.97612"
+             y1="200.61511"
+             x2="231.89941"
+             y2="205.45764"
+             id="linearGradient12783"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.866855,1.153596)" />
+          <linearGradient
+             x1="7.1050277"
+             y1="221.98289"
+             x2="46.488174"
+             y2="259.94464"
+             id="linearGradient12785"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+          <linearGradient
+             x1="7.1050277"
+             y1="221.98289"
+             x2="46.488174"
+             y2="259.94464"
+             id="linearGradient12787"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+        </defs>
+      </defs>
+    </defs>
+    <linearGradient
+       id="linearGradient14141">
+      <stop
+         id="stop14143"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop14142"
+         style="stop-color:#606060;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient14158">
+      <stop
+         id="stop14161"
+         style="stop-color:#000000;stop-opacity:0.67843139"
+         offset="0" />
+      <stop
+         id="stop14160"
+         style="stop-color:#000000;stop-opacity:0.32941177"
+         offset="0.56999999" />
+      <stop
+         id="stop14159"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient18210">
+      <stop
+         id="stop18212"
+         style="stop-color:#ffffff;stop-opacity:0.86813188"
+         offset="0.0056" />
+      <stop
+         id="stop18211"
+         style="stop-color:#ffffff;stop-opacity:0.00549451"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient16964">
+      <stop
+         id="stop16967"
+         style="stop-color:#a3a5a5;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop16966"
+         style="stop-color:#e3e6e6;stop-opacity:1"
+         offset="0.5" />
+      <stop
+         id="stop16965"
+         style="stop-color:#a3a5a5;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2355">
+      <stop
+         id="stop2359"
+         style="stop-color:#b18e4b;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2358"
+         style="stop-color:#f7dca0;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="399.5"
+       y1="347"
+       x2="399.5"
+       y2="352.55652"
+       id="linearGradient1531"
+       xlink:href="#linearGradient2353"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="84.960785"
+       y1="92.151367"
+       x2="42.64373"
+       y2="53.360722"
+       id="linearGradient2204"
+       xlink:href="#linearGradient1749"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.321949,0.756459)" />
+    <linearGradient
+       x1="186.07457"
+       y1="23.533224"
+       x2="202.6377"
+       y2="23.47304"
+       id="linearGradient2206"
+       xlink:href="#linearGradient2354"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.388045,2.57702)" />
+    <linearGradient
+       x1="74.915154"
+       y1="289.24429"
+       x2="74.915154"
+       y2="143.41141"
+       id="linearGradient2208"
+       xlink:href="#linearGradient869"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.402029,0.713252)" />
+    <defs
+       id="defs2054">
+      <linearGradient
+         id="linearGradient1757">
+        <stop
+           id="stop1758"
+           style="stop-color:#4d90fa;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop55356"
+           style="stop-color:#4d90fa;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient1749">
+        <stop
+           id="stop1750"
+           style="stop-color:#000000;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop1751"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient55361">
+        <stop
+           id="stop55363"
+           style="stop-color:#b18e4b;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop55365"
+           style="stop-color:#f7dca0;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient55367">
+        <stop
+           id="stop2065"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop55370"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient55372">
+        <stop
+           id="stop55374"
+           style="stop-color:#000000;stop-opacity:0.14835165"
+           offset="0" />
+        <stop
+           id="stop55376"
+           style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+           offset="0.5" />
+        <stop
+           id="stop55378"
+           style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+           offset="0.75" />
+        <stop
+           id="stop55380"
+           style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+           offset="0.875" />
+        <stop
+           id="stop55382"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient55384"
+         xlink:href="#linearGradient2355"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <radialGradient
+         cx="23.756607"
+         cy="60.078049"
+         r="21.026033"
+         fx="23.756607"
+         fy="60.078049"
+         id="radialGradient1717"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+      <linearGradient
+         x1="31.82851"
+         y1="61.778381"
+         x2="33.198818"
+         y2="6.859036"
+         id="linearGradient1718"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+      <radialGradient
+         cx="92.478806"
+         cy="20.827066"
+         r="45.889046"
+         fx="92.478806"
+         fy="20.827066"
+         id="radialGradient1719"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+      <linearGradient
+         x1="133.07144"
+         y1="28.231943"
+         x2="118.58411"
+         y2="13.431207"
+         id="linearGradient55389"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+      <linearGradient
+         x1="108.49871"
+         y1="17.573528"
+         x2="185.22578"
+         y2="24.330959"
+         id="linearGradient1721"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+      <linearGradient
+         x1="28.814428"
+         y1="-1.616316"
+         x2="47.366039"
+         y2="22.769617"
+         id="linearGradient2081"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.764292,1.3084)" />
+      <linearGradient
+         x1="30.722504"
+         y1="28.135216"
+         x2="39.78149"
+         y2="27.315481"
+         id="linearGradient55393"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.475459,2.103232)" />
+      <linearGradient
+         x1="30.382267"
+         y1="7.5329666"
+         x2="47.366039"
+         y2="22.769617"
+         id="linearGradient55395"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+      <linearGradient
+         x1="25.954844"
+         y1="25.071495"
+         x2="39.781502"
+         y2="27.315489"
+         id="linearGradient55397"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.475459,2.103231)" />
+      <linearGradient
+         x1="74.915154"
+         y1="289.24429"
+         x2="74.915154"
+         y2="143.41141"
+         id="linearGradient1206"
+         xlink:href="#linearGradient869"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.402029,0.713252)" />
+      <linearGradient
+         x1="66.81208"
+         y1="253.09772"
+         x2="66.81208"
+         y2="329.44394"
+         id="linearGradient1207"
+         xlink:href="#linearGradient883"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.599772,0.625089)" />
+      <linearGradient
+         x1="114.98484"
+         y1="133.38522"
+         x2="114.98484"
+         y2="15.619798"
+         id="linearGradient1208"
+         xlink:href="#linearGradient875"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.93614,1.068216)" />
+      <linearGradient
+         x1="76.700623"
+         y1="73.338425"
+         x2="76.700623"
+         y2="20.345196"
+         id="linearGradient1209"
+         xlink:href="#linearGradient940"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.099362,0.909619)" />
+      <defs
+         id="defs900">
+        <linearGradient
+           id="linearGradient883">
+          <stop
+             id="stop55406"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="0" />
+          <stop
+             id="stop886"
+             style="stop-color:#ffffff;stop-opacity:0.01568628"
+             offset="0.25315788" />
+          <stop
+             id="stop55409"
+             style="stop-color:#ffffff;stop-opacity:0.69999999"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient875">
+          <stop
+             id="stop876"
+             style="stop-color:#e28700;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop877"
+             style="stop-color:#ffdbaf;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient872">
+          <stop
+             id="stop873"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="0" />
+          <stop
+             id="stop874"
+             style="stop-color:#ffffff;stop-opacity:0.57254905"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient869">
+          <stop
+             id="stop870"
+             style="stop-color:#5ea730;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop55419"
+             style="stop-color:#8eef2c;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient940">
+          <stop
+             id="stop941"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="0" />
+          <stop
+             id="stop943"
+             style="stop-color:#ffffff;stop-opacity:0.49193549"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient930">
+          <stop
+             id="stop931"
+             style="stop-color:#000000;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop934"
+             style="stop-color:#000000;stop-opacity:0.76612902"
+             offset="0.87947369" />
+          <stop
+             id="stop932"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient909">
+          <stop
+             id="stop910"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="0" />
+          <stop
+             id="stop911"
+             style="stop-color:#ffffff;stop-opacity:0.57254905"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient903">
+          <stop
+             id="stop904"
+             style="stop-color:#dddddd;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop905"
+             style="stop-color:#f5f5f5;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0.49285713"
+           y1="0.98591548"
+           x2="0.49285713"
+           y2="7.0833374e-16"
+           id="linearGradient906"
+           xlink:href="#linearGradient869" />
+        <linearGradient
+           x1="0.46031743"
+           y1="0.98591542"
+           x2="0.46031743"
+           y2="0.0070422594"
+           id="linearGradient908"
+           xlink:href="#linearGradient875" />
+        <linearGradient
+           x1="0.48823529"
+           y1="1.0070423"
+           x2="0.48823529"
+           y2="-0.0070422534"
+           id="linearGradient914"
+           xlink:href="#linearGradient940" />
+        <linearGradient
+           x1="0.49224809"
+           y1="0.0070421356"
+           x2="0.49224809"
+           y2="0.99295789"
+           id="linearGradient929"
+           xlink:href="#linearGradient883" />
+        <radialGradient
+           cx="0.5"
+           cy="0.5"
+           r="0.5"
+           fx="0.5"
+           fy="0.5"
+           id="radialGradient933"
+           xlink:href="#linearGradient930" />
+      </defs>
+      <linearGradient
+         x1="114.98484"
+         y1="133.38522"
+         x2="114.98484"
+         y2="15.619798"
+         id="linearGradient55440"
+         xlink:href="#linearGradient875"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.93614,1.068216)" />
+      <linearGradient
+         x1="76.700623"
+         y1="73.338425"
+         x2="76.700623"
+         y2="20.345196"
+         id="linearGradient55442"
+         xlink:href="#linearGradient940"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.099362,0.909619)" />
+      <linearGradient
+         x1="74.915154"
+         y1="289.24429"
+         x2="74.915154"
+         y2="143.41141"
+         id="linearGradient1301"
+         xlink:href="#linearGradient869"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.402029,0.713252)" />
+      <linearGradient
+         x1="66.81208"
+         y1="253.09772"
+         x2="66.81208"
+         y2="329.44394"
+         id="linearGradient55445"
+         xlink:href="#linearGradient883"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.599772,0.625089)" />
+    </defs>
+    <defs
+       id="defs2370">
+      <linearGradient
+         id="linearGradient6942">
+        <stop
+           id="stop6944"
+           style="stop-color:#000000;stop-opacity:0.3137255"
+           offset="0" />
+        <stop
+           id="stop6943"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient2374">
+        <stop
+           id="stop2207"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop2208"
+           style="stop-color:#89a2bb;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient2186">
+        <stop
+           id="stop2188"
+           style="stop-color:#63b5e8;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop52072"
+           style="stop-color:#001b7b;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient52074">
+        <stop
+           id="stop1558"
+           style="stop-color:#001b7b;stop-opacity:1"
+           offset="0.00562" />
+        <stop
+           id="stop1557"
+           style="stop-color:#0093dd;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient52078">
+        <stop
+           id="stop52080"
+           style="stop-color:#000000;stop-opacity:0.67843139"
+           offset="0" />
+        <stop
+           id="stop52082"
+           style="stop-color:#000000;stop-opacity:0.32941177"
+           offset="0.56999999" />
+        <stop
+           id="stop52084"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient52086">
+        <stop
+           id="stop52088"
+           style="stop-color:#e3f9ff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop52090"
+           style="stop-color:#73bee7;stop-opacity:1"
+           offset="0.36194703" />
+        <stop
+           id="stop52092"
+           style="stop-color:#438ec5;stop-opacity:1"
+           offset="0.62534887" />
+        <stop
+           id="stop52094"
+           style="stop-color:#477daf;stop-opacity:1"
+           offset="0.72607356" />
+        <stop
+           id="stop52096"
+           style="stop-color:#020407;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient52098">
+        <stop
+           id="stop52100"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop52102"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient52104">
+        <stop
+           id="stop52106"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop52108"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient52110">
+        <stop
+           id="stop52112"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop52114"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient1400">
+        <stop
+           id="stop1401"
+           style="stop-color:#000000;stop-opacity:0.67843139"
+           offset="0" />
+        <stop
+           id="stop1403"
+           style="stop-color:#000000;stop-opacity:0.32941177"
+           offset="0.56999999" />
+        <stop
+           id="stop1402"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient52120">
+        <stop
+           id="stop52122"
+           style="stop-color:#000000;stop-opacity:0.30578512"
+           offset="0" />
+        <stop
+           id="stop52124"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient52126">
+        <stop
+           id="stop52128"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop52130"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient853">
+        <stop
+           id="stop52133"
+           style="stop-color:#e3f9ff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop867"
+           style="stop-color:#73bee7;stop-opacity:1"
+           offset="0.36194703" />
+        <stop
+           id="stop856"
+           style="stop-color:#438ec5;stop-opacity:1"
+           offset="0.62534887" />
+        <stop
+           id="stop1185"
+           style="stop-color:#477daf;stop-opacity:1"
+           offset="0.72607356" />
+        <stop
+           id="stop855"
+           style="stop-color:#020407;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient52139">
+        <stop
+           id="stop850"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop861"
+           style="stop-color:#1d1d1d;stop-opacity:0.56078434"
+           offset="0.3804014" />
+        <stop
+           id="stop862"
+           style="stop-color:#000000;stop-opacity:0.30208334"
+           offset="0.510472" />
+        <stop
+           id="stop860"
+           style="stop-color:#000000;stop-opacity:0.21568628"
+           offset="0.64054263" />
+        <stop
+           id="stop52145"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <radialGradient
+         cx="227.00549"
+         cy="477.83307"
+         r="200.73203"
+         fx="240.38737"
+         fy="325.7662"
+         id="radialGradient852"
+         xlink:href="#linearGradient1764"
+         gradientUnits="userSpaceOnUse" />
+      <radialGradient
+         cx="79.895966"
+         cy="77.944687"
+         r="68.379425"
+         fx="79.895966"
+         fy="77.944687"
+         id="radialGradient858"
+         xlink:href="#linearGradient1770"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="105.80702"
+         y1="25.611177"
+         x2="82.344437"
+         y2="46.947098"
+         id="linearGradient52149"
+         xlink:href="#linearGradient865"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.108489,0.902129)" />
+      <linearGradient
+         x1="178.42355"
+         y1="199.48994"
+         x2="88.360741"
+         y2="112.48578"
+         id="linearGradient52151"
+         xlink:href="#linearGradient1761"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.069323,0,0,0.935172,-225,0)" />
+      <linearGradient
+         x1="43.39798"
+         y1="-53.39077"
+         x2="38.977112"
+         y2="40.053986"
+         id="linearGradient1010"
+         xlink:href="#linearGradient1755"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="77.291656"
+         y1="180.92995"
+         x2="53.211624"
+         y2="24.17461"
+         id="linearGradient1011"
+         xlink:href="#linearGradient1758"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         id="linearGradient871"
+         xlink:href="#linearGradient1012" />
+      <defs
+         id="defs300">
+        <linearGradient
+           x1="217.86621"
+           y1="217.28516"
+           x2="7.1352701"
+           y2="6.5542202"
+           id="path1065_2_"
+           gradientUnits="userSpaceOnUse">
+          <stop
+             id="stop85"
+             style="stop-color:#3c5c82;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop87"
+             style="stop-color:#001b7b;stop-opacity:1"
+             offset="1" />
+          <midPointStop
+             id="midPointStop89"
+             style="stop-color:#0053BD"
+             offset="0" />
+          <midPointStop
+             id="midPointStop91"
+             style="stop-color:#0053BD"
+             offset="0.5" />
+          <midPointStop
+             id="midPointStop93"
+             style="stop-color:#00008D"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="214.27441"
+           y1="213.71484"
+           x2="10.72779"
+           y2="10.16822"
+           id="XMLID_1_"
+           gradientUnits="userSpaceOnUse">
+          <stop
+             id="stop100"
+             style="stop-color:#0068c6;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop102"
+             style="stop-color:#3c5cb2;stop-opacity:1"
+             offset="1" />
+          <midPointStop
+             id="midPointStop104"
+             style="stop-color:#0066CC"
+             offset="0" />
+          <midPointStop
+             id="midPointStop106"
+             style="stop-color:#0066CC"
+             offset="0.5" />
+          <midPointStop
+             id="midPointStop108"
+             style="stop-color:#0053BD"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="112.50049"
+           y1="211.02246"
+           x2="112.50048"
+           y2="12.81396"
+           id="path1067_2_"
+           gradientUnits="userSpaceOnUse">
+          <stop
+             id="stop117"
+             style="stop-color:#418ade;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop133"
+             style="stop-color:#a4cdec;stop-opacity:1"
+             offset="0.5" />
+          <stop
+             id="stop149"
+             style="stop-color:#003399;stop-opacity:1"
+             offset="1" />
+          <midPointStop
+             id="midPointStop151"
+             style="stop-color:#0099FF"
+             offset="0" />
+          <midPointStop
+             id="midPointStop153"
+             style="stop-color:#0099FF"
+             offset="0.25" />
+          <midPointStop
+             id="midPointStop155"
+             style="stop-color:#B0D9FF"
+             offset="0.5" />
+          <midPointStop
+             id="midPointStop157"
+             style="stop-color:#B0D9FF"
+             offset="0.75" />
+          <midPointStop
+             id="midPointStop159"
+             style="stop-color:#003399"
+             offset="1" />
+        </linearGradient>
+        <radialGradient
+           cx="-1.36621"
+           cy="223.93457"
+           r="299.15564"
+           fx="-1.36621"
+           fy="223.93457"
+           id="XMLID_2_"
+           gradientUnits="userSpaceOnUse">
+          <stop
+             id="stop166"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop168"
+             style="stop-color:#418ade;stop-opacity:1"
+             offset="0.44999999" />
+          <stop
+             id="stop170"
+             style="stop-color:#3c5cb2;stop-opacity:1"
+             offset="0.75" />
+          <stop
+             id="stop172"
+             style="stop-color:#0068c6;stop-opacity:1"
+             offset="1" />
+          <midPointStop
+             id="midPointStop174"
+             style="stop-color:#FFFFFF"
+             offset="0" />
+          <midPointStop
+             id="midPointStop176"
+             style="stop-color:#FFFFFF"
+             offset="0.5" />
+          <midPointStop
+             id="midPointStop178"
+             style="stop-color:#0083D7"
+             offset="0.45" />
+          <midPointStop
+             id="midPointStop180"
+             style="stop-color:#0083D7"
+             offset="0.5" />
+          <midPointStop
+             id="midPointStop182"
+             style="stop-color:#0053BD"
+             offset="0.75" />
+          <midPointStop
+             id="midPointStop184"
+             style="stop-color:#0053BD"
+             offset="0.5" />
+          <midPointStop
+             id="midPointStop186"
+             style="stop-color:#0066CC"
+             offset="1" />
+        </radialGradient>
+        <linearGradient
+           x1="112.49854"
+           y1="6.1372099"
+           x2="112.49853"
+           y2="129.3468"
+           id="path1082_2_"
+           gradientUnits="userSpaceOnUse">
+          <stop
+             id="stop193"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop195"
+             style="stop-color:#0093dd;stop-opacity:0"
+             offset="1" />
+          <midPointStop
+             id="midPointStop197"
+             style="stop-color:#FFFFFF"
+             offset="0" />
+          <midPointStop
+             id="midPointStop199"
+             style="stop-color:#FFFFFF"
+             offset="0.5" />
+          <midPointStop
+             id="midPointStop201"
+             style="stop-color:#000000"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="87.310547"
+           y1="141.6543"
+           x2="193.3839"
+           y2="35.58094"
+           id="XMLID_3_"
+           xlink:href="#linearGradient1556"
+           gradientUnits="userSpaceOnUse"
+           spreadMethod="pad">
+          <midPointStop
+             id="midPointStop226"
+             style="stop-color:#003399"
+             offset="0.00562" />
+          <midPointStop
+             id="midPointStop228"
+             style="stop-color:#003399"
+             offset="0.25" />
+          <midPointStop
+             id="midPointStop230"
+             style="stop-color:#57ADFF"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="94.524902"
+           y1="133.65625"
+           x2="184.72461"
+           y2="43.456532"
+           id="XMLID_4_"
+           gradientUnits="userSpaceOnUse">
+          <stop
+             id="stop239"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop241"
+             style="stop-color:#fcfeff;stop-opacity:1"
+             offset="0.31658" />
+          <stop
+             id="stop243"
+             style="stop-color:#f2faff;stop-opacity:1"
+             offset="0.57076001" />
+          <stop
+             id="stop245"
+             style="stop-color:#e1f3ff;stop-opacity:1"
+             offset="0.80255997" />
+          <stop
+             id="stop247"
+             style="stop-color:#ccebff;stop-opacity:1"
+             offset="1" />
+          <midPointStop
+             id="midPointStop249"
+             style="stop-color:#FFFFFF"
+             offset="0" />
+          <midPointStop
+             id="midPointStop251"
+             style="stop-color:#FFFFFF"
+             offset="0.75" />
+          <midPointStop
+             id="midPointStop253"
+             style="stop-color:#CCEBFF"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="126.8584"
+           y1="102.09082"
+           x2="51.48325"
+           y2="177.46597"
+           id="XMLID_5_"
+           xlink:href="#linearGradient2186"
+           gradientUnits="userSpaceOnUse"
+           spreadMethod="pad">
+          <midPointStop
+             id="midPointStop264"
+             style="stop-color:#57ADFF"
+             offset="0" />
+          <midPointStop
+             id="midPointStop266"
+             style="stop-color:#57ADFF"
+             offset="0.5" />
+          <midPointStop
+             id="midPointStop268"
+             style="stop-color:#003399"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="116.01855"
+           y1="112.93164"
+           x2="56.763809"
+           y2="172.18639"
+           id="XMLID_6_"
+           gradientUnits="userSpaceOnUse">
+          <stop
+             id="stop52216"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0.44999999" />
+          <stop
+             id="stop52218"
+             style="stop-color:#a4cdec;stop-opacity:1"
+             offset="1" />
+          <midPointStop
+             id="midPointStop287"
+             style="stop-color:#FFFFFF"
+             offset="0.45" />
+          <midPointStop
+             id="midPointStop289"
+             style="stop-color:#FFFFFF"
+             offset="0.75" />
+          <midPointStop
+             id="midPointStop291"
+             style="stop-color:#D4EEFF"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="92.049637"
+           y1="109.93223"
+           x2="-35.710068"
+           y2="216.77003"
+           id="linearGradient15698"
+           xlink:href="#XMLID_6_"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="103.71875"
+           y1="107.75011"
+           x2="223.05583"
+           y2="-5.3456044"
+           id="linearGradient3302"
+           xlink:href="#XMLID_6_"
+           gradientUnits="userSpaceOnUse" />
+      </defs>
+      <linearGradient
+         x1="98.204483"
+         y1="60.269196"
+         x2="-148.96341"
+         y2="168.24425"
+         id="linearGradient2503"
+         xlink:href="#linearGradient2206"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.973356,0,0,1.027373,0,-2.5)" />
+      <linearGradient
+         x1="98.204483"
+         y1="60.269196"
+         x2="-148.96341"
+         y2="168.24425"
+         id="linearGradient1243"
+         xlink:href="#linearGradient2206"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.973356,0,0,1.027373,0,-2.5)" />
+      <radialGradient
+         cx="79.895966"
+         cy="77.944687"
+         r="68.379425"
+         fx="79.895966"
+         fy="77.944687"
+         id="radialGradient1265"
+         xlink:href="#linearGradient1770"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="221.04356"
+         y1="551.24915"
+         x2="230.27103"
+         y2="759.5589"
+         id="linearGradient4426"
+         xlink:href="#linearGradient2196"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.001106,0.998895)" />
+      <linearGradient
+         x1="222.34142"
+         y1="549.11945"
+         x2="232.06607"
+         y2="768.65356"
+         id="linearGradient4427"
+         xlink:href="#linearGradient2196"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.999652,1.000348)" />
+      <linearGradient
+         x1="222.34142"
+         y1="549.11945"
+         x2="232.06607"
+         y2="768.65356"
+         id="linearGradient4428"
+         xlink:href="#linearGradient2196"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.999652,1.000348)" />
+      <linearGradient
+         x1="222.34142"
+         y1="549.11945"
+         x2="232.06607"
+         y2="768.65356"
+         id="linearGradient4429"
+         xlink:href="#linearGradient2196"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.999652,1.000348)" />
+      <linearGradient
+         x1="33.274284"
+         y1="370.63983"
+         x2="177.57507"
+         y2="515.14752"
+         id="linearGradient4430"
+         xlink:href="#linearGradient2087"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.000105,0.999895)" />
+      <linearGradient
+         x1="213.65359"
+         y1="728.90192"
+         x2="342.72177"
+         y2="515.22815"
+         id="linearGradient4431"
+         xlink:href="#linearGradient2232"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="96.96228"
+         y1="71.421364"
+         x2="96.96228"
+         y2="18.972704"
+         id="linearGradient4432"
+         xlink:href="#linearGradient2091"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.043888,0.957958)" />
+      <linearGradient
+         x1="94.032928"
+         y1="125.24427"
+         x2="93.172325"
+         y2="159.06908"
+         id="linearGradient4433"
+         xlink:href="#linearGradient2091"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.01623,0.98403)" />
+      <defs
+         id="defs1267">
+        <linearGradient
+           id="linearGradient52237">
+          <stop
+             id="stop52239"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop3257"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient3253">
+          <stop
+             id="stop3255"
+             style="stop-color:#4d90fa;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop52244"
+             style="stop-color:#4d90fa;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient2629">
+          <stop
+             id="stop2631"
+             style="stop-color:#000000;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2630"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient4550">
+          <stop
+             id="stop4553"
+             style="stop-color:#000000;stop-opacity:0.29411766"
+             offset="0" />
+          <stop
+             id="stop4552"
+             style="stop-color:#000000;stop-opacity:0.16483517"
+             offset="0.6477778" />
+          <stop
+             id="stop4551"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient4545">
+          <stop
+             id="stop4548"
+             style="stop-color:#000000;stop-opacity:0.2937853"
+             offset="0" />
+          <stop
+             id="stop4547"
+             style="stop-color:#000000;stop-opacity:0.06214689"
+             offset="0.6477778" />
+          <stop
+             id="stop52256"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient52258">
+          <stop
+             id="stop52260"
+             style="stop-color:#ffffff;stop-opacity:0.69072163"
+             offset="0" />
+          <stop
+             id="stop3203"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient3108">
+          <stop
+             id="stop3110"
+             style="stop-color:#ffffff;stop-opacity:0.61983472"
+             offset="0" />
+          <stop
+             id="stop3109"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient3076">
+          <stop
+             id="stop3078"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="0" />
+          <stop
+             id="stop3077"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient3057">
+          <stop
+             id="stop3059"
+             style="stop-color:#ffffff;stop-opacity:0.61983472"
+             offset="0" />
+          <stop
+             id="stop3058"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient3041">
+          <stop
+             id="stop3043"
+             style="stop-color:#000000;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop3042"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient52275">
+          <stop
+             id="stop4622"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop4621"
+             style="stop-color:#ffffff;stop-opacity:0.16078432"
+             offset="0.52955699" />
+          <stop
+             id="stop4620"
+             style="stop-color:#000000;stop-opacity:0.05882353"
+             offset="0.67708677" />
+          <stop
+             id="stop4619"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient4615">
+          <stop
+             id="stop4617"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="0" />
+          <stop
+             id="stop4616"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient4595">
+          <stop
+             id="stop4598"
+             style="stop-color:#000000;stop-opacity:0.3882353"
+             offset="0" />
+          <stop
+             id="stop4597"
+             style="stop-color:#ffffff;stop-opacity:0.34375"
+             offset="0.5" />
+          <stop
+             id="stop4596"
+             style="stop-color:#ffffff;stop-opacity:0.19607843"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient4592">
+          <stop
+             id="stop4594"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="0" />
+          <stop
+             id="stop4593"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient15760">
+          <stop
+             id="stop4591"
+             style="stop-color:#000000;stop-opacity:0.3882353"
+             offset="0" />
+          <stop
+             id="stop15763"
+             style="stop-color:#000000;stop-opacity:0.19215687"
+             offset="0.5" />
+          <stop
+             id="stop4589"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient3749">
+          <stop
+             id="stop3753"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop3752"
+             style="stop-color:#ffffff;stop-opacity:0.16078432"
+             offset="0.52955699" />
+          <stop
+             id="stop3751"
+             style="stop-color:#000000;stop-opacity:0.05882353"
+             offset="0.67708677" />
+          <stop
+             id="stop3750"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient3615">
+          <stop
+             id="stop3617"
+             style="stop-color:#171a00;stop-opacity:0.66670001"
+             offset="0" />
+          <stop
+             id="stop3616"
+             style="stop-color:#2f2500;stop-opacity:0.0039"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient3612">
+          <stop
+             id="stop3614"
+             style="stop-color:#ffcf3d;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop3613"
+             style="stop-color:#b27f00;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient3608">
+          <stop
+             id="stop3610"
+             style="stop-color:#bfff00;stop-opacity:0.60000002"
+             offset="0" />
+          <stop
+             id="stop3609"
+             style="stop-color:#fff200;stop-opacity:0.60000002"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient52309">
+          <stop
+             id="stop3530"
+             style="stop-color:#000000;stop-opacity:0.3882353"
+             offset="0" />
+          <stop
+             id="stop3529"
+             style="stop-color:#000000;stop-opacity:0.19215687"
+             offset="0.5" />
+          <stop
+             id="stop3528"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient2483">
+          <stop
+             id="stop2485"
+             style="stop-color:#43b0e2;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2484"
+             style="stop-color:#43b0e2;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient52317">
+          <stop
+             id="stop52319"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop52321"
+             style="stop-color:#fafbff;stop-opacity:1"
+             offset="0.25" />
+          <stop
+             id="stop52323"
+             style="stop-color:#f0f2fa;stop-opacity:1"
+             offset="0.5" />
+          <stop
+             id="stop52325"
+             style="stop-color:#e1e1e1;stop-opacity:1"
+             offset="0.75" />
+          <stop
+             id="stop52327"
+             style="stop-color:#f5f6ff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient52329">
+          <stop
+             id="stop52331"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop52333"
+             style="stop-color:#d0d1d9;stop-opacity:1"
+             offset="0.5" />
+          <stop
+             id="stop52335"
+             style="stop-color:#878b9b;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient52337">
+          <stop
+             id="stop52339"
+             style="stop-color:#e8e8e8;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop52341"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient52343"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <radialGradient
+           cx="-77.367622"
+           cy="42.633839"
+           r="216.26619"
+           fx="-80.036034"
+           fy="44.468376"
+           id="radialGradient52345"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+        <defs
+           id="defs52347">
+          <linearGradient
+             id="linearGradient52349">
+            <stop
+               id="stop52351"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop52353"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient52355">
+            <stop
+               id="stop52357"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop2612"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop2613"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop2614"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop52362"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient2616">
+            <stop
+               id="stop52365"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop52367"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient52369"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient2620"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <radialGradient
+             cx="4.9853168"
+             cy="108.47158"
+             r="34.222183"
+             fx="5.2520976"
+             fy="108.73115"
+             id="radialGradient52372"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="36.826332"
+             y1="75.332558"
+             x2="25.761681"
+             y2="135.90358"
+             id="linearGradient52374"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+          <linearGradient
+             x1="78.675774"
+             y1="47.411823"
+             x2="64.05336"
+             y2="34.302757"
+             id="linearGradient52376"
+             xlink:href="#linearGradient4281"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+          <defs
+             id="defs52378">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient52380"
+               xlink:href="#linearGradient3296"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient52382"
+               xlink:href="#linearGradient2483"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+          </defs>
+        </defs>
+        <linearGradient
+           x1="88.712402"
+           y1="138.15012"
+           x2="104.81104"
+           y2="151.63045"
+           id="linearGradient52392"
+           xlink:href="#linearGradient3305"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        <linearGradient
+           x1="17.914211"
+           y1="221.47987"
+           x2="425.89865"
+           y2="221.47987"
+           id="linearGradient2482"
+           xlink:href="#linearGradient2483"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988025,1.012121)" />
+        <linearGradient
+           x1="17.914211"
+           y1="221.47987"
+           x2="425.89865"
+           y2="221.47987"
+           id="linearGradient2489"
+           xlink:href="#linearGradient2483"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988025,1.012121)" />
+        <linearGradient
+           x1="17.914211"
+           y1="221.47987"
+           x2="425.89865"
+           y2="221.47987"
+           id="linearGradient2493"
+           xlink:href="#linearGradient2483"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988025,1.012121)" />
+        <defs
+           id="defs52397">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient1102"
+             xlink:href="#linearGradient4595"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient994"
+             xlink:href="#linearGradient3108"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient948"
+             xlink:href="#linearGradient3749"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient52402"
+             xlink:href="#linearGradient3527"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient52404"
+             xlink:href="#linearGradient3076"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient834">
+            <stop
+               id="stop835"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop836"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="217.42307"
+             y1="536.03741"
+             x2="217.42307"
+             y2="459.23132"
+             id="linearGradient52409"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.241013,0.805793)" />
+          <linearGradient
+             x1="87.605721"
+             y1="1061.6371"
+             x2="87.605721"
+             y2="1160.6499"
+             id="linearGradient841"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.930484,0.518005)" />
+          <linearGradient
+             x1="177.77042"
+             y1="831.05975"
+             x2="178.45302"
+             y2="795.11487"
+             id="linearGradient842"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.548996,0.64558)" />
+          <linearGradient
+             x1="458.70102"
+             y1="329.58002"
+             x2="404.87259"
+             y2="326.23184"
+             id="linearGradient846"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="139.11636"
+             y1="564.54614"
+             x2="200.18613"
+             y2="564.54614"
+             id="linearGradient847"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.54934,0.645436)" />
+          <linearGradient
+             x1="118.25803"
+             y1="563.01941"
+             x2="156.10408"
+             y2="564.03723"
+             id="linearGradient848"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.54934,0.645436)" />
+          <linearGradient
+             x1="238.75548"
+             y1="339.24017"
+             x2="317.05142"
+             y2="333.88309"
+             id="linearGradient52416"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="192.95671"
+             y1="559.13995"
+             x2="192.95671"
+             y2="588.70502"
+             id="linearGradient851"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.380924,0.724153)" />
+          <linearGradient
+             x1="199.15404"
+             y1="696.90118"
+             x2="193.92329"
+             y2="593.573"
+             id="linearGradient1414"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.381391,0.723908)" />
+          <linearGradient
+             x1="354.95923"
+             y1="464.90207"
+             x2="354.95923"
+             y2="299.05014"
+             id="linearGradient52420"
+             xlink:href="#linearGradient1102"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <radialGradient
+             cx="184.20265"
+             cy="780.47272"
+             r="49.972103"
+             fx="182.57774"
+             fy="734.32568"
+             id="radialGradient945"
+             xlink:href="#linearGradient948"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.455004,0.687283)" />
+          <radialGradient
+             cx="0.52464789"
+             cy="0.32867134"
+             r="0.28679976"
+             fx="0.52464789"
+             fy="0.59440559"
+             id="radialGradient947"
+             xlink:href="#linearGradient843" />
+          <radialGradient
+             cx="106.52795"
+             cy="541.31592"
+             r="49.665058"
+             fx="105.48236"
+             fy="502.10669"
+             id="radialGradient993"
+             xlink:href="#linearGradient994"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="84.970261"
+             y1="1095.1855"
+             x2="84.970261"
+             y2="1189.3411"
+             id="linearGradient1146"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.987109,0.503244)" />
+          <linearGradient
+             x1="217.42307"
+             y1="536.03741"
+             x2="217.42307"
+             y2="459.23132"
+             id="linearGradient1169"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="199.15404"
+             y1="696.90118"
+             x2="193.92329"
+             y2="593.573"
+             id="linearGradient1170"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="192.95671"
+             y1="559.13995"
+             x2="192.95671"
+             y2="588.70502"
+             id="linearGradient1163"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="192.95671"
+             y1="559.13995"
+             x2="192.95671"
+             y2="588.70502"
+             id="linearGradient1168"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="199.15404"
+             y1="696.90118"
+             x2="193.92329"
+             y2="593.573"
+             id="linearGradient1173"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="217.42307"
+             y1="536.03741"
+             x2="217.42307"
+             y2="459.23132"
+             id="linearGradient1174"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+        </defs>
+        <defs
+           id="defs215">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient1105"
+             xlink:href="#linearGradient3615"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient223"
+             xlink:href="#linearGradient3608"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient218"
+             xlink:href="#linearGradient3612"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0.314347"
+             y1="0.54857099"
+             x2="0.53643698"
+             y2="0.554286"
+             id="linearGradient221"
+             xlink:href="#linearGradient218" />
+          <linearGradient
+             x1="0.246326"
+             y1="0.59428602"
+             x2="0.78109801"
+             y2="0.57142901"
+             id="linearGradient222"
+             xlink:href="#linearGradient223" />
+          <radialGradient
+             cx="0.257236"
+             cy="0.27271599"
+             r="0.65467203"
+             fx="0.273312"
+             fy="0.51515198"
+             id="radialGradient1104"
+             xlink:href="#linearGradient1105" />
+        </defs>
+        <linearGradient
+           x1="458.70102"
+           y1="329.58002"
+           x2="404.87259"
+           y2="326.23184"
+           id="linearGradient52443"
+           xlink:href="#linearGradient3527"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.733715,1.362927)" />
+        <linearGradient
+           x1="354.95923"
+           y1="464.90207"
+           x2="354.95923"
+           y2="299.05014"
+           id="linearGradient3950"
+           xlink:href="#linearGradient1102"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.733715,1.362927)" />
+        <linearGradient
+           x1="238.75548"
+           y1="339.24017"
+           x2="317.05142"
+           y2="333.88309"
+           id="linearGradient52446"
+           xlink:href="#linearGradient3527"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.733715,1.362927)" />
+        <linearGradient
+           x1="458.70102"
+           y1="329.58002"
+           x2="404.87259"
+           y2="326.23184"
+           id="linearGradient3952"
+           xlink:href="#linearGradient3527"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.733715,1.362927)" />
+        <linearGradient
+           x1="192.95671"
+           y1="559.13995"
+           x2="192.95671"
+           y2="588.70502"
+           id="linearGradient3953"
+           xlink:href="#linearGradient3527"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="199.15404"
+           y1="696.90118"
+           x2="193.92329"
+           y2="593.573"
+           id="linearGradient52450"
+           xlink:href="#linearGradient3527"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="217.42307"
+           y1="536.03741"
+           x2="217.42307"
+           y2="459.23132"
+           id="linearGradient3955"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="118.25803"
+           y1="563.01941"
+           x2="156.10408"
+           y2="564.03723"
+           id="linearGradient3956"
+           xlink:href="#linearGradient3527"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.54934,0.645436)" />
+        <linearGradient
+           x1="139.11636"
+           y1="564.54614"
+           x2="200.18613"
+           y2="564.54614"
+           id="linearGradient3957"
+           xlink:href="#linearGradient3527"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.54934,0.645436)" />
+        <radialGradient
+           cx="184.20265"
+           cy="780.47272"
+           r="49.972103"
+           fx="182.57774"
+           fy="734.32568"
+           id="radialGradient3958"
+           xlink:href="#linearGradient3749"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.455004,0.687283)" />
+        <linearGradient
+           x1="177.77042"
+           y1="831.05975"
+           x2="178.45302"
+           y2="795.11487"
+           id="linearGradient3959"
+           xlink:href="#linearGradient3527"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.548996,0.64558)" />
+        <linearGradient
+           x1="84.970261"
+           y1="1095.1855"
+           x2="84.970261"
+           y2="1189.3411"
+           id="linearGradient3960"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.987109,0.503244)" />
+        <linearGradient
+           x1="87.605721"
+           y1="1061.6371"
+           x2="87.605721"
+           y2="1160.6499"
+           id="linearGradient52458"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.930484,0.518005)" />
+        <radialGradient
+           cx="106.52795"
+           cy="541.31592"
+           r="49.665058"
+           fx="105.48236"
+           fy="502.10669"
+           id="radialGradient3962"
+           xlink:href="#linearGradient994"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="-91.514885"
+           y1="199.05321"
+           x2="30.274208"
+           y2="194.82513"
+           id="linearGradient4587"
+           xlink:href="#linearGradient4595"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.026011,0.974648)" />
+        <linearGradient
+           x1="-4.4710765"
+           y1="366.76578"
+           x2="26.069948"
+           y2="512.50165"
+           id="linearGradient4602"
+           xlink:href="#linearGradient4595"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.633883,0,0,0.536553,-25.41624,-15.94345)" />
+        <linearGradient
+           x1="-49.343468"
+           y1="302.82651"
+           x2="-10.230718"
+           y2="302.82651"
+           id="linearGradient4606"
+           xlink:href="#linearGradient4592"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.318581,0.758391)" />
+        <linearGradient
+           x1="-18.900764"
+           y1="185.38274"
+           x2="24.677307"
+           y2="151.7379"
+           id="linearGradient4610"
+           xlink:href="#linearGradient4595"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.706204,1.416022)" />
+        <linearGradient
+           x1="-6.0588322"
+           y1="210.60007"
+           x2="6.9808698"
+           y2="293.03543"
+           id="linearGradient4614"
+           xlink:href="#linearGradient4588"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.439544,0,0,0.694664,-12.26418,6.7453)" />
+        <linearGradient
+           x1="-91.514885"
+           y1="199.05321"
+           x2="30.274208"
+           y2="194.82513"
+           id="linearGradient4624"
+           xlink:href="#linearGradient4595"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.272246,-0.435187,0.939711,0.665801,-204.4414,93.2513)" />
+        <linearGradient
+           x1="-18.900764"
+           y1="185.38274"
+           x2="24.677307"
+           y2="151.7379"
+           id="linearGradient4631"
+           xlink:href="#linearGradient4595"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.706204,1.416022)" />
+        <linearGradient
+           x1="-91.514885"
+           y1="199.05321"
+           x2="30.274208"
+           y2="194.82513"
+           id="linearGradient4632"
+           xlink:href="#linearGradient4595"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.026011,0.974648)" />
+        <linearGradient
+           x1="-49.343468"
+           y1="302.82651"
+           x2="-10.230718"
+           y2="302.82651"
+           id="linearGradient4633"
+           xlink:href="#linearGradient4592"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.318581,0.758391)" />
+        <linearGradient
+           x1="-6.0588322"
+           y1="210.60007"
+           x2="6.9808698"
+           y2="293.03543"
+           id="linearGradient4634"
+           xlink:href="#linearGradient4588"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.439544,0,0,0.694664,-12.26418,6.7453)" />
+        <linearGradient
+           x1="-91.514885"
+           y1="199.05321"
+           x2="30.274208"
+           y2="194.82513"
+           id="linearGradient4635"
+           xlink:href="#linearGradient4595"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.272246,-0.435187,0.939711,0.665801,-204.4414,93.2513)" />
+        <defs
+           id="defs3755">
+          <linearGradient
+             id="linearGradient3756">
+            <stop
+               id="stop3757"
+               style="stop-color:#000000;stop-opacity:0.3882353"
+               offset="0" />
+            <stop
+               id="stop3758"
+               style="stop-color:#ffffff;stop-opacity:0.34375"
+               offset="0.5" />
+            <stop
+               id="stop3759"
+               style="stop-color:#ffffff;stop-opacity:0.19607843"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient3760"
+             xlink:href="#linearGradient3057"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient3763"
+             xlink:href="#linearGradient4618"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient3768"
+             xlink:href="#linearGradient4588"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient3772"
+             xlink:href="#linearGradient4615"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient3775"
+             xlink:href="#linearGradient3041"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="217.42307"
+             y1="536.03741"
+             x2="217.42307"
+             y2="459.23132"
+             id="linearGradient3778"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.241013,0.805793)" />
+          <linearGradient
+             x1="87.605721"
+             y1="1061.6371"
+             x2="87.605721"
+             y2="1160.6499"
+             id="linearGradient3779"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.930484,0.518005)" />
+          <linearGradient
+             x1="177.77042"
+             y1="831.05975"
+             x2="178.45302"
+             y2="795.11487"
+             id="linearGradient3780"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.548996,0.64558)" />
+          <linearGradient
+             x1="458.70102"
+             y1="329.58002"
+             x2="404.87259"
+             y2="326.23184"
+             id="linearGradient3781"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="139.11636"
+             y1="564.54614"
+             x2="200.18613"
+             y2="564.54614"
+             id="linearGradient3782"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.54934,0.645436)" />
+          <linearGradient
+             x1="118.25803"
+             y1="563.01941"
+             x2="156.10408"
+             y2="564.03723"
+             id="linearGradient3783"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.54934,0.645436)" />
+          <linearGradient
+             x1="238.75548"
+             y1="339.24017"
+             x2="317.05142"
+             y2="333.88309"
+             id="linearGradient3784"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="192.95671"
+             y1="559.13995"
+             x2="192.95671"
+             y2="588.70502"
+             id="linearGradient3785"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.380924,0.724153)" />
+          <linearGradient
+             x1="199.15404"
+             y1="696.90118"
+             x2="193.92329"
+             y2="593.573"
+             id="linearGradient3786"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.381391,0.723908)" />
+          <linearGradient
+             x1="354.95923"
+             y1="464.90207"
+             x2="354.95923"
+             y2="299.05014"
+             id="linearGradient3787"
+             xlink:href="#linearGradient1102"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <radialGradient
+             cx="184.20265"
+             cy="780.47272"
+             r="49.972103"
+             fx="182.57774"
+             fy="734.32568"
+             id="radialGradient3788"
+             xlink:href="#linearGradient948"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.455004,0.687283)" />
+          <radialGradient
+             cx="0.52464789"
+             cy="0.32867134"
+             r="0.28679976"
+             fx="0.52464789"
+             fy="0.59440559"
+             id="radialGradient3789"
+             xlink:href="#linearGradient843" />
+          <radialGradient
+             cx="106.52795"
+             cy="541.31592"
+             r="49.665058"
+             fx="105.48236"
+             fy="502.10669"
+             id="radialGradient3790"
+             xlink:href="#linearGradient994"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="84.970261"
+             y1="1095.1855"
+             x2="84.970261"
+             y2="1189.3411"
+             id="linearGradient3791"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.987109,0.503244)" />
+          <linearGradient
+             x1="217.42307"
+             y1="536.03741"
+             x2="217.42307"
+             y2="459.23132"
+             id="linearGradient3792"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="199.15404"
+             y1="696.90118"
+             x2="193.92329"
+             y2="593.573"
+             id="linearGradient3793"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="192.95671"
+             y1="559.13995"
+             x2="192.95671"
+             y2="588.70502"
+             id="linearGradient3794"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="192.95671"
+             y1="559.13995"
+             x2="192.95671"
+             y2="588.70502"
+             id="linearGradient3795"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="199.15404"
+             y1="696.90118"
+             x2="193.92329"
+             y2="593.573"
+             id="linearGradient3796"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="217.42307"
+             y1="536.03741"
+             x2="217.42307"
+             y2="459.23132"
+             id="linearGradient3797"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="354.95923"
+             y1="464.90207"
+             x2="354.95923"
+             y2="299.05014"
+             id="linearGradient3798"
+             xlink:href="#linearGradient1102"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="238.75548"
+             y1="339.24017"
+             x2="317.05142"
+             y2="333.88309"
+             id="linearGradient3799"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="458.70102"
+             y1="329.58002"
+             x2="404.87259"
+             y2="326.23184"
+             id="linearGradient3800"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="192.95671"
+             y1="559.13995"
+             x2="192.95671"
+             y2="588.70502"
+             id="linearGradient3801"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="199.15404"
+             y1="696.90118"
+             x2="193.92329"
+             y2="593.573"
+             id="linearGradient3802"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="217.42307"
+             y1="536.03741"
+             x2="217.42307"
+             y2="459.23132"
+             id="linearGradient3803"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="118.25803"
+             y1="563.01941"
+             x2="156.10408"
+             y2="564.03723"
+             id="linearGradient3804"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.54934,0.645436)" />
+          <linearGradient
+             x1="139.11636"
+             y1="564.54614"
+             x2="200.18613"
+             y2="564.54614"
+             id="linearGradient3805"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.54934,0.645436)" />
+          <radialGradient
+             cx="184.20265"
+             cy="780.47272"
+             r="49.972103"
+             fx="182.57774"
+             fy="734.32568"
+             id="radialGradient3806"
+             xlink:href="#linearGradient948"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.455004,0.687283)" />
+          <linearGradient
+             x1="177.77042"
+             y1="831.05975"
+             x2="178.45302"
+             y2="795.11487"
+             id="linearGradient3807"
+             xlink:href="#linearGradient843"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.548996,0.64558)" />
+          <linearGradient
+             x1="84.970261"
+             y1="1095.1855"
+             x2="84.970261"
+             y2="1189.3411"
+             id="linearGradient15938"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.987109,0.503244)" />
+          <linearGradient
+             x1="87.605721"
+             y1="1061.6371"
+             x2="87.605721"
+             y2="1160.6499"
+             id="linearGradient3809"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.930484,0.518005)" />
+          <radialGradient
+             cx="106.52795"
+             cy="541.31592"
+             r="49.665058"
+             fx="105.48236"
+             fy="502.10669"
+             id="radialGradient3810"
+             xlink:href="#linearGradient994"
+             gradientUnits="userSpaceOnUse" />
+        </defs>
+        <defs
+           id="defs3433">
+          <linearGradient
+             id="linearGradient2886">
+            <stop
+               id="stop2887"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2888"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient3437">
+            <stop
+               id="stop3438"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop3439"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient3440">
+            <stop
+               id="stop3441"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop3442"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop3443"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop3444"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop3445"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient3446">
+            <stop
+               id="stop3447"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop3448"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient3449"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <defs
+             id="defs2485">
+            <linearGradient
+               id="linearGradient2486">
+              <stop
+                 id="stop2487"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop2488"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient3454">
+              <stop
+                 id="stop2490"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop2491"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop2492"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop2493"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop2494"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient2495">
+              <stop
+                 id="stop2496"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop2497"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <radialGradient
+               cx="23.756607"
+               cy="60.078049"
+               r="21.026033"
+               fx="23.756607"
+               fy="60.078049"
+               id="radialGradient2498"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.006281,0.993758)" />
+            <linearGradient
+               x1="31.82851"
+               y1="61.778381"
+               x2="33.198818"
+               y2="6.859036"
+               id="linearGradient2499"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.750054,0,0,1.072718,1.04579,2.663333)" />
+            <radialGradient
+               cx="92.478806"
+               cy="20.827066"
+               r="45.889046"
+               fx="92.478806"
+               fy="20.827066"
+               id="radialGradient2500"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.506767,1.973294)" />
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient2501"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="108.49871"
+               y1="17.573528"
+               x2="185.22578"
+               y2="24.330959"
+               id="linearGradient2502"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient2504"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <linearGradient
+               x1="30.382267"
+               y1="7.5329666"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient2505"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+            <linearGradient
+               x1="25.954844"
+               y1="25.071495"
+               x2="39.781502"
+               y2="27.315489"
+               id="linearGradient2506"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103231)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient3472"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient3473"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient3474"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs3475">
+              <linearGradient
+                 id="linearGradient3476">
+                <stop
+                   id="stop2879"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1740"
+                   style="stop-color:#d0d1d9;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop2881"
+                   style="stop-color:#878b9b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+            </defs>
+          </defs>
+          <defs
+             id="defs850">
+            <linearGradient
+               id="linearGradient1136">
+              <stop
+                 id="stop1137"
+                 style="stop-color:#826647;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1138"
+                 style="stop-color:#575147;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0.36627907"
+               y1="0.8125"
+               x2="0.36627907"
+               y2="0.1796875"
+               id="linearGradient1139"
+               xlink:href="#linearGradient1136"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="-0.109375"
+               y1="0.9140625"
+               x2="1.15625"
+               y2="0.1796875"
+               id="linearGradient1140"
+               xlink:href="#linearGradient1136" />
+          </defs>
+          <radialGradient
+             cx="24.825565"
+             cy="176.56438"
+             r="42.859913"
+             fx="40.974991"
+             fy="162.11137"
+             id="radialGradient1632"
+             xlink:href="#linearGradient1806"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="693.25439"
+             y1="697.24719"
+             x2="657.74762"
+             y2="677.27399"
+             id="linearGradient1633"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.983783,1.016484)" />
+          <linearGradient
+             x1="681.34058"
+             y1="728.7738"
+             x2="641.37305"
+             y2="705.9129"
+             id="linearGradient1634"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.986777,1.0134)" />
+          <linearGradient
+             x1="649.57269"
+             y1="677.24323"
+             x2="630.47528"
+             y2="668.91809"
+             id="linearGradient1635"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988806,1.011321)" />
+          <linearGradient
+             x1="647.99902"
+             y1="693.73279"
+             x2="629.89734"
+             y2="683.8114"
+             id="linearGradient1636"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.975718,1.024886)" />
+          <linearGradient
+             x1="538.89514"
+             y1="277.2775"
+             x2="575.11407"
+             y2="342.66919"
+             id="linearGradient1637"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.998206,1.001797)" />
+          <linearGradient
+             x1="509.06769"
+             y1="327.76361"
+             x2="544.86011"
+             y2="399.38104"
+             id="linearGradient1638"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.972249,1.028543)" />
+          <linearGradient
+             x1="591.27606"
+             y1="330.16998"
+             x2="620.33301"
+             y2="382.54678"
+             id="linearGradient1639"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.044357,0.957527)" />
+          <linearGradient
+             x1="566.74347"
+             y1="415.15009"
+             x2="588.13922"
+             y2="458.04449"
+             id="linearGradient1640"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.03551,0.965707)" />
+          <defs
+             id="defs5950">
+            <linearGradient
+               x1="0.25179857"
+               y1="-0.0390625"
+               x2="0.53237408"
+               y2="0.5234375"
+               id="linearGradient4033"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="0.092198581"
+               y1="-0.2109375"
+               x2="0.4822695"
+               y2="0.4921875"
+               id="linearGradient3983"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="0.016528925"
+               y1="-0.4921875"
+               x2="0.51239669"
+               y2="0.5"
+               id="linearGradient3978"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="0.05511811"
+               y1="-0.3046875"
+               x2="0.53543305"
+               y2="0.5625"
+               id="linearGradient3969"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="1.2125034"
+               y1="0.78833276"
+               x2="0.5859077"
+               y2="0.44490069"
+               id="linearGradient4018"
+               xlink:href="#linearGradient4215"
+               gradientTransform="scale(0.999075,1.000926)" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient16019"
+               xlink:href="#linearGradient3256"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="1.1610887"
+               y1="0.61942029"
+               x2="0.47761098"
+               y2="0.3214713"
+               id="linearGradient4019"
+               xlink:href="#linearGradient4215"
+               gradientTransform="scale(1.003618,0.996395)" />
+            <linearGradient
+               x1="1.8455285"
+               y1="1.34375"
+               x2="0.47967479"
+               y2="0.5625"
+               id="linearGradient4017"
+               xlink:href="#linearGradient4021" />
+            <linearGradient
+               id="linearGradient4021">
+              <stop
+                 id="stop4022"
+                 style="stop-color:#000000;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop4023"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="1.7519705"
+               y1="1.0528145"
+               x2="0.54093099"
+               y2="0.37158158"
+               id="linearGradient4020"
+               xlink:href="#linearGradient4021"
+               gradientTransform="scale(0.990884,1.0092)" />
+            <linearGradient
+               x1="0.24528302"
+               y1="1.6015625"
+               x2="0.28301886"
+               y2="-0.0234375"
+               id="linearGradient4905"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.89719623"
+               y1="-0.1484375"
+               x2="0.40186915"
+               y2="0.5546875"
+               id="linearGradient4909"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.90588236"
+               y1="-0.2734375"
+               x2="0.36470589"
+               y2="0.5078125"
+               id="linearGradient4902"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.56809336"
+               y1="-0.125"
+               x2="0.49027237"
+               y2="0.59375"
+               id="linearGradient4898"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="1.4128441"
+               y1="1.25"
+               x2="0.42201835"
+               y2="0.4140625"
+               id="linearGradient4830"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.084848486"
+               y1="1.1640625"
+               x2="0.53333336"
+               y2="0.359375"
+               id="linearGradient4828"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.76190478"
+               y1="-0.53125"
+               x2="0.6857143"
+               y2="0.5390625"
+               id="linearGradient4822"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               id="linearGradient4823">
+              <stop
+                 id="stop4824"
+                 style="stop-color:#ffffff;stop-opacity:0.83615822"
+                 offset="0" />
+              <stop
+                 id="stop4826"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="2.2054794"
+               y1="2.03125"
+               x2="0.56164384"
+               y2="-0.28125"
+               id="linearGradient4907"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.88832486"
+               y1="1.0390625"
+               x2="0.55837566"
+               y2="0.3046875"
+               id="linearGradient4900"
+               xlink:href="#linearGradient1806" />
+            <linearGradient
+               x1="0.85217392"
+               y1="0.9609375"
+               x2="0.86086959"
+               y2="0.296875"
+               id="linearGradient4832"
+               xlink:href="#linearGradient1806" />
+            <linearGradient
+               x1="0.064220183"
+               y1="1.4375"
+               x2="0.22018349"
+               y2="0.3125"
+               id="linearGradient3976"
+               xlink:href="#linearGradient3970" />
+            <linearGradient
+               id="linearGradient3970">
+              <stop
+                 id="stop3971"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop3972"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="1.1011236"
+               y1="0.7421875"
+               x2="0.033707865"
+               y2="0.5703125"
+               id="linearGradient4037"
+               xlink:href="#linearGradient3970" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient1806"
+               xlink:href="#linearGradient4545"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <radialGradient
+               cx="0.49032259"
+               cy="0.50649351"
+               r="0.38170236"
+               fx="0.63414633"
+               fy="0.37777779"
+               id="radialGradient4069"
+               xlink:href="#linearGradient1806" />
+          </defs>
+          <linearGradient
+             x1="-191.46153"
+             y1="37.372372"
+             x2="-165.58835"
+             y2="37.372372"
+             id="linearGradient3039"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+          <defs
+             id="defs1404">
+            <linearGradient
+               id="linearGradient3616">
+              <stop
+                 id="stop3618"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop3619"
+                 style="stop-color:#fafbff;stop-opacity:1"
+                 offset="0.25" />
+              <stop
+                 id="stop3620"
+                 style="stop-color:#f0f2fa;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop3621"
+                 style="stop-color:#e1e1e1;stop-opacity:1"
+                 offset="0.75" />
+              <stop
+                 id="stop3622"
+                 style="stop-color:#f5f6ff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient3623">
+              <stop
+                 id="stop3624"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop3625"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop3626"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1418">
+              <stop
+                 id="stop1419"
+                 style="stop-color:#e8e8e8;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1420"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient3630"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient3631"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <defs
+               id="defs3632">
+              <linearGradient
+                 x1="11.375588"
+                 y1="92.38092"
+                 x2="123.25335"
+                 y2="92.38092"
+                 id="linearGradient1425"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.200251,0.833159)">
+                <stop
+                   id="stop1426"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1427"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient3636">
+                <stop
+                   id="stop3637"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop1430"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop1431"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop1432"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop3641"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient3642">
+                <stop
+                   id="stop3643"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop3644"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient3645"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient52650"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient1439"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient1440"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient1441"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs1442">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient52656"
+                   xlink:href="#linearGradient3296"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+              </defs>
+            </defs>
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient3666"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          </defs>
+          <linearGradient
+             x1="84.960785"
+             y1="92.151367"
+             x2="42.64373"
+             y2="53.360722"
+             id="linearGradient1966"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.321949,0.756459)" />
+          <linearGradient
+             x1="109.15074"
+             y1="2.1610787"
+             x2="134.0733"
+             y2="60.510494"
+             id="linearGradient1967"
+             xlink:href="#linearGradient845"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.835421,1.197001)" />
+          <linearGradient
+             x1="186.07457"
+             y1="23.533224"
+             x2="202.6377"
+             y2="23.47304"
+             id="linearGradient1968"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.388045,2.57702)" />
+          <linearGradient
+             x1="92.631454"
+             y1="54.989693"
+             x2="92.631454"
+             y2="50.608093"
+             id="linearGradient1969"
+             xlink:href="#linearGradient1757"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.787838,1.269296)" />
+          <radialGradient
+             cx="24.825565"
+             cy="176.56438"
+             r="42.859913"
+             fx="40.974991"
+             fy="162.11137"
+             id="radialGradient1970"
+             xlink:href="#linearGradient1806"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="693.25439"
+             y1="697.24719"
+             x2="657.74762"
+             y2="677.27399"
+             id="linearGradient16102"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.983783,1.016484)" />
+          <linearGradient
+             x1="681.34058"
+             y1="728.7738"
+             x2="641.37305"
+             y2="705.9129"
+             id="linearGradient1972"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.986777,1.0134)" />
+          <linearGradient
+             x1="649.57269"
+             y1="677.24323"
+             x2="630.47528"
+             y2="668.91809"
+             id="linearGradient1973"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988806,1.011321)" />
+          <linearGradient
+             x1="647.99902"
+             y1="693.73279"
+             x2="629.89734"
+             y2="683.8114"
+             id="linearGradient1974"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.975718,1.024886)" />
+          <linearGradient
+             x1="538.89514"
+             y1="277.2775"
+             x2="575.11407"
+             y2="342.66919"
+             id="linearGradient1975"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.998206,1.001797)" />
+          <linearGradient
+             x1="509.06769"
+             y1="327.76361"
+             x2="544.86011"
+             y2="399.38104"
+             id="linearGradient1976"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.972249,1.028543)" />
+          <linearGradient
+             x1="591.27606"
+             y1="330.16998"
+             x2="620.33301"
+             y2="382.54678"
+             id="linearGradient52676"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.044357,0.957527)" />
+          <linearGradient
+             x1="566.74347"
+             y1="415.15009"
+             x2="588.13922"
+             y2="458.04449"
+             id="linearGradient52678"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.03551,0.965707)" />
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient52680"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+          <linearGradient
+             x1="1270.3132"
+             y1="4.8765283"
+             x2="1247.6848"
+             y2="0.72310239"
+             id="linearGradient52682"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(9.440723e-2,10.59241)" />
+          <linearGradient
+             x1="1270.3132"
+             y1="4.8765283"
+             x2="1247.6848"
+             y2="0.72310239"
+             id="linearGradient52684"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+          <defs
+             id="defs1789">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient3115"
+               xlink:href="#linearGradient3253"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient1796">
+              <stop
+                 id="stop1797"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1798"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1799">
+              <stop
+                 id="stop1800"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1801"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1802">
+              <stop
+                 id="stop1803"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop1804"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop1805"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop1806"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop1809"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1810">
+              <stop
+                 id="stop1811"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1812"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <radialGradient
+               cx="23.756607"
+               cy="60.078049"
+               r="21.026033"
+               fx="23.756607"
+               fy="60.078049"
+               id="radialGradient3131"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+            <linearGradient
+               x1="31.82851"
+               y1="61.778381"
+               x2="33.198818"
+               y2="6.859036"
+               id="linearGradient52704"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+            <radialGradient
+               cx="92.478806"
+               cy="20.827066"
+               r="45.889046"
+               fx="92.478806"
+               fy="20.827066"
+               id="radialGradient3133"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient1816"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+            <linearGradient
+               x1="108.49871"
+               y1="17.573528"
+               x2="185.22578"
+               y2="24.330959"
+               id="linearGradient3135"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+            <linearGradient
+               x1="28.814428"
+               y1="-1.616316"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient3136"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.764292,1.3084)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient1819"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <linearGradient
+               x1="30.382267"
+               y1="7.5329666"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient3138"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+            <linearGradient
+               x1="25.954844"
+               y1="25.071495"
+               x2="39.781502"
+               y2="27.315489"
+               id="linearGradient3139"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103231)" />
+            <linearGradient
+               x1="31.82851"
+               y1="61.778381"
+               x2="33.198818"
+               y2="6.859036"
+               id="linearGradient1823"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+            <radialGradient
+               cx="24.825565"
+               cy="176.56438"
+               r="42.859913"
+               fx="40.974991"
+               fy="162.11137"
+               id="radialGradient1233"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="591.27606"
+               y1="330.16998"
+               x2="620.33301"
+               y2="382.54678"
+               id="linearGradient1240"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.044357,0.957527)" />
+            <linearGradient
+               x1="566.74347"
+               y1="415.15009"
+               x2="588.13922"
+               y2="458.04449"
+               id="linearGradient1241"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.03551,0.965707)" />
+            <defs
+               id="defs1838">
+              <linearGradient
+                 x1="0.25179857"
+                 y1="-0.0390625"
+                 x2="0.53237408"
+                 y2="0.5234375"
+                 id="linearGradient1839"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.092198581"
+                 y1="-0.2109375"
+                 x2="0.4822695"
+                 y2="0.4921875"
+                 id="linearGradient1840"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.016528925"
+                 y1="-0.4921875"
+                 x2="0.51239669"
+                 y2="0.5"
+                 id="linearGradient1841"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.05511811"
+                 y1="-0.3046875"
+                 x2="0.53543305"
+                 y2="0.5625"
+                 id="linearGradient1842"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="1.2125034"
+                 y1="0.78833276"
+                 x2="0.5859077"
+                 y2="0.44490069"
+                 id="linearGradient1843"
+                 xlink:href="#linearGradient4215"
+                 gradientTransform="scale(0.999075,1.000926)" />
+              <linearGradient
+                 id="linearGradient1844">
+                <stop
+                   id="stop1845"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1846"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.1610887"
+                 y1="0.61942029"
+                 x2="0.47761098"
+                 y2="0.3214713"
+                 id="linearGradient1847"
+                 xlink:href="#linearGradient4215"
+                 gradientTransform="scale(1.003618,0.996395)" />
+              <linearGradient
+                 x1="1.8455285"
+                 y1="1.34375"
+                 x2="0.47967479"
+                 y2="0.5625"
+                 id="linearGradient1848"
+                 xlink:href="#linearGradient4021" />
+              <linearGradient
+                 id="linearGradient1849">
+                <stop
+                   id="stop1850"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1851"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.7519705"
+                 y1="1.0528145"
+                 x2="0.54093099"
+                 y2="0.37158158"
+                 id="linearGradient1852"
+                 xlink:href="#linearGradient4021"
+                 gradientTransform="scale(0.990884,1.0092)" />
+              <linearGradient
+                 x1="0.24528302"
+                 y1="1.6015625"
+                 x2="0.28301886"
+                 y2="-0.0234375"
+                 id="linearGradient1853"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.89719623"
+                 y1="-0.1484375"
+                 x2="0.40186915"
+                 y2="0.5546875"
+                 id="linearGradient1854"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.90588236"
+                 y1="-0.2734375"
+                 x2="0.36470589"
+                 y2="0.5078125"
+                 id="linearGradient1855"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.56809336"
+                 y1="-0.125"
+                 x2="0.49027237"
+                 y2="0.59375"
+                 id="linearGradient1856"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="1.4128441"
+                 y1="1.25"
+                 x2="0.42201835"
+                 y2="0.4140625"
+                 id="linearGradient1857"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.084848486"
+                 y1="1.1640625"
+                 x2="0.53333336"
+                 y2="0.359375"
+                 id="linearGradient1858"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.76190478"
+                 y1="-0.53125"
+                 x2="0.6857143"
+                 y2="0.5390625"
+                 id="linearGradient1859"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 id="linearGradient1860">
+                <stop
+                   id="stop1861"
+                   style="stop-color:#ffffff;stop-opacity:0.83615822"
+                   offset="0" />
+                <stop
+                   id="stop1862"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="2.2054794"
+                 y1="2.03125"
+                 x2="0.56164384"
+                 y2="-0.28125"
+                 id="linearGradient52742"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.88832486"
+                 y1="1.0390625"
+                 x2="0.55837566"
+                 y2="0.3046875"
+                 id="linearGradient1864"
+                 xlink:href="#linearGradient1806" />
+              <linearGradient
+                 x1="0.85217392"
+                 y1="0.9609375"
+                 x2="0.86086959"
+                 y2="0.296875"
+                 id="linearGradient1865"
+                 xlink:href="#linearGradient1806" />
+              <linearGradient
+                 x1="0.064220183"
+                 y1="1.4375"
+                 x2="0.22018349"
+                 y2="0.3125"
+                 id="linearGradient1866"
+                 xlink:href="#linearGradient3970" />
+              <linearGradient
+                 id="linearGradient1867">
+                <stop
+                   id="stop1868"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1869"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.1011236"
+                 y1="0.7421875"
+                 x2="0.033707865"
+                 y2="0.5703125"
+                 id="linearGradient52750"
+                 xlink:href="#linearGradient3970" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient1871"
+                 xlink:href="#linearGradient4550"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <radialGradient
+                 cx="0.49032259"
+                 cy="0.50649351"
+                 r="0.38170236"
+                 fx="0.63414633"
+                 fy="0.37777779"
+                 id="radialGradient1875"
+                 xlink:href="#linearGradient1806" />
+            </defs>
+          </defs>
+          <radialGradient
+             cx="24.825565"
+             cy="176.56438"
+             r="42.859913"
+             fx="40.974991"
+             fy="162.11137"
+             id="radialGradient2139"
+             xlink:href="#linearGradient1806"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="693.25439"
+             y1="697.24719"
+             x2="657.74762"
+             y2="677.27399"
+             id="linearGradient2140"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.983783,1.016484)" />
+          <linearGradient
+             x1="681.34058"
+             y1="728.7738"
+             x2="641.37305"
+             y2="705.9129"
+             id="linearGradient2141"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.986777,1.0134)" />
+          <linearGradient
+             x1="649.57269"
+             y1="677.24323"
+             x2="630.47528"
+             y2="668.91809"
+             id="linearGradient2142"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988806,1.011321)" />
+          <linearGradient
+             x1="538.89514"
+             y1="277.2775"
+             x2="575.11407"
+             y2="342.66919"
+             id="linearGradient2144"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.998206,1.001797)" />
+          <linearGradient
+             x1="509.06769"
+             y1="327.76361"
+             x2="544.86011"
+             y2="399.38104"
+             id="linearGradient2145"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.972249,1.028543)" />
+          <linearGradient
+             x1="591.27606"
+             y1="330.16998"
+             x2="620.33301"
+             y2="382.54678"
+             id="linearGradient2146"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.044357,0.957527)" />
+          <linearGradient
+             x1="566.74347"
+             y1="415.15009"
+             x2="588.13922"
+             y2="458.04449"
+             id="linearGradient2147"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.03551,0.965707)" />
+        </defs>
+        <defs
+           id="defs5597">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient3247"
+             xlink:href="#linearGradient2629"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient5604">
+            <stop
+               id="stop5605"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop5606"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient5607">
+            <stop
+               id="stop5608"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop5609"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient5610">
+            <stop
+               id="stop5611"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop5612"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop5613"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop5614"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop5615"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient5616">
+            <stop
+               id="stop5617"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop5618"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="28.814428"
+             y1="-1.616316"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient5619"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.764292,1.3084)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient5620"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <linearGradient
+             x1="30.382267"
+             y1="7.5329666"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient5621"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+          <linearGradient
+             x1="25.954844"
+             y1="25.071495"
+             x2="39.781502"
+             y2="27.315489"
+             id="linearGradient5622"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103231)" />
+          <defs
+             id="defs52789">
+            <linearGradient
+               id="linearGradient5632">
+              <stop
+                 id="stop5633"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop5634"
+                 style="stop-color:#fafbff;stop-opacity:1"
+                 offset="0.25" />
+              <stop
+                 id="stop5635"
+                 style="stop-color:#f0f2fa;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop5636"
+                 style="stop-color:#e1e1e1;stop-opacity:1"
+                 offset="0.75" />
+              <stop
+                 id="stop5637"
+                 style="stop-color:#f5f6ff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient5638">
+              <stop
+                 id="stop5639"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop5640"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop5641"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1143">
+              <stop
+                 id="stop1144"
+                 style="stop-color:#e8e8e8;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1145"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient5645"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient5646"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <defs
+               id="defs5647">
+              <linearGradient
+                 id="linearGradient1150">
+                <stop
+                   id="stop1151"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1152"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient5651">
+                <stop
+                   id="stop5652"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop1155"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop1156"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop1157"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop5656"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient1159">
+                <stop
+                   id="stop5658"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop5659"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient5660"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient5661"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient5662"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient5663"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient5664"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs5665">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient5666"
+                   xlink:href="#linearGradient3296"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+              </defs>
+            </defs>
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient5684"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          </defs>
+        </defs>
+        <radialGradient
+           cx="41.875938"
+           cy="37.865574"
+           r="12.562782"
+           fx="46.384533"
+           fy="37.080399"
+           id="radialGradient6565"
+           xlink:href="#linearGradient1918"
+           gradientUnits="userSpaceOnUse" />
+        <defs
+           id="defs6175">
+          <linearGradient
+             id="linearGradient6182">
+            <stop
+               id="stop6183"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop6184"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient6185">
+            <stop
+               id="stop6186"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop6187"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient6188">
+            <stop
+               id="stop6189"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop6190"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop6191"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop6192"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop6193"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient6194">
+            <stop
+               id="stop6195"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop6196"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="23.756607"
+             cy="60.078049"
+             r="21.026033"
+             fx="23.756607"
+             fy="60.078049"
+             id="radialGradient6197"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+          <linearGradient
+             x1="31.82851"
+             y1="61.778381"
+             x2="33.198818"
+             y2="6.859036"
+             id="linearGradient6198"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+          <radialGradient
+             cx="92.478806"
+             cy="20.827066"
+             r="45.889046"
+             fx="92.478806"
+             fy="20.827066"
+             id="radialGradient6199"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient6200"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+          <linearGradient
+             x1="108.49871"
+             y1="17.573528"
+             x2="185.22578"
+             y2="24.330959"
+             id="linearGradient6201"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+          <linearGradient
+             x1="28.814428"
+             y1="-1.616316"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient6202"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.764292,1.3084)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient6203"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <linearGradient
+             x1="30.382267"
+             y1="7.5329666"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient6204"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+          <linearGradient
+             x1="25.954844"
+             y1="25.071495"
+             x2="39.781502"
+             y2="27.315489"
+             id="linearGradient6205"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103231)" />
+          <radialGradient
+             cx="23.756607"
+             cy="60.078049"
+             r="21.026033"
+             fx="23.756607"
+             fy="60.078049"
+             id="radialGradient2584"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+          <linearGradient
+             x1="31.82851"
+             y1="61.778381"
+             x2="33.198818"
+             y2="6.859036"
+             id="linearGradient2585"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+          <linearGradient
+             x1="36.826332"
+             y1="75.332558"
+             x2="25.761681"
+             y2="135.90358"
+             id="linearGradient2586"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+          <linearGradient
+             x1="78.675774"
+             y1="47.411823"
+             x2="64.05336"
+             y2="34.302757"
+             id="linearGradient2587"
+             xlink:href="#linearGradient4281"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+          <radialGradient
+             cx="92.478806"
+             cy="20.827066"
+             r="45.889046"
+             fx="92.478806"
+             fy="20.827066"
+             id="radialGradient2588"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient2589"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+          <linearGradient
+             x1="108.49871"
+             y1="17.573528"
+             x2="185.22578"
+             y2="24.330959"
+             id="linearGradient2590"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+          <defs
+             id="defs6220">
+            <linearGradient
+               id="linearGradient6221">
+              <stop
+                 id="stop6222"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop6223"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient6224">
+              <stop
+                 id="stop6225"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop6226"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop6227"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop6228"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop6229"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient6230">
+              <stop
+                 id="stop6231"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop6232"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <radialGradient
+               cx="23.756607"
+               cy="60.078049"
+               r="21.026033"
+               fx="23.756607"
+               fy="60.078049"
+               id="radialGradient6233"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.006281,0.993758)" />
+            <linearGradient
+               x1="31.82851"
+               y1="61.778381"
+               x2="33.198818"
+               y2="6.859036"
+               id="linearGradient6234"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.750054,0,0,1.072718,1.04579,2.663333)" />
+            <radialGradient
+               cx="92.478806"
+               cy="20.827066"
+               r="45.889046"
+               fx="92.478806"
+               fy="20.827066"
+               id="radialGradient6235"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.506767,1.973294)" />
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient6236"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="108.49871"
+               y1="17.573528"
+               x2="185.22578"
+               y2="24.330959"
+               id="linearGradient6237"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="28.814428"
+               y1="-1.616316"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient6238"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.764292,1.3084)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient6239"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <linearGradient
+               x1="30.382267"
+               y1="7.5329666"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient6240"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+            <linearGradient
+               x1="25.954844"
+               y1="25.071495"
+               x2="39.781502"
+               y2="27.315489"
+               id="linearGradient6241"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103231)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient6242"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient6243"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient6244"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs6245">
+              <linearGradient
+                 id="linearGradient6246">
+                <stop
+                   id="stop6247"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop6248"
+                   style="stop-color:#d0d1d9;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop6249"
+                   style="stop-color:#878b9b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+            </defs>
+          </defs>
+          <linearGradient
+             x1="36.826332"
+             y1="75.332558"
+             x2="25.761681"
+             y2="135.90358"
+             id="linearGradient2688"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+          <linearGradient
+             x1="78.675774"
+             y1="47.411823"
+             x2="64.05336"
+             y2="34.302757"
+             id="linearGradient52903"
+             xlink:href="#linearGradient4281"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(4.745269,-0.536764,1.618211,25.61588,-691.1427,-704.5108)" />
+          <linearGradient
+             x1="-191.46153"
+             y1="37.372372"
+             x2="-165.58835"
+             y2="37.372372"
+             id="linearGradient1385"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient52906"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient1387"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient52909"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient1389"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <linearGradient
+             x1="80.23925"
+             y1="81.05584"
+             x2="18.903805"
+             y2="13.944632"
+             id="linearGradient1390"
+             xlink:href="#linearGradient8157"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.88267,1.132926)" />
+          <linearGradient
+             x1="-19.039936"
+             y1="52.71389"
+             x2="15.223759"
+             y2="111.3392"
+             id="linearGradient1391"
+             xlink:href="#linearGradient3579"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.269095,-0.13167,8.088146e-2,0.779571,0,0)" />
+          <linearGradient
+             x1="71.088333"
+             y1="-6.6212053"
+             x2="97.343185"
+             y2="37.16391"
+             id="linearGradient1392"
+             xlink:href="#linearGradient3579"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.60451,-6.271869e-2,0.1698,1.636615,0,0)" />
+          <linearGradient
+             x1="95.224609"
+             y1="4.4250841"
+             x2="156.67999"
+             y2="20.792826"
+             id="linearGradient1393"
+             xlink:href="#linearGradient3579"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.583097,1.71498)" />
+          <defs
+             id="defs1245">
+            <linearGradient
+               id="linearGradient6279">
+              <stop
+                 id="stop6280"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop6281"
+                 style="stop-color:#fafbff;stop-opacity:1"
+                 offset="0.25" />
+              <stop
+                 id="stop6282"
+                 style="stop-color:#f0f2fa;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop6283"
+                 style="stop-color:#e1e1e1;stop-opacity:1"
+                 offset="0.75" />
+              <stop
+                 id="stop6284"
+                 style="stop-color:#f5f6ff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient6285">
+              <stop
+                 id="stop6286"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop6287"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop6288"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1259">
+              <stop
+                 id="stop1260"
+                 style="stop-color:#e8e8e8;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1261"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient6292"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient6293"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <defs
+               id="defs6294">
+              <linearGradient
+                 id="linearGradient1266">
+                <stop
+                   id="stop1267"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1268"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient6298">
+                <stop
+                   id="stop6299"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop1271"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop1272"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop1273"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop6303"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient1275">
+                <stop
+                   id="stop6305"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop6306"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient6307"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient1279"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient1280"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient1281"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient1282"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs1283">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient52951"
+                   xlink:href="#linearGradient3296"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+              </defs>
+            </defs>
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient6328"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          </defs>
+          <linearGradient
+             x1="36.826332"
+             y1="75.332558"
+             x2="25.761681"
+             y2="135.90358"
+             id="linearGradient1524"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(10.2395,-1.158248,0.749923,11.8711,-691.1427,-704.5108)" />
+          <linearGradient
+             x1="45.023643"
+             y1="20.534979"
+             x2="181.64224"
+             y2="116.28294"
+             id="linearGradient52961"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.961706,1.039819)" />
+          <radialGradient
+             cx="42.007256"
+             cy="39.007645"
+             r="9.8527927"
+             fx="37.805073"
+             fy="39.239628"
+             id="radialGradient52963"
+             xlink:href="#linearGradient1806"
+             gradientUnits="userSpaceOnUse" />
+          <radialGradient
+             cx="41.875938"
+             cy="37.865574"
+             r="12.562782"
+             fx="34.828526"
+             fy="31.584183"
+             id="radialGradient1437"
+             xlink:href="#linearGradient1918"
+             gradientUnits="userSpaceOnUse" />
+          <radialGradient
+             cx="41.875938"
+             cy="37.865574"
+             r="12.562782"
+             fx="46.384533"
+             fy="37.080399"
+             id="radialGradient52966"
+             xlink:href="#linearGradient1918"
+             gradientUnits="userSpaceOnUse" />
+          <radialGradient
+             cx="58.3755"
+             cy="22.775043"
+             r="10.998282"
+             fx="53.432022"
+             fy="22.164028"
+             id="radialGradient6342"
+             xlink:href="#linearGradient1954"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="23.770393"
+             y1="95.243881"
+             x2="53.66283"
+             y2="128.85732"
+             id="linearGradient6343"
+             xlink:href="#linearGradient1990"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988302,1.011837)" />
+          <linearGradient
+             x1="81.211525"
+             y1="116.07082"
+             x2="5.4840093"
+             y2="70.989281"
+             id="linearGradient6344"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988302,1.011837)" />
+          <linearGradient
+             x1="104.84399"
+             y1="321.39783"
+             x2="28.429239"
+             y2="277.92343"
+             id="linearGradient6346"
+             xlink:href="#linearGradient1918"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.946639,1.056369)" />
+          <linearGradient
+             x1="78.753586"
+             y1="397.89075"
+             x2="26.172459"
+             y2="351.19708"
+             id="linearGradient1444"
+             xlink:href="#linearGradient1908"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.184518,0.844225)" />
+          <linearGradient
+             x1="17.133598"
+             y1="12.402272"
+             x2="26.262699"
+             y2="12.402272"
+             id="linearGradient1445"
+             xlink:href="#linearGradient1918"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.598611,0.625543)" />
+          <linearGradient
+             x1="49.627895"
+             y1="396.80029"
+             x2="68.691986"
+             y2="424.20239"
+             id="linearGradient1446"
+             xlink:href="#linearGradient1954"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.233739,0.810545)" />
+          <linearGradient
+             x1="76.440941"
+             y1="246.53215"
+             x2="99.764214"
+             y2="262.3847"
+             id="linearGradient1447"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.789568,1.266516)" />
+          <linearGradient
+             x1="101.15012"
+             y1="378.20697"
+             x2="83.709572"
+             y2="352.44403"
+             id="linearGradient1448"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.168503,0.855796)" />
+          <linearGradient
+             x1="48.353672"
+             y1="99.757843"
+             x2="51.658588"
+             y2="103.12432"
+             id="linearGradient1449"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.917519,1.089896)" />
+          <linearGradient
+             x1="23.057707"
+             y1="411.51218"
+             x2="21.61964"
+             y2="422.44498"
+             id="linearGradient1450"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.088969,0.9183)" />
+          <linearGradient
+             x1="41.803413"
+             y1="372.34344"
+             x2="34.710552"
+             y2="376.63461"
+             id="linearGradient1451"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.967013,1.034112)" />
+          <linearGradient
+             x1="27.254147"
+             y1="436.18506"
+             x2="21.609068"
+             y2="441.86893"
+             id="linearGradient1452"
+             xlink:href="#linearGradient1990"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.121334,0.891795)" />
+          <defs
+             id="defs1860">
+            <linearGradient
+               id="linearGradient1990">
+              <stop
+                 id="stop1991"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="0" />
+              <stop
+                 id="stop1992"
+                 style="stop-color:#000000;stop-opacity:0.11299435"
+                 offset="0.5" />
+              <stop
+                 id="stop1993"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient52987">
+              <stop
+                 id="stop1983"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1984"
+                 style="stop-color:#ffffff;stop-opacity:0.07843138"
+                 offset="0.60111111" />
+              <stop
+                 id="stop1985"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient3506">
+              <stop
+                 id="stop1955"
+                 style="stop-color:#ffffff;stop-opacity:0.78431374"
+                 offset="0" />
+              <stop
+                 id="stop3697"
+                 style="stop-color:#990000;stop-opacity:0"
+                 offset="0.81" />
+              <stop
+                 id="stop1957"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient6369">
+              <stop
+                 id="stop1807"
+                 style="stop-color:#000000;stop-opacity:0.40677965"
+                 offset="0" />
+              <stop
+                 id="stop3276"
+                 style="stop-color:#000000;stop-opacity:0.07344633"
+                 offset="0.6477778" />
+              <stop
+                 id="stop1808"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient53000">
+              <stop
+                 id="stop53002"
+                 style="stop-color:#000000;stop-opacity:0.31638417"
+                 offset="0" />
+              <stop
+                 id="stop53004"
+                 style="stop-color:#000000;stop-opacity:0.07909604"
+                 offset="0.5" />
+              <stop
+                 id="stop53006"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1908">
+              <stop
+                 id="stop1909"
+                 style="stop-color:#884631;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop3698"
+                 style="stop-color:#df421e;stop-opacity:1"
+                 offset="0.625" />
+              <stop
+                 id="stop3699"
+                 style="stop-color:#efa08e;stop-opacity:1"
+                 offset="0.8125" />
+              <stop
+                 id="stop1910"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0.75690609"
+               y1="0.546875"
+               x2="-0.62430942"
+               y2="-0.6796875"
+               id="linearGradient1911"
+               xlink:href="#linearGradient1908" />
+            <linearGradient
+               x1="-9.8228717e-17"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient53024"
+               xlink:href="#linearGradient1918" />
+            <linearGradient
+               x1="0.42424244"
+               y1="0.375"
+               x2="-0.61818182"
+               y2="-0.625"
+               id="linearGradient1915"
+               xlink:href="#linearGradient1908" />
+            <linearGradient
+               x1="0.72649574"
+               y1="0.7734375"
+               x2="-0.49565217"
+               y2="0.078125"
+               id="linearGradient1922"
+               xlink:href="#linearGradient1918" />
+            <linearGradient
+               x1="0.85123968"
+               y1="0.2734375"
+               x2="0.43801653"
+               y2="0.5234375"
+               id="linearGradient1925"
+               xlink:href="#linearGradient1982" />
+            <linearGradient
+               x1="0.22047244"
+               y1="0.09375"
+               x2="0.81102359"
+               y2="0.7578125"
+               id="linearGradient53029"
+               xlink:href="#linearGradient1990" />
+            <radialGradient
+               cx="0.5"
+               cy="0.5"
+               r="0.5"
+               fx="0.21951219"
+               fy="0.25"
+               id="radialGradient53031"
+               xlink:href="#linearGradient1918" />
+            <radialGradient
+               cx="0.5"
+               cy="0.5"
+               r="0.5"
+               fx="0.67944252"
+               fy="0.46875"
+               id="radialGradient1937"
+               xlink:href="#linearGradient1918" />
+            <radialGradient
+               cx="0.84898806"
+               cy="0.41226101"
+               r="0.42322907"
+               fx="0.56333953"
+               fy="0.18582444"
+               id="radialGradient1941"
+               xlink:href="#linearGradient1918" />
+            <radialGradient
+               cx="0.5"
+               cy="0.5"
+               r="0.5"
+               fx="0.27526131"
+               fy="0.47222221"
+               id="radialGradient1953"
+               xlink:href="#linearGradient1954" />
+            <radialGradient
+               cx="0.50522649"
+               cy="0.54545456"
+               r="0.39214215"
+               fx="0.33797911"
+               fy="0.5546875"
+               id="radialGradient1977"
+               xlink:href="#linearGradient1806" />
+            <linearGradient
+               x1="-0.0051282053"
+               y1="-0.0703125"
+               x2="0.90256411"
+               y2="1.234375"
+               id="linearGradient6405"
+               xlink:href="#linearGradient1954" />
+            <linearGradient
+               x1="-8.569534e-16"
+               y1="0.25"
+               x2="0.66666669"
+               y2="0.703125"
+               id="linearGradient6406"
+               xlink:href="#linearGradient1982" />
+            <linearGradient
+               x1="1.2118226"
+               y1="1.2734375"
+               x2="0.34975371"
+               y2="1.1275703e-16"
+               id="linearGradient53041"
+               xlink:href="#linearGradient1982" />
+            <linearGradient
+               x1="0.50331128"
+               y1="0.25"
+               x2="0.4437086"
+               y2="0.703125"
+               id="linearGradient1989"
+               xlink:href="#linearGradient1982" />
+            <linearGradient
+               x1="0.3539823"
+               y1="0.484375"
+               x2="0.46902654"
+               y2="0.6015625"
+               id="linearGradient1996"
+               xlink:href="#linearGradient1982" />
+            <linearGradient
+               x1="0.50279331"
+               y1="0.40625"
+               x2="0.22346368"
+               y2="0.6875"
+               id="linearGradient1998"
+               xlink:href="#linearGradient1990" />
+            <linearGradient
+               x1="-0.24369748"
+               y1="0.03125"
+               x2="1.9411764"
+               y2="1.5625"
+               id="linearGradient6411"
+               xlink:href="#linearGradient1982" />
+            <linearGradient
+               x1="1.3779528"
+               y1="0.7109375"
+               x2="-0.11811024"
+               y2="-0.1796875"
+               id="linearGradient1644"
+               xlink:href="#linearGradient1982" />
+          </defs>
+          <linearGradient
+             x1="45.023643"
+             y1="20.534979"
+             x2="181.64224"
+             y2="116.28294"
+             id="linearGradient1623"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.961706,1.039819)" />
+          <radialGradient
+             cx="42.007256"
+             cy="39.007645"
+             r="9.8527927"
+             fx="37.805073"
+             fy="39.239628"
+             id="radialGradient1624"
+             xlink:href="#linearGradient1806"
+             gradientUnits="userSpaceOnUse" />
+          <radialGradient
+             cx="41.875938"
+             cy="37.865574"
+             r="12.562782"
+             fx="34.828526"
+             fy="31.584183"
+             id="radialGradient1625"
+             xlink:href="#linearGradient1918"
+             gradientUnits="userSpaceOnUse" />
+          <radialGradient
+             cx="41.875938"
+             cy="37.865574"
+             r="12.562782"
+             fx="46.384533"
+             fy="37.080399"
+             id="radialGradient1626"
+             xlink:href="#linearGradient1918"
+             gradientUnits="userSpaceOnUse" />
+          <radialGradient
+             cx="58.3755"
+             cy="22.775043"
+             r="10.998282"
+             fx="53.432022"
+             fy="22.164028"
+             id="radialGradient1627"
+             xlink:href="#linearGradient1954"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="23.770393"
+             y1="95.243881"
+             x2="53.66283"
+             y2="128.85732"
+             id="linearGradient1628"
+             xlink:href="#linearGradient1990"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988302,1.011837)" />
+          <linearGradient
+             x1="81.211525"
+             y1="116.07082"
+             x2="5.4840093"
+             y2="70.989281"
+             id="linearGradient1629"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988302,1.011837)" />
+          <linearGradient
+             x1="68.265488"
+             y1="370.90509"
+             x2="28.057238"
+             y2="332.33322"
+             id="linearGradient1630"
+             xlink:href="#linearGradient1908"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.133936,0.881884)" />
+          <linearGradient
+             x1="104.84399"
+             y1="321.39783"
+             x2="28.429239"
+             y2="277.92343"
+             id="linearGradient1631"
+             xlink:href="#linearGradient1918"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.946639,1.056369)" />
+          <linearGradient
+             x1="78.753586"
+             y1="397.89075"
+             x2="26.172459"
+             y2="351.19708"
+             id="linearGradient1632"
+             xlink:href="#linearGradient1908"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.184518,0.844225)" />
+          <linearGradient
+             x1="17.133598"
+             y1="12.402272"
+             x2="26.262699"
+             y2="12.402272"
+             id="linearGradient6465"
+             xlink:href="#linearGradient1918"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.598611,0.625543)" />
+          <linearGradient
+             x1="49.627895"
+             y1="396.80029"
+             x2="68.691986"
+             y2="424.20239"
+             id="linearGradient6466"
+             xlink:href="#linearGradient1954"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.233739,0.810545)" />
+          <linearGradient
+             x1="76.440941"
+             y1="246.53215"
+             x2="99.764214"
+             y2="262.3847"
+             id="linearGradient6467"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.789568,1.266516)" />
+          <linearGradient
+             x1="101.15012"
+             y1="378.20697"
+             x2="83.709572"
+             y2="352.44403"
+             id="linearGradient6468"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.168503,0.855796)" />
+          <linearGradient
+             x1="48.353672"
+             y1="99.757843"
+             x2="51.658588"
+             y2="103.12432"
+             id="linearGradient6469"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.917519,1.089896)" />
+          <linearGradient
+             x1="23.057707"
+             y1="411.51218"
+             x2="21.61964"
+             y2="422.44498"
+             id="linearGradient6470"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.088969,0.9183)" />
+          <linearGradient
+             x1="41.803413"
+             y1="372.34344"
+             x2="34.710552"
+             y2="376.63461"
+             id="linearGradient6471"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.967013,1.034112)" />
+          <linearGradient
+             x1="27.254147"
+             y1="436.18506"
+             x2="21.609068"
+             y2="441.86893"
+             id="linearGradient6472"
+             xlink:href="#linearGradient1990"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.121334,0.891795)" />
+          <linearGradient
+             x1="45.023643"
+             y1="20.534979"
+             x2="181.64224"
+             y2="116.28294"
+             id="linearGradient3614"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.961706,1.039819)" />
+          <radialGradient
+             cx="42.007256"
+             cy="39.007645"
+             r="9.8527927"
+             fx="37.805073"
+             fy="39.239628"
+             id="radialGradient1683"
+             xlink:href="#linearGradient1806"
+             gradientUnits="userSpaceOnUse" />
+          <radialGradient
+             cx="41.875938"
+             cy="37.865574"
+             r="12.562782"
+             fx="34.828526"
+             fy="31.584183"
+             id="radialGradient3616"
+             xlink:href="#linearGradient1918"
+             gradientUnits="userSpaceOnUse" />
+          <radialGradient
+             cx="41.875938"
+             cy="37.865574"
+             r="12.562782"
+             fx="46.384533"
+             fy="37.080399"
+             id="radialGradient1685"
+             xlink:href="#linearGradient1918"
+             gradientUnits="userSpaceOnUse" />
+          <radialGradient
+             cx="58.3755"
+             cy="22.775043"
+             r="10.998282"
+             fx="53.432022"
+             fy="22.164028"
+             id="radialGradient1686"
+             xlink:href="#linearGradient1954"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="23.770393"
+             y1="95.243881"
+             x2="53.66283"
+             y2="128.85732"
+             id="linearGradient1687"
+             xlink:href="#linearGradient1990"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988302,1.011837)" />
+          <linearGradient
+             x1="81.211525"
+             y1="116.07082"
+             x2="5.4840093"
+             y2="70.989281"
+             id="linearGradient53075"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988302,1.011837)" />
+          <linearGradient
+             x1="68.265488"
+             y1="370.90509"
+             x2="28.057238"
+             y2="332.33322"
+             id="linearGradient1689"
+             xlink:href="#linearGradient1908"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.133936,0.881884)" />
+          <linearGradient
+             x1="104.84399"
+             y1="321.39783"
+             x2="28.429239"
+             y2="277.92343"
+             id="linearGradient53078"
+             xlink:href="#linearGradient1918"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.946639,1.056369)" />
+          <linearGradient
+             x1="78.753586"
+             y1="397.89075"
+             x2="26.172459"
+             y2="351.19708"
+             id="linearGradient1691"
+             xlink:href="#linearGradient1908"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.184518,0.844225)" />
+          <linearGradient
+             x1="17.133598"
+             y1="12.402272"
+             x2="26.262699"
+             y2="12.402272"
+             id="linearGradient3624"
+             xlink:href="#linearGradient1918"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.598611,0.625543)" />
+          <linearGradient
+             x1="49.627895"
+             y1="396.80029"
+             x2="68.691986"
+             y2="424.20239"
+             id="linearGradient1693"
+             xlink:href="#linearGradient1954"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.233739,0.810545)" />
+          <linearGradient
+             x1="76.440941"
+             y1="246.53215"
+             x2="99.764214"
+             y2="262.3847"
+             id="linearGradient3626"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.789568,1.266516)" />
+          <linearGradient
+             x1="101.15012"
+             y1="378.20697"
+             x2="83.709572"
+             y2="352.44403"
+             id="linearGradient1695"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.168503,0.855796)" />
+          <linearGradient
+             x1="48.353672"
+             y1="99.757843"
+             x2="51.658588"
+             y2="103.12432"
+             id="linearGradient6487"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.917519,1.089896)" />
+          <linearGradient
+             x1="23.057707"
+             y1="411.51218"
+             x2="21.61964"
+             y2="422.44498"
+             id="linearGradient1698"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.088969,0.9183)" />
+          <linearGradient
+             x1="41.803413"
+             y1="372.34344"
+             x2="34.710552"
+             y2="376.63461"
+             id="linearGradient6489"
+             xlink:href="#linearGradient1982"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.967013,1.034112)" />
+          <linearGradient
+             x1="27.254147"
+             y1="436.18506"
+             x2="21.609068"
+             y2="441.86893"
+             id="linearGradient1701"
+             xlink:href="#linearGradient1990"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.121334,0.891795)" />
+        </defs>
+        <linearGradient
+           x1="179.83598"
+           y1="178.66379"
+           x2="200.25706"
+           y2="302.00961"
+           id="linearGradient7299"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.030776,0.970143)" />
+        <linearGradient
+           x1="178.64995"
+           y1="179.87529"
+           x2="198.41254"
+           y2="299.24384"
+           id="linearGradient7300"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.034428,0.966718)" />
+        <linearGradient
+           x1="181.35893"
+           y1="177.20132"
+           x2="202.65994"
+           y2="305.862"
+           id="linearGradient7301"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.026679,0.974015)" />
+        <linearGradient
+           x1="182.83167"
+           y1="175.80452"
+           x2="205.01575"
+           y2="309.7991"
+           id="linearGradient7302"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.022962,0.977554)" />
+        <linearGradient
+           x1="177.86378"
+           y1="181.4277"
+           x2="197.19272"
+           y2="298.17694"
+           id="linearGradient7303"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.036891,0.964422)" />
+        <linearGradient
+           x1="55.601124"
+           y1="-30.810305"
+           x2="40.876816"
+           y2="218.58856"
+           id="linearGradient7304"
+           xlink:href="#linearGradient1454"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.082134,0.9241)" />
+        <linearGradient
+           x1="64.116882"
+           y1="47.803505"
+           x2="37.547989"
+           y2="140.37704"
+           id="linearGradient7305"
+           xlink:href="#linearGradient1546"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.329487,0.75217)" />
+        <linearGradient
+           x1="83.123482"
+           y1="92.632271"
+           x2="77.120087"
+           y2="56.941833"
+           id="linearGradient7306"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.162115,0.8605)" />
+        <linearGradient
+           x1="48.88829"
+           y1="90.157753"
+           x2="99.629562"
+           y2="86.570915"
+           id="linearGradient7307"
+           xlink:href="#linearGradient1461"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.162115,0.8605)" />
+        <linearGradient
+           x1="57.724483"
+           y1="184.34286"
+           x2="55.957409"
+           y2="144.17274"
+           id="linearGradient7308"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.636328,0.611124)" />
+        <linearGradient
+           x1="55.045113"
+           y1="85.877014"
+           x2="109.27901"
+           y2="88.11335"
+           id="linearGradient7309"
+           xlink:href="#linearGradient1461"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.162536,0.860189)" />
+        <linearGradient
+           x1="66.679367"
+           y1="28.158081"
+           x2="66.679367"
+           y2="107.53253"
+           id="linearGradient7310"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.1618,0.860733)" />
+        <linearGradient
+           x1="47.242912"
+           y1="77.450203"
+           x2="109.62949"
+           y2="76.102692"
+           id="linearGradient7311"
+           xlink:href="#linearGradient1461"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.1618,0.860733)" />
+        <linearGradient
+           x1="71.901497"
+           y1="69.209007"
+           x2="85.293274"
+           y2="102.17883"
+           id="linearGradient7312"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.179599,0.847746)" />
+        <linearGradient
+           x1="55.239422"
+           y1="97.356407"
+           x2="25.40143"
+           y2="29.790384"
+           id="linearGradient7313"
+           xlink:href="#linearGradient1461"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.942585,1.060912)" />
+        <linearGradient
+           x1="53.647789"
+           y1="101.89593"
+           x2="53.647789"
+           y2="160.91232"
+           id="linearGradient7314"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.289244,0.775649)" />
+        <linearGradient
+           x1="69.363586"
+           y1="56.763401"
+           x2="71.684402"
+           y2="101.294"
+           id="linearGradient7315"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.20398,0.830579)" />
+        <linearGradient
+           x1="28.813946"
+           y1="221.79578"
+           x2="10.582993"
+           y2="235.65099"
+           id="linearGradient7316"
+           xlink:href="#linearGradient1551"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.709409,0.584998)" />
+        <radialGradient
+           cx="24.825565"
+           cy="176.56438"
+           r="42.859913"
+           fx="40.974991"
+           fy="162.11137"
+           id="radialGradient7317"
+           xlink:href="#linearGradient4545"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="693.25439"
+           y1="697.24719"
+           x2="657.74762"
+           y2="677.27399"
+           id="linearGradient7318"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.983783,1.016484)" />
+        <linearGradient
+           x1="681.34058"
+           y1="728.7738"
+           x2="641.37305"
+           y2="705.9129"
+           id="linearGradient7319"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.986777,1.0134)" />
+        <linearGradient
+           x1="649.57269"
+           y1="677.24323"
+           x2="630.47528"
+           y2="668.91809"
+           id="linearGradient7320"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988806,1.011321)" />
+        <linearGradient
+           x1="612.97107"
+           y1="685.40314"
+           x2="641.86005"
+           y2="685.40314"
+           id="linearGradient7321"
+           xlink:href="#linearGradient1749"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.975718,1.024886)" />
+        <linearGradient
+           x1="538.89514"
+           y1="277.2775"
+           x2="575.11407"
+           y2="342.66919"
+           id="linearGradient7322"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.998206,1.001797)" />
+        <linearGradient
+           x1="509.06769"
+           y1="327.76361"
+           x2="544.86011"
+           y2="399.38104"
+           id="linearGradient7323"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.972249,1.028543)" />
+        <linearGradient
+           x1="591.27606"
+           y1="330.16998"
+           x2="620.33301"
+           y2="382.54678"
+           id="linearGradient7324"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.044357,0.957527)" />
+        <linearGradient
+           x1="566.74347"
+           y1="415.15009"
+           x2="588.13922"
+           y2="458.04449"
+           id="linearGradient7325"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.03551,0.965707)" />
+        <defs
+           id="defs6947">
+          <linearGradient
+             id="linearGradient6948">
+            <stop
+               id="stop6949"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop6950"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient6951">
+            <stop
+               id="stop6952"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop6953"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient6954">
+            <stop
+               id="stop6955"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop6956"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop6957"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop6958"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop6959"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient6960">
+            <stop
+               id="stop6961"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop6962"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient6963"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <defs
+             id="defs6964">
+            <linearGradient
+               id="linearGradient6965">
+              <stop
+                 id="stop6966"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop6967"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient6968">
+              <stop
+                 id="stop6969"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop6970"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop6971"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop6972"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop6973"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient6974">
+              <stop
+                 id="stop6975"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop6976"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <radialGradient
+               cx="23.756607"
+               cy="60.078049"
+               r="21.026033"
+               fx="23.756607"
+               fy="60.078049"
+               id="radialGradient6977"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.006281,0.993758)" />
+            <linearGradient
+               x1="31.82851"
+               y1="61.778381"
+               x2="33.198818"
+               y2="6.859036"
+               id="linearGradient6978"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.750054,0,0,1.072718,1.04579,2.663333)" />
+            <radialGradient
+               cx="92.478806"
+               cy="20.827066"
+               r="45.889046"
+               fx="92.478806"
+               fy="20.827066"
+               id="radialGradient6979"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.506767,1.973294)" />
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient6980"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="108.49871"
+               y1="17.573528"
+               x2="185.22578"
+               y2="24.330959"
+               id="linearGradient6981"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="28.814428"
+               y1="-1.616316"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient6982"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.764292,1.3084)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient6983"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <linearGradient
+               x1="30.382267"
+               y1="7.5329666"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient6984"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+            <linearGradient
+               x1="25.954844"
+               y1="25.071495"
+               x2="39.781502"
+               y2="27.315489"
+               id="linearGradient6985"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103231)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient6986"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient6987"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient6988"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs6989">
+              <linearGradient
+                 id="linearGradient6990">
+                <stop
+                   id="stop6991"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop6992"
+                   style="stop-color:#d0d1d9;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop6993"
+                   style="stop-color:#878b9b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+            </defs>
+          </defs>
+          <defs
+             id="defs7011">
+            <linearGradient
+               id="linearGradient7012">
+              <stop
+                 id="stop7013"
+                 style="stop-color:#826647;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop7014"
+                 style="stop-color:#575147;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0.36627907"
+               y1="0.8125"
+               x2="0.36627907"
+               y2="0.1796875"
+               id="linearGradient7015"
+               xlink:href="#linearGradient1136"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="-0.109375"
+               y1="0.9140625"
+               x2="1.15625"
+               y2="0.1796875"
+               id="linearGradient7016"
+               xlink:href="#linearGradient1136" />
+          </defs>
+          <radialGradient
+             cx="24.825565"
+             cy="176.56438"
+             r="42.859913"
+             fx="40.974991"
+             fy="162.11137"
+             id="radialGradient7037"
+             xlink:href="#linearGradient1806"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="693.25439"
+             y1="697.24719"
+             x2="657.74762"
+             y2="677.27399"
+             id="linearGradient7038"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.983783,1.016484)" />
+          <linearGradient
+             x1="681.34058"
+             y1="728.7738"
+             x2="641.37305"
+             y2="705.9129"
+             id="linearGradient7039"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.986777,1.0134)" />
+          <linearGradient
+             x1="649.57269"
+             y1="677.24323"
+             x2="630.47528"
+             y2="668.91809"
+             id="linearGradient7040"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988806,1.011321)" />
+          <linearGradient
+             x1="647.99902"
+             y1="693.73279"
+             x2="629.89734"
+             y2="683.8114"
+             id="linearGradient7041"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.975718,1.024886)" />
+          <linearGradient
+             x1="538.89514"
+             y1="277.2775"
+             x2="575.11407"
+             y2="342.66919"
+             id="linearGradient7042"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.998206,1.001797)" />
+          <linearGradient
+             x1="509.06769"
+             y1="327.76361"
+             x2="544.86011"
+             y2="399.38104"
+             id="linearGradient7043"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.972249,1.028543)" />
+          <linearGradient
+             x1="591.27606"
+             y1="330.16998"
+             x2="620.33301"
+             y2="382.54678"
+             id="linearGradient7044"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.044357,0.957527)" />
+          <linearGradient
+             x1="566.74347"
+             y1="415.15009"
+             x2="588.13922"
+             y2="458.04449"
+             id="linearGradient7045"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.03551,0.965707)" />
+          <defs
+             id="defs7046">
+            <linearGradient
+               x1="0.25179857"
+               y1="-0.0390625"
+               x2="0.53237408"
+               y2="0.5234375"
+               id="linearGradient7047"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="0.092198581"
+               y1="-0.2109375"
+               x2="0.4822695"
+               y2="0.4921875"
+               id="linearGradient7048"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="0.016528925"
+               y1="-0.4921875"
+               x2="0.51239669"
+               y2="0.5"
+               id="linearGradient7049"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="0.05511811"
+               y1="-0.3046875"
+               x2="0.53543305"
+               y2="0.5625"
+               id="linearGradient7050"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="1.2125034"
+               y1="0.78833276"
+               x2="0.5859077"
+               y2="0.44490069"
+               id="linearGradient7051"
+               xlink:href="#linearGradient4215"
+               gradientTransform="scale(0.999075,1.000926)" />
+            <linearGradient
+               id="linearGradient7052">
+              <stop
+                 id="stop7053"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop7054"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="1.1610887"
+               y1="0.61942029"
+               x2="0.47761098"
+               y2="0.3214713"
+               id="linearGradient7055"
+               xlink:href="#linearGradient4215"
+               gradientTransform="scale(1.003618,0.996395)" />
+            <linearGradient
+               x1="1.8455285"
+               y1="1.34375"
+               x2="0.47967479"
+               y2="0.5625"
+               id="linearGradient7056"
+               xlink:href="#linearGradient4021" />
+            <linearGradient
+               id="linearGradient7057">
+              <stop
+                 id="stop7058"
+                 style="stop-color:#000000;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop7059"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="1.7519705"
+               y1="1.0528145"
+               x2="0.54093099"
+               y2="0.37158158"
+               id="linearGradient7060"
+               xlink:href="#linearGradient4021"
+               gradientTransform="scale(0.990884,1.0092)" />
+            <linearGradient
+               x1="0.24528302"
+               y1="1.6015625"
+               x2="0.28301886"
+               y2="-0.0234375"
+               id="linearGradient7061"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.89719623"
+               y1="-0.1484375"
+               x2="0.40186915"
+               y2="0.5546875"
+               id="linearGradient7062"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.90588236"
+               y1="-0.2734375"
+               x2="0.36470589"
+               y2="0.5078125"
+               id="linearGradient7063"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.56809336"
+               y1="-0.125"
+               x2="0.49027237"
+               y2="0.59375"
+               id="linearGradient7064"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="1.4128441"
+               y1="1.25"
+               x2="0.42201835"
+               y2="0.4140625"
+               id="linearGradient7065"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.084848486"
+               y1="1.1640625"
+               x2="0.53333336"
+               y2="0.359375"
+               id="linearGradient7066"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.76190478"
+               y1="-0.53125"
+               x2="0.6857143"
+               y2="0.5390625"
+               id="linearGradient7067"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               id="linearGradient7068">
+              <stop
+                 id="stop7069"
+                 style="stop-color:#ffffff;stop-opacity:0.83615822"
+                 offset="0" />
+              <stop
+                 id="stop7070"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="2.2054794"
+               y1="2.03125"
+               x2="0.56164384"
+               y2="-0.28125"
+               id="linearGradient7071"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.88832486"
+               y1="1.0390625"
+               x2="0.55837566"
+               y2="0.3046875"
+               id="linearGradient7072"
+               xlink:href="#linearGradient1806" />
+            <linearGradient
+               x1="0.85217392"
+               y1="0.9609375"
+               x2="0.86086959"
+               y2="0.296875"
+               id="linearGradient7073"
+               xlink:href="#linearGradient1806" />
+            <linearGradient
+               x1="0.064220183"
+               y1="1.4375"
+               x2="0.22018349"
+               y2="0.3125"
+               id="linearGradient7074"
+               xlink:href="#linearGradient3970" />
+            <linearGradient
+               id="linearGradient7075">
+              <stop
+                 id="stop7076"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop7077"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="1.1011236"
+               y1="0.7421875"
+               x2="0.033707865"
+               y2="0.5703125"
+               id="linearGradient7078"
+               xlink:href="#linearGradient3970" />
+            <linearGradient
+               id="linearGradient7079">
+              <stop
+                 id="stop7080"
+                 style="stop-color:#000000;stop-opacity:0.2937853"
+                 offset="0" />
+              <stop
+                 id="stop7081"
+                 style="stop-color:#000000;stop-opacity:0.06214689"
+                 offset="0.6477778" />
+              <stop
+                 id="stop7082"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <radialGradient
+               cx="0.49032259"
+               cy="0.50649351"
+               r="0.38170236"
+               fx="0.63414633"
+               fy="0.37777779"
+               id="radialGradient7083"
+               xlink:href="#linearGradient1806" />
+          </defs>
+          <linearGradient
+             x1="647.99902"
+             y1="693.73279"
+             x2="629.89734"
+             y2="683.8114"
+             id="linearGradient7132"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.975718,1.024886)" />
+        </defs>
+        <radialGradient
+           cx="24.825565"
+           cy="176.56438"
+           r="42.859913"
+           fx="40.974991"
+           fy="162.11137"
+           id="radialGradient7647"
+           xlink:href="#linearGradient4545"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="693.25439"
+           y1="697.24719"
+           x2="657.74762"
+           y2="677.27399"
+           id="linearGradient53229"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.983783,1.016484)" />
+        <linearGradient
+           x1="681.34058"
+           y1="728.7738"
+           x2="641.37305"
+           y2="705.9129"
+           id="linearGradient7649"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.986777,1.0134)" />
+        <linearGradient
+           x1="649.57269"
+           y1="677.24323"
+           x2="630.47528"
+           y2="668.91809"
+           id="linearGradient7650"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988806,1.011321)" />
+        <linearGradient
+           x1="612.97107"
+           y1="685.40314"
+           x2="641.86005"
+           y2="685.40314"
+           id="linearGradient7651"
+           xlink:href="#linearGradient1749"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.975718,1.024886)" />
+        <linearGradient
+           x1="538.89514"
+           y1="277.2775"
+           x2="575.11407"
+           y2="342.66919"
+           id="linearGradient7652"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.998206,1.001797)" />
+        <linearGradient
+           x1="509.06769"
+           y1="327.76361"
+           x2="544.86011"
+           y2="399.38104"
+           id="linearGradient7653"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.972249,1.028543)" />
+        <linearGradient
+           x1="591.27606"
+           y1="330.16998"
+           x2="620.33301"
+           y2="382.54678"
+           id="linearGradient7654"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.044357,0.957527)" />
+        <linearGradient
+           x1="566.74347"
+           y1="415.15009"
+           x2="588.13922"
+           y2="458.04449"
+           id="linearGradient7655"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.03551,0.965707)" />
+        <linearGradient
+           x1="179.83598"
+           y1="178.66379"
+           x2="200.25706"
+           y2="302.00961"
+           id="linearGradient3663"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.030776,0.970143)" />
+        <linearGradient
+           x1="178.64995"
+           y1="179.87529"
+           x2="198.41254"
+           y2="299.24384"
+           id="linearGradient3664"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.034428,0.966718)" />
+        <linearGradient
+           x1="181.35893"
+           y1="177.20132"
+           x2="202.65994"
+           y2="305.862"
+           id="linearGradient3665"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.026679,0.974015)" />
+        <linearGradient
+           x1="182.83167"
+           y1="175.80452"
+           x2="205.01575"
+           y2="309.7991"
+           id="linearGradient3667"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.022962,0.977554)" />
+        <linearGradient
+           x1="177.86378"
+           y1="181.4277"
+           x2="197.19272"
+           y2="298.17694"
+           id="linearGradient53242"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.036891,0.964422)" />
+        <linearGradient
+           x1="55.601124"
+           y1="-30.810305"
+           x2="40.876816"
+           y2="218.58856"
+           id="linearGradient3669"
+           xlink:href="#linearGradient1454"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.082134,0.9241)" />
+        <linearGradient
+           x1="64.116882"
+           y1="47.803505"
+           x2="37.547989"
+           y2="140.37704"
+           id="linearGradient53245"
+           xlink:href="#linearGradient1546"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.329487,0.75217)" />
+        <linearGradient
+           x1="83.123482"
+           y1="92.632271"
+           x2="77.120087"
+           y2="56.941833"
+           id="linearGradient3671"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.162115,0.8605)" />
+        <linearGradient
+           x1="48.88829"
+           y1="90.157753"
+           x2="99.629562"
+           y2="86.570915"
+           id="linearGradient53248"
+           xlink:href="#linearGradient1461"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.162115,0.8605)" />
+        <linearGradient
+           x1="57.724483"
+           y1="184.34286"
+           x2="55.957409"
+           y2="144.17274"
+           id="linearGradient3673"
+           xlink:href="#linearGradient1502"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.636328,0.611124)" />
+        <linearGradient
+           x1="55.045113"
+           y1="85.877014"
+           x2="109.27901"
+           y2="88.11335"
+           id="linearGradient3674"
+           xlink:href="#linearGradient1461"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.162536,0.860189)" />
+        <linearGradient
+           x1="66.679367"
+           y1="28.158081"
+           x2="66.679367"
+           y2="107.53253"
+           id="linearGradient3675"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.1618,0.860733)" />
+        <linearGradient
+           x1="47.242912"
+           y1="77.450203"
+           x2="109.62949"
+           y2="76.102692"
+           id="linearGradient3676"
+           xlink:href="#linearGradient1461"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.1618,0.860733)" />
+        <linearGradient
+           x1="71.901497"
+           y1="69.209007"
+           x2="85.293274"
+           y2="102.17883"
+           id="linearGradient3677"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.179599,0.847746)" />
+        <linearGradient
+           x1="55.239422"
+           y1="97.356407"
+           x2="25.40143"
+           y2="29.790384"
+           id="linearGradient3678"
+           xlink:href="#linearGradient1461"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.942585,1.060912)" />
+        <linearGradient
+           x1="53.647789"
+           y1="101.89593"
+           x2="53.647789"
+           y2="160.91232"
+           id="linearGradient3679"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.289244,0.775649)" />
+        <linearGradient
+           x1="69.363586"
+           y1="56.763401"
+           x2="71.684402"
+           y2="101.294"
+           id="linearGradient3680"
+           xlink:href="#linearGradient1494"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.20398,0.830579)" />
+        <linearGradient
+           x1="28.813946"
+           y1="221.79578"
+           x2="10.582993"
+           y2="235.65099"
+           id="linearGradient53258"
+           xlink:href="#linearGradient1551"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.709409,0.584998)" />
+        <radialGradient
+           cx="24.825565"
+           cy="176.56438"
+           r="42.859913"
+           fx="40.974991"
+           fy="162.11137"
+           id="radialGradient3682"
+           xlink:href="#linearGradient4545"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="693.25439"
+           y1="697.24719"
+           x2="657.74762"
+           y2="677.27399"
+           id="linearGradient3683"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.983783,1.016484)" />
+        <linearGradient
+           x1="681.34058"
+           y1="728.7738"
+           x2="641.37305"
+           y2="705.9129"
+           id="linearGradient3684"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.986777,1.0134)" />
+        <linearGradient
+           x1="649.57269"
+           y1="677.24323"
+           x2="630.47528"
+           y2="668.91809"
+           id="linearGradient53263"
+           xlink:href="#linearGradient3256"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988806,1.011321)" />
+        <linearGradient
+           x1="612.97107"
+           y1="685.40314"
+           x2="641.86005"
+           y2="685.40314"
+           id="linearGradient3686"
+           xlink:href="#linearGradient2629"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.975718,1.024886)"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="538.89514"
+           y1="277.2775"
+           x2="575.11407"
+           y2="342.66919"
+           id="linearGradient53266"
+           xlink:href="#linearGradient3256"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.998206,1.001797)" />
+        <linearGradient
+           x1="509.06769"
+           y1="327.76361"
+           x2="544.86011"
+           y2="399.38104"
+           id="linearGradient3688"
+           xlink:href="#linearGradient3256"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.972249,1.028543)" />
+        <linearGradient
+           x1="591.27606"
+           y1="330.16998"
+           x2="620.33301"
+           y2="382.54678"
+           id="linearGradient53269"
+           xlink:href="#linearGradient3256"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.044357,0.957527)" />
+        <linearGradient
+           x1="566.74347"
+           y1="415.15009"
+           x2="588.13922"
+           y2="458.04449"
+           id="linearGradient3690"
+           xlink:href="#linearGradient3256"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.03551,0.965707)" />
+        <linearGradient
+           x1="27.172323"
+           y1="135.45018"
+           x2="51.170948"
+           y2="159.60898"
+           id="linearGradient3042"
+           xlink:href="#linearGradient3057"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.56826,0,0,0.43693,60.1476,67.44818)"
+           spreadMethod="pad" />
+        <defs
+           id="defs2900">
+          <linearGradient
+             id="linearGradient2220">
+            <stop
+               id="stop2222"
+               style="stop-color:#e28700;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop53276"
+               style="stop-color:#ffdbaf;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient3874">
+            <stop
+               id="stop2211"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop2210"
+               style="stop-color:#ffffff;stop-opacity:0.01568628"
+               offset="0.25315788" />
+            <stop
+               id="stop2209"
+               style="stop-color:#ffffff;stop-opacity:0.69999999"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient3878">
+            <stop
+               id="stop2632"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2206"
+               style="stop-color:#000000;stop-opacity:0.76612902"
+               offset="0.87947369" />
+            <stop
+               id="stop2205"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient1579">
+            <stop
+               id="stop1581"
+               style="stop-color:#5ea730;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop1580"
+               style="stop-color:#8eef2c;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient53289">
+            <stop
+               id="stop2916"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2917"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient2918">
+            <stop
+               id="stop2919"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2920"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient2921">
+            <stop
+               id="stop2922"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop2923"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop2924"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop2925"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop2926"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient53302">
+            <stop
+               id="stop2928"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2929"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="23.756607"
+             cy="60.078049"
+             r="21.026033"
+             fx="23.756607"
+             fy="60.078049"
+             id="radialGradient2930"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+          <linearGradient
+             x1="31.82851"
+             y1="61.778381"
+             x2="33.198818"
+             y2="6.859036"
+             id="linearGradient53307"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+          <radialGradient
+             cx="92.478806"
+             cy="20.827066"
+             r="45.889046"
+             fx="92.478806"
+             fy="20.827066"
+             id="radialGradient2932"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient53310"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+          <linearGradient
+             x1="108.49871"
+             y1="17.573528"
+             x2="185.22578"
+             y2="24.330959"
+             id="linearGradient2934"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+          <linearGradient
+             x1="28.814428"
+             y1="-1.616316"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient53313"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.764292,1.3084)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient2936"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <linearGradient
+             x1="30.382267"
+             y1="7.5329666"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient2937"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+          <linearGradient
+             x1="25.954844"
+             y1="25.071495"
+             x2="39.781502"
+             y2="27.315489"
+             id="linearGradient53317"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103231)" />
+          <linearGradient
+             x1="74.915154"
+             y1="289.24429"
+             x2="74.915154"
+             y2="143.41141"
+             id="linearGradient2939"
+             xlink:href="#linearGradient869"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.402029,0.713252)" />
+          <linearGradient
+             x1="66.81208"
+             y1="253.09772"
+             x2="66.81208"
+             y2="329.44394"
+             id="linearGradient2940"
+             xlink:href="#linearGradient883"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.599772,0.625089)" />
+          <linearGradient
+             x1="114.98484"
+             y1="133.38522"
+             x2="114.98484"
+             y2="15.619798"
+             id="linearGradient2941"
+             xlink:href="#linearGradient875"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.93614,1.068216)" />
+          <linearGradient
+             x1="76.700623"
+             y1="73.338425"
+             x2="76.700623"
+             y2="20.345196"
+             id="linearGradient2942"
+             xlink:href="#linearGradient940"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.099362,0.909619)" />
+          <defs
+             id="defs2944">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient2945"
+               xlink:href="#linearGradient2208"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient53326"
+               xlink:href="#linearGradient2220"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient2947">
+              <stop
+                 id="stop2948"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="0" />
+              <stop
+                 id="stop2949"
+                 style="stop-color:#ffffff;stop-opacity:0.57254905"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient2950"
+               xlink:href="#linearGradient1579"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient2951">
+              <stop
+                 id="stop2952"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="0" />
+              <stop
+                 id="stop2953"
+                 style="stop-color:#ffffff;stop-opacity:0.49193549"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient2954"
+               xlink:href="#linearGradient2204"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient53336">
+              <stop
+                 id="stop2956"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="0" />
+              <stop
+                 id="stop2957"
+                 style="stop-color:#ffffff;stop-opacity:0.57254905"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient2958">
+              <stop
+                 id="stop2959"
+                 style="stop-color:#dddddd;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop2960"
+                 style="stop-color:#f5f5f5;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0.49285713"
+               y1="0.98591548"
+               x2="0.49285713"
+               y2="7.0833374e-16"
+               id="linearGradient2961"
+               xlink:href="#linearGradient869" />
+            <linearGradient
+               x1="0.46031743"
+               y1="0.98591542"
+               x2="0.46031743"
+               y2="0.0070422594"
+               id="linearGradient2962"
+               xlink:href="#linearGradient875" />
+            <linearGradient
+               x1="0.48823529"
+               y1="1.0070423"
+               x2="0.48823529"
+               y2="-0.0070422534"
+               id="linearGradient53345"
+               xlink:href="#linearGradient940" />
+            <linearGradient
+               x1="0.49224809"
+               y1="0.0070421356"
+               x2="0.49224809"
+               y2="0.99295789"
+               id="linearGradient2964"
+               xlink:href="#linearGradient883" />
+            <radialGradient
+               cx="0.5"
+               cy="0.5"
+               r="0.5"
+               fx="0.5"
+               fy="0.5"
+               id="radialGradient2965"
+               xlink:href="#linearGradient930" />
+          </defs>
+          <linearGradient
+             x1="114.98484"
+             y1="133.38522"
+             x2="114.98484"
+             y2="15.619798"
+             id="linearGradient3004"
+             xlink:href="#linearGradient875"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.93614,1.068216)" />
+          <linearGradient
+             x1="76.700623"
+             y1="73.338425"
+             x2="76.700623"
+             y2="20.345196"
+             id="linearGradient3005"
+             xlink:href="#linearGradient940"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.099362,0.909619)" />
+          <linearGradient
+             x1="74.915154"
+             y1="289.24429"
+             x2="74.915154"
+             y2="143.41141"
+             id="linearGradient3006"
+             xlink:href="#linearGradient869"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.402029,0.713252)" />
+          <linearGradient
+             x1="66.81208"
+             y1="253.09772"
+             x2="66.81208"
+             y2="329.44394"
+             id="linearGradient3007"
+             xlink:href="#linearGradient883"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.599772,0.625089)" />
+          <linearGradient
+             x1="58.919556"
+             y1="110.96445"
+             x2="52.629063"
+             y2="161.4733"
+             id="linearGradient3014"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.063095,0,0,0.819358,3.271898,9.280837)" />
+        </defs>
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient4845"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient4846"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <linearGradient
+           x1="88.712402"
+           y1="138.15012"
+           x2="104.81104"
+           y2="151.63045"
+           id="linearGradient4847"
+           xlink:href="#linearGradient3305"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        <radialGradient
+           cx="-77.367622"
+           cy="42.633839"
+           r="216.26619"
+           fx="-80.036034"
+           fy="44.468376"
+           id="radialGradient4848"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+        <defs
+           id="defs4691">
+          <linearGradient
+             id="linearGradient4692">
+            <stop
+               id="stop4693"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4694"
+               style="stop-color:#fafbff;stop-opacity:1"
+               offset="0.25" />
+            <stop
+               id="stop4695"
+               style="stop-color:#f0f2fa;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop4696"
+               style="stop-color:#e1e1e1;stop-opacity:1"
+               offset="0.75" />
+            <stop
+               id="stop4697"
+               style="stop-color:#f5f6ff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4698">
+            <stop
+               id="stop4699"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4700"
+               style="stop-color:#d0d1d9;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop4701"
+               style="stop-color:#878b9b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4705">
+            <stop
+               id="stop4706"
+               style="stop-color:#e8e8e8;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4707"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient4709"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient4710"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <defs
+             id="defs4711">
+            <linearGradient
+               id="linearGradient4712">
+              <stop
+                 id="stop4713"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop4714"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient4715">
+              <stop
+                 id="stop4716"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop4717"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop4718"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop4719"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop4720"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient4721">
+              <stop
+                 id="stop4722"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop4723"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient4724"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient4725"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient4726"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient4727"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient4728"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs4729">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient4730"
+                 xlink:href="#linearGradient3296"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+            </defs>
+          </defs>
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient4748"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        </defs>
+        <linearGradient
+           x1="52.683483"
+           y1="104.09244"
+           x2="58.380398"
+           y2="252.54866"
+           id="linearGradient16818"
+           xlink:href="#linearGradient2678"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.334689,0,0,1.038479,-0.72121,-66.60727)" />
+        <linearGradient
+           x1="52.19524"
+           y1="64.818008"
+           x2="52.19524"
+           y2="122.69208"
+           id="linearGradient4413"
+           xlink:href="#linearGradient2483"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.111523,0,0,0.771568,-0.72121,-29.98157)" />
+        <linearGradient
+           x1="29.958502"
+           y1="-23.328955"
+           x2="29.958502"
+           y2="190.05157"
+           id="linearGradient4414"
+           xlink:href="#linearGradient2678"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.127153,0,0,0.781382,0.981463,-27.99057)" />
+        <linearGradient
+           x1="96.41098"
+           y1="57.341877"
+           x2="81.065781"
+           y2="196.048"
+           id="linearGradient4415"
+           xlink:href="#linearGradient2871"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.176531,0,0,0.821515,0,4.496065)" />
+        <linearGradient
+           x1="483.2298"
+           y1="97.833481"
+           x2="562.21454"
+           y2="1064.5424"
+           id="linearGradient4416"
+           xlink:href="#linearGradient1531"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.502271,0.665659)" />
+        <linearGradient
+           x1="314.50467"
+           y1="2690.406"
+           x2="384.80078"
+           y2="2690.406"
+           id="linearGradient4417"
+           xlink:href="#linearGradient3540"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(4.209444,0.237561)" />
+        <radialGradient
+           cx="41.875938"
+           cy="37.865574"
+           r="12.562782"
+           fx="42.023739"
+           fy="37.865574"
+           id="radialGradient4418"
+           xlink:href="#linearGradient4066"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="11276.761"
+           y1="5908"
+           x2="-10290.378"
+           y2="8376.0635"
+           id="linearGradient4420"
+           xlink:href="#linearGradient3296"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="11701.849"
+           y1="13028.776"
+           x2="15175.786"
+           y2="9521.5176"
+           id="linearGradient4421"
+           xlink:href="#linearGradient3916"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(5.464784e-3,0,0,5.325523e-3,191.6882,44.23734)" />
+        <linearGradient
+           x1="251.82268"
+           y1="115.52762"
+           x2="296.51724"
+           y2="115.52762"
+           id="linearGradient4422"
+           xlink:href="#linearGradient3636"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.986883,1.013292)" />
+        <linearGradient
+           x1="-161.57674"
+           y1="253.95526"
+           x2="-116.53033"
+           y2="311.73874"
+           id="linearGradient4423"
+           xlink:href="#linearGradient4063"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-0.846674,0.343014,0.288328,0.736755,18.9977,-80.1446)" />
+        <linearGradient
+           x1="42.53046"
+           y1="133.41551"
+           x2="53.520744"
+           y2="163.73753"
+           id="linearGradient4424"
+           xlink:href="#linearGradient4063"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-1.790967,0.310143,0.182364,0.974268,282.562,-80.82299)" />
+        <linearGradient
+           x1="248.30553"
+           y1="198.48206"
+           x2="257.16309"
+           y2="148.14442"
+           id="linearGradient4425"
+           xlink:href="#linearGradient3913"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.842789,0,0,0.800919,18.7268,-73.96861)" />
+        <defs
+           id="defs2892">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient53418"
+             xlink:href="#linearGradient6942"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient53420">
+            <stop
+               id="stop53422"
+               style="stop-color:#ffffff;stop-opacity:0.74901962"
+               offset="0" />
+            <stop
+               id="stop53424"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient53426">
+            <stop
+               id="stop53428"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop53430"
+               style="stop-color:#ffffff;stop-opacity:0.35164836"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient2902">
+            <stop
+               id="stop53433"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop53435"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient53437">
+            <stop
+               id="stop53439"
+               style="stop-color:#7e818c;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop53441"
+               style="stop-color:#d5dbed;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="84.960785"
+             y1="92.151367"
+             x2="42.64373"
+             y2="53.360722"
+             id="linearGradient53443"
+             xlink:href="#linearGradient1749"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.321949,0.756459)" />
+          <linearGradient
+             x1="31.82851"
+             y1="61.778381"
+             x2="33.198818"
+             y2="6.859036"
+             id="linearGradient53445"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+          <linearGradient
+             x1="186.07457"
+             y1="23.533224"
+             x2="202.6377"
+             y2="23.47304"
+             id="linearGradient53447"
+             xlink:href="#linearGradient2689"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.388045,2.57702)" />
+          <linearGradient
+             x1="92.631454"
+             y1="54.989693"
+             x2="92.631454"
+             y2="50.608093"
+             id="linearGradient53449"
+             xlink:href="#linearGradient1757"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.787838,1.269296)" />
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient53451"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+          <linearGradient
+             x1="1270.3132"
+             y1="4.8765283"
+             x2="1247.6848"
+             y2="0.72310239"
+             id="linearGradient53453"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(9.440723e-2,10.59241)" />
+          <linearGradient
+             x1="1270.3132"
+             y1="4.8765283"
+             x2="1247.6848"
+             y2="0.72310239"
+             id="linearGradient53455"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+          <linearGradient
+             x1="-191.46153"
+             y1="37.372372"
+             x2="-165.58835"
+             y2="37.372372"
+             id="linearGradient53457"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient53459"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient53461"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient53463"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <linearGradient
+             x1="100.76616"
+             y1="77.379333"
+             x2="125.25793"
+             y2="77.379333"
+             id="linearGradient53465"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+          <linearGradient
+             x1="100.76616"
+             y1="77.379333"
+             x2="125.25793"
+             y2="77.379333"
+             id="linearGradient53467"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+          <linearGradient
+             x1="10.145814"
+             y1="21.762129"
+             x2="19.678274"
+             y2="15.811033"
+             id="linearGradient53469"
+             xlink:href="#linearGradient1930"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+          <linearGradient
+             x1="226.35037"
+             y1="198.74835"
+             x2="174.43694"
+             y2="217.6319"
+             id="linearGradient53471"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.959874,1.041804)" />
+          <linearGradient
+             x1="-94.151642"
+             y1="379.97745"
+             x2="-100.4097"
+             y2="374.03232"
+             id="linearGradient53473"
+             xlink:href="#linearGradient1870"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.088448,0.91874)" />
+          <linearGradient
+             x1="97.345161"
+             y1="112.84396"
+             x2="99.20697"
+             y2="115.81121"
+             id="linearGradient53475"
+             xlink:href="#linearGradient2560"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.206907,0.828564)"
+             spreadMethod="reflect" />
+          <linearGradient
+             x1="-13.15085"
+             y1="250.48668"
+             x2="-5.590662"
+             y2="258.31036"
+             id="linearGradient53477"
+             xlink:href="#linearGradient2560"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+          <linearGradient
+             x1="240.97612"
+             y1="200.61511"
+             x2="231.89941"
+             y2="205.45764"
+             id="linearGradient53479"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.866855,1.153596)" />
+          <linearGradient
+             x1="7.1050277"
+             y1="221.98289"
+             x2="46.488174"
+             y2="259.94464"
+             id="linearGradient53481"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+          <linearGradient
+             x1="7.1050277"
+             y1="221.98289"
+             x2="46.488174"
+             y2="259.94464"
+             id="linearGradient53483"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+          <defs
+             id="defs53485">
+            <linearGradient
+               id="linearGradient53487">
+              <stop
+                 id="stop53489"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53491"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient2943">
+              <stop
+                 id="stop53494"
+                 style="stop-color:#c86f32;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53496"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient2948">
+              <stop
+                 id="stop53499"
+                 style="stop-color:#d88721;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53501"
+                 style="stop-color:#a85c00;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop53503"
+                 style="stop-color:#643e0e;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient53505">
+              <stop
+                 id="stop53507"
+                 style="stop-color:#868686;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53509"
+                 style="stop-color:#e2e2e2;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient53511">
+              <stop
+                 id="stop53513"
+                 style="stop-color:#ff9870;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53515"
+                 style="stop-color:#ffd8c9;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient4115">
+              <stop
+                 id="stop53518"
+                 style="stop-color:#ffd7c0;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53520"
+                 style="stop-color:#ffbc96;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient4118">
+              <stop
+                 id="stop53523"
+                 style="stop-color:#ffbc96;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53525"
+                 style="stop-color:#ffeafe;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient14140">
+              <stop
+                 id="stop2966"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop2967"
+                 style="stop-color:#fafbff;stop-opacity:1"
+                 offset="0.25" />
+              <stop
+                 id="stop2968"
+                 style="stop-color:#f0f2fa;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop2969"
+                 style="stop-color:#e1e1e1;stop-opacity:1"
+                 offset="0.75" />
+              <stop
+                 id="stop2970"
+                 style="stop-color:#f5f6ff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient2971">
+              <stop
+                 id="stop2972"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop2973"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop2974"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient53537">
+              <stop
+                 id="stop2976"
+                 style="stop-color:#e8e8e8;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop2977"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient2978"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient2979"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <defs
+               id="defs2980">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient53544"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient2982">
+                <stop
+                   id="stop2983"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop53548"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop53550"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop53552"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop2987"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient53555">
+                <stop
+                   id="stop2989"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2990"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient2991"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient53560"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient2993"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient2994"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient2995"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs2996">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient2997"
+                   xlink:href="#linearGradient3296"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+              </defs>
+            </defs>
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient3015"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            <defs
+               id="defs3016">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient53573"
+                 xlink:href="#linearGradient1863"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient53575"
+                 xlink:href="#linearGradient2560"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient53577"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient53579"
+                 xlink:href="#linearGradient1302"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="96.346039"
+                 y1="84.428337"
+                 x2="121.44556"
+                 y2="65.093857"
+                 id="linearGradient53581"
+                 xlink:href="#linearGradient1716"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.962035,0,0,1.039463,0.899729,-0.17995)" />
+              <linearGradient
+                 x1="104.09006"
+                 y1="83.359146"
+                 x2="123.82494"
+                 y2="70.956947"
+                 id="linearGradient53583"
+                 xlink:href="#linearGradient1724"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.028242,0.972534)" />
+              <linearGradient
+                 x1="100.76616"
+                 y1="77.379333"
+                 x2="125.25793"
+                 y2="77.379333"
+                 id="linearGradient53585"
+                 xlink:href="#linearGradient1724"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.028607,0.972188)" />
+              <linearGradient
+                 x1="97.345161"
+                 y1="112.84396"
+                 x2="99.20697"
+                 y2="115.81121"
+                 id="linearGradient53587"
+                 xlink:href="#linearGradient1741"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.206907,0.828564)"
+                 spreadMethod="reflect" />
+              <linearGradient
+                 x1="168.2516"
+                 y1="181.01073"
+                 x2="185.96996"
+                 y2="172.51707"
+                 id="linearGradient53589"
+                 xlink:href="#linearGradient4873"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.959874,0,0,1.041804,24.17578,34.86402)" />
+              <linearGradient
+                 x1="97.281265"
+                 y1="84.255211"
+                 x2="127.84677"
+                 y2="61.142742"
+                 id="linearGradient53591"
+                 xlink:href="#linearGradient1716"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.962035,1.039463)" />
+              <linearGradient
+                 x1="104.09006"
+                 y1="83.359146"
+                 x2="123.82494"
+                 y2="70.956947"
+                 id="linearGradient53593"
+                 xlink:href="#linearGradient1724"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.028242,0.972534)" />
+              <linearGradient
+                 x1="100.76616"
+                 y1="77.379333"
+                 x2="125.25793"
+                 y2="77.379333"
+                 id="linearGradient53595"
+                 xlink:href="#linearGradient1724"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.028607,0.972188)" />
+              <linearGradient
+                 x1="97.281265"
+                 y1="84.255211"
+                 x2="127.84677"
+                 y2="61.142742"
+                 id="linearGradient53597"
+                 xlink:href="#linearGradient1716"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.962035,1.039463)" />
+            </defs>
+            <linearGradient
+               x1="104.09006"
+               y1="83.359146"
+               x2="123.82494"
+               y2="70.956947"
+               id="linearGradient53603"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient53605"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+            <linearGradient
+               x1="10.145814"
+               y1="21.762129"
+               x2="19.678274"
+               y2="15.811033"
+               id="linearGradient53607"
+               xlink:href="#linearGradient1930"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+            <linearGradient
+               x1="226.35037"
+               y1="198.74835"
+               x2="174.43694"
+               y2="217.6319"
+               id="linearGradient53609"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.959874,1.041804)" />
+            <linearGradient
+               x1="97.345161"
+               y1="112.84396"
+               x2="99.20697"
+               y2="115.81121"
+               id="linearGradient53611"
+               xlink:href="#linearGradient2560"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.206907,0.828564)"
+               spreadMethod="reflect" />
+            <linearGradient
+               x1="-94.151642"
+               y1="379.97745"
+               x2="-100.4097"
+               y2="374.03232"
+               id="linearGradient53613"
+               xlink:href="#linearGradient1870"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.088448,0.91874)" />
+            <linearGradient
+               x1="-13.15085"
+               y1="250.48668"
+               x2="-5.590662"
+               y2="258.31036"
+               id="linearGradient53615"
+               xlink:href="#linearGradient2560"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+            <linearGradient
+               x1="240.97612"
+               y1="200.61511"
+               x2="231.89941"
+               y2="205.45764"
+               id="linearGradient53617"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.866855,1.153596)" />
+            <linearGradient
+               x1="7.1050277"
+               y1="221.98289"
+               x2="46.488174"
+               y2="259.94464"
+               id="linearGradient53619"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+            <linearGradient
+               x1="7.1050277"
+               y1="221.98289"
+               x2="46.488174"
+               y2="259.94464"
+               id="linearGradient53621"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient53623"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+          </defs>
+          <linearGradient
+             x1="100.76616"
+             y1="77.379333"
+             x2="125.25793"
+             y2="77.379333"
+             id="linearGradient53629"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+          <linearGradient
+             x1="100.76616"
+             y1="77.379333"
+             x2="125.25793"
+             y2="77.379333"
+             id="linearGradient53631"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+          <linearGradient
+             x1="10.145814"
+             y1="21.762129"
+             x2="19.678274"
+             y2="15.811033"
+             id="linearGradient53633"
+             xlink:href="#linearGradient1930"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+          <linearGradient
+             x1="-94.151642"
+             y1="379.97745"
+             x2="-100.4097"
+             y2="374.03232"
+             id="linearGradient53635"
+             xlink:href="#linearGradient1870"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.088448,0.91874)" />
+          <linearGradient
+             x1="97.345161"
+             y1="112.84396"
+             x2="99.20697"
+             y2="115.81121"
+             id="linearGradient53637"
+             xlink:href="#linearGradient2560"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.206907,0.828564)"
+             spreadMethod="reflect" />
+          <linearGradient
+             x1="-13.15085"
+             y1="250.48668"
+             x2="-5.590662"
+             y2="258.31036"
+             id="linearGradient3095"
+             xlink:href="#linearGradient2560"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+          <linearGradient
+             x1="240.97612"
+             y1="200.61511"
+             x2="231.89941"
+             y2="205.45764"
+             id="linearGradient53640"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.866855,1.153596)" />
+          <linearGradient
+             x1="7.1050277"
+             y1="221.98289"
+             x2="46.488174"
+             y2="259.94464"
+             id="linearGradient53642"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+          <linearGradient
+             x1="7.1050277"
+             y1="221.98289"
+             x2="46.488174"
+             y2="259.94464"
+             id="linearGradient53644"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+          <linearGradient
+             x1="11276.761"
+             y1="5908"
+             x2="-10290.378"
+             y2="8376.0635"
+             id="linearGradient2858"
+             xlink:href="#linearGradient3296"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="11701.849"
+             y1="13028.776"
+             x2="15175.786"
+             y2="9521.5176"
+             id="linearGradient2866"
+             xlink:href="#linearGradient3916"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(5.464784e-3,0,0,5.325523e-3,191.6882,44.23734)" />
+          <linearGradient
+             x1="307.43765"
+             y1="234.53671"
+             x2="292.48148"
+             y2="245.30841"
+             id="linearGradient2867"
+             xlink:href="#linearGradient3936"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.847559,0,0,0.796411,18.7268,-73.96861)" />
+          <linearGradient
+             x1="-161.57674"
+             y1="253.95526"
+             x2="-116.53033"
+             y2="311.73874"
+             id="linearGradient2868"
+             xlink:href="#linearGradient4063"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.846674,0.343014,0.288328,0.736755,18.9977,-80.1446)" />
+          <linearGradient
+             x1="42.53046"
+             y1="133.41551"
+             x2="53.520744"
+             y2="163.73753"
+             id="linearGradient2869"
+             xlink:href="#linearGradient4063"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-1.790967,0.310143,0.182364,0.974268,282.562,-80.82299)" />
+          <linearGradient
+             x1="248.30553"
+             y1="198.48206"
+             x2="257.16309"
+             y2="148.14442"
+             id="linearGradient2872"
+             xlink:href="#linearGradient3913"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.842789,0,0,0.800919,18.7268,-73.96861)" />
+          <defs
+             id="defs53652">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient53654"
+               xlink:href="#linearGradient4066"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient53656">
+              <stop
+                 id="stop53658"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53660"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient4263">
+              <stop
+                 id="stop53663"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="0" />
+              <stop
+                 id="stop53665"
+                 style="stop-color:#7d8787;stop-opacity:0.1451"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient53667">
+              <stop
+                 id="stop53669"
+                 style="stop-color:#000000;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53671"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient53673">
+              <stop
+                 id="stop53675"
+                 style="stop-color:#57575a;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53677"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient53679">
+              <stop
+                 id="stop53681"
+                 style="stop-color:#9db8d2;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53683"
+                 style="stop-color:#6988b7;stop-opacity:0.375"
+                 offset="0.5" />
+              <stop
+                 id="stop53685"
+                 style="stop-color:#929395;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient3125">
+              <stop
+                 id="stop53688"
+                 style="stop-color:#2e97af;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53690"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient53692"
+               xlink:href="#linearGradient4063"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient53694">
+              <stop
+                 id="stop53696"
+                 style="stop-color:#adc0d2;stop-opacity:0.91764706"
+                 offset="0" />
+              <stop
+                 id="stop53698"
+                 style="stop-color:#4b6983;stop-opacity:0.77319586"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient53700">
+              <stop
+                 id="stop53702"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53704"
+                 style="stop-color:#fafbff;stop-opacity:1"
+                 offset="0.25" />
+              <stop
+                 id="stop4286"
+                 style="stop-color:#f0f2fa;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop53707"
+                 style="stop-color:#e1e1e1;stop-opacity:1"
+                 offset="0.75" />
+              <stop
+                 id="stop53709"
+                 style="stop-color:#f5f6ff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient53711">
+              <stop
+                 id="stop53713"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53715"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop53717"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient53719">
+              <stop
+                 id="stop53721"
+                 style="stop-color:#e8e8e8;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop53723"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient53725"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient53727"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <defs
+               id="defs53729">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient53731"
+                 xlink:href="#linearGradient3936"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient53733">
+                <stop
+                   id="stop53735"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop53737"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop53739"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop53741"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop53743"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient53745">
+                <stop
+                   id="stop53747"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop53749"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient53751"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient53753"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient53755"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient53757"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient53759"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs53761">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient53763"
+                   xlink:href="#linearGradient3296"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+              </defs>
+            </defs>
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient53773"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            <defs
+               id="defs53775">
+              <linearGradient
+                 id="linearGradient53777">
+                <stop
+                   id="stop53779"
+                   style="stop-color:#000000;stop-opacity:0.22314049"
+                   offset="0" />
+                <stop
+                   id="stop53781"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient3184"
+                 xlink:href="#linearGradient3703"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient53784"
+                 xlink:href="#linearGradient1395"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient53786">
+                <stop
+                   id="stop53788"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop53790"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient53792"
+                 xlink:href="#linearGradient2021"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient3106">
+                <stop
+                   id="stop4342"
+                   style="stop-color:#83a67f;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop53796"
+                   style="stop-color:#eaeaea;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient3109"
+                 xlink:href="#linearGradient3916"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0.47368422"
+                 y1="0.1171875"
+                 x2="0.59649122"
+                 y2="1.21875"
+                 id="linearGradient53799"
+                 xlink:href="#linearGradient1443" />
+              <linearGradient
+                 x1="0.63380283"
+                 y1="0.11764706"
+                 x2="0.62676054"
+                 y2="0.74369746"
+                 id="linearGradient53801"
+                 xlink:href="#linearGradient870" />
+              <linearGradient
+                 x1="0.56690139"
+                 y1="-0.29629636"
+                 x2="0.66549295"
+                 y2="0.65432096"
+                 id="linearGradient53803"
+                 xlink:href="#linearGradient1045" />
+              <linearGradient
+                 x1="0.78195488"
+                 y1="0.3828125"
+                 x2="0.57894737"
+                 y2="0.609375"
+                 id="linearGradient53805"
+                 xlink:href="#linearGradient1045" />
+              <linearGradient
+                 x1="0.21097578"
+                 y1="-1.2339019"
+                 x2="1.2504174"
+                 y2="-0.10575413"
+                 id="linearGradient53807"
+                 xlink:href="#linearGradient1125"
+                 gradientTransform="scale(1.096129,0.912302)" />
+              <linearGradient
+                 x1="-0.21705426"
+                 y1="0.5546875"
+                 x2="1.5399107"
+                 y2="0.5546875"
+                 id="linearGradient3199"
+                 xlink:href="#linearGradient1125" />
+              <linearGradient
+                 x1="0.23239437"
+                 y1="-0.2389937"
+                 x2="0.62676054"
+                 y2="0.8490566"
+                 id="linearGradient53810"
+                 xlink:href="#linearGradient1045" />
+              <radialGradient
+                 cx="0.44718307"
+                 cy="0.51748252"
+                 r="0.57398623"
+                 fx="0.63028163"
+                 fy="0.16783214"
+                 id="radialGradient3201"
+                 xlink:href="#linearGradient1439" />
+              <radialGradient
+                 cx="0.46126762"
+                 cy="0.5403226"
+                 r="0.51062703"
+                 fx="0.50704223"
+                 fy="0.20025954"
+                 id="radialGradient53813"
+                 xlink:href="#linearGradient1443" />
+              <linearGradient
+                 id="linearGradient53815"
+                 xlink:href="#linearGradient1202" />
+            </defs>
+            <linearGradient
+               x1="57.667629"
+               y1="84.017433"
+               x2="60.490723"
+               y2="111.23763"
+               id="linearGradient53821"
+               xlink:href="#linearGradient2021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.08132,0.924795)" />
+            <linearGradient
+               x1="-2602.7705"
+               y1="6138.4531"
+               x2="9707.4707"
+               y2="6138.2944"
+               id="linearGradient53823"
+               xlink:href="#linearGradient3650"
+               gradientUnits="userSpaceOnUse" />
+            <defs
+               id="defs3248">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient53826"
+                 xlink:href="#linearGradient3933"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient53828"
+                 xlink:href="#linearGradient3681"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient53830"
+                 xlink:href="#linearGradient3913"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <defs
+                 id="defs53832">
+                <clipPath
+                   id="clipPath53834">
+                  <polygon
+                     points="17084,18485 16474,17828 15861,17169 15244,16508 14623,15843 13998,15175 13369,14505 12735,13831 12097,13154 11455,12473 10808,11789 10157,11102 9501,10412 9517,10188 9741,9851 10061,9507 10369,9259 10554,9215 11207,9890 11877,10561 12558,11228 13247,11891 13940,12550 14633,13207 15321,13859 16001,14509 16668,15156 17320,15800 17951,16442 18559,17082 18536,17278 18315,17593 17977,17949 17605,18268 17279,18472 17084,18485 "
+                     id="polygon53836" />
+                </clipPath>
+              </defs>
+              <linearGradient
+                 x1="0.22399895"
+                 y1="0.42968741"
+                 x2="0.41599995"
+                 y2="0.24999991"
+                 id="linearGradient53838"
+                 xlink:href="#linearGradient3558" />
+              <linearGradient
+                 x1="0.39199805"
+                 y1="0.52343756"
+                 x2="0.66400015"
+                 y2="0.51562506"
+                 id="linearGradient53840"
+                 xlink:href="#linearGradient3655" />
+              <linearGradient
+                 x1="-0.24806577"
+                 y1="0.53907728"
+                 x2="0.86046565"
+                 y2="0.53906298"
+                 id="linearGradient53842"
+                 xlink:href="#linearGradient3650" />
+            </defs>
+            <radialGradient
+               cx="41.875938"
+               cy="37.865574"
+               r="12.562782"
+               fx="42.023739"
+               fy="37.865574"
+               id="radialGradient53848"
+               xlink:href="#linearGradient2002"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="520.57166"
+               y1="506.28723"
+               x2="520.57166"
+               y2="466.2785"
+               id="linearGradient53850"
+               xlink:href="#linearGradient1697"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="522.94183"
+               y1="469.49918"
+               x2="522.94183"
+               y2="505.0845"
+               id="linearGradient3300"
+               xlink:href="#linearGradient1697"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="520.57166"
+               y1="506.28723"
+               x2="520.57166"
+               y2="466.2785"
+               id="linearGradient53853"
+               xlink:href="#linearGradient1735"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="44.930588"
+               y1="56.725216"
+               x2="45.511845"
+               y2="185.05675"
+               id="linearGradient53855"
+               xlink:href="#linearGradient1702"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.694118,0,0,0.651906,0,-2.410339)" />
+            <defs
+               id="defs53857">
+              <linearGradient
+                 id="linearGradient53859">
+                <stop
+                   id="stop53861"
+                   style="stop-color:#e6d500;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop53863"
+                   style="stop-color:#ffba61;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient53865">
+                <stop
+                   id="stop53867"
+                   style="stop-color:#e6da1e;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop53869"
+                   style="stop-color:#fff99b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient53871"
+                 xlink:href="#linearGradient4802"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient53873">
+                <stop
+                   id="stop53875"
+                   style="stop-color:#ccff5f;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop53877"
+                   style="stop-color:#69db0e;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient53879">
+                <stop
+                   id="stop53881"
+                   style="stop-color:#ffffff;stop-opacity:0.69072163"
+                   offset="0" />
+                <stop
+                   id="stop53883"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient53885">
+                <stop
+                   id="stop53887"
+                   style="stop-color:#69db0e;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop53889"
+                   style="stop-color:#397607;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="520.57166"
+                 y1="506.28723"
+                 x2="520.57166"
+                 y2="466.2785"
+                 id="linearGradient53891"
+                 xlink:href="#linearGradient1697"
+                 gradientUnits="userSpaceOnUse" />
+              <radialGradient
+                 cx="522.89532"
+                 cy="481.86633"
+                 r="15.301119"
+                 fx="522.89911"
+                 fy="473.03323"
+                 id="radialGradient53893"
+                 xlink:href="#linearGradient1702"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="522.94183"
+                 y1="469.49918"
+                 x2="522.94183"
+                 y2="505.0845"
+                 id="linearGradient53895"
+                 xlink:href="#linearGradient1697"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="213.82799"
+                 y1="183.48366"
+                 x2="214.59154"
+                 y2="463.47311"
+                 id="linearGradient53897"
+                 xlink:href="#linearGradient1702"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+              <linearGradient
+                 x1="27.119711"
+                 y1="-353.75928"
+                 x2="27.018383"
+                 y2="-316.47729"
+                 id="linearGradient53899"
+                 xlink:href="#linearGradient1702"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(2.89873,-0.344979)" />
+              <radialGradient
+                 cx="41.875938"
+                 cy="37.865574"
+                 r="12.562782"
+                 fx="42.023739"
+                 fy="37.865574"
+                 id="radialGradient53901"
+                 xlink:href="#linearGradient1845"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="10.68618"
+                 y1="22.702703"
+                 x2="11.660023"
+                 y2="4.1041274"
+                 id="linearGradient4477"
+                 xlink:href="#linearGradient1302"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.016203,0.984055)" />
+              <linearGradient
+                 x1="16.88386"
+                 y1="28.772741"
+                 x2="12.516754"
+                 y2="2.6018224"
+                 id="linearGradient53904"
+                 xlink:href="#linearGradient1305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.016203,0.984055)" />
+              <defs
+                 id="defs53906">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient53908"
+                   xlink:href="#linearGradient2002"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient53910"
+                   xlink:href="#linearGradient2009"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient53912"
+                   xlink:href="#linearGradient2006"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient4483">
+                  <stop
+                     id="stop4484"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop4485"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient53917">
+                  <stop
+                     id="stop3336"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop3337"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient53921">
+                  <stop
+                     id="stop53923"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop53925"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop53927"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop53929"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop53931"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient53933">
+                  <stop
+                     id="stop53935"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop53937"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="28.814428"
+                   y1="-1.616316"
+                   x2="47.366039"
+                   y2="22.769617"
+                   id="linearGradient53939"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.764292,1.3084)" />
+                <linearGradient
+                   x1="30.722504"
+                   y1="28.135216"
+                   x2="39.78149"
+                   y2="27.315481"
+                   id="linearGradient53941"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103232)" />
+                <linearGradient
+                   x1="30.382267"
+                   y1="7.5329666"
+                   x2="47.366039"
+                   y2="22.769617"
+                   id="linearGradient53943"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+                <linearGradient
+                   x1="25.954844"
+                   y1="25.071495"
+                   x2="39.781502"
+                   y2="27.315489"
+                   id="linearGradient53945"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103231)" />
+                <defs
+                   id="defs53947">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient53949"
+                     xlink:href="#linearGradient1302"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient53951"
+                     xlink:href="#linearGradient1305"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     id="linearGradient53953">
+                    <stop
+                       id="stop53955"
+                       style="stop-color:#e6da1e;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop53957"
+                       style="stop-color:#b5ab17;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="0.28441054"
+                     y1="0.88272494"
+                     x2="0.32513002"
+                     y2="0.10505857"
+                     id="linearGradient53959"
+                     xlink:href="#linearGradient4114" />
+                  <linearGradient
+                     x1="-0.0078431377"
+                     y1="-1.244898"
+                     x2="0.59607846"
+                     y2="0.3605442"
+                     id="linearGradient53961"
+                     xlink:href="#linearGradient1513" />
+                  <linearGradient
+                     x1="-0.4509804"
+                     y1="-0.15053764"
+                     x2="0.47058824"
+                     y2="0.36559141"
+                     id="linearGradient53963"
+                     xlink:href="#linearGradient1513" />
+                  <linearGradient
+                     x1="0.45882353"
+                     y1="1.2772278"
+                     x2="0.6901961"
+                     y2="-0.2970297"
+                     id="linearGradient53965"
+                     xlink:href="#linearGradient2122" />
+                  <linearGradient
+                     x1="-0.18232045"
+                     y1="-0.43962848"
+                     x2="0.68508285"
+                     y2="0.42414862"
+                     id="linearGradient53967"
+                     xlink:href="#linearGradient1513" />
+                  <linearGradient
+                     id="linearGradient53969">
+                    <stop
+                       id="stop53971"
+                       style="stop-color:#000000;stop-opacity:0.40784314"
+                       offset="0" />
+                    <stop
+                       id="stop53973"
+                       style="stop-color:#000000;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="1.3783784"
+                     y1="0.25386998"
+                     x2="0.58378381"
+                     y2="0.13003096"
+                     id="linearGradient53975"
+                     xlink:href="#linearGradient2122" />
+                  <linearGradient
+                     x1="-0.14213198"
+                     y1="-0.28792569"
+                     x2="0.49753696"
+                     y2="0.35603714"
+                     id="linearGradient53977"
+                     xlink:href="#linearGradient1513" />
+                  <linearGradient
+                     x1="0.99512196"
+                     y1="0.64396286"
+                     x2="0.32682925"
+                     y2="0.3003096"
+                     id="linearGradient53979"
+                     xlink:href="#linearGradient1918" />
+                  <linearGradient
+                     x1="0.27843139"
+                     y1="-0.063694268"
+                     x2="0.4509804"
+                     y2="0.61146498"
+                     id="linearGradient53981"
+                     xlink:href="#linearGradient1513" />
+                  <linearGradient
+                     id="linearGradient53983">
+                    <stop
+                       id="stop53985"
+                       style="stop-color:#d6d6d6;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop53987"
+                       style="stop-color:#eaeaea;stop-opacity:1"
+                       offset="0.25769231" />
+                    <stop
+                       id="stop53989"
+                       style="stop-color:#919191;stop-opacity:1"
+                       offset="0.7059449" />
+                    <stop
+                       id="stop53991"
+                       style="stop-color:#d2d2d2;stop-opacity:1"
+                       offset="0.73347497" />
+                    <stop
+                       id="stop53993"
+                       style="stop-color:#a6a6a6;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="0.47450981"
+                     y1="0.21771218"
+                     x2="0.80392158"
+                     y2="0.5202952"
+                     id="linearGradient53995"
+                     xlink:href="#linearGradient2317" />
+                  <linearGradient
+                     id="linearGradient53997">
+                    <stop
+                       id="stop53999"
+                       style="stop-color:#ffffff;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop54001"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="0.41568628"
+                     y1="0.27687296"
+                     x2="0.59607846"
+                     y2="0.44299674"
+                     id="linearGradient54003"
+                     xlink:href="#linearGradient1513" />
+                  <radialGradient
+                     cx="0.5"
+                     cy="0.5"
+                     r="0.5"
+                     fx="0.38431373"
+                     fy="0.47619048"
+                     id="radialGradient54005"
+                     xlink:href="#linearGradient1918" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient3381"
+                     xlink:href="#linearGradient1845"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <radialGradient
+                     cx="0.5"
+                     cy="0.5"
+                     r="0.5"
+                     fx="0.50588238"
+                     fy="0.5"
+                     id="radialGradient3382"
+                     xlink:href="#linearGradient1918" />
+                  <linearGradient
+                     x1="0.54355544"
+                     y1="1.1365328"
+                     x2="0.36095273"
+                     y2="0.042242367"
+                     id="linearGradient54009"
+                     xlink:href="#linearGradient4111" />
+                </defs>
+              </defs>
+            </defs>
+          </defs>
+          <defs
+             id="defs1804">
+            <linearGradient
+               id="linearGradient54028">
+              <stop
+                 id="stop4634"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop54031"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient54033">
+              <stop
+                 id="stop54035"
+                 style="stop-color:#d6d6d6;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop54037"
+                 style="stop-color:#eaeaea;stop-opacity:1"
+                 offset="0.25769231" />
+              <stop
+                 id="stop54039"
+                 style="stop-color:#919191;stop-opacity:1"
+                 offset="0.7059449" />
+              <stop
+                 id="stop54041"
+                 style="stop-color:#d2d2d2;stop-opacity:1"
+                 offset="0.73347497" />
+              <stop
+                 id="stop54043"
+                 style="stop-color:#a6a6a6;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient54045">
+              <stop
+                 id="stop54047"
+                 style="stop-color:#ffbc96;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop54049"
+                 style="stop-color:#ffeafe;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1817">
+              <stop
+                 id="stop1818"
+                 style="stop-color:#000000;stop-opacity:0.3137255"
+                 offset="0" />
+              <stop
+                 id="stop1819"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1820">
+              <stop
+                 id="stop1821"
+                 style="stop-color:#ffffff;stop-opacity:0.74901962"
+                 offset="0" />
+              <stop
+                 id="stop1822"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient3500">
+              <stop
+                 id="stop1824"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1825"
+                 style="stop-color:#ffffff;stop-opacity:0.35164836"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1826">
+              <stop
+                 id="stop1827"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1828"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient1829">
+              <stop
+                 id="stop1830"
+                 style="stop-color:#7e818c;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop1831"
+                 style="stop-color:#d5dbed;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="52.683483"
+               y1="104.09244"
+               x2="58.380398"
+               y2="252.54866"
+               id="linearGradient1832"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.334689,0,0,1.038479,-0.72121,-66.60727)" />
+            <linearGradient
+               x1="52.19524"
+               y1="64.818008"
+               x2="52.19524"
+               y2="122.69208"
+               id="linearGradient1833"
+               xlink:href="#linearGradient2689"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.111523,0,0,0.771568,-0.72121,-29.98157)" />
+            <linearGradient
+               x1="29.958502"
+               y1="-23.328955"
+               x2="29.958502"
+               y2="190.05157"
+               id="linearGradient1834"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.127153,0,0,0.781382,0.981463,-27.99057)" />
+            <linearGradient
+               x1="84.960785"
+               y1="92.151367"
+               x2="42.64373"
+               y2="53.360722"
+               id="linearGradient1835"
+               xlink:href="#linearGradient1749"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.321949,0.756459)" />
+            <linearGradient
+               x1="31.82851"
+               y1="61.778381"
+               x2="33.198818"
+               y2="6.859036"
+               id="linearGradient1836"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+            <linearGradient
+               x1="186.07457"
+               y1="23.533224"
+               x2="202.6377"
+               y2="23.47304"
+               id="linearGradient1837"
+               xlink:href="#linearGradient2689"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.388045,2.57702)" />
+            <linearGradient
+               x1="92.631454"
+               y1="54.989693"
+               x2="92.631454"
+               y2="50.608093"
+               id="linearGradient1838"
+               xlink:href="#linearGradient1757"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.787838,1.269296)" />
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient3516"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+            <linearGradient
+               x1="1270.3132"
+               y1="4.8765283"
+               x2="1247.6848"
+               y2="0.72310239"
+               id="linearGradient3517"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(9.440723e-2,10.59241)" />
+            <linearGradient
+               x1="1270.3132"
+               y1="4.8765283"
+               x2="1247.6848"
+               y2="0.72310239"
+               id="linearGradient3518"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+            <linearGradient
+               x1="96.41098"
+               y1="57.341877"
+               x2="81.065781"
+               y2="196.048"
+               id="linearGradient3519"
+               xlink:href="#linearGradient2871"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.176531,0,0,0.821515,0,4.496065)" />
+            <linearGradient
+               x1="-191.46153"
+               y1="37.372372"
+               x2="-165.58835"
+               y2="37.372372"
+               id="linearGradient3520"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient3521"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient1846"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient3523"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient1848"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient3525"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+            <linearGradient
+               x1="104.09006"
+               y1="83.359146"
+               x2="123.82494"
+               y2="70.956947"
+               id="linearGradient1850"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient1851"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+            <linearGradient
+               x1="10.145814"
+               y1="21.762129"
+               x2="19.678274"
+               y2="15.811033"
+               id="linearGradient3528"
+               xlink:href="#linearGradient1930"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+            <linearGradient
+               x1="226.35037"
+               y1="198.74835"
+               x2="174.43694"
+               y2="217.6319"
+               id="linearGradient54086"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.959874,1.041804)" />
+            <linearGradient
+               x1="-94.151642"
+               y1="379.97745"
+               x2="-100.4097"
+               y2="374.03232"
+               id="linearGradient3530"
+               xlink:href="#linearGradient1870"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.088448,0.91874)" />
+            <linearGradient
+               x1="97.345161"
+               y1="112.84396"
+               x2="99.20697"
+               y2="115.81121"
+               id="linearGradient54089"
+               xlink:href="#linearGradient2560"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.206907,0.828564)"
+               spreadMethod="reflect" />
+            <linearGradient
+               x1="-13.15085"
+               y1="250.48668"
+               x2="-5.590662"
+               y2="258.31036"
+               id="linearGradient3532"
+               xlink:href="#linearGradient2560"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+            <linearGradient
+               x1="240.97612"
+               y1="200.61511"
+               x2="231.89941"
+               y2="205.45764"
+               id="linearGradient3533"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.866855,1.153596)" />
+            <linearGradient
+               x1="7.1050277"
+               y1="221.98289"
+               x2="46.488174"
+               y2="259.94464"
+               id="linearGradient3534"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+            <linearGradient
+               x1="7.1050277"
+               y1="221.98289"
+               x2="46.488174"
+               y2="259.94464"
+               id="linearGradient3535"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+            <defs
+               id="defs3536">
+              <linearGradient
+                 id="linearGradient1861">
+                <stop
+                   id="stop3538"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1863"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient3540">
+                <stop
+                   id="stop1867"
+                   style="stop-color:#c86f32;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop3542"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient1869">
+                <stop
+                   id="stop1870"
+                   style="stop-color:#d88721;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1873"
+                   style="stop-color:#a85c00;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop1874"
+                   style="stop-color:#643e0e;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient1875">
+                <stop
+                   id="stop1876"
+                   style="stop-color:#868686;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1877"
+                   style="stop-color:#e2e2e2;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient1879">
+                <stop
+                   id="stop1880"
+                   style="stop-color:#ff9870;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1881"
+                   style="stop-color:#ffd8c9;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient1882">
+                <stop
+                   id="stop1883"
+                   style="stop-color:#ffd7c0;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1884"
+                   style="stop-color:#ffbc96;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient1885"
+                 xlink:href="#linearGradient2150"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient1886">
+                <stop
+                   id="stop1887"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1888"
+                   style="stop-color:#fafbff;stop-opacity:1"
+                   offset="0.25" />
+                <stop
+                   id="stop1889"
+                   style="stop-color:#f0f2fa;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop1890"
+                   style="stop-color:#e1e1e1;stop-opacity:1"
+                   offset="0.75" />
+                <stop
+                   id="stop1891"
+                   style="stop-color:#f5f6ff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient1892">
+                <stop
+                   id="stop1893"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1894"
+                   style="stop-color:#d0d1d9;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop1895"
+                   style="stop-color:#878b9b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient1896">
+                <stop
+                   id="stop1897"
+                   style="stop-color:#e8e8e8;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop1898"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient1899"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <radialGradient
+                 cx="-77.367622"
+                 cy="42.633839"
+                 r="216.26619"
+                 fx="-80.036034"
+                 fy="44.468376"
+                 id="radialGradient1900"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+              <defs
+                 id="defs1901">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient1902"
+                   xlink:href="#linearGradient1884"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient1903">
+                  <stop
+                     id="stop1904"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop1905"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop1906"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop1907"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop1908"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient1909">
+                  <stop
+                     id="stop3581"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop54141"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="133.07144"
+                   y1="28.231943"
+                   x2="118.58411"
+                   y2="13.431207"
+                   id="linearGradient54143"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                <linearGradient
+                   x1="30.722504"
+                   y1="28.135216"
+                   x2="39.78149"
+                   y2="27.315481"
+                   id="linearGradient1913"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103232)" />
+                <radialGradient
+                   cx="4.9853168"
+                   cy="108.47158"
+                   r="34.222183"
+                   fx="5.2520976"
+                   fy="108.73115"
+                   id="radialGradient1914"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="36.826332"
+                   y1="75.332558"
+                   x2="25.761681"
+                   y2="135.90358"
+                   id="linearGradient3586"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                <linearGradient
+                   x1="78.675774"
+                   y1="47.411823"
+                   x2="64.05336"
+                   y2="34.302757"
+                   id="linearGradient1916"
+                   xlink:href="#linearGradient4281"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                <defs
+                   id="defs1917">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient1919"
+                     xlink:href="#linearGradient3296"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                </defs>
+              </defs>
+              <linearGradient
+                 x1="88.712402"
+                 y1="138.15012"
+                 x2="104.81104"
+                 y2="151.63045"
+                 id="linearGradient1938"
+                 xlink:href="#linearGradient3305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+              <defs
+                 id="defs1939">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient4757"
+                   xlink:href="#linearGradient1863"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient54158"
+                   xlink:href="#linearGradient2560"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient4759"
+                   xlink:href="#linearGradient1926"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient1943"
+                   xlink:href="#linearGradient1302"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="96.346039"
+                   y1="84.428337"
+                   x2="121.44556"
+                   y2="65.093857"
+                   id="linearGradient1944"
+                   xlink:href="#linearGradient1716"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.962035,0,0,1.039463,0.899729,-0.17995)" />
+                <linearGradient
+                   x1="104.09006"
+                   y1="83.359146"
+                   x2="123.82494"
+                   y2="70.956947"
+                   id="linearGradient1945"
+                   xlink:href="#linearGradient1724"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.028242,0.972534)" />
+                <linearGradient
+                   x1="100.76616"
+                   y1="77.379333"
+                   x2="125.25793"
+                   y2="77.379333"
+                   id="linearGradient4763"
+                   xlink:href="#linearGradient1724"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.028607,0.972188)" />
+                <linearGradient
+                   x1="97.345161"
+                   y1="112.84396"
+                   x2="99.20697"
+                   y2="115.81121"
+                   id="linearGradient54165"
+                   xlink:href="#linearGradient1741"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.206907,0.828564)"
+                   spreadMethod="reflect" />
+                <linearGradient
+                   x1="168.2516"
+                   y1="181.01073"
+                   x2="185.96996"
+                   y2="172.51707"
+                   id="linearGradient4765"
+                   xlink:href="#linearGradient4873"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.959874,0,0,1.041804,24.17578,34.86402)" />
+                <linearGradient
+                   x1="97.281265"
+                   y1="84.255211"
+                   x2="127.84677"
+                   y2="61.142742"
+                   id="linearGradient54168"
+                   xlink:href="#linearGradient1716"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.962035,1.039463)" />
+                <linearGradient
+                   x1="104.09006"
+                   y1="83.359146"
+                   x2="123.82494"
+                   y2="70.956947"
+                   id="linearGradient54170"
+                   xlink:href="#linearGradient1724"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.028242,0.972534)" />
+                <linearGradient
+                   x1="100.76616"
+                   y1="77.379333"
+                   x2="125.25793"
+                   y2="77.379333"
+                   id="linearGradient54172"
+                   xlink:href="#linearGradient1724"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.028607,0.972188)" />
+                <linearGradient
+                   x1="97.281265"
+                   y1="84.255211"
+                   x2="127.84677"
+                   y2="61.142742"
+                   id="linearGradient4769"
+                   xlink:href="#linearGradient1716"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.962035,1.039463)" />
+              </defs>
+              <linearGradient
+                 x1="104.09006"
+                 y1="83.359146"
+                 x2="123.82494"
+                 y2="70.956947"
+                 id="linearGradient1995"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+              <linearGradient
+                 x1="100.76616"
+                 y1="77.379333"
+                 x2="125.25793"
+                 y2="77.379333"
+                 id="linearGradient3662"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+              <linearGradient
+                 x1="10.145814"
+                 y1="21.762129"
+                 x2="19.678274"
+                 y2="15.811033"
+                 id="linearGradient1997"
+                 xlink:href="#linearGradient1930"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+              <linearGradient
+                 x1="226.35037"
+                 y1="198.74835"
+                 x2="174.43694"
+                 y2="217.6319"
+                 id="linearGradient3682"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.959874,1.041804)" />
+              <linearGradient
+                 x1="97.345161"
+                 y1="112.84396"
+                 x2="99.20697"
+                 y2="115.81121"
+                 id="linearGradient1999"
+                 xlink:href="#linearGradient2560"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.206907,0.828564)"
+                 spreadMethod="reflect" />
+              <linearGradient
+                 x1="-94.151642"
+                 y1="379.97745"
+                 x2="-100.4097"
+                 y2="374.03232"
+                 id="linearGradient2000"
+                 xlink:href="#linearGradient1870"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.088448,0.91874)" />
+              <linearGradient
+                 x1="-13.15085"
+                 y1="250.48668"
+                 x2="-5.590662"
+                 y2="258.31036"
+                 id="linearGradient2001"
+                 xlink:href="#linearGradient2560"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+              <linearGradient
+                 x1="240.97612"
+                 y1="200.61511"
+                 x2="231.89941"
+                 y2="205.45764"
+                 id="linearGradient2003"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.866855,1.153596)" />
+              <linearGradient
+                 x1="7.1050277"
+                 y1="221.98289"
+                 x2="46.488174"
+                 y2="259.94464"
+                 id="linearGradient2004"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+              <linearGradient
+                 x1="7.1050277"
+                 y1="221.98289"
+                 x2="46.488174"
+                 y2="259.94464"
+                 id="linearGradient2005"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+              <linearGradient
+                 x1="100.76616"
+                 y1="77.379333"
+                 x2="125.25793"
+                 y2="77.379333"
+                 id="linearGradient2007"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+            </defs>
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient2015"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient2016"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+            <linearGradient
+               x1="10.145814"
+               y1="21.762129"
+               x2="19.678274"
+               y2="15.811033"
+               id="linearGradient2017"
+               xlink:href="#linearGradient1930"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+            <linearGradient
+               x1="-94.151642"
+               y1="379.97745"
+               x2="-100.4097"
+               y2="374.03232"
+               id="linearGradient2018"
+               xlink:href="#linearGradient1870"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.088448,0.91874)" />
+            <linearGradient
+               x1="97.345161"
+               y1="112.84396"
+               x2="99.20697"
+               y2="115.81121"
+               id="linearGradient2019"
+               xlink:href="#linearGradient2560"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.206907,0.828564)"
+               spreadMethod="reflect" />
+            <linearGradient
+               x1="-13.15085"
+               y1="250.48668"
+               x2="-5.590662"
+               y2="258.31036"
+               id="linearGradient2020"
+               xlink:href="#linearGradient2560"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+            <linearGradient
+               x1="240.97612"
+               y1="200.61511"
+               x2="231.89941"
+               y2="205.45764"
+               id="linearGradient2022"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.866855,1.153596)" />
+            <linearGradient
+               x1="7.1050277"
+               y1="221.98289"
+               x2="46.488174"
+               y2="259.94464"
+               id="linearGradient2023"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+            <linearGradient
+               x1="7.1050277"
+               y1="221.98289"
+               x2="46.488174"
+               y2="259.94464"
+               id="linearGradient2024"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+            <defs
+               id="defs2026">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient2027"
+                 xlink:href="#linearGradient4066"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient2028">
+                <stop
+                   id="stop2029"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2030"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient4844">
+                <stop
+                   id="stop4845"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="0" />
+                <stop
+                   id="stop4846"
+                   style="stop-color:#7d8787;stop-opacity:0.1451"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2034">
+                <stop
+                   id="stop2035"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2036"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2037">
+                <stop
+                   id="stop2038"
+                   style="stop-color:#57575a;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2039"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2040">
+                <stop
+                   id="stop2041"
+                   style="stop-color:#9db8d2;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2042"
+                   style="stop-color:#6988b7;stop-opacity:0.375"
+                   offset="0.5" />
+                <stop
+                   id="stop2043"
+                   style="stop-color:#929395;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2044">
+                <stop
+                   id="stop2045"
+                   style="stop-color:#2e97af;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2046"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient2047"
+                 xlink:href="#linearGradient4063"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient2048">
+                <stop
+                   id="stop2049"
+                   style="stop-color:#adc0d2;stop-opacity:0.91764706"
+                   offset="0" />
+                <stop
+                   id="stop2050"
+                   style="stop-color:#4b6983;stop-opacity:0.77319586"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2051">
+                <stop
+                   id="stop2052"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2053"
+                   style="stop-color:#fafbff;stop-opacity:1"
+                   offset="0.25" />
+                <stop
+                   id="stop2054"
+                   style="stop-color:#f0f2fa;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop2055"
+                   style="stop-color:#e1e1e1;stop-opacity:1"
+                   offset="0.75" />
+                <stop
+                   id="stop2056"
+                   style="stop-color:#f5f6ff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2057">
+                <stop
+                   id="stop2058"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2059"
+                   style="stop-color:#d0d1d9;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop2060"
+                   style="stop-color:#878b9b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2061">
+                <stop
+                   id="stop2062"
+                   style="stop-color:#e8e8e8;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2063"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient2064"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <radialGradient
+                 cx="-77.367622"
+                 cy="42.633839"
+                 r="216.26619"
+                 fx="-80.036034"
+                 fy="44.468376"
+                 id="radialGradient2065"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+              <defs
+                 id="defs2066">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient2067"
+                   xlink:href="#linearGradient3936"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient54241">
+                  <stop
+                     id="stop54243"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop54245"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop2071"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop2072"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop2073"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient2074">
+                  <stop
+                     id="stop2075"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop2076"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="133.07144"
+                   y1="28.231943"
+                   x2="118.58411"
+                   y2="13.431207"
+                   id="linearGradient2077"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                <linearGradient
+                   x1="30.722504"
+                   y1="28.135216"
+                   x2="39.78149"
+                   y2="27.315481"
+                   id="linearGradient2078"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103232)" />
+                <radialGradient
+                   cx="4.9853168"
+                   cy="108.47158"
+                   r="34.222183"
+                   fx="5.2520976"
+                   fy="108.73115"
+                   id="radialGradient2079"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="36.826332"
+                   y1="75.332558"
+                   x2="25.761681"
+                   y2="135.90358"
+                   id="linearGradient2080"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                <linearGradient
+                   x1="78.675774"
+                   y1="47.411823"
+                   x2="64.05336"
+                   y2="34.302757"
+                   id="linearGradient4894"
+                   xlink:href="#linearGradient4281"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                <defs
+                   id="defs2082">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient2083"
+                     xlink:href="#linearGradient3296"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                </defs>
+              </defs>
+              <linearGradient
+                 x1="88.712402"
+                 y1="138.15012"
+                 x2="104.81104"
+                 y2="151.63045"
+                 id="linearGradient2098"
+                 xlink:href="#linearGradient3305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+              <defs
+                 id="defs2099">
+                <linearGradient
+                   id="linearGradient2100">
+                  <stop
+                     id="stop2101"
+                     style="stop-color:#000000;stop-opacity:0.22314049"
+                     offset="0" />
+                  <stop
+                     id="stop2102"
+                     style="stop-color:#000000;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient2103"
+                   xlink:href="#linearGradient3703"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient2104"
+                   xlink:href="#linearGradient1395"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient54271">
+                  <stop
+                     id="stop54273"
+                     style="stop-color:#000000;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop2107"
+                     style="stop-color:#000000;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient2108"
+                   xlink:href="#linearGradient2021"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient2109">
+                  <stop
+                     id="stop2110"
+                     style="stop-color:#83a67f;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop2111"
+                     style="stop-color:#eaeaea;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient54280"
+                   xlink:href="#linearGradient3916"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0.47368422"
+                   y1="0.1171875"
+                   x2="0.59649122"
+                   y2="1.21875"
+                   id="linearGradient54282"
+                   xlink:href="#linearGradient1443" />
+                <linearGradient
+                   x1="0.63380283"
+                   y1="0.11764706"
+                   x2="0.62676054"
+                   y2="0.74369746"
+                   id="linearGradient2114"
+                   xlink:href="#linearGradient870" />
+                <linearGradient
+                   x1="0.56690139"
+                   y1="-0.29629636"
+                   x2="0.66549295"
+                   y2="0.65432096"
+                   id="linearGradient2115"
+                   xlink:href="#linearGradient1045" />
+                <linearGradient
+                   x1="0.78195488"
+                   y1="0.3828125"
+                   x2="0.57894737"
+                   y2="0.609375"
+                   id="linearGradient2116"
+                   xlink:href="#linearGradient1045" />
+                <linearGradient
+                   x1="0.21097578"
+                   y1="-1.2339019"
+                   x2="1.2504174"
+                   y2="-0.10575413"
+                   id="linearGradient54287"
+                   xlink:href="#linearGradient1125"
+                   gradientTransform="scale(1.096129,0.912302)" />
+                <linearGradient
+                   x1="-0.21705426"
+                   y1="0.5546875"
+                   x2="1.5399107"
+                   y2="0.5546875"
+                   id="linearGradient2118"
+                   xlink:href="#linearGradient1125" />
+                <linearGradient
+                   x1="0.23239437"
+                   y1="-0.2389937"
+                   x2="0.62676054"
+                   y2="0.8490566"
+                   id="linearGradient2119"
+                   xlink:href="#linearGradient1045" />
+                <radialGradient
+                   cx="0.44718307"
+                   cy="0.51748252"
+                   r="0.57398623"
+                   fx="0.63028163"
+                   fy="0.16783214"
+                   id="radialGradient2120"
+                   xlink:href="#linearGradient1439" />
+                <radialGradient
+                   cx="0.46126762"
+                   cy="0.5403226"
+                   r="0.51062703"
+                   fx="0.50704223"
+                   fy="0.20025954"
+                   id="radialGradient2121"
+                   xlink:href="#linearGradient1443" />
+                <linearGradient
+                   id="linearGradient2123"
+                   xlink:href="#linearGradient1202" />
+              </defs>
+              <linearGradient
+                 x1="57.667629"
+                 y1="84.017433"
+                 x2="60.490723"
+                 y2="111.23763"
+                 id="linearGradient2166"
+                 xlink:href="#linearGradient2021"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.08132,0.924795)" />
+              <linearGradient
+                 x1="-2602.7705"
+                 y1="6138.4531"
+                 x2="9707.4707"
+                 y2="6138.2944"
+                 id="linearGradient4979"
+                 xlink:href="#linearGradient3650"
+                 gradientUnits="userSpaceOnUse" />
+              <defs
+                 id="defs2168">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient2169"
+                   xlink:href="#linearGradient3933"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient2170"
+                   xlink:href="#linearGradient3681"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient2171"
+                   xlink:href="#linearGradient3913"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <defs
+                   id="defs2172">
+                  <clipPath
+                     id="clipPath2173">
+                    <polygon
+                       points="17084,18485 16474,17828 15861,17169 15244,16508 14623,15843 13998,15175 13369,14505 12735,13831 12097,13154 11455,12473 10808,11789 10157,11102 9501,10412 9517,10188 9741,9851 10061,9507 10369,9259 10554,9215 11207,9890 11877,10561 12558,11228 13247,11891 13940,12550 14633,13207 15321,13859 16001,14509 16668,15156 17320,15800 17951,16442 18559,17082 18536,17278 18315,17593 17977,17949 17605,18268 17279,18472 17084,18485 "
+                       id="polygon2174" />
+                  </clipPath>
+                </defs>
+                <linearGradient
+                   x1="0.22399895"
+                   y1="0.42968741"
+                   x2="0.41599995"
+                   y2="0.24999991"
+                   id="linearGradient2175"
+                   xlink:href="#linearGradient3558" />
+                <linearGradient
+                   x1="0.39199805"
+                   y1="0.52343756"
+                   x2="0.66400015"
+                   y2="0.51562506"
+                   id="linearGradient2176"
+                   xlink:href="#linearGradient3655" />
+                <linearGradient
+                   x1="-0.24806577"
+                   y1="0.53907728"
+                   x2="0.86046565"
+                   y2="0.53906298"
+                   id="linearGradient2177"
+                   xlink:href="#linearGradient3650" />
+              </defs>
+              <radialGradient
+                 cx="41.875938"
+                 cy="37.865574"
+                 r="12.562782"
+                 fx="42.023739"
+                 fy="37.865574"
+                 id="radialGradient2218"
+                 xlink:href="#linearGradient2002"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="520.57166"
+                 y1="506.28723"
+                 x2="520.57166"
+                 y2="466.2785"
+                 id="linearGradient54311"
+                 xlink:href="#linearGradient1697"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="522.94183"
+                 y1="469.49918"
+                 x2="522.94183"
+                 y2="505.0845"
+                 id="linearGradient3899"
+                 xlink:href="#linearGradient1697"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="520.57166"
+                 y1="506.28723"
+                 x2="520.57166"
+                 y2="466.2785"
+                 id="linearGradient2221"
+                 xlink:href="#linearGradient1735"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="44.930588"
+                 y1="56.725216"
+                 x2="45.511845"
+                 y2="185.05675"
+                 id="linearGradient2225"
+                 xlink:href="#linearGradient1702"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.694118,0,0,0.651906,0,-2.410339)" />
+              <defs
+                 id="defs2226">
+                <linearGradient
+                   id="linearGradient2227">
+                  <stop
+                     id="stop2228"
+                     style="stop-color:#e6d500;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop2229"
+                     style="stop-color:#ffba61;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient2230">
+                  <stop
+                     id="stop2231"
+                     style="stop-color:#e6da1e;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop2232"
+                     style="stop-color:#fff99b;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient2233"
+                   xlink:href="#linearGradient4802"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient2234">
+                  <stop
+                     id="stop54325"
+                     style="stop-color:#ccff5f;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop2236"
+                     style="stop-color:#69db0e;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient2237">
+                  <stop
+                     id="stop2238"
+                     style="stop-color:#ffffff;stop-opacity:0.69072163"
+                     offset="0" />
+                  <stop
+                     id="stop2239"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient2240">
+                  <stop
+                     id="stop2241"
+                     style="stop-color:#69db0e;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop2242"
+                     style="stop-color:#397607;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="520.57166"
+                   y1="506.28723"
+                   x2="520.57166"
+                   y2="466.2785"
+                   id="linearGradient2243"
+                   xlink:href="#linearGradient1697"
+                   gradientUnits="userSpaceOnUse" />
+                <radialGradient
+                   cx="522.89532"
+                   cy="481.86633"
+                   r="15.301119"
+                   fx="522.89911"
+                   fy="473.03323"
+                   id="radialGradient2244"
+                   xlink:href="#linearGradient1702"
+                   gradientUnits="userSpaceOnUse" />
+                <linearGradient
+                   x1="522.94183"
+                   y1="469.49918"
+                   x2="522.94183"
+                   y2="505.0845"
+                   id="linearGradient2245"
+                   xlink:href="#linearGradient1697"
+                   gradientUnits="userSpaceOnUse" />
+                <linearGradient
+                   x1="213.82799"
+                   y1="183.48366"
+                   x2="214.59154"
+                   y2="463.47311"
+                   id="linearGradient2246"
+                   xlink:href="#linearGradient1702"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+                <linearGradient
+                   x1="27.119711"
+                   y1="-353.75928"
+                   x2="27.018383"
+                   y2="-316.47729"
+                   id="linearGradient2247"
+                   xlink:href="#linearGradient1702"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(2.89873,-0.344979)" />
+                <radialGradient
+                   cx="41.875938"
+                   cy="37.865574"
+                   r="12.562782"
+                   fx="42.023739"
+                   fy="37.865574"
+                   id="radialGradient2248"
+                   xlink:href="#linearGradient1845"
+                   gradientUnits="userSpaceOnUse" />
+                <linearGradient
+                   x1="10.68618"
+                   y1="22.702703"
+                   x2="11.660023"
+                   y2="4.1041274"
+                   id="linearGradient2249"
+                   xlink:href="#linearGradient1302"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.016203,0.984055)" />
+                <linearGradient
+                   x1="16.88386"
+                   y1="28.772741"
+                   x2="12.516754"
+                   y2="2.6018224"
+                   id="linearGradient14704"
+                   xlink:href="#linearGradient1305"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.016203,0.984055)" />
+                <defs
+                   id="defs2251">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient14707"
+                     xlink:href="#linearGradient2002"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient2253"
+                     xlink:href="#linearGradient2009"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient14710"
+                     xlink:href="#linearGradient2006"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     id="linearGradient2255">
+                    <stop
+                       id="stop2256"
+                       style="stop-color:#b18e4b;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop2257"
+                       style="stop-color:#f7dca0;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient14715"
+                     xlink:href="#linearGradient2780"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     id="linearGradient2259">
+                    <stop
+                       id="stop2260"
+                       style="stop-color:#000000;stop-opacity:0.14835165"
+                       offset="0" />
+                    <stop
+                       id="stop2261"
+                       style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                       offset="0.5" />
+                    <stop
+                       id="stop2262"
+                       style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                       offset="0.75" />
+                    <stop
+                       id="stop2263"
+                       style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                       offset="0.875" />
+                    <stop
+                       id="stop2264"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient2265">
+                    <stop
+                       id="stop2266"
+                       style="stop-color:#b18e4b;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop2267"
+                       style="stop-color:#f7dca0;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="28.814428"
+                     y1="-1.616316"
+                     x2="47.366039"
+                     y2="22.769617"
+                     id="linearGradient2268"
+                     xlink:href="#linearGradient2354"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(0.764292,1.3084)" />
+                  <linearGradient
+                     x1="30.722504"
+                     y1="28.135216"
+                     x2="39.78149"
+                     y2="27.315481"
+                     id="linearGradient2269"
+                     xlink:href="#linearGradient1884"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(0.475459,2.103232)" />
+                  <linearGradient
+                     x1="30.382267"
+                     y1="7.5329666"
+                     x2="47.366039"
+                     y2="22.769617"
+                     id="linearGradient2270"
+                     xlink:href="#linearGradient2354"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+                  <linearGradient
+                     x1="25.954844"
+                     y1="25.071495"
+                     x2="39.781502"
+                     y2="27.315489"
+                     id="linearGradient2271"
+                     xlink:href="#linearGradient1884"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(0.475459,2.103231)" />
+                  <defs
+                     id="defs2272">
+                    <linearGradient
+                       x1="17.21314"
+                       y1="81.92981"
+                       x2="94.640472"
+                       y2="81.92981"
+                       id="linearGradient2273"
+                       xlink:href="#linearGradient1302"
+                       gradientUnits="userSpaceOnUse"
+                       gradientTransform="scale(1.3266077,0.7538023)"
+                       spreadMethod="pad" />
+                    <linearGradient
+                       x1="0"
+                       y1="0.5"
+                       x2="1"
+                       y2="0.5"
+                       id="linearGradient2274"
+                       xlink:href="#linearGradient1305"
+                       gradientUnits="objectBoundingBox"
+                       spreadMethod="pad" />
+                    <linearGradient
+                       id="linearGradient2275">
+                      <stop
+                         id="stop2276"
+                         style="stop-color:#e6da1e;stop-opacity:1"
+                         offset="0" />
+                      <stop
+                         id="stop2277"
+                         style="stop-color:#b5ab17;stop-opacity:1"
+                         offset="1" />
+                    </linearGradient>
+                    <linearGradient
+                       x1="0.28441054"
+                       y1="0.88272494"
+                       x2="0.32513002"
+                       y2="0.10505857"
+                       id="linearGradient2278"
+                       xlink:href="#linearGradient4114" />
+                    <linearGradient
+                       x1="-0.0078431377"
+                       y1="-1.244898"
+                       x2="0.59607846"
+                       y2="0.3605442"
+                       id="linearGradient2279"
+                       xlink:href="#linearGradient1513" />
+                    <linearGradient
+                       x1="-0.4509804"
+                       y1="-0.15053764"
+                       x2="0.47058824"
+                       y2="0.36559141"
+                       id="linearGradient54371"
+                       xlink:href="#linearGradient1513" />
+                    <linearGradient
+                       x1="0.45882353"
+                       y1="1.2772278"
+                       x2="0.6901961"
+                       y2="-0.2970297"
+                       id="linearGradient2281"
+                       xlink:href="#linearGradient2122" />
+                    <linearGradient
+                       x1="-0.18232045"
+                       y1="-0.43962848"
+                       x2="0.68508285"
+                       y2="0.42414862"
+                       id="linearGradient2282"
+                       xlink:href="#linearGradient1513" />
+                    <linearGradient
+                       id="linearGradient54375">
+                      <stop
+                         id="stop2284"
+                         style="stop-color:#000000;stop-opacity:0.40784314"
+                         offset="0" />
+                      <stop
+                         id="stop2285"
+                         style="stop-color:#000000;stop-opacity:0"
+                         offset="1" />
+                    </linearGradient>
+                    <linearGradient
+                       x1="1.3783784"
+                       y1="0.25386998"
+                       x2="0.58378381"
+                       y2="0.13003096"
+                       id="linearGradient2286"
+                       xlink:href="#linearGradient2122" />
+                    <linearGradient
+                       x1="-0.14213198"
+                       y1="-0.28792569"
+                       x2="0.49753696"
+                       y2="0.35603714"
+                       id="linearGradient54380"
+                       xlink:href="#linearGradient1513" />
+                    <linearGradient
+                       x1="0.99512196"
+                       y1="0.64396286"
+                       x2="0.32682925"
+                       y2="0.3003096"
+                       id="linearGradient2288"
+                       xlink:href="#linearGradient1918" />
+                    <linearGradient
+                       x1="0.27843139"
+                       y1="-0.063694268"
+                       x2="0.4509804"
+                       y2="0.61146498"
+                       id="linearGradient2289"
+                       xlink:href="#linearGradient1513" />
+                    <linearGradient
+                       id="linearGradient2290">
+                      <stop
+                         id="stop2291"
+                         style="stop-color:#d6d6d6;stop-opacity:1"
+                         offset="0" />
+                      <stop
+                         id="stop2292"
+                         style="stop-color:#eaeaea;stop-opacity:1"
+                         offset="0.25769231" />
+                      <stop
+                         id="stop2293"
+                         style="stop-color:#919191;stop-opacity:1"
+                         offset="0.7059449" />
+                      <stop
+                         id="stop2294"
+                         style="stop-color:#d2d2d2;stop-opacity:1"
+                         offset="0.73347497" />
+                      <stop
+                         id="stop54389"
+                         style="stop-color:#a6a6a6;stop-opacity:1"
+                         offset="1" />
+                    </linearGradient>
+                    <linearGradient
+                       x1="0.47450981"
+                       y1="0.21771218"
+                       x2="0.80392158"
+                       y2="0.5202952"
+                       id="linearGradient2296"
+                       xlink:href="#linearGradient2317" />
+                    <linearGradient
+                       id="linearGradient2297">
+                      <stop
+                         id="stop2298"
+                         style="stop-color:#ffffff;stop-opacity:1"
+                         offset="0" />
+                      <stop
+                         id="stop2299"
+                         style="stop-color:#ffffff;stop-opacity:0"
+                         offset="1" />
+                    </linearGradient>
+                    <linearGradient
+                       x1="0.41568628"
+                       y1="0.27687296"
+                       x2="0.59607846"
+                       y2="0.44299674"
+                       id="linearGradient2300"
+                       xlink:href="#linearGradient1513" />
+                    <radialGradient
+                       cx="0.5"
+                       cy="0.5"
+                       r="0.5"
+                       fx="0.38431373"
+                       fy="0.47619048"
+                       id="radialGradient2301"
+                       xlink:href="#linearGradient1918" />
+                    <linearGradient
+                       x1="0"
+                       y1="0.5"
+                       x2="1"
+                       y2="0.5"
+                       id="linearGradient2302"
+                       xlink:href="#linearGradient1845"
+                       gradientUnits="objectBoundingBox"
+                       spreadMethod="pad" />
+                    <radialGradient
+                       cx="0.5"
+                       cy="0.5"
+                       r="0.5"
+                       fx="0.50588238"
+                       fy="0.5"
+                       id="radialGradient2303"
+                       xlink:href="#linearGradient1918" />
+                    <linearGradient
+                       x1="0.54355544"
+                       y1="1.1365328"
+                       x2="0.36095273"
+                       y2="0.042242367"
+                       id="linearGradient2304"
+                       xlink:href="#linearGradient4111" />
+                  </defs>
+                </defs>
+              </defs>
+            </defs>
+            <radialGradient
+               cx="41.875938"
+               cy="37.865574"
+               r="12.562782"
+               fx="38.969257"
+               fy="37.267345"
+               id="radialGradient2403"
+               xlink:href="#linearGradient4066"
+               gradientUnits="userSpaceOnUse" />
+            <defs
+               id="defs54409">
+              <linearGradient
+                 id="linearGradient2405">
+                <stop
+                   id="stop4081"
+                   style="stop-color:#000000;stop-opacity:0.31638417"
+                   offset="0" />
+                <stop
+                   id="stop4082"
+                   style="stop-color:#000000;stop-opacity:0.07909604"
+                   offset="0.5" />
+                <stop
+                   id="stop2410"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <radialGradient
+                 cx="0.5"
+                 cy="0.5"
+                 r="0.5"
+                 fx="0.21951219"
+                 fy="0.25"
+                 id="radialGradient54415"
+                 xlink:href="#linearGradient1918" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient54417"
+                 xlink:href="#linearGradient2774"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient4086">
+                <stop
+                   id="stop54420"
+                   style="stop-color:#000000;stop-opacity:0.40784314"
+                   offset="0" />
+                <stop
+                   id="stop54422"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient54424">
+                <stop
+                   id="stop54426"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop54428"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient5225">
+                <stop
+                   id="stop54431"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop54433"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.99512196"
+                 y1="0.64396286"
+                 x2="0.32682925"
+                 y2="0.3003096"
+                 id="linearGradient2425"
+                 xlink:href="#linearGradient1918" />
+              <linearGradient
+                 x1="0.21960784"
+                 y1="1.8369565"
+                 x2="0.49411765"
+                 y2="0.17391305"
+                 id="linearGradient2428"
+                 xlink:href="#linearGradient2122" />
+              <linearGradient
+                 x1="-0.0070921984"
+                 y1="-0.53947371"
+                 x2="0.78823531"
+                 y2="0.76666665"
+                 id="linearGradient54441"
+                 xlink:href="#linearGradient2122" />
+              <linearGradient
+                 x1="3.6666667"
+                 y1="0.296875"
+                 x2="0.25925925"
+                 y2="0.375"
+                 id="linearGradient5233"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="0.71770334"
+                 y1="0.140625"
+                 x2="0.45933014"
+                 y2="0.4765625"
+                 id="linearGradient5234"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="0.74117649"
+                 y1="0.040816326"
+                 x2="0.70588237"
+                 y2="0.45918366"
+                 id="linearGradient54445"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="0.41568628"
+                 y1="0.27687296"
+                 x2="0.59607846"
+                 y2="0.44299674"
+                 id="linearGradient2433"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="1.3783784"
+                 y1="0.25386998"
+                 x2="0.58378381"
+                 y2="0.13003096"
+                 id="linearGradient2434"
+                 xlink:href="#linearGradient2122" />
+              <linearGradient
+                 x1="-0.10588235"
+                 y1="-0.10497238"
+                 x2="0.58431375"
+                 y2="0.55248618"
+                 id="linearGradient2435"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="-0.25352111"
+                 y1="-0.109375"
+                 x2="0.67605633"
+                 y2="0.4609375"
+                 id="linearGradient2436"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="-0.14213198"
+                 y1="-0.28792569"
+                 x2="0.49753696"
+                 y2="0.35603714"
+                 id="linearGradient2437"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="0.45882353"
+                 y1="-0.58685446"
+                 x2="0.65490198"
+                 y2="0.45070422"
+                 id="linearGradient2438"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="-0.0078431377"
+                 y1="-1.244898"
+                 x2="0.59607846"
+                 y2="0.3605442"
+                 id="linearGradient2439"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="0.3764706"
+                 y1="-0.84042555"
+                 x2="0.56078434"
+                 y2="0.52127659"
+                 id="linearGradient54454"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="-0.23645321"
+                 y1="-0.5078125"
+                 x2="0.36453202"
+                 y2="0.6328125"
+                 id="linearGradient4112"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="0.47450981"
+                 y1="0.21771218"
+                 x2="0.80392158"
+                 y2="0.5202952"
+                 id="linearGradient54457"
+                 xlink:href="#linearGradient2317" />
+              <linearGradient
+                 x1="0.90810812"
+                 y1="0.55727553"
+                 x2="0.49189189"
+                 y2="0.44891641"
+                 id="linearGradient54459"
+                 xlink:href="#linearGradient2122" />
+              <radialGradient
+                 cx="0.5"
+                 cy="0.5"
+                 r="0.5"
+                 fx="0.38431373"
+                 fy="0.47619048"
+                 id="radialGradient54461"
+                 xlink:href="#linearGradient1918" />
+            </defs>
+            <linearGradient
+               x1="184.78476"
+               y1="57.899975"
+               x2="140.56078"
+               y2="51.007587"
+               id="linearGradient2487"
+               xlink:href="#linearGradient2122"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.743874,0,0,1.344314,50,-150)" />
+            <linearGradient
+               x1="110.14813"
+               y1="26.185833"
+               x2="145.99422"
+               y2="61.882057"
+               id="linearGradient2488"
+               xlink:href="#linearGradient1513"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.734347,0,0,1.361754,50,-150)" />
+            <linearGradient
+               x1="69.358948"
+               y1="38.345039"
+               x2="78.468063"
+               y2="62.560368"
+               id="linearGradient4160"
+               xlink:href="#linearGradient1513"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.298814,0,0,0.769933,50,-150)" />
+            <linearGradient
+               x1="330.04102"
+               y1="37.053959"
+               x2="254.92361"
+               y2="38.776249"
+               id="linearGradient2490"
+               xlink:href="#linearGradient1513"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.440755,0,0,2.268834,50,-150)" />
+            <linearGradient
+               x1="87.17804"
+               y1="161.48409"
+               x2="95.870804"
+               y2="102.33855"
+               id="linearGradient2491"
+               xlink:href="#linearGradient2122"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.130709,0,0,0.884401,50,-150)" />
+            <linearGradient
+               x1="85.153625"
+               y1="144.6342"
+               x2="90.263031"
+               y2="164.62656"
+               id="linearGradient54472"
+               xlink:href="#linearGradient1513"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.257313,0,0,0.795347,100,-150)" />
+            <linearGradient
+               x1="182.22311"
+               y1="89.382622"
+               x2="142.08492"
+               y2="68.742538"
+               id="linearGradient4164"
+               xlink:href="#linearGradient4066"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.794082,0,0,1.259316,100,-150)" />
+            <linearGradient
+               x1="129.35207"
+               y1="35.074184"
+               x2="160.34494"
+               y2="66.275108"
+               id="linearGradient54475"
+               xlink:href="#linearGradient1513"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.766629,0,0,1.304412,100,-150)" />
+            <linearGradient
+               x1="69.358948"
+               y1="38.345039"
+               x2="78.468063"
+               y2="62.560368"
+               id="linearGradient2904"
+               xlink:href="#linearGradient1513"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.053415,0.75976,-0.450383,0.624461,184.0418,-192.118)" />
+            <linearGradient
+               x1="1.4050696"
+               y1="182.46344"
+               x2="62.191277"
+               y2="282.29065"
+               id="linearGradient54478"
+               xlink:href="#linearGradient2122"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.329536,0,0,0.35639,20.57572,14.10475)" />
+            <linearGradient
+               x1="106.69141"
+               y1="21.871695"
+               x2="117.74989"
+               y2="32.055485"
+               id="linearGradient4168"
+               xlink:href="#linearGradient1513"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.895098,1.117196)" />
+            <linearGradient
+               x1="65.040573"
+               y1="73.787125"
+               x2="77.333061"
+               y2="85.078453"
+               id="linearGradient2919"
+               xlink:href="#linearGradient2317"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.954815,1.047323)" />
+            <linearGradient
+               x1="23.800308"
+               y1="135.01959"
+               x2="33.550014"
+               y2="142.12923"
+               id="linearGradient5302"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.225045,0.816297)" />
+            <linearGradient
+               x1="-191.46153"
+               y1="37.372372"
+               x2="-165.58835"
+               y2="37.372372"
+               id="linearGradient3048"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient3049"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient3050"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient3051"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient3052"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <linearGradient
+               x1="483.2298"
+               y1="97.833481"
+               x2="562.21454"
+               y2="1064.5424"
+               id="linearGradient3053"
+               xlink:href="#linearGradient1531"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.502271,0.665659)" />
+            <linearGradient
+               x1="360.48212"
+               y1="2746.856"
+               x2="339.39331"
+               y2="2606.2637"
+               id="linearGradient3054"
+               xlink:href="#linearGradient5274"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(4.209444,0.237561)" />
+            <defs
+               id="defs2939">
+              <linearGradient
+                 id="linearGradient4179">
+                <stop
+                   id="stop2941"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2942"
+                   style="stop-color:#fafbff;stop-opacity:1"
+                   offset="0.25" />
+                <stop
+                   id="stop2943"
+                   style="stop-color:#f0f2fa;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop2944"
+                   style="stop-color:#e1e1e1;stop-opacity:1"
+                   offset="0.75" />
+                <stop
+                   id="stop2945"
+                   style="stop-color:#f5f6ff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient4185">
+                <stop
+                   id="stop2947"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop4187"
+                   style="stop-color:#d0d1d9;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop17605"
+                   style="stop-color:#878b9b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2953">
+                <stop
+                   id="stop2954"
+                   style="stop-color:#e8e8e8;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop2955"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient2957"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <radialGradient
+                 cx="-77.367622"
+                 cy="42.633839"
+                 r="216.26619"
+                 fx="-80.036034"
+                 fy="44.468376"
+                 id="radialGradient2958"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+              <defs
+                 id="defs2959">
+                <linearGradient
+                   id="linearGradient54507">
+                  <stop
+                     id="stop5328"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop2526"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient17616">
+                  <stop
+                     id="stop2964"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop2965"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop4201"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop4202"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop4203"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient2969">
+                  <stop
+                     id="stop4205"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop2971"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="133.07144"
+                   y1="28.231943"
+                   x2="118.58411"
+                   y2="13.431207"
+                   id="linearGradient2972"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                <linearGradient
+                   x1="30.722504"
+                   y1="28.135216"
+                   x2="39.78149"
+                   y2="27.315481"
+                   id="linearGradient2973"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103232)" />
+                <radialGradient
+                   cx="4.9853168"
+                   cy="108.47158"
+                   r="34.222183"
+                   fx="5.2520976"
+                   fy="108.73115"
+                   id="radialGradient2974"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="36.826332"
+                   y1="75.332558"
+                   x2="25.761681"
+                   y2="135.90358"
+                   id="linearGradient2975"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                <linearGradient
+                   x1="78.675774"
+                   y1="47.411823"
+                   x2="64.05336"
+                   y2="34.302757"
+                   id="linearGradient2976"
+                   xlink:href="#linearGradient4281"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                <defs
+                   id="defs2977">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient4213"
+                     xlink:href="#linearGradient3296"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                </defs>
+              </defs>
+              <linearGradient
+                 x1="88.712402"
+                 y1="138.15012"
+                 x2="104.81104"
+                 y2="151.63045"
+                 id="linearGradient2996"
+                 xlink:href="#linearGradient3305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+              <defs
+                 id="defs3001">
+                <linearGradient
+                   id="linearGradient5274">
+                  <stop
+                     id="stop5275"
+                     style="stop-color:#533b2b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop5276"
+                     style="stop-color:#ab7958;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient5365">
+                  <stop
+                     id="stop1532"
+                     style="stop-color:#1a6e8e;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop1533"
+                     style="stop-color:#c3efff;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+              </defs>
+              <linearGradient
+                 x1="483.2298"
+                 y1="97.833481"
+                 x2="562.21454"
+                 y2="1064.5424"
+                 id="linearGradient2455"
+                 xlink:href="#linearGradient1531"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.502271,0.665659)" />
+              <linearGradient
+                 x1="360.48212"
+                 y1="2746.856"
+                 x2="339.39331"
+                 y2="2606.2637"
+                 id="linearGradient2456"
+                 xlink:href="#linearGradient5274"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(4.209444,0.237561)" />
+            </defs>
+          </defs>
+          <linearGradient
+             x1="360.48212"
+             y1="2746.856"
+             x2="339.39331"
+             y2="2606.2637"
+             id="linearGradient4260"
+             xlink:href="#linearGradient5274"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(4.209444,0.237561)" />
+          <linearGradient
+             x1="307.43765"
+             y1="234.53671"
+             x2="292.48148"
+             y2="245.30841"
+             id="linearGradient5392"
+             xlink:href="#linearGradient3936"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.847559,0,0,0.796411,18.7268,-73.96861)" />
+        </defs>
+      </defs>
+      <linearGradient
+         x1="105.80702"
+         y1="25.611177"
+         x2="82.344437"
+         y2="46.947098"
+         id="linearGradient7579"
+         xlink:href="#linearGradient865"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.108489,0.902129)" />
+      <defs
+         id="defs4289">
+        <linearGradient
+           id="linearGradient3629">
+          <stop
+             id="stop3631"
+             style="stop-color:#ff0d0d;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop3630"
+             style="stop-color:#e65b5b;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient54558">
+          <stop
+             id="stop3628"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0.0056" />
+          <stop
+             id="stop3627"
+             style="stop-color:#a9e6ff;stop-opacity:1"
+             offset="0.25839999" />
+          <stop
+             id="stop3623"
+             style="stop-color:#034cfe;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient5390">
+          <stop
+             id="stop5392"
+             style="stop-color:#85baff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop5391"
+             style="stop-color:#0f76ff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient4300">
+          <stop
+             id="stop4301"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop4302"
+             style="stop-color:#fafbff;stop-opacity:1"
+             offset="0.25" />
+          <stop
+             id="stop4303"
+             style="stop-color:#f0f2fa;stop-opacity:1"
+             offset="0.5" />
+          <stop
+             id="stop4304"
+             style="stop-color:#e1e1e1;stop-opacity:1"
+             offset="0.75" />
+          <stop
+             id="stop4305"
+             style="stop-color:#f5f6ff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient4306">
+          <stop
+             id="stop4307"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop4308"
+             style="stop-color:#d0d1d9;stop-opacity:1"
+             offset="0.5" />
+          <stop
+             id="stop4309"
+             style="stop-color:#878b9b;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient4313">
+          <stop
+             id="stop4314"
+             style="stop-color:#e8e8e8;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop17689"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient4316"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <radialGradient
+           cx="-77.367622"
+           cy="42.633839"
+           r="216.26619"
+           fx="-80.036034"
+           fy="44.468376"
+           id="radialGradient4317"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+        <defs
+           id="defs4318">
+          <linearGradient
+             id="linearGradient4319">
+            <stop
+               id="stop4320"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4321"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4322">
+            <stop
+               id="stop4323"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop4324"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop4325"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop4326"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop4327"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4328">
+            <stop
+               id="stop17704"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4330"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient4331"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient4332"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <radialGradient
+             cx="4.9853168"
+             cy="108.47158"
+             r="34.222183"
+             fx="5.2520976"
+             fy="108.73115"
+             id="radialGradient4333"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="36.826332"
+             y1="75.332558"
+             x2="25.761681"
+             y2="135.90358"
+             id="linearGradient4334"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+          <linearGradient
+             x1="78.675774"
+             y1="47.411823"
+             x2="64.05336"
+             y2="34.302757"
+             id="linearGradient4335"
+             xlink:href="#linearGradient4281"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+          <defs
+             id="defs4336">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient4337"
+               xlink:href="#linearGradient3296"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+          </defs>
+        </defs>
+        <linearGradient
+           x1="88.712402"
+           y1="138.15012"
+           x2="104.81104"
+           y2="151.63045"
+           id="linearGradient4355"
+           xlink:href="#linearGradient3305"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        <defs
+           id="defs2117">
+          <linearGradient
+             id="linearGradient1540">
+            <stop
+               id="stop1541"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop1543"
+               style="stop-color:#ffffff;stop-opacity:0.56179774"
+               offset="0.50793612" />
+            <stop
+               id="stop1544"
+               style="stop-color:#ffffff;stop-opacity:0.13725491"
+               offset="0.79061538" />
+            <stop
+               id="stop1542"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient5475">
+            <stop
+               id="stop1536"
+               style="stop-color:#ae1b1b;stop-opacity:0.99215686"
+               offset="0" />
+            <stop
+               id="stop1537"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient2248">
+            <stop
+               id="stop2249"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2251"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4368">
+            <stop
+               id="stop4369"
+               style="stop-color:#000000;stop-opacity:0.40784314"
+               offset="0" />
+            <stop
+               id="stop4370"
+               style="stop-color:#000000;stop-opacity:0.07344633"
+               offset="0.6477778" />
+            <stop
+               id="stop4371"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="0.50522649"
+             cy="0.54545456"
+             r="0.46065515"
+             fx="0.51611376"
+             fy="0.56148684"
+             id="radialGradient4372"
+             xlink:href="#linearGradient1806" />
+          <linearGradient
+             x1="1.9047619"
+             y1="0.79545456"
+             x2="-1.0952381"
+             y2="0.075757578"
+             id="linearGradient4375"
+             xlink:href="#linearGradient1806" />
+          <linearGradient
+             x1="-0.63529414"
+             y1="-1.2424242"
+             x2="0.25882354"
+             y2="1.060606"
+             id="linearGradient4376"
+             xlink:href="#linearGradient2248" />
+          <linearGradient
+             x1="0.46242774"
+             y1="0.32575756"
+             x2="0.41583115"
+             y2="0.32575756"
+             id="linearGradient2730"
+             xlink:href="#linearGradient1540" />
+          <linearGradient
+             x1="0.20784314"
+             y1="-2.0476191"
+             x2="0.54901963"
+             y2="0.60714287"
+             id="linearGradient2731"
+             xlink:href="#linearGradient2248" />
+          <radialGradient
+             cx="0.5"
+             cy="0.5"
+             r="0.5"
+             fx="0.5"
+             fy="0.5"
+             id="radialGradient5494"
+             xlink:href="#linearGradient1540" />
+        </defs>
+        <defs
+           id="defs1980">
+          <linearGradient
+             id="linearGradient4434">
+            <stop
+               id="stop4435"
+               style="stop-color:#000000;stop-opacity:0.29411766"
+               offset="0" />
+            <stop
+               id="stop4436"
+               style="stop-color:#000000;stop-opacity:0.16483517"
+               offset="0.6477778" />
+            <stop
+               id="stop4437"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4442">
+            <stop
+               id="stop4443"
+               style="stop-color:#000000;stop-opacity:0.2937853"
+               offset="0" />
+            <stop
+               id="stop4444"
+               style="stop-color:#000000;stop-opacity:0.06214689"
+               offset="0.6477778" />
+            <stop
+               id="stop4445"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4446">
+            <stop
+               id="stop4447"
+               style="stop-color:#ffffff;stop-opacity:0.69072163"
+               offset="0" />
+            <stop
+               id="stop4448"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4449">
+            <stop
+               id="stop4450"
+               style="stop-color:#ffffff;stop-opacity:0.61983472"
+               offset="0" />
+            <stop
+               id="stop4451"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4452">
+            <stop
+               id="stop4453"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop4454"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4455">
+            <stop
+               id="stop4456"
+               style="stop-color:#ffffff;stop-opacity:0.61983472"
+               offset="0" />
+            <stop
+               id="stop4457"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4458">
+            <stop
+               id="stop4459"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4460"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4461">
+            <stop
+               id="stop4462"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4463"
+               style="stop-color:#ffffff;stop-opacity:0.16078432"
+               offset="0.52955699" />
+            <stop
+               id="stop4464"
+               style="stop-color:#000000;stop-opacity:0.05882353"
+               offset="0.67708677" />
+            <stop
+               id="stop4465"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4466">
+            <stop
+               id="stop4467"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop4468"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4469">
+            <stop
+               id="stop4470"
+               style="stop-color:#000000;stop-opacity:0.3882353"
+               offset="0" />
+            <stop
+               id="stop4471"
+               style="stop-color:#ffffff;stop-opacity:0.34375"
+               offset="0.5" />
+            <stop
+               id="stop4472"
+               style="stop-color:#ffffff;stop-opacity:0.19607843"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4473">
+            <stop
+               id="stop4474"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop4475"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4476">
+            <stop
+               id="stop4477"
+               style="stop-color:#000000;stop-opacity:0.3882353"
+               offset="0" />
+            <stop
+               id="stop4478"
+               style="stop-color:#000000;stop-opacity:0.19215687"
+               offset="0.5" />
+            <stop
+               id="stop4479"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4480">
+            <stop
+               id="stop4481"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4482"
+               style="stop-color:#ffffff;stop-opacity:0.16078432"
+               offset="0.52955699" />
+            <stop
+               id="stop4483"
+               style="stop-color:#000000;stop-opacity:0.05882353"
+               offset="0.67708677" />
+            <stop
+               id="stop5586"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4485">
+            <stop
+               id="stop4486"
+               style="stop-color:#171a00;stop-opacity:0.66670001"
+               offset="0" />
+            <stop
+               id="stop4487"
+               style="stop-color:#2f2500;stop-opacity:0.0039"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4488">
+            <stop
+               id="stop4489"
+               style="stop-color:#ffcf3d;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4490"
+               style="stop-color:#b27f00;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4491">
+            <stop
+               id="stop4492"
+               style="stop-color:#bfff00;stop-opacity:0.60000002"
+               offset="0" />
+            <stop
+               id="stop4493"
+               style="stop-color:#fff200;stop-opacity:0.60000002"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4494">
+            <stop
+               id="stop4495"
+               style="stop-color:#000000;stop-opacity:0.3882353"
+               offset="0" />
+            <stop
+               id="stop4496"
+               style="stop-color:#000000;stop-opacity:0.19215687"
+               offset="0.5" />
+            <stop
+               id="stop4497"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4498">
+            <stop
+               id="stop4499"
+               style="stop-color:#43b0e2;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4500"
+               style="stop-color:#43b0e2;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4501">
+            <stop
+               id="stop2048"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4503"
+               style="stop-color:#fafbff;stop-opacity:1"
+               offset="0.25" />
+            <stop
+               id="stop4504"
+               style="stop-color:#f0f2fa;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop2051"
+               style="stop-color:#e1e1e1;stop-opacity:1"
+               offset="0.75" />
+            <stop
+               id="stop4506"
+               style="stop-color:#f5f6ff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient2053">
+            <stop
+               id="stop4508"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4509"
+               style="stop-color:#d0d1d9;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop4510"
+               style="stop-color:#878b9b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient2060">
+            <stop
+               id="stop2061"
+               style="stop-color:#e8e8e8;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4513"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="-191.46153"
+             y1="37.372372"
+             x2="-165.58835"
+             y2="37.372372"
+             id="linearGradient2063"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient4515"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient4516"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <defs
+             id="defs4517">
+            <linearGradient
+               id="linearGradient4518">
+              <stop
+                 id="stop2068"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop4520"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient2070">
+              <stop
+                 id="stop4522"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop4523"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop4524"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop2074"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop4526"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient54724">
+              <stop
+                 id="stop2077"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop54727"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient2079"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient4531"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient2081"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient2082"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient4534"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs2084">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient4536"
+                 xlink:href="#linearGradient3296"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient2086"
+                 xlink:href="#linearGradient2483"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+            </defs>
+          </defs>
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient2101"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          <linearGradient
+             x1="17.914211"
+             y1="221.47987"
+             x2="425.89865"
+             y2="221.47987"
+             id="linearGradient4553"
+             xlink:href="#linearGradient2483"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988025,1.012121)" />
+          <linearGradient
+             x1="17.914211"
+             y1="221.47987"
+             x2="425.89865"
+             y2="221.47987"
+             id="linearGradient4554"
+             xlink:href="#linearGradient2483"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988025,1.012121)" />
+          <linearGradient
+             x1="17.914211"
+             y1="221.47987"
+             x2="425.89865"
+             y2="221.47987"
+             id="linearGradient4555"
+             xlink:href="#linearGradient2483"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988025,1.012121)" />
+          <defs
+             id="defs4556">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient4557"
+               xlink:href="#linearGradient4595"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient4558"
+               xlink:href="#linearGradient3108"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient4559"
+               xlink:href="#linearGradient3749"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient4560"
+               xlink:href="#linearGradient3527"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient54750"
+               xlink:href="#linearGradient3076"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient54752">
+              <stop
+                 id="stop4563"
+                 style="stop-color:#000000;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop4564"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient4565"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.241013,0.805793)" />
+            <linearGradient
+               x1="87.605721"
+               y1="1061.6371"
+               x2="87.605721"
+               y2="1160.6499"
+               id="linearGradient4566"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.930484,0.518005)" />
+            <linearGradient
+               x1="177.77042"
+               y1="831.05975"
+               x2="178.45302"
+               y2="795.11487"
+               id="linearGradient4567"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.548996,0.64558)" />
+            <linearGradient
+               x1="458.70102"
+               y1="329.58002"
+               x2="404.87259"
+               y2="326.23184"
+               id="linearGradient4568"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="139.11636"
+               y1="564.54614"
+               x2="200.18613"
+               y2="564.54614"
+               id="linearGradient4569"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <linearGradient
+               x1="118.25803"
+               y1="563.01941"
+               x2="156.10408"
+               y2="564.03723"
+               id="linearGradient4570"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <linearGradient
+               x1="238.75548"
+               y1="339.24017"
+               x2="317.05142"
+               y2="333.88309"
+               id="linearGradient4571"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient4572"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.380924,0.724153)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient4573"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.381391,0.723908)" />
+            <linearGradient
+               x1="354.95923"
+               y1="464.90207"
+               x2="354.95923"
+               y2="299.05014"
+               id="linearGradient4574"
+               xlink:href="#linearGradient1102"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <radialGradient
+               cx="184.20265"
+               cy="780.47272"
+               r="49.972103"
+               fx="182.57774"
+               fy="734.32568"
+               id="radialGradient4575"
+               xlink:href="#linearGradient948"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.455004,0.687283)" />
+            <radialGradient
+               cx="0.52464789"
+               cy="0.32867134"
+               r="0.28679976"
+               fx="0.52464789"
+               fy="0.59440559"
+               id="radialGradient4576"
+               xlink:href="#linearGradient843" />
+            <radialGradient
+               cx="106.52795"
+               cy="541.31592"
+               r="49.665058"
+               fx="105.48236"
+               fy="502.10669"
+               id="radialGradient4577"
+               xlink:href="#linearGradient994"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="84.970261"
+               y1="1095.1855"
+               x2="84.970261"
+               y2="1189.3411"
+               id="linearGradient4578"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.987109,0.503244)" />
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient4579"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient4580"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient4581"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient4582"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient4583"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient4584"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+          </defs>
+          <defs
+             id="defs4630">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient4636"
+               xlink:href="#linearGradient3615"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient4637"
+               xlink:href="#linearGradient3608"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient4638"
+               xlink:href="#linearGradient3612"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0.314347"
+               y1="0.54857099"
+               x2="0.53643698"
+               y2="0.554286"
+               id="linearGradient4639"
+               xlink:href="#linearGradient218" />
+            <linearGradient
+               x1="0.246326"
+               y1="0.59428602"
+               x2="0.78109801"
+               y2="0.57142901"
+               id="linearGradient4640"
+               xlink:href="#linearGradient223" />
+            <radialGradient
+               cx="0.257236"
+               cy="0.27271599"
+               r="0.65467203"
+               fx="0.273312"
+               fy="0.51515198"
+               id="radialGradient4641"
+               xlink:href="#linearGradient1105" />
+          </defs>
+          <linearGradient
+             x1="458.70102"
+             y1="329.58002"
+             x2="404.87259"
+             y2="326.23184"
+             id="linearGradient4689"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="354.95923"
+             y1="464.90207"
+             x2="354.95923"
+             y2="299.05014"
+             id="linearGradient4690"
+             xlink:href="#linearGradient1102"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="238.75548"
+             y1="339.24017"
+             x2="317.05142"
+             y2="333.88309"
+             id="linearGradient4691"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="458.70102"
+             y1="329.58002"
+             x2="404.87259"
+             y2="326.23184"
+             id="linearGradient4693"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="192.95671"
+             y1="559.13995"
+             x2="192.95671"
+             y2="588.70502"
+             id="linearGradient4694"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="199.15404"
+             y1="696.90118"
+             x2="193.92329"
+             y2="593.573"
+             id="linearGradient4695"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="217.42307"
+             y1="536.03741"
+             x2="217.42307"
+             y2="459.23132"
+             id="linearGradient4696"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="118.25803"
+             y1="563.01941"
+             x2="156.10408"
+             y2="564.03723"
+             id="linearGradient4697"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.54934,0.645436)" />
+          <linearGradient
+             x1="139.11636"
+             y1="564.54614"
+             x2="200.18613"
+             y2="564.54614"
+             id="linearGradient4699"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.54934,0.645436)" />
+          <radialGradient
+             cx="184.20265"
+             cy="780.47272"
+             r="49.972103"
+             fx="182.57774"
+             fy="734.32568"
+             id="radialGradient4700"
+             xlink:href="#linearGradient3749"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.455004,0.687283)" />
+          <linearGradient
+             x1="177.77042"
+             y1="831.05975"
+             x2="178.45302"
+             y2="795.11487"
+             id="linearGradient4701"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.548996,0.64558)" />
+          <linearGradient
+             x1="84.970261"
+             y1="1095.1855"
+             x2="84.970261"
+             y2="1189.3411"
+             id="linearGradient4702"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.987109,0.503244)" />
+          <linearGradient
+             x1="87.605721"
+             y1="1061.6371"
+             x2="87.605721"
+             y2="1160.6499"
+             id="linearGradient4703"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.930484,0.518005)" />
+          <radialGradient
+             cx="106.52795"
+             cy="541.31592"
+             r="49.665058"
+             fx="105.48236"
+             fy="502.10669"
+             id="radialGradient4704"
+             xlink:href="#linearGradient994"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="-91.514885"
+             y1="199.05321"
+             x2="30.274208"
+             y2="194.82513"
+             id="linearGradient4706"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.026011,0.974648)" />
+          <linearGradient
+             x1="-4.4710765"
+             y1="366.76578"
+             x2="26.069948"
+             y2="512.50165"
+             id="linearGradient4707"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.633883,0,0,0.536553,-25.41624,-15.94345)" />
+          <linearGradient
+             x1="-49.343468"
+             y1="302.82651"
+             x2="-10.230718"
+             y2="302.82651"
+             id="linearGradient4708"
+             xlink:href="#linearGradient4592"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.318581,0.758391)" />
+          <linearGradient
+             x1="-18.900764"
+             y1="185.38274"
+             x2="24.677307"
+             y2="151.7379"
+             id="linearGradient4710"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.706204,1.416022)" />
+          <linearGradient
+             x1="-6.0588322"
+             y1="210.60007"
+             x2="6.9808698"
+             y2="293.03543"
+             id="linearGradient4711"
+             xlink:href="#linearGradient4588"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.439544,0,0,0.694664,-12.26418,6.7453)" />
+          <linearGradient
+             x1="-91.514885"
+             y1="199.05321"
+             x2="30.274208"
+             y2="194.82513"
+             id="linearGradient4713"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.272246,-0.435187,0.939711,0.665801,-204.4414,93.2513)" />
+          <linearGradient
+             x1="-18.900764"
+             y1="185.38274"
+             x2="24.677307"
+             y2="151.7379"
+             id="linearGradient4714"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.706204,1.416022)" />
+          <linearGradient
+             x1="-91.514885"
+             y1="199.05321"
+             x2="30.274208"
+             y2="194.82513"
+             id="linearGradient4716"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.026011,0.974648)" />
+          <linearGradient
+             x1="-49.343468"
+             y1="302.82651"
+             x2="-10.230718"
+             y2="302.82651"
+             id="linearGradient4717"
+             xlink:href="#linearGradient4592"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.318581,0.758391)" />
+          <linearGradient
+             x1="-6.0588322"
+             y1="210.60007"
+             x2="6.9808698"
+             y2="293.03543"
+             id="linearGradient4718"
+             xlink:href="#linearGradient4588"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.439544,0,0,0.694664,-12.26418,6.7453)" />
+          <linearGradient
+             x1="-91.514885"
+             y1="199.05321"
+             x2="30.274208"
+             y2="194.82513"
+             id="linearGradient4719"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.272246,-0.435187,0.939711,0.665801,-204.4414,93.2513)" />
+          <defs
+             id="defs4720">
+            <linearGradient
+               id="linearGradient4722">
+              <stop
+                 id="stop4724"
+                 style="stop-color:#000000;stop-opacity:0.3882353"
+                 offset="0" />
+              <stop
+                 id="stop4725"
+                 style="stop-color:#ffffff;stop-opacity:0.34375"
+                 offset="0.5" />
+              <stop
+                 id="stop4726"
+                 style="stop-color:#ffffff;stop-opacity:0.19607843"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient4729"
+               xlink:href="#linearGradient3057"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient4731"
+               xlink:href="#linearGradient4618"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient4732"
+               xlink:href="#linearGradient4588"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient4733"
+               xlink:href="#linearGradient4615"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient4734"
+               xlink:href="#linearGradient3041"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient4735"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.241013,0.805793)" />
+            <linearGradient
+               x1="87.605721"
+               y1="1061.6371"
+               x2="87.605721"
+               y2="1160.6499"
+               id="linearGradient4736"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.930484,0.518005)" />
+            <linearGradient
+               x1="177.77042"
+               y1="831.05975"
+               x2="178.45302"
+               y2="795.11487"
+               id="linearGradient4737"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.548996,0.64558)" />
+            <linearGradient
+               x1="458.70102"
+               y1="329.58002"
+               x2="404.87259"
+               y2="326.23184"
+               id="linearGradient4738"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="139.11636"
+               y1="564.54614"
+               x2="200.18613"
+               y2="564.54614"
+               id="linearGradient4739"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <linearGradient
+               x1="118.25803"
+               y1="563.01941"
+               x2="156.10408"
+               y2="564.03723"
+               id="linearGradient4740"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <linearGradient
+               x1="238.75548"
+               y1="339.24017"
+               x2="317.05142"
+               y2="333.88309"
+               id="linearGradient4741"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient4742"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.380924,0.724153)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient4743"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.381391,0.723908)" />
+            <linearGradient
+               x1="354.95923"
+               y1="464.90207"
+               x2="354.95923"
+               y2="299.05014"
+               id="linearGradient4744"
+               xlink:href="#linearGradient1102"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <radialGradient
+               cx="184.20265"
+               cy="780.47272"
+               r="49.972103"
+               fx="182.57774"
+               fy="734.32568"
+               id="radialGradient4745"
+               xlink:href="#linearGradient948"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.455004,0.687283)" />
+            <radialGradient
+               cx="0.52464789"
+               cy="0.32867134"
+               r="0.28679976"
+               fx="0.52464789"
+               fy="0.59440559"
+               id="radialGradient4746"
+               xlink:href="#linearGradient843" />
+            <radialGradient
+               cx="106.52795"
+               cy="541.31592"
+               r="49.665058"
+               fx="105.48236"
+               fy="502.10669"
+               id="radialGradient4747"
+               xlink:href="#linearGradient994"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="84.970261"
+               y1="1095.1855"
+               x2="84.970261"
+               y2="1189.3411"
+               id="linearGradient4749"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.987109,0.503244)" />
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient4750"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient4751"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient4752"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient4753"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient4754"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient4755"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="354.95923"
+               y1="464.90207"
+               x2="354.95923"
+               y2="299.05014"
+               id="linearGradient4756"
+               xlink:href="#linearGradient1102"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="238.75548"
+               y1="339.24017"
+               x2="317.05142"
+               y2="333.88309"
+               id="linearGradient5842"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="458.70102"
+               y1="329.58002"
+               x2="404.87259"
+               y2="326.23184"
+               id="linearGradient4758"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient5844"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient4760"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient4761"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="118.25803"
+               y1="563.01941"
+               x2="156.10408"
+               y2="564.03723"
+               id="linearGradient4762"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <linearGradient
+               x1="139.11636"
+               y1="564.54614"
+               x2="200.18613"
+               y2="564.54614"
+               id="linearGradient5848"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <radialGradient
+               cx="184.20265"
+               cy="780.47272"
+               r="49.972103"
+               fx="182.57774"
+               fy="734.32568"
+               id="radialGradient4764"
+               xlink:href="#linearGradient948"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.455004,0.687283)" />
+            <linearGradient
+               x1="177.77042"
+               y1="831.05975"
+               x2="178.45302"
+               y2="795.11487"
+               id="linearGradient5850"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.548996,0.64558)" />
+            <linearGradient
+               x1="84.970261"
+               y1="1095.1855"
+               x2="84.970261"
+               y2="1189.3411"
+               id="linearGradient4766"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.987109,0.503244)" />
+            <linearGradient
+               x1="87.605721"
+               y1="1061.6371"
+               x2="87.605721"
+               y2="1160.6499"
+               id="linearGradient4767"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.930484,0.518005)" />
+            <radialGradient
+               cx="106.52795"
+               cy="541.31592"
+               r="49.665058"
+               fx="105.48236"
+               fy="502.10669"
+               id="radialGradient4768"
+               xlink:href="#linearGradient994"
+               gradientUnits="userSpaceOnUse" />
+          </defs>
+          <linearGradient
+             x1="179.83598"
+             y1="178.66379"
+             x2="200.25706"
+             y2="302.00961"
+             id="linearGradient3992"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.030776,0.970143)" />
+          <linearGradient
+             x1="178.64995"
+             y1="179.87529"
+             x2="198.41254"
+             y2="299.24384"
+             id="linearGradient3993"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.034428,0.966718)" />
+          <linearGradient
+             x1="181.35893"
+             y1="177.20132"
+             x2="202.65994"
+             y2="305.862"
+             id="linearGradient3994"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.026679,0.974015)" />
+          <linearGradient
+             x1="182.83167"
+             y1="175.80452"
+             x2="205.01575"
+             y2="309.7991"
+             id="linearGradient3995"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.022962,0.977554)" />
+          <linearGradient
+             x1="177.86378"
+             y1="181.4277"
+             x2="197.19272"
+             y2="298.17694"
+             id="linearGradient3996"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.036891,0.964422)" />
+          <linearGradient
+             x1="55.601124"
+             y1="-30.810305"
+             x2="40.876816"
+             y2="218.58856"
+             id="linearGradient3997"
+             xlink:href="#linearGradient1454"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.082134,0.9241)" />
+          <linearGradient
+             x1="64.116882"
+             y1="47.803505"
+             x2="37.547989"
+             y2="140.37704"
+             id="linearGradient3998"
+             xlink:href="#linearGradient1546"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.329487,0.75217)" />
+          <linearGradient
+             x1="83.123482"
+             y1="92.632271"
+             x2="77.120087"
+             y2="56.941833"
+             id="linearGradient3999"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.162115,0.8605)" />
+          <linearGradient
+             x1="48.88829"
+             y1="90.157753"
+             x2="99.629562"
+             y2="86.570915"
+             id="linearGradient4000"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.162115,0.8605)" />
+          <linearGradient
+             x1="57.724483"
+             y1="184.34286"
+             x2="55.957409"
+             y2="144.17274"
+             id="linearGradient4001"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.636328,0.611124)" />
+          <linearGradient
+             x1="55.045113"
+             y1="85.877014"
+             x2="109.27901"
+             y2="88.11335"
+             id="linearGradient4002"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.162536,0.860189)" />
+          <linearGradient
+             x1="66.679367"
+             y1="28.158081"
+             x2="66.679367"
+             y2="107.53253"
+             id="linearGradient4003"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.1618,0.860733)" />
+          <linearGradient
+             x1="47.242912"
+             y1="77.450203"
+             x2="109.62949"
+             y2="76.102692"
+             id="linearGradient4004"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.1618,0.860733)" />
+          <linearGradient
+             x1="71.901497"
+             y1="69.209007"
+             x2="85.293274"
+             y2="102.17883"
+             id="linearGradient4005"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.179599,0.847746)" />
+          <linearGradient
+             x1="55.239422"
+             y1="97.356407"
+             x2="25.40143"
+             y2="29.790384"
+             id="linearGradient4006"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.942585,1.060912)" />
+          <linearGradient
+             x1="53.647789"
+             y1="101.89593"
+             x2="53.647789"
+             y2="160.91232"
+             id="linearGradient4007"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.289244,0.775649)" />
+          <linearGradient
+             x1="69.363586"
+             y1="56.763401"
+             x2="71.684402"
+             y2="101.294"
+             id="linearGradient4008"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.20398,0.830579)" />
+          <linearGradient
+             x1="28.813946"
+             y1="221.79578"
+             x2="10.582993"
+             y2="235.65099"
+             id="linearGradient4009"
+             xlink:href="#linearGradient1551"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.709409,0.584998)" />
+          <radialGradient
+             cx="24.825565"
+             cy="176.56438"
+             r="42.859913"
+             fx="40.974991"
+             fy="162.11137"
+             id="radialGradient4010"
+             xlink:href="#linearGradient1806"
+             gradientUnits="userSpaceOnUse" />
+          <defs
+             id="defs4832">
+            <linearGradient
+               id="linearGradient4833">
+              <stop
+                 id="stop4834"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop4835"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient4836">
+              <stop
+                 id="stop4837"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop4838"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient4839">
+              <stop
+                 id="stop4840"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop4841"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop4842"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop4843"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop4844"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient4848">
+              <stop
+                 id="stop4849"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop4850"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient4851"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <defs
+               id="defs4852">
+              <linearGradient
+                 id="linearGradient4853">
+                <stop
+                   id="stop4854"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop4855"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient4856">
+                <stop
+                   id="stop4857"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop4858"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop4859"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop4860"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop4861"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient4862">
+                <stop
+                   id="stop4863"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop4864"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <radialGradient
+                 cx="23.756607"
+                 cy="60.078049"
+                 r="21.026033"
+                 fx="23.756607"
+                 fy="60.078049"
+                 id="radialGradient4865"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.006281,0.993758)" />
+              <linearGradient
+                 x1="31.82851"
+                 y1="61.778381"
+                 x2="33.198818"
+                 y2="6.859036"
+                 id="linearGradient4866"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.750054,0,0,1.072718,1.04579,2.663333)" />
+              <radialGradient
+                 cx="92.478806"
+                 cy="20.827066"
+                 r="45.889046"
+                 fx="92.478806"
+                 fy="20.827066"
+                 id="radialGradient4867"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.506767,1.973294)" />
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient4868"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="108.49871"
+                 y1="17.573528"
+                 x2="185.22578"
+                 y2="24.330959"
+                 id="linearGradient4869"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="28.814428"
+                 y1="-1.616316"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient4870"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.764292,1.3084)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient4871"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <linearGradient
+                 x1="30.382267"
+                 y1="7.5329666"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient4874"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+              <linearGradient
+                 x1="25.954844"
+                 y1="25.071495"
+                 x2="39.781502"
+                 y2="27.315489"
+                 id="linearGradient4875"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103231)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient4876"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient4877"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient4878"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs4879">
+                <linearGradient
+                   id="linearGradient4880">
+                  <stop
+                     id="stop4881"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop4882"
+                     style="stop-color:#d0d1d9;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop4883"
+                     style="stop-color:#878b9b;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+              </defs>
+            </defs>
+            <defs
+               id="defs4898">
+              <linearGradient
+                 id="linearGradient4899">
+                <stop
+                   id="stop4900"
+                   style="stop-color:#826647;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop4901"
+                   style="stop-color:#575147;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.36627907"
+                 y1="0.8125"
+                 x2="0.36627907"
+                 y2="0.1796875"
+                 id="linearGradient4903"
+                 xlink:href="#linearGradient1136"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="-0.109375"
+                 y1="0.9140625"
+                 x2="1.15625"
+                 y2="0.1796875"
+                 id="linearGradient4904"
+                 xlink:href="#linearGradient1136" />
+            </defs>
+            <radialGradient
+               cx="24.825565"
+               cy="176.56438"
+               r="42.859913"
+               fx="40.974991"
+               fy="162.11137"
+               id="radialGradient4906"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="693.25439"
+               y1="697.24719"
+               x2="657.74762"
+               y2="677.27399"
+               id="linearGradient4908"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.983783,1.016484)" />
+            <linearGradient
+               x1="681.34058"
+               y1="728.7738"
+               x2="641.37305"
+               y2="705.9129"
+               id="linearGradient4910"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.986777,1.0134)" />
+            <linearGradient
+               x1="649.57269"
+               y1="677.24323"
+               x2="630.47528"
+               y2="668.91809"
+               id="linearGradient4911"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988806,1.011321)" />
+            <linearGradient
+               x1="647.99902"
+               y1="693.73279"
+               x2="629.89734"
+               y2="683.8114"
+               id="linearGradient4912"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.975718,1.024886)" />
+            <linearGradient
+               x1="538.89514"
+               y1="277.2775"
+               x2="575.11407"
+               y2="342.66919"
+               id="linearGradient4913"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.998206,1.001797)" />
+            <linearGradient
+               x1="509.06769"
+               y1="327.76361"
+               x2="544.86011"
+               y2="399.38104"
+               id="linearGradient4914"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.972249,1.028543)" />
+            <linearGradient
+               x1="591.27606"
+               y1="330.16998"
+               x2="620.33301"
+               y2="382.54678"
+               id="linearGradient4915"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.044357,0.957527)" />
+            <linearGradient
+               x1="566.74347"
+               y1="415.15009"
+               x2="588.13922"
+               y2="458.04449"
+               id="linearGradient4916"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.03551,0.965707)" />
+            <defs
+               id="defs4917">
+              <linearGradient
+                 x1="0.25179857"
+                 y1="-0.0390625"
+                 x2="0.53237408"
+                 y2="0.5234375"
+                 id="linearGradient4918"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.092198581"
+                 y1="-0.2109375"
+                 x2="0.4822695"
+                 y2="0.4921875"
+                 id="linearGradient4919"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.016528925"
+                 y1="-0.4921875"
+                 x2="0.51239669"
+                 y2="0.5"
+                 id="linearGradient4920"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.05511811"
+                 y1="-0.3046875"
+                 x2="0.53543305"
+                 y2="0.5625"
+                 id="linearGradient4921"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="1.2125034"
+                 y1="0.78833276"
+                 x2="0.5859077"
+                 y2="0.44490069"
+                 id="linearGradient4922"
+                 xlink:href="#linearGradient4215"
+                 gradientTransform="scale(0.999075,1.000926)" />
+              <linearGradient
+                 id="linearGradient4923">
+                <stop
+                   id="stop18065"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop18067"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.1610887"
+                 y1="0.61942029"
+                 x2="0.47761098"
+                 y2="0.3214713"
+                 id="linearGradient4926"
+                 xlink:href="#linearGradient4215"
+                 gradientTransform="scale(1.003618,0.996395)" />
+              <linearGradient
+                 x1="1.8455285"
+                 y1="1.34375"
+                 x2="0.47967479"
+                 y2="0.5625"
+                 id="linearGradient4927"
+                 xlink:href="#linearGradient4021" />
+              <linearGradient
+                 id="linearGradient4928">
+                <stop
+                   id="stop4929"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop4930"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.7519705"
+                 y1="1.0528145"
+                 x2="0.54093099"
+                 y2="0.37158158"
+                 id="linearGradient4931"
+                 xlink:href="#linearGradient4021"
+                 gradientTransform="scale(0.990884,1.0092)" />
+              <linearGradient
+                 x1="0.24528302"
+                 y1="1.6015625"
+                 x2="0.28301886"
+                 y2="-0.0234375"
+                 id="linearGradient4932"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.89719623"
+                 y1="-0.1484375"
+                 x2="0.40186915"
+                 y2="0.5546875"
+                 id="linearGradient4933"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.90588236"
+                 y1="-0.2734375"
+                 x2="0.36470589"
+                 y2="0.5078125"
+                 id="linearGradient4934"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.56809336"
+                 y1="-0.125"
+                 x2="0.49027237"
+                 y2="0.59375"
+                 id="linearGradient4935"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="1.4128441"
+                 y1="1.25"
+                 x2="0.42201835"
+                 y2="0.4140625"
+                 id="linearGradient4936"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.084848486"
+                 y1="1.1640625"
+                 x2="0.53333336"
+                 y2="0.359375"
+                 id="linearGradient4937"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.76190478"
+                 y1="-0.53125"
+                 x2="0.6857143"
+                 y2="0.5390625"
+                 id="linearGradient4938"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 id="linearGradient4939">
+                <stop
+                   id="stop4940"
+                   style="stop-color:#ffffff;stop-opacity:0.83615822"
+                   offset="0" />
+                <stop
+                   id="stop4941"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="2.2054794"
+                 y1="2.03125"
+                 x2="0.56164384"
+                 y2="-0.28125"
+                 id="linearGradient4942"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.88832486"
+                 y1="1.0390625"
+                 x2="0.55837566"
+                 y2="0.3046875"
+                 id="linearGradient4943"
+                 xlink:href="#linearGradient1806" />
+              <linearGradient
+                 x1="0.85217392"
+                 y1="0.9609375"
+                 x2="0.86086959"
+                 y2="0.296875"
+                 id="linearGradient4944"
+                 xlink:href="#linearGradient1806" />
+              <linearGradient
+                 x1="0.064220183"
+                 y1="1.4375"
+                 x2="0.22018349"
+                 y2="0.3125"
+                 id="linearGradient4945"
+                 xlink:href="#linearGradient3970" />
+              <linearGradient
+                 id="linearGradient4946">
+                <stop
+                   id="stop4947"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop4948"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.1011236"
+                 y1="0.7421875"
+                 x2="0.033707865"
+                 y2="0.5703125"
+                 id="linearGradient4949"
+                 xlink:href="#linearGradient3970" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient2507"
+                 xlink:href="#linearGradient4545"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <radialGradient
+                 cx="0.49032259"
+                 cy="0.50649351"
+                 r="0.38170236"
+                 fx="0.63414633"
+                 fy="0.37777779"
+                 id="radialGradient4951"
+                 xlink:href="#linearGradient1806" />
+            </defs>
+            <linearGradient
+               x1="-191.46153"
+               y1="37.372372"
+               x2="-165.58835"
+               y2="37.372372"
+               id="linearGradient4996"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+            <defs
+               id="defs4997">
+              <linearGradient
+                 id="linearGradient4998">
+                <stop
+                   id="stop4999"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop5000"
+                   style="stop-color:#fafbff;stop-opacity:1"
+                   offset="0.25" />
+                <stop
+                   id="stop5001"
+                   style="stop-color:#f0f2fa;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop5002"
+                   style="stop-color:#e1e1e1;stop-opacity:1"
+                   offset="0.75" />
+                <stop
+                   id="stop5003"
+                   style="stop-color:#f5f6ff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient5004">
+                <stop
+                   id="stop5005"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop5006"
+                   style="stop-color:#d0d1d9;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop5007"
+                   style="stop-color:#878b9b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient5008">
+                <stop
+                   id="stop5009"
+                   style="stop-color:#e8e8e8;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop5010"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient5011"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <radialGradient
+                 cx="-77.367622"
+                 cy="42.633839"
+                 r="216.26619"
+                 fx="-80.036034"
+                 fy="44.468376"
+                 id="radialGradient5012"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+              <defs
+                 id="defs5013">
+                <linearGradient
+                   id="linearGradient5014">
+                  <stop
+                     id="stop5015"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop5016"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient5017">
+                  <stop
+                     id="stop5018"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop5019"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop5020"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop5021"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop5022"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient5023">
+                  <stop
+                     id="stop5024"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop5025"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="133.07144"
+                   y1="28.231943"
+                   x2="118.58411"
+                   y2="13.431207"
+                   id="linearGradient5026"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                <linearGradient
+                   x1="30.722504"
+                   y1="28.135216"
+                   x2="39.78149"
+                   y2="27.315481"
+                   id="linearGradient5027"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103232)" />
+                <radialGradient
+                   cx="4.9853168"
+                   cy="108.47158"
+                   r="34.222183"
+                   fx="5.2520976"
+                   fy="108.73115"
+                   id="radialGradient5028"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="78.675774"
+                   y1="47.411823"
+                   x2="64.05336"
+                   y2="34.302757"
+                   id="linearGradient5030"
+                   xlink:href="#linearGradient4281"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                <defs
+                   id="defs5031">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient5032"
+                     xlink:href="#linearGradient3296"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                </defs>
+              </defs>
+              <linearGradient
+                 x1="88.712402"
+                 y1="138.15012"
+                 x2="104.81104"
+                 y2="151.63045"
+                 id="linearGradient5047"
+                 xlink:href="#linearGradient3305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            </defs>
+            <linearGradient
+               x1="226.34392"
+               y1="866.83282"
+               x2="109.99118"
+               y2="627.57227"
+               id="linearGradient1774"
+               xlink:href="#linearGradient845"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.015083,0.985142)" />
+            <linearGradient
+               x1="405.49411"
+               y1="241.15977"
+               x2="405.49411"
+               y2="748.58954"
+               id="linearGradient1775"
+               xlink:href="#linearGradient850"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.961036,1.040544)" />
+            <linearGradient
+               x1="911.58417"
+               y1="626.5332"
+               x2="911.58417"
+               y2="471.98822"
+               id="linearGradient1776"
+               xlink:href="#linearGradient865"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.250806,0.799484)" />
+            <linearGradient
+               x1="275.91269"
+               y1="240.36499"
+               x2="337.76599"
+               y2="385.1778"
+               id="linearGradient1777"
+               xlink:href="#linearGradient845"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.214317,0.823508)" />
+            <linearGradient
+               x1="250.2383"
+               y1="350.13974"
+               x2="250.2383"
+               y2="280.09955"
+               id="linearGradient5059"
+               xlink:href="#linearGradient860"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.349063,0.741255)" />
+            <linearGradient
+               x1="309.547"
+               y1="292.84094"
+               x2="309.547"
+               y2="127.49744"
+               id="linearGradient1779"
+               xlink:href="#linearGradient860"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.194349,0.837276)" />
+            <linearGradient
+               x1="911.58417"
+               y1="626.5332"
+               x2="911.58417"
+               y2="471.98822"
+               id="linearGradient1780"
+               xlink:href="#linearGradient865"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.250806,0.799484)" />
+            <linearGradient
+               x1="517.80023"
+               y1="832.91492"
+               x2="742.3476"
+               y2="628.79071"
+               id="linearGradient1781"
+               xlink:href="#linearGradient845"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.975706,1.024899)" />
+            <linearGradient
+               x1="309.547"
+               y1="292.84094"
+               x2="309.547"
+               y2="127.49744"
+               id="linearGradient1782"
+               xlink:href="#linearGradient860"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.194349,0.837276)" />
+            <linearGradient
+               x1="309.547"
+               y1="292.84094"
+               x2="309.547"
+               y2="127.49744"
+               id="linearGradient1783"
+               xlink:href="#linearGradient860"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.194349,0.837276)" />
+            <linearGradient
+               x1="736.18683"
+               y1="646.92255"
+               x2="736.18683"
+               y2="478.88864"
+               id="linearGradient1784"
+               xlink:href="#linearGradient860"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.762621,1.311267)" />
+            <linearGradient
+               x1="184.0434"
+               y1="838.54852"
+               x2="142.93327"
+               y2="642.70612"
+               id="linearGradient1785"
+               xlink:href="#linearGradient860"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.026717,0.973979)" />
+            <linearGradient
+               x1="472.38922"
+               y1="807.86877"
+               x2="472.10596"
+               y2="746.31073"
+               id="linearGradient1786"
+               xlink:href="#linearGradient865"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.249987,0.800008)" />
+            <linearGradient
+               x1="254.96887"
+               y1="629.17017"
+               x2="277.04468"
+               y2="579.98926"
+               id="linearGradient1787"
+               xlink:href="#linearGradient865"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.892795,1.120079)" />
+            <linearGradient
+               x1="84.960785"
+               y1="92.151367"
+               x2="42.64373"
+               y2="53.360722"
+               id="linearGradient5069"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.321949,0.756459)" />
+            <linearGradient
+               x1="109.15074"
+               y1="2.1610787"
+               x2="134.0733"
+               y2="60.510494"
+               id="linearGradient5070"
+               xlink:href="#linearGradient845"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.835421,1.197001)" />
+            <linearGradient
+               x1="186.07457"
+               y1="23.533224"
+               x2="202.6377"
+               y2="23.47304"
+               id="linearGradient5071"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.388045,2.57702)" />
+            <linearGradient
+               x1="92.631454"
+               y1="54.989693"
+               x2="92.631454"
+               y2="50.608093"
+               id="linearGradient5072"
+               xlink:href="#linearGradient1757"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.787838,1.269296)" />
+            <radialGradient
+               cx="24.825565"
+               cy="176.56438"
+               r="42.859913"
+               fx="40.974991"
+               fy="162.11137"
+               id="radialGradient5073"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="693.25439"
+               y1="697.24719"
+               x2="657.74762"
+               y2="677.27399"
+               id="linearGradient5074"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.983783,1.016484)" />
+            <linearGradient
+               x1="681.34058"
+               y1="728.7738"
+               x2="641.37305"
+               y2="705.9129"
+               id="linearGradient5075"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.986777,1.0134)" />
+            <linearGradient
+               x1="649.57269"
+               y1="677.24323"
+               x2="630.47528"
+               y2="668.91809"
+               id="linearGradient5076"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988806,1.011321)" />
+            <linearGradient
+               x1="647.99902"
+               y1="693.73279"
+               x2="629.89734"
+               y2="683.8114"
+               id="linearGradient5077"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.975718,1.024886)" />
+            <linearGradient
+               x1="538.89514"
+               y1="277.2775"
+               x2="575.11407"
+               y2="342.66919"
+               id="linearGradient5078"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.998206,1.001797)" />
+            <linearGradient
+               x1="509.06769"
+               y1="327.76361"
+               x2="544.86011"
+               y2="399.38104"
+               id="linearGradient5079"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.972249,1.028543)" />
+            <linearGradient
+               x1="591.27606"
+               y1="330.16998"
+               x2="620.33301"
+               y2="382.54678"
+               id="linearGradient5080"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.044357,0.957527)" />
+            <linearGradient
+               x1="566.74347"
+               y1="415.15009"
+               x2="588.13922"
+               y2="458.04449"
+               id="linearGradient5081"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.03551,0.965707)" />
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient5082"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+            <linearGradient
+               x1="1270.3132"
+               y1="4.8765283"
+               x2="1247.6848"
+               y2="0.72310239"
+               id="linearGradient55052"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(9.440723e-2,10.59241)" />
+            <linearGradient
+               x1="1270.3132"
+               y1="4.8765283"
+               x2="1247.6848"
+               y2="0.72310239"
+               id="linearGradient5084"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+            <defs
+               id="defs5085">
+              <linearGradient
+                 id="linearGradient5089">
+                <stop
+                   id="stop5090"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop5091"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient5092">
+                <stop
+                   id="stop5093"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop5094"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient5095">
+                <stop
+                   id="stop5096"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop55064"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop15398"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop5099"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop5100"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient5101">
+                <stop
+                   id="stop5102"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop5103"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <radialGradient
+                 cx="23.756607"
+                 cy="60.078049"
+                 r="21.026033"
+                 fx="23.756607"
+                 fy="60.078049"
+                 id="radialGradient5104"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+              <linearGradient
+                 x1="31.82851"
+                 y1="61.778381"
+                 x2="33.198818"
+                 y2="6.859036"
+                 id="linearGradient5105"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+              <radialGradient
+                 cx="92.478806"
+                 cy="20.827066"
+                 r="45.889046"
+                 fx="92.478806"
+                 fy="20.827066"
+                 id="radialGradient5106"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient5107"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+              <linearGradient
+                 x1="108.49871"
+                 y1="17.573528"
+                 x2="185.22578"
+                 y2="24.330959"
+                 id="linearGradient5108"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+              <linearGradient
+                 x1="28.814428"
+                 y1="-1.616316"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient55077"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.764292,1.3084)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient5110"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <linearGradient
+                 x1="30.382267"
+                 y1="7.5329666"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient5111"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+              <linearGradient
+                 x1="25.954844"
+                 y1="25.071495"
+                 x2="39.781502"
+                 y2="27.315489"
+                 id="linearGradient5112"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103231)" />
+              <linearGradient
+                 x1="31.82851"
+                 y1="61.778381"
+                 x2="33.198818"
+                 y2="6.859036"
+                 id="linearGradient5113"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+              <radialGradient
+                 cx="24.825565"
+                 cy="176.56438"
+                 r="42.859913"
+                 fx="40.974991"
+                 fy="162.11137"
+                 id="radialGradient5114"
+                 xlink:href="#linearGradient1806"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="693.25439"
+                 y1="697.24719"
+                 x2="657.74762"
+                 y2="677.27399"
+                 id="linearGradient1234"
+                 xlink:href="#linearGradient4021"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.983783,1.016484)" />
+              <linearGradient
+                 x1="681.34058"
+                 y1="728.7738"
+                 x2="641.37305"
+                 y2="705.9129"
+                 id="linearGradient1235"
+                 xlink:href="#linearGradient4021"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.986777,1.0134)" />
+              <linearGradient
+                 x1="649.57269"
+                 y1="677.24323"
+                 x2="630.47528"
+                 y2="668.91809"
+                 id="linearGradient1236"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.988806,1.011321)" />
+              <linearGradient
+                 x1="647.99902"
+                 y1="693.73279"
+                 x2="629.89734"
+                 y2="683.8114"
+                 id="linearGradient1237"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.975718,1.024886)" />
+              <linearGradient
+                 x1="538.89514"
+                 y1="277.2775"
+                 x2="575.11407"
+                 y2="342.66919"
+                 id="linearGradient1238"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.998206,1.001797)" />
+              <linearGradient
+                 x1="509.06769"
+                 y1="327.76361"
+                 x2="544.86011"
+                 y2="399.38104"
+                 id="linearGradient1239"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.972249,1.028543)" />
+              <linearGradient
+                 x1="591.27606"
+                 y1="330.16998"
+                 x2="620.33301"
+                 y2="382.54678"
+                 id="linearGradient5121"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.044357,0.957527)" />
+              <linearGradient
+                 x1="566.74347"
+                 y1="415.15009"
+                 x2="588.13922"
+                 y2="458.04449"
+                 id="linearGradient5122"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.03551,0.965707)" />
+              <defs
+                 id="defs5123">
+                <linearGradient
+                   x1="0.25179857"
+                   y1="-0.0390625"
+                   x2="0.53237408"
+                   y2="0.5234375"
+                   id="linearGradient5124"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="0.092198581"
+                   y1="-0.2109375"
+                   x2="0.4822695"
+                   y2="0.4921875"
+                   id="linearGradient5125"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="21.626436"
+                   y1="-66.061867"
+                   x2="55.698292"
+                   y2="2.1128926"
+                   id="linearGradient5126"
+                   xlink:href="#linearGradient3256"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.307939,0.764562)" />
+                <linearGradient
+                   x1="0.05511811"
+                   y1="-0.3046875"
+                   x2="0.53543305"
+                   y2="0.5625"
+                   id="linearGradient5127"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="98.267761"
+                   y1="18.995682"
+                   x2="61.273422"
+                   y2="-1.2806183"
+                   id="linearGradient5128"
+                   xlink:href="#linearGradient3256"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.209594,0.826724)" />
+                <linearGradient
+                   id="linearGradient5129">
+                  <stop
+                     id="stop5130"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop5131"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.1610887"
+                   y1="0.61942029"
+                   x2="0.47761098"
+                   y2="0.3214713"
+                   id="linearGradient5132"
+                   xlink:href="#linearGradient4215"
+                   gradientTransform="scale(1.003618,0.996395)" />
+                <linearGradient
+                   x1="1.8455285"
+                   y1="1.34375"
+                   x2="0.47967479"
+                   y2="0.5625"
+                   id="linearGradient5133"
+                   xlink:href="#linearGradient4021" />
+                <linearGradient
+                   id="linearGradient5134">
+                  <stop
+                     id="stop5135"
+                     style="stop-color:#000000;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop5136"
+                     style="stop-color:#000000;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.7519705"
+                   y1="1.0528145"
+                   x2="0.54093099"
+                   y2="0.37158158"
+                   id="linearGradient55106"
+                   xlink:href="#linearGradient4021"
+                   gradientTransform="scale(0.990884,1.0092)" />
+                <linearGradient
+                   x1="0.24528302"
+                   y1="1.6015625"
+                   x2="0.28301886"
+                   y2="-0.0234375"
+                   id="linearGradient5138"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.89719623"
+                   y1="-0.1484375"
+                   x2="0.40186915"
+                   y2="0.5546875"
+                   id="linearGradient5139"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.90588236"
+                   y1="-0.2734375"
+                   x2="0.36470589"
+                   y2="0.5078125"
+                   id="linearGradient5140"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.56809336"
+                   y1="-0.125"
+                   x2="0.49027237"
+                   y2="0.59375"
+                   id="linearGradient5141"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="1.4128441"
+                   y1="1.25"
+                   x2="0.42201835"
+                   y2="0.4140625"
+                   id="linearGradient5142"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.084848486"
+                   y1="1.1640625"
+                   x2="0.53333336"
+                   y2="0.359375"
+                   id="linearGradient5143"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.76190478"
+                   y1="-0.53125"
+                   x2="0.6857143"
+                   y2="0.5390625"
+                   id="linearGradient5144"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   id="linearGradient5145">
+                  <stop
+                     id="stop5146"
+                     style="stop-color:#ffffff;stop-opacity:0.83615822"
+                     offset="0" />
+                  <stop
+                     id="stop55117"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="2.2054794"
+                   y1="2.03125"
+                   x2="0.56164384"
+                   y2="-0.28125"
+                   id="linearGradient5148"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.88832486"
+                   y1="1.0390625"
+                   x2="0.55837566"
+                   y2="0.3046875"
+                   id="linearGradient5149"
+                   xlink:href="#linearGradient1806" />
+                <linearGradient
+                   x1="0.85217392"
+                   y1="0.9609375"
+                   x2="0.86086959"
+                   y2="0.296875"
+                   id="linearGradient5150"
+                   xlink:href="#linearGradient1806" />
+                <linearGradient
+                   x1="0.064220183"
+                   y1="1.4375"
+                   x2="0.22018349"
+                   y2="0.3125"
+                   id="linearGradient5151"
+                   xlink:href="#linearGradient3970" />
+                <linearGradient
+                   id="linearGradient5152">
+                  <stop
+                     id="stop5153"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop5154"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.1011236"
+                   y1="0.7421875"
+                   x2="0.033707865"
+                   y2="0.5703125"
+                   id="linearGradient55126"
+                   xlink:href="#linearGradient3970" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient5156"
+                   xlink:href="#linearGradient4550"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <radialGradient
+                   cx="0.49032259"
+                   cy="0.50649351"
+                   r="0.38170236"
+                   fx="0.63414633"
+                   fy="0.37777779"
+                   id="radialGradient5157"
+                   xlink:href="#linearGradient1806" />
+              </defs>
+            </defs>
+            <radialGradient
+               cx="24.825565"
+               cy="176.56438"
+               r="42.859913"
+               fx="40.974991"
+               fy="162.11137"
+               id="radialGradient5209"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="693.25439"
+               y1="697.24719"
+               x2="657.74762"
+               y2="677.27399"
+               id="linearGradient5210"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.983783,1.016484)" />
+            <linearGradient
+               x1="681.34058"
+               y1="728.7738"
+               x2="641.37305"
+               y2="705.9129"
+               id="linearGradient5211"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.986777,1.0134)" />
+            <linearGradient
+               x1="649.57269"
+               y1="677.24323"
+               x2="630.47528"
+               y2="668.91809"
+               id="linearGradient5212"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988806,1.011321)" />
+            <linearGradient
+               x1="647.99902"
+               y1="693.73279"
+               x2="629.89734"
+               y2="683.8114"
+               id="linearGradient5213"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.975718,1.024886)" />
+            <linearGradient
+               x1="538.89514"
+               y1="277.2775"
+               x2="575.11407"
+               y2="342.66919"
+               id="linearGradient5214"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.998206,1.001797)" />
+            <linearGradient
+               x1="509.06769"
+               y1="327.76361"
+               x2="544.86011"
+               y2="399.38104"
+               id="linearGradient5215"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.972249,1.028543)" />
+            <linearGradient
+               x1="591.27606"
+               y1="330.16998"
+               x2="620.33301"
+               y2="382.54678"
+               id="linearGradient5216"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.044357,0.957527)" />
+            <linearGradient
+               x1="566.74347"
+               y1="415.15009"
+               x2="588.13922"
+               y2="458.04449"
+               id="linearGradient5217"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.03551,0.965707)" />
+          </defs>
+        </defs>
+        <linearGradient
+           x1="522.94183"
+           y1="469.49918"
+           x2="522.94183"
+           y2="505.0845"
+           id="linearGradient4546"
+           xlink:href="#linearGradient1697"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="520.57166"
+           y1="506.28723"
+           x2="520.57166"
+           y2="466.2785"
+           id="linearGradient4547"
+           xlink:href="#linearGradient1697"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="522.94183"
+           y1="469.49918"
+           x2="522.94183"
+           y2="505.0845"
+           id="linearGradient4548"
+           xlink:href="#linearGradient1697"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="213.82799"
+           y1="183.48366"
+           x2="214.59154"
+           y2="463.47311"
+           id="linearGradient4549"
+           xlink:href="#linearGradient3202"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+        <linearGradient
+           x1="520.57166"
+           y1="506.28723"
+           x2="520.57166"
+           y2="466.2785"
+           id="linearGradient5277"
+           xlink:href="#linearGradient1697"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="522.94183"
+           y1="469.49918"
+           x2="522.94183"
+           y2="505.0845"
+           id="linearGradient5278"
+           xlink:href="#linearGradient1697"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="213.82799"
+           y1="183.48366"
+           x2="214.59154"
+           y2="463.47311"
+           id="linearGradient5279"
+           xlink:href="#linearGradient3202"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+        <defs
+           id="defs3226">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient3227"
+             xlink:href="#linearGradient3202"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient3228">
+            <stop
+               id="stop18278"
+               style="stop-color:#69db0e;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop55158"
+               style="stop-color:#397607;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="520.57166"
+             y1="506.28723"
+             x2="520.57166"
+             y2="466.2785"
+             id="linearGradient3231"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <radialGradient
+             cx="522.89532"
+             cy="481.86633"
+             r="15.301119"
+             fx="522.89911"
+             fy="473.03323"
+             id="radialGradient55161"
+             xlink:href="#linearGradient1702"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="522.94183"
+             y1="469.49918"
+             x2="522.94183"
+             y2="505.0845"
+             id="linearGradient3233"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="213.82799"
+             y1="183.48366"
+             x2="214.59154"
+             y2="463.47311"
+             id="linearGradient3234"
+             xlink:href="#linearGradient1702"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+        </defs>
+        <defs
+           id="defs3127">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient5288"
+             xlink:href="#linearGradient3202"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient5289"
+             xlink:href="#linearGradient5390"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="520.57166"
+             y1="506.28723"
+             x2="520.57166"
+             y2="466.2785"
+             id="linearGradient3134"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <radialGradient
+             cx="522.89532"
+             cy="481.86633"
+             r="15.301119"
+             fx="522.89911"
+             fy="473.03323"
+             id="radialGradient5291"
+             xlink:href="#linearGradient1702"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="522.94183"
+             y1="469.49918"
+             x2="522.94183"
+             y2="505.0845"
+             id="linearGradient5292"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="213.82799"
+             y1="183.48366"
+             x2="214.59154"
+             y2="463.47311"
+             id="linearGradient5293"
+             xlink:href="#linearGradient1702"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+        </defs>
+        <linearGradient
+           x1="520.57166"
+           y1="506.28723"
+           x2="520.57166"
+           y2="466.2785"
+           id="linearGradient5385"
+           xlink:href="#linearGradient1697"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="522.94183"
+           y1="469.49918"
+           x2="522.94183"
+           y2="505.0845"
+           id="linearGradient5386"
+           xlink:href="#linearGradient1697"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="213.82799"
+           y1="183.48366"
+           x2="214.59154"
+           y2="463.47311"
+           id="linearGradient5387"
+           xlink:href="#linearGradient3202"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+        <linearGradient
+           x1="520.57166"
+           y1="506.28723"
+           x2="520.57166"
+           y2="466.2785"
+           id="linearGradient5393"
+           xlink:href="#linearGradient5390"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="522.94183"
+           y1="469.49918"
+           x2="522.94183"
+           y2="505.0845"
+           id="linearGradient5394"
+           xlink:href="#linearGradient5390"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="520.57166"
+           y1="506.28723"
+           x2="520.57166"
+           y2="466.2785"
+           id="linearGradient2327"
+           xlink:href="#linearGradient2491"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="522.94183"
+           y1="469.49918"
+           x2="522.73914"
+           y2="530.67786"
+           id="linearGradient2328"
+           xlink:href="#linearGradient2494"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="520.57166"
+           y1="506.28723"
+           x2="520.57166"
+           y2="466.2785"
+           id="linearGradient2329"
+           xlink:href="#linearGradient1867"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="44.930588"
+           y1="56.725216"
+           x2="45.511845"
+           y2="185.05675"
+           id="linearGradient5344"
+           xlink:href="#linearGradient3202"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.694118,0,0,0.651906,0,-2.410339)" />
+        <defs
+           id="defs2122">
+          <linearGradient
+             id="linearGradient2494">
+            <stop
+               id="stop2495"
+               style="stop-color:#bb0a0a;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop55188"
+               style="stop-color:#e60d0d;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient5349">
+            <stop
+               id="stop2127"
+               style="stop-color:#bb0a0a;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2128"
+               style="stop-color:#e60d0d;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient2129">
+            <stop
+               id="stop2130"
+               style="stop-color:#ff0d0d;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2131"
+               style="stop-color:#e65b5b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient2132"
+             xlink:href="#linearGradient3629"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient5356">
+            <stop
+               id="stop5357"
+               style="stop-color:#e6d500;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop5358"
+               style="stop-color:#ffba61;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient5359">
+            <stop
+               id="stop5360"
+               style="stop-color:#e6da1e;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop5361"
+               style="stop-color:#fff99b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient5362">
+            <stop
+               id="stop55204"
+               style="stop-color:#000000;stop-opacity:0.3137255"
+               offset="0" />
+            <stop
+               id="stop55206"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient6436">
+            <stop
+               id="stop5366"
+               style="stop-color:#ccff5f;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop5367"
+               style="stop-color:#69db0e;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient2148">
+            <stop
+               id="stop2149"
+               style="stop-color:#ffffff;stop-opacity:0.69072163"
+               offset="0" />
+            <stop
+               id="stop2150"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="-121.92418"
+             y1="83.079994"
+             x2="-26.452623"
+             y2="83.079994"
+             id="linearGradient55214"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.294003,0.772796)">
+            <stop
+               id="stop5372"
+               style="stop-color:#bb0a0a;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop5373"
+               style="stop-color:#e60d0d;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="520.57166"
+             y1="506.28723"
+             x2="520.57166"
+             y2="466.2785"
+             id="linearGradient2154"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <radialGradient
+             cx="522.89532"
+             cy="481.86633"
+             r="15.301119"
+             fx="522.89911"
+             fy="473.03323"
+             id="radialGradient6446"
+             xlink:href="#linearGradient1702"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="522.94183"
+             y1="469.49918"
+             x2="522.94183"
+             y2="505.0845"
+             id="linearGradient2156"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="213.82799"
+             y1="183.48366"
+             x2="214.59154"
+             y2="463.47311"
+             id="linearGradient2157"
+             xlink:href="#linearGradient1702"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+          <linearGradient
+             x1="27.119711"
+             y1="-353.75928"
+             x2="27.018383"
+             y2="-316.47729"
+             id="linearGradient5378"
+             xlink:href="#linearGradient1702"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(2.89873,-0.344979)" />
+          <radialGradient
+             cx="41.875938"
+             cy="37.865574"
+             r="12.562782"
+             fx="42.023739"
+             fy="37.865574"
+             id="radialGradient5379"
+             xlink:href="#linearGradient1845"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="10.68618"
+             y1="22.702703"
+             x2="11.660023"
+             y2="4.1041274"
+             id="linearGradient5380"
+             xlink:href="#linearGradient1302"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.016203,0.984055)" />
+          <linearGradient
+             x1="16.88386"
+             y1="28.772741"
+             x2="12.516754"
+             y2="2.6018224"
+             id="linearGradient5381"
+             xlink:href="#linearGradient1305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.016203,0.984055)" />
+          <defs
+             id="defs5382">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient5383"
+               xlink:href="#linearGradient2002"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient5384"
+               xlink:href="#linearGradient2009"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient5388"
+               xlink:href="#linearGradient2006"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient5389">
+              <stop
+                 id="stop2171"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop2172"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient55233">
+              <stop
+                 id="stop2174"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop2175"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient5395">
+              <stop
+                 id="stop2177"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop5397"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop5398"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop2180"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop2181"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient2182">
+              <stop
+                 id="stop2183"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop5403"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="28.814428"
+               y1="-1.616316"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient2185"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.764292,1.3084)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient5405"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <linearGradient
+               x1="25.954844"
+               y1="25.071495"
+               x2="39.781502"
+               y2="27.315489"
+               id="linearGradient2188"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103231)" />
+            <defs
+               id="defs5408">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient5409"
+                 xlink:href="#linearGradient1302"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient5410"
+                 xlink:href="#linearGradient1305"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient5411">
+                <stop
+                   id="stop5412"
+                   style="stop-color:#e6da1e;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop5413"
+                   style="stop-color:#b5ab17;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.28441054"
+                 y1="0.88272494"
+                 x2="0.32513002"
+                 y2="0.10505857"
+                 id="linearGradient5414"
+                 xlink:href="#linearGradient4114" />
+              <linearGradient
+                 x1="-0.0078431377"
+                 y1="-1.244898"
+                 x2="0.59607846"
+                 y2="0.3605442"
+                 id="linearGradient5415"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="-0.4509804"
+                 y1="-0.15053764"
+                 x2="0.47058824"
+                 y2="0.36559141"
+                 id="linearGradient5416"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="0.45882353"
+                 y1="1.2772278"
+                 x2="0.6901961"
+                 y2="-0.2970297"
+                 id="linearGradient5417"
+                 xlink:href="#linearGradient2122" />
+              <linearGradient
+                 x1="-0.18232045"
+                 y1="-0.43962848"
+                 x2="0.68508285"
+                 y2="0.42414862"
+                 id="linearGradient5418"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 id="linearGradient5419">
+                <stop
+                   id="stop5420"
+                   style="stop-color:#000000;stop-opacity:0.40784314"
+                   offset="0" />
+                <stop
+                   id="stop5421"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.3783784"
+                 y1="0.25386998"
+                 x2="0.58378381"
+                 y2="0.13003096"
+                 id="linearGradient5422"
+                 xlink:href="#linearGradient2122" />
+              <linearGradient
+                 x1="-0.14213198"
+                 y1="-0.28792569"
+                 x2="0.49753696"
+                 y2="0.35603714"
+                 id="linearGradient5423"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 x1="0.99512196"
+                 y1="0.64396286"
+                 x2="0.32682925"
+                 y2="0.3003096"
+                 id="linearGradient5424"
+                 xlink:href="#linearGradient1918" />
+              <linearGradient
+                 x1="0.27843139"
+                 y1="-0.063694268"
+                 x2="0.4509804"
+                 y2="0.61146498"
+                 id="linearGradient5425"
+                 xlink:href="#linearGradient1513" />
+              <linearGradient
+                 id="linearGradient5426">
+                <stop
+                   id="stop5427"
+                   style="stop-color:#d6d6d6;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop5428"
+                   style="stop-color:#eaeaea;stop-opacity:1"
+                   offset="0.25769231" />
+                <stop
+                   id="stop5429"
+                   style="stop-color:#919191;stop-opacity:1"
+                   offset="0.7059449" />
+                <stop
+                   id="stop5430"
+                   style="stop-color:#d2d2d2;stop-opacity:1"
+                   offset="0.73347497" />
+                <stop
+                   id="stop5431"
+                   style="stop-color:#a6a6a6;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.47450981"
+                 y1="0.21771218"
+                 x2="0.80392158"
+                 y2="0.5202952"
+                 id="linearGradient5432"
+                 xlink:href="#linearGradient2317" />
+              <linearGradient
+                 id="linearGradient5433">
+                <stop
+                   id="stop5434"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop5435"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.41568628"
+                 y1="0.27687296"
+                 x2="0.59607846"
+                 y2="0.44299674"
+                 id="linearGradient5436"
+                 xlink:href="#linearGradient1513" />
+              <radialGradient
+                 cx="0.5"
+                 cy="0.5"
+                 r="0.5"
+                 fx="0.38431373"
+                 fy="0.47619048"
+                 id="radialGradient5437"
+                 xlink:href="#linearGradient1918" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient5438"
+                 xlink:href="#linearGradient1845"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <radialGradient
+                 cx="0.5"
+                 cy="0.5"
+                 r="0.5"
+                 fx="0.50588238"
+                 fy="0.5"
+                 id="radialGradient5439"
+                 xlink:href="#linearGradient1918" />
+              <linearGradient
+                 x1="0.54355544"
+                 y1="1.1365328"
+                 x2="0.36095273"
+                 y2="0.042242367"
+                 id="linearGradient5440"
+                 xlink:href="#linearGradient4111" />
+            </defs>
+          </defs>
+        </defs>
+        <linearGradient
+           x1="520.57166"
+           y1="506.28723"
+           x2="520.57166"
+           y2="466.2785"
+           id="linearGradient2541"
+           xlink:href="#linearGradient2491"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="522.94183"
+           y1="469.49918"
+           x2="522.73914"
+           y2="530.67786"
+           id="linearGradient2542"
+           xlink:href="#linearGradient2494"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="520.57166"
+           y1="506.28723"
+           x2="520.57166"
+           y2="466.2785"
+           id="linearGradient2543"
+           xlink:href="#linearGradient1867"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="44.930588"
+           y1="56.725216"
+           x2="45.511845"
+           y2="185.05675"
+           id="linearGradient2544"
+           xlink:href="#linearGradient3202"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.694118,0,0,0.651906,0,-2.410339)" />
+        <linearGradient
+           x1="83.460403"
+           y1="71.699699"
+           x2="-19.886999"
+           y2="-17.846001"
+           id="linearGradient5536"
+           xlink:href="#XMLID_1_"
+           gradientUnits="userSpaceOnUse" />
+        <radialGradient
+           cx="-451.42599"
+           cy="87.492699"
+           r="152.422"
+           fx="-451.42599"
+           fy="87.492699"
+           id="radialGradient2491"
+           xlink:href="#XMLID_2_"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="translate(509.121,0)" />
+        <radialGradient
+           cx="-451.23801"
+           cy="81.440903"
+           r="144.242"
+           fx="-451.23801"
+           fy="81.440903"
+           id="radialGradient2492"
+           xlink:href="#XMLID_3_"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="translate(509.121,0)" />
+        <linearGradient
+           x1="-26.362301"
+           y1="5.4271998"
+           x2="-26.362301"
+           y2="56.874901"
+           id="linearGradient2496"
+           xlink:href="#XMLID_4_"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="translate(85.6035,0)" />
+        <defs
+           id="defs184" />
+        <linearGradient
+           x1="88.939903"
+           y1="66.850098"
+           x2="88.073898"
+           y2="156.319"
+           id="linearGradient2883"
+           xlink:href="#linearGradient3629"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)" />
+        <linearGradient
+           x1="99.445847"
+           y1="75.80661"
+           x2="55.045128"
+           y2="134.26726"
+           id="linearGradient2884"
+           xlink:href="#XMLID_8_"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.999905,-1.380007e-2,1.380007e-2,0.999905,0,0)" />
+        <linearGradient
+           x1="84.931496"
+           y1="39.138195"
+           x2="84.69928"
+           y2="55.963779"
+           id="linearGradient2885"
+           xlink:href="#linearGradient3629"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.999905,-1.380007e-2,1.380007e-2,0.999905,0,0)" />
+        <linearGradient
+           x1="88.939903"
+           y1="66.850098"
+           x2="88.073898"
+           y2="156.319"
+           id="linearGradient5551"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)">
+          <stop
+             id="stop74"
+             style="stop-color:#ffa700;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop76"
+             style="stop-color:#ffff00;stop-opacity:1"
+             offset="0.69099998" />
+          <stop
+             id="stop78"
+             style="stop-color:#fffc00;stop-opacity:1"
+             offset="0.792" />
+          <stop
+             id="stop80"
+             style="stop-color:#fff400;stop-opacity:1"
+             offset="0.85460001" />
+          <stop
+             id="stop82"
+             style="stop-color:#ffe500;stop-opacity:1"
+             offset="0.90670002" />
+          <stop
+             id="stop84"
+             style="stop-color:#ffd100;stop-opacity:1"
+             offset="0.95300001" />
+          <stop
+             id="stop86"
+             style="stop-color:#ffb700;stop-opacity:1"
+             offset="0.99519998" />
+          <stop
+             id="stop88"
+             style="stop-color:#ffb300;stop-opacity:1"
+             offset="1" />
+          <midPointStop
+             id="midPointStop90"
+             style="stop-color:#FFA700"
+             offset="0" />
+          <midPointStop
+             id="midPointStop92"
+             style="stop-color:#FFA700"
+             offset="0.5" />
+          <midPointStop
+             id="midPointStop94"
+             style="stop-color:#FFFF00"
+             offset="0.691" />
+          <midPointStop
+             id="midPointStop96"
+             style="stop-color:#FFFF00"
+             offset="0.7952" />
+          <midPointStop
+             id="midPointStop98"
+             style="stop-color:#FFB300"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="88.601097"
+           y1="59.899899"
+           x2="88.601097"
+           y2="108.201"
+           id="linearGradient5565"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)">
+          <stop
+             id="stop107"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0.0056" />
+          <stop
+             id="stop109"
+             style="stop-color:#fffae1;stop-opacity:1"
+             offset="0.1471" />
+          <stop
+             id="stop111"
+             style="stop-color:#ffee94;stop-opacity:1"
+             offset="0.4562" />
+          <stop
+             id="stop113"
+             style="stop-color:#ffdb1a;stop-opacity:1"
+             offset="0.90689999" />
+          <stop
+             id="stop115"
+             style="stop-color:#ffd700;stop-opacity:1"
+             offset="1" />
+          <midPointStop
+             id="midPointStop117"
+             style="stop-color:#FFFFFF"
+             offset="0.0056" />
+          <midPointStop
+             id="midPointStop119"
+             style="stop-color:#FFFFFF"
+             offset="0.5311" />
+          <midPointStop
+             id="midPointStop121"
+             style="stop-color:#FFD700"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="98.653801"
+           y1="33.295898"
+           x2="98.653801"
+           y2="59.6152"
+           id="linearGradient15647"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)">
+          <stop
+             id="stop128"
+             style="stop-color:#ffa700;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop130"
+             style="stop-color:#ffff00;stop-opacity:1"
+             offset="0.69099998" />
+          <stop
+             id="stop132"
+             style="stop-color:#fffc00;stop-opacity:1"
+             offset="0.792" />
+          <stop
+             id="stop134"
+             style="stop-color:#fff400;stop-opacity:1"
+             offset="0.85460001" />
+          <stop
+             id="stop136"
+             style="stop-color:#ffe500;stop-opacity:1"
+             offset="0.90670002" />
+          <stop
+             id="stop138"
+             style="stop-color:#ffd100;stop-opacity:1"
+             offset="0.95300001" />
+          <stop
+             id="stop140"
+             style="stop-color:#ffb700;stop-opacity:1"
+             offset="0.99519998" />
+          <stop
+             id="stop142"
+             style="stop-color:#ffb300;stop-opacity:1"
+             offset="1" />
+          <midPointStop
+             id="midPointStop144"
+             style="stop-color:#FFA700"
+             offset="0" />
+          <midPointStop
+             id="midPointStop146"
+             style="stop-color:#FFA700"
+             offset="0.5" />
+          <midPointStop
+             id="midPointStop148"
+             style="stop-color:#FFFF00"
+             offset="0.691" />
+          <midPointStop
+             id="midPointStop150"
+             style="stop-color:#FFFF00"
+             offset="0.7952" />
+          <midPointStop
+             id="midPointStop152"
+             style="stop-color:#FFB300"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="98.563004"
+           y1="28.5513"
+           x2="98.563004"
+           y2="42.4711"
+           id="linearGradient15662"
+           xlink:href="#linearGradient18210"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)"
+           spreadMethod="pad">
+          <midPointStop
+             id="midPointStop171"
+             style="stop-color:#FFFFFF"
+             offset="0.0056" />
+          <midPointStop
+             id="midPointStop173"
+             style="stop-color:#FFFFFF"
+             offset="0.5311" />
+          <midPointStop
+             id="midPointStop175"
+             style="stop-color:#FFD700"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="98.563004"
+           y1="28.5513"
+           x2="98.563004"
+           y2="42.4711"
+           id="linearGradient5594"
+           xlink:href="#XMLID_8_"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.936505,0.35064,-0.35064,0.936505,159.959,67.79462)" />
+        <linearGradient
+           x1="88.939903"
+           y1="66.850098"
+           x2="88.073898"
+           y2="156.319"
+           id="linearGradient3639"
+           xlink:href="#linearGradient3629"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)" />
+        <linearGradient
+           x1="99.445847"
+           y1="75.80661"
+           x2="55.045128"
+           y2="134.26726"
+           id="linearGradient3640"
+           xlink:href="#XMLID_8_"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.999905,-1.380007e-2,1.380007e-2,0.999905,0,0)" />
+        <linearGradient
+           x1="84.931496"
+           y1="39.138195"
+           x2="84.69928"
+           y2="55.963779"
+           id="linearGradient3641"
+           xlink:href="#linearGradient3629"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.999905,-1.380007e-2,1.380007e-2,0.999905,0,0)" />
+        <linearGradient
+           x1="98.563004"
+           y1="28.5513"
+           x2="98.563004"
+           y2="42.4711"
+           id="linearGradient3643"
+           xlink:href="#XMLID_8_"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.80392,0.300998,-0.300998,0.80392,17.27346,-12.12931)" />
+        <linearGradient
+           x1="61.531635"
+           y1="47.042343"
+           x2="54.256596"
+           y2="105.82021"
+           id="linearGradient55349"
+           xlink:href="#XMLID_8_"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.999905,-1.380008e-2,1.380008e-2,0.999905,25,0)" />
+      </defs>
+    </defs>
+    <defs
+       id="defs6460">
+      <linearGradient
+         id="linearGradient20708">
+        <stop
+           id="stop20710"
+           style="stop-color:#000000;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop20709"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient20692">
+        <stop
+           id="stop20693"
+           style="stop-color:#303643;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop20694"
+           style="stop-color:#303643;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient20687">
+        <stop
+           id="stop20688"
+           style="stop-color:#303643;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop20689"
+           style="stop-color:#303643;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient20684">
+        <stop
+           id="stop20686"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop20685"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient20672">
+        <stop
+           id="stop20673"
+           style="stop-color:#5b677f;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop20674"
+           style="stop-color:#303643;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient20002">
+        <stop
+           id="stop20004"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0.0056" />
+        <stop
+           id="stop20003"
+           style="stop-color:#ffffff;stop-opacity:0.00549451"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient19996">
+        <stop
+           id="stop19997"
+           style="stop-color:#97989d;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop19999"
+           style="stop-color:#f4f6ff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient19990"
+         xlink:href="#linearGradient16964"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         id="linearGradient19972">
+        <stop
+           id="stop19973"
+           style="stop-color:#97989d;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop19976"
+           style="stop-color:#bebfc6;stop-opacity:1"
+           offset="0.5" />
+        <stop
+           id="stop19974"
+           style="stop-color:#ebedf6;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient19968">
+        <stop
+           id="stop19969"
+           style="stop-color:#e0dfe8;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop19970"
+           style="stop-color:#c9c8d0;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient6493">
+        <stop
+           id="stop3479"
+           style="stop-color:#c6d9f8;stop-opacity:0.56470591"
+           offset="0" />
+        <stop
+           id="stop3478"
+           style="stop-color:#5a97f8;stop-opacity:0.07843138"
+           offset="0.6477778" />
+        <stop
+           id="stop3477"
+           style="stop-color:#5a97f8;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient2453">
+        <stop
+           id="stop2454"
+           style="stop-color:#14161c;stop-opacity:0.58823532"
+           offset="0" />
+        <stop
+           id="stop2455"
+           style="stop-color:#3f4758;stop-opacity:0.58823532"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient3842">
+        <stop
+           id="stop3843"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3844"
+           style="stop-color:#000000;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient6503">
+        <stop
+           id="stop1840"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop1839"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient12065">
+        <stop
+           id="stop6507"
+           style="stop-color:#394d65;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop6508"
+           style="stop-color:#9cb5e9;stop-opacity:1"
+           offset="0.5" />
+        <stop
+           id="stop6509"
+           style="stop-color:#b4c6e9;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient4321">
+        <stop
+           id="stop4322"
+           style="stop-color:#9e9fa5;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop1829"
+           style="stop-color:#414a5b;stop-opacity:1"
+           offset="0.5" />
+        <stop
+           id="stop6513"
+           style="stop-color:#303643;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient4317">
+        <stop
+           id="stop4318"
+           style="stop-color:#b3b6bb;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop4319"
+           style="stop-color:#314366;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient6517">
+        <stop
+           id="stop3691"
+           style="stop-color:#9ea3b0;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop3692"
+           style="stop-color:#808288;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient6520">
+        <stop
+           id="stop6521"
+           style="stop-color:#4d90fa;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop6522"
+           style="stop-color:#4d90fa;stop-opacity:0.7263158"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient6526">
+        <stop
+           id="stop6527"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop6528"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient6529">
+        <stop
+           id="stop6530"
+           style="stop-color:#000000;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop6531"
+           style="stop-color:#343539;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <radialGradient
+         cx="-77.367622"
+         cy="42.633839"
+         r="216.26619"
+         fx="-80.036034"
+         fy="44.468376"
+         id="radialGradient48628"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+      <linearGradient
+         x1="88.712402"
+         y1="138.15012"
+         x2="104.81104"
+         y2="151.63045"
+         id="linearGradient48630"
+         xlink:href="#linearGradient3305"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient6534"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient6535"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="88.712402"
+         y1="138.15012"
+         x2="104.81104"
+         y2="151.63045"
+         id="linearGradient6536"
+         xlink:href="#linearGradient3305"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+      <defs
+         id="defs6544">
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient11940"
+           xlink:href="#linearGradient1838"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           id="linearGradient6546">
+          <stop
+             id="stop6547"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop6548"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop6549"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop6550"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop6551"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient6552">
+          <stop
+             id="stop6553"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop6554"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="133.07144"
+           y1="28.231943"
+           x2="118.58411"
+           y2="13.431207"
+           id="linearGradient6555"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+        <linearGradient
+           x1="30.722504"
+           y1="28.135216"
+           x2="39.78149"
+           y2="27.315481"
+           id="linearGradient6556"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103232)" />
+        <radialGradient
+           cx="4.9853168"
+           cy="108.47158"
+           r="34.222183"
+           fx="5.2520976"
+           fy="108.73115"
+           id="radialGradient6557"
+           xlink:href="#linearGradient2877"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="36.826332"
+           y1="75.332558"
+           x2="25.761681"
+           y2="135.90358"
+           id="linearGradient6558"
+           xlink:href="#linearGradient2877"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+        <linearGradient
+           x1="78.675774"
+           y1="47.411823"
+           x2="64.05336"
+           y2="34.302757"
+           id="linearGradient6559"
+           xlink:href="#linearGradient4281"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+        <defs
+           id="defs6560">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient6561"
+             xlink:href="#linearGradient3296"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+        </defs>
+      </defs>
+      <radialGradient
+         cx="-77.367622"
+         cy="42.633839"
+         r="216.26619"
+         fx="-80.036034"
+         fy="44.468376"
+         id="radialGradient6572"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient6573"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="-191.46153"
+         y1="37.372372"
+         x2="-165.58835"
+         y2="37.372372"
+         id="linearGradient1699"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+      <linearGradient
+         id="linearGradient11933">
+        <stop
+           id="stop11934"
+           style="stop-color:#e8e8e8;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop11935"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient6581">
+        <stop
+           id="stop6582"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop6583"
+           style="stop-color:#d0d1d9;stop-opacity:1"
+           offset="0.5" />
+        <stop
+           id="stop6584"
+           style="stop-color:#878b9b;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient6585">
+        <stop
+           id="stop6586"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop6587"
+           style="stop-color:#fafbff;stop-opacity:1"
+           offset="0.25" />
+        <stop
+           id="stop6588"
+           style="stop-color:#f0f2fa;stop-opacity:1"
+           offset="0.5" />
+        <stop
+           id="stop6589"
+           style="stop-color:#e1e1e1;stop-opacity:1"
+           offset="0.75" />
+        <stop
+           id="stop6590"
+           style="stop-color:#f5f6ff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="84.960785"
+         y1="92.151367"
+         x2="42.64373"
+         y2="53.360722"
+         id="linearGradient12707"
+         xlink:href="#linearGradient1749"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(3.011216,0,0,1.57823,-122.7302,-174.6134)" />
+      <linearGradient
+         x1="30.881908"
+         y1="12.919765"
+         x2="86.606544"
+         y2="121.2953"
+         id="linearGradient12708"
+         xlink:href="#linearGradient4321"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.912111,0,0,1.197001,160.1078,-175)" />
+      <linearGradient
+         x1="186.07454"
+         y1="23.53322"
+         x2="228.31683"
+         y2="22.758036"
+         id="linearGradient12709"
+         xlink:href="#linearGradient2354"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.883913,0,0,5.376537,-122.7302,-174.6134)" />
+      <linearGradient
+         x1="92.631454"
+         y1="54.989693"
+         x2="92.631454"
+         y2="50.608093"
+         id="linearGradient12710"
+         xlink:href="#linearGradient1757"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.787838,1.269296)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient12711"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient12712"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient12713"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient12714"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="213.1609"
+         y1="33.67358"
+         x2="227.79201"
+         y2="2.6828768"
+         id="linearGradient12715"
+         xlink:href="#linearGradient4325"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.177322,0,0,4.036613,-122.7302,-174.6134)" />
+      <linearGradient
+         x1="-23.069969"
+         y1="13.919033"
+         x2="-72.705872"
+         y2="17.947575"
+         id="linearGradient12716"
+         xlink:href="#linearGradient4325"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.313998,0.17489,0,3.477085,160.1078,-175)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient12739"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient12740"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient12741"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.576482,0.180032,0,0.835776,52.07144,147.8388)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient12742"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.576482,0.180032,0,0.835776,52.07144,147.8388)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient12758"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.576482,0.180032,0,0.835776,52.07144,147.8388)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient12759"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient12760"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="92.631454"
+         y1="54.989693"
+         x2="92.631454"
+         y2="50.608093"
+         id="linearGradient1215"
+         xlink:href="#linearGradient1757"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.794585,0,0,2.648182,-122.7302,-174.6134)" />
+      <linearGradient
+         x1="203.0269"
+         y1="1.8190246"
+         x2="200.06987"
+         y2="17.04442"
+         id="linearGradient6609"
+         xlink:href="#linearGradient1838"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.177322,0,0,4.036613,-122.7302,-174.6134)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient6610"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient6611"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient6612"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.472546,0.159273,0,0.835776,73.30051,32.28056)" />
+      <linearGradient
+         x1="219.57645"
+         y1="69.359512"
+         x2="267.16318"
+         y2="82.375877"
+         id="linearGradient3845"
+         xlink:href="#linearGradient3842"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.535407,0,0,1.867738,0,-175)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient1211"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.62487,0.180032,0,0.835776,154.9496,45.3388)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient1212"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.62487,0.180032,0,0.835776,160.3693,40.3388)" />
+      <linearGradient
+         x1="30.881908"
+         y1="12.919765"
+         x2="86.606544"
+         y2="121.2953"
+         id="linearGradient1193"
+         xlink:href="#linearGradient4321"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.912111,0,0,1.197001,-197.2092,-0.679353)" />
+      <linearGradient
+         x1="33.184048"
+         y1="24.384579"
+         x2="33.184048"
+         y2="-13.170087"
+         id="linearGradient2977"
+         xlink:href="#linearGradient4476"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(2.210222,0,0,1.964283,-1.515862,-2.171324)" />
+      <defs
+         id="defs2462">
+        <linearGradient
+           id="linearGradient2908">
+          <stop
+             id="stop2909"
+             style="stop-color:#000000;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2910"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient48704">
+          <stop
+             id="stop2903"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop2902"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop2901"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop2900"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop2899"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient6628">
+          <stop
+             id="stop6629"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop6630"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient4467">
+          <stop
+             id="stop4469"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop6633"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient6634">
+          <stop
+             id="stop6635"
+             style="stop-color:#dedede;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop6636"
+             style="stop-color:#d2d2d2;stop-opacity:1"
+             offset="0.75" />
+          <stop
+             id="stop4458"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient4450">
+          <stop
+             id="stop4452"
+             style="stop-color:#540f00;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop6640"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient3825">
+          <stop
+             id="stop3828"
+             style="stop-color:#dbdbdb;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop3827"
+             style="stop-color:#9e9e9e;stop-opacity:1"
+             offset="0.75" />
+          <stop
+             id="stop3826"
+             style="stop-color:#d6d6d6;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient6645">
+          <stop
+             id="stop6646"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop6647"
+             style="stop-color:#fafbff;stop-opacity:1"
+             offset="0.25" />
+          <stop
+             id="stop2498"
+             style="stop-color:#f0f2fa;stop-opacity:1"
+             offset="0.5" />
+          <stop
+             id="stop2499"
+             style="stop-color:#e1e1e1;stop-opacity:1"
+             offset="0.75" />
+          <stop
+             id="stop2500"
+             style="stop-color:#f5f6ff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient6651">
+          <stop
+             id="stop2502"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2503"
+             style="stop-color:#d0d1d9;stop-opacity:1"
+             offset="0.5" />
+          <stop
+             id="stop2504"
+             style="stop-color:#878b9b;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient2508">
+          <stop
+             id="stop2509"
+             style="stop-color:#e8e8e8;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2510"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient2511"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <radialGradient
+           cx="-77.367622"
+           cy="42.633839"
+           r="216.26619"
+           fx="-80.036034"
+           fy="44.468376"
+           id="radialGradient2512"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+        <defs
+           id="defs2513">
+          <linearGradient
+             id="linearGradient2514">
+            <stop
+               id="stop2515"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2516"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient6664">
+            <stop
+               id="stop2518"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop6666"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop2520"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop6668"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop2522"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient2523">
+            <stop
+               id="stop2524"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop6672"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient2526"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient2527"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <radialGradient
+             cx="4.9853168"
+             cy="108.47158"
+             r="34.222183"
+             fx="5.2520976"
+             fy="108.73115"
+             id="radialGradient2528"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="36.826332"
+             y1="75.332558"
+             x2="25.761681"
+             y2="135.90358"
+             id="linearGradient2529"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+          <defs
+             id="defs2530">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient2531"
+               xlink:href="#linearGradient3296"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+          </defs>
+        </defs>
+        <linearGradient
+           x1="88.712402"
+           y1="138.15012"
+           x2="104.81104"
+           y2="151.63045"
+           id="linearGradient48766"
+           xlink:href="#linearGradient3305"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient48768"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient48770"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <linearGradient
+           x1="88.712402"
+           y1="138.15012"
+           x2="104.81104"
+           y2="151.63045"
+           id="linearGradient48772"
+           xlink:href="#linearGradient3305"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        <radialGradient
+           cx="-77.367622"
+           cy="42.633839"
+           r="216.26619"
+           fx="-80.036034"
+           fy="44.468376"
+           id="radialGradient2553"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+        <linearGradient
+           x1="84.960785"
+           y1="92.151367"
+           x2="42.64373"
+           y2="53.360722"
+           id="linearGradient1431"
+           xlink:href="#linearGradient1749"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.321949,0.756459)" />
+        <linearGradient
+           x1="31.82851"
+           y1="61.778381"
+           x2="33.198818"
+           y2="6.859036"
+           id="linearGradient48776"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+        <linearGradient
+           x1="186.07457"
+           y1="23.533224"
+           x2="202.6377"
+           y2="23.47304"
+           id="linearGradient1433"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.388045,2.57702)" />
+        <linearGradient
+           x1="92.631454"
+           y1="54.989693"
+           x2="92.631454"
+           y2="50.608093"
+           id="linearGradient1434"
+           xlink:href="#linearGradient1757"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.787838,1.269296)" />
+        <radialGradient
+           cx="8.0178375"
+           cy="231.98276"
+           r="7.483315"
+           fx="8.0178375"
+           fy="231.98276"
+           id="radialGradient1435"
+           xlink:href="#linearGradient2960"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(3.741657,0.267261)" />
+        <radialGradient
+           cx="8.0178375"
+           cy="231.98276"
+           r="7.483315"
+           fx="8.0178375"
+           fy="231.98276"
+           id="radialGradient6703"
+           xlink:href="#linearGradient2960"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(3.741657,0.267261)" />
+        <radialGradient
+           cx="8.0178375"
+           cy="231.98276"
+           r="7.483315"
+           fx="8.0178375"
+           fy="231.98276"
+           id="radialGradient6704"
+           xlink:href="#linearGradient2960"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(3.741657,0.267261)" />
+        <linearGradient
+           x1="35.995708"
+           y1="1.624638"
+           x2="35.995708"
+           y2="11.710631"
+           id="linearGradient6705"
+           xlink:href="#linearGradient2780"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.632005,0,0,2.436073,-5.13035e-2,2.009678)" />
+        <linearGradient
+           x1="38.362892"
+           y1="11.170151"
+           x2="39.723621"
+           y2="6.0918369"
+           id="linearGradient6706"
+           xlink:href="#linearGradient2780"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.63752,0,0,2.47415,-5.13035e-2,-1.2826e-2)" />
+        <radialGradient
+           cx="21.595108"
+           cy="8.9813547"
+           r="6.0678878"
+           fx="21.595108"
+           fy="8.9813547"
+           id="radialGradient1440"
+           xlink:href="#linearGradient2834"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(2.366562,0,0,1.726511,-0.404355,-1.2826e-2)" />
+        <radialGradient
+           cx="21.595108"
+           cy="8.9813547"
+           r="6.0678878"
+           fx="21.595108"
+           fy="8.9813547"
+           id="radialGradient1441"
+           xlink:href="#linearGradient2834"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-2.366562,0,0,1.726511,129.1226,-0.112925)" />
+        <linearGradient
+           x1="38.781849"
+           y1="9.5745525"
+           x2="38.781849"
+           y2="7.5863166"
+           id="linearGradient6709"
+           xlink:href="#linearGradient2780"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.632005,0,0,2.482509,-5.13035e-2,-1.2826e-2)" />
+        <linearGradient
+           x1="33.184048"
+           y1="24.384579"
+           x2="33.184048"
+           y2="-13.170087"
+           id="linearGradient6710"
+           xlink:href="#linearGradient2780"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(2.210222,0,0,1.964283,-1.515862,-2.171324)" />
+        <linearGradient
+           x1="33.184048"
+           y1="24.384579"
+           x2="33.184048"
+           y2="-13.170087"
+           id="linearGradient6711"
+           xlink:href="#linearGradient2780"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(2.161083,0,0,1.804543,-5.13035e-2,2.267068)" />
+        <radialGradient
+           cx="21.595108"
+           cy="8.9813547"
+           r="6.0678878"
+           fx="21.595108"
+           fy="8.9813547"
+           id="radialGradient1445"
+           xlink:href="#linearGradient2834"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(3.085042,0,0,2.052895,-15.9848,-3.14928)" />
+        <radialGradient
+           cx="21.595108"
+           cy="8.9813547"
+           r="6.0678878"
+           fx="21.595108"
+           fy="8.9813547"
+           id="radialGradient6713"
+           xlink:href="#linearGradient2834"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-2.846279,0,0,2.087943,139.5254,-3.586178)" />
+        <linearGradient
+           x1="29.613848"
+           y1="52.608921"
+           x2="44.723549"
+           y2="52.608921"
+           id="linearGradient6714"
+           xlink:href="#linearGradient1457"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.533744,0,0,1.262212,174.5467,22.71672)"
+           spreadMethod="reflect" />
+        <linearGradient
+           x1="73.71196"
+           y1="141.92598"
+           x2="-44.758537"
+           y2="142.73943"
+           id="linearGradient6715"
+           xlink:href="#linearGradient2085"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.102327,0,0,0.907172,140.423,-46.52439)" />
+        <radialGradient
+           cx="20.36058"
+           cy="22.546398"
+           r="15.156592"
+           fx="20.36058"
+           fy="22.546396"
+           id="radialGradient1449"
+           xlink:href="#linearGradient2780"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.433337,0,0,1.434961,6.40989,-0.113137)" />
+        <radialGradient
+           cx="20.36058"
+           cy="22.546398"
+           r="15.156592"
+           fx="20.36058"
+           fy="22.546396"
+           id="radialGradient1450"
+           xlink:href="#linearGradient2780"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.500069,0,0,1.675192,5.00297,-5.108149)" />
+        <radialGradient
+           cx="20.36058"
+           cy="22.546398"
+           r="15.156592"
+           fx="20.36058"
+           fy="22.546396"
+           id="radialGradient1451"
+           xlink:href="#linearGradient2780"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.621397,0,0,1.882058,2.388831,-9.409409)" />
+        <radialGradient
+           cx="20.36058"
+           cy="22.546398"
+           r="15.156592"
+           fx="20.36058"
+           fy="22.546396"
+           id="radialGradient1452"
+           xlink:href="#linearGradient2780"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.433337,0,0,1.434961,6.40989,-0.113137)" />
+        <radialGradient
+           cx="20.36058"
+           cy="22.546398"
+           r="15.156592"
+           fx="20.36058"
+           fy="22.546396"
+           id="radialGradient1453"
+           xlink:href="#linearGradient2780"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.500069,0,0,1.675192,5.00297,-5.108149)" />
+        <radialGradient
+           cx="20.36058"
+           cy="22.546398"
+           r="15.156592"
+           fx="20.36058"
+           fy="22.546396"
+           id="radialGradient1454"
+           xlink:href="#linearGradient2780"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.621397,0,0,1.882058,2.388831,-9.409409)" />
+        <linearGradient
+           x1="133.07144"
+           y1="28.231943"
+           x2="118.58411"
+           y2="13.431207"
+           id="linearGradient48800"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+        <linearGradient
+           x1="1270.3132"
+           y1="4.8765283"
+           x2="1247.6848"
+           y2="0.72310239"
+           id="linearGradient1456"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(9.440723e-2,10.59241)" />
+        <linearGradient
+           x1="1270.3132"
+           y1="4.8765283"
+           x2="1247.6848"
+           y2="0.72310239"
+           id="linearGradient1458"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+        <defs
+           id="defs6725">
+          <linearGradient
+             id="linearGradient6726">
+            <stop
+               id="stop2962"
+               style="stop-color:#282828;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2961"
+               style="stop-color:#282828;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient6729"
+             xlink:href="#linearGradient4450"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient1457"
+             xlink:href="#linearGradient3825"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient6731">
+            <stop
+               id="stop6732"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop6733"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient1152">
+            <stop
+               id="stop1153"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop1154"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient1155"
+             xlink:href="#linearGradient2898"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient6738">
+            <stop
+               id="stop1164"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop1165"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="28.814428"
+             y1="-1.616316"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient6741"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.764292,1.3084)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient1167"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <linearGradient
+             x1="30.382267"
+             y1="7.5329666"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient6743"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+          <linearGradient
+             x1="25.954844"
+             y1="25.071495"
+             x2="39.781502"
+             y2="27.315489"
+             id="linearGradient6744"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103231)" />
+          <linearGradient
+             x1="35.995708"
+             y1="1.624638"
+             x2="35.995708"
+             y2="11.710631"
+             id="linearGradient6745"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.632005,0,0,2.436073,-5.13035e-2,2.009678)" />
+          <linearGradient
+             x1="38.362892"
+             y1="11.170151"
+             x2="39.723621"
+             y2="6.0918369"
+             id="linearGradient1260"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.63752,0,0,2.47415,-5.13035e-2,-1.2826e-2)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient1261"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.366562,0,0,1.726511,-0.404355,-1.2826e-2)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient1262"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-2.366562,0,0,1.726511,129.1226,-0.112925)" />
+          <linearGradient
+             x1="38.781849"
+             y1="9.5745525"
+             x2="38.781849"
+             y2="7.5863166"
+             id="linearGradient1263"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.632005,0,0,2.482509,-5.13035e-2,-1.2826e-2)" />
+          <linearGradient
+             x1="33.184048"
+             y1="24.384579"
+             x2="33.184048"
+             y2="-13.170087"
+             id="linearGradient1264"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.210222,0,0,1.964283,-1.515862,-2.171324)" />
+          <linearGradient
+             x1="33.184048"
+             y1="24.384579"
+             x2="33.184048"
+             y2="-13.170087"
+             id="linearGradient1265"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.161083,0,0,1.804543,-5.13035e-2,2.267068)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient1266"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(3.085042,0,0,2.052895,-15.9848,-3.14928)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient1267"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-2.846279,0,0,2.087943,139.5254,-3.586178)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient1268"
+             xlink:href="#linearGradient3057"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient1269"
+             xlink:href="#linearGradient3057"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient1270"
+             xlink:href="#linearGradient3057"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <linearGradient
+             x1="29.613848"
+             y1="52.608921"
+             x2="44.723549"
+             y2="52.608921"
+             id="linearGradient1271"
+             xlink:href="#linearGradient2701"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.151801,0,0,1.77085,-5.13035e-2,4.351838)"
+             spreadMethod="reflect" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient1275"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.433337,0,0,1.434961,6.40989,-0.113137)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient1276"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.500069,0,0,1.675192,5.00297,-5.108149)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient1277"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.621397,0,0,1.882058,2.388831,-9.409409)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient1278"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.433337,0,0,1.434961,6.40989,-0.113137)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient1279"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.500069,0,0,1.675192,5.00297,-5.108149)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient6763"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.621397,0,0,1.882058,2.388831,-9.409409)" />
+          <defs
+             id="defs6764">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient6765"
+               xlink:href="#linearGradient2960"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient2834"
+               xlink:href="#linearGradient4467"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient6767"
+               xlink:href="#linearGradient4476"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient2713"
+               xlink:href="#linearGradient2085"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient48848"
+               xlink:href="#linearGradient1457"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="29.613848"
+               y1="52.608921"
+               x2="44.723549"
+               y2="52.608921"
+               id="linearGradient2707"
+               xlink:href="#linearGradient2701"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(2.151801,0,0,1.77085,-5.13035e-2,4.351838)"
+               spreadMethod="reflect" />
+            <linearGradient
+               x1="28.071486"
+               y1="40.272228"
+               x2="28.071486"
+               y2="42.645634"
+               id="linearGradient2719"
+               xlink:href="#linearGradient2713"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.121224,0,0,0.891883,0,4)"
+               spreadMethod="reflect" />
+            <linearGradient
+               x1="29.093641"
+               y1="46.357063"
+               x2="29.093641"
+               y2="47.295517"
+               id="linearGradient2732"
+               xlink:href="#linearGradient2713"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(2.21879,0,0,1.825981,-5.13035e-2,-1.012826)"
+               spreadMethod="reflect" />
+            <linearGradient
+               x1="24.261463"
+               y1="44.011002"
+               x2="24.605862"
+               y2="45.887836"
+               id="linearGradient2736"
+               xlink:href="#linearGradient2713"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(2.21879,0,0,1.825981,-5.13035e-2,-1.012826)"
+               spreadMethod="reflect" />
+            <linearGradient
+               x1="17.68186"
+               y1="60.433849"
+               x2="17.425413"
+               y2="62.779984"
+               id="linearGradient2740"
+               xlink:href="#linearGradient2713"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.102326,0.907173)"
+               spreadMethod="reflect" />
+            <radialGradient
+               cx="20.36058"
+               cy="22.546398"
+               r="15.156592"
+               fx="20.36058"
+               fy="22.546396"
+               id="radialGradient2788"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.433337,0,0,1.434961,6.40989,-0.113137)" />
+            <radialGradient
+               cx="20.36058"
+               cy="22.546398"
+               r="15.156592"
+               fx="20.36058"
+               fy="22.546396"
+               id="radialGradient2792"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.500069,0,0,1.675192,5.00297,-5.108149)" />
+            <radialGradient
+               cx="20.36058"
+               cy="22.546398"
+               r="15.156592"
+               fx="20.36058"
+               fy="22.546396"
+               id="radialGradient2796"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.621397,0,0,1.882058,2.388831,-9.409409)" />
+            <radialGradient
+               cx="20.36058"
+               cy="22.546398"
+               r="15.156592"
+               fx="20.36058"
+               fy="22.546396"
+               id="radialGradient2811"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.433337,0,0,1.434961,6.40989,-0.113137)" />
+            <radialGradient
+               cx="20.36058"
+               cy="22.546398"
+               r="15.156592"
+               fx="20.36058"
+               fy="22.546396"
+               id="radialGradient2813"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.500069,0,0,1.675192,5.00297,-5.108149)" />
+            <radialGradient
+               cx="20.36058"
+               cy="22.546398"
+               r="15.156592"
+               fx="20.36058"
+               fy="22.546396"
+               id="radialGradient2815"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.621397,0,0,1.882058,2.388831,-9.409409)" />
+            <radialGradient
+               cx="20.36058"
+               cy="22.546398"
+               r="15.156592"
+               fx="20.36058"
+               fy="22.546396"
+               id="radialGradient2817"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.433337,0,0,1.434961,6.40989,-0.113137)" />
+            <radialGradient
+               cx="20.36058"
+               cy="22.546398"
+               r="15.156592"
+               fx="20.36058"
+               fy="22.546396"
+               id="radialGradient2819"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.500069,0,0,1.675192,5.00297,-5.108149)" />
+            <radialGradient
+               cx="20.36058"
+               cy="22.546398"
+               r="15.156592"
+               fx="20.36058"
+               fy="22.546396"
+               id="radialGradient2821"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.621397,0,0,1.882058,2.388831,-9.409409)" />
+            <radialGradient
+               cx="17.191872"
+               cy="14.63901"
+               r="3.5649405"
+               fx="17.191872"
+               fy="14.63901"
+               id="radialGradient2840"
+               xlink:href="#linearGradient2834"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.896245,0.527358)" />
+            <radialGradient
+               cx="21.595108"
+               cy="8.9813547"
+               r="6.0678878"
+               fx="21.595108"
+               fy="8.9813547"
+               id="radialGradient2869"
+               xlink:href="#linearGradient2834"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(2.366562,0,0,1.726511,-0.404355,-1.2826e-2)" />
+            <radialGradient
+               cx="21.595108"
+               cy="8.9813547"
+               r="6.0678878"
+               fx="21.595108"
+               fy="8.9813547"
+               id="radialGradient2873"
+               xlink:href="#linearGradient2834"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-2.366562,0,0,1.726511,129.1226,-0.112925)" />
+            <linearGradient
+               x1="33.184048"
+               y1="24.384579"
+               x2="33.184048"
+               y2="-13.170087"
+               id="linearGradient48867"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(2.161083,0,0,1.804543,-5.13035e-2,2.267068)" />
+            <radialGradient
+               cx="27.270315"
+               cy="16.278088"
+               r="13.6387"
+               fx="27.270315"
+               fy="16.278088"
+               id="radialGradient48869"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.973329,1.027402)" />
+            <linearGradient
+               x1="33.184048"
+               y1="24.384579"
+               x2="33.184048"
+               y2="-13.170087"
+               id="linearGradient6789"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(2.210222,0,0,1.964283,-1.515862,-2.171324)" />
+            <linearGradient
+               x1="38.781849"
+               y1="9.5745525"
+               x2="38.781849"
+               y2="7.5863166"
+               id="linearGradient6790"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.632005,0,0,2.482509,-5.13035e-2,-1.2826e-2)" />
+            <linearGradient
+               x1="38.362892"
+               y1="11.170151"
+               x2="39.723621"
+               y2="6.0918369"
+               id="linearGradient6791"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.63752,0,0,2.47415,-5.13035e-2,-1.2826e-2)" />
+            <radialGradient
+               cx="21.595108"
+               cy="8.9813547"
+               r="6.0678878"
+               fx="21.595108"
+               fy="8.9813547"
+               id="radialGradient2955"
+               xlink:href="#linearGradient2834"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(3.085042,0,0,2.052895,-15.9848,-3.14928)" />
+            <radialGradient
+               cx="21.595108"
+               cy="8.9813547"
+               r="6.0678878"
+               fx="21.595108"
+               fy="8.9813547"
+               id="radialGradient2959"
+               xlink:href="#linearGradient2834"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-2.846279,0,0,2.087943,139.5254,-3.586178)" />
+            <radialGradient
+               cx="8.0178375"
+               cy="231.98276"
+               r="7.483315"
+               fx="8.0178375"
+               fy="231.98276"
+               id="radialGradient3063"
+               xlink:href="#linearGradient3057"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(3.741657,0.267261)" />
+            <radialGradient
+               cx="8.0178375"
+               cy="231.98276"
+               r="7.483315"
+               fx="8.0178375"
+               fy="231.98276"
+               id="radialGradient3069"
+               xlink:href="#linearGradient3057"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(3.741657,0.267261)" />
+            <radialGradient
+               cx="8.0178375"
+               cy="231.98276"
+               r="7.483315"
+               fx="8.0178375"
+               fy="231.98276"
+               id="radialGradient3071"
+               xlink:href="#linearGradient3057"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(3.741657,0.267261)" />
+            <linearGradient
+               x1="26.974447"
+               y1="68.680031"
+               x2="26.974447"
+               y2="44.981197"
+               id="linearGradient3080"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(2.136116,0,0,1.825981,2.348697,-1.012826)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="35.995708"
+               y1="1.624638"
+               x2="35.995708"
+               y2="11.710631"
+               id="linearGradient3084"
+               xlink:href="#linearGradient2780"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.632005,0,0,2.436073,-5.13035e-2,2.009678)" />
+            <linearGradient
+               x1="17.68186"
+               y1="60.433849"
+               x2="17.425413"
+               y2="62.779984"
+               id="linearGradient3086"
+               xlink:href="#linearGradient2713"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(2.21879,0,0,1.825981,-5.13035e-2,-1.012826)"
+               spreadMethod="reflect" />
+          </defs>
+          <linearGradient
+             x1="29.093641"
+             y1="46.357063"
+             x2="29.093641"
+             y2="47.295517"
+             id="linearGradient1453"
+             xlink:href="#linearGradient2085"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.581491,0,0,1.301508,33.55091,60.93629)"
+             spreadMethod="reflect" />
+          <linearGradient
+             x1="86.333672"
+             y1="146.88931"
+             x2="-3.7706475"
+             y2="146.48259"
+             id="linearGradient2091"
+             xlink:href="#linearGradient2085"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.102327,0.907172)" />
+          <linearGradient
+             x1="35.995708"
+             y1="1.624638"
+             x2="35.995708"
+             y2="11.710631"
+             id="linearGradient6851"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.632005,0,0,2.436073,-5.13035e-2,2.009678)" />
+          <linearGradient
+             x1="38.362892"
+             y1="11.170151"
+             x2="39.723621"
+             y2="6.0918369"
+             id="linearGradient6852"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.63752,0,0,2.47415,-5.13035e-2,-1.2826e-2)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient2158"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.366562,0,0,1.726511,-0.404355,-1.2826e-2)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient2159"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-2.366562,0,0,1.726511,129.1226,-0.112925)" />
+          <linearGradient
+             x1="33.184048"
+             y1="24.384579"
+             x2="33.184048"
+             y2="-13.170087"
+             id="linearGradient6856"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.210222,0,0,1.964283,-1.515862,-2.171324)" />
+          <linearGradient
+             x1="33.184048"
+             y1="24.384579"
+             x2="33.184048"
+             y2="-13.170087"
+             id="linearGradient48890"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.161083,0,0,1.804543,-5.13035e-2,2.267068)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient6858"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(3.085042,0,0,2.052895,-15.9848,-3.14928)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient2164"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-2.846279,0,0,2.087943,139.5254,-3.586178)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient6860"
+             xlink:href="#linearGradient3057"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient2166"
+             xlink:href="#linearGradient3057"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient2167"
+             xlink:href="#linearGradient3057"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <linearGradient
+             x1="29.613848"
+             y1="52.608921"
+             x2="44.723549"
+             y2="52.608921"
+             id="linearGradient2168"
+             xlink:href="#linearGradient1457"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.151801,0,0,1.77085,-5.13035e-2,4.351838)"
+             spreadMethod="reflect" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient2170"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.433337,0,0,1.434961,6.40989,-0.113137)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient2171"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.500069,0,0,1.675192,5.00297,-5.108149)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient2172"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.621397,0,0,1.882058,2.388831,-9.409409)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient2173"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.433337,0,0,1.434961,6.40989,-0.113137)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient2174"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.500069,0,0,1.675192,5.00297,-5.108149)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient2175"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.621397,0,0,1.882058,2.388831,-9.409409)" />
+          <linearGradient
+             x1="73.71196"
+             y1="141.92598"
+             x2="-44.758537"
+             y2="142.73943"
+             id="linearGradient6870"
+             xlink:href="#linearGradient2085"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.102327,0.907172)" />
+          <linearGradient
+             x1="35.995708"
+             y1="1.624638"
+             x2="35.995708"
+             y2="11.710631"
+             id="linearGradient2880"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.632005,0,0,2.436073,-5.13035e-2,2.009678)" />
+          <linearGradient
+             x1="38.362892"
+             y1="11.170151"
+             x2="39.723621"
+             y2="6.0918369"
+             id="linearGradient2881"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.63752,0,0,2.47415,-5.13035e-2,-1.2826e-2)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient2882"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.366562,0,0,1.726511,-0.404355,-1.2826e-2)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient2883"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-2.366562,0,0,1.726511,129.1226,-0.112925)" />
+          <linearGradient
+             x1="38.781849"
+             y1="9.5745525"
+             x2="38.781849"
+             y2="7.5863166"
+             id="linearGradient6875"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.632005,0,0,2.482509,-5.13035e-2,-1.2826e-2)" />
+          <linearGradient
+             x1="33.184048"
+             y1="24.384579"
+             x2="33.184048"
+             y2="-13.170087"
+             id="linearGradient6876"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.210222,0,0,1.964283,-1.515862,-2.171324)" />
+          <linearGradient
+             x1="33.184048"
+             y1="24.384579"
+             x2="33.184048"
+             y2="-13.170087"
+             id="linearGradient6877"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.161083,0,0,1.804543,-5.13035e-2,2.267068)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient2887"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(3.085042,0,0,2.052895,-15.9848,-3.14928)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient2888"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-2.846279,0,0,2.087943,139.5254,-3.586178)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient2889"
+             xlink:href="#linearGradient3057"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient2890"
+             xlink:href="#linearGradient3057"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient2891"
+             xlink:href="#linearGradient3057"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <linearGradient
+             x1="29.613848"
+             y1="52.608921"
+             x2="44.723549"
+             y2="52.608921"
+             id="linearGradient2892"
+             xlink:href="#linearGradient1457"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.151801,0,0,1.77085,-5.13035e-2,4.351838)"
+             spreadMethod="reflect" />
+          <linearGradient
+             x1="73.71196"
+             y1="141.92598"
+             x2="-44.758537"
+             y2="142.73943"
+             id="linearGradient2893"
+             xlink:href="#linearGradient2085"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.102327,0.907172)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient2894"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.433337,0,0,1.434961,6.40989,-0.113137)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient2895"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.500069,0,0,1.675192,5.00297,-5.108149)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient2896"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.621397,0,0,1.882058,2.388831,-9.409409)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient48922"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.433337,0,0,1.434961,6.40989,-0.113137)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient2898"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.500069,0,0,1.675192,5.00297,-5.108149)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient2899"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.621397,0,0,1.882058,2.388831,-9.409409)" />
+          <linearGradient
+             x1="35.995708"
+             y1="1.624638"
+             x2="35.995708"
+             y2="11.710631"
+             id="linearGradient2930"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.632005,0,0,2.436073,-5.13035e-2,2.009678)" />
+          <linearGradient
+             x1="38.362892"
+             y1="11.170151"
+             x2="39.723621"
+             y2="6.0918369"
+             id="linearGradient6892"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.63752,0,0,2.47415,-5.13035e-2,-1.2826e-2)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient6893"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.366562,0,0,1.726511,-0.404355,-1.2826e-2)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient2933"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-2.366562,0,0,1.726511,129.1226,-0.112925)" />
+          <linearGradient
+             x1="38.781849"
+             y1="9.5745525"
+             x2="38.781849"
+             y2="7.5863166"
+             id="linearGradient6895"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.632005,0,0,2.482509,-5.13035e-2,-1.2826e-2)" />
+          <linearGradient
+             x1="33.184048"
+             y1="24.384579"
+             x2="33.184048"
+             y2="-13.170087"
+             id="linearGradient6896"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.210222,0,0,1.964283,-1.515862,-2.171324)" />
+          <linearGradient
+             x1="33.184048"
+             y1="24.384579"
+             x2="33.184048"
+             y2="-13.170087"
+             id="linearGradient6897"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.161083,0,0,1.804543,-5.13035e-2,2.267068)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient2938"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(3.085042,0,0,2.052895,-15.9848,-3.14928)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient2939"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-2.846279,0,0,2.087943,139.5254,-3.586178)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient2940"
+             xlink:href="#linearGradient3057"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient2941"
+             xlink:href="#linearGradient3057"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient2942"
+             xlink:href="#linearGradient3057"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <linearGradient
+             x1="35.995708"
+             y1="1.624638"
+             x2="35.995708"
+             y2="11.710631"
+             id="linearGradient2981"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.632005,0,0,2.436073,-5.13035e-2,2.009678)" />
+          <linearGradient
+             x1="38.362892"
+             y1="11.170151"
+             x2="39.723621"
+             y2="6.0918369"
+             id="linearGradient6904"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.63752,0,0,2.47415,-5.13035e-2,-1.2826e-2)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient48940"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.366562,0,0,1.726511,-0.404355,-1.2826e-2)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient2984"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-2.366562,0,0,1.726511,129.1226,-0.112925)" />
+          <linearGradient
+             x1="38.781849"
+             y1="9.5745525"
+             x2="38.781849"
+             y2="7.5863166"
+             id="linearGradient2985"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.632005,0,0,2.482509,-5.13035e-2,-1.2826e-2)" />
+          <linearGradient
+             x1="33.184048"
+             y1="24.384579"
+             x2="33.184048"
+             y2="-13.170087"
+             id="linearGradient2986"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.210222,0,0,1.964283,-1.515862,-2.171324)" />
+          <linearGradient
+             x1="33.184048"
+             y1="24.384579"
+             x2="33.184048"
+             y2="-13.170087"
+             id="linearGradient2987"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(2.161083,0,0,1.804543,-5.13035e-2,2.267068)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient2988"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(3.085042,0,0,2.052895,-15.9848,-3.14928)" />
+          <radialGradient
+             cx="21.595108"
+             cy="8.9813547"
+             r="6.0678878"
+             fx="21.595108"
+             fy="8.9813547"
+             id="radialGradient2989"
+             xlink:href="#linearGradient2834"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-2.846279,0,0,2.087943,139.5254,-3.586178)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient2990"
+             xlink:href="#linearGradient2960"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient2991"
+             xlink:href="#linearGradient2960"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <radialGradient
+             cx="8.0178375"
+             cy="231.98276"
+             r="7.483315"
+             fx="8.0178375"
+             fy="231.98276"
+             id="radialGradient2992"
+             xlink:href="#linearGradient2960"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(3.741657,0.267261)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient3070"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.433337,0,0,1.434961,6.40989,-0.113137)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient3072"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.500069,0,0,1.675192,5.00297,-5.108149)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient3073"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.621397,0,0,1.882058,2.388831,-9.409409)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient3074"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.433337,0,0,1.434961,6.40989,-0.113137)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient3075"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.500069,0,0,1.675192,5.00297,-5.108149)" />
+          <radialGradient
+             cx="20.36058"
+             cy="22.546398"
+             r="15.156592"
+             fx="20.36058"
+             fy="22.546396"
+             id="radialGradient3076"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.621397,0,0,1.882058,2.388831,-9.409409)" />
+          <linearGradient
+             x1="73.71196"
+             y1="141.92598"
+             x2="-44.758537"
+             y2="142.73943"
+             id="linearGradient3077"
+             xlink:href="#linearGradient2085"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.102327,0,0,0.907172,140.423,-46.52439)" />
+          <linearGradient
+             x1="29.613848"
+             y1="52.608921"
+             x2="44.723549"
+             y2="52.608921"
+             id="linearGradient3078"
+             xlink:href="#linearGradient1457"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.533744,0,0,1.262212,174.5467,22.71672)"
+             spreadMethod="reflect" />
+        </defs>
+        <linearGradient
+           x1="73.71196"
+           y1="141.92598"
+           x2="-44.758537"
+           y2="142.73943"
+           id="linearGradient3823"
+           xlink:href="#linearGradient2085"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.699217,0,0,1.398389,-43.17737,21.66355)" />
+        <linearGradient
+           x1="29.613848"
+           y1="52.608921"
+           x2="44.723549"
+           y2="52.608921"
+           id="linearGradient4454"
+           xlink:href="#linearGradient4455"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(2.364239,0,0,0.147737,9.423696,103.352)"
+           spreadMethod="reflect" />
+        <linearGradient
+           x1="29.613848"
+           y1="52.608921"
+           x2="44.723549"
+           y2="52.608921"
+           id="linearGradient4460"
+           xlink:href="#linearGradient4455"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(2.364239,0,0,0.147737,-15.5763,78.352)"
+           spreadMethod="reflect" />
+        <linearGradient
+           x1="29.613848"
+           y1="52.608921"
+           x2="44.723549"
+           y2="52.608921"
+           id="linearGradient4462"
+           xlink:href="#linearGradient4455"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(2.364239,0,0,0.147737,-15.5763,128.352)"
+           spreadMethod="reflect" />
+        <linearGradient
+           x1="29.613848"
+           y1="52.608921"
+           x2="44.723549"
+           y2="52.608921"
+           id="linearGradient6934"
+           xlink:href="#linearGradient4455"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(2.364239,0,0,0.147737,9.423696,90.852)"
+           spreadMethod="reflect" />
+        <linearGradient
+           x1="22.701138"
+           y1="96.415001"
+           x2="67.265129"
+           y2="45.472965"
+           id="linearGradient6935"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-1.006537,0,0,0.581734,154.1355,0.232211)" />
+        <linearGradient
+           x1="22.701138"
+           y1="96.415001"
+           x2="67.265129"
+           y2="45.472965"
+           id="linearGradient48967"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.006537,0,0,0.581734,12.45951,0)" />
+        <linearGradient
+           x1="77.513214"
+           y1="54.724941"
+           x2="77.513214"
+           y2="28.103037"
+           id="linearGradient48969"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.01473,0.985484)" />
+        <linearGradient
+           x1="1270.3132"
+           y1="4.8765283"
+           x2="1247.6848"
+           y2="0.72310239"
+           id="linearGradient6938"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.196965,0,0,22.09936,27.65169,28.06137)" />
+        <linearGradient
+           x1="1270.3132"
+           y1="4.8765283"
+           x2="1247.6848"
+           y2="0.72310239"
+           id="linearGradient6939"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.196965,0,0,22.09936,30.24869,28.06137)" />
+        <defs
+           id="defs1160">
+          <linearGradient
+             id="linearGradient1722">
+            <stop
+               id="stop1723"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop1724"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0.85714287"
+             y1="-0.4609375"
+             x2="0.65517241"
+             y2="0.734375"
+             id="linearGradient6986"
+             xlink:href="#linearGradient1722" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient6989"
+             xlink:href="#linearGradient1895"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0.67729086"
+             y1="-1.1290323"
+             x2="0.50597608"
+             y2="0.87096775"
+             id="linearGradient3045"
+             xlink:href="#linearGradient1518" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient1544"
+             xlink:href="#linearGradient1891"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0.70531398"
+             y1="-0.359375"
+             x2="0.73429954"
+             y2="1.4375"
+             id="linearGradient3046"
+             xlink:href="#linearGradient1544" />
+          <linearGradient
+             id="linearGradient1511">
+            <stop
+               id="stop1512"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop1513"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0.7720207"
+             y1="3.7954545"
+             x2="0.60621762"
+             y2="-0.14393939"
+             id="linearGradient1537"
+             xlink:href="#linearGradient1511" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient6997"
+             xlink:href="#linearGradient1971"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <radialGradient
+             cx="0.49032259"
+             cy="0.50649351"
+             r="0.46014288"
+             fx="0.54355401"
+             fy="0.1923077"
+             id="radialGradient1528"
+             xlink:href="#linearGradient1806" />
+        </defs>
+        <linearGradient
+           x1="41.013119"
+           y1="33.652695"
+           x2="49.022919"
+           y2="85.300827"
+           id="linearGradient6999"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.894288,0,0,0.670955,1.495131,-8.303939)" />
+        <linearGradient
+           x1="57.215328"
+           y1="71.273384"
+           x2="44.033047"
+           y2="147.80029"
+           id="linearGradient7000"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.289673,0,0,0.985506,1.495131,-8.303939)" />
+        <linearGradient
+           x1="151.44301"
+           y1="231.81441"
+           x2="-2.9360003"
+           y2="114.13249"
+           id="linearGradient7001"
+           xlink:href="#linearGradient1749"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.378999,0.333133,-0.193756,0.77637,41.54251,-28.91161)" />
+        <linearGradient
+           x1="186.07457"
+           y1="23.533224"
+           x2="202.6377"
+           y2="23.47304"
+           id="linearGradient1145"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.809593,0,0,5.376537,-109.7868,75.38663)" />
+        <linearGradient
+           x1="92.631454"
+           y1="54.989693"
+           x2="92.631454"
+           y2="50.608093"
+           id="linearGradient1144"
+           xlink:href="#linearGradient1757"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.643697,0,0,2.648182,-109.7868,75.38663)" />
+        <linearGradient
+           x1="25.954844"
+           y1="25.071495"
+           x2="39.781502"
+           y2="27.315489"
+           id="linearGradient48995"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103231)" />
+        <linearGradient
+           x1="30.382267"
+           y1="7.5329666"
+           x2="47.366039"
+           y2="22.769617"
+           id="linearGradient7005"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+        <linearGradient
+           x1="30.722504"
+           y1="28.135216"
+           x2="39.78149"
+           y2="27.315481"
+           id="linearGradient7006"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103232)" />
+        <linearGradient
+           x1="28.814428"
+           y1="-1.616316"
+           x2="47.366039"
+           y2="22.769617"
+           id="linearGradient2099"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.764292,1.3084)" />
+        <linearGradient
+           id="linearGradient2096">
+          <stop
+             id="stop2097"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2098"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient2090">
+          <stop
+             id="stop2091"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop2092"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop2093"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop2094"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop2095"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient2087">
+          <stop
+             id="stop2088"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2089"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient2084">
+          <stop
+             id="stop2085"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2086"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient1891">
+          <stop
+             id="stop7024"
+             style="stop-color:#a4d8f7;stop-opacity:0.19607843"
+             offset="0" />
+          <stop
+             id="stop7025"
+             style="stop-color:#009bf7;stop-opacity:0.19607843"
+             offset="0.43156424" />
+          <stop
+             id="stop1892"
+             style="stop-color:#a4d8f7;stop-opacity:0.19607843"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient7027">
+          <stop
+             id="stop7028"
+             style="stop-color:#000000;stop-opacity:0.70056498"
+             offset="0" />
+          <stop
+             id="stop1896"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient7030"
+           xlink:href="#linearGradient3476"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="71.880074"
+           y1="174.6631"
+           x2="39.680119"
+           y2="93.350052"
+           id="linearGradient7032"
+           xlink:href="#linearGradient2908"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.179369,0.847911)" />
+        <linearGradient
+           x1="29.613848"
+           y1="52.608921"
+           x2="44.723549"
+           y2="52.608921"
+           id="linearGradient2196"
+           xlink:href="#linearGradient4455"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(2.364239,0,0,0.147737,-15.5763,90.852)"
+           spreadMethod="reflect" />
+        <linearGradient
+           x1="29.613848"
+           y1="52.608921"
+           x2="44.723549"
+           y2="52.608921"
+           id="linearGradient2197"
+           xlink:href="#linearGradient4455"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(2.364239,0,0,0.147737,-15.5763,103.352)"
+           spreadMethod="reflect" />
+      </defs>
+      <defs
+         id="defs25182">
+        <linearGradient
+           id="linearGradient25183">
+          <stop
+             id="stop25184"
+             style="stop-color:#000000;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25185"
+             style="stop-color:#363636;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient4381">
+          <stop
+             id="stop4382"
+             style="stop-color:#000000;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop4383"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient4377"
+           xlink:href="#linearGradient20684"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient18496"
+           xlink:href="#linearGradient25928"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+      </defs>
+      <linearGradient
+         x1="178.42355"
+         y1="199.48994"
+         x2="88.360741"
+         y2="112.48578"
+         id="linearGradient10736"
+         xlink:href="#linearGradient1761"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.149113,0,0,1.004952,-6.015819,-5.650748)" />
+      <linearGradient
+         x1="105.80702"
+         y1="25.611177"
+         x2="82.344437"
+         y2="46.947098"
+         id="linearGradient10734"
+         xlink:href="#linearGradient865"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-1.13209,0,0,0.95836,265.0078,-4.621093)" />
+      <linearGradient
+         x1="77.291656"
+         y1="180.92995"
+         x2="53.211624"
+         y2="24.17461"
+         id="linearGradient10711"
+         xlink:href="#linearGradient1758"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="43.39798"
+         y1="-53.39077"
+         x2="38.977112"
+         y2="40.053986"
+         id="linearGradient10710"
+         xlink:href="#linearGradient1755"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="178.42355"
+         y1="199.48994"
+         x2="88.360741"
+         y2="112.48578"
+         id="linearGradient10709"
+         xlink:href="#linearGradient1761"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.069323,0,0,0.935172,-225,0)" />
+      <radialGradient
+         cx="227.00549"
+         cy="477.83307"
+         r="200.73203"
+         fx="240.38737"
+         fy="325.7662"
+         id="radialGradient10708"
+         xlink:href="#linearGradient1764"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="105.80702"
+         y1="25.611177"
+         x2="82.344437"
+         y2="46.947098"
+         id="linearGradient10707"
+         xlink:href="#linearGradient865"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.108489,0.902129)" />
+      <linearGradient
+         x1="107.73714"
+         y1="42.995155"
+         x2="-17.255499"
+         y2="141.94763"
+         id="linearGradient10655"
+         xlink:href="#linearGradient2506"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.952034,0,0,1.176383,177.6569,-91.6739)" />
+      <defs
+         id="defs2565">
+        <linearGradient
+           id="linearGradient7109">
+          <stop
+             id="stop7112"
+             style="stop-color:#000000;stop-opacity:0.29411766"
+             offset="0" />
+          <stop
+             id="stop7111"
+             style="stop-color:#000000;stop-opacity:0.16483517"
+             offset="0.6477778" />
+          <stop
+             id="stop7110"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient7115">
+          <stop
+             id="stop7116"
+             style="stop-color:#000000;stop-opacity:0.3137255"
+             offset="0" />
+          <stop
+             id="stop7117"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient49057">
+          <stop
+             id="stop7119"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop7120"
+             style="stop-color:#89a2bb;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient2576">
+          <stop
+             id="stop2577"
+             style="stop-color:#63b5e8;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2578"
+             style="stop-color:#001b7b;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient7124">
+          <stop
+             id="stop2580"
+             style="stop-color:#001b7b;stop-opacity:1"
+             offset="0.00562" />
+          <stop
+             id="stop2581"
+             style="stop-color:#0093dd;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient7127">
+          <stop
+             id="stop2583"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2584"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient7130">
+          <stop
+             id="stop2586"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2587"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="178.42355"
+           y1="199.48994"
+           x2="88.360741"
+           y2="112.48578"
+           id="linearGradient7133"
+           xlink:href="#linearGradient1761"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.069323,0,0,0.935172,-225,0)" />
+        <defs
+           id="defs2589">
+          <linearGradient
+             x1="217.86621"
+             y1="217.28516"
+             x2="7.1352701"
+             y2="6.5542202"
+             id="linearGradient7135"
+             gradientUnits="userSpaceOnUse">
+            <stop
+               id="stop2591"
+               style="stop-color:#3c5c82;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2592"
+               style="stop-color:#001b7b;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop2593"
+               style="stop-color:#0053BD"
+               offset="0" />
+            <midPointStop
+               id="midPointStop2594"
+               style="stop-color:#0053BD"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop2595"
+               style="stop-color:#00008D"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="214.27441"
+             y1="213.71484"
+             x2="10.72779"
+             y2="10.16822"
+             id="linearGradient2596"
+             gradientUnits="userSpaceOnUse">
+            <stop
+               id="stop2597"
+               style="stop-color:#0068c6;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2598"
+               style="stop-color:#3c5cb2;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop2599"
+               style="stop-color:#0066CC"
+               offset="0" />
+            <midPointStop
+               id="midPointStop2600"
+               style="stop-color:#0066CC"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop2601"
+               style="stop-color:#0053BD"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="112.50049"
+             y1="211.02246"
+             x2="112.50048"
+             y2="12.81396"
+             id="linearGradient7147"
+             gradientUnits="userSpaceOnUse">
+            <stop
+               id="stop2603"
+               style="stop-color:#418ade;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2604"
+               style="stop-color:#a4cdec;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop2605"
+               style="stop-color:#003399;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop2606"
+               style="stop-color:#0099FF"
+               offset="0" />
+            <midPointStop
+               id="midPointStop2607"
+               style="stop-color:#0099FF"
+               offset="0.25" />
+            <midPointStop
+               id="midPointStop2608"
+               style="stop-color:#B0D9FF"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop2609"
+               style="stop-color:#B0D9FF"
+               offset="0.75" />
+            <midPointStop
+               id="midPointStop2610"
+               style="stop-color:#003399"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="-1.36621"
+             cy="223.93457"
+             r="299.15564"
+             fx="-1.36621"
+             fy="223.93457"
+             id="radialGradient2611"
+             gradientUnits="userSpaceOnUse">
+            <stop
+               id="stop7157"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop7158"
+               style="stop-color:#418ade;stop-opacity:1"
+               offset="0.44999999" />
+            <stop
+               id="stop7159"
+               style="stop-color:#3c5cb2;stop-opacity:1"
+               offset="0.75" />
+            <stop
+               id="stop2615"
+               style="stop-color:#0068c6;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop2616"
+               style="stop-color:#FFFFFF"
+               offset="0" />
+            <midPointStop
+               id="midPointStop2617"
+               style="stop-color:#FFFFFF"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop2618"
+               style="stop-color:#0083D7"
+               offset="0.45" />
+            <midPointStop
+               id="midPointStop2619"
+               style="stop-color:#0083D7"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop2620"
+               style="stop-color:#0053BD"
+               offset="0.75" />
+            <midPointStop
+               id="midPointStop2621"
+               style="stop-color:#0053BD"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop2622"
+               style="stop-color:#0066CC"
+               offset="1" />
+          </radialGradient>
+          <linearGradient
+             x1="112.49854"
+             y1="6.1372099"
+             x2="112.49853"
+             y2="129.3468"
+             id="linearGradient2623"
+             gradientUnits="userSpaceOnUse">
+            <stop
+               id="stop2624"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2625"
+               style="stop-color:#0093dd;stop-opacity:0"
+               offset="1" />
+            <midPointStop
+               id="midPointStop2626"
+               style="stop-color:#FFFFFF"
+               offset="0" />
+            <midPointStop
+               id="midPointStop2627"
+               style="stop-color:#FFFFFF"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop2628"
+               style="stop-color:#000000"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="87.310547"
+             y1="141.6543"
+             x2="193.3839"
+             y2="35.58094"
+             id="linearGradient7174"
+             xlink:href="#linearGradient1556"
+             gradientUnits="userSpaceOnUse"
+             spreadMethod="pad">
+            <midPointStop
+               id="midPointStop2630"
+               style="stop-color:#003399"
+               offset="0.00562" />
+            <midPointStop
+               id="midPointStop2631"
+               style="stop-color:#003399"
+               offset="0.25" />
+            <midPointStop
+               id="midPointStop2632"
+               style="stop-color:#57ADFF"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="94.524902"
+             y1="133.65625"
+             x2="184.72461"
+             y2="43.456532"
+             id="linearGradient2633"
+             gradientUnits="userSpaceOnUse">
+            <stop
+               id="stop2634"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop2635"
+               style="stop-color:#fcfeff;stop-opacity:1"
+               offset="0.31658" />
+            <stop
+               id="stop2636"
+               style="stop-color:#f2faff;stop-opacity:1"
+               offset="0.57076001" />
+            <stop
+               id="stop2637"
+               style="stop-color:#e1f3ff;stop-opacity:1"
+               offset="0.80255997" />
+            <stop
+               id="stop2638"
+               style="stop-color:#ccebff;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop2639"
+               style="stop-color:#FFFFFF"
+               offset="0" />
+            <midPointStop
+               id="midPointStop2640"
+               style="stop-color:#FFFFFF"
+               offset="0.75" />
+            <midPointStop
+               id="midPointStop2641"
+               style="stop-color:#CCEBFF"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="126.8584"
+             y1="102.09082"
+             x2="51.48325"
+             y2="177.46597"
+             id="linearGradient2642"
+             xlink:href="#linearGradient2186"
+             gradientUnits="userSpaceOnUse"
+             spreadMethod="pad">
+            <midPointStop
+               id="midPointStop2643"
+               style="stop-color:#57ADFF"
+               offset="0" />
+            <midPointStop
+               id="midPointStop2644"
+               style="stop-color:#57ADFF"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop2645"
+               style="stop-color:#003399"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="116.01855"
+             y1="112.93164"
+             x2="56.763809"
+             y2="172.18639"
+             id="linearGradient2646"
+             gradientUnits="userSpaceOnUse">
+            <stop
+               id="stop7192"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0.44999999" />
+            <stop
+               id="stop7193"
+               style="stop-color:#a4cdec;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop2649"
+               style="stop-color:#FFFFFF"
+               offset="0.45" />
+            <midPointStop
+               id="midPointStop2650"
+               style="stop-color:#FFFFFF"
+               offset="0.75" />
+            <midPointStop
+               id="midPointStop2651"
+               style="stop-color:#D4EEFF"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="92.049637"
+             y1="109.93223"
+             x2="-35.710068"
+             y2="216.77003"
+             id="linearGradient2652"
+             xlink:href="#XMLID_6_"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="103.71875"
+             y1="107.75011"
+             x2="223.05583"
+             y2="-5.3456044"
+             id="linearGradient2653"
+             xlink:href="#XMLID_6_"
+             gradientUnits="userSpaceOnUse" />
+        </defs>
+        <radialGradient
+           cx="24.825565"
+           cy="176.56438"
+           r="42.859913"
+           fx="40.974991"
+           fy="162.11137"
+           id="radialGradient4434"
+           xlink:href="#linearGradient4550"
+           gradientUnits="userSpaceOnUse" />
+        <defs
+           id="defs7200">
+          <linearGradient
+             id="linearGradient7201">
+            <stop
+               id="stop7202"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop7203"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7204">
+            <stop
+               id="stop7205"
+               style="stop-color:#4d90fa;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop7206"
+               style="stop-color:#4d90fa;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient2662">
+            <stop
+               id="stop7208"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop7209"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient7210"
+             xlink:href="#linearGradient7109"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient7211">
+            <stop
+               id="stop7212"
+               style="stop-color:#000000;stop-opacity:0.2937853"
+               offset="0" />
+            <stop
+               id="stop7213"
+               style="stop-color:#000000;stop-opacity:0.06214689"
+               offset="0.6477778" />
+            <stop
+               id="stop7214"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7215">
+            <stop
+               id="stop7216"
+               style="stop-color:#ffffff;stop-opacity:0.69072163"
+               offset="0" />
+            <stop
+               id="stop7217"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7218">
+            <stop
+               id="stop7219"
+               style="stop-color:#ffffff;stop-opacity:0.61983472"
+               offset="0" />
+            <stop
+               id="stop7220"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7221">
+            <stop
+               id="stop7222"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop7223"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient14312">
+            <stop
+               id="stop7225"
+               style="stop-color:#ffffff;stop-opacity:0.61983472"
+               offset="0" />
+            <stop
+               id="stop7226"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7227">
+            <stop
+               id="stop7228"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop7229"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7230">
+            <stop
+               id="stop7231"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop7232"
+               style="stop-color:#ffffff;stop-opacity:0.16078432"
+               offset="0.52955699" />
+            <stop
+               id="stop7233"
+               style="stop-color:#000000;stop-opacity:0.05882353"
+               offset="0.67708677" />
+            <stop
+               id="stop7234"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7235">
+            <stop
+               id="stop7236"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop7237"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7238">
+            <stop
+               id="stop7239"
+               style="stop-color:#000000;stop-opacity:0.3882353"
+               offset="0" />
+            <stop
+               id="stop7240"
+               style="stop-color:#ffffff;stop-opacity:0.34375"
+               offset="0.5" />
+            <stop
+               id="stop7241"
+               style="stop-color:#ffffff;stop-opacity:0.19607843"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7242">
+            <stop
+               id="stop7243"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop7244"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7245">
+            <stop
+               id="stop7246"
+               style="stop-color:#000000;stop-opacity:0.3882353"
+               offset="0" />
+            <stop
+               id="stop7247"
+               style="stop-color:#000000;stop-opacity:0.19215687"
+               offset="0.5" />
+            <stop
+               id="stop7248"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7249">
+            <stop
+               id="stop7250"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop7251"
+               style="stop-color:#ffffff;stop-opacity:0.16078432"
+               offset="0.52955699" />
+            <stop
+               id="stop7252"
+               style="stop-color:#000000;stop-opacity:0.05882353"
+               offset="0.67708677" />
+            <stop
+               id="stop7253"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7254">
+            <stop
+               id="stop7255"
+               style="stop-color:#171a00;stop-opacity:0.66670001"
+               offset="0" />
+            <stop
+               id="stop7256"
+               style="stop-color:#2f2500;stop-opacity:0.0039"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7257">
+            <stop
+               id="stop7258"
+               style="stop-color:#ffcf3d;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop7259"
+               style="stop-color:#b27f00;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7260">
+            <stop
+               id="stop7261"
+               style="stop-color:#bfff00;stop-opacity:0.60000002"
+               offset="0" />
+            <stop
+               id="stop7262"
+               style="stop-color:#fff200;stop-opacity:0.60000002"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7263">
+            <stop
+               id="stop7264"
+               style="stop-color:#000000;stop-opacity:0.3882353"
+               offset="0" />
+            <stop
+               id="stop7265"
+               style="stop-color:#000000;stop-opacity:0.19215687"
+               offset="0.5" />
+            <stop
+               id="stop7266"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient7267">
+            <stop
+               id="stop7268"
+               style="stop-color:#43b0e2;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop7269"
+               style="stop-color:#43b0e2;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient14358">
+            <stop
+               id="stop14359"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop14360"
+               style="stop-color:#fafbff;stop-opacity:1"
+               offset="0.25" />
+            <stop
+               id="stop14361"
+               style="stop-color:#f0f2fa;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop14362"
+               style="stop-color:#e1e1e1;stop-opacity:1"
+               offset="0.75" />
+            <stop
+               id="stop14363"
+               style="stop-color:#f5f6ff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient14364">
+            <stop
+               id="stop14365"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop14366"
+               style="stop-color:#d0d1d9;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop14367"
+               style="stop-color:#878b9b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient14371">
+            <stop
+               id="stop14372"
+               style="stop-color:#e8e8e8;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop14373"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient14374"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient14375"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <defs
+             id="defs14376">
+            <linearGradient
+               id="linearGradient14377">
+              <stop
+                 id="stop14378"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop14379"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient14380">
+              <stop
+                 id="stop14381"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop14382"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop14383"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop14384"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop14385"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient14386">
+              <stop
+                 id="stop14387"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop14388"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient14389"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient14390"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient14391"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient14392"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient14393"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs14394">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient14395"
+                 xlink:href="#linearGradient3296"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient14396"
+                 xlink:href="#linearGradient2483"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+            </defs>
+          </defs>
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient14411"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          <linearGradient
+             x1="17.914211"
+             y1="221.47987"
+             x2="425.89865"
+             y2="221.47987"
+             id="linearGradient7326"
+             xlink:href="#linearGradient2483"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988025,1.012121)" />
+          <linearGradient
+             x1="17.914211"
+             y1="221.47987"
+             x2="425.89865"
+             y2="221.47987"
+             id="linearGradient7327"
+             xlink:href="#linearGradient2483"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988025,1.012121)" />
+          <linearGradient
+             x1="17.914211"
+             y1="221.47987"
+             x2="425.89865"
+             y2="221.47987"
+             id="linearGradient7328"
+             xlink:href="#linearGradient2483"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988025,1.012121)" />
+          <defs
+             id="defs14415">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient7330"
+               xlink:href="#linearGradient4595"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient7331"
+               xlink:href="#linearGradient3108"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient7332"
+               xlink:href="#linearGradient3749"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient7333"
+               xlink:href="#linearGradient3527"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient7334"
+               xlink:href="#linearGradient3076"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient7335">
+              <stop
+                 id="stop7336"
+                 style="stop-color:#000000;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop7337"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient7338"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.241013,0.805793)" />
+            <linearGradient
+               x1="87.605721"
+               y1="1061.6371"
+               x2="87.605721"
+               y2="1160.6499"
+               id="linearGradient7339"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.930484,0.518005)" />
+            <linearGradient
+               x1="177.77042"
+               y1="831.05975"
+               x2="178.45302"
+               y2="795.11487"
+               id="linearGradient7340"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.548996,0.64558)" />
+            <linearGradient
+               x1="458.70102"
+               y1="329.58002"
+               x2="404.87259"
+               y2="326.23184"
+               id="linearGradient7341"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="139.11636"
+               y1="564.54614"
+               x2="200.18613"
+               y2="564.54614"
+               id="linearGradient7342"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <linearGradient
+               x1="118.25803"
+               y1="563.01941"
+               x2="156.10408"
+               y2="564.03723"
+               id="linearGradient7343"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <linearGradient
+               x1="238.75548"
+               y1="339.24017"
+               x2="317.05142"
+               y2="333.88309"
+               id="linearGradient7344"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient7345"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.380924,0.724153)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient7346"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.381391,0.723908)" />
+            <linearGradient
+               x1="354.95923"
+               y1="464.90207"
+               x2="354.95923"
+               y2="299.05014"
+               id="linearGradient7347"
+               xlink:href="#linearGradient1102"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <radialGradient
+               cx="184.20265"
+               cy="780.47272"
+               r="49.972103"
+               fx="182.57774"
+               fy="734.32568"
+               id="radialGradient7348"
+               xlink:href="#linearGradient948"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.455004,0.687283)" />
+            <radialGradient
+               cx="0.52464789"
+               cy="0.32867134"
+               r="0.28679976"
+               fx="0.52464789"
+               fy="0.59440559"
+               id="radialGradient7349"
+               xlink:href="#linearGradient843" />
+            <radialGradient
+               cx="106.52795"
+               cy="541.31592"
+               r="49.665058"
+               fx="105.48236"
+               fy="502.10669"
+               id="radialGradient7350"
+               xlink:href="#linearGradient994"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="84.970261"
+               y1="1095.1855"
+               x2="84.970261"
+               y2="1189.3411"
+               id="linearGradient7351"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.987109,0.503244)" />
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient49277"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient7353"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient14440"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient7355"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient7356"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient7357"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+          </defs>
+          <defs
+             id="defs7403">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient7404"
+               xlink:href="#linearGradient3615"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient7405"
+               xlink:href="#linearGradient3608"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient7406"
+               xlink:href="#linearGradient3612"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0.314347"
+               y1="0.54857099"
+               x2="0.53643698"
+               y2="0.554286"
+               id="linearGradient7407"
+               xlink:href="#linearGradient218" />
+            <linearGradient
+               x1="0.246326"
+               y1="0.59428602"
+               x2="0.78109801"
+               y2="0.57142901"
+               id="linearGradient7408"
+               xlink:href="#linearGradient223" />
+            <radialGradient
+               cx="0.257236"
+               cy="0.27271599"
+               r="0.65467203"
+               fx="0.273312"
+               fy="0.51515198"
+               id="radialGradient7409"
+               xlink:href="#linearGradient1105" />
+          </defs>
+          <linearGradient
+             x1="458.70102"
+             y1="329.58002"
+             x2="404.87259"
+             y2="326.23184"
+             id="linearGradient7457"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="354.95923"
+             y1="464.90207"
+             x2="354.95923"
+             y2="299.05014"
+             id="linearGradient7458"
+             xlink:href="#linearGradient1102"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="238.75548"
+             y1="339.24017"
+             x2="317.05142"
+             y2="333.88309"
+             id="linearGradient7459"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="458.70102"
+             y1="329.58002"
+             x2="404.87259"
+             y2="326.23184"
+             id="linearGradient7460"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.733715,1.362927)" />
+          <linearGradient
+             x1="192.95671"
+             y1="559.13995"
+             x2="192.95671"
+             y2="588.70502"
+             id="linearGradient7461"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="199.15404"
+             y1="696.90118"
+             x2="193.92329"
+             y2="593.573"
+             id="linearGradient7462"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="217.42307"
+             y1="536.03741"
+             x2="217.42307"
+             y2="459.23132"
+             id="linearGradient7463"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+          <linearGradient
+             x1="118.25803"
+             y1="563.01941"
+             x2="156.10408"
+             y2="564.03723"
+             id="linearGradient7464"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.54934,0.645436)" />
+          <linearGradient
+             x1="139.11636"
+             y1="564.54614"
+             x2="200.18613"
+             y2="564.54614"
+             id="linearGradient7465"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.54934,0.645436)" />
+          <radialGradient
+             cx="184.20265"
+             cy="780.47272"
+             r="49.972103"
+             fx="182.57774"
+             fy="734.32568"
+             id="radialGradient7466"
+             xlink:href="#linearGradient3749"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.455004,0.687283)" />
+          <linearGradient
+             x1="177.77042"
+             y1="831.05975"
+             x2="178.45302"
+             y2="795.11487"
+             id="linearGradient7467"
+             xlink:href="#linearGradient3527"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.548996,0.64558)" />
+          <linearGradient
+             x1="84.970261"
+             y1="1095.1855"
+             x2="84.970261"
+             y2="1189.3411"
+             id="linearGradient7468"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.987109,0.503244)" />
+          <linearGradient
+             x1="87.605721"
+             y1="1061.6371"
+             x2="87.605721"
+             y2="1160.6499"
+             id="linearGradient7469"
+             xlink:href="#linearGradient838"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.930484,0.518005)" />
+          <radialGradient
+             cx="106.52795"
+             cy="541.31592"
+             r="49.665058"
+             fx="105.48236"
+             fy="502.10669"
+             id="radialGradient7470"
+             xlink:href="#linearGradient994"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="-91.514885"
+             y1="199.05321"
+             x2="30.274208"
+             y2="194.82513"
+             id="linearGradient7471"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.026011,0.974648)" />
+          <linearGradient
+             x1="-4.4710765"
+             y1="366.76578"
+             x2="26.069948"
+             y2="512.50165"
+             id="linearGradient7472"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.633883,0,0,0.536553,-25.41624,-15.94345)" />
+          <linearGradient
+             x1="-49.343468"
+             y1="302.82651"
+             x2="-10.230718"
+             y2="302.82651"
+             id="linearGradient7473"
+             xlink:href="#linearGradient4592"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.318581,0.758391)" />
+          <linearGradient
+             x1="-18.900764"
+             y1="185.38274"
+             x2="24.677307"
+             y2="151.7379"
+             id="linearGradient7474"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.706204,1.416022)" />
+          <linearGradient
+             x1="-6.0588322"
+             y1="210.60007"
+             x2="6.9808698"
+             y2="293.03543"
+             id="linearGradient7475"
+             xlink:href="#linearGradient4588"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.439544,0,0,0.694664,-12.26418,6.7453)" />
+          <linearGradient
+             x1="-91.514885"
+             y1="199.05321"
+             x2="30.274208"
+             y2="194.82513"
+             id="linearGradient7476"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.272246,-0.435187,0.939711,0.665801,-204.4414,93.2513)" />
+          <linearGradient
+             x1="-18.900764"
+             y1="185.38274"
+             x2="24.677307"
+             y2="151.7379"
+             id="linearGradient7477"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.706204,1.416022)" />
+          <linearGradient
+             x1="-91.514885"
+             y1="199.05321"
+             x2="30.274208"
+             y2="194.82513"
+             id="linearGradient7478"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.026011,0.974648)" />
+          <linearGradient
+             x1="-49.343468"
+             y1="302.82651"
+             x2="-10.230718"
+             y2="302.82651"
+             id="linearGradient7479"
+             xlink:href="#linearGradient4592"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.318581,0.758391)" />
+          <linearGradient
+             x1="-6.0588322"
+             y1="210.60007"
+             x2="6.9808698"
+             y2="293.03543"
+             id="linearGradient7480"
+             xlink:href="#linearGradient4588"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.439544,0,0,0.694664,-12.26418,6.7453)" />
+          <linearGradient
+             x1="-91.514885"
+             y1="199.05321"
+             x2="30.274208"
+             y2="194.82513"
+             id="linearGradient7481"
+             xlink:href="#linearGradient4595"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.272246,-0.435187,0.939711,0.665801,-204.4414,93.2513)" />
+          <defs
+             id="defs7482">
+            <linearGradient
+               id="linearGradient7483">
+              <stop
+                 id="stop7484"
+                 style="stop-color:#000000;stop-opacity:0.3882353"
+                 offset="0" />
+              <stop
+                 id="stop7485"
+                 style="stop-color:#ffffff;stop-opacity:0.34375"
+                 offset="0.5" />
+              <stop
+                 id="stop7486"
+                 style="stop-color:#ffffff;stop-opacity:0.19607843"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient7487"
+               xlink:href="#linearGradient3057"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient7488"
+               xlink:href="#linearGradient4618"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient7489"
+               xlink:href="#linearGradient4588"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient7490"
+               xlink:href="#linearGradient4615"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient7491"
+               xlink:href="#linearGradient3041"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient7492"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.241013,0.805793)" />
+            <linearGradient
+               x1="87.605721"
+               y1="1061.6371"
+               x2="87.605721"
+               y2="1160.6499"
+               id="linearGradient7493"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.930484,0.518005)" />
+            <linearGradient
+               x1="177.77042"
+               y1="831.05975"
+               x2="178.45302"
+               y2="795.11487"
+               id="linearGradient7494"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.548996,0.64558)" />
+            <linearGradient
+               x1="458.70102"
+               y1="329.58002"
+               x2="404.87259"
+               y2="326.23184"
+               id="linearGradient7495"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="139.11636"
+               y1="564.54614"
+               x2="200.18613"
+               y2="564.54614"
+               id="linearGradient7496"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <linearGradient
+               x1="118.25803"
+               y1="563.01941"
+               x2="156.10408"
+               y2="564.03723"
+               id="linearGradient7497"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <linearGradient
+               x1="238.75548"
+               y1="339.24017"
+               x2="317.05142"
+               y2="333.88309"
+               id="linearGradient7498"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient7499"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.380924,0.724153)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient7500"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.381391,0.723908)" />
+            <linearGradient
+               x1="354.95923"
+               y1="464.90207"
+               x2="354.95923"
+               y2="299.05014"
+               id="linearGradient7501"
+               xlink:href="#linearGradient1102"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <radialGradient
+               cx="184.20265"
+               cy="780.47272"
+               r="49.972103"
+               fx="182.57774"
+               fy="734.32568"
+               id="radialGradient7502"
+               xlink:href="#linearGradient948"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.455004,0.687283)" />
+            <radialGradient
+               cx="0.52464789"
+               cy="0.32867134"
+               r="0.28679976"
+               fx="0.52464789"
+               fy="0.59440559"
+               id="radialGradient7503"
+               xlink:href="#linearGradient843" />
+            <radialGradient
+               cx="106.52795"
+               cy="541.31592"
+               r="49.665058"
+               fx="105.48236"
+               fy="502.10669"
+               id="radialGradient7504"
+               xlink:href="#linearGradient994"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="84.970261"
+               y1="1095.1855"
+               x2="84.970261"
+               y2="1189.3411"
+               id="linearGradient7505"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.987109,0.503244)" />
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient7506"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient7507"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient7508"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient7509"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient7510"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient7511"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="354.95923"
+               y1="464.90207"
+               x2="354.95923"
+               y2="299.05014"
+               id="linearGradient7512"
+               xlink:href="#linearGradient1102"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="238.75548"
+               y1="339.24017"
+               x2="317.05142"
+               y2="333.88309"
+               id="linearGradient7513"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="458.70102"
+               y1="329.58002"
+               x2="404.87259"
+               y2="326.23184"
+               id="linearGradient7514"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient7515"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient7516"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient7517"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="118.25803"
+               y1="563.01941"
+               x2="156.10408"
+               y2="564.03723"
+               id="linearGradient7518"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <linearGradient
+               x1="139.11636"
+               y1="564.54614"
+               x2="200.18613"
+               y2="564.54614"
+               id="linearGradient7519"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <radialGradient
+               cx="184.20265"
+               cy="780.47272"
+               r="49.972103"
+               fx="182.57774"
+               fy="734.32568"
+               id="radialGradient7520"
+               xlink:href="#linearGradient3749"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.455004,0.687283)" />
+            <linearGradient
+               x1="177.77042"
+               y1="831.05975"
+               x2="178.45302"
+               y2="795.11487"
+               id="linearGradient7521"
+               xlink:href="#linearGradient843"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.548996,0.64558)" />
+            <linearGradient
+               x1="84.970261"
+               y1="1095.1855"
+               x2="84.970261"
+               y2="1189.3411"
+               id="linearGradient7522"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.987109,0.503244)" />
+            <linearGradient
+               x1="87.605721"
+               y1="1061.6371"
+               x2="87.605721"
+               y2="1160.6499"
+               id="linearGradient7523"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.930484,0.518005)" />
+            <radialGradient
+               cx="106.52795"
+               cy="541.31592"
+               r="49.665058"
+               fx="105.48236"
+               fy="502.10669"
+               id="radialGradient7524"
+               xlink:href="#linearGradient994"
+               gradientUnits="userSpaceOnUse" />
+          </defs>
+          <defs
+             id="defs7569">
+            <linearGradient
+               id="linearGradient14656">
+              <stop
+                 id="stop14657"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop14658"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient7573">
+              <stop
+                 id="stop7574"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop7575"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient7576">
+              <stop
+                 id="stop7577"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop7578"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop7579"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop7580"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop7581"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient7582">
+              <stop
+                 id="stop7583"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop7584"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient7585"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <defs
+               id="defs7586">
+              <linearGradient
+                 id="linearGradient7587">
+                <stop
+                   id="stop7588"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop7589"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient7590">
+                <stop
+                   id="stop7591"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop7592"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop7593"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop7594"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop7595"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient14682">
+                <stop
+                   id="stop14683"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop14684"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <radialGradient
+                 cx="23.756607"
+                 cy="60.078049"
+                 r="21.026033"
+                 fx="23.756607"
+                 fy="60.078049"
+                 id="radialGradient7599"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.006281,0.993758)" />
+              <linearGradient
+                 x1="31.82851"
+                 y1="61.778381"
+                 x2="33.198818"
+                 y2="6.859036"
+                 id="linearGradient7600"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.750054,0,0,1.072718,1.04579,2.663333)" />
+              <radialGradient
+                 cx="92.478806"
+                 cy="20.827066"
+                 r="45.889046"
+                 fx="92.478806"
+                 fy="20.827066"
+                 id="radialGradient7601"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.506767,1.973294)" />
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient14688"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="108.49871"
+                 y1="17.573528"
+                 x2="185.22578"
+                 y2="24.330959"
+                 id="linearGradient3056"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="28.814428"
+                 y1="-1.616316"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient3058"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.764292,1.3084)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient7605"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <linearGradient
+                 x1="30.382267"
+                 y1="7.5329666"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient7606"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+              <linearGradient
+                 x1="25.954844"
+                 y1="25.071495"
+                 x2="39.781502"
+                 y2="27.315489"
+                 id="linearGradient3061"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103231)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient7608"
+                 xlink:href="#linearGradient3296"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient7609"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient7610"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs7611">
+                <linearGradient
+                   id="linearGradient14698">
+                  <stop
+                     id="stop7613"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop7614"
+                     style="stop-color:#d0d1d9;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop7615"
+                     style="stop-color:#878b9b;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+              </defs>
+            </defs>
+            <defs
+               id="defs7630">
+              <linearGradient
+                 id="linearGradient7631">
+                <stop
+                   id="stop7632"
+                   style="stop-color:#826647;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop7633"
+                   style="stop-color:#575147;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.36627907"
+                 y1="0.8125"
+                 x2="0.36627907"
+                 y2="0.1796875"
+                 id="linearGradient7634"
+                 xlink:href="#linearGradient1136"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="-0.109375"
+                 y1="0.9140625"
+                 x2="1.15625"
+                 y2="0.1796875"
+                 id="linearGradient7635"
+                 xlink:href="#linearGradient1136" />
+            </defs>
+            <radialGradient
+               cx="24.825565"
+               cy="176.56438"
+               r="42.859913"
+               fx="40.974991"
+               fy="162.11137"
+               id="radialGradient7637"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="693.25439"
+               y1="697.24719"
+               x2="657.74762"
+               y2="677.27399"
+               id="linearGradient7638"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.983783,1.016484)" />
+            <linearGradient
+               x1="681.34058"
+               y1="728.7738"
+               x2="641.37305"
+               y2="705.9129"
+               id="linearGradient7639"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.986777,1.0134)" />
+            <linearGradient
+               x1="649.57269"
+               y1="677.24323"
+               x2="630.47528"
+               y2="668.91809"
+               id="linearGradient7640"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988806,1.011321)" />
+            <linearGradient
+               x1="647.99902"
+               y1="693.73279"
+               x2="629.89734"
+               y2="683.8114"
+               id="linearGradient7641"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.975718,1.024886)" />
+            <linearGradient
+               x1="538.89514"
+               y1="277.2775"
+               x2="575.11407"
+               y2="342.66919"
+               id="linearGradient7642"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.998206,1.001797)" />
+            <linearGradient
+               x1="509.06769"
+               y1="327.76361"
+               x2="544.86011"
+               y2="399.38104"
+               id="linearGradient7643"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.972249,1.028543)" />
+            <linearGradient
+               x1="591.27606"
+               y1="330.16998"
+               x2="620.33301"
+               y2="382.54678"
+               id="linearGradient7644"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.044357,0.957527)" />
+            <linearGradient
+               x1="566.74347"
+               y1="415.15009"
+               x2="588.13922"
+               y2="458.04449"
+               id="linearGradient7645"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.03551,0.965707)" />
+            <defs
+               id="defs7646">
+              <linearGradient
+                 x1="0.25179857"
+                 y1="-0.0390625"
+                 x2="0.53237408"
+                 y2="0.5234375"
+                 id="linearGradient7647"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.092198581"
+                 y1="-0.2109375"
+                 x2="0.4822695"
+                 y2="0.4921875"
+                 id="linearGradient7656"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.016528925"
+                 y1="-0.4921875"
+                 x2="0.51239669"
+                 y2="0.5"
+                 id="linearGradient7657"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.05511811"
+                 y1="-0.3046875"
+                 x2="0.53543305"
+                 y2="0.5625"
+                 id="linearGradient7658"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="1.2125034"
+                 y1="0.78833276"
+                 x2="0.5859077"
+                 y2="0.44490069"
+                 id="linearGradient7659"
+                 xlink:href="#linearGradient4215"
+                 gradientTransform="scale(0.999075,1.000926)" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient7660"
+                 xlink:href="#linearGradient3256"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="1.1610887"
+                 y1="0.61942029"
+                 x2="0.47761098"
+                 y2="0.3214713"
+                 id="linearGradient7661"
+                 xlink:href="#linearGradient4215"
+                 gradientTransform="scale(1.003618,0.996395)" />
+              <linearGradient
+                 x1="1.8455285"
+                 y1="1.34375"
+                 x2="0.47967479"
+                 y2="0.5625"
+                 id="linearGradient7662"
+                 xlink:href="#linearGradient4021" />
+              <linearGradient
+                 id="linearGradient7663">
+                <stop
+                   id="stop7664"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop7665"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.7519705"
+                 y1="1.0528145"
+                 x2="0.54093099"
+                 y2="0.37158158"
+                 id="linearGradient7666"
+                 xlink:href="#linearGradient4021"
+                 gradientTransform="scale(0.990884,1.0092)" />
+              <linearGradient
+                 x1="0.24528302"
+                 y1="1.6015625"
+                 x2="0.28301886"
+                 y2="-0.0234375"
+                 id="linearGradient7667"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.89719623"
+                 y1="-0.1484375"
+                 x2="0.40186915"
+                 y2="0.5546875"
+                 id="linearGradient7668"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.90588236"
+                 y1="-0.2734375"
+                 x2="0.36470589"
+                 y2="0.5078125"
+                 id="linearGradient7669"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.56809336"
+                 y1="-0.125"
+                 x2="0.49027237"
+                 y2="0.59375"
+                 id="linearGradient7670"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="1.4128441"
+                 y1="1.25"
+                 x2="0.42201835"
+                 y2="0.4140625"
+                 id="linearGradient49449"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.084848486"
+                 y1="1.1640625"
+                 x2="0.53333336"
+                 y2="0.359375"
+                 id="linearGradient7672"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.76190478"
+                 y1="-0.53125"
+                 x2="0.6857143"
+                 y2="0.5390625"
+                 id="linearGradient7673"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 id="linearGradient7674">
+                <stop
+                   id="stop7675"
+                   style="stop-color:#ffffff;stop-opacity:0.83615822"
+                   offset="0" />
+                <stop
+                   id="stop7676"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="2.2054794"
+                 y1="2.03125"
+                 x2="0.56164384"
+                 y2="-0.28125"
+                 id="linearGradient7677"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.88832486"
+                 y1="1.0390625"
+                 x2="0.55837566"
+                 y2="0.3046875"
+                 id="linearGradient7678"
+                 xlink:href="#linearGradient1806" />
+              <linearGradient
+                 x1="0.85217392"
+                 y1="0.9609375"
+                 x2="0.86086959"
+                 y2="0.296875"
+                 id="linearGradient7679"
+                 xlink:href="#linearGradient1806" />
+              <linearGradient
+                 x1="0.064220183"
+                 y1="1.4375"
+                 x2="0.22018349"
+                 y2="0.3125"
+                 id="linearGradient7680"
+                 xlink:href="#linearGradient3970" />
+              <linearGradient
+                 id="linearGradient7681">
+                <stop
+                   id="stop7682"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop7683"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.1011236"
+                 y1="0.7421875"
+                 x2="0.033707865"
+                 y2="0.5703125"
+                 id="linearGradient7684"
+                 xlink:href="#linearGradient3970" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient14763"
+                 xlink:href="#linearGradient4545"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <radialGradient
+                 cx="61.493542"
+                 cy="55.792442"
+                 r="2.5800848"
+                 fx="62.465706"
+                 fy="54.922401"
+                 id="radialGradient7686"
+                 xlink:href="#linearGradient4545"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.037749,0.963624)" />
+            </defs>
+            <linearGradient
+               x1="-191.46153"
+               y1="37.372372"
+               x2="-165.58835"
+               y2="37.372372"
+               id="linearGradient49468"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+            <defs
+               id="defs7732">
+              <linearGradient
+                 id="linearGradient7733">
+                <stop
+                   id="stop7734"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop7735"
+                   style="stop-color:#fafbff;stop-opacity:1"
+                   offset="0.25" />
+                <stop
+                   id="stop7736"
+                   style="stop-color:#f0f2fa;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop7737"
+                   style="stop-color:#e1e1e1;stop-opacity:1"
+                   offset="0.75" />
+                <stop
+                   id="stop7738"
+                   style="stop-color:#f5f6ff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient7739">
+                <stop
+                   id="stop7740"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop7741"
+                   style="stop-color:#d0d1d9;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop7742"
+                   style="stop-color:#878b9b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient7743">
+                <stop
+                   id="stop7744"
+                   style="stop-color:#e8e8e8;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop7745"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient7746"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <radialGradient
+                 cx="-77.367622"
+                 cy="42.633839"
+                 r="216.26619"
+                 fx="-80.036034"
+                 fy="44.468376"
+                 id="radialGradient7747"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+              <defs
+                 id="defs7748">
+                <linearGradient
+                   id="linearGradient7749">
+                  <stop
+                     id="stop7750"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop7751"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient7752">
+                  <stop
+                     id="stop7753"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop7754"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop7755"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop7756"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop7757"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient7758">
+                  <stop
+                     id="stop7759"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop7760"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="133.07144"
+                   y1="28.231943"
+                   x2="118.58411"
+                   y2="13.431207"
+                   id="linearGradient7761"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                <linearGradient
+                   x1="30.722504"
+                   y1="28.135216"
+                   x2="39.78149"
+                   y2="27.315481"
+                   id="linearGradient14840"
+                   xlink:href="#linearGradient1884"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103232)" />
+                <radialGradient
+                   cx="4.9853168"
+                   cy="108.47158"
+                   r="34.222183"
+                   fx="5.2520976"
+                   fy="108.73115"
+                   id="radialGradient7763"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="36.826332"
+                   y1="75.332558"
+                   x2="25.761681"
+                   y2="135.90358"
+                   id="linearGradient7764"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                <linearGradient
+                   x1="78.675774"
+                   y1="47.411823"
+                   x2="64.05336"
+                   y2="34.302757"
+                   id="linearGradient7765"
+                   xlink:href="#linearGradient4281"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                <defs
+                   id="defs7766">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient14845"
+                     xlink:href="#linearGradient3296"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                </defs>
+              </defs>
+              <linearGradient
+                 x1="88.712402"
+                 y1="138.15012"
+                 x2="104.81104"
+                 y2="151.63045"
+                 id="linearGradient7782"
+                 xlink:href="#linearGradient3305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            </defs>
+            <linearGradient
+               x1="84.960785"
+               y1="92.151367"
+               x2="42.64373"
+               y2="53.360722"
+               id="linearGradient7790"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.321949,0.756459)" />
+            <linearGradient
+               x1="109.15074"
+               y1="2.1610787"
+               x2="134.0733"
+               y2="60.510494"
+               id="linearGradient7791"
+               xlink:href="#linearGradient845"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.835421,1.197001)" />
+            <linearGradient
+               x1="186.07457"
+               y1="23.533224"
+               x2="202.6377"
+               y2="23.47304"
+               id="linearGradient7792"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.388045,2.57702)" />
+            <linearGradient
+               x1="92.631454"
+               y1="54.989693"
+               x2="92.631454"
+               y2="50.608093"
+               id="linearGradient7793"
+               xlink:href="#linearGradient1757"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.787838,1.269296)" />
+            <radialGradient
+               cx="24.825565"
+               cy="176.56438"
+               r="42.859913"
+               fx="40.974991"
+               fy="162.11137"
+               id="radialGradient7794"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="693.25439"
+               y1="697.24719"
+               x2="657.74762"
+               y2="677.27399"
+               id="linearGradient14873"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.983783,1.016484)" />
+            <linearGradient
+               x1="681.34058"
+               y1="728.7738"
+               x2="641.37305"
+               y2="705.9129"
+               id="linearGradient7796"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.986777,1.0134)" />
+            <linearGradient
+               x1="649.57269"
+               y1="677.24323"
+               x2="630.47528"
+               y2="668.91809"
+               id="linearGradient7797"
+               xlink:href="#linearGradient3256"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988806,1.011321)" />
+            <linearGradient
+               x1="647.99902"
+               y1="693.73279"
+               x2="629.89734"
+               y2="683.8114"
+               id="linearGradient7798"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.975718,1.024886)" />
+            <linearGradient
+               x1="538.89514"
+               y1="277.2775"
+               x2="575.11407"
+               y2="342.66919"
+               id="linearGradient7799"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.998206,1.001797)" />
+            <linearGradient
+               x1="509.06769"
+               y1="327.76361"
+               x2="544.86011"
+               y2="399.38104"
+               id="linearGradient7800"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.972249,1.028543)" />
+            <linearGradient
+               x1="591.27606"
+               y1="330.16998"
+               x2="620.33301"
+               y2="382.54678"
+               id="linearGradient7801"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.044357,0.957527)" />
+            <linearGradient
+               x1="566.74347"
+               y1="415.15009"
+               x2="588.13922"
+               y2="458.04449"
+               id="linearGradient7802"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.03551,0.965707)" />
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient14881"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+            <linearGradient
+               x1="1270.3132"
+               y1="4.8765283"
+               x2="1247.6848"
+               y2="0.72310239"
+               id="linearGradient14882"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(9.440723e-2,10.59241)" />
+            <linearGradient
+               x1="1270.3132"
+               y1="4.8765283"
+               x2="1247.6848"
+               y2="0.72310239"
+               id="linearGradient7805"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+            <defs
+               id="defs7806">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient14885"
+                 xlink:href="#linearGradient3253"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient7808">
+                <stop
+                   id="stop7809"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop7810"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient7811">
+                <stop
+                   id="stop7812"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop7813"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient7814">
+                <stop
+                   id="stop7815"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop7816"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop7817"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop7818"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop7819"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient14898">
+                <stop
+                   id="stop7821"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop7822"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <radialGradient
+                 cx="23.756607"
+                 cy="60.078049"
+                 r="21.026033"
+                 fx="23.756607"
+                 fy="60.078049"
+                 id="radialGradient7823"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+              <linearGradient
+                 x1="31.82851"
+                 y1="61.778381"
+                 x2="33.198818"
+                 y2="6.859036"
+                 id="linearGradient7824"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+              <radialGradient
+                 cx="92.478806"
+                 cy="20.827066"
+                 r="45.889046"
+                 fx="92.478806"
+                 fy="20.827066"
+                 id="radialGradient7825"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient14904"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+              <linearGradient
+                 x1="108.49871"
+                 y1="17.573528"
+                 x2="185.22578"
+                 y2="24.330959"
+                 id="linearGradient7827"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+              <linearGradient
+                 x1="28.814428"
+                 y1="-1.616316"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient14906"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.764292,1.3084)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient7829"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <linearGradient
+                 x1="30.382267"
+                 y1="7.5329666"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient14908"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+              <linearGradient
+                 x1="25.954844"
+                 y1="25.071495"
+                 x2="39.781502"
+                 y2="27.315489"
+                 id="linearGradient14909"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103231)" />
+              <linearGradient
+                 x1="31.82851"
+                 y1="61.778381"
+                 x2="33.198818"
+                 y2="6.859036"
+                 id="linearGradient14910"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+              <radialGradient
+                 cx="24.825565"
+                 cy="176.56438"
+                 r="42.859913"
+                 fx="40.974991"
+                 fy="162.11137"
+                 id="radialGradient7833"
+                 xlink:href="#linearGradient1806"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="591.27606"
+                 y1="330.16998"
+                 x2="620.33301"
+                 y2="382.54678"
+                 id="linearGradient7834"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.044357,0.957527)" />
+              <linearGradient
+                 x1="566.74347"
+                 y1="415.15009"
+                 x2="588.13922"
+                 y2="458.04449"
+                 id="linearGradient7835"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.03551,0.965707)" />
+              <defs
+                 id="defs7836">
+                <linearGradient
+                   x1="0.25179857"
+                   y1="-0.0390625"
+                   x2="0.53237408"
+                   y2="0.5234375"
+                   id="linearGradient7837"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="0.092198581"
+                   y1="-0.2109375"
+                   x2="0.4822695"
+                   y2="0.4921875"
+                   id="linearGradient7838"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="0.016528925"
+                   y1="-0.4921875"
+                   x2="0.51239669"
+                   y2="0.5"
+                   id="linearGradient14917"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="0.05511811"
+                   y1="-0.3046875"
+                   x2="0.53543305"
+                   y2="0.5625"
+                   id="linearGradient7840"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="1.2125034"
+                   y1="0.78833276"
+                   x2="0.5859077"
+                   y2="0.44490069"
+                   id="linearGradient7841"
+                   xlink:href="#linearGradient4215"
+                   gradientTransform="scale(0.999075,1.000926)" />
+                <linearGradient
+                   id="linearGradient7842">
+                  <stop
+                     id="stop7843"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop7844"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.1610887"
+                   y1="0.61942029"
+                   x2="0.47761098"
+                   y2="0.3214713"
+                   id="linearGradient7845"
+                   xlink:href="#linearGradient4215"
+                   gradientTransform="scale(1.003618,0.996395)" />
+                <linearGradient
+                   x1="1.8455285"
+                   y1="1.34375"
+                   x2="0.47967479"
+                   y2="0.5625"
+                   id="linearGradient7846"
+                   xlink:href="#linearGradient4021" />
+                <linearGradient
+                   id="linearGradient7847">
+                  <stop
+                     id="stop7848"
+                     style="stop-color:#000000;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop7849"
+                     style="stop-color:#000000;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.7519705"
+                   y1="1.0528145"
+                   x2="0.54093099"
+                   y2="0.37158158"
+                   id="linearGradient7850"
+                   xlink:href="#linearGradient4021"
+                   gradientTransform="scale(0.990884,1.0092)" />
+                <linearGradient
+                   x1="0.24528302"
+                   y1="1.6015625"
+                   x2="0.28301886"
+                   y2="-0.0234375"
+                   id="linearGradient7851"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.89719623"
+                   y1="-0.1484375"
+                   x2="0.40186915"
+                   y2="0.5546875"
+                   id="linearGradient7852"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.90588236"
+                   y1="-0.2734375"
+                   x2="0.36470589"
+                   y2="0.5078125"
+                   id="linearGradient7853"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.56809336"
+                   y1="-0.125"
+                   x2="0.49027237"
+                   y2="0.59375"
+                   id="linearGradient7854"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="1.4128441"
+                   y1="1.25"
+                   x2="0.42201835"
+                   y2="0.4140625"
+                   id="linearGradient14933"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.084848486"
+                   y1="1.1640625"
+                   x2="0.53333336"
+                   y2="0.359375"
+                   id="linearGradient7856"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.76190478"
+                   y1="-0.53125"
+                   x2="0.6857143"
+                   y2="0.5390625"
+                   id="linearGradient7857"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   id="linearGradient7858">
+                  <stop
+                     id="stop7859"
+                     style="stop-color:#ffffff;stop-opacity:0.83615822"
+                     offset="0" />
+                  <stop
+                     id="stop7860"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="2.2054794"
+                   y1="2.03125"
+                   x2="0.56164384"
+                   y2="-0.28125"
+                   id="linearGradient7861"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.88832486"
+                   y1="1.0390625"
+                   x2="0.55837566"
+                   y2="0.3046875"
+                   id="linearGradient7862"
+                   xlink:href="#linearGradient1806" />
+                <linearGradient
+                   x1="0.85217392"
+                   y1="0.9609375"
+                   x2="0.86086959"
+                   y2="0.296875"
+                   id="linearGradient7863"
+                   xlink:href="#linearGradient1806" />
+                <linearGradient
+                   x1="0.064220183"
+                   y1="1.4375"
+                   x2="0.22018349"
+                   y2="0.3125"
+                   id="linearGradient7864"
+                   xlink:href="#linearGradient3970" />
+                <linearGradient
+                   id="linearGradient7865">
+                  <stop
+                     id="stop7866"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop7867"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.1011236"
+                   y1="0.7421875"
+                   x2="0.033707865"
+                   y2="0.5703125"
+                   id="linearGradient7868"
+                   xlink:href="#linearGradient3970" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient7869"
+                   xlink:href="#linearGradient4550"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <radialGradient
+                   cx="0.49032259"
+                   cy="0.50649351"
+                   r="0.38170236"
+                   fx="0.63414633"
+                   fy="0.37777779"
+                   id="radialGradient7870"
+                   xlink:href="#linearGradient1806" />
+              </defs>
+            </defs>
+            <radialGradient
+               cx="24.825565"
+               cy="176.56438"
+               r="42.859913"
+               fx="40.974991"
+               fy="162.11137"
+               id="radialGradient49598"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="693.25439"
+               y1="697.24719"
+               x2="657.74762"
+               y2="677.27399"
+               id="linearGradient7923"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.983783,1.016484)" />
+            <linearGradient
+               x1="681.34058"
+               y1="728.7738"
+               x2="641.37305"
+               y2="705.9129"
+               id="linearGradient7924"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.986777,1.0134)" />
+            <linearGradient
+               x1="649.57269"
+               y1="677.24323"
+               x2="630.47528"
+               y2="668.91809"
+               id="linearGradient3371"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988806,1.011321)" />
+            <linearGradient
+               x1="647.99902"
+               y1="693.73279"
+               x2="629.89734"
+               y2="683.8114"
+               id="linearGradient3372"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.975718,1.024886)" />
+            <linearGradient
+               x1="538.89514"
+               y1="277.2775"
+               x2="575.11407"
+               y2="342.66919"
+               id="linearGradient3373"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.998206,1.001797)" />
+            <linearGradient
+               x1="509.06769"
+               y1="327.76361"
+               x2="544.86011"
+               y2="399.38104"
+               id="linearGradient3374"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.972249,1.028543)" />
+            <linearGradient
+               x1="591.27606"
+               y1="330.16998"
+               x2="620.33301"
+               y2="382.54678"
+               id="linearGradient3375"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.044357,0.957527)" />
+            <linearGradient
+               x1="566.74347"
+               y1="415.15009"
+               x2="588.13922"
+               y2="458.04449"
+               id="linearGradient3376"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.03551,0.965707)" />
+          </defs>
+          <defs
+             id="defs7938">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient15017"
+               xlink:href="#linearGradient2629"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient7940">
+              <stop
+                 id="stop7941"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop7942"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient7943">
+              <stop
+                 id="stop7944"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop7945"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient7946">
+              <stop
+                 id="stop7947"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop7948"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop7949"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop7950"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop7951"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient7952">
+              <stop
+                 id="stop7953"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop7954"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="28.814428"
+               y1="-1.616316"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient7955"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.764292,1.3084)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient7956"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <linearGradient
+               x1="30.382267"
+               y1="7.5329666"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient7957"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+            <linearGradient
+               x1="25.954844"
+               y1="25.071495"
+               x2="39.781502"
+               y2="27.315489"
+               id="linearGradient7958"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103231)" />
+            <defs
+               id="defs15037">
+              <linearGradient
+                 id="linearGradient7960">
+                <stop
+                   id="stop7961"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop7962"
+                   style="stop-color:#fafbff;stop-opacity:1"
+                   offset="0.25" />
+                <stop
+                   id="stop7963"
+                   style="stop-color:#f0f2fa;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop7964"
+                   style="stop-color:#e1e1e1;stop-opacity:1"
+                   offset="0.75" />
+                <stop
+                   id="stop7965"
+                   style="stop-color:#f5f6ff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient7966">
+                <stop
+                   id="stop7967"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop7968"
+                   style="stop-color:#d0d1d9;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop7969"
+                   style="stop-color:#878b9b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient7970">
+                <stop
+                   id="stop7971"
+                   style="stop-color:#e8e8e8;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop7972"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient7973"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <radialGradient
+                 cx="-77.367622"
+                 cy="42.633839"
+                 r="216.26619"
+                 fx="-80.036034"
+                 fy="44.468376"
+                 id="radialGradient7974"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+              <defs
+                 id="defs7975">
+                <linearGradient
+                   id="linearGradient7976">
+                  <stop
+                     id="stop7977"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop7978"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient7979">
+                  <stop
+                     id="stop7980"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop7981"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop7982"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop7983"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop7984"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient7985">
+                  <stop
+                     id="stop7986"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop7987"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="133.07144"
+                   y1="28.231943"
+                   x2="118.58411"
+                   y2="13.431207"
+                   id="linearGradient7988"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                <linearGradient
+                   x1="30.722504"
+                   y1="28.135216"
+                   x2="39.78149"
+                   y2="27.315481"
+                   id="linearGradient7989"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103232)" />
+                <radialGradient
+                   cx="4.9853168"
+                   cy="108.47158"
+                   r="34.222183"
+                   fx="5.2520976"
+                   fy="108.73115"
+                   id="radialGradient7990"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="36.826332"
+                   y1="75.332558"
+                   x2="25.761681"
+                   y2="135.90358"
+                   id="linearGradient7991"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                <linearGradient
+                   x1="78.675774"
+                   y1="47.411823"
+                   x2="64.05336"
+                   y2="34.302757"
+                   id="linearGradient7992"
+                   xlink:href="#linearGradient4281"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                <defs
+                   id="defs7993">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient7994"
+                     xlink:href="#linearGradient3296"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                </defs>
+              </defs>
+              <linearGradient
+                 x1="88.712402"
+                 y1="138.15012"
+                 x2="104.81104"
+                 y2="151.63045"
+                 id="linearGradient8009"
+                 xlink:href="#linearGradient3305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            </defs>
+          </defs>
+          <radialGradient
+             cx="41.875938"
+             cy="37.865574"
+             r="12.562782"
+             fx="46.384533"
+             fy="37.080399"
+             id="radialGradient8024"
+             xlink:href="#linearGradient1918"
+             gradientUnits="userSpaceOnUse" />
+          <defs
+             id="defs8025">
+            <linearGradient
+               id="linearGradient8026">
+              <stop
+                 id="stop8027"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8028"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8029">
+              <stop
+                 id="stop8030"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8031"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8032">
+              <stop
+                 id="stop8033"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop8034"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop8035"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop8036"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop8037"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8038">
+              <stop
+                 id="stop8039"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8040"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <radialGradient
+               cx="23.756607"
+               cy="60.078049"
+               r="21.026033"
+               fx="23.756607"
+               fy="60.078049"
+               id="radialGradient8041"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+            <linearGradient
+               x1="31.82851"
+               y1="61.778381"
+               x2="33.198818"
+               y2="6.859036"
+               id="linearGradient8042"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+            <radialGradient
+               cx="92.478806"
+               cy="20.827066"
+               r="45.889046"
+               fx="92.478806"
+               fy="20.827066"
+               id="radialGradient8043"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient8044"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+            <linearGradient
+               x1="108.49871"
+               y1="17.573528"
+               x2="185.22578"
+               y2="24.330959"
+               id="linearGradient8045"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+            <linearGradient
+               x1="28.814428"
+               y1="-1.616316"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient8046"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.764292,1.3084)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient8047"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <linearGradient
+               x1="30.382267"
+               y1="7.5329666"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient8048"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+            <linearGradient
+               x1="25.954844"
+               y1="25.071495"
+               x2="39.781502"
+               y2="27.315489"
+               id="linearGradient8049"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103231)" />
+            <radialGradient
+               cx="23.756607"
+               cy="60.078049"
+               r="21.026033"
+               fx="23.756607"
+               fy="60.078049"
+               id="radialGradient8050"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+            <linearGradient
+               x1="31.82851"
+               y1="61.778381"
+               x2="33.198818"
+               y2="6.859036"
+               id="linearGradient49703"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient8052"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient8053"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <radialGradient
+               cx="92.478806"
+               cy="20.827066"
+               r="45.889046"
+               fx="92.478806"
+               fy="20.827066"
+               id="radialGradient8054"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient8055"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+            <defs
+               id="defs8057">
+              <linearGradient
+                 id="linearGradient8058">
+                <stop
+                   id="stop8059"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8060"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8061">
+                <stop
+                   id="stop8062"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop8063"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop8064"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop8065"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop8066"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8067">
+                <stop
+                   id="stop8068"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8069"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <radialGradient
+                 cx="23.756607"
+                 cy="60.078049"
+                 r="21.026033"
+                 fx="23.756607"
+                 fy="60.078049"
+                 id="radialGradient8070"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.006281,0.993758)" />
+              <linearGradient
+                 x1="31.82851"
+                 y1="61.778381"
+                 x2="33.198818"
+                 y2="6.859036"
+                 id="linearGradient8071"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.750054,0,0,1.072718,1.04579,2.663333)" />
+              <radialGradient
+                 cx="92.478806"
+                 cy="20.827066"
+                 r="45.889046"
+                 fx="92.478806"
+                 fy="20.827066"
+                 id="radialGradient8072"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.506767,1.973294)" />
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient8073"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="108.49871"
+                 y1="17.573528"
+                 x2="185.22578"
+                 y2="24.330959"
+                 id="linearGradient8074"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="28.814428"
+                 y1="-1.616316"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient8075"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.764292,1.3084)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient8076"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <linearGradient
+                 x1="30.382267"
+                 y1="7.5329666"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient8077"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+              <linearGradient
+                 x1="25.954844"
+                 y1="25.071495"
+                 x2="39.781502"
+                 y2="27.315489"
+                 id="linearGradient8078"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103231)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient8079"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient8080"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient8081"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs8082">
+                <linearGradient
+                   id="linearGradient8083">
+                  <stop
+                     id="stop8084"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop8085"
+                     style="stop-color:#d0d1d9;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop8086"
+                     style="stop-color:#878b9b;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+              </defs>
+            </defs>
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient8101"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient8102"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(4.745269,-0.536764,1.618211,25.61588,-691.1427,-704.5108)" />
+            <linearGradient
+               x1="-191.46153"
+               y1="37.372372"
+               x2="-165.58835"
+               y2="37.372372"
+               id="linearGradient8103"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient8104"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient8105"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient8106"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient8107"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <linearGradient
+               x1="80.23925"
+               y1="81.05584"
+               x2="18.903805"
+               y2="13.944632"
+               id="linearGradient8108"
+               xlink:href="#linearGradient8157"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.88267,1.132926)" />
+            <linearGradient
+               x1="-19.039936"
+               y1="52.71389"
+               x2="15.223759"
+               y2="111.3392"
+               id="linearGradient8109"
+               xlink:href="#linearGradient3579"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.269095,-0.13167,8.088146e-2,0.779571,0,0)" />
+            <linearGradient
+               x1="71.088333"
+               y1="-6.6212053"
+               x2="97.343185"
+               y2="37.16391"
+               id="linearGradient8110"
+               xlink:href="#linearGradient3579"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.60451,-6.271869e-2,0.1698,1.636615,0,0)" />
+            <linearGradient
+               x1="95.224609"
+               y1="4.4250841"
+               x2="156.67999"
+               y2="20.792826"
+               id="linearGradient8111"
+               xlink:href="#linearGradient3579"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.583097,1.71498)" />
+            <defs
+               id="defs8112">
+              <linearGradient
+                 id="linearGradient8113">
+                <stop
+                   id="stop8114"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8115"
+                   style="stop-color:#fafbff;stop-opacity:1"
+                   offset="0.25" />
+                <stop
+                   id="stop8116"
+                   style="stop-color:#f0f2fa;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop8117"
+                   style="stop-color:#e1e1e1;stop-opacity:1"
+                   offset="0.75" />
+                <stop
+                   id="stop8118"
+                   style="stop-color:#f5f6ff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8119">
+                <stop
+                   id="stop8120"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8121"
+                   style="stop-color:#d0d1d9;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop8122"
+                   style="stop-color:#878b9b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient15201">
+                <stop
+                   id="stop8124"
+                   style="stop-color:#e8e8e8;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8125"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient8126"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <radialGradient
+                 cx="-77.367622"
+                 cy="42.633839"
+                 r="216.26619"
+                 fx="-80.036034"
+                 fy="44.468376"
+                 id="radialGradient8127"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+              <defs
+                 id="defs8128">
+                <linearGradient
+                   id="linearGradient8129">
+                  <stop
+                     id="stop8130"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop8131"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient8132">
+                  <stop
+                     id="stop8133"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop8134"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop8135"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop8136"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop8137"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient8138">
+                  <stop
+                     id="stop8139"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop8140"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="133.07144"
+                   y1="28.231943"
+                   x2="118.58411"
+                   y2="13.431207"
+                   id="linearGradient8141"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                <radialGradient
+                   cx="4.9853168"
+                   cy="108.47158"
+                   r="34.222183"
+                   fx="5.2520976"
+                   fy="108.73115"
+                   id="radialGradient15221"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="36.826332"
+                   y1="75.332558"
+                   x2="25.761681"
+                   y2="135.90358"
+                   id="linearGradient8144"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                <linearGradient
+                   x1="78.675774"
+                   y1="47.411823"
+                   x2="64.05336"
+                   y2="34.302757"
+                   id="linearGradient8145"
+                   xlink:href="#linearGradient4281"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                <defs
+                   id="defs8146">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient8147"
+                     xlink:href="#linearGradient3296"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                </defs>
+              </defs>
+              <linearGradient
+                 x1="88.712402"
+                 y1="138.15012"
+                 x2="104.81104"
+                 y2="151.63045"
+                 id="linearGradient8162"
+                 xlink:href="#linearGradient3305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            </defs>
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient8170"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(10.2395,-1.158248,0.749923,11.8711,-691.1427,-704.5108)" />
+            <linearGradient
+               x1="45.023643"
+               y1="20.534979"
+               x2="181.64224"
+               y2="116.28294"
+               id="linearGradient8171"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.961706,1.039819)" />
+            <radialGradient
+               cx="42.007256"
+               cy="39.007645"
+               r="9.8527927"
+               fx="37.805073"
+               fy="39.239628"
+               id="radialGradient15250"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <radialGradient
+               cx="41.875938"
+               cy="37.865574"
+               r="12.562782"
+               fx="34.828526"
+               fy="31.584183"
+               id="radialGradient15251"
+               xlink:href="#linearGradient1918"
+               gradientUnits="userSpaceOnUse" />
+            <radialGradient
+               cx="41.875938"
+               cy="37.865574"
+               r="12.562782"
+               fx="46.384533"
+               fy="37.080399"
+               id="radialGradient8174"
+               xlink:href="#linearGradient1918"
+               gradientUnits="userSpaceOnUse" />
+            <radialGradient
+               cx="58.3755"
+               cy="22.775043"
+               r="10.998282"
+               fx="53.432022"
+               fy="22.164028"
+               id="radialGradient8175"
+               xlink:href="#linearGradient1954"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="23.770393"
+               y1="95.243881"
+               x2="53.66283"
+               y2="128.85732"
+               id="linearGradient8176"
+               xlink:href="#linearGradient1990"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988302,1.011837)" />
+            <linearGradient
+               x1="81.211525"
+               y1="116.07082"
+               x2="5.4840093"
+               y2="70.989281"
+               id="linearGradient8177"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988302,1.011837)" />
+            <linearGradient
+               x1="68.265488"
+               y1="370.90509"
+               x2="28.057238"
+               y2="332.33322"
+               id="linearGradient15256"
+               xlink:href="#linearGradient1908"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.133936,0.881884)" />
+            <linearGradient
+               x1="104.84399"
+               y1="321.39783"
+               x2="28.429239"
+               y2="277.92343"
+               id="linearGradient8179"
+               xlink:href="#linearGradient1918"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.946639,1.056369)" />
+            <linearGradient
+               x1="78.753586"
+               y1="397.89075"
+               x2="26.172459"
+               y2="351.19708"
+               id="linearGradient15258"
+               xlink:href="#linearGradient1908"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.184518,0.844225)" />
+            <linearGradient
+               x1="17.133598"
+               y1="12.402272"
+               x2="26.262699"
+               y2="12.402272"
+               id="linearGradient8181"
+               xlink:href="#linearGradient1918"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.598611,0.625543)" />
+            <linearGradient
+               x1="49.627895"
+               y1="396.80029"
+               x2="68.691986"
+               y2="424.20239"
+               id="linearGradient8182"
+               xlink:href="#linearGradient1954"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.233739,0.810545)" />
+            <linearGradient
+               x1="76.440941"
+               y1="246.53215"
+               x2="99.764214"
+               y2="262.3847"
+               id="linearGradient15261"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.789568,1.266516)" />
+            <linearGradient
+               x1="101.15012"
+               y1="378.20697"
+               x2="83.709572"
+               y2="352.44403"
+               id="linearGradient15262"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.168503,0.855796)" />
+            <linearGradient
+               x1="48.353672"
+               y1="99.757843"
+               x2="51.658588"
+               y2="103.12432"
+               id="linearGradient8185"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.917519,1.089896)" />
+            <linearGradient
+               x1="23.057707"
+               y1="411.51218"
+               x2="21.61964"
+               y2="422.44498"
+               id="linearGradient8186"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.088969,0.9183)" />
+            <linearGradient
+               x1="41.803413"
+               y1="372.34344"
+               x2="34.710552"
+               y2="376.63461"
+               id="linearGradient8187"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.967013,1.034112)" />
+            <linearGradient
+               x1="27.254147"
+               y1="436.18506"
+               x2="21.609068"
+               y2="441.86893"
+               id="linearGradient8188"
+               xlink:href="#linearGradient1990"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.121334,0.891795)" />
+            <defs
+               id="defs8189">
+              <linearGradient
+                 id="linearGradient8190">
+                <stop
+                   id="stop8191"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="0" />
+                <stop
+                   id="stop8192"
+                   style="stop-color:#000000;stop-opacity:0.11299435"
+                   offset="0.5" />
+                <stop
+                   id="stop8193"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8194">
+                <stop
+                   id="stop8195"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8196"
+                   style="stop-color:#ffffff;stop-opacity:0.07843138"
+                   offset="0.60111111" />
+                <stop
+                   id="stop8197"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8198">
+                <stop
+                   id="stop8199"
+                   style="stop-color:#ffffff;stop-opacity:0.78431374"
+                   offset="0" />
+                <stop
+                   id="stop8200"
+                   style="stop-color:#990000;stop-opacity:0"
+                   offset="0.81" />
+                <stop
+                   id="stop8201"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8202">
+                <stop
+                   id="stop8203"
+                   style="stop-color:#000000;stop-opacity:0.40677965"
+                   offset="0" />
+                <stop
+                   id="stop8204"
+                   style="stop-color:#000000;stop-opacity:0.07344633"
+                   offset="0.6477778" />
+                <stop
+                   id="stop8205"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8206">
+                <stop
+                   id="stop8207"
+                   style="stop-color:#000000;stop-opacity:0.31638417"
+                   offset="0" />
+                <stop
+                   id="stop8208"
+                   style="stop-color:#000000;stop-opacity:0.07909604"
+                   offset="0.5" />
+                <stop
+                   id="stop8209"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8210">
+                <stop
+                   id="stop8211"
+                   style="stop-color:#884631;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8212"
+                   style="stop-color:#df421e;stop-opacity:1"
+                   offset="0.625" />
+                <stop
+                   id="stop8213"
+                   style="stop-color:#efa08e;stop-opacity:1"
+                   offset="0.8125" />
+                <stop
+                   id="stop8214"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.75690609"
+                 y1="0.546875"
+                 x2="-0.62430942"
+                 y2="-0.6796875"
+                 id="linearGradient8225"
+                 xlink:href="#linearGradient1908" />
+              <linearGradient
+                 x1="-9.8228717e-17"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient8226"
+                 xlink:href="#linearGradient1918" />
+              <linearGradient
+                 x1="0.42424244"
+                 y1="0.375"
+                 x2="-0.61818182"
+                 y2="-0.625"
+                 id="linearGradient8227"
+                 xlink:href="#linearGradient1908" />
+              <linearGradient
+                 x1="0.72649574"
+                 y1="0.7734375"
+                 x2="-0.49565217"
+                 y2="0.078125"
+                 id="linearGradient8228"
+                 xlink:href="#linearGradient1918" />
+              <linearGradient
+                 x1="0.85123968"
+                 y1="0.2734375"
+                 x2="0.43801653"
+                 y2="0.5234375"
+                 id="linearGradient8229"
+                 xlink:href="#linearGradient1982" />
+              <linearGradient
+                 x1="0.22047244"
+                 y1="0.09375"
+                 x2="0.81102359"
+                 y2="0.7578125"
+                 id="linearGradient8230"
+                 xlink:href="#linearGradient1990" />
+              <radialGradient
+                 cx="0.5"
+                 cy="0.5"
+                 r="0.5"
+                 fx="0.21951219"
+                 fy="0.25"
+                 id="radialGradient8231"
+                 xlink:href="#linearGradient1918" />
+              <radialGradient
+                 cx="0.5"
+                 cy="0.5"
+                 r="0.5"
+                 fx="0.67944252"
+                 fy="0.46875"
+                 id="radialGradient8232"
+                 xlink:href="#linearGradient1918" />
+              <radialGradient
+                 cx="0.84898806"
+                 cy="0.41226101"
+                 r="0.42322907"
+                 fx="0.56333953"
+                 fy="0.18582444"
+                 id="radialGradient8233"
+                 xlink:href="#linearGradient1918" />
+              <radialGradient
+                 cx="0.5"
+                 cy="0.5"
+                 r="0.5"
+                 fx="0.27526131"
+                 fy="0.47222221"
+                 id="radialGradient8234"
+                 xlink:href="#linearGradient1954" />
+              <radialGradient
+                 cx="0.50522649"
+                 cy="0.54545456"
+                 r="0.39214215"
+                 fx="0.33797911"
+                 fy="0.5546875"
+                 id="radialGradient8237"
+                 xlink:href="#linearGradient1806" />
+              <linearGradient
+                 x1="-0.0051282053"
+                 y1="-0.0703125"
+                 x2="0.90256411"
+                 y2="1.234375"
+                 id="linearGradient8238"
+                 xlink:href="#linearGradient1954" />
+              <linearGradient
+                 x1="-8.569534e-16"
+                 y1="0.25"
+                 x2="0.66666669"
+                 y2="0.703125"
+                 id="linearGradient8239"
+                 xlink:href="#linearGradient1982" />
+              <linearGradient
+                 x1="1.2118226"
+                 y1="1.2734375"
+                 x2="0.34975371"
+                 y2="1.1275703e-16"
+                 id="linearGradient15318"
+                 xlink:href="#linearGradient1982" />
+              <linearGradient
+                 x1="0.50331128"
+                 y1="0.25"
+                 x2="0.4437086"
+                 y2="0.703125"
+                 id="linearGradient8241"
+                 xlink:href="#linearGradient1982" />
+              <linearGradient
+                 x1="0.3539823"
+                 y1="0.484375"
+                 x2="0.46902654"
+                 y2="0.6015625"
+                 id="linearGradient8242"
+                 xlink:href="#linearGradient1982" />
+              <linearGradient
+                 x1="0.50279331"
+                 y1="0.40625"
+                 x2="0.22346368"
+                 y2="0.6875"
+                 id="linearGradient8243"
+                 xlink:href="#linearGradient1990" />
+              <linearGradient
+                 x1="-0.24369748"
+                 y1="0.03125"
+                 x2="1.9411764"
+                 y2="1.5625"
+                 id="linearGradient8244"
+                 xlink:href="#linearGradient1982" />
+              <linearGradient
+                 x1="1.3779528"
+                 y1="0.7109375"
+                 x2="-0.11811024"
+                 y2="-0.1796875"
+                 id="linearGradient8245"
+                 xlink:href="#linearGradient1982" />
+            </defs>
+            <linearGradient
+               x1="45.023643"
+               y1="20.534979"
+               x2="181.64224"
+               y2="116.28294"
+               id="linearGradient8288"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.961706,1.039819)" />
+            <radialGradient
+               cx="42.007256"
+               cy="39.007645"
+               r="9.8527927"
+               fx="37.805073"
+               fy="39.239628"
+               id="radialGradient8289"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <radialGradient
+               cx="41.875938"
+               cy="37.865574"
+               r="12.562782"
+               fx="34.828526"
+               fy="31.584183"
+               id="radialGradient8290"
+               xlink:href="#linearGradient1918"
+               gradientUnits="userSpaceOnUse" />
+            <radialGradient
+               cx="41.875938"
+               cy="37.865574"
+               r="12.562782"
+               fx="46.384533"
+               fy="37.080399"
+               id="radialGradient8291"
+               xlink:href="#linearGradient1918"
+               gradientUnits="userSpaceOnUse" />
+            <radialGradient
+               cx="58.3755"
+               cy="22.775043"
+               r="10.998282"
+               fx="53.432022"
+               fy="22.164028"
+               id="radialGradient8292"
+               xlink:href="#linearGradient1954"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="23.770393"
+               y1="95.243881"
+               x2="53.66283"
+               y2="128.85732"
+               id="linearGradient8293"
+               xlink:href="#linearGradient1990"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988302,1.011837)" />
+            <linearGradient
+               x1="81.211525"
+               y1="116.07082"
+               x2="5.4840093"
+               y2="70.989281"
+               id="linearGradient8294"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988302,1.011837)" />
+            <linearGradient
+               x1="68.265488"
+               y1="370.90509"
+               x2="28.057238"
+               y2="332.33322"
+               id="linearGradient8295"
+               xlink:href="#linearGradient1908"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.133936,0.881884)" />
+            <linearGradient
+               x1="78.753586"
+               y1="397.89075"
+               x2="26.172459"
+               y2="351.19708"
+               id="linearGradient8297"
+               xlink:href="#linearGradient1908"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.184518,0.844225)" />
+            <linearGradient
+               x1="17.133598"
+               y1="12.402272"
+               x2="26.262699"
+               y2="12.402272"
+               id="linearGradient8298"
+               xlink:href="#linearGradient1918"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.598611,0.625543)" />
+            <linearGradient
+               x1="49.627895"
+               y1="396.80029"
+               x2="68.691986"
+               y2="424.20239"
+               id="linearGradient8299"
+               xlink:href="#linearGradient1954"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.233739,0.810545)" />
+            <linearGradient
+               x1="76.440941"
+               y1="246.53215"
+               x2="99.764214"
+               y2="262.3847"
+               id="linearGradient8300"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.789568,1.266516)" />
+            <linearGradient
+               x1="101.15012"
+               y1="378.20697"
+               x2="83.709572"
+               y2="352.44403"
+               id="linearGradient8301"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.168503,0.855796)" />
+            <linearGradient
+               x1="48.353672"
+               y1="99.757843"
+               x2="51.658588"
+               y2="103.12432"
+               id="linearGradient8302"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.917519,1.089896)" />
+            <linearGradient
+               x1="41.803413"
+               y1="372.34344"
+               x2="34.710552"
+               y2="376.63461"
+               id="linearGradient8304"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.967013,1.034112)" />
+            <linearGradient
+               x1="27.254147"
+               y1="436.18506"
+               x2="21.609068"
+               y2="441.86893"
+               id="linearGradient8305"
+               xlink:href="#linearGradient1990"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.121334,0.891795)" />
+            <linearGradient
+               x1="45.023643"
+               y1="20.534979"
+               x2="181.64224"
+               y2="116.28294"
+               id="linearGradient1682"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.961706,1.039819)" />
+            <radialGradient
+               cx="42.007256"
+               cy="39.007645"
+               r="9.8527927"
+               fx="37.805073"
+               fy="39.239628"
+               id="radialGradient8307"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <radialGradient
+               cx="41.875938"
+               cy="37.865574"
+               r="12.562782"
+               fx="34.828526"
+               fy="31.584183"
+               id="radialGradient1684"
+               xlink:href="#linearGradient1918"
+               gradientUnits="userSpaceOnUse" />
+            <radialGradient
+               cx="41.875938"
+               cy="37.865574"
+               r="12.562782"
+               fx="46.384533"
+               fy="37.080399"
+               id="radialGradient8309"
+               xlink:href="#linearGradient1918"
+               gradientUnits="userSpaceOnUse" />
+            <radialGradient
+               cx="58.3755"
+               cy="22.775043"
+               r="10.998282"
+               fx="53.432022"
+               fy="22.164028"
+               id="radialGradient8310"
+               xlink:href="#linearGradient1954"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="81.211525"
+               y1="116.07082"
+               x2="5.4840093"
+               y2="70.989281"
+               id="linearGradient1688"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988302,1.011837)" />
+            <linearGradient
+               x1="68.265488"
+               y1="370.90509"
+               x2="28.057238"
+               y2="332.33322"
+               id="linearGradient8313"
+               xlink:href="#linearGradient1908"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.133936,0.881884)" />
+            <linearGradient
+               x1="78.753586"
+               y1="397.89075"
+               x2="26.172459"
+               y2="351.19708"
+               id="linearGradient8315"
+               xlink:href="#linearGradient1908"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.184518,0.844225)" />
+            <linearGradient
+               x1="17.133598"
+               y1="12.402272"
+               x2="26.262699"
+               y2="12.402272"
+               id="linearGradient49901"
+               xlink:href="#linearGradient1918"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.598611,0.625543)" />
+            <linearGradient
+               x1="76.440941"
+               y1="246.53215"
+               x2="99.764214"
+               y2="262.3847"
+               id="linearGradient49903"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.789568,1.266516)" />
+            <linearGradient
+               x1="101.15012"
+               y1="378.20697"
+               x2="83.709572"
+               y2="352.44403"
+               id="linearGradient8319"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.168503,0.855796)" />
+            <linearGradient
+               x1="48.353672"
+               y1="99.757843"
+               x2="51.658588"
+               y2="103.12432"
+               id="linearGradient8320"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.917519,1.089896)" />
+            <linearGradient
+               x1="23.057707"
+               y1="411.51218"
+               x2="21.61964"
+               y2="422.44498"
+               id="linearGradient8321"
+               xlink:href="#linearGradient1982"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.088969,0.9183)" />
+            <linearGradient
+               x1="27.254147"
+               y1="436.18506"
+               x2="21.609068"
+               y2="441.86893"
+               id="linearGradient8323"
+               xlink:href="#linearGradient1990"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.121334,0.891795)" />
+          </defs>
+          <linearGradient
+             x1="178.64995"
+             y1="179.87529"
+             x2="198.41254"
+             y2="299.24384"
+             id="linearGradient8332"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.034428,0.966718)" />
+          <linearGradient
+             x1="181.35893"
+             y1="177.20132"
+             x2="202.65994"
+             y2="305.862"
+             id="linearGradient8333"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.026679,0.974015)" />
+          <linearGradient
+             x1="182.83167"
+             y1="175.80452"
+             x2="205.01575"
+             y2="309.7991"
+             id="linearGradient8334"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.022962,0.977554)" />
+          <linearGradient
+             x1="177.86378"
+             y1="181.4277"
+             x2="197.19272"
+             y2="298.17694"
+             id="linearGradient8335"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.036891,0.964422)" />
+          <linearGradient
+             x1="55.601124"
+             y1="-30.810305"
+             x2="40.876816"
+             y2="218.58856"
+             id="linearGradient8336"
+             xlink:href="#linearGradient1454"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.082134,0.9241)" />
+          <linearGradient
+             x1="64.116882"
+             y1="47.803505"
+             x2="37.547989"
+             y2="140.37704"
+             id="linearGradient8337"
+             xlink:href="#linearGradient1546"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.329487,0.75217)" />
+          <linearGradient
+             x1="83.123482"
+             y1="92.632271"
+             x2="77.120087"
+             y2="56.941833"
+             id="linearGradient8338"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.162115,0.8605)" />
+          <linearGradient
+             x1="48.88829"
+             y1="90.157753"
+             x2="99.629562"
+             y2="86.570915"
+             id="linearGradient8339"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.162115,0.8605)" />
+          <linearGradient
+             x1="57.724483"
+             y1="184.34286"
+             x2="55.957409"
+             y2="144.17274"
+             id="linearGradient8340"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.636328,0.611124)" />
+          <linearGradient
+             x1="55.045113"
+             y1="85.877014"
+             x2="109.27901"
+             y2="88.11335"
+             id="linearGradient8341"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.162536,0.860189)" />
+          <linearGradient
+             x1="66.679367"
+             y1="28.158081"
+             x2="66.679367"
+             y2="107.53253"
+             id="linearGradient8342"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.1618,0.860733)" />
+          <linearGradient
+             x1="47.242912"
+             y1="77.450203"
+             x2="109.62949"
+             y2="76.102692"
+             id="linearGradient8343"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.1618,0.860733)" />
+          <linearGradient
+             x1="71.901497"
+             y1="69.209007"
+             x2="85.293274"
+             y2="102.17883"
+             id="linearGradient8344"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.179599,0.847746)" />
+          <linearGradient
+             x1="55.239422"
+             y1="97.356407"
+             x2="25.40143"
+             y2="29.790384"
+             id="linearGradient8345"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.942585,1.060912)" />
+          <linearGradient
+             x1="53.647789"
+             y1="101.89593"
+             x2="53.647789"
+             y2="160.91232"
+             id="linearGradient8346"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.289244,0.775649)" />
+          <linearGradient
+             x1="69.363586"
+             y1="56.763401"
+             x2="71.684402"
+             y2="101.294"
+             id="linearGradient8347"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.20398,0.830579)" />
+          <linearGradient
+             x1="28.813946"
+             y1="221.79578"
+             x2="10.582993"
+             y2="235.65099"
+             id="linearGradient8348"
+             xlink:href="#linearGradient1551"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.709409,0.584998)" />
+          <radialGradient
+             cx="24.825565"
+             cy="176.56438"
+             r="42.859913"
+             fx="40.974991"
+             fy="162.11137"
+             id="radialGradient8349"
+             xlink:href="#linearGradient4545"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="693.25439"
+             y1="697.24719"
+             x2="657.74762"
+             y2="677.27399"
+             id="linearGradient8350"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.983783,1.016484)" />
+          <linearGradient
+             x1="681.34058"
+             y1="728.7738"
+             x2="641.37305"
+             y2="705.9129"
+             id="linearGradient8351"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.986777,1.0134)" />
+          <linearGradient
+             x1="649.57269"
+             y1="677.24323"
+             x2="630.47528"
+             y2="668.91809"
+             id="linearGradient8352"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988806,1.011321)" />
+          <linearGradient
+             x1="612.97107"
+             y1="685.40314"
+             x2="641.86005"
+             y2="685.40314"
+             id="linearGradient8353"
+             xlink:href="#linearGradient1749"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.975718,1.024886)" />
+          <linearGradient
+             x1="538.89514"
+             y1="277.2775"
+             x2="575.11407"
+             y2="342.66919"
+             id="linearGradient8354"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.998206,1.001797)" />
+          <linearGradient
+             x1="509.06769"
+             y1="327.76361"
+             x2="544.86011"
+             y2="399.38104"
+             id="linearGradient8355"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.972249,1.028543)" />
+          <linearGradient
+             x1="591.27606"
+             y1="330.16998"
+             x2="620.33301"
+             y2="382.54678"
+             id="linearGradient8356"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.044357,0.957527)" />
+          <linearGradient
+             x1="566.74347"
+             y1="415.15009"
+             x2="588.13922"
+             y2="458.04449"
+             id="linearGradient8357"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.03551,0.965707)" />
+          <defs
+             id="defs8358">
+            <linearGradient
+               id="linearGradient8359">
+              <stop
+                 id="stop8360"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8361"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8362">
+              <stop
+                 id="stop8363"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8364"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8365">
+              <stop
+                 id="stop8366"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop8367"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop8368"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop8369"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop8370"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8371">
+              <stop
+                 id="stop8372"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8373"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient8374"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <defs
+               id="defs8375">
+              <linearGradient
+                 id="linearGradient8376">
+                <stop
+                   id="stop8377"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8378"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8379">
+                <stop
+                   id="stop8380"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop8381"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop8382"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop8383"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop8384"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8385">
+                <stop
+                   id="stop8386"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8387"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <radialGradient
+                 cx="23.756607"
+                 cy="60.078049"
+                 r="21.026033"
+                 fx="23.756607"
+                 fy="60.078049"
+                 id="radialGradient8388"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.006281,0.993758)" />
+              <linearGradient
+                 x1="31.82851"
+                 y1="61.778381"
+                 x2="33.198818"
+                 y2="6.859036"
+                 id="linearGradient8389"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.750054,0,0,1.072718,1.04579,2.663333)" />
+              <radialGradient
+                 cx="92.478806"
+                 cy="20.827066"
+                 r="45.889046"
+                 fx="92.478806"
+                 fy="20.827066"
+                 id="radialGradient8390"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.506767,1.973294)" />
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient8391"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="108.49871"
+                 y1="17.573528"
+                 x2="185.22578"
+                 y2="24.330959"
+                 id="linearGradient8392"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="28.814428"
+                 y1="-1.616316"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient8393"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.764292,1.3084)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient8394"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <linearGradient
+                 x1="30.382267"
+                 y1="7.5329666"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient8395"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+              <linearGradient
+                 x1="25.954844"
+                 y1="25.071495"
+                 x2="39.781502"
+                 y2="27.315489"
+                 id="linearGradient8396"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103231)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient8397"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient8398"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient8399"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs8400">
+                <linearGradient
+                   id="linearGradient8401">
+                  <stop
+                     id="stop8402"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop8403"
+                     style="stop-color:#d0d1d9;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop8404"
+                     style="stop-color:#878b9b;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+              </defs>
+            </defs>
+            <defs
+               id="defs8419">
+              <linearGradient
+                 id="linearGradient8420">
+                <stop
+                   id="stop8421"
+                   style="stop-color:#826647;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8422"
+                   style="stop-color:#575147;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.36627907"
+                 y1="0.8125"
+                 x2="0.36627907"
+                 y2="0.1796875"
+                 id="linearGradient8423"
+                 xlink:href="#linearGradient1136"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="-0.109375"
+                 y1="0.9140625"
+                 x2="1.15625"
+                 y2="0.1796875"
+                 id="linearGradient8424"
+                 xlink:href="#linearGradient1136" />
+            </defs>
+            <radialGradient
+               cx="24.825565"
+               cy="176.56438"
+               r="42.859913"
+               fx="40.974991"
+               fy="162.11137"
+               id="radialGradient8426"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="693.25439"
+               y1="697.24719"
+               x2="657.74762"
+               y2="677.27399"
+               id="linearGradient8427"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.983783,1.016484)" />
+            <linearGradient
+               x1="681.34058"
+               y1="728.7738"
+               x2="641.37305"
+               y2="705.9129"
+               id="linearGradient8428"
+               xlink:href="#linearGradient4021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.986777,1.0134)" />
+            <linearGradient
+               x1="649.57269"
+               y1="677.24323"
+               x2="630.47528"
+               y2="668.91809"
+               id="linearGradient8429"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988806,1.011321)" />
+            <linearGradient
+               x1="647.99902"
+               y1="693.73279"
+               x2="629.89734"
+               y2="683.8114"
+               id="linearGradient8430"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.975718,1.024886)" />
+            <linearGradient
+               x1="538.89514"
+               y1="277.2775"
+               x2="575.11407"
+               y2="342.66919"
+               id="linearGradient8431"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.998206,1.001797)" />
+            <linearGradient
+               x1="509.06769"
+               y1="327.76361"
+               x2="544.86011"
+               y2="399.38104"
+               id="linearGradient8432"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.972249,1.028543)" />
+            <linearGradient
+               x1="591.27606"
+               y1="330.16998"
+               x2="620.33301"
+               y2="382.54678"
+               id="linearGradient8433"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.044357,0.957527)" />
+            <linearGradient
+               x1="566.74347"
+               y1="415.15009"
+               x2="588.13922"
+               y2="458.04449"
+               id="linearGradient8434"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.03551,0.965707)" />
+            <defs
+               id="defs8435">
+              <linearGradient
+                 x1="0.25179857"
+                 y1="-0.0390625"
+                 x2="0.53237408"
+                 y2="0.5234375"
+                 id="linearGradient8436"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.092198581"
+                 y1="-0.2109375"
+                 x2="0.4822695"
+                 y2="0.4921875"
+                 id="linearGradient8437"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.016528925"
+                 y1="-0.4921875"
+                 x2="0.51239669"
+                 y2="0.5"
+                 id="linearGradient8438"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="0.05511811"
+                 y1="-0.3046875"
+                 x2="0.53543305"
+                 y2="0.5625"
+                 id="linearGradient8439"
+                 xlink:href="#linearGradient4215" />
+              <linearGradient
+                 x1="1.2125034"
+                 y1="0.78833276"
+                 x2="0.5859077"
+                 y2="0.44490069"
+                 id="linearGradient8440"
+                 xlink:href="#linearGradient4215"
+                 gradientTransform="scale(0.999075,1.000926)" />
+              <linearGradient
+                 id="linearGradient8441">
+                <stop
+                   id="stop8442"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8443"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.1610887"
+                 y1="0.61942029"
+                 x2="0.47761098"
+                 y2="0.3214713"
+                 id="linearGradient8444"
+                 xlink:href="#linearGradient4215"
+                 gradientTransform="scale(1.003618,0.996395)" />
+              <linearGradient
+                 x1="1.8455285"
+                 y1="1.34375"
+                 x2="0.47967479"
+                 y2="0.5625"
+                 id="linearGradient8445"
+                 xlink:href="#linearGradient4021" />
+              <linearGradient
+                 id="linearGradient8446">
+                <stop
+                   id="stop8447"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8448"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.7519705"
+                 y1="1.0528145"
+                 x2="0.54093099"
+                 y2="0.37158158"
+                 id="linearGradient8449"
+                 xlink:href="#linearGradient4021"
+                 gradientTransform="scale(0.990884,1.0092)" />
+              <linearGradient
+                 x1="0.24528302"
+                 y1="1.6015625"
+                 x2="0.28301886"
+                 y2="-0.0234375"
+                 id="linearGradient8450"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.89719623"
+                 y1="-0.1484375"
+                 x2="0.40186915"
+                 y2="0.5546875"
+                 id="linearGradient8451"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.90588236"
+                 y1="-0.2734375"
+                 x2="0.36470589"
+                 y2="0.5078125"
+                 id="linearGradient8452"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.56809336"
+                 y1="-0.125"
+                 x2="0.49027237"
+                 y2="0.59375"
+                 id="linearGradient8453"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="1.4128441"
+                 y1="1.25"
+                 x2="0.42201835"
+                 y2="0.4140625"
+                 id="linearGradient8454"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.084848486"
+                 y1="1.1640625"
+                 x2="0.53333336"
+                 y2="0.359375"
+                 id="linearGradient8455"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.76190478"
+                 y1="-0.53125"
+                 x2="0.6857143"
+                 y2="0.5390625"
+                 id="linearGradient8456"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 id="linearGradient8457">
+                <stop
+                   id="stop8458"
+                   style="stop-color:#ffffff;stop-opacity:0.83615822"
+                   offset="0" />
+                <stop
+                   id="stop8459"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="2.2054794"
+                 y1="2.03125"
+                 x2="0.56164384"
+                 y2="-0.28125"
+                 id="linearGradient8460"
+                 xlink:href="#linearGradient4823" />
+              <linearGradient
+                 x1="0.88832486"
+                 y1="1.0390625"
+                 x2="0.55837566"
+                 y2="0.3046875"
+                 id="linearGradient8461"
+                 xlink:href="#linearGradient1806" />
+              <linearGradient
+                 x1="0.85217392"
+                 y1="0.9609375"
+                 x2="0.86086959"
+                 y2="0.296875"
+                 id="linearGradient8462"
+                 xlink:href="#linearGradient1806" />
+              <linearGradient
+                 x1="0.064220183"
+                 y1="1.4375"
+                 x2="0.22018349"
+                 y2="0.3125"
+                 id="linearGradient8463"
+                 xlink:href="#linearGradient3970" />
+              <linearGradient
+                 id="linearGradient8464">
+                <stop
+                   id="stop8465"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8466"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="1.1011236"
+                 y1="0.7421875"
+                 x2="0.033707865"
+                 y2="0.5703125"
+                 id="linearGradient8467"
+                 xlink:href="#linearGradient3970" />
+              <linearGradient
+                 id="linearGradient8468">
+                <stop
+                   id="stop8469"
+                   style="stop-color:#000000;stop-opacity:0.2937853"
+                   offset="0" />
+                <stop
+                   id="stop8470"
+                   style="stop-color:#000000;stop-opacity:0.06214689"
+                   offset="0.6477778" />
+                <stop
+                   id="stop8471"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <radialGradient
+                 cx="0.49032259"
+                 cy="0.50649351"
+                 r="0.38170236"
+                 fx="0.63414633"
+                 fy="0.37777779"
+                 id="radialGradient8472"
+                 xlink:href="#linearGradient1806" />
+            </defs>
+            <linearGradient
+               x1="647.99902"
+               y1="693.73279"
+               x2="629.89734"
+               y2="683.8114"
+               id="linearGradient8517"
+               xlink:href="#linearGradient4215"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.975718,1.024886)" />
+          </defs>
+          <radialGradient
+             cx="24.825565"
+             cy="176.56438"
+             r="42.859913"
+             fx="40.974991"
+             fy="162.11137"
+             id="radialGradient8525"
+             xlink:href="#linearGradient4545"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="693.25439"
+             y1="697.24719"
+             x2="657.74762"
+             y2="677.27399"
+             id="linearGradient8526"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.983783,1.016484)" />
+          <linearGradient
+             x1="681.34058"
+             y1="728.7738"
+             x2="641.37305"
+             y2="705.9129"
+             id="linearGradient8527"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.986777,1.0134)" />
+          <linearGradient
+             x1="649.57269"
+             y1="677.24323"
+             x2="630.47528"
+             y2="668.91809"
+             id="linearGradient8528"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988806,1.011321)" />
+          <linearGradient
+             x1="612.97107"
+             y1="685.40314"
+             x2="641.86005"
+             y2="685.40314"
+             id="linearGradient8529"
+             xlink:href="#linearGradient1749"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.975718,1.024886)" />
+          <linearGradient
+             x1="538.89514"
+             y1="277.2775"
+             x2="575.11407"
+             y2="342.66919"
+             id="linearGradient8530"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.998206,1.001797)" />
+          <linearGradient
+             x1="509.06769"
+             y1="327.76361"
+             x2="544.86011"
+             y2="399.38104"
+             id="linearGradient8531"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.972249,1.028543)" />
+          <linearGradient
+             x1="591.27606"
+             y1="330.16998"
+             x2="620.33301"
+             y2="382.54678"
+             id="linearGradient8532"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.044357,0.957527)" />
+          <linearGradient
+             x1="566.74347"
+             y1="415.15009"
+             x2="588.13922"
+             y2="458.04449"
+             id="linearGradient8533"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.03551,0.965707)" />
+          <linearGradient
+             x1="179.83598"
+             y1="178.66379"
+             x2="200.25706"
+             y2="302.00961"
+             id="linearGradient8534"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.030776,0.970143)" />
+          <linearGradient
+             x1="178.64995"
+             y1="179.87529"
+             x2="198.41254"
+             y2="299.24384"
+             id="linearGradient8535"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.034428,0.966718)" />
+          <linearGradient
+             x1="181.35893"
+             y1="177.20132"
+             x2="202.65994"
+             y2="305.862"
+             id="linearGradient8536"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.026679,0.974015)" />
+          <linearGradient
+             x1="182.83167"
+             y1="175.80452"
+             x2="205.01575"
+             y2="309.7991"
+             id="linearGradient8537"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.022962,0.977554)" />
+          <linearGradient
+             x1="177.86378"
+             y1="181.4277"
+             x2="197.19272"
+             y2="298.17694"
+             id="linearGradient8538"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.036891,0.964422)" />
+          <linearGradient
+             x1="55.601124"
+             y1="-30.810305"
+             x2="40.876816"
+             y2="218.58856"
+             id="linearGradient8539"
+             xlink:href="#linearGradient1454"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.082134,0.9241)" />
+          <linearGradient
+             x1="64.116882"
+             y1="47.803505"
+             x2="37.547989"
+             y2="140.37704"
+             id="linearGradient8540"
+             xlink:href="#linearGradient1546"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.329487,0.75217)" />
+          <linearGradient
+             x1="83.123482"
+             y1="92.632271"
+             x2="77.120087"
+             y2="56.941833"
+             id="linearGradient8541"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.162115,0.8605)" />
+          <linearGradient
+             x1="48.88829"
+             y1="90.157753"
+             x2="99.629562"
+             y2="86.570915"
+             id="linearGradient8542"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.162115,0.8605)" />
+          <linearGradient
+             x1="57.724483"
+             y1="184.34286"
+             x2="55.957409"
+             y2="144.17274"
+             id="linearGradient8543"
+             xlink:href="#linearGradient1502"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.636328,0.611124)" />
+          <linearGradient
+             x1="55.045113"
+             y1="85.877014"
+             x2="109.27901"
+             y2="88.11335"
+             id="linearGradient8544"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.162536,0.860189)" />
+          <linearGradient
+             x1="66.679367"
+             y1="28.158081"
+             x2="66.679367"
+             y2="107.53253"
+             id="linearGradient8545"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.1618,0.860733)" />
+          <linearGradient
+             x1="47.242912"
+             y1="77.450203"
+             x2="109.62949"
+             y2="76.102692"
+             id="linearGradient8546"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.1618,0.860733)" />
+          <linearGradient
+             x1="71.901497"
+             y1="69.209007"
+             x2="85.293274"
+             y2="102.17883"
+             id="linearGradient8547"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.179599,0.847746)" />
+          <linearGradient
+             x1="55.239422"
+             y1="97.356407"
+             x2="25.40143"
+             y2="29.790384"
+             id="linearGradient8548"
+             xlink:href="#linearGradient1461"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.942585,1.060912)" />
+          <linearGradient
+             x1="53.647789"
+             y1="101.89593"
+             x2="53.647789"
+             y2="160.91232"
+             id="linearGradient8549"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.289244,0.775649)" />
+          <linearGradient
+             x1="69.363586"
+             y1="56.763401"
+             x2="71.684402"
+             y2="101.294"
+             id="linearGradient8550"
+             xlink:href="#linearGradient1494"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.20398,0.830579)" />
+          <linearGradient
+             x1="28.813946"
+             y1="221.79578"
+             x2="10.582993"
+             y2="235.65099"
+             id="linearGradient8551"
+             xlink:href="#linearGradient1551"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.709409,0.584998)" />
+          <radialGradient
+             cx="24.825565"
+             cy="176.56438"
+             r="42.859913"
+             fx="40.974991"
+             fy="162.11137"
+             id="radialGradient8552"
+             xlink:href="#linearGradient4545"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="693.25439"
+             y1="697.24719"
+             x2="657.74762"
+             y2="677.27399"
+             id="linearGradient8553"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.983783,1.016484)" />
+          <linearGradient
+             x1="681.34058"
+             y1="728.7738"
+             x2="641.37305"
+             y2="705.9129"
+             id="linearGradient8554"
+             xlink:href="#linearGradient4021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.986777,1.0134)" />
+          <linearGradient
+             x1="649.57269"
+             y1="677.24323"
+             x2="630.47528"
+             y2="668.91809"
+             id="linearGradient8555"
+             xlink:href="#linearGradient3256"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.988806,1.011321)" />
+          <linearGradient
+             x1="612.97107"
+             y1="685.40314"
+             x2="641.86005"
+             y2="685.40314"
+             id="linearGradient8556"
+             xlink:href="#linearGradient2629"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.975718,1.024886)"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="538.89514"
+             y1="277.2775"
+             x2="575.11407"
+             y2="342.66919"
+             id="linearGradient8557"
+             xlink:href="#linearGradient3256"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.998206,1.001797)" />
+          <linearGradient
+             x1="509.06769"
+             y1="327.76361"
+             x2="544.86011"
+             y2="399.38104"
+             id="linearGradient8558"
+             xlink:href="#linearGradient3256"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.972249,1.028543)" />
+          <linearGradient
+             x1="591.27606"
+             y1="330.16998"
+             x2="620.33301"
+             y2="382.54678"
+             id="linearGradient8559"
+             xlink:href="#linearGradient3256"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.044357,0.957527)" />
+          <linearGradient
+             x1="566.74347"
+             y1="415.15009"
+             x2="588.13922"
+             y2="458.04449"
+             id="linearGradient15638"
+             xlink:href="#linearGradient3256"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.03551,0.965707)" />
+          <linearGradient
+             x1="27.172323"
+             y1="135.45018"
+             x2="51.170948"
+             y2="159.60898"
+             id="linearGradient8561"
+             xlink:href="#linearGradient3057"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.56826,0,0,0.43693,60.1476,67.44818)"
+             spreadMethod="pad" />
+          <defs
+             id="defs8562">
+            <linearGradient
+               id="linearGradient8563">
+              <stop
+                 id="stop8564"
+                 style="stop-color:#e28700;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8565"
+                 style="stop-color:#ffdbaf;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8566">
+              <stop
+                 id="stop8567"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="0" />
+              <stop
+                 id="stop8568"
+                 style="stop-color:#ffffff;stop-opacity:0.01568628"
+                 offset="0.25315788" />
+              <stop
+                 id="stop8569"
+                 style="stop-color:#ffffff;stop-opacity:0.69999999"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8570">
+              <stop
+                 id="stop8571"
+                 style="stop-color:#000000;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8572"
+                 style="stop-color:#000000;stop-opacity:0.76612902"
+                 offset="0.87947369" />
+              <stop
+                 id="stop8573"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8574">
+              <stop
+                 id="stop8575"
+                 style="stop-color:#5ea730;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8576"
+                 style="stop-color:#8eef2c;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8577">
+              <stop
+                 id="stop8578"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8579"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8580">
+              <stop
+                 id="stop8581"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8582"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8583">
+              <stop
+                 id="stop8584"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop8585"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop8586"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop8587"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop8588"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8589">
+              <stop
+                 id="stop8590"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8591"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <radialGradient
+               cx="23.756607"
+               cy="60.078049"
+               r="21.026033"
+               fx="23.756607"
+               fy="60.078049"
+               id="radialGradient8592"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+            <linearGradient
+               x1="31.82851"
+               y1="61.778381"
+               x2="33.198818"
+               y2="6.859036"
+               id="linearGradient15671"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+            <radialGradient
+               cx="92.478806"
+               cy="20.827066"
+               r="45.889046"
+               fx="92.478806"
+               fy="20.827066"
+               id="radialGradient15672"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient8595"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+            <linearGradient
+               x1="108.49871"
+               y1="17.573528"
+               x2="185.22578"
+               y2="24.330959"
+               id="linearGradient15674"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+            <linearGradient
+               x1="28.814428"
+               y1="-1.616316"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient15675"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.764292,1.3084)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient50122"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <linearGradient
+               x1="30.382267"
+               y1="7.5329666"
+               x2="47.366039"
+               y2="22.769617"
+               id="linearGradient15677"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+            <linearGradient
+               x1="25.954844"
+               y1="25.071495"
+               x2="39.781502"
+               y2="27.315489"
+               id="linearGradient8600"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103231)" />
+            <linearGradient
+               x1="74.915154"
+               y1="289.24429"
+               x2="74.915154"
+               y2="143.41141"
+               id="linearGradient8601"
+               xlink:href="#linearGradient869"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.402029,0.713252)" />
+            <linearGradient
+               x1="66.81208"
+               y1="253.09772"
+               x2="66.81208"
+               y2="329.44394"
+               id="linearGradient8602"
+               xlink:href="#linearGradient883"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.599772,0.625089)" />
+            <linearGradient
+               x1="114.98484"
+               y1="133.38522"
+               x2="114.98484"
+               y2="15.619798"
+               id="linearGradient8603"
+               xlink:href="#linearGradient875"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.93614,1.068216)" />
+            <linearGradient
+               x1="76.700623"
+               y1="73.338425"
+               x2="76.700623"
+               y2="20.345196"
+               id="linearGradient8604"
+               xlink:href="#linearGradient940"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.099362,0.909619)" />
+            <defs
+               id="defs8606">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient8607"
+                 xlink:href="#linearGradient2208"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient8608"
+                 xlink:href="#linearGradient2220"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient8609">
+                <stop
+                   id="stop8610"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="0" />
+                <stop
+                   id="stop8611"
+                   style="stop-color:#ffffff;stop-opacity:0.57254905"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient8612"
+                 xlink:href="#linearGradient1579"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient50138">
+                <stop
+                   id="stop8614"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="0" />
+                <stop
+                   id="stop8615"
+                   style="stop-color:#ffffff;stop-opacity:0.49193549"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient8616"
+                 xlink:href="#linearGradient2204"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient8617">
+                <stop
+                   id="stop8618"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="0" />
+                <stop
+                   id="stop8619"
+                   style="stop-color:#ffffff;stop-opacity:0.57254905"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8620">
+                <stop
+                   id="stop8621"
+                   style="stop-color:#dddddd;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8622"
+                   style="stop-color:#f5f5f5;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0.49285713"
+                 y1="0.98591548"
+                 x2="0.49285713"
+                 y2="7.0833374e-16"
+                 id="linearGradient8623"
+                 xlink:href="#linearGradient869" />
+              <linearGradient
+                 x1="0.46031743"
+                 y1="0.98591542"
+                 x2="0.46031743"
+                 y2="0.0070422594"
+                 id="linearGradient8624"
+                 xlink:href="#linearGradient875" />
+              <linearGradient
+                 x1="0.48823529"
+                 y1="1.0070423"
+                 x2="0.48823529"
+                 y2="-0.0070422534"
+                 id="linearGradient2963"
+                 xlink:href="#linearGradient940" />
+              <linearGradient
+                 x1="0.49224809"
+                 y1="0.0070421356"
+                 x2="0.49224809"
+                 y2="0.99295789"
+                 id="linearGradient8626"
+                 xlink:href="#linearGradient883" />
+              <radialGradient
+                 cx="0.5"
+                 cy="0.5"
+                 r="0.5"
+                 fx="0.5"
+                 fy="0.5"
+                 id="radialGradient8627"
+                 xlink:href="#linearGradient930" />
+            </defs>
+            <linearGradient
+               x1="114.98484"
+               y1="133.38522"
+               x2="114.98484"
+               y2="15.619798"
+               id="linearGradient15744"
+               xlink:href="#linearGradient875"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.93614,1.068216)" />
+            <linearGradient
+               x1="76.700623"
+               y1="73.338425"
+               x2="76.700623"
+               y2="20.345196"
+               id="linearGradient15745"
+               xlink:href="#linearGradient940"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.099362,0.909619)" />
+            <linearGradient
+               x1="74.915154"
+               y1="289.24429"
+               x2="74.915154"
+               y2="143.41141"
+               id="linearGradient15746"
+               xlink:href="#linearGradient869"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.402029,0.713252)" />
+            <linearGradient
+               x1="66.81208"
+               y1="253.09772"
+               x2="66.81208"
+               y2="329.44394"
+               id="linearGradient8669"
+               xlink:href="#linearGradient883"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.599772,0.625089)" />
+            <linearGradient
+               x1="58.919556"
+               y1="110.96445"
+               x2="52.629063"
+               y2="161.4733"
+               id="linearGradient8670"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.063095,0,0,0.819358,3.271898,9.280837)" />
+          </defs>
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient8678"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient8679"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient8680"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient8681"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <defs
+             id="defs8682">
+            <linearGradient
+               id="linearGradient8683">
+              <stop
+                 id="stop8684"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8685"
+                 style="stop-color:#fafbff;stop-opacity:1"
+                 offset="0.25" />
+              <stop
+                 id="stop8686"
+                 style="stop-color:#f0f2fa;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop8687"
+                 style="stop-color:#e1e1e1;stop-opacity:1"
+                 offset="0.75" />
+              <stop
+                 id="stop8688"
+                 style="stop-color:#f5f6ff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8689">
+              <stop
+                 id="stop8690"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8691"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop8692"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8693">
+              <stop
+                 id="stop8694"
+                 style="stop-color:#e8e8e8;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8695"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient8696"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient8697"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <defs
+               id="defs8698">
+              <linearGradient
+                 id="linearGradient8699">
+                <stop
+                   id="stop8700"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8701"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8702">
+                <stop
+                   id="stop8703"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop8704"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop8705"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop8706"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop8707"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8708">
+                <stop
+                   id="stop8709"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8710"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient8711"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient8712"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient8713"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient8714"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient8715"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs8716">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient8717"
+                   xlink:href="#linearGradient3296"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+              </defs>
+            </defs>
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient8732"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          </defs>
+          <linearGradient
+             x1="52.683483"
+             y1="104.09244"
+             x2="58.380398"
+             y2="252.54866"
+             id="linearGradient8740"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.334689,0,0,1.038479,-0.72121,-66.60727)" />
+          <linearGradient
+             x1="52.19524"
+             y1="64.818008"
+             x2="52.19524"
+             y2="122.69208"
+             id="linearGradient8741"
+             xlink:href="#linearGradient2483"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.111523,0,0,0.771568,-0.72121,-29.98157)" />
+          <linearGradient
+             x1="29.958502"
+             y1="-23.328955"
+             x2="29.958502"
+             y2="190.05157"
+             id="linearGradient8742"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.127153,0,0,0.781382,0.981463,-27.99057)" />
+          <linearGradient
+             x1="96.41098"
+             y1="57.341877"
+             x2="81.065781"
+             y2="196.048"
+             id="linearGradient8743"
+             xlink:href="#linearGradient2871"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.176531,0,0,0.821515,0,4.496065)" />
+          <linearGradient
+             x1="483.2298"
+             y1="97.833481"
+             x2="562.21454"
+             y2="1064.5424"
+             id="linearGradient8744"
+             xlink:href="#linearGradient1531"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.502271,0.665659)" />
+          <linearGradient
+             x1="314.50467"
+             y1="2690.406"
+             x2="384.80078"
+             y2="2690.406"
+             id="linearGradient8745"
+             xlink:href="#linearGradient3540"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(4.209444,0.237561)" />
+          <radialGradient
+             cx="41.875938"
+             cy="37.865574"
+             r="12.562782"
+             fx="42.023739"
+             fy="37.865574"
+             id="radialGradient8746"
+             xlink:href="#linearGradient4066"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="11276.761"
+             y1="5908"
+             x2="-10290.378"
+             y2="8376.0635"
+             id="linearGradient8747"
+             xlink:href="#linearGradient3296"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="11701.849"
+             y1="13028.776"
+             x2="15175.786"
+             y2="9521.5176"
+             id="linearGradient8748"
+             xlink:href="#linearGradient3916"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(5.464784e-3,0,0,5.325523e-3,191.6882,44.23734)" />
+          <linearGradient
+             x1="251.82268"
+             y1="115.52762"
+             x2="296.51724"
+             y2="115.52762"
+             id="linearGradient8749"
+             xlink:href="#linearGradient3636"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.986883,1.013292)" />
+          <linearGradient
+             x1="-161.57674"
+             y1="253.95526"
+             x2="-116.53033"
+             y2="311.73874"
+             id="linearGradient8750"
+             xlink:href="#linearGradient4063"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.846674,0.343014,0.288328,0.736755,18.9977,-80.1446)" />
+          <linearGradient
+             x1="42.53046"
+             y1="133.41551"
+             x2="53.520744"
+             y2="163.73753"
+             id="linearGradient8751"
+             xlink:href="#linearGradient4063"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-1.790967,0.310143,0.182364,0.974268,282.562,-80.82299)" />
+          <linearGradient
+             x1="248.30553"
+             y1="198.48206"
+             x2="257.16309"
+             y2="148.14442"
+             id="linearGradient8752"
+             xlink:href="#linearGradient3913"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.842789,0,0,0.800919,18.7268,-73.96861)" />
+          <defs
+             id="defs8753">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient8754"
+               xlink:href="#linearGradient6942"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient8755">
+              <stop
+                 id="stop8756"
+                 style="stop-color:#ffffff;stop-opacity:0.74901962"
+                 offset="0" />
+              <stop
+                 id="stop8757"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8758">
+              <stop
+                 id="stop8759"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8760"
+                 style="stop-color:#ffffff;stop-opacity:0.35164836"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8761">
+              <stop
+                 id="stop8762"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8763"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient8764">
+              <stop
+                 id="stop8765"
+                 style="stop-color:#7e818c;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop8766"
+                 style="stop-color:#d5dbed;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="84.960785"
+               y1="92.151367"
+               x2="42.64373"
+               y2="53.360722"
+               id="linearGradient8767"
+               xlink:href="#linearGradient1749"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.321949,0.756459)" />
+            <linearGradient
+               x1="31.82851"
+               y1="61.778381"
+               x2="33.198818"
+               y2="6.859036"
+               id="linearGradient8768"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+            <linearGradient
+               x1="186.07457"
+               y1="23.533224"
+               x2="202.6377"
+               y2="23.47304"
+               id="linearGradient8769"
+               xlink:href="#linearGradient2689"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.388045,2.57702)" />
+            <linearGradient
+               x1="92.631454"
+               y1="54.989693"
+               x2="92.631454"
+               y2="50.608093"
+               id="linearGradient8770"
+               xlink:href="#linearGradient1757"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.787838,1.269296)" />
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient8771"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+            <linearGradient
+               x1="1270.3132"
+               y1="4.8765283"
+               x2="1247.6848"
+               y2="0.72310239"
+               id="linearGradient8772"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(9.440723e-2,10.59241)" />
+            <linearGradient
+               x1="1270.3132"
+               y1="4.8765283"
+               x2="1247.6848"
+               y2="0.72310239"
+               id="linearGradient8773"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+            <linearGradient
+               x1="-191.46153"
+               y1="37.372372"
+               x2="-165.58835"
+               y2="37.372372"
+               id="linearGradient8774"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient8775"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient8776"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient8777"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient8778"
+               xlink:href="#linearGradient2678"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient8779"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+            <linearGradient
+               x1="104.09006"
+               y1="83.359146"
+               x2="123.82494"
+               y2="70.956947"
+               id="linearGradient8780"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient8781"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+            <linearGradient
+               x1="10.145814"
+               y1="21.762129"
+               x2="19.678274"
+               y2="15.811033"
+               id="linearGradient8782"
+               xlink:href="#linearGradient1930"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+            <linearGradient
+               x1="226.35037"
+               y1="198.74835"
+               x2="174.43694"
+               y2="217.6319"
+               id="linearGradient8783"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.959874,1.041804)" />
+            <linearGradient
+               x1="-94.151642"
+               y1="379.97745"
+               x2="-100.4097"
+               y2="374.03232"
+               id="linearGradient8784"
+               xlink:href="#linearGradient1870"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.088448,0.91874)" />
+            <linearGradient
+               x1="97.345161"
+               y1="112.84396"
+               x2="99.20697"
+               y2="115.81121"
+               id="linearGradient8785"
+               xlink:href="#linearGradient2560"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.206907,0.828564)"
+               spreadMethod="reflect" />
+            <linearGradient
+               x1="-13.15085"
+               y1="250.48668"
+               x2="-5.590662"
+               y2="258.31036"
+               id="linearGradient8786"
+               xlink:href="#linearGradient2560"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+            <linearGradient
+               x1="240.97612"
+               y1="200.61511"
+               x2="231.89941"
+               y2="205.45764"
+               id="linearGradient8787"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.866855,1.153596)" />
+            <linearGradient
+               x1="7.1050277"
+               y1="221.98289"
+               x2="46.488174"
+               y2="259.94464"
+               id="linearGradient8788"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+            <linearGradient
+               x1="7.1050277"
+               y1="221.98289"
+               x2="46.488174"
+               y2="259.94464"
+               id="linearGradient8789"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+            <defs
+               id="defs8790">
+              <linearGradient
+                 id="linearGradient8791">
+                <stop
+                   id="stop8792"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8793"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient15872">
+                <stop
+                   id="stop8795"
+                   style="stop-color:#c86f32;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8796"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8797">
+                <stop
+                   id="stop8798"
+                   style="stop-color:#d88721;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8799"
+                   style="stop-color:#a85c00;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop8800"
+                   style="stop-color:#643e0e;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8801">
+                <stop
+                   id="stop8802"
+                   style="stop-color:#868686;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8803"
+                   style="stop-color:#e2e2e2;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8804">
+                <stop
+                   id="stop8805"
+                   style="stop-color:#ff9870;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8806"
+                   style="stop-color:#ffd8c9;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8807">
+                <stop
+                   id="stop8808"
+                   style="stop-color:#ffd7c0;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8809"
+                   style="stop-color:#ffbc96;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8810">
+                <stop
+                   id="stop8811"
+                   style="stop-color:#ffbc96;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8812"
+                   style="stop-color:#ffeafe;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient2965">
+                <stop
+                   id="stop8814"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8815"
+                   style="stop-color:#fafbff;stop-opacity:1"
+                   offset="0.25" />
+                <stop
+                   id="stop8816"
+                   style="stop-color:#f0f2fa;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop8817"
+                   style="stop-color:#e1e1e1;stop-opacity:1"
+                   offset="0.75" />
+                <stop
+                   id="stop8818"
+                   style="stop-color:#f5f6ff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8819">
+                <stop
+                   id="stop8820"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8821"
+                   style="stop-color:#d0d1d9;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop8822"
+                   style="stop-color:#878b9b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8823">
+                <stop
+                   id="stop8824"
+                   style="stop-color:#e8e8e8;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8825"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient15904"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <radialGradient
+                 cx="-77.367622"
+                 cy="42.633839"
+                 r="216.26619"
+                 fx="-80.036034"
+                 fy="44.468376"
+                 id="radialGradient15905"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+              <defs
+                 id="defs8828">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient8829"
+                   xlink:href="#linearGradient1884"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient15908">
+                  <stop
+                     id="stop8831"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop8832"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop8833"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop8834"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop8835"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient8836">
+                  <stop
+                     id="stop8837"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop8838"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="133.07144"
+                   y1="28.231943"
+                   x2="118.58411"
+                   y2="13.431207"
+                   id="linearGradient8839"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                <linearGradient
+                   x1="30.722504"
+                   y1="28.135216"
+                   x2="39.78149"
+                   y2="27.315481"
+                   id="linearGradient8840"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103232)" />
+                <radialGradient
+                   cx="4.9853168"
+                   cy="108.47158"
+                   r="34.222183"
+                   fx="5.2520976"
+                   fy="108.73115"
+                   id="radialGradient15919"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="36.826332"
+                   y1="75.332558"
+                   x2="25.761681"
+                   y2="135.90358"
+                   id="linearGradient8842"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                <linearGradient
+                   x1="78.675774"
+                   y1="47.411823"
+                   x2="64.05336"
+                   y2="34.302757"
+                   id="linearGradient8843"
+                   xlink:href="#linearGradient4281"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                <defs
+                   id="defs8844">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient15923"
+                     xlink:href="#linearGradient3296"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                </defs>
+              </defs>
+              <linearGradient
+                 x1="88.712402"
+                 y1="138.15012"
+                 x2="104.81104"
+                 y2="151.63045"
+                 id="linearGradient8860"
+                 xlink:href="#linearGradient3305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+              <defs
+                 id="defs8861">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient8862"
+                   xlink:href="#linearGradient1863"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient8863"
+                   xlink:href="#linearGradient2560"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient8864"
+                   xlink:href="#linearGradient1926"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient8865"
+                   xlink:href="#linearGradient1302"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="96.346039"
+                   y1="84.428337"
+                   x2="121.44556"
+                   y2="65.093857"
+                   id="linearGradient8866"
+                   xlink:href="#linearGradient1716"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.962035,0,0,1.039463,0.899729,-0.17995)" />
+                <linearGradient
+                   x1="104.09006"
+                   y1="83.359146"
+                   x2="123.82494"
+                   y2="70.956947"
+                   id="linearGradient8867"
+                   xlink:href="#linearGradient1724"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.028242,0.972534)" />
+                <linearGradient
+                   x1="100.76616"
+                   y1="77.379333"
+                   x2="125.25793"
+                   y2="77.379333"
+                   id="linearGradient8868"
+                   xlink:href="#linearGradient1724"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.028607,0.972188)" />
+                <linearGradient
+                   x1="97.345161"
+                   y1="112.84396"
+                   x2="99.20697"
+                   y2="115.81121"
+                   id="linearGradient8869"
+                   xlink:href="#linearGradient1741"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.206907,0.828564)"
+                   spreadMethod="reflect" />
+                <linearGradient
+                   x1="168.2516"
+                   y1="181.01073"
+                   x2="185.96996"
+                   y2="172.51707"
+                   id="linearGradient8870"
+                   xlink:href="#linearGradient4873"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.959874,0,0,1.041804,24.17578,34.86402)" />
+                <linearGradient
+                   x1="97.281265"
+                   y1="84.255211"
+                   x2="127.84677"
+                   y2="61.142742"
+                   id="linearGradient8871"
+                   xlink:href="#linearGradient1716"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.962035,1.039463)" />
+                <linearGradient
+                   x1="104.09006"
+                   y1="83.359146"
+                   x2="123.82494"
+                   y2="70.956947"
+                   id="linearGradient8872"
+                   xlink:href="#linearGradient1724"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.028242,0.972534)" />
+                <linearGradient
+                   x1="100.76616"
+                   y1="77.379333"
+                   x2="125.25793"
+                   y2="77.379333"
+                   id="linearGradient8873"
+                   xlink:href="#linearGradient1724"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.028607,0.972188)" />
+                <linearGradient
+                   x1="97.281265"
+                   y1="84.255211"
+                   x2="127.84677"
+                   y2="61.142742"
+                   id="linearGradient8874"
+                   xlink:href="#linearGradient1716"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.962035,1.039463)" />
+              </defs>
+              <linearGradient
+                 x1="104.09006"
+                 y1="83.359146"
+                 x2="123.82494"
+                 y2="70.956947"
+                 id="linearGradient4363"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+              <linearGradient
+                 x1="100.76616"
+                 y1="77.379333"
+                 x2="125.25793"
+                 y2="77.379333"
+                 id="linearGradient8918"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+              <linearGradient
+                 x1="10.145814"
+                 y1="21.762129"
+                 x2="19.678274"
+                 y2="15.811033"
+                 id="linearGradient8919"
+                 xlink:href="#linearGradient1930"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+              <linearGradient
+                 x1="226.35037"
+                 y1="198.74835"
+                 x2="174.43694"
+                 y2="217.6319"
+                 id="linearGradient4366"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.959874,1.041804)" />
+              <linearGradient
+                 x1="97.345161"
+                 y1="112.84396"
+                 x2="99.20697"
+                 y2="115.81121"
+                 id="linearGradient8921"
+                 xlink:href="#linearGradient2560"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.206907,0.828564)"
+                 spreadMethod="reflect" />
+              <linearGradient
+                 x1="-94.151642"
+                 y1="379.97745"
+                 x2="-100.4097"
+                 y2="374.03232"
+                 id="linearGradient8922"
+                 xlink:href="#linearGradient1870"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.088448,0.91874)" />
+              <linearGradient
+                 x1="-13.15085"
+                 y1="250.48668"
+                 x2="-5.590662"
+                 y2="258.31036"
+                 id="linearGradient8923"
+                 xlink:href="#linearGradient2560"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+              <linearGradient
+                 x1="240.97612"
+                 y1="200.61511"
+                 x2="231.89941"
+                 y2="205.45764"
+                 id="linearGradient8924"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.866855,1.153596)" />
+              <linearGradient
+                 x1="7.1050277"
+                 y1="221.98289"
+                 x2="46.488174"
+                 y2="259.94464"
+                 id="linearGradient16003"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+              <linearGradient
+                 x1="7.1050277"
+                 y1="221.98289"
+                 x2="46.488174"
+                 y2="259.94464"
+                 id="linearGradient8926"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+              <linearGradient
+                 x1="100.76616"
+                 y1="77.379333"
+                 x2="125.25793"
+                 y2="77.379333"
+                 id="linearGradient8927"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+            </defs>
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient8935"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient8936"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+            <linearGradient
+               x1="10.145814"
+               y1="21.762129"
+               x2="19.678274"
+               y2="15.811033"
+               id="linearGradient8937"
+               xlink:href="#linearGradient1930"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+            <linearGradient
+               x1="-94.151642"
+               y1="379.97745"
+               x2="-100.4097"
+               y2="374.03232"
+               id="linearGradient8938"
+               xlink:href="#linearGradient1870"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.088448,0.91874)" />
+            <linearGradient
+               x1="97.345161"
+               y1="112.84396"
+               x2="99.20697"
+               y2="115.81121"
+               id="linearGradient8939"
+               xlink:href="#linearGradient2560"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.206907,0.828564)"
+               spreadMethod="reflect" />
+            <linearGradient
+               x1="-13.15085"
+               y1="250.48668"
+               x2="-5.590662"
+               y2="258.31036"
+               id="linearGradient8940"
+               xlink:href="#linearGradient2560"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+            <linearGradient
+               x1="240.97612"
+               y1="200.61511"
+               x2="231.89941"
+               y2="205.45764"
+               id="linearGradient8941"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.866855,1.153596)" />
+            <linearGradient
+               x1="7.1050277"
+               y1="221.98289"
+               x2="46.488174"
+               y2="259.94464"
+               id="linearGradient8942"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+            <linearGradient
+               x1="7.1050277"
+               y1="221.98289"
+               x2="46.488174"
+               y2="259.94464"
+               id="linearGradient8943"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+            <linearGradient
+               x1="11276.761"
+               y1="5908"
+               x2="-10290.378"
+               y2="8376.0635"
+               id="linearGradient8944"
+               xlink:href="#linearGradient3296"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="11701.849"
+               y1="13028.776"
+               x2="15175.786"
+               y2="9521.5176"
+               id="linearGradient8945"
+               xlink:href="#linearGradient3916"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.464784e-3,0,0,5.325523e-3,191.6882,44.23734)" />
+            <linearGradient
+               x1="307.43765"
+               y1="234.53671"
+               x2="292.48148"
+               y2="245.30841"
+               id="linearGradient8946"
+               xlink:href="#linearGradient3936"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.847559,0,0,0.796411,18.7268,-73.96861)" />
+            <linearGradient
+               x1="-161.57674"
+               y1="253.95526"
+               x2="-116.53033"
+               y2="311.73874"
+               id="linearGradient8947"
+               xlink:href="#linearGradient4063"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.846674,0.343014,0.288328,0.736755,18.9977,-80.1446)" />
+            <linearGradient
+               x1="42.53046"
+               y1="133.41551"
+               x2="53.520744"
+               y2="163.73753"
+               id="linearGradient8948"
+               xlink:href="#linearGradient4063"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-1.790967,0.310143,0.182364,0.974268,282.562,-80.82299)" />
+            <linearGradient
+               x1="248.30553"
+               y1="198.48206"
+               x2="257.16309"
+               y2="148.14442"
+               id="linearGradient8949"
+               xlink:href="#linearGradient3913"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.842789,0,0,0.800919,18.7268,-73.96861)" />
+            <defs
+               id="defs8950">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient8951"
+                 xlink:href="#linearGradient4066"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient8952">
+                <stop
+                   id="stop8953"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8954"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8955">
+                <stop
+                   id="stop8956"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="0" />
+                <stop
+                   id="stop8957"
+                   style="stop-color:#7d8787;stop-opacity:0.1451"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8958">
+                <stop
+                   id="stop8959"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8960"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8961">
+                <stop
+                   id="stop8962"
+                   style="stop-color:#57575a;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8963"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8964">
+                <stop
+                   id="stop8965"
+                   style="stop-color:#9db8d2;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8966"
+                   style="stop-color:#6988b7;stop-opacity:0.375"
+                   offset="0.5" />
+                <stop
+                   id="stop8967"
+                   style="stop-color:#929395;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8968">
+                <stop
+                   id="stop8969"
+                   style="stop-color:#2e97af;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8970"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient8971"
+                 xlink:href="#linearGradient4063"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient8972">
+                <stop
+                   id="stop8973"
+                   style="stop-color:#adc0d2;stop-opacity:0.91764706"
+                   offset="0" />
+                <stop
+                   id="stop8974"
+                   style="stop-color:#4b6983;stop-opacity:0.77319586"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8975">
+                <stop
+                   id="stop8976"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8977"
+                   style="stop-color:#fafbff;stop-opacity:1"
+                   offset="0.25" />
+                <stop
+                   id="stop8978"
+                   style="stop-color:#f0f2fa;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop8979"
+                   style="stop-color:#e1e1e1;stop-opacity:1"
+                   offset="0.75" />
+                <stop
+                   id="stop8980"
+                   style="stop-color:#f5f6ff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8981">
+                <stop
+                   id="stop8982"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8983"
+                   style="stop-color:#d0d1d9;stop-opacity:1"
+                   offset="0.5" />
+                <stop
+                   id="stop8984"
+                   style="stop-color:#878b9b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient8985">
+                <stop
+                   id="stop8986"
+                   style="stop-color:#e8e8e8;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop8987"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient8988"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <radialGradient
+                 cx="-77.367622"
+                 cy="42.633839"
+                 r="216.26619"
+                 fx="-80.036034"
+                 fy="44.468376"
+                 id="radialGradient8989"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+              <defs
+                 id="defs8990">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient8991"
+                   xlink:href="#linearGradient3936"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient8992">
+                  <stop
+                     id="stop8993"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop8994"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop8995"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop8996"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop8997"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient8998">
+                  <stop
+                     id="stop8999"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9000"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="133.07144"
+                   y1="28.231943"
+                   x2="118.58411"
+                   y2="13.431207"
+                   id="linearGradient9001"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                <linearGradient
+                   x1="30.722504"
+                   y1="28.135216"
+                   x2="39.78149"
+                   y2="27.315481"
+                   id="linearGradient9002"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103232)" />
+                <radialGradient
+                   cx="4.9853168"
+                   cy="108.47158"
+                   r="34.222183"
+                   fx="5.2520976"
+                   fy="108.73115"
+                   id="radialGradient9003"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="36.826332"
+                   y1="75.332558"
+                   x2="25.761681"
+                   y2="135.90358"
+                   id="linearGradient9004"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                <linearGradient
+                   x1="78.675774"
+                   y1="47.411823"
+                   x2="64.05336"
+                   y2="34.302757"
+                   id="linearGradient9005"
+                   xlink:href="#linearGradient4281"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                <defs
+                   id="defs9006">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9007"
+                     xlink:href="#linearGradient3296"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                </defs>
+              </defs>
+              <linearGradient
+                 x1="88.712402"
+                 y1="138.15012"
+                 x2="104.81104"
+                 y2="151.63045"
+                 id="linearGradient9022"
+                 xlink:href="#linearGradient3305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+              <defs
+                 id="defs9023">
+                <linearGradient
+                   id="linearGradient9024">
+                  <stop
+                     id="stop9025"
+                     style="stop-color:#000000;stop-opacity:0.22314049"
+                     offset="0" />
+                  <stop
+                     id="stop9026"
+                     style="stop-color:#000000;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient9027"
+                   xlink:href="#linearGradient3703"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient16106"
+                   xlink:href="#linearGradient1395"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient9029">
+                  <stop
+                     id="stop9030"
+                     style="stop-color:#000000;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9031"
+                     style="stop-color:#000000;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient9032"
+                   xlink:href="#linearGradient2021"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient9033">
+                  <stop
+                     id="stop9034"
+                     style="stop-color:#83a67f;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9035"
+                     style="stop-color:#eaeaea;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient9036"
+                   xlink:href="#linearGradient3916"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0.47368422"
+                   y1="0.1171875"
+                   x2="0.59649122"
+                   y2="1.21875"
+                   id="linearGradient9037"
+                   xlink:href="#linearGradient1443" />
+                <linearGradient
+                   x1="0.63380283"
+                   y1="0.11764706"
+                   x2="0.62676054"
+                   y2="0.74369746"
+                   id="linearGradient9038"
+                   xlink:href="#linearGradient870" />
+                <linearGradient
+                   x1="0.56690139"
+                   y1="-0.29629636"
+                   x2="0.66549295"
+                   y2="0.65432096"
+                   id="linearGradient9039"
+                   xlink:href="#linearGradient1045" />
+                <linearGradient
+                   x1="0.78195488"
+                   y1="0.3828125"
+                   x2="0.57894737"
+                   y2="0.609375"
+                   id="linearGradient9040"
+                   xlink:href="#linearGradient1045" />
+                <linearGradient
+                   x1="0.21097578"
+                   y1="-1.2339019"
+                   x2="1.2504174"
+                   y2="-0.10575413"
+                   id="linearGradient9041"
+                   xlink:href="#linearGradient1125"
+                   gradientTransform="scale(1.096129,0.912302)" />
+                <linearGradient
+                   x1="-0.21705426"
+                   y1="0.5546875"
+                   x2="1.5399107"
+                   y2="0.5546875"
+                   id="linearGradient9042"
+                   xlink:href="#linearGradient1125" />
+                <linearGradient
+                   x1="0.23239437"
+                   y1="-0.2389937"
+                   x2="0.62676054"
+                   y2="0.8490566"
+                   id="linearGradient9043"
+                   xlink:href="#linearGradient1045" />
+                <radialGradient
+                   cx="0.44718307"
+                   cy="0.51748252"
+                   r="0.57398623"
+                   fx="0.63028163"
+                   fy="0.16783214"
+                   id="radialGradient9044"
+                   xlink:href="#linearGradient1439" />
+                <radialGradient
+                   cx="0.46126762"
+                   cy="0.5403226"
+                   r="0.51062703"
+                   fx="0.50704223"
+                   fy="0.20025954"
+                   id="radialGradient16123"
+                   xlink:href="#linearGradient1443" />
+                <linearGradient
+                   id="linearGradient9046"
+                   xlink:href="#linearGradient1202" />
+              </defs>
+              <linearGradient
+                 x1="57.667629"
+                 y1="84.017433"
+                 x2="60.490723"
+                 y2="111.23763"
+                 id="linearGradient16167"
+                 xlink:href="#linearGradient2021"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.08132,0.924795)" />
+              <linearGradient
+                 x1="-2602.7705"
+                 y1="6138.4531"
+                 x2="9707.4707"
+                 y2="6138.2944"
+                 id="linearGradient9090"
+                 xlink:href="#linearGradient3650"
+                 gradientUnits="userSpaceOnUse" />
+              <defs
+                 id="defs9091">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient9092"
+                   xlink:href="#linearGradient3933"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient9093"
+                   xlink:href="#linearGradient3681"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient9094"
+                   xlink:href="#linearGradient3913"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <defs
+                   id="defs9095">
+                  <clipPath
+                     id="clipPath9096">
+                    <polygon
+                       points="17084,18485 16474,17828 15861,17169 15244,16508 14623,15843 13998,15175 13369,14505 12735,13831 12097,13154 11455,12473 10808,11789 10157,11102 9501,10412 9517,10188 9741,9851 10061,9507 10369,9259 10554,9215 11207,9890 11877,10561 12558,11228 13247,11891 13940,12550 14633,13207 15321,13859 16001,14509 16668,15156 17320,15800 17951,16442 18559,17082 18536,17278 18315,17593 17977,17949 17605,18268 17279,18472 17084,18485 "
+                       id="polygon9097" />
+                  </clipPath>
+                </defs>
+                <linearGradient
+                   x1="0.22399895"
+                   y1="0.42968741"
+                   x2="0.41599995"
+                   y2="0.24999991"
+                   id="linearGradient9098"
+                   xlink:href="#linearGradient3558" />
+                <linearGradient
+                   x1="0.39199805"
+                   y1="0.52343756"
+                   x2="0.66400015"
+                   y2="0.51562506"
+                   id="linearGradient9099"
+                   xlink:href="#linearGradient3655" />
+                <linearGradient
+                   x1="-0.24806577"
+                   y1="0.53907728"
+                   x2="0.86046565"
+                   y2="0.53906298"
+                   id="linearGradient9100"
+                   xlink:href="#linearGradient3650" />
+              </defs>
+              <radialGradient
+                 cx="41.875938"
+                 cy="37.865574"
+                 r="12.562782"
+                 fx="42.023739"
+                 fy="37.865574"
+                 id="radialGradient9141"
+                 xlink:href="#linearGradient2002"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="520.57166"
+                 y1="506.28723"
+                 x2="520.57166"
+                 y2="466.2785"
+                 id="linearGradient4589"
+                 xlink:href="#linearGradient1697"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="522.94183"
+                 y1="469.49918"
+                 x2="522.94183"
+                 y2="505.0845"
+                 id="linearGradient9143"
+                 xlink:href="#linearGradient1697"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="44.930588"
+                 y1="56.725216"
+                 x2="45.511845"
+                 y2="185.05675"
+                 id="linearGradient9145"
+                 xlink:href="#linearGradient1702"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.694118,0,0,0.651906,0,-2.410339)" />
+              <defs
+                 id="defs9146">
+                <linearGradient
+                   id="linearGradient9147">
+                  <stop
+                     id="stop9148"
+                     style="stop-color:#e6d500;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9149"
+                     style="stop-color:#ffba61;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9150">
+                  <stop
+                     id="stop9151"
+                     style="stop-color:#e6da1e;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9152"
+                     style="stop-color:#fff99b;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient9153"
+                   xlink:href="#linearGradient4802"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient9154">
+                  <stop
+                     id="stop9155"
+                     style="stop-color:#ccff5f;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9156"
+                     style="stop-color:#69db0e;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9157">
+                  <stop
+                     id="stop9158"
+                     style="stop-color:#ffffff;stop-opacity:0.69072163"
+                     offset="0" />
+                  <stop
+                     id="stop9159"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9160">
+                  <stop
+                     id="stop9161"
+                     style="stop-color:#69db0e;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9162"
+                     style="stop-color:#397607;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="520.57166"
+                   y1="506.28723"
+                   x2="520.57166"
+                   y2="466.2785"
+                   id="linearGradient9163"
+                   xlink:href="#linearGradient1697"
+                   gradientUnits="userSpaceOnUse" />
+                <radialGradient
+                   cx="522.89532"
+                   cy="481.86633"
+                   r="15.301119"
+                   fx="522.89911"
+                   fy="473.03323"
+                   id="radialGradient9164"
+                   xlink:href="#linearGradient1702"
+                   gradientUnits="userSpaceOnUse" />
+                <linearGradient
+                   x1="522.94183"
+                   y1="469.49918"
+                   x2="522.94183"
+                   y2="505.0845"
+                   id="linearGradient9165"
+                   xlink:href="#linearGradient1697"
+                   gradientUnits="userSpaceOnUse" />
+                <linearGradient
+                   x1="213.82799"
+                   y1="183.48366"
+                   x2="214.59154"
+                   y2="463.47311"
+                   id="linearGradient9166"
+                   xlink:href="#linearGradient1702"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+                <linearGradient
+                   x1="27.119711"
+                   y1="-353.75928"
+                   x2="27.018383"
+                   y2="-316.47729"
+                   id="linearGradient9167"
+                   xlink:href="#linearGradient1702"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(2.89873,-0.344979)" />
+                <radialGradient
+                   cx="41.875938"
+                   cy="37.865574"
+                   r="12.562782"
+                   fx="42.023739"
+                   fy="37.865574"
+                   id="radialGradient9168"
+                   xlink:href="#linearGradient1845"
+                   gradientUnits="userSpaceOnUse" />
+                <linearGradient
+                   x1="10.68618"
+                   y1="22.702703"
+                   x2="11.660023"
+                   y2="4.1041274"
+                   id="linearGradient9169"
+                   xlink:href="#linearGradient1302"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.016203,0.984055)" />
+                <linearGradient
+                   x1="16.88386"
+                   y1="28.772741"
+                   x2="12.516754"
+                   y2="2.6018224"
+                   id="linearGradient4621"
+                   xlink:href="#linearGradient1305"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.016203,0.984055)" />
+                <defs
+                   id="defs9171">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9172"
+                     xlink:href="#linearGradient2002"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9173"
+                     xlink:href="#linearGradient2009"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9174"
+                     xlink:href="#linearGradient2006"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     id="linearGradient9175">
+                    <stop
+                       id="stop9176"
+                       style="stop-color:#b18e4b;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop9177"
+                       style="stop-color:#f7dca0;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient9178">
+                    <stop
+                       id="stop9179"
+                       style="stop-color:#ffffff;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop9180"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient9181">
+                    <stop
+                       id="stop9182"
+                       style="stop-color:#000000;stop-opacity:0.14835165"
+                       offset="0" />
+                    <stop
+                       id="stop9183"
+                       style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                       offset="0.5" />
+                    <stop
+                       id="stop9184"
+                       style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                       offset="0.75" />
+                    <stop
+                       id="stop9185"
+                       style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                       offset="0.875" />
+                    <stop
+                       id="stop9186"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient9187">
+                    <stop
+                       id="stop9188"
+                       style="stop-color:#b18e4b;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop9189"
+                       style="stop-color:#f7dca0;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="28.814428"
+                     y1="-1.616316"
+                     x2="47.366039"
+                     y2="22.769617"
+                     id="linearGradient9190"
+                     xlink:href="#linearGradient1884"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(0.764292,1.3084)" />
+                  <linearGradient
+                     x1="30.722504"
+                     y1="28.135216"
+                     x2="39.78149"
+                     y2="27.315481"
+                     id="linearGradient9191"
+                     xlink:href="#linearGradient2354"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(0.475459,2.103232)" />
+                  <linearGradient
+                     x1="30.382267"
+                     y1="7.5329666"
+                     x2="47.366039"
+                     y2="22.769617"
+                     id="linearGradient9192"
+                     xlink:href="#linearGradient2354"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+                  <linearGradient
+                     x1="25.954844"
+                     y1="25.071495"
+                     x2="39.781502"
+                     y2="27.315489"
+                     id="linearGradient9193"
+                     xlink:href="#linearGradient2354"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(0.475459,2.103231)" />
+                  <defs
+                     id="defs9194">
+                    <linearGradient
+                       x1="0"
+                       y1="0.5"
+                       x2="1"
+                       y2="0.5"
+                       id="linearGradient9195"
+                       xlink:href="#linearGradient1302"
+                       gradientUnits="objectBoundingBox"
+                       spreadMethod="pad" />
+                    <linearGradient
+                       x1="0"
+                       y1="0.5"
+                       x2="1"
+                       y2="0.5"
+                       id="linearGradient9196"
+                       xlink:href="#linearGradient1305"
+                       gradientUnits="objectBoundingBox"
+                       spreadMethod="pad" />
+                    <linearGradient
+                       id="linearGradient9197">
+                      <stop
+                         id="stop9198"
+                         style="stop-color:#e6da1e;stop-opacity:1"
+                         offset="0" />
+                      <stop
+                         id="stop9199"
+                         style="stop-color:#b5ab17;stop-opacity:1"
+                         offset="1" />
+                    </linearGradient>
+                    <linearGradient
+                       x1="0.28441054"
+                       y1="0.88272494"
+                       x2="0.32513002"
+                       y2="0.10505857"
+                       id="linearGradient9200"
+                       xlink:href="#linearGradient4114" />
+                    <linearGradient
+                       x1="-0.0078431377"
+                       y1="-1.244898"
+                       x2="0.59607846"
+                       y2="0.3605442"
+                       id="linearGradient9201"
+                       xlink:href="#linearGradient1513" />
+                    <linearGradient
+                       x1="-0.4509804"
+                       y1="-0.15053764"
+                       x2="0.47058824"
+                       y2="0.36559141"
+                       id="linearGradient9202"
+                       xlink:href="#linearGradient1513" />
+                    <linearGradient
+                       x1="0.45882353"
+                       y1="1.2772278"
+                       x2="0.6901961"
+                       y2="-0.2970297"
+                       id="linearGradient9203"
+                       xlink:href="#linearGradient2122" />
+                    <linearGradient
+                       x1="-0.18232045"
+                       y1="-0.43962848"
+                       x2="0.68508285"
+                       y2="0.42414862"
+                       id="linearGradient9204"
+                       xlink:href="#linearGradient1513" />
+                    <linearGradient
+                       id="linearGradient4656">
+                      <stop
+                         id="stop4657"
+                         style="stop-color:#000000;stop-opacity:0.40784314"
+                         offset="0" />
+                      <stop
+                         id="stop4658"
+                         style="stop-color:#000000;stop-opacity:0"
+                         offset="1" />
+                    </linearGradient>
+                    <linearGradient
+                       x1="1.3783784"
+                       y1="0.25386998"
+                       x2="0.58378381"
+                       y2="0.13003096"
+                       id="linearGradient9208"
+                       xlink:href="#linearGradient2122" />
+                    <linearGradient
+                       x1="-0.14213198"
+                       y1="-0.28792569"
+                       x2="0.49753696"
+                       y2="0.35603714"
+                       id="linearGradient9209"
+                       xlink:href="#linearGradient1513" />
+                    <linearGradient
+                       x1="0.99512196"
+                       y1="0.64396286"
+                       x2="0.32682925"
+                       y2="0.3003096"
+                       id="linearGradient9210"
+                       xlink:href="#linearGradient1918" />
+                    <linearGradient
+                       x1="0.27843139"
+                       y1="-0.063694268"
+                       x2="0.4509804"
+                       y2="0.61146498"
+                       id="linearGradient9211"
+                       xlink:href="#linearGradient1513" />
+                    <linearGradient
+                       id="linearGradient9212">
+                      <stop
+                         id="stop9213"
+                         style="stop-color:#d6d6d6;stop-opacity:1"
+                         offset="0" />
+                      <stop
+                         id="stop9214"
+                         style="stop-color:#eaeaea;stop-opacity:1"
+                         offset="0.25769231" />
+                      <stop
+                         id="stop9215"
+                         style="stop-color:#919191;stop-opacity:1"
+                         offset="0.7059449" />
+                      <stop
+                         id="stop9216"
+                         style="stop-color:#d2d2d2;stop-opacity:1"
+                         offset="0.73347497" />
+                      <stop
+                         id="stop9217"
+                         style="stop-color:#a6a6a6;stop-opacity:1"
+                         offset="1" />
+                    </linearGradient>
+                    <linearGradient
+                       x1="0.47450981"
+                       y1="0.21771218"
+                       x2="0.80392158"
+                       y2="0.5202952"
+                       id="linearGradient9218"
+                       xlink:href="#linearGradient2317" />
+                    <linearGradient
+                       id="linearGradient9219">
+                      <stop
+                         id="stop9220"
+                         style="stop-color:#ffffff;stop-opacity:1"
+                         offset="0" />
+                      <stop
+                         id="stop9221"
+                         style="stop-color:#ffffff;stop-opacity:0"
+                         offset="1" />
+                    </linearGradient>
+                    <linearGradient
+                       x1="0.41568628"
+                       y1="0.27687296"
+                       x2="0.59607846"
+                       y2="0.44299674"
+                       id="linearGradient9222"
+                       xlink:href="#linearGradient1513" />
+                    <radialGradient
+                       cx="0.5"
+                       cy="0.5"
+                       r="0.5"
+                       fx="0.38431373"
+                       fy="0.47619048"
+                       id="radialGradient9223"
+                       xlink:href="#linearGradient1918" />
+                    <linearGradient
+                       x1="0"
+                       y1="0.5"
+                       x2="1"
+                       y2="0.5"
+                       id="linearGradient9224"
+                       xlink:href="#linearGradient1845"
+                       gradientUnits="objectBoundingBox"
+                       spreadMethod="pad" />
+                    <radialGradient
+                       cx="0.5"
+                       cy="0.5"
+                       r="0.5"
+                       fx="0.50588238"
+                       fy="0.5"
+                       id="radialGradient9225"
+                       xlink:href="#linearGradient1918" />
+                    <linearGradient
+                       x1="0.54355544"
+                       y1="1.1365328"
+                       x2="0.36095273"
+                       y2="0.042242367"
+                       id="linearGradient9226"
+                       xlink:href="#linearGradient4111" />
+                  </defs>
+                </defs>
+              </defs>
+            </defs>
+            <defs
+               id="defs9324">
+              <linearGradient
+                 id="linearGradient16403">
+                <stop
+                   id="stop9326"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop9327"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient9328">
+                <stop
+                   id="stop9329"
+                   style="stop-color:#d6d6d6;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop9330"
+                   style="stop-color:#eaeaea;stop-opacity:1"
+                   offset="0.25769231" />
+                <stop
+                   id="stop9331"
+                   style="stop-color:#919191;stop-opacity:1"
+                   offset="0.7059449" />
+                <stop
+                   id="stop9332"
+                   style="stop-color:#d2d2d2;stop-opacity:1"
+                   offset="0.73347497" />
+                <stop
+                   id="stop9333"
+                   style="stop-color:#a6a6a6;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient4785">
+                <stop
+                   id="stop9335"
+                   style="stop-color:#ffbc96;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop9336"
+                   style="stop-color:#ffeafe;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient9337">
+                <stop
+                   id="stop9338"
+                   style="stop-color:#000000;stop-opacity:0.3137255"
+                   offset="0" />
+                <stop
+                   id="stop9339"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient9340">
+                <stop
+                   id="stop9341"
+                   style="stop-color:#ffffff;stop-opacity:0.74901962"
+                   offset="0" />
+                <stop
+                   id="stop9342"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient9343">
+                <stop
+                   id="stop9344"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop9345"
+                   style="stop-color:#ffffff;stop-opacity:0.35164836"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient9346">
+                <stop
+                   id="stop9347"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop9348"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient9349">
+                <stop
+                   id="stop9350"
+                   style="stop-color:#7e818c;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop9351"
+                   style="stop-color:#d5dbed;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="52.683483"
+                 y1="104.09244"
+                 x2="58.380398"
+                 y2="252.54866"
+                 id="linearGradient9352"
+                 xlink:href="#linearGradient2678"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.334689,0,0,1.038479,-0.72121,-66.60727)" />
+              <linearGradient
+                 x1="52.19524"
+                 y1="64.818008"
+                 x2="52.19524"
+                 y2="122.69208"
+                 id="linearGradient9353"
+                 xlink:href="#linearGradient2689"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.111523,0,0,0.771568,-0.72121,-29.98157)" />
+              <linearGradient
+                 x1="29.958502"
+                 y1="-23.328955"
+                 x2="29.958502"
+                 y2="190.05157"
+                 id="linearGradient9354"
+                 xlink:href="#linearGradient2678"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.127153,0,0,0.781382,0.981463,-27.99057)" />
+              <linearGradient
+                 x1="84.960785"
+                 y1="92.151367"
+                 x2="42.64373"
+                 y2="53.360722"
+                 id="linearGradient9355"
+                 xlink:href="#linearGradient1749"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.321949,0.756459)" />
+              <linearGradient
+                 x1="31.82851"
+                 y1="61.778381"
+                 x2="33.198818"
+                 y2="6.859036"
+                 id="linearGradient9356"
+                 xlink:href="#linearGradient2678"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+              <linearGradient
+                 x1="186.07457"
+                 y1="23.533224"
+                 x2="202.6377"
+                 y2="23.47304"
+                 id="linearGradient9357"
+                 xlink:href="#linearGradient2689"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.388045,2.57702)" />
+              <linearGradient
+                 x1="92.631454"
+                 y1="54.989693"
+                 x2="92.631454"
+                 y2="50.608093"
+                 id="linearGradient16436"
+                 xlink:href="#linearGradient1757"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.787838,1.269296)" />
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient9359"
+                 xlink:href="#linearGradient2678"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+              <linearGradient
+                 x1="1270.3132"
+                 y1="4.8765283"
+                 x2="1247.6848"
+                 y2="0.72310239"
+                 id="linearGradient9360"
+                 xlink:href="#linearGradient2678"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(9.440723e-2,10.59241)" />
+              <linearGradient
+                 x1="1270.3132"
+                 y1="4.8765283"
+                 x2="1247.6848"
+                 y2="0.72310239"
+                 id="linearGradient9361"
+                 xlink:href="#linearGradient2678"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+              <linearGradient
+                 x1="96.41098"
+                 y1="57.341877"
+                 x2="81.065781"
+                 y2="196.048"
+                 id="linearGradient9362"
+                 xlink:href="#linearGradient2871"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.176531,0,0,0.821515,0,4.496065)" />
+              <linearGradient
+                 x1="-191.46153"
+                 y1="37.372372"
+                 x2="-165.58835"
+                 y2="37.372372"
+                 id="linearGradient9363"
+                 xlink:href="#linearGradient2678"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient9364"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient9365"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <linearGradient
+                 x1="88.712402"
+                 y1="138.15012"
+                 x2="104.81104"
+                 y2="151.63045"
+                 id="linearGradient9366"
+                 xlink:href="#linearGradient3305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+              <radialGradient
+                 cx="-77.367622"
+                 cy="42.633839"
+                 r="216.26619"
+                 fx="-80.036034"
+                 fy="44.468376"
+                 id="radialGradient9367"
+                 xlink:href="#linearGradient2678"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+              <linearGradient
+                 x1="100.76616"
+                 y1="77.379333"
+                 x2="125.25793"
+                 y2="77.379333"
+                 id="linearGradient9368"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+              <linearGradient
+                 x1="104.09006"
+                 y1="83.359146"
+                 x2="123.82494"
+                 y2="70.956947"
+                 id="linearGradient16447"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+              <linearGradient
+                 x1="100.76616"
+                 y1="77.379333"
+                 x2="125.25793"
+                 y2="77.379333"
+                 id="linearGradient16448"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+              <linearGradient
+                 x1="10.145814"
+                 y1="21.762129"
+                 x2="19.678274"
+                 y2="15.811033"
+                 id="linearGradient9371"
+                 xlink:href="#linearGradient1930"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+              <linearGradient
+                 x1="226.35037"
+                 y1="198.74835"
+                 x2="174.43694"
+                 y2="217.6319"
+                 id="linearGradient9372"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.959874,1.041804)" />
+              <linearGradient
+                 x1="-94.151642"
+                 y1="379.97745"
+                 x2="-100.4097"
+                 y2="374.03232"
+                 id="linearGradient9373"
+                 xlink:href="#linearGradient1870"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.088448,0.91874)" />
+              <linearGradient
+                 x1="97.345161"
+                 y1="112.84396"
+                 x2="99.20697"
+                 y2="115.81121"
+                 id="linearGradient9374"
+                 xlink:href="#linearGradient2560"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.206907,0.828564)"
+                 spreadMethod="reflect" />
+              <linearGradient
+                 x1="-13.15085"
+                 y1="250.48668"
+                 x2="-5.590662"
+                 y2="258.31036"
+                 id="linearGradient9375"
+                 xlink:href="#linearGradient2560"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+              <linearGradient
+                 x1="240.97612"
+                 y1="200.61511"
+                 x2="231.89941"
+                 y2="205.45764"
+                 id="linearGradient9376"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.866855,1.153596)" />
+              <linearGradient
+                 x1="7.1050277"
+                 y1="221.98289"
+                 x2="46.488174"
+                 y2="259.94464"
+                 id="linearGradient9377"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+              <linearGradient
+                 x1="7.1050277"
+                 y1="221.98289"
+                 x2="46.488174"
+                 y2="259.94464"
+                 id="linearGradient9378"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+              <defs
+                 id="defs9379">
+                <linearGradient
+                   id="linearGradient9380">
+                  <stop
+                     id="stop9381"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9382"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9383">
+                  <stop
+                     id="stop9384"
+                     style="stop-color:#c86f32;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9385"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9386">
+                  <stop
+                     id="stop9387"
+                     style="stop-color:#d88721;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9388"
+                     style="stop-color:#a85c00;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop9389"
+                     style="stop-color:#643e0e;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9390">
+                  <stop
+                     id="stop9391"
+                     style="stop-color:#868686;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9392"
+                     style="stop-color:#e2e2e2;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9393">
+                  <stop
+                     id="stop9394"
+                     style="stop-color:#ff9870;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9395"
+                     style="stop-color:#ffd8c9;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9396">
+                  <stop
+                     id="stop9397"
+                     style="stop-color:#ffd7c0;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9398"
+                     style="stop-color:#ffbc96;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient9399"
+                   xlink:href="#linearGradient2150"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient9400">
+                  <stop
+                     id="stop9401"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9402"
+                     style="stop-color:#fafbff;stop-opacity:1"
+                     offset="0.25" />
+                  <stop
+                     id="stop9403"
+                     style="stop-color:#f0f2fa;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop9404"
+                     style="stop-color:#e1e1e1;stop-opacity:1"
+                     offset="0.75" />
+                  <stop
+                     id="stop9405"
+                     style="stop-color:#f5f6ff;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9406">
+                  <stop
+                     id="stop16485"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop16486"
+                     style="stop-color:#d0d1d9;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop9409"
+                     style="stop-color:#878b9b;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9410">
+                  <stop
+                     id="stop16489"
+                     style="stop-color:#e8e8e8;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9412"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="-49.171364"
+                   y1="121.40791"
+                   x2="-160.71114"
+                   y2="-157.53516"
+                   id="linearGradient9413"
+                   xlink:href="#linearGradient1700"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+                <radialGradient
+                   cx="-77.367622"
+                   cy="42.633839"
+                   r="216.26619"
+                   fx="-80.036034"
+                   fy="44.468376"
+                   id="radialGradient9414"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+                <defs
+                   id="defs9415">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9416"
+                     xlink:href="#linearGradient1884"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     id="linearGradient9417">
+                    <stop
+                       id="stop9418"
+                       style="stop-color:#000000;stop-opacity:0.14835165"
+                       offset="0" />
+                    <stop
+                       id="stop9419"
+                       style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                       offset="0.5" />
+                    <stop
+                       id="stop9420"
+                       style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                       offset="0.75" />
+                    <stop
+                       id="stop9421"
+                       style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                       offset="0.875" />
+                    <stop
+                       id="stop9422"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient9423">
+                    <stop
+                       id="stop9424"
+                       style="stop-color:#b18e4b;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop9425"
+                       style="stop-color:#f7dca0;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="133.07144"
+                     y1="28.231943"
+                     x2="118.58411"
+                     y2="13.431207"
+                     id="linearGradient9426"
+                     xlink:href="#linearGradient1696"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                  <linearGradient
+                     x1="30.722504"
+                     y1="28.135216"
+                     x2="39.78149"
+                     y2="27.315481"
+                     id="linearGradient9427"
+                     xlink:href="#linearGradient2354"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(0.475459,2.103232)" />
+                  <radialGradient
+                     cx="4.9853168"
+                     cy="108.47158"
+                     r="34.222183"
+                     fx="5.2520976"
+                     fy="108.73115"
+                     id="radialGradient9428"
+                     xlink:href="#linearGradient2877"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="36.826332"
+                     y1="75.332558"
+                     x2="25.761681"
+                     y2="135.90358"
+                     id="linearGradient9429"
+                     xlink:href="#linearGradient2877"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                  <linearGradient
+                     x1="78.675774"
+                     y1="47.411823"
+                     x2="64.05336"
+                     y2="34.302757"
+                     id="linearGradient9430"
+                     xlink:href="#linearGradient4281"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                  <defs
+                     id="defs9431">
+                    <linearGradient
+                       x1="0"
+                       y1="0.5"
+                       x2="1"
+                       y2="0.5"
+                       id="linearGradient9432"
+                       xlink:href="#linearGradient3296"
+                       gradientUnits="objectBoundingBox"
+                       spreadMethod="pad" />
+                  </defs>
+                </defs>
+                <linearGradient
+                   x1="88.712402"
+                   y1="138.15012"
+                   x2="104.81104"
+                   y2="151.63045"
+                   id="linearGradient9447"
+                   xlink:href="#linearGradient3305"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+                <defs
+                   id="defs9448">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9449"
+                     xlink:href="#linearGradient1863"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9450"
+                     xlink:href="#linearGradient2560"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9451"
+                     xlink:href="#linearGradient1926"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9452"
+                     xlink:href="#linearGradient1302"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="96.346039"
+                     y1="84.428337"
+                     x2="121.44556"
+                     y2="65.093857"
+                     id="linearGradient9453"
+                     xlink:href="#linearGradient1716"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(0.962035,0,0,1.039463,0.899729,-0.17995)" />
+                  <linearGradient
+                     x1="104.09006"
+                     y1="83.359146"
+                     x2="123.82494"
+                     y2="70.956947"
+                     id="linearGradient9454"
+                     xlink:href="#linearGradient1724"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(1.028242,0.972534)" />
+                  <linearGradient
+                     x1="100.76616"
+                     y1="77.379333"
+                     x2="125.25793"
+                     y2="77.379333"
+                     id="linearGradient9455"
+                     xlink:href="#linearGradient1724"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(1.028607,0.972188)" />
+                  <linearGradient
+                     x1="97.345161"
+                     y1="112.84396"
+                     x2="99.20697"
+                     y2="115.81121"
+                     id="linearGradient9456"
+                     xlink:href="#linearGradient1741"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(1.206907,0.828564)"
+                     spreadMethod="reflect" />
+                  <linearGradient
+                     x1="168.2516"
+                     y1="181.01073"
+                     x2="185.96996"
+                     y2="172.51707"
+                     id="linearGradient9457"
+                     xlink:href="#linearGradient4873"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(0.959874,0,0,1.041804,24.17578,34.86402)" />
+                  <linearGradient
+                     x1="97.281265"
+                     y1="84.255211"
+                     x2="127.84677"
+                     y2="61.142742"
+                     id="linearGradient9458"
+                     xlink:href="#linearGradient1716"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(0.962035,1.039463)" />
+                  <linearGradient
+                     x1="104.09006"
+                     y1="83.359146"
+                     x2="123.82494"
+                     y2="70.956947"
+                     id="linearGradient9459"
+                     xlink:href="#linearGradient1724"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(1.028242,0.972534)" />
+                  <linearGradient
+                     x1="100.76616"
+                     y1="77.379333"
+                     x2="125.25793"
+                     y2="77.379333"
+                     id="linearGradient9460"
+                     xlink:href="#linearGradient1724"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(1.028607,0.972188)" />
+                  <linearGradient
+                     x1="97.281265"
+                     y1="84.255211"
+                     x2="127.84677"
+                     y2="61.142742"
+                     id="linearGradient9461"
+                     xlink:href="#linearGradient1716"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(0.962035,1.039463)" />
+                </defs>
+                <linearGradient
+                   x1="104.09006"
+                   y1="83.359146"
+                   x2="123.82494"
+                   y2="70.956947"
+                   id="linearGradient9504"
+                   xlink:href="#linearGradient1926"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+                <linearGradient
+                   x1="100.76616"
+                   y1="77.379333"
+                   x2="125.25793"
+                   y2="77.379333"
+                   id="linearGradient9505"
+                   xlink:href="#linearGradient1926"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+                <linearGradient
+                   x1="10.145814"
+                   y1="21.762129"
+                   x2="19.678274"
+                   y2="15.811033"
+                   id="linearGradient9506"
+                   xlink:href="#linearGradient1930"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+                <linearGradient
+                   x1="226.35037"
+                   y1="198.74835"
+                   x2="174.43694"
+                   y2="217.6319"
+                   id="linearGradient9507"
+                   xlink:href="#linearGradient1926"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.959874,1.041804)" />
+                <linearGradient
+                   x1="97.345161"
+                   y1="112.84396"
+                   x2="99.20697"
+                   y2="115.81121"
+                   id="linearGradient9508"
+                   xlink:href="#linearGradient2560"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.206907,0.828564)"
+                   spreadMethod="reflect" />
+                <linearGradient
+                   x1="-94.151642"
+                   y1="379.97745"
+                   x2="-100.4097"
+                   y2="374.03232"
+                   id="linearGradient9509"
+                   xlink:href="#linearGradient1870"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.088448,0.91874)" />
+                <linearGradient
+                   x1="-13.15085"
+                   y1="250.48668"
+                   x2="-5.590662"
+                   y2="258.31036"
+                   id="linearGradient9510"
+                   xlink:href="#linearGradient2560"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+                <linearGradient
+                   x1="240.97612"
+                   y1="200.61511"
+                   x2="231.89941"
+                   y2="205.45764"
+                   id="linearGradient9511"
+                   xlink:href="#linearGradient1884"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.866855,1.153596)" />
+                <linearGradient
+                   x1="7.1050277"
+                   y1="221.98289"
+                   x2="46.488174"
+                   y2="259.94464"
+                   id="linearGradient9512"
+                   xlink:href="#linearGradient1884"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+                <linearGradient
+                   x1="7.1050277"
+                   y1="221.98289"
+                   x2="46.488174"
+                   y2="259.94464"
+                   id="linearGradient9513"
+                   xlink:href="#linearGradient1884"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+                <linearGradient
+                   x1="100.76616"
+                   y1="77.379333"
+                   x2="125.25793"
+                   y2="77.379333"
+                   id="linearGradient9514"
+                   xlink:href="#linearGradient1926"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+              </defs>
+              <linearGradient
+                 x1="100.76616"
+                 y1="77.379333"
+                 x2="125.25793"
+                 y2="77.379333"
+                 id="linearGradient9522"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+              <linearGradient
+                 x1="100.76616"
+                 y1="77.379333"
+                 x2="125.25793"
+                 y2="77.379333"
+                 id="linearGradient9523"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+              <linearGradient
+                 x1="10.145814"
+                 y1="21.762129"
+                 x2="19.678274"
+                 y2="15.811033"
+                 id="linearGradient9524"
+                 xlink:href="#linearGradient1930"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+              <linearGradient
+                 x1="-94.151642"
+                 y1="379.97745"
+                 x2="-100.4097"
+                 y2="374.03232"
+                 id="linearGradient9525"
+                 xlink:href="#linearGradient1870"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.088448,0.91874)" />
+              <linearGradient
+                 x1="97.345161"
+                 y1="112.84396"
+                 x2="99.20697"
+                 y2="115.81121"
+                 id="linearGradient9526"
+                 xlink:href="#linearGradient2560"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.206907,0.828564)"
+                 spreadMethod="reflect" />
+              <linearGradient
+                 x1="-13.15085"
+                 y1="250.48668"
+                 x2="-5.590662"
+                 y2="258.31036"
+                 id="linearGradient9527"
+                 xlink:href="#linearGradient2560"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+              <linearGradient
+                 x1="240.97612"
+                 y1="200.61511"
+                 x2="231.89941"
+                 y2="205.45764"
+                 id="linearGradient9528"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.866855,1.153596)" />
+              <linearGradient
+                 x1="7.1050277"
+                 y1="221.98289"
+                 x2="46.488174"
+                 y2="259.94464"
+                 id="linearGradient9529"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+              <linearGradient
+                 x1="7.1050277"
+                 y1="221.98289"
+                 x2="46.488174"
+                 y2="259.94464"
+                 id="linearGradient9530"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+              <defs
+                 id="defs9531">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient9532"
+                   xlink:href="#linearGradient4066"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient9533">
+                  <stop
+                     id="stop9534"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9535"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9536">
+                  <stop
+                     id="stop9537"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="0" />
+                  <stop
+                     id="stop9538"
+                     style="stop-color:#7d8787;stop-opacity:0.1451"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9539">
+                  <stop
+                     id="stop9540"
+                     style="stop-color:#000000;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9541"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9542">
+                  <stop
+                     id="stop9543"
+                     style="stop-color:#57575a;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9544"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient9545"
+                   xlink:href="#linearGradient10727"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient9546">
+                  <stop
+                     id="stop9547"
+                     style="stop-color:#2e97af;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9548"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient9549"
+                   xlink:href="#linearGradient4063"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient9550">
+                  <stop
+                     id="stop9551"
+                     style="stop-color:#adc0d2;stop-opacity:0.91764706"
+                     offset="0" />
+                  <stop
+                     id="stop9552"
+                     style="stop-color:#4b6983;stop-opacity:0.77319586"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9553">
+                  <stop
+                     id="stop9554"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9555"
+                     style="stop-color:#fafbff;stop-opacity:1"
+                     offset="0.25" />
+                  <stop
+                     id="stop9556"
+                     style="stop-color:#f0f2fa;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop9557"
+                     style="stop-color:#e1e1e1;stop-opacity:1"
+                     offset="0.75" />
+                  <stop
+                     id="stop9558"
+                     style="stop-color:#f5f6ff;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9559">
+                  <stop
+                     id="stop9560"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9561"
+                     style="stop-color:#d0d1d9;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop9562"
+                     style="stop-color:#878b9b;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9563">
+                  <stop
+                     id="stop9564"
+                     style="stop-color:#e8e8e8;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9565"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="-49.171364"
+                   y1="121.40791"
+                   x2="-160.71114"
+                   y2="-157.53516"
+                   id="linearGradient9566"
+                   xlink:href="#linearGradient1700"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+                <radialGradient
+                   cx="-77.367622"
+                   cy="42.633839"
+                   r="216.26619"
+                   fx="-80.036034"
+                   fy="44.468376"
+                   id="radialGradient9567"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+                <defs
+                   id="defs9568">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9569"
+                     xlink:href="#linearGradient3936"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     id="linearGradient9570">
+                    <stop
+                       id="stop9571"
+                       style="stop-color:#000000;stop-opacity:0.14835165"
+                       offset="0" />
+                    <stop
+                       id="stop9572"
+                       style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                       offset="0.5" />
+                    <stop
+                       id="stop9573"
+                       style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                       offset="0.75" />
+                    <stop
+                       id="stop9574"
+                       style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                       offset="0.875" />
+                    <stop
+                       id="stop9575"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient9576">
+                    <stop
+                       id="stop9577"
+                       style="stop-color:#b18e4b;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop9578"
+                       style="stop-color:#f7dca0;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="133.07144"
+                     y1="28.231943"
+                     x2="118.58411"
+                     y2="13.431207"
+                     id="linearGradient9579"
+                     xlink:href="#linearGradient1696"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                  <linearGradient
+                     x1="30.722504"
+                     y1="28.135216"
+                     x2="39.78149"
+                     y2="27.315481"
+                     id="linearGradient9580"
+                     xlink:href="#linearGradient2354"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(0.475459,2.103232)" />
+                  <radialGradient
+                     cx="4.9853168"
+                     cy="108.47158"
+                     r="34.222183"
+                     fx="5.2520976"
+                     fy="108.73115"
+                     id="radialGradient9581"
+                     xlink:href="#linearGradient2877"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="36.826332"
+                     y1="75.332558"
+                     x2="25.761681"
+                     y2="135.90358"
+                     id="linearGradient9582"
+                     xlink:href="#linearGradient2877"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                  <linearGradient
+                     x1="78.675774"
+                     y1="47.411823"
+                     x2="64.05336"
+                     y2="34.302757"
+                     id="linearGradient9583"
+                     xlink:href="#linearGradient4281"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                  <defs
+                     id="defs9584">
+                    <linearGradient
+                       x1="0"
+                       y1="0.5"
+                       x2="1"
+                       y2="0.5"
+                       id="linearGradient9585"
+                       xlink:href="#linearGradient3296"
+                       gradientUnits="objectBoundingBox"
+                       spreadMethod="pad" />
+                  </defs>
+                </defs>
+                <linearGradient
+                   x1="88.712402"
+                   y1="138.15012"
+                   x2="104.81104"
+                   y2="151.63045"
+                   id="linearGradient9600"
+                   xlink:href="#linearGradient3305"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+                <defs
+                   id="defs9601">
+                  <linearGradient
+                     id="linearGradient16680">
+                    <stop
+                       id="stop9603"
+                       style="stop-color:#000000;stop-opacity:0.22314049"
+                       offset="0" />
+                    <stop
+                       id="stop9604"
+                       style="stop-color:#000000;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9605"
+                     xlink:href="#linearGradient3703"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9606"
+                     xlink:href="#linearGradient1395"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     id="linearGradient9607">
+                    <stop
+                       id="stop9608"
+                       style="stop-color:#000000;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop9609"
+                       style="stop-color:#000000;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9610"
+                     xlink:href="#linearGradient2021"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     id="linearGradient9611">
+                    <stop
+                       id="stop9612"
+                       style="stop-color:#83a67f;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop9613"
+                       style="stop-color:#eaeaea;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9614"
+                     xlink:href="#linearGradient3916"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="0.47368422"
+                     y1="0.1171875"
+                     x2="0.59649122"
+                     y2="1.21875"
+                     id="linearGradient9615"
+                     xlink:href="#linearGradient1443" />
+                  <linearGradient
+                     x1="0.63380283"
+                     y1="0.11764706"
+                     x2="0.62676054"
+                     y2="0.74369746"
+                     id="linearGradient9616"
+                     xlink:href="#linearGradient870" />
+                  <linearGradient
+                     x1="0.56690139"
+                     y1="-0.29629636"
+                     x2="0.66549295"
+                     y2="0.65432096"
+                     id="linearGradient9617"
+                     xlink:href="#linearGradient1045" />
+                  <linearGradient
+                     x1="0.78195488"
+                     y1="0.3828125"
+                     x2="0.57894737"
+                     y2="0.609375"
+                     id="linearGradient9618"
+                     xlink:href="#linearGradient1045" />
+                  <linearGradient
+                     x1="0.21097578"
+                     y1="-1.2339019"
+                     x2="1.2504174"
+                     y2="-0.10575413"
+                     id="linearGradient9619"
+                     xlink:href="#linearGradient1125"
+                     gradientTransform="scale(1.096129,0.912302)" />
+                  <linearGradient
+                     x1="-0.21705426"
+                     y1="0.5546875"
+                     x2="1.5399107"
+                     y2="0.5546875"
+                     id="linearGradient9620"
+                     xlink:href="#linearGradient1125" />
+                  <linearGradient
+                     x1="0.23239437"
+                     y1="-0.2389937"
+                     x2="0.62676054"
+                     y2="0.8490566"
+                     id="linearGradient9621"
+                     xlink:href="#linearGradient1045" />
+                  <radialGradient
+                     cx="0.44718307"
+                     cy="0.51748252"
+                     r="0.57398623"
+                     fx="0.63028163"
+                     fy="0.16783214"
+                     id="radialGradient9622"
+                     xlink:href="#linearGradient1439" />
+                  <radialGradient
+                     cx="0.46126762"
+                     cy="0.5403226"
+                     r="0.51062703"
+                     fx="0.50704223"
+                     fy="0.20025954"
+                     id="radialGradient9623"
+                     xlink:href="#linearGradient1443" />
+                  <linearGradient
+                     id="linearGradient9624"
+                     xlink:href="#linearGradient1202" />
+                </defs>
+                <linearGradient
+                   x1="57.667629"
+                   y1="84.017433"
+                   x2="60.490723"
+                   y2="111.23763"
+                   id="linearGradient9667"
+                   xlink:href="#linearGradient2021"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.08132,0.924795)" />
+                <linearGradient
+                   x1="-2602.7705"
+                   y1="6138.4531"
+                   x2="9707.4707"
+                   y2="6138.2944"
+                   id="linearGradient9668"
+                   xlink:href="#linearGradient3650"
+                   gradientUnits="userSpaceOnUse" />
+                <defs
+                   id="defs9669">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9670"
+                     xlink:href="#linearGradient3933"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9671"
+                     xlink:href="#linearGradient3681"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9672"
+                     xlink:href="#linearGradient3913"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <defs
+                     id="defs9673">
+                    <clipPath
+                       id="clipPath9674">
+                      <polygon
+                         points="17084,18485 16474,17828 15861,17169 15244,16508 14623,15843 13998,15175 13369,14505 12735,13831 12097,13154 11455,12473 10808,11789 10157,11102 9501,10412 9517,10188 9741,9851 10061,9507 10369,9259 10554,9215 11207,9890 11877,10561 12558,11228 13247,11891 13940,12550 14633,13207 15321,13859 16001,14509 16668,15156 17320,15800 17951,16442 18559,17082 18536,17278 18315,17593 17977,17949 17605,18268 17279,18472 17084,18485 "
+                         id="polygon9675" />
+                    </clipPath>
+                  </defs>
+                  <linearGradient
+                     x1="0.22399895"
+                     y1="0.42968741"
+                     x2="0.41599995"
+                     y2="0.24999991"
+                     id="linearGradient9676"
+                     xlink:href="#linearGradient3558" />
+                  <linearGradient
+                     x1="0.39199805"
+                     y1="0.52343756"
+                     x2="0.66400015"
+                     y2="0.51562506"
+                     id="linearGradient9677"
+                     xlink:href="#linearGradient3655" />
+                  <linearGradient
+                     x1="-0.24806577"
+                     y1="0.53907728"
+                     x2="0.86046565"
+                     y2="0.53906298"
+                     id="linearGradient9678"
+                     xlink:href="#linearGradient3650" />
+                </defs>
+                <radialGradient
+                   cx="41.875938"
+                   cy="37.865574"
+                   r="12.562782"
+                   fx="42.023739"
+                   fy="37.865574"
+                   id="radialGradient9719"
+                   xlink:href="#linearGradient2002"
+                   gradientUnits="userSpaceOnUse" />
+                <linearGradient
+                   x1="520.57166"
+                   y1="506.28723"
+                   x2="520.57166"
+                   y2="466.2785"
+                   id="linearGradient9720"
+                   xlink:href="#linearGradient1697"
+                   gradientUnits="userSpaceOnUse" />
+                <linearGradient
+                   x1="522.94183"
+                   y1="469.49918"
+                   x2="522.94183"
+                   y2="505.0845"
+                   id="linearGradient9721"
+                   xlink:href="#linearGradient1697"
+                   gradientUnits="userSpaceOnUse" />
+                <linearGradient
+                   x1="520.57166"
+                   y1="506.28723"
+                   x2="520.57166"
+                   y2="466.2785"
+                   id="linearGradient9722"
+                   xlink:href="#linearGradient1735"
+                   gradientUnits="userSpaceOnUse" />
+                <linearGradient
+                   x1="44.930588"
+                   y1="56.725216"
+                   x2="45.511845"
+                   y2="185.05675"
+                   id="linearGradient9723"
+                   xlink:href="#linearGradient1702"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.694118,0,0,0.651906,0,-2.410339)" />
+                <defs
+                   id="defs9724">
+                  <linearGradient
+                     id="linearGradient16803">
+                    <stop
+                       id="stop9726"
+                       style="stop-color:#e6d500;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop9727"
+                       style="stop-color:#ffba61;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient9728">
+                    <stop
+                       id="stop9729"
+                       style="stop-color:#e6da1e;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop9730"
+                       style="stop-color:#fff99b;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient9731"
+                     xlink:href="#linearGradient4802"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     id="linearGradient9732">
+                    <stop
+                       id="stop9733"
+                       style="stop-color:#ccff5f;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop9734"
+                       style="stop-color:#69db0e;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient9735">
+                    <stop
+                       id="stop9736"
+                       style="stop-color:#ffffff;stop-opacity:0.69072163"
+                       offset="0" />
+                    <stop
+                       id="stop9737"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient9738">
+                    <stop
+                       id="stop9739"
+                       style="stop-color:#69db0e;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop9740"
+                       style="stop-color:#397607;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="520.57166"
+                     y1="506.28723"
+                     x2="520.57166"
+                     y2="466.2785"
+                     id="linearGradient9741"
+                     xlink:href="#linearGradient1697"
+                     gradientUnits="userSpaceOnUse" />
+                  <radialGradient
+                     cx="522.89532"
+                     cy="481.86633"
+                     r="15.301119"
+                     fx="522.89911"
+                     fy="473.03323"
+                     id="radialGradient9742"
+                     xlink:href="#linearGradient1702"
+                     gradientUnits="userSpaceOnUse" />
+                  <linearGradient
+                     x1="522.94183"
+                     y1="469.49918"
+                     x2="522.94183"
+                     y2="505.0845"
+                     id="linearGradient9743"
+                     xlink:href="#linearGradient1697"
+                     gradientUnits="userSpaceOnUse" />
+                  <linearGradient
+                     x1="213.82799"
+                     y1="183.48366"
+                     x2="214.59154"
+                     y2="463.47311"
+                     id="linearGradient9744"
+                     xlink:href="#linearGradient1702"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+                  <linearGradient
+                     x1="27.119711"
+                     y1="-353.75928"
+                     x2="27.018383"
+                     y2="-316.47729"
+                     id="linearGradient9745"
+                     xlink:href="#linearGradient1702"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(2.89873,-0.344979)" />
+                  <radialGradient
+                     cx="41.875938"
+                     cy="37.865574"
+                     r="12.562782"
+                     fx="42.023739"
+                     fy="37.865574"
+                     id="radialGradient9746"
+                     xlink:href="#linearGradient1845"
+                     gradientUnits="userSpaceOnUse" />
+                  <linearGradient
+                     x1="10.68618"
+                     y1="22.702703"
+                     x2="11.660023"
+                     y2="4.1041274"
+                     id="linearGradient9747"
+                     xlink:href="#linearGradient1302"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(1.016203,0.984055)" />
+                  <linearGradient
+                     x1="16.88386"
+                     y1="28.772741"
+                     x2="12.516754"
+                     y2="2.6018224"
+                     id="linearGradient9748"
+                     xlink:href="#linearGradient1305"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(1.016203,0.984055)" />
+                  <defs
+                     id="defs9749">
+                    <linearGradient
+                       x1="0"
+                       y1="0.5"
+                       x2="1"
+                       y2="0.5"
+                       id="linearGradient9750"
+                       xlink:href="#linearGradient2002"
+                       gradientUnits="objectBoundingBox"
+                       spreadMethod="pad" />
+                    <linearGradient
+                       x1="0"
+                       y1="0.5"
+                       x2="1"
+                       y2="0.5"
+                       id="linearGradient9751"
+                       xlink:href="#linearGradient2009"
+                       gradientUnits="objectBoundingBox"
+                       spreadMethod="pad" />
+                    <linearGradient
+                       x1="0"
+                       y1="0.5"
+                       x2="1"
+                       y2="0.5"
+                       id="linearGradient9752"
+                       xlink:href="#linearGradient2006"
+                       gradientUnits="objectBoundingBox"
+                       spreadMethod="pad" />
+                    <linearGradient
+                       id="linearGradient9753">
+                      <stop
+                         id="stop9754"
+                         style="stop-color:#b18e4b;stop-opacity:1"
+                         offset="0" />
+                      <stop
+                         id="stop9755"
+                         style="stop-color:#f7dca0;stop-opacity:1"
+                         offset="1" />
+                    </linearGradient>
+                    <linearGradient
+                       x1="0"
+                       y1="0.5"
+                       x2="1"
+                       y2="0.5"
+                       id="linearGradient9756"
+                       xlink:href="#linearGradient2780"
+                       gradientUnits="objectBoundingBox"
+                       spreadMethod="pad" />
+                    <linearGradient
+                       id="linearGradient9757">
+                      <stop
+                         id="stop9758"
+                         style="stop-color:#000000;stop-opacity:0.14835165"
+                         offset="0" />
+                      <stop
+                         id="stop9759"
+                         style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                         offset="0.5" />
+                      <stop
+                         id="stop9760"
+                         style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                         offset="0.75" />
+                      <stop
+                         id="stop9761"
+                         style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                         offset="0.875" />
+                      <stop
+                         id="stop9762"
+                         style="stop-color:#ffffff;stop-opacity:0"
+                         offset="1" />
+                    </linearGradient>
+                    <linearGradient
+                       id="linearGradient9763">
+                      <stop
+                         id="stop9764"
+                         style="stop-color:#b18e4b;stop-opacity:1"
+                         offset="0" />
+                      <stop
+                         id="stop9765"
+                         style="stop-color:#f7dca0;stop-opacity:1"
+                         offset="1" />
+                    </linearGradient>
+                    <linearGradient
+                       x1="30.722504"
+                       y1="28.135216"
+                       x2="39.78149"
+                       y2="27.315481"
+                       id="linearGradient9767"
+                       xlink:href="#linearGradient2354"
+                       gradientUnits="userSpaceOnUse"
+                       gradientTransform="scale(0.475459,2.103232)" />
+                    <linearGradient
+                       x1="30.382267"
+                       y1="7.5329666"
+                       x2="47.366039"
+                       y2="22.769617"
+                       id="linearGradient5222"
+                       xlink:href="#linearGradient2354"
+                       gradientUnits="userSpaceOnUse"
+                       gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+                    <linearGradient
+                       x1="25.954844"
+                       y1="25.071495"
+                       x2="39.781502"
+                       y2="27.315489"
+                       id="linearGradient5223"
+                       xlink:href="#linearGradient2354"
+                       gradientUnits="userSpaceOnUse"
+                       gradientTransform="scale(0.475459,2.103231)" />
+                    <defs
+                       id="defs9770">
+                      <linearGradient
+                         x1="0"
+                         y1="0.5"
+                         x2="1"
+                         y2="0.5"
+                         id="linearGradient9771"
+                         xlink:href="#linearGradient1302"
+                         gradientUnits="objectBoundingBox"
+                         spreadMethod="pad" />
+                      <linearGradient
+                         x1="0"
+                         y1="0.5"
+                         x2="1"
+                         y2="0.5"
+                         id="linearGradient9772"
+                         xlink:href="#linearGradient1305"
+                         gradientUnits="objectBoundingBox"
+                         spreadMethod="pad" />
+                      <linearGradient
+                         id="linearGradient9773">
+                        <stop
+                           id="stop9774"
+                           style="stop-color:#e6da1e;stop-opacity:1"
+                           offset="0" />
+                        <stop
+                           id="stop9775"
+                           style="stop-color:#b5ab17;stop-opacity:1"
+                           offset="1" />
+                      </linearGradient>
+                      <linearGradient
+                         x1="0.28441054"
+                         y1="0.88272494"
+                         x2="0.32513002"
+                         y2="0.10505857"
+                         id="linearGradient9776"
+                         xlink:href="#linearGradient4114" />
+                      <linearGradient
+                         x1="-0.0078431377"
+                         y1="-1.244898"
+                         x2="0.59607846"
+                         y2="0.3605442"
+                         id="linearGradient9777"
+                         xlink:href="#linearGradient1513" />
+                      <linearGradient
+                         x1="-0.4509804"
+                         y1="-0.15053764"
+                         x2="0.47058824"
+                         y2="0.36559141"
+                         id="linearGradient9778"
+                         xlink:href="#linearGradient1513" />
+                      <linearGradient
+                         x1="0.45882353"
+                         y1="1.2772278"
+                         x2="0.6901961"
+                         y2="-0.2970297"
+                         id="linearGradient9779"
+                         xlink:href="#linearGradient2122" />
+                      <linearGradient
+                         x1="-0.18232045"
+                         y1="-0.43962848"
+                         x2="0.68508285"
+                         y2="0.42414862"
+                         id="linearGradient9780"
+                         xlink:href="#linearGradient1513" />
+                      <linearGradient
+                         id="linearGradient9781">
+                        <stop
+                           id="stop9782"
+                           style="stop-color:#000000;stop-opacity:0.40784314"
+                           offset="0" />
+                        <stop
+                           id="stop9783"
+                           style="stop-color:#000000;stop-opacity:0"
+                           offset="1" />
+                      </linearGradient>
+                      <linearGradient
+                         x1="1.3783784"
+                         y1="0.25386998"
+                         x2="0.58378381"
+                         y2="0.13003096"
+                         id="linearGradient9784"
+                         xlink:href="#linearGradient2122" />
+                      <linearGradient
+                         x1="-0.14213198"
+                         y1="-0.28792569"
+                         x2="0.49753696"
+                         y2="0.35603714"
+                         id="linearGradient9785"
+                         xlink:href="#linearGradient1513" />
+                      <linearGradient
+                         x1="0.99512196"
+                         y1="0.64396286"
+                         x2="0.32682925"
+                         y2="0.3003096"
+                         id="linearGradient9786"
+                         xlink:href="#linearGradient1918" />
+                      <linearGradient
+                         x1="0.27843139"
+                         y1="-0.063694268"
+                         x2="0.4509804"
+                         y2="0.61146498"
+                         id="linearGradient9787"
+                         xlink:href="#linearGradient1513" />
+                      <linearGradient
+                         id="linearGradient9788">
+                        <stop
+                           id="stop9789"
+                           style="stop-color:#d6d6d6;stop-opacity:1"
+                           offset="0" />
+                        <stop
+                           id="stop9790"
+                           style="stop-color:#eaeaea;stop-opacity:1"
+                           offset="0.25769231" />
+                        <stop
+                           id="stop9791"
+                           style="stop-color:#919191;stop-opacity:1"
+                           offset="0.7059449" />
+                        <stop
+                           id="stop9792"
+                           style="stop-color:#d2d2d2;stop-opacity:1"
+                           offset="0.73347497" />
+                        <stop
+                           id="stop9793"
+                           style="stop-color:#a6a6a6;stop-opacity:1"
+                           offset="1" />
+                      </linearGradient>
+                      <linearGradient
+                         x1="0.47450981"
+                         y1="0.21771218"
+                         x2="0.80392158"
+                         y2="0.5202952"
+                         id="linearGradient9794"
+                         xlink:href="#linearGradient2317" />
+                      <linearGradient
+                         id="linearGradient9795">
+                        <stop
+                           id="stop9796"
+                           style="stop-color:#ffffff;stop-opacity:1"
+                           offset="0" />
+                        <stop
+                           id="stop9797"
+                           style="stop-color:#ffffff;stop-opacity:0"
+                           offset="1" />
+                      </linearGradient>
+                      <linearGradient
+                         x1="0.41568628"
+                         y1="0.27687296"
+                         x2="0.59607846"
+                         y2="0.44299674"
+                         id="linearGradient9798"
+                         xlink:href="#linearGradient1513" />
+                      <radialGradient
+                         cx="0.5"
+                         cy="0.5"
+                         r="0.5"
+                         fx="0.38431373"
+                         fy="0.47619048"
+                         id="radialGradient9799"
+                         xlink:href="#linearGradient1918" />
+                      <linearGradient
+                         x1="0"
+                         y1="0.5"
+                         x2="1"
+                         y2="0.5"
+                         id="linearGradient9800"
+                         xlink:href="#linearGradient1845"
+                         gradientUnits="objectBoundingBox"
+                         spreadMethod="pad" />
+                      <radialGradient
+                         cx="0.5"
+                         cy="0.5"
+                         r="0.5"
+                         fx="0.50588238"
+                         fy="0.5"
+                         id="radialGradient9801"
+                         xlink:href="#linearGradient1918" />
+                      <linearGradient
+                         x1="0.54355544"
+                         y1="1.1365328"
+                         x2="0.36095273"
+                         y2="0.042242367"
+                         id="linearGradient9802"
+                         xlink:href="#linearGradient4111" />
+                    </defs>
+                  </defs>
+                </defs>
+              </defs>
+              <radialGradient
+                 cx="41.875938"
+                 cy="37.865574"
+                 r="12.562782"
+                 fx="38.969257"
+                 fy="37.267345"
+                 id="radialGradient9900"
+                 xlink:href="#linearGradient4066"
+                 gradientUnits="userSpaceOnUse" />
+              <defs
+                 id="defs9901">
+                <linearGradient
+                   id="linearGradient9902">
+                  <stop
+                     id="stop9903"
+                     style="stop-color:#000000;stop-opacity:0.31638417"
+                     offset="0" />
+                  <stop
+                     id="stop9904"
+                     style="stop-color:#000000;stop-opacity:0.07909604"
+                     offset="0.5" />
+                  <stop
+                     id="stop9905"
+                     style="stop-color:#000000;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <radialGradient
+                   cx="0.5"
+                   cy="0.5"
+                   r="0.5"
+                   fx="0.21951219"
+                   fy="0.25"
+                   id="radialGradient9906"
+                   xlink:href="#linearGradient1918" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient9907"
+                   xlink:href="#linearGradient2774"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient9908">
+                  <stop
+                     id="stop9909"
+                     style="stop-color:#000000;stop-opacity:0.40784314"
+                     offset="0" />
+                  <stop
+                     id="stop9910"
+                     style="stop-color:#000000;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient9911">
+                  <stop
+                     id="stop9912"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9913"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient50919">
+                  <stop
+                     id="stop9915"
+                     style="stop-color:#000000;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop9916"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0.99512196"
+                   y1="0.64396286"
+                   x2="0.32682925"
+                   y2="0.3003096"
+                   id="linearGradient9919"
+                   xlink:href="#linearGradient1918" />
+                <linearGradient
+                   x1="0.21960784"
+                   y1="1.8369565"
+                   x2="0.49411765"
+                   y2="0.17391305"
+                   id="linearGradient9920"
+                   xlink:href="#linearGradient2122" />
+                <linearGradient
+                   x1="-0.0070921984"
+                   y1="-0.53947371"
+                   x2="0.78823531"
+                   y2="0.76666665"
+                   id="linearGradient16999"
+                   xlink:href="#linearGradient2122" />
+                <linearGradient
+                   x1="3.6666667"
+                   y1="0.296875"
+                   x2="0.25925925"
+                   y2="0.375"
+                   id="linearGradient50928"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="0.71770334"
+                   y1="0.140625"
+                   x2="0.45933014"
+                   y2="0.4765625"
+                   id="linearGradient9923"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="0.74117649"
+                   y1="0.040816326"
+                   x2="0.70588237"
+                   y2="0.45918366"
+                   id="linearGradient17002"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="0.41568628"
+                   y1="0.27687296"
+                   x2="0.59607846"
+                   y2="0.44299674"
+                   id="linearGradient9925"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="1.3783784"
+                   y1="0.25386998"
+                   x2="0.58378381"
+                   y2="0.13003096"
+                   id="linearGradient9926"
+                   xlink:href="#linearGradient2122" />
+                <linearGradient
+                   x1="-0.10588235"
+                   y1="-0.10497238"
+                   x2="0.58431375"
+                   y2="0.55248618"
+                   id="linearGradient9927"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="-0.25352111"
+                   y1="-0.109375"
+                   x2="0.67605633"
+                   y2="0.4609375"
+                   id="linearGradient9928"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="-0.14213198"
+                   y1="-0.28792569"
+                   x2="0.49753696"
+                   y2="0.35603714"
+                   id="linearGradient9929"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="0.45882353"
+                   y1="-0.58685446"
+                   x2="0.65490198"
+                   y2="0.45070422"
+                   id="linearGradient9930"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="-0.0078431377"
+                   y1="-1.244898"
+                   x2="0.59607846"
+                   y2="0.3605442"
+                   id="linearGradient9931"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="0.3764706"
+                   y1="-0.84042555"
+                   x2="0.56078434"
+                   y2="0.52127659"
+                   id="linearGradient9932"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="-0.23645321"
+                   y1="-0.5078125"
+                   x2="0.36453202"
+                   y2="0.6328125"
+                   id="linearGradient9933"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="0.47450981"
+                   y1="0.21771218"
+                   x2="0.80392158"
+                   y2="0.5202952"
+                   id="linearGradient9934"
+                   xlink:href="#linearGradient2317" />
+                <linearGradient
+                   x1="0.90810812"
+                   y1="0.55727553"
+                   x2="0.49189189"
+                   y2="0.44891641"
+                   id="linearGradient9935"
+                   xlink:href="#linearGradient2122" />
+                <radialGradient
+                   cx="0.5"
+                   cy="0.5"
+                   r="0.5"
+                   fx="0.38431373"
+                   fy="0.47619048"
+                   id="radialGradient9936"
+                   xlink:href="#linearGradient1918" />
+              </defs>
+              <linearGradient
+                 x1="184.78476"
+                 y1="57.899975"
+                 x2="140.56078"
+                 y2="51.007587"
+                 id="linearGradient9979"
+                 xlink:href="#linearGradient2122"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.743874,0,0,1.344314,50,-150)" />
+              <linearGradient
+                 x1="110.14813"
+                 y1="26.185833"
+                 x2="145.99422"
+                 y2="61.882057"
+                 id="linearGradient9980"
+                 xlink:href="#linearGradient1513"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.734347,0,0,1.361754,50,-150)" />
+              <linearGradient
+                 x1="69.358948"
+                 y1="38.345039"
+                 x2="78.468063"
+                 y2="62.560368"
+                 id="linearGradient9981"
+                 xlink:href="#linearGradient1513"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.298814,0,0,0.769933,50,-150)" />
+              <linearGradient
+                 x1="330.04102"
+                 y1="37.053959"
+                 x2="254.92361"
+                 y2="38.776249"
+                 id="linearGradient9982"
+                 xlink:href="#linearGradient1513"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.440755,0,0,2.268834,50,-150)" />
+              <linearGradient
+                 x1="87.17804"
+                 y1="161.48409"
+                 x2="95.870804"
+                 y2="102.33855"
+                 id="linearGradient9983"
+                 xlink:href="#linearGradient2122"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.130709,0,0,0.884401,50,-150)" />
+              <linearGradient
+                 x1="85.153625"
+                 y1="144.6342"
+                 x2="90.263031"
+                 y2="164.62656"
+                 id="linearGradient9984"
+                 xlink:href="#linearGradient1513"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.257313,0,0,0.795347,100,-150)" />
+              <linearGradient
+                 x1="182.22311"
+                 y1="89.382622"
+                 x2="142.08492"
+                 y2="68.742538"
+                 id="linearGradient9985"
+                 xlink:href="#linearGradient4066"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.794082,0,0,1.259316,100,-150)" />
+              <linearGradient
+                 x1="129.35207"
+                 y1="35.074184"
+                 x2="160.34494"
+                 y2="66.275108"
+                 id="linearGradient9986"
+                 xlink:href="#linearGradient1513"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.766629,0,0,1.304412,100,-150)" />
+              <linearGradient
+                 x1="69.358948"
+                 y1="38.345039"
+                 x2="78.468063"
+                 y2="62.560368"
+                 id="linearGradient9987"
+                 xlink:href="#linearGradient1513"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.053415,0.75976,-0.450383,0.624461,184.0418,-192.118)" />
+              <linearGradient
+                 x1="1.4050696"
+                 y1="182.46344"
+                 x2="62.191277"
+                 y2="282.29065"
+                 id="linearGradient17066"
+                 xlink:href="#linearGradient2122"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.329536,0,0,0.35639,20.57572,14.10475)" />
+              <linearGradient
+                 x1="106.69141"
+                 y1="21.871695"
+                 x2="117.74989"
+                 y2="32.055485"
+                 id="linearGradient9989"
+                 xlink:href="#linearGradient1513"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.895098,1.117196)" />
+              <linearGradient
+                 x1="65.040573"
+                 y1="73.787125"
+                 x2="77.333061"
+                 y2="85.078453"
+                 id="linearGradient9990"
+                 xlink:href="#linearGradient2317"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.954815,1.047323)" />
+              <linearGradient
+                 x1="23.800308"
+                 y1="135.01959"
+                 x2="33.550014"
+                 y2="142.12923"
+                 id="linearGradient9991"
+                 xlink:href="#linearGradient2780"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.225045,0.816297)" />
+              <linearGradient
+                 x1="-191.46153"
+                 y1="37.372372"
+                 x2="-165.58835"
+                 y2="37.372372"
+                 id="linearGradient18041"
+                 xlink:href="#linearGradient2678"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient9993"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <linearGradient
+                 x1="-49.171364"
+                 y1="121.40791"
+                 x2="-160.71114"
+                 y2="-157.53516"
+                 id="linearGradient9994"
+                 xlink:href="#linearGradient1700"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+              <linearGradient
+                 x1="88.712402"
+                 y1="138.15012"
+                 x2="104.81104"
+                 y2="151.63045"
+                 id="linearGradient9995"
+                 xlink:href="#linearGradient3305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+              <radialGradient
+                 cx="-77.367622"
+                 cy="42.633839"
+                 r="216.26619"
+                 fx="-80.036034"
+                 fy="44.468376"
+                 id="radialGradient9996"
+                 xlink:href="#linearGradient2678"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+              <linearGradient
+                 x1="483.2298"
+                 y1="97.833481"
+                 x2="562.21454"
+                 y2="1064.5424"
+                 id="linearGradient9997"
+                 xlink:href="#linearGradient1531"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.502271,0.665659)" />
+              <linearGradient
+                 x1="360.48212"
+                 y1="2746.856"
+                 x2="339.39331"
+                 y2="2606.2637"
+                 id="linearGradient9998"
+                 xlink:href="#linearGradient5274"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(4.209444,0.237561)" />
+              <defs
+                 id="defs9999">
+                <linearGradient
+                   id="linearGradient10000">
+                  <stop
+                     id="stop10001"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10002"
+                     style="stop-color:#fafbff;stop-opacity:1"
+                     offset="0.25" />
+                  <stop
+                     id="stop10003"
+                     style="stop-color:#f0f2fa;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop10004"
+                     style="stop-color:#e1e1e1;stop-opacity:1"
+                     offset="0.75" />
+                  <stop
+                     id="stop10005"
+                     style="stop-color:#f5f6ff;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient10006">
+                  <stop
+                     id="stop10007"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10008"
+                     style="stop-color:#d0d1d9;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop10009"
+                     style="stop-color:#878b9b;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient10010">
+                  <stop
+                     id="stop10011"
+                     style="stop-color:#e8e8e8;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10012"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="-49.171364"
+                   y1="121.40791"
+                   x2="-160.71114"
+                   y2="-157.53516"
+                   id="linearGradient10013"
+                   xlink:href="#linearGradient1700"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+                <radialGradient
+                   cx="-77.367622"
+                   cy="42.633839"
+                   r="216.26619"
+                   fx="-80.036034"
+                   fy="44.468376"
+                   id="radialGradient10014"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+                <defs
+                   id="defs10015">
+                  <linearGradient
+                     id="linearGradient17094">
+                    <stop
+                       id="stop17095"
+                       style="stop-color:#ffffff;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop10018"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient10019">
+                    <stop
+                       id="stop10020"
+                       style="stop-color:#000000;stop-opacity:0.14835165"
+                       offset="0" />
+                    <stop
+                       id="stop10021"
+                       style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                       offset="0.5" />
+                    <stop
+                       id="stop10022"
+                       style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                       offset="0.75" />
+                    <stop
+                       id="stop10023"
+                       style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                       offset="0.875" />
+                    <stop
+                       id="stop10024"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient10025">
+                    <stop
+                       id="stop10026"
+                       style="stop-color:#b18e4b;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop10027"
+                       style="stop-color:#f7dca0;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="133.07144"
+                     y1="28.231943"
+                     x2="118.58411"
+                     y2="13.431207"
+                     id="linearGradient17106"
+                     xlink:href="#linearGradient1696"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                  <linearGradient
+                     x1="30.722504"
+                     y1="28.135216"
+                     x2="39.78149"
+                     y2="27.315481"
+                     id="linearGradient17107"
+                     xlink:href="#linearGradient2354"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(0.475459,2.103232)" />
+                  <radialGradient
+                     cx="4.9853168"
+                     cy="108.47158"
+                     r="34.222183"
+                     fx="5.2520976"
+                     fy="108.73115"
+                     id="radialGradient17108"
+                     xlink:href="#linearGradient2877"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="36.826332"
+                     y1="75.332558"
+                     x2="25.761681"
+                     y2="135.90358"
+                     id="linearGradient50998"
+                     xlink:href="#linearGradient2877"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                  <linearGradient
+                     x1="78.675774"
+                     y1="47.411823"
+                     x2="64.05336"
+                     y2="34.302757"
+                     id="linearGradient17110"
+                     xlink:href="#linearGradient4281"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                  <defs
+                     id="defs10033">
+                    <linearGradient
+                       x1="-0.11621207"
+                       y1="-6.0209217"
+                       x2="5.1193113"
+                       y2="-6.0209217"
+                       id="linearGradient10034"
+                       xlink:href="#linearGradient3296"
+                       gradientUnits="userSpaceOnUse"
+                       gradientTransform="scale(1.081817,0.9243707)"
+                       spreadMethod="pad" />
+                  </defs>
+                </defs>
+                <linearGradient
+                   x1="88.712402"
+                   y1="138.15012"
+                   x2="104.81104"
+                   y2="151.63045"
+                   id="linearGradient17127"
+                   xlink:href="#linearGradient3305"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+                <defs
+                   id="defs10050">
+                  <linearGradient
+                     x1="54.374016"
+                     y1="203.45213"
+                     x2="89.85218"
+                     y2="203.45213"
+                     id="linearGradient10051"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(1.0110149,0.9891051)">
+                    <stop
+                       id="stop10052"
+                       style="stop-color:#533b2b;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop10053"
+                       style="stop-color:#ab7958;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient10054">
+                    <stop
+                       id="stop10055"
+                       style="stop-color:#1a6e8e;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop10056"
+                       style="stop-color:#c3efff;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                </defs>
+                <linearGradient
+                   x1="483.2298"
+                   y1="97.833481"
+                   x2="562.21454"
+                   y2="1064.5424"
+                   id="linearGradient10064"
+                   xlink:href="#linearGradient1531"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.502271,0.665659)" />
+                <linearGradient
+                   x1="360.48212"
+                   y1="2746.856"
+                   x2="339.39331"
+                   y2="2606.2637"
+                   id="linearGradient17143"
+                   xlink:href="#linearGradient5274"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(4.209444,0.237561)" />
+              </defs>
+            </defs>
+            <linearGradient
+               x1="360.48212"
+               y1="2746.856"
+               x2="339.39331"
+               y2="2606.2637"
+               id="linearGradient10080"
+               xlink:href="#linearGradient5274"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(4.209444,0.237561)" />
+            <linearGradient
+               x1="307.43765"
+               y1="234.53671"
+               x2="292.48148"
+               y2="245.30841"
+               id="linearGradient10081"
+               xlink:href="#linearGradient3936"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.847559,0,0,0.796411,18.7268,-73.96861)" />
+          </defs>
+        </defs>
+        <defs
+           id="defs10089">
+          <linearGradient
+             id="linearGradient10090">
+            <stop
+               id="stop10091"
+               style="stop-color:#ff0d0d;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop10092"
+               style="stop-color:#e65b5b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient10093">
+            <stop
+               id="stop10094"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0.0056" />
+            <stop
+               id="stop10095"
+               style="stop-color:#a9e6ff;stop-opacity:1"
+               offset="0.25839999" />
+            <stop
+               id="stop10096"
+               style="stop-color:#034cfe;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient10097">
+            <stop
+               id="stop10098"
+               style="stop-color:#85baff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop10099"
+               style="stop-color:#0f76ff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient10100">
+            <stop
+               id="stop10101"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop10102"
+               style="stop-color:#fafbff;stop-opacity:1"
+               offset="0.25" />
+            <stop
+               id="stop10103"
+               style="stop-color:#f0f2fa;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop10104"
+               style="stop-color:#e1e1e1;stop-opacity:1"
+               offset="0.75" />
+            <stop
+               id="stop10105"
+               style="stop-color:#f5f6ff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient10106">
+            <stop
+               id="stop10107"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop10108"
+               style="stop-color:#d0d1d9;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop10109"
+               style="stop-color:#878b9b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient10110">
+            <stop
+               id="stop10111"
+               style="stop-color:#e8e8e8;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop10112"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient10113"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient10114"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <defs
+             id="defs10115">
+            <linearGradient
+               id="linearGradient10116">
+              <stop
+                 id="stop10117"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop10118"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10119">
+              <stop
+                 id="stop17198"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop10121"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop10122"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop17201"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop17202"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10125">
+              <stop
+                 id="stop17204"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop10127"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient10128"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient10129"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient10130"
+               xlink:href="#linearGradient3296"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient10131"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient10132"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs10133">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient10134"
+                 xlink:href="#linearGradient3296"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+            </defs>
+          </defs>
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient10149"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          <defs
+             id="defs10150">
+            <linearGradient
+               id="linearGradient10151">
+              <stop
+                 id="stop10152"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="0" />
+              <stop
+                 id="stop10153"
+                 style="stop-color:#ffffff;stop-opacity:0.56179774"
+                 offset="0.50793612" />
+              <stop
+                 id="stop10154"
+                 style="stop-color:#ffffff;stop-opacity:0.13725491"
+                 offset="0.79061538" />
+              <stop
+                 id="stop10155"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient51084">
+              <stop
+                 id="stop10157"
+                 style="stop-color:#ae1b1b;stop-opacity:0.99215686"
+                 offset="0" />
+              <stop
+                 id="stop10158"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10159">
+              <stop
+                 id="stop10160"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop10161"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10162">
+              <stop
+                 id="stop10163"
+                 style="stop-color:#000000;stop-opacity:0.40784314"
+                 offset="0" />
+              <stop
+                 id="stop10164"
+                 style="stop-color:#000000;stop-opacity:0.07344633"
+                 offset="0.6477778" />
+              <stop
+                 id="stop10165"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <radialGradient
+               cx="0.50522649"
+               cy="0.54545456"
+               r="0.46065515"
+               fx="0.51611376"
+               fy="0.56148684"
+               id="radialGradient10166"
+               xlink:href="#linearGradient1806" />
+            <linearGradient
+               x1="1.9047619"
+               y1="0.79545456"
+               x2="-1.0952381"
+               y2="0.075757578"
+               id="linearGradient10169"
+               xlink:href="#linearGradient1806" />
+            <linearGradient
+               x1="-0.63529414"
+               y1="-1.2424242"
+               x2="0.25882354"
+               y2="1.060606"
+               id="linearGradient10170"
+               xlink:href="#linearGradient2248" />
+            <linearGradient
+               x1="0.46242774"
+               y1="0.32575756"
+               x2="0.41583115"
+               y2="0.32575756"
+               id="linearGradient10173"
+               xlink:href="#linearGradient1540" />
+            <linearGradient
+               x1="0.20784314"
+               y1="-2.0476191"
+               x2="0.54901963"
+               y2="0.60714287"
+               id="linearGradient10174"
+               xlink:href="#linearGradient2248" />
+            <radialGradient
+               cx="0.5"
+               cy="0.5"
+               r="0.5"
+               fx="0.5"
+               fy="0.5"
+               id="radialGradient1539"
+               xlink:href="#linearGradient1540" />
+          </defs>
+          <defs
+             id="defs10220">
+            <linearGradient
+               id="linearGradient10221">
+              <stop
+                 id="stop10222"
+                 style="stop-color:#000000;stop-opacity:0.29411766"
+                 offset="0" />
+              <stop
+                 id="stop10223"
+                 style="stop-color:#000000;stop-opacity:0.16483517"
+                 offset="0.6477778" />
+              <stop
+                 id="stop10224"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10225">
+              <stop
+                 id="stop10226"
+                 style="stop-color:#000000;stop-opacity:0.2937853"
+                 offset="0" />
+              <stop
+                 id="stop10227"
+                 style="stop-color:#000000;stop-opacity:0.06214689"
+                 offset="0.6477778" />
+              <stop
+                 id="stop10228"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10229">
+              <stop
+                 id="stop10230"
+                 style="stop-color:#ffffff;stop-opacity:0.69072163"
+                 offset="0" />
+              <stop
+                 id="stop10231"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10232">
+              <stop
+                 id="stop10233"
+                 style="stop-color:#ffffff;stop-opacity:0.61983472"
+                 offset="0" />
+              <stop
+                 id="stop17312"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient51122">
+              <stop
+                 id="stop10236"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="0" />
+              <stop
+                 id="stop10237"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient17316">
+              <stop
+                 id="stop17317"
+                 style="stop-color:#ffffff;stop-opacity:0.61983472"
+                 offset="0" />
+              <stop
+                 id="stop17318"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient51129">
+              <stop
+                 id="stop10242"
+                 style="stop-color:#000000;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop10243"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient51133">
+              <stop
+                 id="stop10245"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop10246"
+                 style="stop-color:#ffffff;stop-opacity:0.16078432"
+                 offset="0.52955699" />
+              <stop
+                 id="stop10247"
+                 style="stop-color:#000000;stop-opacity:0.05882353"
+                 offset="0.67708677" />
+              <stop
+                 id="stop10248"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient17327">
+              <stop
+                 id="stop10250"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="0" />
+              <stop
+                 id="stop17329"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10252">
+              <stop
+                 id="stop10253"
+                 style="stop-color:#000000;stop-opacity:0.3882353"
+                 offset="0" />
+              <stop
+                 id="stop10254"
+                 style="stop-color:#ffffff;stop-opacity:0.34375"
+                 offset="0.5" />
+              <stop
+                 id="stop10255"
+                 style="stop-color:#ffffff;stop-opacity:0.19607843"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10256">
+              <stop
+                 id="stop10257"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="0" />
+              <stop
+                 id="stop10258"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient17337">
+              <stop
+                 id="stop17338"
+                 style="stop-color:#000000;stop-opacity:0.3882353"
+                 offset="0" />
+              <stop
+                 id="stop17339"
+                 style="stop-color:#000000;stop-opacity:0.19215687"
+                 offset="0.5" />
+              <stop
+                 id="stop10262"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10263">
+              <stop
+                 id="stop10264"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop10265"
+                 style="stop-color:#ffffff;stop-opacity:0.16078432"
+                 offset="0.52955699" />
+              <stop
+                 id="stop10266"
+                 style="stop-color:#000000;stop-opacity:0.05882353"
+                 offset="0.67708677" />
+              <stop
+                 id="stop10267"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10268">
+              <stop
+                 id="stop10269"
+                 style="stop-color:#171a00;stop-opacity:0.66670001"
+                 offset="0" />
+              <stop
+                 id="stop10270"
+                 style="stop-color:#2f2500;stop-opacity:0.0039"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10271">
+              <stop
+                 id="stop10272"
+                 style="stop-color:#ffcf3d;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop10273"
+                 style="stop-color:#b27f00;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10274">
+              <stop
+                 id="stop10275"
+                 style="stop-color:#bfff00;stop-opacity:0.60000002"
+                 offset="0" />
+              <stop
+                 id="stop10276"
+                 style="stop-color:#fff200;stop-opacity:0.60000002"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10277">
+              <stop
+                 id="stop10278"
+                 style="stop-color:#000000;stop-opacity:0.3882353"
+                 offset="0" />
+              <stop
+                 id="stop10279"
+                 style="stop-color:#000000;stop-opacity:0.19215687"
+                 offset="0.5" />
+              <stop
+                 id="stop10280"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10281">
+              <stop
+                 id="stop10282"
+                 style="stop-color:#43b0e2;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop10283"
+                 style="stop-color:#43b0e2;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10284">
+              <stop
+                 id="stop10285"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop10286"
+                 style="stop-color:#fafbff;stop-opacity:1"
+                 offset="0.25" />
+              <stop
+                 id="stop10287"
+                 style="stop-color:#f0f2fa;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop10288"
+                 style="stop-color:#e1e1e1;stop-opacity:1"
+                 offset="0.75" />
+              <stop
+                 id="stop10289"
+                 style="stop-color:#f5f6ff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10290">
+              <stop
+                 id="stop10291"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop10292"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop10293"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient10294">
+              <stop
+                 id="stop10295"
+                 style="stop-color:#e8e8e8;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop10296"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="-191.46153"
+               y1="37.372372"
+               x2="-165.58835"
+               y2="37.372372"
+               id="linearGradient10297"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient10298"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient10299"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <defs
+               id="defs10300">
+              <linearGradient
+                 id="linearGradient10301">
+                <stop
+                   id="stop10302"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop10303"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient10304">
+                <stop
+                   id="stop10305"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop10306"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop10307"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop10308"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop10309"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient10310">
+                <stop
+                   id="stop10311"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop10312"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient10313"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient10314"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient10315"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient10316"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient10317"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs10318">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient10319"
+                   xlink:href="#linearGradient3296"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient10320"
+                   xlink:href="#linearGradient2483"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+              </defs>
+            </defs>
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient17413"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            <linearGradient
+               x1="17.914211"
+               y1="221.47987"
+               x2="425.89865"
+               y2="221.47987"
+               id="linearGradient10336"
+               xlink:href="#linearGradient2483"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988025,1.012121)" />
+            <linearGradient
+               x1="17.914211"
+               y1="221.47987"
+               x2="425.89865"
+               y2="221.47987"
+               id="linearGradient10337"
+               xlink:href="#linearGradient2483"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988025,1.012121)" />
+            <linearGradient
+               x1="17.914211"
+               y1="221.47987"
+               x2="425.89865"
+               y2="221.47987"
+               id="linearGradient10338"
+               xlink:href="#linearGradient2483"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.988025,1.012121)" />
+            <defs
+               id="defs10339">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient10340"
+                 xlink:href="#linearGradient4595"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient10341"
+                 xlink:href="#linearGradient3108"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient10342"
+                 xlink:href="#linearGradient3749"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient10343"
+                 xlink:href="#linearGradient3527"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient17422"
+                 xlink:href="#linearGradient3076"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient17423">
+                <stop
+                   id="stop10346"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop10347"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="217.42307"
+                 y1="536.03741"
+                 x2="217.42307"
+                 y2="459.23132"
+                 id="linearGradient10348"
+                 xlink:href="#linearGradient838"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.241013,0.805793)" />
+              <linearGradient
+                 x1="87.605721"
+                 y1="1061.6371"
+                 x2="87.605721"
+                 y2="1160.6499"
+                 id="linearGradient10349"
+                 xlink:href="#linearGradient838"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.930484,0.518005)" />
+              <linearGradient
+                 x1="177.77042"
+                 y1="831.05975"
+                 x2="178.45302"
+                 y2="795.11487"
+                 id="linearGradient10350"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.548996,0.64558)" />
+              <linearGradient
+                 x1="458.70102"
+                 y1="329.58002"
+                 x2="404.87259"
+                 y2="326.23184"
+                 id="linearGradient10351"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.733715,1.362927)" />
+              <linearGradient
+                 x1="139.11636"
+                 y1="564.54614"
+                 x2="200.18613"
+                 y2="564.54614"
+                 id="linearGradient10352"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.54934,0.645436)" />
+              <linearGradient
+                 x1="118.25803"
+                 y1="563.01941"
+                 x2="156.10408"
+                 y2="564.03723"
+                 id="linearGradient10353"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.54934,0.645436)" />
+              <linearGradient
+                 x1="238.75548"
+                 y1="339.24017"
+                 x2="317.05142"
+                 y2="333.88309"
+                 id="linearGradient10354"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.733715,1.362927)" />
+              <linearGradient
+                 x1="192.95671"
+                 y1="559.13995"
+                 x2="192.95671"
+                 y2="588.70502"
+                 id="linearGradient10355"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.380924,0.724153)" />
+              <linearGradient
+                 x1="199.15404"
+                 y1="696.90118"
+                 x2="193.92329"
+                 y2="593.573"
+                 id="linearGradient10356"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.381391,0.723908)" />
+              <linearGradient
+                 x1="354.95923"
+                 y1="464.90207"
+                 x2="354.95923"
+                 y2="299.05014"
+                 id="linearGradient10357"
+                 xlink:href="#linearGradient1102"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.733715,1.362927)" />
+              <radialGradient
+                 cx="184.20265"
+                 cy="780.47272"
+                 r="49.972103"
+                 fx="182.57774"
+                 fy="734.32568"
+                 id="radialGradient10358"
+                 xlink:href="#linearGradient948"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.455004,0.687283)" />
+              <radialGradient
+                 cx="0.52464789"
+                 cy="0.32867134"
+                 r="0.28679976"
+                 fx="0.52464789"
+                 fy="0.59440559"
+                 id="radialGradient10359"
+                 xlink:href="#linearGradient843" />
+              <radialGradient
+                 cx="106.52795"
+                 cy="541.31592"
+                 r="49.665058"
+                 fx="105.48236"
+                 fy="502.10669"
+                 id="radialGradient10360"
+                 xlink:href="#linearGradient994"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="84.970261"
+                 y1="1095.1855"
+                 x2="84.970261"
+                 y2="1189.3411"
+                 id="linearGradient10361"
+                 xlink:href="#linearGradient838"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.987109,0.503244)" />
+              <linearGradient
+                 x1="217.42307"
+                 y1="536.03741"
+                 x2="217.42307"
+                 y2="459.23132"
+                 id="linearGradient10362"
+                 xlink:href="#linearGradient838"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="199.15404"
+                 y1="696.90118"
+                 x2="193.92329"
+                 y2="593.573"
+                 id="linearGradient10363"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="192.95671"
+                 y1="559.13995"
+                 x2="192.95671"
+                 y2="588.70502"
+                 id="linearGradient10364"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="192.95671"
+                 y1="559.13995"
+                 x2="192.95671"
+                 y2="588.70502"
+                 id="linearGradient10365"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="199.15404"
+                 y1="696.90118"
+                 x2="193.92329"
+                 y2="593.573"
+                 id="linearGradient10366"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="217.42307"
+                 y1="536.03741"
+                 x2="217.42307"
+                 y2="459.23132"
+                 id="linearGradient10367"
+                 xlink:href="#linearGradient838"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+            </defs>
+            <defs
+               id="defs10413">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient10414"
+                 xlink:href="#linearGradient3615"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient10415"
+                 xlink:href="#linearGradient3608"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient10416"
+                 xlink:href="#linearGradient3612"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0.314347"
+                 y1="0.54857099"
+                 x2="0.53643698"
+                 y2="0.554286"
+                 id="linearGradient10417"
+                 xlink:href="#linearGradient218" />
+              <linearGradient
+                 x1="0.246326"
+                 y1="0.59428602"
+                 x2="0.78109801"
+                 y2="0.57142901"
+                 id="linearGradient10418"
+                 xlink:href="#linearGradient223" />
+              <radialGradient
+                 cx="0.257236"
+                 cy="0.27271599"
+                 r="0.65467203"
+                 fx="0.273312"
+                 fy="0.51515198"
+                 id="radialGradient10419"
+                 xlink:href="#linearGradient1105" />
+            </defs>
+            <linearGradient
+               x1="458.70102"
+               y1="329.58002"
+               x2="404.87259"
+               y2="326.23184"
+               id="linearGradient10467"
+               xlink:href="#linearGradient3527"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="354.95923"
+               y1="464.90207"
+               x2="354.95923"
+               y2="299.05014"
+               id="linearGradient10468"
+               xlink:href="#linearGradient1102"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="238.75548"
+               y1="339.24017"
+               x2="317.05142"
+               y2="333.88309"
+               id="linearGradient10469"
+               xlink:href="#linearGradient3527"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="458.70102"
+               y1="329.58002"
+               x2="404.87259"
+               y2="326.23184"
+               id="linearGradient10470"
+               xlink:href="#linearGradient3527"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.733715,1.362927)" />
+            <linearGradient
+               x1="192.95671"
+               y1="559.13995"
+               x2="192.95671"
+               y2="588.70502"
+               id="linearGradient10471"
+               xlink:href="#linearGradient3527"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="199.15404"
+               y1="696.90118"
+               x2="193.92329"
+               y2="593.573"
+               id="linearGradient10472"
+               xlink:href="#linearGradient3527"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="217.42307"
+               y1="536.03741"
+               x2="217.42307"
+               y2="459.23132"
+               id="linearGradient10473"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+            <linearGradient
+               x1="118.25803"
+               y1="563.01941"
+               x2="156.10408"
+               y2="564.03723"
+               id="linearGradient10474"
+               xlink:href="#linearGradient3527"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <linearGradient
+               x1="139.11636"
+               y1="564.54614"
+               x2="200.18613"
+               y2="564.54614"
+               id="linearGradient10475"
+               xlink:href="#linearGradient3527"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.54934,0.645436)" />
+            <radialGradient
+               cx="184.20265"
+               cy="780.47272"
+               r="49.972103"
+               fx="182.57774"
+               fy="734.32568"
+               id="radialGradient10476"
+               xlink:href="#linearGradient3749"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.455004,0.687283)" />
+            <linearGradient
+               x1="177.77042"
+               y1="831.05975"
+               x2="178.45302"
+               y2="795.11487"
+               id="linearGradient10477"
+               xlink:href="#linearGradient3527"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.548996,0.64558)" />
+            <linearGradient
+               x1="84.970261"
+               y1="1095.1855"
+               x2="84.970261"
+               y2="1189.3411"
+               id="linearGradient10478"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.987109,0.503244)" />
+            <linearGradient
+               x1="87.605721"
+               y1="1061.6371"
+               x2="87.605721"
+               y2="1160.6499"
+               id="linearGradient10479"
+               xlink:href="#linearGradient838"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.930484,0.518005)" />
+            <radialGradient
+               cx="106.52795"
+               cy="541.31592"
+               r="49.665058"
+               fx="105.48236"
+               fy="502.10669"
+               id="radialGradient10480"
+               xlink:href="#linearGradient994"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="-91.514885"
+               y1="199.05321"
+               x2="30.274208"
+               y2="194.82513"
+               id="linearGradient10481"
+               xlink:href="#linearGradient4595"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.026011,0.974648)" />
+            <linearGradient
+               x1="-4.4710765"
+               y1="366.76578"
+               x2="26.069948"
+               y2="512.50165"
+               id="linearGradient10482"
+               xlink:href="#linearGradient4595"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.633883,0,0,0.536553,-25.41624,-15.94345)" />
+            <linearGradient
+               x1="-49.343468"
+               y1="302.82651"
+               x2="-10.230718"
+               y2="302.82651"
+               id="linearGradient10483"
+               xlink:href="#linearGradient4592"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.318581,0.758391)" />
+            <linearGradient
+               x1="-18.900764"
+               y1="185.38274"
+               x2="24.677307"
+               y2="151.7379"
+               id="linearGradient10484"
+               xlink:href="#linearGradient4595"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.706204,1.416022)" />
+            <linearGradient
+               x1="-6.0588322"
+               y1="210.60007"
+               x2="6.9808698"
+               y2="293.03543"
+               id="linearGradient10485"
+               xlink:href="#linearGradient4588"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.439544,0,0,0.694664,-12.26418,6.7453)" />
+            <linearGradient
+               x1="-91.514885"
+               y1="199.05321"
+               x2="30.274208"
+               y2="194.82513"
+               id="linearGradient10486"
+               xlink:href="#linearGradient4595"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.272246,-0.435187,0.939711,0.665801,-204.4414,93.2513)" />
+            <linearGradient
+               x1="-18.900764"
+               y1="185.38274"
+               x2="24.677307"
+               y2="151.7379"
+               id="linearGradient10487"
+               xlink:href="#linearGradient4595"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.706204,1.416022)" />
+            <linearGradient
+               x1="-91.514885"
+               y1="199.05321"
+               x2="30.274208"
+               y2="194.82513"
+               id="linearGradient10488"
+               xlink:href="#linearGradient4595"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.026011,0.974648)" />
+            <linearGradient
+               x1="-49.343468"
+               y1="302.82651"
+               x2="-10.230718"
+               y2="302.82651"
+               id="linearGradient10489"
+               xlink:href="#linearGradient4592"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.318581,0.758391)" />
+            <linearGradient
+               x1="-6.0588322"
+               y1="210.60007"
+               x2="6.9808698"
+               y2="293.03543"
+               id="linearGradient10490"
+               xlink:href="#linearGradient4588"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.439544,0,0,0.694664,-12.26418,6.7453)" />
+            <linearGradient
+               x1="-91.514885"
+               y1="199.05321"
+               x2="30.274208"
+               y2="194.82513"
+               id="linearGradient10491"
+               xlink:href="#linearGradient4595"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.272246,-0.435187,0.939711,0.665801,-204.4414,93.2513)" />
+            <defs
+               id="defs10492">
+              <linearGradient
+                 id="linearGradient10493">
+                <stop
+                   id="stop10494"
+                   style="stop-color:#000000;stop-opacity:0.3882353"
+                   offset="0" />
+                <stop
+                   id="stop10495"
+                   style="stop-color:#ffffff;stop-opacity:0.34375"
+                   offset="0.5" />
+                <stop
+                   id="stop10496"
+                   style="stop-color:#ffffff;stop-opacity:0.19607843"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient10497"
+                 xlink:href="#linearGradient3057"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient10498"
+                 xlink:href="#linearGradient4618"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient10499"
+                 xlink:href="#linearGradient4588"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient10500"
+                 xlink:href="#linearGradient4615"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient10501"
+                 xlink:href="#linearGradient3041"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="217.42307"
+                 y1="536.03741"
+                 x2="217.42307"
+                 y2="459.23132"
+                 id="linearGradient10502"
+                 xlink:href="#linearGradient838"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.241013,0.805793)" />
+              <linearGradient
+                 x1="87.605721"
+                 y1="1061.6371"
+                 x2="87.605721"
+                 y2="1160.6499"
+                 id="linearGradient10503"
+                 xlink:href="#linearGradient838"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.930484,0.518005)" />
+              <linearGradient
+                 x1="177.77042"
+                 y1="831.05975"
+                 x2="178.45302"
+                 y2="795.11487"
+                 id="linearGradient10504"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.548996,0.64558)" />
+              <linearGradient
+                 x1="458.70102"
+                 y1="329.58002"
+                 x2="404.87259"
+                 y2="326.23184"
+                 id="linearGradient10505"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.733715,1.362927)" />
+              <linearGradient
+                 x1="139.11636"
+                 y1="564.54614"
+                 x2="200.18613"
+                 y2="564.54614"
+                 id="linearGradient10506"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.54934,0.645436)" />
+              <linearGradient
+                 x1="118.25803"
+                 y1="563.01941"
+                 x2="156.10408"
+                 y2="564.03723"
+                 id="linearGradient10507"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.54934,0.645436)" />
+              <linearGradient
+                 x1="238.75548"
+                 y1="339.24017"
+                 x2="317.05142"
+                 y2="333.88309"
+                 id="linearGradient10508"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.733715,1.362927)" />
+              <linearGradient
+                 x1="192.95671"
+                 y1="559.13995"
+                 x2="192.95671"
+                 y2="588.70502"
+                 id="linearGradient10509"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.380924,0.724153)" />
+              <linearGradient
+                 x1="199.15404"
+                 y1="696.90118"
+                 x2="193.92329"
+                 y2="593.573"
+                 id="linearGradient10510"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.381391,0.723908)" />
+              <linearGradient
+                 x1="354.95923"
+                 y1="464.90207"
+                 x2="354.95923"
+                 y2="299.05014"
+                 id="linearGradient10511"
+                 xlink:href="#linearGradient1102"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.733715,1.362927)" />
+              <radialGradient
+                 cx="184.20265"
+                 cy="780.47272"
+                 r="49.972103"
+                 fx="182.57774"
+                 fy="734.32568"
+                 id="radialGradient10512"
+                 xlink:href="#linearGradient948"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.455004,0.687283)" />
+              <radialGradient
+                 cx="0.52464789"
+                 cy="0.32867134"
+                 r="0.28679976"
+                 fx="0.52464789"
+                 fy="0.59440559"
+                 id="radialGradient10513"
+                 xlink:href="#linearGradient843" />
+              <radialGradient
+                 cx="106.52795"
+                 cy="541.31592"
+                 r="49.665058"
+                 fx="105.48236"
+                 fy="502.10669"
+                 id="radialGradient10514"
+                 xlink:href="#linearGradient994"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="84.970261"
+                 y1="1095.1855"
+                 x2="84.970261"
+                 y2="1189.3411"
+                 id="linearGradient10515"
+                 xlink:href="#linearGradient838"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.987109,0.503244)" />
+              <linearGradient
+                 x1="217.42307"
+                 y1="536.03741"
+                 x2="217.42307"
+                 y2="459.23132"
+                 id="linearGradient10516"
+                 xlink:href="#linearGradient838"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="199.15404"
+                 y1="696.90118"
+                 x2="193.92329"
+                 y2="593.573"
+                 id="linearGradient10517"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="192.95671"
+                 y1="559.13995"
+                 x2="192.95671"
+                 y2="588.70502"
+                 id="linearGradient10518"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="192.95671"
+                 y1="559.13995"
+                 x2="192.95671"
+                 y2="588.70502"
+                 id="linearGradient10519"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="199.15404"
+                 y1="696.90118"
+                 x2="193.92329"
+                 y2="593.573"
+                 id="linearGradient10520"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="217.42307"
+                 y1="536.03741"
+                 x2="217.42307"
+                 y2="459.23132"
+                 id="linearGradient10521"
+                 xlink:href="#linearGradient838"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="354.95923"
+                 y1="464.90207"
+                 x2="354.95923"
+                 y2="299.05014"
+                 id="linearGradient10522"
+                 xlink:href="#linearGradient1102"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.733715,1.362927)" />
+              <linearGradient
+                 x1="238.75548"
+                 y1="339.24017"
+                 x2="317.05142"
+                 y2="333.88309"
+                 id="linearGradient10523"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.733715,1.362927)" />
+              <linearGradient
+                 x1="458.70102"
+                 y1="329.58002"
+                 x2="404.87259"
+                 y2="326.23184"
+                 id="linearGradient10524"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.733715,1.362927)" />
+              <linearGradient
+                 x1="192.95671"
+                 y1="559.13995"
+                 x2="192.95671"
+                 y2="588.70502"
+                 id="linearGradient10525"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="199.15404"
+                 y1="696.90118"
+                 x2="193.92329"
+                 y2="593.573"
+                 id="linearGradient10526"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="217.42307"
+                 y1="536.03741"
+                 x2="217.42307"
+                 y2="459.23132"
+                 id="linearGradient10527"
+                 xlink:href="#linearGradient838"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+              <linearGradient
+                 x1="118.25803"
+                 y1="563.01941"
+                 x2="156.10408"
+                 y2="564.03723"
+                 id="linearGradient10528"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.54934,0.645436)" />
+              <linearGradient
+                 x1="139.11636"
+                 y1="564.54614"
+                 x2="200.18613"
+                 y2="564.54614"
+                 id="linearGradient10529"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.54934,0.645436)" />
+              <radialGradient
+                 cx="184.20265"
+                 cy="780.47272"
+                 r="49.972103"
+                 fx="182.57774"
+                 fy="734.32568"
+                 id="radialGradient10530"
+                 xlink:href="#linearGradient948"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.455004,0.687283)" />
+              <linearGradient
+                 x1="177.77042"
+                 y1="831.05975"
+                 x2="178.45302"
+                 y2="795.11487"
+                 id="linearGradient10531"
+                 xlink:href="#linearGradient843"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.548996,0.64558)" />
+              <linearGradient
+                 x1="84.970261"
+                 y1="1095.1855"
+                 x2="84.970261"
+                 y2="1189.3411"
+                 id="linearGradient10532"
+                 xlink:href="#linearGradient838"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.987109,0.503244)" />
+              <linearGradient
+                 x1="87.605721"
+                 y1="1061.6371"
+                 x2="87.605721"
+                 y2="1160.6499"
+                 id="linearGradient10533"
+                 xlink:href="#linearGradient838"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.930484,0.518005)" />
+              <radialGradient
+                 cx="106.52795"
+                 cy="541.31592"
+                 r="49.665058"
+                 fx="105.48236"
+                 fy="502.10669"
+                 id="radialGradient10534"
+                 xlink:href="#linearGradient994"
+                 gradientUnits="userSpaceOnUse" />
+            </defs>
+            <linearGradient
+               x1="179.83598"
+               y1="178.66379"
+               x2="200.25706"
+               y2="302.00961"
+               id="linearGradient10579"
+               xlink:href="#linearGradient1502"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.030776,0.970143)" />
+            <linearGradient
+               x1="178.64995"
+               y1="179.87529"
+               x2="198.41254"
+               y2="299.24384"
+               id="linearGradient10580"
+               xlink:href="#linearGradient1502"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.034428,0.966718)" />
+            <linearGradient
+               x1="181.35893"
+               y1="177.20132"
+               x2="202.65994"
+               y2="305.862"
+               id="linearGradient10581"
+               xlink:href="#linearGradient1502"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.026679,0.974015)" />
+            <linearGradient
+               x1="182.83167"
+               y1="175.80452"
+               x2="205.01575"
+               y2="309.7991"
+               id="linearGradient10582"
+               xlink:href="#linearGradient1502"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.022962,0.977554)" />
+            <linearGradient
+               x1="177.86378"
+               y1="181.4277"
+               x2="197.19272"
+               y2="298.17694"
+               id="linearGradient10583"
+               xlink:href="#linearGradient1502"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.036891,0.964422)" />
+            <linearGradient
+               x1="55.601124"
+               y1="-30.810305"
+               x2="40.876816"
+               y2="218.58856"
+               id="linearGradient10584"
+               xlink:href="#linearGradient1454"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.082134,0.9241)" />
+            <linearGradient
+               x1="64.116882"
+               y1="47.803505"
+               x2="37.547989"
+               y2="140.37704"
+               id="linearGradient10585"
+               xlink:href="#linearGradient1546"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.329487,0.75217)" />
+            <linearGradient
+               x1="83.123482"
+               y1="92.632271"
+               x2="77.120087"
+               y2="56.941833"
+               id="linearGradient10586"
+               xlink:href="#linearGradient1494"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.162115,0.8605)" />
+            <linearGradient
+               x1="48.88829"
+               y1="90.157753"
+               x2="99.629562"
+               y2="86.570915"
+               id="linearGradient10587"
+               xlink:href="#linearGradient1461"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.162115,0.8605)" />
+            <linearGradient
+               x1="57.724483"
+               y1="184.34286"
+               x2="55.957409"
+               y2="144.17274"
+               id="linearGradient10588"
+               xlink:href="#linearGradient1502"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.636328,0.611124)" />
+            <linearGradient
+               x1="55.045113"
+               y1="85.877014"
+               x2="109.27901"
+               y2="88.11335"
+               id="linearGradient10589"
+               xlink:href="#linearGradient1461"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.162536,0.860189)" />
+            <linearGradient
+               x1="66.679367"
+               y1="28.158081"
+               x2="66.679367"
+               y2="107.53253"
+               id="linearGradient10590"
+               xlink:href="#linearGradient1494"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.1618,0.860733)" />
+            <linearGradient
+               x1="47.242912"
+               y1="77.450203"
+               x2="109.62949"
+               y2="76.102692"
+               id="linearGradient10591"
+               xlink:href="#linearGradient1461"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.1618,0.860733)" />
+            <linearGradient
+               x1="71.901497"
+               y1="69.209007"
+               x2="85.293274"
+               y2="102.17883"
+               id="linearGradient10592"
+               xlink:href="#linearGradient1494"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.179599,0.847746)" />
+            <linearGradient
+               x1="55.239422"
+               y1="97.356407"
+               x2="25.40143"
+               y2="29.790384"
+               id="linearGradient10593"
+               xlink:href="#linearGradient1461"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.942585,1.060912)" />
+            <linearGradient
+               x1="53.647789"
+               y1="101.89593"
+               x2="53.647789"
+               y2="160.91232"
+               id="linearGradient10594"
+               xlink:href="#linearGradient1494"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.289244,0.775649)" />
+            <linearGradient
+               x1="69.363586"
+               y1="56.763401"
+               x2="71.684402"
+               y2="101.294"
+               id="linearGradient10595"
+               xlink:href="#linearGradient1494"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.20398,0.830579)" />
+            <linearGradient
+               x1="28.813946"
+               y1="221.79578"
+               x2="10.582993"
+               y2="235.65099"
+               id="linearGradient10596"
+               xlink:href="#linearGradient1551"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.709409,0.584998)" />
+            <radialGradient
+               cx="24.825565"
+               cy="176.56438"
+               r="42.859913"
+               fx="40.974991"
+               fy="162.11137"
+               id="radialGradient10597"
+               xlink:href="#linearGradient1806"
+               gradientUnits="userSpaceOnUse" />
+            <defs
+               id="defs10598">
+              <linearGradient
+                 id="linearGradient10599">
+                <stop
+                   id="stop10600"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop10601"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient10602">
+                <stop
+                   id="stop10603"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop10604"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient10605">
+                <stop
+                   id="stop10606"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop10607"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop10608"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop10609"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop10610"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient10611">
+                <stop
+                   id="stop10612"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop10613"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient10614"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <defs
+                 id="defs10615">
+                <linearGradient
+                   id="linearGradient10616">
+                  <stop
+                     id="stop10617"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10618"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient10619">
+                  <stop
+                     id="stop10620"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop10621"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop10622"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop10623"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop10624"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient10625">
+                  <stop
+                     id="stop10626"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10627"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <radialGradient
+                   cx="23.756607"
+                   cy="60.078049"
+                   r="21.026033"
+                   fx="23.756607"
+                   fy="60.078049"
+                   id="radialGradient10628"
+                   xlink:href="#linearGradient1700"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.006281,0.993758)" />
+                <linearGradient
+                   x1="31.82851"
+                   y1="61.778381"
+                   x2="33.198818"
+                   y2="6.859036"
+                   id="linearGradient10629"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.750054,0,0,1.072718,1.04579,2.663333)" />
+                <radialGradient
+                   cx="92.478806"
+                   cy="20.827066"
+                   r="45.889046"
+                   fx="92.478806"
+                   fy="20.827066"
+                   id="radialGradient10630"
+                   xlink:href="#linearGradient1700"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.506767,1.973294)" />
+                <linearGradient
+                   x1="133.07144"
+                   y1="28.231943"
+                   x2="118.58411"
+                   y2="13.431207"
+                   id="linearGradient10631"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                <linearGradient
+                   x1="108.49871"
+                   y1="17.573528"
+                   x2="185.22578"
+                   y2="24.330959"
+                   id="linearGradient10632"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                <linearGradient
+                   x1="28.814428"
+                   y1="-1.616316"
+                   x2="47.366039"
+                   y2="22.769617"
+                   id="linearGradient10633"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.764292,1.3084)" />
+                <linearGradient
+                   x1="30.722504"
+                   y1="28.135216"
+                   x2="39.78149"
+                   y2="27.315481"
+                   id="linearGradient10634"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103232)" />
+                <linearGradient
+                   x1="30.382267"
+                   y1="7.5329666"
+                   x2="47.366039"
+                   y2="22.769617"
+                   id="linearGradient10635"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+                <linearGradient
+                   x1="25.954844"
+                   y1="25.071495"
+                   x2="39.781502"
+                   y2="27.315489"
+                   id="linearGradient10636"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103231)" />
+                <radialGradient
+                   cx="4.9853168"
+                   cy="108.47158"
+                   r="34.222183"
+                   fx="5.2520976"
+                   fy="108.73115"
+                   id="radialGradient10637"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="36.826332"
+                   y1="75.332558"
+                   x2="25.761681"
+                   y2="135.90358"
+                   id="linearGradient10638"
+                   xlink:href="#linearGradient2877"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                <linearGradient
+                   x1="78.675774"
+                   y1="47.411823"
+                   x2="64.05336"
+                   y2="34.302757"
+                   id="linearGradient10639"
+                   xlink:href="#linearGradient4281"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                <defs
+                   id="defs10640">
+                  <linearGradient
+                     id="linearGradient10641">
+                    <stop
+                       id="stop10642"
+                       style="stop-color:#ffffff;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop10643"
+                       style="stop-color:#d0d1d9;stop-opacity:1"
+                       offset="0.5" />
+                    <stop
+                       id="stop10644"
+                       style="stop-color:#878b9b;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                </defs>
+              </defs>
+              <defs
+                 id="defs10659">
+                <linearGradient
+                   id="linearGradient10660">
+                  <stop
+                     id="stop10661"
+                     style="stop-color:#826647;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10662"
+                     style="stop-color:#575147;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0.36627907"
+                   y1="0.8125"
+                   x2="0.36627907"
+                   y2="0.1796875"
+                   id="linearGradient10663"
+                   xlink:href="#linearGradient1136"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="-0.109375"
+                   y1="0.9140625"
+                   x2="1.15625"
+                   y2="0.1796875"
+                   id="linearGradient10664"
+                   xlink:href="#linearGradient1136" />
+              </defs>
+              <radialGradient
+                 cx="24.825565"
+                 cy="176.56438"
+                 r="42.859913"
+                 fx="40.974991"
+                 fy="162.11137"
+                 id="radialGradient10666"
+                 xlink:href="#linearGradient1806"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="693.25439"
+                 y1="697.24719"
+                 x2="657.74762"
+                 y2="677.27399"
+                 id="linearGradient10667"
+                 xlink:href="#linearGradient4021"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.983783,1.016484)" />
+              <linearGradient
+                 x1="681.34058"
+                 y1="728.7738"
+                 x2="641.37305"
+                 y2="705.9129"
+                 id="linearGradient10668"
+                 xlink:href="#linearGradient4021"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.986777,1.0134)" />
+              <linearGradient
+                 x1="649.57269"
+                 y1="677.24323"
+                 x2="630.47528"
+                 y2="668.91809"
+                 id="linearGradient10669"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.988806,1.011321)" />
+              <linearGradient
+                 x1="647.99902"
+                 y1="693.73279"
+                 x2="629.89734"
+                 y2="683.8114"
+                 id="linearGradient10670"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.975718,1.024886)" />
+              <linearGradient
+                 x1="538.89514"
+                 y1="277.2775"
+                 x2="575.11407"
+                 y2="342.66919"
+                 id="linearGradient10671"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.998206,1.001797)" />
+              <linearGradient
+                 x1="509.06769"
+                 y1="327.76361"
+                 x2="544.86011"
+                 y2="399.38104"
+                 id="linearGradient10672"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.972249,1.028543)" />
+              <linearGradient
+                 x1="591.27606"
+                 y1="330.16998"
+                 x2="620.33301"
+                 y2="382.54678"
+                 id="linearGradient10673"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.044357,0.957527)" />
+              <linearGradient
+                 x1="566.74347"
+                 y1="415.15009"
+                 x2="588.13922"
+                 y2="458.04449"
+                 id="linearGradient10674"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.03551,0.965707)" />
+              <defs
+                 id="defs10675">
+                <linearGradient
+                   x1="0.25179857"
+                   y1="-0.0390625"
+                   x2="0.53237408"
+                   y2="0.5234375"
+                   id="linearGradient10676"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="0.092198581"
+                   y1="-0.2109375"
+                   x2="0.4822695"
+                   y2="0.4921875"
+                   id="linearGradient10677"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="0.016528925"
+                   y1="-0.4921875"
+                   x2="0.51239669"
+                   y2="0.5"
+                   id="linearGradient10678"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="0.05511811"
+                   y1="-0.3046875"
+                   x2="0.53543305"
+                   y2="0.5625"
+                   id="linearGradient10679"
+                   xlink:href="#linearGradient4215" />
+                <linearGradient
+                   x1="1.2125034"
+                   y1="0.78833276"
+                   x2="0.5859077"
+                   y2="0.44490069"
+                   id="linearGradient10680"
+                   xlink:href="#linearGradient4215"
+                   gradientTransform="scale(0.999075,1.000926)" />
+                <linearGradient
+                   id="linearGradient10681">
+                  <stop
+                     id="stop10682"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10683"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.1610887"
+                   y1="0.61942029"
+                   x2="0.47761098"
+                   y2="0.3214713"
+                   id="linearGradient10684"
+                   xlink:href="#linearGradient4215"
+                   gradientTransform="scale(1.003618,0.996395)" />
+                <linearGradient
+                   x1="1.8455285"
+                   y1="1.34375"
+                   x2="0.47967479"
+                   y2="0.5625"
+                   id="linearGradient10685"
+                   xlink:href="#linearGradient4021" />
+                <linearGradient
+                   id="linearGradient10686">
+                  <stop
+                     id="stop10687"
+                     style="stop-color:#000000;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10688"
+                     style="stop-color:#000000;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.7519705"
+                   y1="1.0528145"
+                   x2="0.54093099"
+                   y2="0.37158158"
+                   id="linearGradient10689"
+                   xlink:href="#linearGradient4021"
+                   gradientTransform="scale(0.990884,1.0092)" />
+                <linearGradient
+                   x1="0.24528302"
+                   y1="1.6015625"
+                   x2="0.28301886"
+                   y2="-0.0234375"
+                   id="linearGradient10690"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.89719623"
+                   y1="-0.1484375"
+                   x2="0.40186915"
+                   y2="0.5546875"
+                   id="linearGradient10691"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.90588236"
+                   y1="-0.2734375"
+                   x2="0.36470589"
+                   y2="0.5078125"
+                   id="linearGradient10692"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.56809336"
+                   y1="-0.125"
+                   x2="0.49027237"
+                   y2="0.59375"
+                   id="linearGradient10693"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="1.4128441"
+                   y1="1.25"
+                   x2="0.42201835"
+                   y2="0.4140625"
+                   id="linearGradient10694"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.084848486"
+                   y1="1.1640625"
+                   x2="0.53333336"
+                   y2="0.359375"
+                   id="linearGradient10695"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.76190478"
+                   y1="-0.53125"
+                   x2="0.6857143"
+                   y2="0.5390625"
+                   id="linearGradient10696"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   id="linearGradient10697">
+                  <stop
+                     id="stop10698"
+                     style="stop-color:#ffffff;stop-opacity:0.83615822"
+                     offset="0" />
+                  <stop
+                     id="stop10699"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="2.2054794"
+                   y1="2.03125"
+                   x2="0.56164384"
+                   y2="-0.28125"
+                   id="linearGradient10700"
+                   xlink:href="#linearGradient4823" />
+                <linearGradient
+                   x1="0.88832486"
+                   y1="1.0390625"
+                   x2="0.55837566"
+                   y2="0.3046875"
+                   id="linearGradient10701"
+                   xlink:href="#linearGradient1806" />
+                <linearGradient
+                   x1="0.85217392"
+                   y1="0.9609375"
+                   x2="0.86086959"
+                   y2="0.296875"
+                   id="linearGradient10702"
+                   xlink:href="#linearGradient1806" />
+                <linearGradient
+                   x1="0.064220183"
+                   y1="1.4375"
+                   x2="0.22018349"
+                   y2="0.3125"
+                   id="linearGradient10703"
+                   xlink:href="#linearGradient3970" />
+                <linearGradient
+                   id="linearGradient10704">
+                  <stop
+                     id="stop10705"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10706"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.1011236"
+                   y1="0.7421875"
+                   x2="0.033707865"
+                   y2="0.5703125"
+                   id="linearGradient10708"
+                   xlink:href="#linearGradient3970" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient10712"
+                   xlink:href="#linearGradient4545"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <radialGradient
+                   cx="0.49032259"
+                   cy="0.50649351"
+                   r="0.38170236"
+                   fx="0.63414633"
+                   fy="0.37777779"
+                   id="radialGradient10713"
+                   xlink:href="#linearGradient1806" />
+              </defs>
+              <linearGradient
+                 x1="-191.46153"
+                 y1="37.372372"
+                 x2="-165.58835"
+                 y2="37.372372"
+                 id="linearGradient10758"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+              <defs
+                 id="defs10759">
+                <linearGradient
+                   id="linearGradient10760">
+                  <stop
+                     id="stop10761"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10762"
+                     style="stop-color:#fafbff;stop-opacity:1"
+                     offset="0.25" />
+                  <stop
+                     id="stop10763"
+                     style="stop-color:#f0f2fa;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop10764"
+                     style="stop-color:#e1e1e1;stop-opacity:1"
+                     offset="0.75" />
+                  <stop
+                     id="stop10765"
+                     style="stop-color:#f5f6ff;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient10766">
+                  <stop
+                     id="stop10767"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10768"
+                     style="stop-color:#d0d1d9;stop-opacity:1"
+                     offset="0.5" />
+                  <stop
+                     id="stop10769"
+                     style="stop-color:#878b9b;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient10770">
+                  <stop
+                     id="stop10771"
+                     style="stop-color:#e8e8e8;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10772"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="-49.171364"
+                   y1="121.40791"
+                   x2="-160.71114"
+                   y2="-157.53516"
+                   id="linearGradient10773"
+                   xlink:href="#linearGradient1700"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+                <radialGradient
+                   cx="-77.367622"
+                   cy="42.633839"
+                   r="216.26619"
+                   fx="-80.036034"
+                   fy="44.468376"
+                   id="radialGradient10774"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+                <defs
+                   id="defs10775">
+                  <linearGradient
+                     id="linearGradient10776">
+                    <stop
+                       id="stop10777"
+                       style="stop-color:#ffffff;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop10778"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient10779">
+                    <stop
+                       id="stop10780"
+                       style="stop-color:#000000;stop-opacity:0.14835165"
+                       offset="0" />
+                    <stop
+                       id="stop10781"
+                       style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                       offset="0.5" />
+                    <stop
+                       id="stop10782"
+                       style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                       offset="0.75" />
+                    <stop
+                       id="stop10783"
+                       style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                       offset="0.875" />
+                    <stop
+                       id="stop10784"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     id="linearGradient10785">
+                    <stop
+                       id="stop10786"
+                       style="stop-color:#b18e4b;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop10787"
+                       style="stop-color:#f7dca0;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="133.07144"
+                     y1="28.231943"
+                     x2="118.58411"
+                     y2="13.431207"
+                     id="linearGradient10788"
+                     xlink:href="#linearGradient1696"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+                  <linearGradient
+                     x1="30.722504"
+                     y1="28.135216"
+                     x2="39.78149"
+                     y2="27.315481"
+                     id="linearGradient10789"
+                     xlink:href="#linearGradient2354"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="scale(0.475459,2.103232)" />
+                  <radialGradient
+                     cx="4.9853168"
+                     cy="108.47158"
+                     r="34.222183"
+                     fx="5.2520976"
+                     fy="108.73115"
+                     id="radialGradient10790"
+                     xlink:href="#linearGradient2877"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="36.826332"
+                     y1="75.332558"
+                     x2="25.761681"
+                     y2="135.90358"
+                     id="linearGradient10791"
+                     xlink:href="#linearGradient2877"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+                  <linearGradient
+                     x1="78.675774"
+                     y1="47.411823"
+                     x2="64.05336"
+                     y2="34.302757"
+                     id="linearGradient10792"
+                     xlink:href="#linearGradient4281"
+                     gradientUnits="userSpaceOnUse"
+                     gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+                  <defs
+                     id="defs10793">
+                    <linearGradient
+                       x1="0"
+                       y1="0.5"
+                       x2="1"
+                       y2="0.5"
+                       id="linearGradient10794"
+                       xlink:href="#linearGradient3296"
+                       gradientUnits="objectBoundingBox"
+                       spreadMethod="pad" />
+                  </defs>
+                </defs>
+                <linearGradient
+                   x1="88.712402"
+                   y1="138.15012"
+                   x2="104.81104"
+                   y2="151.63045"
+                   id="linearGradient10809"
+                   xlink:href="#linearGradient3305"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+              </defs>
+              <linearGradient
+                 x1="226.34392"
+                 y1="866.83282"
+                 x2="109.99118"
+                 y2="627.57227"
+                 id="linearGradient10817"
+                 xlink:href="#linearGradient845"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.015083,0.985142)" />
+              <linearGradient
+                 x1="405.49411"
+                 y1="241.15977"
+                 x2="405.49411"
+                 y2="748.58954"
+                 id="linearGradient10818"
+                 xlink:href="#linearGradient850"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.961036,1.040544)" />
+              <linearGradient
+                 x1="911.58417"
+                 y1="626.5332"
+                 x2="911.58417"
+                 y2="471.98822"
+                 id="linearGradient10819"
+                 xlink:href="#linearGradient865"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.250806,0.799484)" />
+              <linearGradient
+                 x1="275.91269"
+                 y1="240.36499"
+                 x2="337.76599"
+                 y2="385.1778"
+                 id="linearGradient10820"
+                 xlink:href="#linearGradient845"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.214317,0.823508)" />
+              <linearGradient
+                 x1="250.2383"
+                 y1="350.13974"
+                 x2="250.2383"
+                 y2="280.09955"
+                 id="linearGradient10821"
+                 xlink:href="#linearGradient860"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.349063,0.741255)" />
+              <linearGradient
+                 x1="309.547"
+                 y1="292.84094"
+                 x2="309.547"
+                 y2="127.49744"
+                 id="linearGradient10822"
+                 xlink:href="#linearGradient860"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.194349,0.837276)" />
+              <linearGradient
+                 x1="911.58417"
+                 y1="626.5332"
+                 x2="911.58417"
+                 y2="471.98822"
+                 id="linearGradient10823"
+                 xlink:href="#linearGradient865"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.250806,0.799484)" />
+              <linearGradient
+                 x1="517.80023"
+                 y1="832.91492"
+                 x2="742.3476"
+                 y2="628.79071"
+                 id="linearGradient10824"
+                 xlink:href="#linearGradient845"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.975706,1.024899)" />
+              <linearGradient
+                 x1="309.547"
+                 y1="292.84094"
+                 x2="309.547"
+                 y2="127.49744"
+                 id="linearGradient10825"
+                 xlink:href="#linearGradient860"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.194349,0.837276)" />
+              <linearGradient
+                 x1="309.547"
+                 y1="292.84094"
+                 x2="309.547"
+                 y2="127.49744"
+                 id="linearGradient6276"
+                 xlink:href="#linearGradient860"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.194349,0.837276)" />
+              <linearGradient
+                 x1="736.18683"
+                 y1="646.92255"
+                 x2="736.18683"
+                 y2="478.88864"
+                 id="linearGradient6277"
+                 xlink:href="#linearGradient860"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.762621,1.311267)" />
+              <linearGradient
+                 x1="184.0434"
+                 y1="838.54852"
+                 x2="142.93327"
+                 y2="642.70612"
+                 id="linearGradient6278"
+                 xlink:href="#linearGradient860"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.026717,0.973979)" />
+              <linearGradient
+                 x1="472.38922"
+                 y1="807.86877"
+                 x2="472.10596"
+                 y2="746.31073"
+                 id="linearGradient10829"
+                 xlink:href="#linearGradient865"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.249987,0.800008)" />
+              <linearGradient
+                 x1="254.96887"
+                 y1="629.17017"
+                 x2="277.04468"
+                 y2="579.98926"
+                 id="linearGradient10830"
+                 xlink:href="#linearGradient865"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.892795,1.120079)" />
+              <linearGradient
+                 x1="84.960785"
+                 y1="92.151367"
+                 x2="42.64373"
+                 y2="53.360722"
+                 id="linearGradient10831"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.321949,0.756459)" />
+              <linearGradient
+                 x1="109.15074"
+                 y1="2.1610787"
+                 x2="134.0733"
+                 y2="60.510494"
+                 id="linearGradient10832"
+                 xlink:href="#linearGradient845"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.835421,1.197001)" />
+              <linearGradient
+                 x1="186.07457"
+                 y1="23.533224"
+                 x2="202.6377"
+                 y2="23.47304"
+                 id="linearGradient10833"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.388045,2.57702)" />
+              <linearGradient
+                 x1="92.631454"
+                 y1="54.989693"
+                 x2="92.631454"
+                 y2="50.608093"
+                 id="linearGradient10834"
+                 xlink:href="#linearGradient1757"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.787838,1.269296)" />
+              <radialGradient
+                 cx="24.825565"
+                 cy="176.56438"
+                 r="42.859913"
+                 fx="40.974991"
+                 fy="162.11137"
+                 id="radialGradient10835"
+                 xlink:href="#linearGradient1806"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="693.25439"
+                 y1="697.24719"
+                 x2="657.74762"
+                 y2="677.27399"
+                 id="linearGradient10836"
+                 xlink:href="#linearGradient4021"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.983783,1.016484)" />
+              <linearGradient
+                 x1="681.34058"
+                 y1="728.7738"
+                 x2="641.37305"
+                 y2="705.9129"
+                 id="linearGradient6287"
+                 xlink:href="#linearGradient4021"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.986777,1.0134)" />
+              <linearGradient
+                 x1="649.57269"
+                 y1="677.24323"
+                 x2="630.47528"
+                 y2="668.91809"
+                 id="linearGradient10838"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.988806,1.011321)" />
+              <linearGradient
+                 x1="647.99902"
+                 y1="693.73279"
+                 x2="629.89734"
+                 y2="683.8114"
+                 id="linearGradient10839"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.975718,1.024886)" />
+              <linearGradient
+                 x1="538.89514"
+                 y1="277.2775"
+                 x2="575.11407"
+                 y2="342.66919"
+                 id="linearGradient10840"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.998206,1.001797)" />
+              <linearGradient
+                 x1="509.06769"
+                 y1="327.76361"
+                 x2="544.86011"
+                 y2="399.38104"
+                 id="linearGradient10841"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.972249,1.028543)" />
+              <linearGradient
+                 x1="591.27606"
+                 y1="330.16998"
+                 x2="620.33301"
+                 y2="382.54678"
+                 id="linearGradient10842"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.044357,0.957527)" />
+              <linearGradient
+                 x1="566.74347"
+                 y1="415.15009"
+                 x2="588.13922"
+                 y2="458.04449"
+                 id="linearGradient10843"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.03551,0.965707)" />
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient10844"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+              <linearGradient
+                 x1="1270.3132"
+                 y1="4.8765283"
+                 x2="1247.6848"
+                 y2="0.72310239"
+                 id="linearGradient10845"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(9.440723e-2,10.59241)" />
+              <linearGradient
+                 x1="1270.3132"
+                 y1="4.8765283"
+                 x2="1247.6848"
+                 y2="0.72310239"
+                 id="linearGradient10846"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+              <defs
+                 id="defs10847">
+                <linearGradient
+                   id="linearGradient10848">
+                  <stop
+                     id="stop10849"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10850"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient10851">
+                  <stop
+                     id="stop10852"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10853"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient10854">
+                  <stop
+                     id="stop10855"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop10856"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop10857"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop10858"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop10859"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient10860">
+                  <stop
+                     id="stop10861"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop10862"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <radialGradient
+                   cx="23.756607"
+                   cy="60.078049"
+                   r="21.026033"
+                   fx="23.756607"
+                   fy="60.078049"
+                   id="radialGradient10863"
+                   xlink:href="#linearGradient1700"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+                <linearGradient
+                   x1="31.82851"
+                   y1="61.778381"
+                   x2="33.198818"
+                   y2="6.859036"
+                   id="linearGradient10864"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+                <radialGradient
+                   cx="92.478806"
+                   cy="20.827066"
+                   r="45.889046"
+                   fx="92.478806"
+                   fy="20.827066"
+                   id="radialGradient10865"
+                   xlink:href="#linearGradient1700"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+                <linearGradient
+                   x1="133.07144"
+                   y1="28.231943"
+                   x2="118.58411"
+                   y2="13.431207"
+                   id="linearGradient10866"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+                <linearGradient
+                   x1="108.49871"
+                   y1="17.573528"
+                   x2="185.22578"
+                   y2="24.330959"
+                   id="linearGradient10867"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+                <linearGradient
+                   x1="28.814428"
+                   y1="-1.616316"
+                   x2="47.366039"
+                   y2="22.769617"
+                   id="linearGradient10868"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.764292,1.3084)" />
+                <linearGradient
+                   x1="30.722504"
+                   y1="28.135216"
+                   x2="39.78149"
+                   y2="27.315481"
+                   id="linearGradient10869"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103232)" />
+                <linearGradient
+                   x1="30.382267"
+                   y1="7.5329666"
+                   x2="47.366039"
+                   y2="22.769617"
+                   id="linearGradient10870"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+                <linearGradient
+                   x1="25.954844"
+                   y1="25.071495"
+                   x2="39.781502"
+                   y2="27.315489"
+                   id="linearGradient10871"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103231)" />
+                <linearGradient
+                   x1="31.82851"
+                   y1="61.778381"
+                   x2="33.198818"
+                   y2="6.859036"
+                   id="linearGradient10872"
+                   xlink:href="#linearGradient1696"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+                <radialGradient
+                   cx="24.825565"
+                   cy="176.56438"
+                   r="42.859913"
+                   fx="40.974991"
+                   fy="162.11137"
+                   id="radialGradient10873"
+                   xlink:href="#linearGradient1806"
+                   gradientUnits="userSpaceOnUse" />
+                <linearGradient
+                   x1="693.25439"
+                   y1="697.24719"
+                   x2="657.74762"
+                   y2="677.27399"
+                   id="linearGradient10874"
+                   xlink:href="#linearGradient4021"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.983783,1.016484)" />
+                <linearGradient
+                   x1="681.34058"
+                   y1="728.7738"
+                   x2="641.37305"
+                   y2="705.9129"
+                   id="linearGradient10875"
+                   xlink:href="#linearGradient4021"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.986777,1.0134)" />
+                <linearGradient
+                   x1="649.57269"
+                   y1="677.24323"
+                   x2="630.47528"
+                   y2="668.91809"
+                   id="linearGradient10876"
+                   xlink:href="#linearGradient4215"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.988806,1.011321)" />
+                <linearGradient
+                   x1="647.99902"
+                   y1="693.73279"
+                   x2="629.89734"
+                   y2="683.8114"
+                   id="linearGradient10877"
+                   xlink:href="#linearGradient4215"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.975718,1.024886)" />
+                <linearGradient
+                   x1="538.89514"
+                   y1="277.2775"
+                   x2="575.11407"
+                   y2="342.66919"
+                   id="linearGradient10878"
+                   xlink:href="#linearGradient4215"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.998206,1.001797)" />
+                <linearGradient
+                   x1="509.06769"
+                   y1="327.76361"
+                   x2="544.86011"
+                   y2="399.38104"
+                   id="linearGradient10879"
+                   xlink:href="#linearGradient4215"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.972249,1.028543)" />
+                <linearGradient
+                   x1="591.27606"
+                   y1="330.16998"
+                   x2="620.33301"
+                   y2="382.54678"
+                   id="linearGradient10880"
+                   xlink:href="#linearGradient4215"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.044357,0.957527)" />
+                <linearGradient
+                   x1="566.74347"
+                   y1="415.15009"
+                   x2="588.13922"
+                   y2="458.04449"
+                   id="linearGradient10881"
+                   xlink:href="#linearGradient4215"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(1.03551,0.965707)" />
+                <defs
+                   id="defs10882">
+                  <linearGradient
+                     x1="0.25179857"
+                     y1="-0.0390625"
+                     x2="0.53237408"
+                     y2="0.5234375"
+                     id="linearGradient10883"
+                     xlink:href="#linearGradient4215" />
+                  <linearGradient
+                     x1="0.092198581"
+                     y1="-0.2109375"
+                     x2="0.4822695"
+                     y2="0.4921875"
+                     id="linearGradient10884"
+                     xlink:href="#linearGradient4215" />
+                  <linearGradient
+                     x1="0.016528925"
+                     y1="-0.4921875"
+                     x2="0.51239669"
+                     y2="0.5"
+                     id="linearGradient10885"
+                     xlink:href="#linearGradient4215" />
+                  <linearGradient
+                     x1="0.05511811"
+                     y1="-0.3046875"
+                     x2="0.53543305"
+                     y2="0.5625"
+                     id="linearGradient10886"
+                     xlink:href="#linearGradient4215" />
+                  <linearGradient
+                     x1="1.2125034"
+                     y1="0.78833276"
+                     x2="0.5859077"
+                     y2="0.44490069"
+                     id="linearGradient10887"
+                     xlink:href="#linearGradient4215"
+                     gradientTransform="scale(0.999075,1.000926)" />
+                  <linearGradient
+                     id="linearGradient10888">
+                    <stop
+                       id="stop10889"
+                       style="stop-color:#ffffff;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop10890"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="1.1610887"
+                     y1="0.61942029"
+                     x2="0.47761098"
+                     y2="0.3214713"
+                     id="linearGradient10891"
+                     xlink:href="#linearGradient4215"
+                     gradientTransform="scale(1.003618,0.996395)" />
+                  <linearGradient
+                     x1="1.8455285"
+                     y1="1.34375"
+                     x2="0.47967479"
+                     y2="0.5625"
+                     id="linearGradient10892"
+                     xlink:href="#linearGradient4021" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient10893"
+                     xlink:href="#linearGradient20708"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="1.7519705"
+                     y1="1.0528145"
+                     x2="0.54093099"
+                     y2="0.37158158"
+                     id="linearGradient10894"
+                     xlink:href="#linearGradient4021"
+                     gradientTransform="scale(0.990884,1.0092)" />
+                  <linearGradient
+                     x1="0.24528302"
+                     y1="1.6015625"
+                     x2="0.28301886"
+                     y2="-0.0234375"
+                     id="linearGradient10895"
+                     xlink:href="#linearGradient4823" />
+                  <linearGradient
+                     x1="0.89719623"
+                     y1="-0.1484375"
+                     x2="0.40186915"
+                     y2="0.5546875"
+                     id="linearGradient10896"
+                     xlink:href="#linearGradient4823" />
+                  <linearGradient
+                     x1="0.90588236"
+                     y1="-0.2734375"
+                     x2="0.36470589"
+                     y2="0.5078125"
+                     id="linearGradient10897"
+                     xlink:href="#linearGradient4823" />
+                  <linearGradient
+                     x1="0.56809336"
+                     y1="-0.125"
+                     x2="0.49027237"
+                     y2="0.59375"
+                     id="linearGradient10898"
+                     xlink:href="#linearGradient4823" />
+                  <linearGradient
+                     x1="1.4128441"
+                     y1="1.25"
+                     x2="0.42201835"
+                     y2="0.4140625"
+                     id="linearGradient10899"
+                     xlink:href="#linearGradient4823" />
+                  <linearGradient
+                     x1="0.084848486"
+                     y1="1.1640625"
+                     x2="0.53333336"
+                     y2="0.359375"
+                     id="linearGradient10900"
+                     xlink:href="#linearGradient4823" />
+                  <linearGradient
+                     x1="0.76190478"
+                     y1="-0.53125"
+                     x2="0.6857143"
+                     y2="0.5390625"
+                     id="linearGradient10901"
+                     xlink:href="#linearGradient4823" />
+                  <linearGradient
+                     id="linearGradient10902">
+                    <stop
+                       id="stop10903"
+                       style="stop-color:#ffffff;stop-opacity:0.83615822"
+                       offset="0" />
+                    <stop
+                       id="stop10904"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="2.2054794"
+                     y1="2.03125"
+                     x2="0.56164384"
+                     y2="-0.28125"
+                     id="linearGradient10905"
+                     xlink:href="#linearGradient4823" />
+                  <linearGradient
+                     x1="0.88832486"
+                     y1="1.0390625"
+                     x2="0.55837566"
+                     y2="0.3046875"
+                     id="linearGradient10906"
+                     xlink:href="#linearGradient1806" />
+                  <linearGradient
+                     x1="0.85217392"
+                     y1="0.9609375"
+                     x2="0.86086959"
+                     y2="0.296875"
+                     id="linearGradient10907"
+                     xlink:href="#linearGradient1806" />
+                  <linearGradient
+                     x1="0.064220183"
+                     y1="1.4375"
+                     x2="0.22018349"
+                     y2="0.3125"
+                     id="linearGradient10908"
+                     xlink:href="#linearGradient3970" />
+                  <linearGradient
+                     id="linearGradient10909">
+                    <stop
+                       id="stop10910"
+                       style="stop-color:#ffffff;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop10911"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="1.1011236"
+                     y1="0.7421875"
+                     x2="0.033707865"
+                     y2="0.5703125"
+                     id="linearGradient10912"
+                     xlink:href="#linearGradient3970" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient10913"
+                     xlink:href="#linearGradient4550"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <radialGradient
+                     cx="0.49032259"
+                     cy="0.50649351"
+                     r="0.38170236"
+                     fx="0.63414633"
+                     fy="0.37777779"
+                     id="radialGradient10914"
+                     xlink:href="#linearGradient1806" />
+                </defs>
+              </defs>
+              <radialGradient
+                 cx="24.825565"
+                 cy="176.56438"
+                 r="42.859913"
+                 fx="40.974991"
+                 fy="162.11137"
+                 id="radialGradient10966"
+                 xlink:href="#linearGradient1806"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="693.25439"
+                 y1="697.24719"
+                 x2="657.74762"
+                 y2="677.27399"
+                 id="linearGradient10967"
+                 xlink:href="#linearGradient4021"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.983783,1.016484)" />
+              <linearGradient
+                 x1="681.34058"
+                 y1="728.7738"
+                 x2="641.37305"
+                 y2="705.9129"
+                 id="linearGradient10968"
+                 xlink:href="#linearGradient4021"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.986777,1.0134)" />
+              <linearGradient
+                 x1="649.57269"
+                 y1="677.24323"
+                 x2="630.47528"
+                 y2="668.91809"
+                 id="linearGradient10969"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.988806,1.011321)" />
+              <linearGradient
+                 x1="647.99902"
+                 y1="693.73279"
+                 x2="629.89734"
+                 y2="683.8114"
+                 id="linearGradient10970"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.975718,1.024886)" />
+              <linearGradient
+                 x1="538.89514"
+                 y1="277.2775"
+                 x2="575.11407"
+                 y2="342.66919"
+                 id="linearGradient10971"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.998206,1.001797)" />
+              <linearGradient
+                 x1="509.06769"
+                 y1="327.76361"
+                 x2="544.86011"
+                 y2="399.38104"
+                 id="linearGradient10972"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.972249,1.028543)" />
+              <linearGradient
+                 x1="591.27606"
+                 y1="330.16998"
+                 x2="620.33301"
+                 y2="382.54678"
+                 id="linearGradient10973"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.044357,0.957527)" />
+              <linearGradient
+                 x1="566.74347"
+                 y1="415.15009"
+                 x2="588.13922"
+                 y2="458.04449"
+                 id="linearGradient10974"
+                 xlink:href="#linearGradient4215"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.03551,0.965707)" />
+            </defs>
+          </defs>
+          <linearGradient
+             x1="522.94183"
+             y1="469.49918"
+             x2="522.94183"
+             y2="505.0845"
+             id="linearGradient10989"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="520.57166"
+             y1="506.28723"
+             x2="520.57166"
+             y2="466.2785"
+             id="linearGradient10990"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="522.94183"
+             y1="469.49918"
+             x2="522.94183"
+             y2="505.0845"
+             id="linearGradient10991"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="213.82799"
+             y1="183.48366"
+             x2="214.59154"
+             y2="463.47311"
+             id="linearGradient10992"
+             xlink:href="#linearGradient3202"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+          <linearGradient
+             x1="520.57166"
+             y1="506.28723"
+             x2="520.57166"
+             y2="466.2785"
+             id="linearGradient10993"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="522.94183"
+             y1="469.49918"
+             x2="522.94183"
+             y2="505.0845"
+             id="linearGradient10994"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="213.82799"
+             y1="183.48366"
+             x2="214.59154"
+             y2="463.47311"
+             id="linearGradient10995"
+             xlink:href="#linearGradient3202"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+          <defs
+             id="defs10996">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient10997"
+               xlink:href="#linearGradient3202"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient10998">
+              <stop
+                 id="stop10999"
+                 style="stop-color:#69db0e;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop11000"
+                 style="stop-color:#397607;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="520.57166"
+               y1="506.28723"
+               x2="520.57166"
+               y2="466.2785"
+               id="linearGradient11001"
+               xlink:href="#linearGradient1697"
+               gradientUnits="userSpaceOnUse" />
+            <radialGradient
+               cx="522.89532"
+               cy="481.86633"
+               r="15.301119"
+               fx="522.89911"
+               fy="473.03323"
+               id="radialGradient11002"
+               xlink:href="#linearGradient1702"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="522.94183"
+               y1="469.49918"
+               x2="522.94183"
+               y2="505.0845"
+               id="linearGradient11003"
+               xlink:href="#linearGradient1697"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="213.82799"
+               y1="183.48366"
+               x2="214.59154"
+               y2="463.47311"
+               id="linearGradient11004"
+               xlink:href="#linearGradient1702"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+          </defs>
+          <defs
+             id="defs11044">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient11045"
+               xlink:href="#linearGradient3202"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient11046"
+               xlink:href="#linearGradient5390"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="520.57166"
+               y1="506.28723"
+               x2="520.57166"
+               y2="466.2785"
+               id="linearGradient11047"
+               xlink:href="#linearGradient1697"
+               gradientUnits="userSpaceOnUse" />
+            <radialGradient
+               cx="522.89532"
+               cy="481.86633"
+               r="15.301119"
+               fx="522.89911"
+               fy="473.03323"
+               id="radialGradient11048"
+               xlink:href="#linearGradient1702"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="522.94183"
+               y1="469.49918"
+               x2="522.94183"
+               y2="505.0845"
+               id="linearGradient11049"
+               xlink:href="#linearGradient1697"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="213.82799"
+               y1="183.48366"
+               x2="214.59154"
+               y2="463.47311"
+               id="linearGradient11050"
+               xlink:href="#linearGradient1702"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+          </defs>
+          <linearGradient
+             x1="520.57166"
+             y1="506.28723"
+             x2="520.57166"
+             y2="466.2785"
+             id="linearGradient11090"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="522.94183"
+             y1="469.49918"
+             x2="522.94183"
+             y2="505.0845"
+             id="linearGradient11091"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="213.82799"
+             y1="183.48366"
+             x2="214.59154"
+             y2="463.47311"
+             id="linearGradient11092"
+             xlink:href="#linearGradient3202"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+          <linearGradient
+             x1="520.57166"
+             y1="506.28723"
+             x2="520.57166"
+             y2="466.2785"
+             id="linearGradient11093"
+             xlink:href="#linearGradient5390"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="522.94183"
+             y1="469.49918"
+             x2="522.94183"
+             y2="505.0845"
+             id="linearGradient11094"
+             xlink:href="#linearGradient5390"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="520.57166"
+             y1="506.28723"
+             x2="520.57166"
+             y2="466.2785"
+             id="linearGradient11095"
+             xlink:href="#linearGradient2491"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="522.94183"
+             y1="469.49918"
+             x2="522.73914"
+             y2="530.67786"
+             id="linearGradient11096"
+             xlink:href="#linearGradient2494"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="520.57166"
+             y1="506.28723"
+             x2="520.57166"
+             y2="466.2785"
+             id="linearGradient11097"
+             xlink:href="#linearGradient1867"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="44.930588"
+             y1="56.725216"
+             x2="45.511845"
+             y2="185.05675"
+             id="linearGradient11098"
+             xlink:href="#linearGradient3202"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.694118,0,0,0.651906,0,-2.410339)" />
+          <defs
+             id="defs11099">
+            <linearGradient
+               id="linearGradient11100">
+              <stop
+                 id="stop11101"
+                 style="stop-color:#bb0a0a;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop11102"
+                 style="stop-color:#e60d0d;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient11103">
+              <stop
+                 id="stop11104"
+                 style="stop-color:#bb0a0a;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop11105"
+                 style="stop-color:#e60d0d;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient11106">
+              <stop
+                 id="stop11107"
+                 style="stop-color:#ff0d0d;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop11108"
+                 style="stop-color:#e65b5b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient11109"
+               xlink:href="#linearGradient3629"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient11110">
+              <stop
+                 id="stop11111"
+                 style="stop-color:#e6d500;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop11112"
+                 style="stop-color:#ffba61;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient11113">
+              <stop
+                 id="stop11114"
+                 style="stop-color:#e6da1e;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop11115"
+                 style="stop-color:#fff99b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient11116">
+              <stop
+                 id="stop11117"
+                 style="stop-color:#000000;stop-opacity:0.3137255"
+                 offset="0" />
+              <stop
+                 id="stop11118"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient11119">
+              <stop
+                 id="stop11120"
+                 style="stop-color:#ccff5f;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop11121"
+                 style="stop-color:#69db0e;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient6574">
+              <stop
+                 id="stop11123"
+                 style="stop-color:#ffffff;stop-opacity:0.69072163"
+                 offset="0" />
+              <stop
+                 id="stop11124"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient6577">
+              <stop
+                 id="stop11126"
+                 style="stop-color:#bb0a0a;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop11127"
+                 style="stop-color:#e60d0d;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="520.57166"
+               y1="506.28723"
+               x2="520.57166"
+               y2="466.2785"
+               id="linearGradient6580"
+               xlink:href="#linearGradient1697"
+               gradientUnits="userSpaceOnUse" />
+            <radialGradient
+               cx="522.89532"
+               cy="481.86633"
+               r="15.301119"
+               fx="522.89911"
+               fy="473.03323"
+               id="radialGradient11129"
+               xlink:href="#linearGradient1702"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="522.94183"
+               y1="469.49918"
+               x2="522.94183"
+               y2="505.0845"
+               id="linearGradient6582"
+               xlink:href="#linearGradient1697"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="213.82799"
+               y1="183.48366"
+               x2="214.59154"
+               y2="463.47311"
+               id="linearGradient18207"
+               xlink:href="#linearGradient1702"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+            <linearGradient
+               x1="27.119711"
+               y1="-353.75928"
+               x2="27.018383"
+               y2="-316.47729"
+               id="linearGradient11132"
+               xlink:href="#linearGradient1702"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(2.89873,-0.344979)" />
+            <radialGradient
+               cx="41.875938"
+               cy="37.865574"
+               r="12.562782"
+               fx="42.023739"
+               fy="37.865574"
+               id="radialGradient11133"
+               xlink:href="#linearGradient1845"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="10.68618"
+               y1="22.702703"
+               x2="11.660023"
+               y2="4.1041274"
+               id="linearGradient11134"
+               xlink:href="#linearGradient1302"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.016203,0.984055)" />
+            <linearGradient
+               x1="16.88386"
+               y1="28.772741"
+               x2="12.516754"
+               y2="2.6018224"
+               id="linearGradient11135"
+               xlink:href="#linearGradient1305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.016203,0.984055)" />
+            <defs
+               id="defs11136">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient11137"
+                 xlink:href="#linearGradient2002"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient11138"
+                 xlink:href="#linearGradient2009"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient11139"
+                 xlink:href="#linearGradient2006"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient6592">
+                <stop
+                   id="stop6593"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop11142"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient11143">
+                <stop
+                   id="stop6596"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop6597"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient11146">
+                <stop
+                   id="stop6599"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop11148"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop11149"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop6602"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop11151"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient11152">
+                <stop
+                   id="stop6605"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop11154"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="28.814428"
+                 y1="-1.616316"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient11155"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.764292,1.3084)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient11156"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <linearGradient
+                 x1="30.382267"
+                 y1="7.5329666"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient11157"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+              <linearGradient
+                 x1="25.954844"
+                 y1="25.071495"
+                 x2="39.781502"
+                 y2="27.315489"
+                 id="linearGradient11158"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103231)" />
+              <defs
+                 id="defs11159">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient11160"
+                   xlink:href="#linearGradient1302"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient11161"
+                   xlink:href="#linearGradient1305"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient11162">
+                  <stop
+                     id="stop11163"
+                     style="stop-color:#e6da1e;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop11164"
+                     style="stop-color:#b5ab17;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0.28441054"
+                   y1="0.88272494"
+                   x2="0.32513002"
+                   y2="0.10505857"
+                   id="linearGradient11165"
+                   xlink:href="#linearGradient4114" />
+                <linearGradient
+                   x1="-0.0078431377"
+                   y1="-1.244898"
+                   x2="0.59607846"
+                   y2="0.3605442"
+                   id="linearGradient11166"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="-0.4509804"
+                   y1="-0.15053764"
+                   x2="0.47058824"
+                   y2="0.36559141"
+                   id="linearGradient11167"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="0.45882353"
+                   y1="1.2772278"
+                   x2="0.6901961"
+                   y2="-0.2970297"
+                   id="linearGradient11168"
+                   xlink:href="#linearGradient2122" />
+                <linearGradient
+                   x1="-0.18232045"
+                   y1="-0.43962848"
+                   x2="0.68508285"
+                   y2="0.42414862"
+                   id="linearGradient11169"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   id="linearGradient11170">
+                  <stop
+                     id="stop11171"
+                     style="stop-color:#000000;stop-opacity:0.40784314"
+                     offset="0" />
+                  <stop
+                     id="stop11172"
+                     style="stop-color:#000000;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.3783784"
+                   y1="0.25386998"
+                   x2="0.58378381"
+                   y2="0.13003096"
+                   id="linearGradient11173"
+                   xlink:href="#linearGradient2122" />
+                <linearGradient
+                   x1="-0.14213198"
+                   y1="-0.28792569"
+                   x2="0.49753696"
+                   y2="0.35603714"
+                   id="linearGradient11174"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="0.99512196"
+                   y1="0.64396286"
+                   x2="0.32682925"
+                   y2="0.3003096"
+                   id="linearGradient11175"
+                   xlink:href="#linearGradient1918" />
+                <linearGradient
+                   x1="0.27843139"
+                   y1="-0.063694268"
+                   x2="0.4509804"
+                   y2="0.61146498"
+                   id="linearGradient11176"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   id="linearGradient11177">
+                  <stop
+                     id="stop11178"
+                     style="stop-color:#d6d6d6;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop11179"
+                     style="stop-color:#eaeaea;stop-opacity:1"
+                     offset="0.25769231" />
+                  <stop
+                     id="stop11180"
+                     style="stop-color:#919191;stop-opacity:1"
+                     offset="0.7059449" />
+                  <stop
+                     id="stop11181"
+                     style="stop-color:#d2d2d2;stop-opacity:1"
+                     offset="0.73347497" />
+                  <stop
+                     id="stop11182"
+                     style="stop-color:#a6a6a6;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0.47450981"
+                   y1="0.21771218"
+                   x2="0.80392158"
+                   y2="0.5202952"
+                   id="linearGradient11183"
+                   xlink:href="#linearGradient2317" />
+                <linearGradient
+                   id="linearGradient11184">
+                  <stop
+                     id="stop11185"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop11186"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0.41568628"
+                   y1="0.27687296"
+                   x2="0.59607846"
+                   y2="0.44299674"
+                   id="linearGradient11187"
+                   xlink:href="#linearGradient1513" />
+                <radialGradient
+                   cx="0.5"
+                   cy="0.5"
+                   r="0.5"
+                   fx="0.38431373"
+                   fy="0.47619048"
+                   id="radialGradient11188"
+                   xlink:href="#linearGradient1918" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient11189"
+                   xlink:href="#linearGradient1845"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <radialGradient
+                   cx="0.5"
+                   cy="0.5"
+                   r="0.5"
+                   fx="0.50588238"
+                   fy="0.5"
+                   id="radialGradient11190"
+                   xlink:href="#linearGradient1918" />
+                <linearGradient
+                   x1="0.54355544"
+                   y1="1.1365328"
+                   x2="0.36095273"
+                   y2="0.042242367"
+                   id="linearGradient11191"
+                   xlink:href="#linearGradient4111" />
+              </defs>
+            </defs>
+          </defs>
+          <linearGradient
+             x1="520.57166"
+             y1="506.28723"
+             x2="520.57166"
+             y2="466.2785"
+             id="linearGradient6734"
+             xlink:href="#linearGradient2491"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="522.94183"
+             y1="469.49918"
+             x2="522.73914"
+             y2="530.67786"
+             id="linearGradient6735"
+             xlink:href="#linearGradient2494"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="520.57166"
+             y1="506.28723"
+             x2="520.57166"
+             y2="466.2785"
+             id="linearGradient6736"
+             xlink:href="#linearGradient1867"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="44.930588"
+             y1="56.725216"
+             x2="45.511845"
+             y2="185.05675"
+             id="linearGradient6737"
+             xlink:href="#linearGradient3202"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.694118,0,0,0.651906,0,-2.410339)" />
+          <linearGradient
+             x1="83.460403"
+             y1="71.699699"
+             x2="-19.886999"
+             y2="-17.846001"
+             id="linearGradient11286"
+             xlink:href="#XMLID_1_"
+             gradientUnits="userSpaceOnUse" />
+          <radialGradient
+             cx="-451.42599"
+             cy="87.492699"
+             r="152.422"
+             fx="-451.42599"
+             fy="87.492699"
+             id="radialGradient11287"
+             xlink:href="#XMLID_2_"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="translate(509.121,0)" />
+          <radialGradient
+             cx="-451.23801"
+             cy="81.440903"
+             r="144.242"
+             fx="-451.23801"
+             fy="81.440903"
+             id="radialGradient11288"
+             xlink:href="#XMLID_3_"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="translate(509.121,0)" />
+          <linearGradient
+             x1="-26.362301"
+             y1="5.4271998"
+             x2="-26.362301"
+             y2="56.874901"
+             id="linearGradient11289"
+             xlink:href="#XMLID_4_"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="translate(85.6035,0)" />
+          <defs
+             id="defs11290" />
+          <linearGradient
+             x1="88.939903"
+             y1="66.850098"
+             x2="88.073898"
+             y2="156.319"
+             id="linearGradient11298"
+             xlink:href="#linearGradient3629"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)" />
+          <linearGradient
+             x1="99.445847"
+             y1="75.80661"
+             x2="55.045128"
+             y2="134.26726"
+             id="linearGradient18375"
+             xlink:href="#XMLID_8_"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.999905,-1.380007e-2,1.380007e-2,0.999905,0,0)" />
+          <linearGradient
+             x1="84.931496"
+             y1="39.138195"
+             x2="84.69928"
+             y2="55.963779"
+             id="linearGradient18376"
+             xlink:href="#linearGradient3629"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.999905,-1.380007e-2,1.380007e-2,0.999905,0,0)" />
+          <linearGradient
+             x1="88.939903"
+             y1="66.850098"
+             x2="88.073898"
+             y2="156.319"
+             id="linearGradient11301"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)">
+            <stop
+               id="stop11302"
+               style="stop-color:#ffa700;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11303"
+               style="stop-color:#ffff00;stop-opacity:1"
+               offset="0.69099998" />
+            <stop
+               id="stop11304"
+               style="stop-color:#fffc00;stop-opacity:1"
+               offset="0.792" />
+            <stop
+               id="stop11305"
+               style="stop-color:#fff400;stop-opacity:1"
+               offset="0.85460001" />
+            <stop
+               id="stop11306"
+               style="stop-color:#ffe500;stop-opacity:1"
+               offset="0.90670002" />
+            <stop
+               id="stop11307"
+               style="stop-color:#ffd100;stop-opacity:1"
+               offset="0.95300001" />
+            <stop
+               id="stop11308"
+               style="stop-color:#ffb700;stop-opacity:1"
+               offset="0.99519998" />
+            <stop
+               id="stop11309"
+               style="stop-color:#ffb300;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop11310"
+               style="stop-color:#FFA700"
+               offset="0" />
+            <midPointStop
+               id="midPointStop11311"
+               style="stop-color:#FFA700"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop11312"
+               style="stop-color:#FFFF00"
+               offset="0.691" />
+            <midPointStop
+               id="midPointStop11313"
+               style="stop-color:#FFFF00"
+               offset="0.7952" />
+            <midPointStop
+               id="midPointStop11314"
+               style="stop-color:#FFB300"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="88.601097"
+             y1="59.899899"
+             x2="88.601097"
+             y2="108.201"
+             id="linearGradient11315"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)">
+            <stop
+               id="stop11316"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0.0056" />
+            <stop
+               id="stop11317"
+               style="stop-color:#fffae1;stop-opacity:1"
+               offset="0.1471" />
+            <stop
+               id="stop11318"
+               style="stop-color:#ffee94;stop-opacity:1"
+               offset="0.4562" />
+            <stop
+               id="stop11319"
+               style="stop-color:#ffdb1a;stop-opacity:1"
+               offset="0.90689999" />
+            <stop
+               id="stop11320"
+               style="stop-color:#ffd700;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop11321"
+               style="stop-color:#FFFFFF"
+               offset="0.0056" />
+            <midPointStop
+               id="midPointStop11322"
+               style="stop-color:#FFFFFF"
+               offset="0.5311" />
+            <midPointStop
+               id="midPointStop11323"
+               style="stop-color:#FFD700"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="98.653801"
+             y1="33.295898"
+             x2="98.653801"
+             y2="59.6152"
+             id="linearGradient11324"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)">
+            <stop
+               id="stop11325"
+               style="stop-color:#ffa700;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11326"
+               style="stop-color:#ffff00;stop-opacity:1"
+               offset="0.69099998" />
+            <stop
+               id="stop11327"
+               style="stop-color:#fffc00;stop-opacity:1"
+               offset="0.792" />
+            <stop
+               id="stop11328"
+               style="stop-color:#fff400;stop-opacity:1"
+               offset="0.85460001" />
+            <stop
+               id="stop11329"
+               style="stop-color:#ffe500;stop-opacity:1"
+               offset="0.90670002" />
+            <stop
+               id="stop11330"
+               style="stop-color:#ffd100;stop-opacity:1"
+               offset="0.95300001" />
+            <stop
+               id="stop11331"
+               style="stop-color:#ffb700;stop-opacity:1"
+               offset="0.99519998" />
+            <stop
+               id="stop11332"
+               style="stop-color:#ffb300;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop11333"
+               style="stop-color:#FFA700"
+               offset="0" />
+            <midPointStop
+               id="midPointStop11334"
+               style="stop-color:#FFA700"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop11335"
+               style="stop-color:#FFFF00"
+               offset="0.691" />
+            <midPointStop
+               id="midPointStop11336"
+               style="stop-color:#FFFF00"
+               offset="0.7952" />
+            <midPointStop
+               id="midPointStop11337"
+               style="stop-color:#FFB300"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="98.563004"
+             y1="28.5513"
+             x2="98.563004"
+             y2="42.4711"
+             id="linearGradient11338"
+             xlink:href="#linearGradient20002"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)"
+             spreadMethod="pad">
+            <midPointStop
+               id="midPointStop11339"
+               style="stop-color:#FFFFFF"
+               offset="0.0056" />
+            <midPointStop
+               id="midPointStop11340"
+               style="stop-color:#FFFFFF"
+               offset="0.5311" />
+            <midPointStop
+               id="midPointStop11341"
+               style="stop-color:#FFD700"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="98.563004"
+             y1="28.5513"
+             x2="98.563004"
+             y2="42.4711"
+             id="linearGradient11342"
+             xlink:href="#XMLID_8_"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.936505,0.35064,-0.35064,0.936505,159.959,67.79462)" />
+          <linearGradient
+             x1="88.939903"
+             y1="66.850098"
+             x2="88.073898"
+             y2="156.319"
+             id="linearGradient11343"
+             xlink:href="#linearGradient3629"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)" />
+          <linearGradient
+             x1="99.445847"
+             y1="75.80661"
+             x2="55.045128"
+             y2="134.26726"
+             id="linearGradient11344"
+             xlink:href="#XMLID_8_"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.999905,-1.380007e-2,1.380007e-2,0.999905,0,0)" />
+          <linearGradient
+             x1="84.931496"
+             y1="39.138195"
+             x2="84.69928"
+             y2="55.963779"
+             id="linearGradient11345"
+             xlink:href="#linearGradient3629"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.999905,-1.380007e-2,1.380007e-2,0.999905,0,0)" />
+          <linearGradient
+             x1="98.563004"
+             y1="28.5513"
+             x2="98.563004"
+             y2="42.4711"
+             id="linearGradient11346"
+             xlink:href="#XMLID_8_"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.80392,0.300998,-0.300998,0.80392,17.27346,-12.12931)" />
+          <linearGradient
+             x1="61.531635"
+             y1="47.042343"
+             x2="54.256596"
+             y2="105.82021"
+             id="linearGradient11347"
+             xlink:href="#XMLID_8_"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.999905,-1.380008e-2,1.380008e-2,0.999905,25,0)" />
+        </defs>
+        <radialGradient
+           cx="41.875938"
+           cy="37.865574"
+           r="12.562782"
+           fx="42.023739"
+           fy="37.865574"
+           id="radialGradient6936"
+           xlink:href="#linearGradient6942"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="520.57166"
+           y1="506.28723"
+           x2="520.57166"
+           y2="466.2785"
+           id="linearGradient6937"
+           xlink:href="#linearGradient5390"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="522.94183"
+           y1="469.49918"
+           x2="522.94183"
+           y2="505.0845"
+           id="linearGradient11350"
+           xlink:href="#linearGradient5390"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="213.82799"
+           y1="183.48366"
+           x2="214.59154"
+           y2="463.47311"
+           id="linearGradient11351"
+           xlink:href="#linearGradient3202"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+        <linearGradient
+           x1="98.204483"
+           y1="60.269196"
+           x2="-148.96341"
+           y2="168.24425"
+           id="linearGradient6940"
+           xlink:href="#linearGradient2206"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.973356,0,0,1.027373,0,-2.5)" />
+        <linearGradient
+           x1="98.204483"
+           y1="60.269196"
+           x2="-148.96341"
+           y2="168.24425"
+           id="linearGradient6941"
+           xlink:href="#linearGradient2206"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.973356,0,0,1.027373,0,-2.5)" />
+      </defs>
+      <linearGradient
+         x1="-237.80434"
+         y1="66.274826"
+         x2="-566.52686"
+         y2="317.74768"
+         id="linearGradient11354"
+         xlink:href="#linearGradient2506"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.448699,0,0,0.40235,-16.9497,12.46637)" />
+      <defs
+         id="defs2158">
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient11356"
+           xlink:href="#linearGradient2506"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           id="linearGradient11357">
+          <stop
+             id="stop11358"
+             style="stop-color:#63b5e8;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop11359"
+             style="stop-color:#001b7b;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient11360">
+          <stop
+             id="stop11361"
+             style="stop-color:#001b7b;stop-opacity:1"
+             offset="0.00562" />
+          <stop
+             id="stop11362"
+             style="stop-color:#0093dd;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient14107">
+          <stop
+             id="stop2169"
+             style="stop-color:#000000;stop-opacity:0.67843139"
+             offset="0" />
+          <stop
+             id="stop2170"
+             style="stop-color:#000000;stop-opacity:0.32941177"
+             offset="0.56999999" />
+          <stop
+             id="stop11366"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient51826">
+          <stop
+             id="stop2173"
+             style="stop-color:#e3f9ff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop11369"
+             style="stop-color:#73bee7;stop-opacity:1"
+             offset="0.36194703" />
+          <stop
+             id="stop11370"
+             style="stop-color:#438ec5;stop-opacity:1"
+             offset="0.62534887" />
+          <stop
+             id="stop2176"
+             style="stop-color:#477daf;stop-opacity:1"
+             offset="0.72607356" />
+          <stop
+             id="stop11372"
+             style="stop-color:#020407;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient2178">
+          <stop
+             id="stop2179"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop11375"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient2181">
+          <stop
+             id="stop51837"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop11378"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient2184">
+          <stop
+             id="stop2185"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop2186"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient11382">
+          <stop
+             id="stop2189"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop14128"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0.72887325"
+           y1="-0.060344826"
+           x2="0.35915494"
+           y2="0.27586207"
+           id="linearGradient2191"
+           xlink:href="#linearGradient865" />
+        <radialGradient
+           cx="227.00549"
+           cy="477.83307"
+           r="200.73203"
+           fx="240.38737"
+           fy="325.7662"
+           id="radialGradient2193"
+           xlink:href="#linearGradient1764"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="178.42355"
+           y1="199.48994"
+           x2="88.360741"
+           y2="112.48578"
+           id="linearGradient2194"
+           xlink:href="#linearGradient1761"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.069323,0,0,0.935172,-225,0)" />
+        <linearGradient
+           x1="43.39798"
+           y1="-53.39077"
+           x2="38.977112"
+           y2="40.053986"
+           id="linearGradient51849"
+           xlink:href="#linearGradient1755"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="77.291656"
+           y1="180.92995"
+           x2="53.211624"
+           y2="24.17461"
+           id="linearGradient14133"
+           xlink:href="#linearGradient1758"
+           gradientUnits="userSpaceOnUse" />
+        <defs
+           id="defs11390">
+          <linearGradient
+             x1="217.86621"
+             y1="217.28516"
+             x2="7.1352701"
+             y2="6.5542202"
+             id="linearGradient11391"
+             gradientUnits="userSpaceOnUse">
+            <stop
+               id="stop11392"
+               style="stop-color:#3c5c82;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11393"
+               style="stop-color:#001b7b;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop11394"
+               style="stop-color:#0053BD"
+               offset="0" />
+            <midPointStop
+               id="midPointStop11395"
+               style="stop-color:#0053BD"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop11396"
+               style="stop-color:#00008D"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="214.27441"
+             y1="213.71484"
+             x2="10.72779"
+             y2="10.16822"
+             id="linearGradient11397"
+             gradientUnits="userSpaceOnUse">
+            <stop
+               id="stop11398"
+               style="stop-color:#0068c6;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11399"
+               style="stop-color:#3c5cb2;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop11400"
+               style="stop-color:#0066CC"
+               offset="0" />
+            <midPointStop
+               id="midPointStop11401"
+               style="stop-color:#0066CC"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop11402"
+               style="stop-color:#0053BD"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="112.50049"
+             y1="211.02246"
+             x2="112.50048"
+             y2="12.81396"
+             id="linearGradient11403"
+             gradientUnits="userSpaceOnUse">
+            <stop
+               id="stop11404"
+               style="stop-color:#418ade;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11405"
+               style="stop-color:#a4cdec;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop11406"
+               style="stop-color:#003399;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop11407"
+               style="stop-color:#0099FF"
+               offset="0" />
+            <midPointStop
+               id="midPointStop11408"
+               style="stop-color:#0099FF"
+               offset="0.25" />
+            <midPointStop
+               id="midPointStop11409"
+               style="stop-color:#B0D9FF"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop11410"
+               style="stop-color:#B0D9FF"
+               offset="0.75" />
+            <midPointStop
+               id="midPointStop11411"
+               style="stop-color:#003399"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="-1.36621"
+             cy="223.93457"
+             r="299.15564"
+             fx="-1.36621"
+             fy="223.93457"
+             id="radialGradient11412"
+             gradientUnits="userSpaceOnUse">
+            <stop
+               id="stop11413"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11414"
+               style="stop-color:#418ade;stop-opacity:1"
+               offset="0.44999999" />
+            <stop
+               id="stop11415"
+               style="stop-color:#3c5cb2;stop-opacity:1"
+               offset="0.75" />
+            <stop
+               id="stop11416"
+               style="stop-color:#0068c6;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop11417"
+               style="stop-color:#FFFFFF"
+               offset="0" />
+            <midPointStop
+               id="midPointStop11418"
+               style="stop-color:#FFFFFF"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop11419"
+               style="stop-color:#0083D7"
+               offset="0.45" />
+            <midPointStop
+               id="midPointStop11420"
+               style="stop-color:#0083D7"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop11421"
+               style="stop-color:#0053BD"
+               offset="0.75" />
+            <midPointStop
+               id="midPointStop11422"
+               style="stop-color:#0053BD"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop11423"
+               style="stop-color:#0066CC"
+               offset="1" />
+          </radialGradient>
+          <linearGradient
+             x1="112.49854"
+             y1="6.1372099"
+             x2="112.49853"
+             y2="129.3468"
+             id="linearGradient11424"
+             gradientUnits="userSpaceOnUse">
+            <stop
+               id="stop11425"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11426"
+               style="stop-color:#0093dd;stop-opacity:0"
+               offset="1" />
+            <midPointStop
+               id="midPointStop11427"
+               style="stop-color:#FFFFFF"
+               offset="0" />
+            <midPointStop
+               id="midPointStop11428"
+               style="stop-color:#FFFFFF"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop11429"
+               style="stop-color:#000000"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="87.310547"
+             y1="141.6543"
+             x2="193.3839"
+             y2="35.58094"
+             id="linearGradient11430"
+             xlink:href="#linearGradient1556"
+             gradientUnits="userSpaceOnUse"
+             spreadMethod="pad">
+            <midPointStop
+               id="midPointStop11431"
+               style="stop-color:#003399"
+               offset="0.00562" />
+            <midPointStop
+               id="midPointStop11432"
+               style="stop-color:#003399"
+               offset="0.25" />
+            <midPointStop
+               id="midPointStop11433"
+               style="stop-color:#57ADFF"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="94.524902"
+             y1="133.65625"
+             x2="184.72461"
+             y2="43.456532"
+             id="linearGradient11434"
+             gradientUnits="userSpaceOnUse">
+            <stop
+               id="stop11435"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop11436"
+               style="stop-color:#fcfeff;stop-opacity:1"
+               offset="0.31658" />
+            <stop
+               id="stop11437"
+               style="stop-color:#f2faff;stop-opacity:1"
+               offset="0.57076001" />
+            <stop
+               id="stop11438"
+               style="stop-color:#e1f3ff;stop-opacity:1"
+               offset="0.80255997" />
+            <stop
+               id="stop11439"
+               style="stop-color:#ccebff;stop-opacity:1"
+               offset="1" />
+            <midPointStop
+               id="midPointStop11440"
+               style="stop-color:#FFFFFF"
+               offset="0" />
+            <midPointStop
+               id="midPointStop11441"
+               style="stop-color:#FFFFFF"
+               offset="0.75" />
+            <midPointStop
+               id="midPointStop11442"
+               style="stop-color:#CCEBFF"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="126.8584"
+             y1="102.09082"
+             x2="51.48325"
+             y2="177.46597"
+             id="linearGradient11443"
+             xlink:href="#linearGradient2186"
+             gradientUnits="userSpaceOnUse"
+             spreadMethod="pad">
+            <midPointStop
+               id="midPointStop11444"
+               style="stop-color:#57ADFF"
+               offset="0" />
+            <midPointStop
+               id="midPointStop11445"
+               style="stop-color:#57ADFF"
+               offset="0.5" />
+            <midPointStop
+               id="midPointStop11446"
+               style="stop-color:#003399"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="116.01855"
+             y1="112.93164"
+             x2="56.763809"
+             y2="172.18639"
+             id="linearGradient11447"
+             xlink:href="#linearGradient2503"
+             gradientUnits="userSpaceOnUse"
+             spreadMethod="pad">
+            <midPointStop
+               id="midPointStop11448"
+               style="stop-color:#FFFFFF"
+               offset="0.45" />
+            <midPointStop
+               id="midPointStop11449"
+               style="stop-color:#FFFFFF"
+               offset="0.75" />
+            <midPointStop
+               id="midPointStop11450"
+               style="stop-color:#D4EEFF"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="92.049637"
+             y1="109.93223"
+             x2="-35.710068"
+             y2="216.77003"
+             id="linearGradient11451"
+             xlink:href="#XMLID_6_"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="103.71875"
+             y1="107.75011"
+             x2="223.05583"
+             y2="-5.3456044"
+             id="linearGradient11452"
+             xlink:href="#XMLID_6_"
+             gradientUnits="userSpaceOnUse" />
+        </defs>
+      </defs>
+      <linearGradient
+         x1="25.786175"
+         y1="64.033974"
+         x2="21.962322"
+         y2="24.822727"
+         id="linearGradient11453"
+         xlink:href="#linearGradient1495"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.361634,0,0,0.734412,-148.2041,2.879134)" />
+      <defs
+         id="defs1159">
+        <linearGradient
+           id="linearGradient14037">
+          <stop
+             id="stop2979"
+             style="stop-color:#ffffff;stop-opacity:0.58999997"
+             offset="0" />
+          <stop
+             id="stop2978"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient1678"
+           xlink:href="#linearGradient2119"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           id="linearGradient1166">
+          <stop
+             id="stop1167"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop1168"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient11462">
+          <stop
+             id="stop1170"
+             style="stop-color:#578dbb;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop1171"
+             style="stop-color:#0b335d;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient1172">
+          <stop
+             id="stop1173"
+             style="stop-color:#000000;stop-opacity:0.67843139"
+             offset="0" />
+          <stop
+             id="stop1174"
+             style="stop-color:#000000;stop-opacity:0.32941177"
+             offset="0.56999999" />
+          <stop
+             id="stop1175"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient14051"
+           xlink:href="#linearGradient2122"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient1539"
+           xlink:href="#linearGradient1495"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0.5276596"
+           y1="0.4609375"
+           x2="0.35319149"
+           y2="-1.328125"
+           id="linearGradient1542"
+           xlink:href="#linearGradient1539" />
+        <linearGradient
+           x1="0.57391304"
+           y1="0.79691941"
+           x2="0.57391304"
+           y2="-0.0546875"
+           id="linearGradient1543"
+           xlink:href="#linearGradient1544" />
+        <linearGradient
+           x1="0.99607843"
+           y1="0.69512194"
+           x2="-0.042956594"
+           y2="0.67073172"
+           id="linearGradient1547"
+           xlink:href="#linearGradient1544" />
+        <linearGradient
+           x1="0.93162394"
+           y1="0.7578125"
+           x2="0.18803419"
+           y2="-0.0546875"
+           id="linearGradient1548"
+           xlink:href="#linearGradient1544" />
+        <linearGradient
+           x1="0.78918916"
+           y1="0.7578125"
+           x2="-0.28108108"
+           y2="0.5078125"
+           id="linearGradient1190"
+           xlink:href="#linearGradient1544" />
+        <linearGradient
+           x1="0.53521127"
+           y1="0.125"
+           x2="0.12676056"
+           y2="1.03125"
+           id="linearGradient1191"
+           xlink:href="#linearGradient1678" />
+        <linearGradient
+           x1="0.627451"
+           y1="0.203125"
+           x2="0.52941179"
+           y2="1.203125"
+           id="linearGradient1192"
+           xlink:href="#linearGradient1678" />
+        <linearGradient
+           x1="0.74358976"
+           y1="0.2265625"
+           x2="0.6837607"
+           y2="1.5390625"
+           id="linearGradient14064"
+           xlink:href="#linearGradient1678" />
+        <linearGradient
+           x1="1.4666667"
+           y1="0.74528301"
+           x2="0.43137255"
+           y2="0.55660379"
+           id="linearGradient1681"
+           xlink:href="#linearGradient865" />
+        <linearGradient
+           x1="0.27027026"
+           y1="0.7265625"
+           x2="0.37837839"
+           y2="-0.09375"
+           id="linearGradient11484"
+           xlink:href="#linearGradient1678" />
+        <linearGradient
+           x1="0.45901638"
+           y1="0.8203125"
+           x2="1.2786885"
+           y2="-1.0859375"
+           id="linearGradient11485"
+           xlink:href="#linearGradient1678" />
+        <linearGradient
+           x1="0.69105691"
+           y1="0.21875"
+           x2="0.36585367"
+           y2="1.296875"
+           id="linearGradient11486"
+           xlink:href="#linearGradient1678" />
+        <linearGradient
+           x1="0.31360948"
+           y1="0.546875"
+           x2="1.1775148"
+           y2="0.046875"
+           id="linearGradient3443"
+           xlink:href="#linearGradient1678" />
+        <radialGradient
+           cx="0.5"
+           cy="0.5"
+           r="0.5"
+           fx="0.50588238"
+           fy="0.72340423"
+           id="radialGradient1199"
+           xlink:href="#linearGradient1400" />
+        <linearGradient
+           x1="2.4314721"
+           y1="0.015625"
+           x2="-0.26395938"
+           y2="0.4765625"
+           id="linearGradient11489"
+           xlink:href="#linearGradient865" />
+        <linearGradient
+           x1="0.45454547"
+           y1="0.359375"
+           x2="1.3030303"
+           y2="2.203125"
+           id="linearGradient5789"
+           xlink:href="#linearGradient1678" />
+        <radialGradient
+           cx="0.53488374"
+           cy="0.2265625"
+           r="0.6357069"
+           fx="0.53875971"
+           fy="-0.03125"
+           id="radialGradient1202"
+           xlink:href="#linearGradient853" />
+        <linearGradient
+           x1="0.37209302"
+           y1="0.6015625"
+           x2="0.37209302"
+           y2="-0.125"
+           id="linearGradient7622"
+           xlink:href="#linearGradient1539" />
+        <linearGradient
+           x1="0.51999998"
+           y1="0.6640625"
+           x2="0.22666667"
+           y2="-0.0703125"
+           id="linearGradient7625"
+           xlink:href="#linearGradient1678" />
+        <linearGradient
+           x1="0.56097561"
+           y1="0.58503401"
+           x2="0.56097561"
+           y2="1.2312925"
+           id="linearGradient3418"
+           xlink:href="#linearGradient1539" />
+        <defs
+           id="defs2863">
+          <linearGradient
+             id="linearGradient5301">
+            <stop
+               id="stop5302"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop5303"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient4671">
+            <stop
+               id="stop4672"
+               style="stop-color:#ffeb00;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop4673"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient4044"
+             xlink:href="#linearGradient2977"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient14085">
+            <stop
+               id="stop2163"
+               style="stop-color:#22bfee;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop51967"
+               style="stop-color:#11679f;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="0.5"
+             cy="0.5"
+             r="0.51540583"
+             fx="0.5"
+             fy="0.5"
+             id="radialGradient14088"
+             xlink:href="#linearGradient2162" />
+          <linearGradient
+             x1="0.94814813"
+             y1="0.088888891"
+             x2="0.0074074073"
+             y2="0.77037036"
+             id="linearGradient4674"
+             xlink:href="#linearGradient4671" />
+        </defs>
+      </defs>
+      <linearGradient
+         x1="77.291656"
+         y1="180.92995"
+         x2="53.211624"
+         y2="24.17461"
+         id="linearGradient11515"
+         xlink:href="#linearGradient1758"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="43.39798"
+         y1="-53.39077"
+         x2="38.977112"
+         y2="40.053986"
+         id="linearGradient11516"
+         xlink:href="#linearGradient1755"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="178.42355"
+         y1="199.48994"
+         x2="88.360741"
+         y2="112.48578"
+         id="linearGradient11517"
+         xlink:href="#linearGradient1761"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.985159,0,0,0.861567,6.509884,6.74883)" />
+      <radialGradient
+         cx="227.00549"
+         cy="477.83307"
+         r="200.73203"
+         fx="240.38737"
+         fy="325.7662"
+         id="radialGradient1782"
+         xlink:href="#linearGradient1764"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="105.80702"
+         y1="25.611177"
+         x2="82.344437"
+         y2="46.947098"
+         id="linearGradient11519"
+         xlink:href="#linearGradient865"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-1.021242,0,0,0.831124,156.1499,15.96175)" />
+      <linearGradient
+         id="linearGradient11520">
+        <stop
+           id="stop11521"
+           style="stop-color:#e3f9ff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop11522"
+           style="stop-color:#73bee7;stop-opacity:1"
+           offset="0.36194703" />
+        <stop
+           id="stop11523"
+           style="stop-color:#438ec5;stop-opacity:1"
+           offset="0.62534887" />
+        <stop
+           id="stop11524"
+           style="stop-color:#477daf;stop-opacity:1"
+           offset="0.72607356" />
+        <stop
+           id="stop11525"
+           style="stop-color:#020407;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient11526">
+        <stop
+           id="stop11527"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop11528"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient11529">
+        <stop
+           id="stop11530"
+           style="stop-color:#000000;stop-opacity:0.67843139"
+           offset="0" />
+        <stop
+           id="stop11531"
+           style="stop-color:#000000;stop-opacity:0.32941177"
+           offset="0.56999999" />
+        <stop
+           id="stop11532"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient11533">
+        <stop
+           id="stop11534"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop11535"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient11536">
+        <stop
+           id="stop14013"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop11538"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient11539">
+        <stop
+           id="stop11540"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop11541"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient11542">
+        <stop
+           id="stop11543"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop11544"
+           style="stop-color:#cfdff8;stop-opacity:1"
+           offset="0.36194703" />
+        <stop
+           id="stop11545"
+           style="stop-color:#88b4f8;stop-opacity:1"
+           offset="0.62534887" />
+        <stop
+           id="stop11546"
+           style="stop-color:#5a97f8;stop-opacity:1"
+           offset="0.72607356" />
+        <stop
+           id="stop11547"
+           style="stop-color:#020407;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient11548">
+        <stop
+           id="stop11549"
+           style="stop-color:#000000;stop-opacity:0.67843139"
+           offset="0" />
+        <stop
+           id="stop11550"
+           style="stop-color:#000000;stop-opacity:0.32941177"
+           offset="0.56999999" />
+        <stop
+           id="stop11551"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient52010">
+        <stop
+           id="stop1497"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop52013"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient11555">
+        <stop
+           id="stop2121"
+           style="stop-color:#d1940c;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop2120"
+           style="stop-color:#ffe689;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient11558">
+        <stop
+           id="stop11559"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop11560"
+           style="stop-color:#000000;stop-opacity:0.3298969"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient11561">
+        <stop
+           id="stop2505"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0.44999999" />
+        <stop
+           id="stop13989"
+           style="stop-color:#a4cdec;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient15530">
+        <stop
+           id="stop15532"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop15534"
+           style="stop-color:#89a2bb;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient10727">
+        <stop
+           id="stop10730"
+           style="stop-color:#9db8d2;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop10729"
+           style="stop-color:#6988b7;stop-opacity:0.375"
+           offset="0.5" />
+        <stop
+           id="stop10728"
+           style="stop-color:#929395;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient25264">
+        <stop
+           id="stop25265"
+           style="stop-color:#9d92fa;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop25266"
+           style="stop-color:#d2cefa;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient25928">
+        <stop
+           id="stop25930"
+           style="stop-color:#9645f0;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop25929"
+           style="stop-color:#3d0c71;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="137.18146"
+         y1="111.74685"
+         x2="117.70457"
+         y2="83.377693"
+         id="linearGradient20642"
+         xlink:href="#linearGradient19968"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.06808,0.93626)" />
+      <linearGradient
+         x1="160.10852"
+         y1="148.29549"
+         x2="183.50435"
+         y2="104.20261"
+         id="linearGradient20643"
+         xlink:href="#linearGradient19990"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.936609,0,0,1.067681,0,-50)"
+         spreadMethod="reflect" />
+      <linearGradient
+         x1="74.910133"
+         y1="26.338404"
+         x2="70.947693"
+         y2="91.681007"
+         id="linearGradient20644"
+         xlink:href="#linearGradient19972"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(2.134535,0,0,0.468486,0,25)" />
+      <linearGradient
+         x1="129.1897"
+         y1="80.649925"
+         x2="120.79646"
+         y2="112.52274"
+         id="linearGradient20645"
+         xlink:href="#linearGradient4321"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.087869,0.919228)" />
+      <linearGradient
+         x1="100.78209"
+         y1="109.74274"
+         x2="125.62556"
+         y2="83.707664"
+         id="linearGradient20646"
+         xlink:href="#linearGradient2453"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.087869,0.919228)"
+         spreadMethod="pad" />
+      <radialGradient
+         cx="27.15983"
+         cy="179.84546"
+         r="51.667702"
+         fx="26.910305"
+         fy="173.64784"
+         id="radialGradient20647"
+         xlink:href="#linearGradient3476"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-6.955859e-3,-0.456361,0.150746,-1.229674e-2,3.949835,101.9588)" />
+      <radialGradient
+         cx="227.00549"
+         cy="477.83307"
+         r="200.73203"
+         fx="305.12347"
+         fy="321.51508"
+         id="radialGradient20648"
+         xlink:href="#linearGradient1764"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="43.39798"
+         y1="-53.39077"
+         x2="38.977112"
+         y2="40.053986"
+         id="linearGradient20649"
+         xlink:href="#linearGradient1755"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="77.291656"
+         y1="180.92995"
+         x2="53.211624"
+         y2="24.17461"
+         id="linearGradient20650"
+         xlink:href="#linearGradient1758"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="43.026314"
+         y1="111.53536"
+         x2="72.329941"
+         y2="150.48961"
+         id="linearGradient20651"
+         xlink:href="#linearGradient19996"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(2.134535,0.468486)" />
+      <linearGradient
+         x1="160.10852"
+         y1="148.29549"
+         x2="183.50435"
+         y2="104.20261"
+         id="linearGradient20652"
+         xlink:href="#linearGradient20002"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.936609,0,0,1.067681,0,-50)"
+         spreadMethod="reflect" />
+      <radialGradient
+         cx="75.140198"
+         cy="43.796791"
+         r="45.634804"
+         fx="74.322609"
+         fy="43.041214"
+         id="radialGradient20654"
+         xlink:href="#linearGradient1770"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.920044,0.391366,8.022776e-2,0.270357,175.7284,66.07414)" />
+      <radialGradient
+         cx="75.140198"
+         cy="43.796791"
+         r="45.634804"
+         fx="74.322609"
+         fy="43.041214"
+         id="radialGradient20656"
+         xlink:href="#linearGradient1770"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.941033,-0.149309,0.186504,0.269243,115.0551,115.6103)" />
+      <linearGradient
+         x1="36.073593"
+         y1="130.16896"
+         x2="34.586372"
+         y2="93.476395"
+         id="linearGradient20683"
+         xlink:href="#linearGradient20684"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(2.156888,0.463631)" />
+      <linearGradient
+         x1="37.469395"
+         y1="137.59514"
+         x2="39.257801"
+         y2="109.69102"
+         id="linearGradient20690"
+         xlink:href="#linearGradient20687"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(2.006005,0.498503)" />
+      <linearGradient
+         x1="34.361797"
+         y1="212.95207"
+         x2="34.594048"
+         y2="115.14312"
+         id="linearGradient20695"
+         xlink:href="#linearGradient20692"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(2.182491,0,0,0.441004,0,1.81802)" />
+      <linearGradient
+         x1="36.073593"
+         y1="130.16896"
+         x2="34.586372"
+         y2="93.476395"
+         id="linearGradient20698"
+         xlink:href="#linearGradient20684"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(2.156888,0.463631)" />
+      <linearGradient
+         x1="37.469395"
+         y1="137.59514"
+         x2="39.257801"
+         y2="109.69102"
+         id="linearGradient20699"
+         xlink:href="#linearGradient20687"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(2.006005,0.498503)" />
+      <linearGradient
+         x1="31.261169"
+         y1="163.97786"
+         x2="33.555626"
+         y2="110.13072"
+         id="linearGradient20701"
+         xlink:href="#linearGradient20684"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(2.156888,0.463631)" />
+      <linearGradient
+         x1="35.708042"
+         y1="149.49887"
+         x2="39.25779"
+         y2="109.69099"
+         id="linearGradient20702"
+         xlink:href="#linearGradient20687"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(2.006005,0.498503)" />
+      <linearGradient
+         x1="9.1314173"
+         y1="146.06601"
+         x2="107.56648"
+         y2="146.06601"
+         id="linearGradient20712"
+         xlink:href="#linearGradient20708"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.471771,0.679453)" />
+      <radialGradient
+         cx="75.140198"
+         cy="43.796791"
+         r="45.634804"
+         fx="74.322609"
+         fy="43.041214"
+         id="radialGradient20726"
+         xlink:href="#linearGradient1770"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.941033,-0.149309,0.186504,0.269243,115.0551,115.6103)" />
+      <radialGradient
+         cx="75.140198"
+         cy="43.796791"
+         r="45.634804"
+         fx="74.322609"
+         fy="43.041214"
+         id="radialGradient20727"
+         xlink:href="#linearGradient1770"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.920044,0.391366,8.022776e-2,0.270357,175.7284,66.07414)" />
+      <linearGradient
+         x1="76.603523"
+         y1="89.885307"
+         x2="50.447811"
+         y2="38.944546"
+         id="linearGradient20736"
+         xlink:href="#linearGradient1758"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="17.819632"
+         y1="-4.1234546"
+         x2="38.977112"
+         y2="40.053986"
+         id="linearGradient20737"
+         xlink:href="#linearGradient1755"
+         gradientUnits="userSpaceOnUse" />
+      <radialGradient
+         cx="227.06325"
+         cy="479.21014"
+         r="200.73203"
+         fx="134.11388"
+         fy="358.7114"
+         id="radialGradient20738"
+         xlink:href="#linearGradient1764"
+         gradientUnits="userSpaceOnUse" />
+    </defs>
+    <linearGradient
+       x1="-235.54739"
+       y1="455.8291"
+       x2="-233.9202"
+       y2="455.8291"
+       id="XMLID_8_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-211.4047,211.919,211.919,211.4047,-146204.4,-46500.47)">
+      <stop
+         id="stop19"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop21"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <defs
+       id="defs25395">
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient2187"
+         xlink:href="#linearGradient26106"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         x1="35.34549"
+         y1="29.386007"
+         x2="34.344078"
+         y2="-9.4694605"
+         id="linearGradient2193"
+         xlink:href="#linearGradient2187"
+         gradientUnits="userSpaceOnUse" />
+    </defs>
+    <defs
+       id="defs24721">
+      <linearGradient
+         id="linearGradient24879">
+        <stop
+           id="stop24881"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop24883"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24885">
+        <stop
+           id="stop24887"
+           style="stop-color:#4d90fa;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop24889"
+           style="stop-color:#4d90fa;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24891">
+        <stop
+           id="stop24893"
+           style="stop-color:#000000;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop24895"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="0"
+         y1="0.5"
+         x2="1"
+         y2="0.5"
+         id="linearGradient24897"
+         xlink:href="#linearGradient7109"
+         gradientUnits="objectBoundingBox"
+         spreadMethod="pad" />
+      <linearGradient
+         id="linearGradient24899">
+        <stop
+           id="stop24901"
+           style="stop-color:#000000;stop-opacity:0.2937853"
+           offset="0" />
+        <stop
+           id="stop24903"
+           style="stop-color:#000000;stop-opacity:0.06214689"
+           offset="0.6477778" />
+        <stop
+           id="stop47953"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24737">
+        <stop
+           id="stop24739"
+           style="stop-color:#ffffff;stop-opacity:0.69072163"
+           offset="0" />
+        <stop
+           id="stop24741"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24909">
+        <stop
+           id="stop24911"
+           style="stop-color:#ffffff;stop-opacity:0.61983472"
+           offset="0" />
+        <stop
+           id="stop24913"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24915">
+        <stop
+           id="stop24917"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop24919"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24749">
+        <stop
+           id="stop24751"
+           style="stop-color:#ffffff;stop-opacity:0.61983472"
+           offset="0" />
+        <stop
+           id="stop24753"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24755">
+        <stop
+           id="stop24757"
+           style="stop-color:#000000;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop24759"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24761">
+        <stop
+           id="stop24763"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop24765"
+           style="stop-color:#ffffff;stop-opacity:0.16078432"
+           offset="0.52955699" />
+        <stop
+           id="stop24767"
+           style="stop-color:#000000;stop-opacity:0.05882353"
+           offset="0.67708677" />
+        <stop
+           id="stop24769"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24771">
+        <stop
+           id="stop24773"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop24775"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24935">
+        <stop
+           id="stop24937"
+           style="stop-color:#000000;stop-opacity:0.3882353"
+           offset="0" />
+        <stop
+           id="stop24939"
+           style="stop-color:#ffffff;stop-opacity:0.34375"
+           offset="0.5" />
+        <stop
+           id="stop24941"
+           style="stop-color:#ffffff;stop-opacity:0.19607843"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24781">
+        <stop
+           id="stop24783"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="0" />
+        <stop
+           id="stop24785"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24787">
+        <stop
+           id="stop24789"
+           style="stop-color:#000000;stop-opacity:0.3882353"
+           offset="0" />
+        <stop
+           id="stop24791"
+           style="stop-color:#000000;stop-opacity:0.19215687"
+           offset="0.5" />
+        <stop
+           id="stop24793"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24950">
+        <stop
+           id="stop24952"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop24954"
+           style="stop-color:#ffffff;stop-opacity:0.16078432"
+           offset="0.52955699" />
+        <stop
+           id="stop24956"
+           style="stop-color:#000000;stop-opacity:0.05882353"
+           offset="0.67708677" />
+        <stop
+           id="stop24958"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24960">
+        <stop
+           id="stop24962"
+           style="stop-color:#171a00;stop-opacity:0.66670001"
+           offset="0" />
+        <stop
+           id="stop24964"
+           style="stop-color:#2f2500;stop-opacity:0.0039"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24966">
+        <stop
+           id="stop24968"
+           style="stop-color:#ffcf3d;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop24970"
+           style="stop-color:#b27f00;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24972">
+        <stop
+           id="stop24974"
+           style="stop-color:#bfff00;stop-opacity:0.60000002"
+           offset="0" />
+        <stop
+           id="stop24976"
+           style="stop-color:#fff200;stop-opacity:0.60000002"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24978">
+        <stop
+           id="stop24980"
+           style="stop-color:#000000;stop-opacity:0.3882353"
+           offset="0" />
+        <stop
+           id="stop24982"
+           style="stop-color:#000000;stop-opacity:0.19215687"
+           offset="0.5" />
+        <stop
+           id="stop24984"
+           style="stop-color:#000000;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24986">
+        <stop
+           id="stop24988"
+           style="stop-color:#43b0e2;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop24990"
+           style="stop-color:#43b0e2;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient24992">
+        <stop
+           id="stop24994"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop24996"
+           style="stop-color:#fafbff;stop-opacity:1"
+           offset="0.25" />
+        <stop
+           id="stop24998"
+           style="stop-color:#f0f2fa;stop-opacity:1"
+           offset="0.5" />
+        <stop
+           id="stop25000"
+           style="stop-color:#e1e1e1;stop-opacity:1"
+           offset="0.75" />
+        <stop
+           id="stop25002"
+           style="stop-color:#f5f6ff;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient25004">
+        <stop
+           id="stop25006"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop25008"
+           style="stop-color:#d0d1d9;stop-opacity:1"
+           offset="0.5" />
+        <stop
+           id="stop25010"
+           style="stop-color:#878b9b;stop-opacity:1"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         id="linearGradient25018">
+        <stop
+           id="stop25020"
+           style="stop-color:#e8e8e8;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop25022"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient24829"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <radialGradient
+         cx="-77.367622"
+         cy="42.633839"
+         r="216.26619"
+         fx="-80.036034"
+         fy="44.468376"
+         id="radialGradient24831"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+      <defs
+         id="defs25026">
+        <linearGradient
+           id="linearGradient25028">
+          <stop
+             id="stop25030"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25032"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25034">
+          <stop
+             id="stop25036"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop25038"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop25040"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop25042"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop25044"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25046">
+          <stop
+             id="stop25048"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25050"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="133.07144"
+           y1="28.231943"
+           x2="118.58411"
+           y2="13.431207"
+           id="linearGradient25052"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+        <linearGradient
+           x1="30.722504"
+           y1="28.135216"
+           x2="39.78149"
+           y2="27.315481"
+           id="linearGradient25054"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103232)" />
+        <radialGradient
+           cx="4.9853168"
+           cy="108.47158"
+           r="34.222183"
+           fx="5.2520976"
+           fy="108.73115"
+           id="radialGradient25056"
+           xlink:href="#linearGradient2877"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="36.826332"
+           y1="75.332558"
+           x2="25.761681"
+           y2="135.90358"
+           id="linearGradient25058"
+           xlink:href="#linearGradient2877"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+        <linearGradient
+           x1="78.675774"
+           y1="47.411823"
+           x2="64.05336"
+           y2="34.302757"
+           id="linearGradient25060"
+           xlink:href="#linearGradient4281"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+        <defs
+           id="defs25062">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient25064"
+             xlink:href="#linearGradient3296"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient25066"
+             xlink:href="#linearGradient2483"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+        </defs>
+      </defs>
+      <linearGradient
+         x1="88.712402"
+         y1="138.15012"
+         x2="104.81104"
+         y2="151.63045"
+         id="linearGradient3295"
+         xlink:href="#linearGradient3305"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+      <linearGradient
+         x1="17.914211"
+         y1="221.47987"
+         x2="425.89865"
+         y2="221.47987"
+         id="linearGradient24863"
+         xlink:href="#linearGradient2483"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.988025,1.012121)" />
+      <linearGradient
+         x1="17.914211"
+         y1="221.47987"
+         x2="425.89865"
+         y2="221.47987"
+         id="linearGradient24865"
+         xlink:href="#linearGradient2483"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.988025,1.012121)" />
+      <linearGradient
+         x1="17.914211"
+         y1="221.47987"
+         x2="425.89865"
+         y2="221.47987"
+         id="linearGradient24867"
+         xlink:href="#linearGradient2483"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.988025,1.012121)" />
+      <defs
+         id="defs25078">
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient25080"
+           xlink:href="#linearGradient4595"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient25082"
+           xlink:href="#linearGradient3108"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient25084"
+           xlink:href="#linearGradient3749"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient48061"
+           xlink:href="#linearGradient3527"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient48063"
+           xlink:href="#linearGradient3076"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           id="linearGradient25088">
+          <stop
+             id="stop25090"
+             style="stop-color:#000000;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25092"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="217.42307"
+           y1="536.03741"
+           x2="217.42307"
+           y2="459.23132"
+           id="linearGradient48068"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.241013,0.805793)" />
+        <linearGradient
+           x1="87.605721"
+           y1="1061.6371"
+           x2="87.605721"
+           y2="1160.6499"
+           id="linearGradient25095"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.930484,0.518005)" />
+        <linearGradient
+           x1="177.77042"
+           y1="831.05975"
+           x2="178.45302"
+           y2="795.11487"
+           id="linearGradient25097"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.548996,0.64558)" />
+        <linearGradient
+           x1="458.70102"
+           y1="329.58002"
+           x2="404.87259"
+           y2="326.23184"
+           id="linearGradient25099"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.733715,1.362927)" />
+        <linearGradient
+           x1="139.11636"
+           y1="564.54614"
+           x2="200.18613"
+           y2="564.54614"
+           id="linearGradient25101"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.54934,0.645436)" />
+        <linearGradient
+           x1="118.25803"
+           y1="563.01941"
+           x2="156.10408"
+           y2="564.03723"
+           id="linearGradient25103"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.54934,0.645436)" />
+        <linearGradient
+           x1="238.75548"
+           y1="339.24017"
+           x2="317.05142"
+           y2="333.88309"
+           id="linearGradient48075"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.733715,1.362927)" />
+        <linearGradient
+           x1="192.95671"
+           y1="559.13995"
+           x2="192.95671"
+           y2="588.70502"
+           id="linearGradient25106"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.380924,0.724153)" />
+        <linearGradient
+           x1="199.15404"
+           y1="696.90118"
+           x2="193.92329"
+           y2="593.573"
+           id="linearGradient24886"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.381391,0.723908)" />
+        <linearGradient
+           x1="354.95923"
+           y1="464.90207"
+           x2="354.95923"
+           y2="299.05014"
+           id="linearGradient48079"
+           xlink:href="#linearGradient1102"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.733715,1.362927)" />
+        <radialGradient
+           cx="184.20265"
+           cy="780.47272"
+           r="49.972103"
+           fx="182.57774"
+           fy="734.32568"
+           id="radialGradient25110"
+           xlink:href="#linearGradient948"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.455004,0.687283)" />
+        <radialGradient
+           cx="0.52464789"
+           cy="0.32867134"
+           r="0.28679976"
+           fx="0.52464789"
+           fy="0.59440559"
+           id="radialGradient25112"
+           xlink:href="#linearGradient843" />
+        <radialGradient
+           cx="106.52795"
+           cy="541.31592"
+           r="49.665058"
+           fx="105.48236"
+           fy="502.10669"
+           id="radialGradient25114"
+           xlink:href="#linearGradient994"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="84.970261"
+           y1="1095.1855"
+           x2="84.970261"
+           y2="1189.3411"
+           id="linearGradient25116"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.987109,0.503244)" />
+        <linearGradient
+           x1="217.42307"
+           y1="536.03741"
+           x2="217.42307"
+           y2="459.23132"
+           id="linearGradient25118"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="199.15404"
+           y1="696.90118"
+           x2="193.92329"
+           y2="593.573"
+           id="linearGradient25120"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="192.95671"
+           y1="559.13995"
+           x2="192.95671"
+           y2="588.70502"
+           id="linearGradient25122"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="192.95671"
+           y1="559.13995"
+           x2="192.95671"
+           y2="588.70502"
+           id="linearGradient25124"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="199.15404"
+           y1="696.90118"
+           x2="193.92329"
+           y2="593.573"
+           id="linearGradient25126"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="217.42307"
+           y1="536.03741"
+           x2="217.42307"
+           y2="459.23132"
+           id="linearGradient25128"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+      </defs>
+      <defs
+         id="defs25133">
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient25135"
+           xlink:href="#linearGradient3615"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient25137"
+           xlink:href="#linearGradient3608"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient25139"
+           xlink:href="#linearGradient3612"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0.314347"
+           y1="0.54857099"
+           x2="0.53643698"
+           y2="0.554286"
+           id="linearGradient25141"
+           xlink:href="#linearGradient218" />
+        <linearGradient
+           x1="0.246326"
+           y1="0.59428602"
+           x2="0.78109801"
+           y2="0.57142901"
+           id="linearGradient25143"
+           xlink:href="#linearGradient223" />
+        <radialGradient
+           cx="0.257236"
+           cy="0.27271599"
+           r="0.65467203"
+           fx="0.273312"
+           fy="0.51515198"
+           id="radialGradient25145"
+           xlink:href="#linearGradient1105" />
+      </defs>
+      <linearGradient
+         x1="458.70102"
+         y1="329.58002"
+         x2="404.87259"
+         y2="326.23184"
+         id="linearGradient3939"
+         xlink:href="#linearGradient3527"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.733715,1.362927)" />
+      <linearGradient
+         x1="354.95923"
+         y1="464.90207"
+         x2="354.95923"
+         y2="299.05014"
+         id="linearGradient24916"
+         xlink:href="#linearGradient1102"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.733715,1.362927)" />
+      <linearGradient
+         x1="238.75548"
+         y1="339.24017"
+         x2="317.05142"
+         y2="333.88309"
+         id="linearGradient24918"
+         xlink:href="#linearGradient3527"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.733715,1.362927)" />
+      <linearGradient
+         x1="458.70102"
+         y1="329.58002"
+         x2="404.87259"
+         y2="326.23184"
+         id="linearGradient24920"
+         xlink:href="#linearGradient3527"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.733715,1.362927)" />
+      <linearGradient
+         x1="192.95671"
+         y1="559.13995"
+         x2="192.95671"
+         y2="588.70502"
+         id="linearGradient24922"
+         xlink:href="#linearGradient3527"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+      <linearGradient
+         x1="199.15404"
+         y1="696.90118"
+         x2="193.92329"
+         y2="593.573"
+         id="linearGradient24924"
+         xlink:href="#linearGradient3527"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+      <linearGradient
+         x1="217.42307"
+         y1="536.03741"
+         x2="217.42307"
+         y2="459.23132"
+         id="linearGradient24926"
+         xlink:href="#linearGradient838"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+      <linearGradient
+         x1="118.25803"
+         y1="563.01941"
+         x2="156.10408"
+         y2="564.03723"
+         id="linearGradient24928"
+         xlink:href="#linearGradient3527"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.54934,0.645436)" />
+      <linearGradient
+         x1="139.11636"
+         y1="564.54614"
+         x2="200.18613"
+         y2="564.54614"
+         id="linearGradient24930"
+         xlink:href="#linearGradient3527"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.54934,0.645436)" />
+      <radialGradient
+         cx="184.20265"
+         cy="780.47272"
+         r="49.972103"
+         fx="182.57774"
+         fy="734.32568"
+         id="radialGradient24932"
+         xlink:href="#linearGradient3749"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.455004,0.687283)" />
+      <linearGradient
+         x1="177.77042"
+         y1="831.05975"
+         x2="178.45302"
+         y2="795.11487"
+         id="linearGradient24934"
+         xlink:href="#linearGradient3527"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.548996,0.64558)" />
+      <linearGradient
+         x1="84.970261"
+         y1="1095.1855"
+         x2="84.970261"
+         y2="1189.3411"
+         id="linearGradient24936"
+         xlink:href="#linearGradient838"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.987109,0.503244)" />
+      <linearGradient
+         x1="87.605721"
+         y1="1061.6371"
+         x2="87.605721"
+         y2="1160.6499"
+         id="linearGradient24938"
+         xlink:href="#linearGradient838"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.930484,0.518005)" />
+      <radialGradient
+         cx="106.52795"
+         cy="541.31592"
+         r="49.665058"
+         fx="105.48236"
+         fy="502.10669"
+         id="radialGradient24940"
+         xlink:href="#linearGradient994"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="-91.514885"
+         y1="199.05321"
+         x2="30.274208"
+         y2="194.82513"
+         id="linearGradient24942"
+         xlink:href="#linearGradient4595"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.026011,0.974648)" />
+      <linearGradient
+         x1="-4.4710765"
+         y1="366.76578"
+         x2="26.069948"
+         y2="512.50165"
+         id="linearGradient24944"
+         xlink:href="#linearGradient4595"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.633883,0,0,0.536553,-25.41624,-15.94345)" />
+      <linearGradient
+         x1="-49.343468"
+         y1="302.82651"
+         x2="-10.230718"
+         y2="302.82651"
+         id="linearGradient24946"
+         xlink:href="#linearGradient4592"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.318581,0.758391)" />
+      <linearGradient
+         x1="-18.900764"
+         y1="185.38274"
+         x2="24.677307"
+         y2="151.7379"
+         id="linearGradient24948"
+         xlink:href="#linearGradient4595"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.706204,1.416022)" />
+      <linearGradient
+         x1="-6.0588322"
+         y1="210.60007"
+         x2="6.9808698"
+         y2="293.03543"
+         id="linearGradient24951"
+         xlink:href="#linearGradient4588"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.439544,0,0,0.694664,-12.26418,6.7453)" />
+      <linearGradient
+         x1="-91.514885"
+         y1="199.05321"
+         x2="30.274208"
+         y2="194.82513"
+         id="linearGradient24953"
+         xlink:href="#linearGradient4595"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.272246,-0.435187,0.939711,0.665801,-204.4414,93.2513)" />
+      <linearGradient
+         x1="-18.900764"
+         y1="185.38274"
+         x2="24.677307"
+         y2="151.7379"
+         id="linearGradient24955"
+         xlink:href="#linearGradient4595"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.706204,1.416022)" />
+      <linearGradient
+         x1="-91.514885"
+         y1="199.05321"
+         x2="30.274208"
+         y2="194.82513"
+         id="linearGradient24957"
+         xlink:href="#linearGradient4595"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.026011,0.974648)" />
+      <linearGradient
+         x1="-49.343468"
+         y1="302.82651"
+         x2="-10.230718"
+         y2="302.82651"
+         id="linearGradient24959"
+         xlink:href="#linearGradient4592"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.318581,0.758391)" />
+      <linearGradient
+         x1="-6.0588322"
+         y1="210.60007"
+         x2="6.9808698"
+         y2="293.03543"
+         id="linearGradient24961"
+         xlink:href="#linearGradient4588"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.439544,0,0,0.694664,-12.26418,6.7453)" />
+      <linearGradient
+         x1="-91.514885"
+         y1="199.05321"
+         x2="30.274208"
+         y2="194.82513"
+         id="linearGradient24963"
+         xlink:href="#linearGradient4595"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.272246,-0.435187,0.939711,0.665801,-204.4414,93.2513)" />
+      <defs
+         id="defs24965">
+        <linearGradient
+           id="linearGradient24967">
+          <stop
+             id="stop24969"
+             style="stop-color:#000000;stop-opacity:0.3882353"
+             offset="0" />
+          <stop
+             id="stop24971"
+             style="stop-color:#ffffff;stop-opacity:0.34375"
+             offset="0.5" />
+          <stop
+             id="stop24973"
+             style="stop-color:#ffffff;stop-opacity:0.19607843"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient24975"
+           xlink:href="#linearGradient3057"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient24977"
+           xlink:href="#linearGradient4618"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient24979"
+           xlink:href="#linearGradient4588"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient24981"
+           xlink:href="#linearGradient4615"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient24983"
+           xlink:href="#linearGradient3041"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           x1="217.42307"
+           y1="536.03741"
+           x2="217.42307"
+           y2="459.23132"
+           id="linearGradient24985"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.241013,0.805793)" />
+        <linearGradient
+           x1="87.605721"
+           y1="1061.6371"
+           x2="87.605721"
+           y2="1160.6499"
+           id="linearGradient24987"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.930484,0.518005)" />
+        <linearGradient
+           x1="177.77042"
+           y1="831.05975"
+           x2="178.45302"
+           y2="795.11487"
+           id="linearGradient24989"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.548996,0.64558)" />
+        <linearGradient
+           x1="458.70102"
+           y1="329.58002"
+           x2="404.87259"
+           y2="326.23184"
+           id="linearGradient24991"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.733715,1.362927)" />
+        <linearGradient
+           x1="139.11636"
+           y1="564.54614"
+           x2="200.18613"
+           y2="564.54614"
+           id="linearGradient24993"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.54934,0.645436)" />
+        <linearGradient
+           x1="118.25803"
+           y1="563.01941"
+           x2="156.10408"
+           y2="564.03723"
+           id="linearGradient24995"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.54934,0.645436)" />
+        <linearGradient
+           x1="238.75548"
+           y1="339.24017"
+           x2="317.05142"
+           y2="333.88309"
+           id="linearGradient24997"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.733715,1.362927)" />
+        <linearGradient
+           x1="192.95671"
+           y1="559.13995"
+           x2="192.95671"
+           y2="588.70502"
+           id="linearGradient24999"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.380924,0.724153)" />
+        <linearGradient
+           x1="199.15404"
+           y1="696.90118"
+           x2="193.92329"
+           y2="593.573"
+           id="linearGradient25001"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.381391,0.723908)" />
+        <linearGradient
+           x1="354.95923"
+           y1="464.90207"
+           x2="354.95923"
+           y2="299.05014"
+           id="linearGradient25003"
+           xlink:href="#linearGradient1102"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.733715,1.362927)" />
+        <radialGradient
+           cx="184.20265"
+           cy="780.47272"
+           r="49.972103"
+           fx="182.57774"
+           fy="734.32568"
+           id="radialGradient25005"
+           xlink:href="#linearGradient948"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.455004,0.687283)" />
+        <radialGradient
+           cx="0.52464789"
+           cy="0.32867134"
+           r="0.28679976"
+           fx="0.52464789"
+           fy="0.59440559"
+           id="radialGradient25007"
+           xlink:href="#linearGradient843" />
+        <radialGradient
+           cx="106.52795"
+           cy="541.31592"
+           r="49.665058"
+           fx="105.48236"
+           fy="502.10669"
+           id="radialGradient25009"
+           xlink:href="#linearGradient994"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="84.970261"
+           y1="1095.1855"
+           x2="84.970261"
+           y2="1189.3411"
+           id="linearGradient25011"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.987109,0.503244)" />
+        <linearGradient
+           x1="217.42307"
+           y1="536.03741"
+           x2="217.42307"
+           y2="459.23132"
+           id="linearGradient25013"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="199.15404"
+           y1="696.90118"
+           x2="193.92329"
+           y2="593.573"
+           id="linearGradient25015"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="192.95671"
+           y1="559.13995"
+           x2="192.95671"
+           y2="588.70502"
+           id="linearGradient25017"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="192.95671"
+           y1="559.13995"
+           x2="192.95671"
+           y2="588.70502"
+           id="linearGradient25019"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="199.15404"
+           y1="696.90118"
+           x2="193.92329"
+           y2="593.573"
+           id="linearGradient25021"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="217.42307"
+           y1="536.03741"
+           x2="217.42307"
+           y2="459.23132"
+           id="linearGradient25023"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="354.95923"
+           y1="464.90207"
+           x2="354.95923"
+           y2="299.05014"
+           id="linearGradient25025"
+           xlink:href="#linearGradient1102"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.733715,1.362927)" />
+        <linearGradient
+           x1="238.75548"
+           y1="339.24017"
+           x2="317.05142"
+           y2="333.88309"
+           id="linearGradient25027"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.733715,1.362927)" />
+        <linearGradient
+           x1="458.70102"
+           y1="329.58002"
+           x2="404.87259"
+           y2="326.23184"
+           id="linearGradient25029"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.733715,1.362927)" />
+        <linearGradient
+           x1="192.95671"
+           y1="559.13995"
+           x2="192.95671"
+           y2="588.70502"
+           id="linearGradient25031"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.369501,0,0,0.489812,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="199.15404"
+           y1="696.90118"
+           x2="193.92329"
+           y2="593.573"
+           id="linearGradient25033"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.369964,0,0,0.489646,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="217.42307"
+           y1="536.03741"
+           x2="217.42307"
+           y2="459.23132"
+           id="linearGradient25035"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.230747,0,0,0.545033,-60.52982,-252.2694)" />
+        <linearGradient
+           x1="118.25803"
+           y1="563.01941"
+           x2="156.10408"
+           y2="564.03723"
+           id="linearGradient25037"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.54934,0.645436)" />
+        <linearGradient
+           x1="139.11636"
+           y1="564.54614"
+           x2="200.18613"
+           y2="564.54614"
+           id="linearGradient25039"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.54934,0.645436)" />
+        <radialGradient
+           cx="184.20265"
+           cy="780.47272"
+           r="49.972103"
+           fx="182.57774"
+           fy="734.32568"
+           id="radialGradient25041"
+           xlink:href="#linearGradient948"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.455004,0.687283)" />
+        <linearGradient
+           x1="177.77042"
+           y1="831.05975"
+           x2="178.45302"
+           y2="795.11487"
+           id="linearGradient25043"
+           xlink:href="#linearGradient843"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.548996,0.64558)" />
+        <linearGradient
+           x1="84.970261"
+           y1="1095.1855"
+           x2="84.970261"
+           y2="1189.3411"
+           id="linearGradient25045"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.987109,0.503244)" />
+        <linearGradient
+           x1="87.605721"
+           y1="1061.6371"
+           x2="87.605721"
+           y2="1160.6499"
+           id="linearGradient25047"
+           xlink:href="#linearGradient838"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.930484,0.518005)" />
+        <radialGradient
+           cx="106.52795"
+           cy="541.31592"
+           r="49.665058"
+           fx="105.48236"
+           fy="502.10669"
+           id="radialGradient25049"
+           xlink:href="#linearGradient994"
+           gradientUnits="userSpaceOnUse" />
+      </defs>
+      <defs
+         id="defs25218">
+        <linearGradient
+           id="linearGradient25220">
+          <stop
+             id="stop25222"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25224"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25226">
+          <stop
+             id="stop25228"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25230"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25232">
+          <stop
+             id="stop25234"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop25236"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop25238"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop25240"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop25242"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25244">
+          <stop
+             id="stop25246"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25248"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="30.722504"
+           y1="28.135216"
+           x2="39.78149"
+           y2="27.315481"
+           id="linearGradient25250"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103232)" />
+        <defs
+           id="defs25252">
+          <linearGradient
+             id="linearGradient25254">
+            <stop
+               id="stop25256"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25258"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25260">
+            <stop
+               id="stop25262"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop25264"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop25079"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop25268"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop25270"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25272">
+            <stop
+               id="stop25274"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25276"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="23.756607"
+             cy="60.078049"
+             r="21.026033"
+             fx="23.756607"
+             fy="60.078049"
+             id="radialGradient25278"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.006281,0.993758)" />
+          <linearGradient
+             x1="31.82851"
+             y1="61.778381"
+             x2="33.198818"
+             y2="6.859036"
+             id="linearGradient25280"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.750054,0,0,1.072718,1.04579,2.663333)" />
+          <radialGradient
+             cx="92.478806"
+             cy="20.827066"
+             r="45.889046"
+             fx="92.478806"
+             fy="20.827066"
+             id="radialGradient25282"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.506767,1.973294)" />
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient25284"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+          <linearGradient
+             x1="108.49871"
+             y1="17.573528"
+             x2="185.22578"
+             y2="24.330959"
+             id="linearGradient25286"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+          <linearGradient
+             x1="28.814428"
+             y1="-1.616316"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient25288"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.764292,1.3084)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient25290"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <linearGradient
+             x1="30.382267"
+             y1="7.5329666"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient25292"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+          <linearGradient
+             x1="25.954844"
+             y1="25.071495"
+             x2="39.781502"
+             y2="27.315489"
+             id="linearGradient25294"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103231)" />
+          <radialGradient
+             cx="4.9853168"
+             cy="108.47158"
+             r="34.222183"
+             fx="5.2520976"
+             fy="108.73115"
+             id="radialGradient25296"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="36.826332"
+             y1="75.332558"
+             x2="25.761681"
+             y2="135.90358"
+             id="linearGradient25298"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+          <linearGradient
+             x1="78.675774"
+             y1="47.411823"
+             x2="64.05336"
+             y2="34.302757"
+             id="linearGradient25300"
+             xlink:href="#linearGradient4281"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+          <defs
+             id="defs25302">
+            <linearGradient
+               id="linearGradient25304">
+              <stop
+                 id="stop25306"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop25308"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop25310"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+          </defs>
+        </defs>
+        <defs
+           id="defs25320">
+          <linearGradient
+             id="linearGradient25322">
+            <stop
+               id="stop25324"
+               style="stop-color:#826647;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25326"
+               style="stop-color:#575147;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0.36627907"
+             y1="0.8125"
+             x2="0.36627907"
+             y2="0.1796875"
+             id="linearGradient25328"
+             xlink:href="#linearGradient1136"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="-0.109375"
+             y1="0.9140625"
+             x2="1.15625"
+             y2="0.1796875"
+             id="linearGradient25330"
+             xlink:href="#linearGradient1136" />
+        </defs>
+        <radialGradient
+           cx="24.825565"
+           cy="176.56438"
+           r="42.859913"
+           fx="40.974991"
+           fy="162.11137"
+           id="radialGradient25334"
+           xlink:href="#linearGradient1806"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="693.25439"
+           y1="697.24719"
+           x2="657.74762"
+           y2="677.27399"
+           id="linearGradient25336"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.983783,1.016484)" />
+        <linearGradient
+           x1="681.34058"
+           y1="728.7738"
+           x2="641.37305"
+           y2="705.9129"
+           id="linearGradient25338"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.986777,1.0134)" />
+        <linearGradient
+           x1="649.57269"
+           y1="677.24323"
+           x2="630.47528"
+           y2="668.91809"
+           id="linearGradient25340"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988806,1.011321)" />
+        <linearGradient
+           x1="647.99902"
+           y1="693.73279"
+           x2="629.89734"
+           y2="683.8114"
+           id="linearGradient25342"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.975718,1.024886)" />
+        <linearGradient
+           x1="538.89514"
+           y1="277.2775"
+           x2="575.11407"
+           y2="342.66919"
+           id="linearGradient25344"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.998206,1.001797)" />
+        <linearGradient
+           x1="509.06769"
+           y1="327.76361"
+           x2="544.86011"
+           y2="399.38104"
+           id="linearGradient25346"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.972249,1.028543)" />
+        <linearGradient
+           x1="591.27606"
+           y1="330.16998"
+           x2="620.33301"
+           y2="382.54678"
+           id="linearGradient25348"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.044357,0.957527)" />
+        <linearGradient
+           x1="566.74347"
+           y1="415.15009"
+           x2="588.13922"
+           y2="458.04449"
+           id="linearGradient25350"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.03551,0.965707)" />
+        <defs
+           id="defs25352">
+          <linearGradient
+             x1="0.25179857"
+             y1="-0.0390625"
+             x2="0.53237408"
+             y2="0.5234375"
+             id="linearGradient25354"
+             xlink:href="#linearGradient4215" />
+          <linearGradient
+             x1="0.092198581"
+             y1="-0.2109375"
+             x2="0.4822695"
+             y2="0.4921875"
+             id="linearGradient25356"
+             xlink:href="#linearGradient4215" />
+          <linearGradient
+             x1="0.016528925"
+             y1="-0.4921875"
+             x2="0.51239669"
+             y2="0.5"
+             id="linearGradient25358"
+             xlink:href="#linearGradient4215" />
+          <linearGradient
+             x1="0.05511811"
+             y1="-0.3046875"
+             x2="0.53543305"
+             y2="0.5625"
+             id="linearGradient25360"
+             xlink:href="#linearGradient4215" />
+          <linearGradient
+             x1="1.2125034"
+             y1="0.78833276"
+             x2="0.5859077"
+             y2="0.44490069"
+             id="linearGradient25362"
+             xlink:href="#linearGradient4215"
+             gradientTransform="scale(0.999075,1.000926)" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient25364"
+             xlink:href="#linearGradient3256"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="1.1610887"
+             y1="0.61942029"
+             x2="0.47761098"
+             y2="0.3214713"
+             id="linearGradient25366"
+             xlink:href="#linearGradient4215"
+             gradientTransform="scale(1.003618,0.996395)" />
+          <linearGradient
+             x1="1.8455285"
+             y1="1.34375"
+             x2="0.47967479"
+             y2="0.5625"
+             id="linearGradient25368"
+             xlink:href="#linearGradient4021" />
+          <linearGradient
+             id="linearGradient25370">
+            <stop
+               id="stop25372"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25374"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="1.7519705"
+             y1="1.0528145"
+             x2="0.54093099"
+             y2="0.37158158"
+             id="linearGradient25376"
+             xlink:href="#linearGradient4021"
+             gradientTransform="scale(0.990884,1.0092)" />
+          <linearGradient
+             x1="0.24528302"
+             y1="1.6015625"
+             x2="0.28301886"
+             y2="-0.0234375"
+             id="linearGradient25378"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.89719623"
+             y1="-0.1484375"
+             x2="0.40186915"
+             y2="0.5546875"
+             id="linearGradient25380"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.90588236"
+             y1="-0.2734375"
+             x2="0.36470589"
+             y2="0.5078125"
+             id="linearGradient25382"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.56809336"
+             y1="-0.125"
+             x2="0.49027237"
+             y2="0.59375"
+             id="linearGradient25384"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="1.4128441"
+             y1="1.25"
+             x2="0.42201835"
+             y2="0.4140625"
+             id="linearGradient25386"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.084848486"
+             y1="1.1640625"
+             x2="0.53333336"
+             y2="0.359375"
+             id="linearGradient25388"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.76190478"
+             y1="-0.53125"
+             x2="0.6857143"
+             y2="0.5390625"
+             id="linearGradient25390"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             id="linearGradient25392">
+            <stop
+               id="stop25394"
+               style="stop-color:#ffffff;stop-opacity:0.83615822"
+               offset="0" />
+            <stop
+               id="stop25396"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="2.2054794"
+             y1="2.03125"
+             x2="0.56164384"
+             y2="-0.28125"
+             id="linearGradient25398"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.88832486"
+             y1="1.0390625"
+             x2="0.55837566"
+             y2="0.3046875"
+             id="linearGradient25400"
+             xlink:href="#linearGradient1806" />
+          <linearGradient
+             x1="0.85217392"
+             y1="0.9609375"
+             x2="0.86086959"
+             y2="0.296875"
+             id="linearGradient25402"
+             xlink:href="#linearGradient1806" />
+          <linearGradient
+             x1="0.064220183"
+             y1="1.4375"
+             x2="0.22018349"
+             y2="0.3125"
+             id="linearGradient25404"
+             xlink:href="#linearGradient3970" />
+          <linearGradient
+             id="linearGradient25406">
+            <stop
+               id="stop25408"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25410"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="1.1011236"
+             y1="0.7421875"
+             x2="0.033707865"
+             y2="0.5703125"
+             id="linearGradient25412"
+             xlink:href="#linearGradient3970" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient25414"
+             xlink:href="#linearGradient4545"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <radialGradient
+             cx="0.49032259"
+             cy="0.50649351"
+             r="0.38170236"
+             fx="0.63414633"
+             fy="0.37777779"
+             id="radialGradient25416"
+             xlink:href="#linearGradient1806" />
+        </defs>
+        <linearGradient
+           x1="-191.46153"
+           y1="37.372372"
+           x2="-165.58835"
+           y2="37.372372"
+           id="linearGradient48274"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+        <defs
+           id="defs25423">
+          <linearGradient
+             id="linearGradient25425">
+            <stop
+               id="stop25427"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25429"
+               style="stop-color:#fafbff;stop-opacity:1"
+               offset="0.25" />
+            <stop
+               id="stop25431"
+               style="stop-color:#f0f2fa;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop25433"
+               style="stop-color:#e1e1e1;stop-opacity:1"
+               offset="0.75" />
+            <stop
+               id="stop25435"
+               style="stop-color:#f5f6ff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25437">
+            <stop
+               id="stop25439"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25441"
+               style="stop-color:#d0d1d9;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop25443"
+               style="stop-color:#878b9b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25172">
+            <stop
+               id="stop25446"
+               style="stop-color:#e8e8e8;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25448"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient25450"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient25452"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <defs
+             id="defs25454">
+            <linearGradient
+               id="linearGradient25179">
+              <stop
+                 id="stop25457"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop25459"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient25461">
+              <stop
+                 id="stop25463"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop25465"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop25467"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop25469"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop25471"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient25473">
+              <stop
+                 id="stop25475"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop25477"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient25479"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient48306"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient25482"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient25484"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient25486"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs25488">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient25490"
+                 xlink:href="#linearGradient3296"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+            </defs>
+          </defs>
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient25500"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        </defs>
+        <linearGradient
+           x1="84.960785"
+           y1="92.151367"
+           x2="42.64373"
+           y2="53.360722"
+           id="linearGradient25506"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.321949,0.756459)" />
+        <linearGradient
+           x1="109.15074"
+           y1="2.1610787"
+           x2="134.0733"
+           y2="60.510494"
+           id="linearGradient25508"
+           xlink:href="#linearGradient845"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.835421,1.197001)" />
+        <linearGradient
+           x1="186.07457"
+           y1="23.533224"
+           x2="202.6377"
+           y2="23.47304"
+           id="linearGradient25510"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.388045,2.57702)" />
+        <linearGradient
+           x1="92.631454"
+           y1="54.989693"
+           x2="92.631454"
+           y2="50.608093"
+           id="linearGradient25512"
+           xlink:href="#linearGradient1757"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.787838,1.269296)" />
+        <radialGradient
+           cx="24.825565"
+           cy="176.56438"
+           r="42.859913"
+           fx="40.974991"
+           fy="162.11137"
+           id="radialGradient25514"
+           xlink:href="#linearGradient1806"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="693.25439"
+           y1="697.24719"
+           x2="657.74762"
+           y2="677.27399"
+           id="linearGradient25516"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.983783,1.016484)" />
+        <linearGradient
+           x1="681.34058"
+           y1="728.7738"
+           x2="641.37305"
+           y2="705.9129"
+           id="linearGradient25518"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.986777,1.0134)" />
+        <linearGradient
+           x1="649.57269"
+           y1="677.24323"
+           x2="630.47528"
+           y2="668.91809"
+           id="linearGradient25520"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988806,1.011321)" />
+        <linearGradient
+           x1="647.99902"
+           y1="693.73279"
+           x2="629.89734"
+           y2="683.8114"
+           id="linearGradient25522"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.975718,1.024886)" />
+        <linearGradient
+           x1="538.89514"
+           y1="277.2775"
+           x2="575.11407"
+           y2="342.66919"
+           id="linearGradient25524"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.998206,1.001797)" />
+        <linearGradient
+           x1="509.06769"
+           y1="327.76361"
+           x2="544.86011"
+           y2="399.38104"
+           id="linearGradient25526"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.972249,1.028543)" />
+        <linearGradient
+           x1="591.27606"
+           y1="330.16998"
+           x2="620.33301"
+           y2="382.54678"
+           id="linearGradient25528"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.044357,0.957527)" />
+        <linearGradient
+           x1="566.74347"
+           y1="415.15009"
+           x2="588.13922"
+           y2="458.04449"
+           id="linearGradient25530"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.03551,0.965707)" />
+        <linearGradient
+           x1="133.07144"
+           y1="28.231943"
+           x2="118.58411"
+           y2="13.431207"
+           id="linearGradient25532"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+        <linearGradient
+           x1="1270.3132"
+           y1="4.8765283"
+           x2="1247.6848"
+           y2="0.72310239"
+           id="linearGradient25534"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(9.440723e-2,10.59241)" />
+        <linearGradient
+           x1="1270.3132"
+           y1="4.8765283"
+           x2="1247.6848"
+           y2="0.72310239"
+           id="linearGradient25536"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+        <defs
+           id="defs25538">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient25540"
+             xlink:href="#linearGradient3253"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient25542">
+            <stop
+               id="stop25544"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25546"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25548">
+            <stop
+               id="stop25550"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25552"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25554">
+            <stop
+               id="stop25556"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop25558"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop25560"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop25562"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop25564"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25566">
+            <stop
+               id="stop25568"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25570"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="23.756607"
+             cy="60.078049"
+             r="21.026033"
+             fx="23.756607"
+             fy="60.078049"
+             id="radialGradient25572"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+          <linearGradient
+             x1="31.82851"
+             y1="61.778381"
+             x2="33.198818"
+             y2="6.859036"
+             id="linearGradient25574"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+          <radialGradient
+             cx="92.478806"
+             cy="20.827066"
+             r="45.889046"
+             fx="92.478806"
+             fy="20.827066"
+             id="radialGradient25576"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient25578"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+          <linearGradient
+             x1="108.49871"
+             y1="17.573528"
+             x2="185.22578"
+             y2="24.330959"
+             id="linearGradient25580"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+          <linearGradient
+             x1="28.814428"
+             y1="-1.616316"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient25582"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.764292,1.3084)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient25584"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <linearGradient
+             x1="30.382267"
+             y1="7.5329666"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient25586"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+          <linearGradient
+             x1="25.954844"
+             y1="25.071495"
+             x2="39.781502"
+             y2="27.315489"
+             id="linearGradient25588"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103231)" />
+          <linearGradient
+             x1="31.82851"
+             y1="61.778381"
+             x2="33.198818"
+             y2="6.859036"
+             id="linearGradient25590"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+          <radialGradient
+             cx="24.825565"
+             cy="176.56438"
+             r="42.859913"
+             fx="40.974991"
+             fy="162.11137"
+             id="radialGradient25592"
+             xlink:href="#linearGradient1806"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="591.27606"
+             y1="330.16998"
+             x2="620.33301"
+             y2="382.54678"
+             id="linearGradient25594"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.044357,0.957527)" />
+          <linearGradient
+             x1="566.74347"
+             y1="415.15009"
+             x2="588.13922"
+             y2="458.04449"
+             id="linearGradient25596"
+             xlink:href="#linearGradient4215"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.03551,0.965707)" />
+          <defs
+             id="defs25598">
+            <linearGradient
+               x1="0.25179857"
+               y1="-0.0390625"
+               x2="0.53237408"
+               y2="0.5234375"
+               id="linearGradient25600"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="0.092198581"
+               y1="-0.2109375"
+               x2="0.4822695"
+               y2="0.4921875"
+               id="linearGradient25602"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="0.016528925"
+               y1="-0.4921875"
+               x2="0.51239669"
+               y2="0.5"
+               id="linearGradient25604"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="0.05511811"
+               y1="-0.3046875"
+               x2="0.53543305"
+               y2="0.5625"
+               id="linearGradient25606"
+               xlink:href="#linearGradient4215" />
+            <linearGradient
+               x1="1.2125034"
+               y1="0.78833276"
+               x2="0.5859077"
+               y2="0.44490069"
+               id="linearGradient25608"
+               xlink:href="#linearGradient4215"
+               gradientTransform="scale(0.999075,1.000926)" />
+            <linearGradient
+               id="linearGradient25610">
+              <stop
+                 id="stop25612"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop25614"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="1.1610887"
+               y1="0.61942029"
+               x2="0.47761098"
+               y2="0.3214713"
+               id="linearGradient25616"
+               xlink:href="#linearGradient4215"
+               gradientTransform="scale(1.003618,0.996395)" />
+            <linearGradient
+               x1="1.8455285"
+               y1="1.34375"
+               x2="0.47967479"
+               y2="0.5625"
+               id="linearGradient25618"
+               xlink:href="#linearGradient4021" />
+            <linearGradient
+               id="linearGradient25620">
+              <stop
+                 id="stop25622"
+                 style="stop-color:#000000;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop25624"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="1.7519705"
+               y1="1.0528145"
+               x2="0.54093099"
+               y2="0.37158158"
+               id="linearGradient25626"
+               xlink:href="#linearGradient4021"
+               gradientTransform="scale(0.990884,1.0092)" />
+            <linearGradient
+               x1="0.24528302"
+               y1="1.6015625"
+               x2="0.28301886"
+               y2="-0.0234375"
+               id="linearGradient25628"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.89719623"
+               y1="-0.1484375"
+               x2="0.40186915"
+               y2="0.5546875"
+               id="linearGradient25630"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.90588236"
+               y1="-0.2734375"
+               x2="0.36470589"
+               y2="0.5078125"
+               id="linearGradient25632"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.56809336"
+               y1="-0.125"
+               x2="0.49027237"
+               y2="0.59375"
+               id="linearGradient25634"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="1.4128441"
+               y1="1.25"
+               x2="0.42201835"
+               y2="0.4140625"
+               id="linearGradient25636"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.084848486"
+               y1="1.1640625"
+               x2="0.53333336"
+               y2="0.359375"
+               id="linearGradient25638"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.76190478"
+               y1="-0.53125"
+               x2="0.6857143"
+               y2="0.5390625"
+               id="linearGradient25640"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               id="linearGradient25642">
+              <stop
+                 id="stop25644"
+                 style="stop-color:#ffffff;stop-opacity:0.83615822"
+                 offset="0" />
+              <stop
+                 id="stop25646"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="2.2054794"
+               y1="2.03125"
+               x2="0.56164384"
+               y2="-0.28125"
+               id="linearGradient25648"
+               xlink:href="#linearGradient4823" />
+            <linearGradient
+               x1="0.88832486"
+               y1="1.0390625"
+               x2="0.55837566"
+               y2="0.3046875"
+               id="linearGradient25650"
+               xlink:href="#linearGradient1806" />
+            <linearGradient
+               x1="0.85217392"
+               y1="0.9609375"
+               x2="0.86086959"
+               y2="0.296875"
+               id="linearGradient25652"
+               xlink:href="#linearGradient1806" />
+            <linearGradient
+               x1="0.064220183"
+               y1="1.4375"
+               x2="0.22018349"
+               y2="0.3125"
+               id="linearGradient25654"
+               xlink:href="#linearGradient3970" />
+            <linearGradient
+               id="linearGradient25656">
+              <stop
+                 id="stop25658"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop25660"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="1.1011236"
+               y1="0.7421875"
+               x2="0.033707865"
+               y2="0.5703125"
+               id="linearGradient25662"
+               xlink:href="#linearGradient3970" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient25664"
+               xlink:href="#linearGradient4550"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <radialGradient
+               cx="0.49032259"
+               cy="0.50649351"
+               r="0.38170236"
+               fx="0.63414633"
+               fy="0.37777779"
+               id="radialGradient25666"
+               xlink:href="#linearGradient1806" />
+          </defs>
+        </defs>
+        <radialGradient
+           cx="24.825565"
+           cy="176.56438"
+           r="42.859913"
+           fx="40.974991"
+           fy="162.11137"
+           id="radialGradient25676"
+           xlink:href="#linearGradient1806"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="693.25439"
+           y1="697.24719"
+           x2="657.74762"
+           y2="677.27399"
+           id="linearGradient25678"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.983783,1.016484)" />
+        <linearGradient
+           x1="681.34058"
+           y1="728.7738"
+           x2="641.37305"
+           y2="705.9129"
+           id="linearGradient25680"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.986777,1.0134)" />
+        <linearGradient
+           x1="649.57269"
+           y1="677.24323"
+           x2="630.47528"
+           y2="668.91809"
+           id="linearGradient25682"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988806,1.011321)" />
+        <linearGradient
+           x1="647.99902"
+           y1="693.73279"
+           x2="629.89734"
+           y2="683.8114"
+           id="linearGradient48409"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.975718,1.024886)" />
+        <linearGradient
+           x1="538.89514"
+           y1="277.2775"
+           x2="575.11407"
+           y2="342.66919"
+           id="linearGradient25685"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.998206,1.001797)" />
+        <linearGradient
+           x1="509.06769"
+           y1="327.76361"
+           x2="544.86011"
+           y2="399.38104"
+           id="linearGradient25687"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.972249,1.028543)" />
+        <linearGradient
+           x1="591.27606"
+           y1="330.16998"
+           x2="620.33301"
+           y2="382.54678"
+           id="linearGradient25689"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.044357,0.957527)" />
+        <linearGradient
+           x1="566.74347"
+           y1="415.15009"
+           x2="588.13922"
+           y2="458.04449"
+           id="linearGradient25691"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.03551,0.965707)" />
+      </defs>
+      <defs
+         id="defs25695">
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient25697"
+           xlink:href="#linearGradient2629"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           id="linearGradient25699">
+          <stop
+             id="stop25701"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25703"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25705">
+          <stop
+             id="stop25707"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25709"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25711">
+          <stop
+             id="stop25713"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop25715"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop25717"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop25719"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop25721"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25723">
+          <stop
+             id="stop25725"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25727"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="28.814428"
+           y1="-1.616316"
+           x2="47.366039"
+           y2="22.769617"
+           id="linearGradient25729"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.764292,1.3084)" />
+        <linearGradient
+           x1="30.722504"
+           y1="28.135216"
+           x2="39.78149"
+           y2="27.315481"
+           id="linearGradient25731"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103232)" />
+        <linearGradient
+           x1="30.382267"
+           y1="7.5329666"
+           x2="47.366039"
+           y2="22.769617"
+           id="linearGradient25733"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+        <linearGradient
+           x1="25.954844"
+           y1="25.071495"
+           x2="39.781502"
+           y2="27.315489"
+           id="linearGradient25735"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103231)" />
+        <defs
+           id="defs25737">
+          <linearGradient
+             id="linearGradient25739">
+            <stop
+               id="stop25741"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25743"
+               style="stop-color:#fafbff;stop-opacity:1"
+               offset="0.25" />
+            <stop
+               id="stop25745"
+               style="stop-color:#f0f2fa;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop25747"
+               style="stop-color:#e1e1e1;stop-opacity:1"
+               offset="0.75" />
+            <stop
+               id="stop25749"
+               style="stop-color:#f5f6ff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25751">
+            <stop
+               id="stop25753"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25755"
+               style="stop-color:#d0d1d9;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop25757"
+               style="stop-color:#878b9b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25759">
+            <stop
+               id="stop25761"
+               style="stop-color:#e8e8e8;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25763"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient25765"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient25767"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <defs
+             id="defs25769">
+            <linearGradient
+               id="linearGradient25771">
+              <stop
+                 id="stop25773"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop25775"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient25777">
+              <stop
+                 id="stop25779"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop25781"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop25783"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop25785"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop25787"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient25789">
+              <stop
+                 id="stop25791"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop25793"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient25795"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient25797"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient25799"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient25801"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient25803"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs25805">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient25807"
+                 xlink:href="#linearGradient3296"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+            </defs>
+          </defs>
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient25817"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        </defs>
+      </defs>
+      <radialGradient
+         cx="41.875938"
+         cy="37.865574"
+         r="12.562782"
+         fx="46.384533"
+         fy="37.080399"
+         id="radialGradient25386"
+         xlink:href="#linearGradient1918"
+         gradientUnits="userSpaceOnUse" />
+      <defs
+         id="defs25826">
+        <linearGradient
+           id="linearGradient25828">
+          <stop
+             id="stop25830"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25832"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25834">
+          <stop
+             id="stop25836"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25838"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25840">
+          <stop
+             id="stop25842"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop25844"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop25846"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop25848"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop25850"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25852">
+          <stop
+             id="stop25854"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25856"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <radialGradient
+           cx="23.756607"
+           cy="60.078049"
+           r="21.026033"
+           fx="23.756607"
+           fy="60.078049"
+           id="radialGradient25858"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+        <linearGradient
+           x1="31.82851"
+           y1="61.778381"
+           x2="33.198818"
+           y2="6.859036"
+           id="linearGradient25860"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+        <radialGradient
+           cx="92.478806"
+           cy="20.827066"
+           r="45.889046"
+           fx="92.478806"
+           fy="20.827066"
+           id="radialGradient25862"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+        <linearGradient
+           x1="133.07144"
+           y1="28.231943"
+           x2="118.58411"
+           y2="13.431207"
+           id="linearGradient25864"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+        <linearGradient
+           x1="108.49871"
+           y1="17.573528"
+           x2="185.22578"
+           y2="24.330959"
+           id="linearGradient25866"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+        <linearGradient
+           x1="28.814428"
+           y1="-1.616316"
+           x2="47.366039"
+           y2="22.769617"
+           id="linearGradient25868"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.764292,1.3084)" />
+        <linearGradient
+           x1="30.722504"
+           y1="28.135216"
+           x2="39.78149"
+           y2="27.315481"
+           id="linearGradient25870"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103232)" />
+        <linearGradient
+           x1="30.382267"
+           y1="7.5329666"
+           x2="47.366039"
+           y2="22.769617"
+           id="linearGradient25872"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+        <linearGradient
+           x1="25.954844"
+           y1="25.071495"
+           x2="39.781502"
+           y2="27.315489"
+           id="linearGradient25874"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103231)" />
+        <radialGradient
+           cx="23.756607"
+           cy="60.078049"
+           r="21.026033"
+           fx="23.756607"
+           fy="60.078049"
+           id="radialGradient25876"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+        <linearGradient
+           x1="31.82851"
+           y1="61.778381"
+           x2="33.198818"
+           y2="6.859036"
+           id="linearGradient25878"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+        <linearGradient
+           x1="36.826332"
+           y1="75.332558"
+           x2="25.761681"
+           y2="135.90358"
+           id="linearGradient25880"
+           xlink:href="#linearGradient2877"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+        <linearGradient
+           x1="78.675774"
+           y1="47.411823"
+           x2="64.05336"
+           y2="34.302757"
+           id="linearGradient25882"
+           xlink:href="#linearGradient4281"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+        <radialGradient
+           cx="92.478806"
+           cy="20.827066"
+           r="45.889046"
+           fx="92.478806"
+           fy="20.827066"
+           id="radialGradient25884"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+        <linearGradient
+           x1="133.07144"
+           y1="28.231943"
+           x2="118.58411"
+           y2="13.431207"
+           id="linearGradient25886"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+        <linearGradient
+           x1="108.49871"
+           y1="17.573528"
+           x2="185.22578"
+           y2="24.330959"
+           id="linearGradient25888"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+        <defs
+           id="defs25890">
+          <linearGradient
+             id="linearGradient25892">
+            <stop
+               id="stop25894"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25896"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25898">
+            <stop
+               id="stop25900"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop25902"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop25904"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop25906"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop25908"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25910">
+            <stop
+               id="stop25912"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25914"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="23.756607"
+             cy="60.078049"
+             r="21.026033"
+             fx="23.756607"
+             fy="60.078049"
+             id="radialGradient25916"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.006281,0.993758)" />
+          <linearGradient
+             x1="31.82851"
+             y1="61.778381"
+             x2="33.198818"
+             y2="6.859036"
+             id="linearGradient25918"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.750054,0,0,1.072718,1.04579,2.663333)" />
+          <radialGradient
+             cx="92.478806"
+             cy="20.827066"
+             r="45.889046"
+             fx="92.478806"
+             fy="20.827066"
+             id="radialGradient25920"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.506767,1.973294)" />
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient25922"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+          <linearGradient
+             x1="108.49871"
+             y1="17.573528"
+             x2="185.22578"
+             y2="24.330959"
+             id="linearGradient25924"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+          <linearGradient
+             x1="28.814428"
+             y1="-1.616316"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient25926"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.764292,1.3084)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient25439"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <linearGradient
+             x1="30.382267"
+             y1="7.5329666"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient25930"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+          <linearGradient
+             x1="25.954844"
+             y1="25.071495"
+             x2="39.781502"
+             y2="27.315489"
+             id="linearGradient25932"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103231)" />
+          <radialGradient
+             cx="4.9853168"
+             cy="108.47158"
+             r="34.222183"
+             fx="5.2520976"
+             fy="108.73115"
+             id="radialGradient25934"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="36.826332"
+             y1="75.332558"
+             x2="25.761681"
+             y2="135.90358"
+             id="linearGradient25936"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+          <linearGradient
+             x1="78.675774"
+             y1="47.411823"
+             x2="64.05336"
+             y2="34.302757"
+             id="linearGradient25938"
+             xlink:href="#linearGradient4281"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+          <defs
+             id="defs25940">
+            <linearGradient
+               id="linearGradient25942">
+              <stop
+                 id="stop25944"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop25946"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop25948"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+          </defs>
+        </defs>
+        <linearGradient
+           x1="36.826332"
+           y1="75.332558"
+           x2="25.761681"
+           y2="135.90358"
+           id="linearGradient25958"
+           xlink:href="#linearGradient2877"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+        <linearGradient
+           x1="78.675774"
+           y1="47.411823"
+           x2="64.05336"
+           y2="34.302757"
+           id="linearGradient25960"
+           xlink:href="#linearGradient4281"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(4.745269,-0.536764,1.618211,25.61588,-691.1427,-704.5108)" />
+        <linearGradient
+           x1="-191.46153"
+           y1="37.372372"
+           x2="-165.58835"
+           y2="37.372372"
+           id="linearGradient25962"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient48553"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient25462"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <linearGradient
+           x1="88.712402"
+           y1="138.15012"
+           x2="104.81104"
+           y2="151.63045"
+           id="linearGradient48556"
+           xlink:href="#linearGradient3305"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        <radialGradient
+           cx="-77.367622"
+           cy="42.633839"
+           r="216.26619"
+           fx="-80.036034"
+           fy="44.468376"
+           id="radialGradient25967"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+        <linearGradient
+           x1="80.23925"
+           y1="81.05584"
+           x2="18.903805"
+           y2="13.944632"
+           id="linearGradient25969"
+           xlink:href="#linearGradient8157"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.88267,1.132926)" />
+        <linearGradient
+           x1="-19.039936"
+           y1="52.71389"
+           x2="15.223759"
+           y2="111.3392"
+           id="linearGradient25467"
+           xlink:href="#linearGradient3579"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.269095,-0.13167,8.088146e-2,0.779571,0,0)" />
+        <linearGradient
+           x1="71.088333"
+           y1="-6.6212053"
+           x2="97.343185"
+           y2="37.16391"
+           id="linearGradient25972"
+           xlink:href="#linearGradient3579"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.60451,-6.271869e-2,0.1698,1.636615,0,0)" />
+        <linearGradient
+           x1="95.224609"
+           y1="4.4250841"
+           x2="156.67999"
+           y2="20.792826"
+           id="linearGradient25974"
+           xlink:href="#linearGradient3579"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.583097,1.71498)" />
+        <defs
+           id="defs25976">
+          <linearGradient
+             id="linearGradient25978">
+            <stop
+               id="stop25980"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25982"
+               style="stop-color:#fafbff;stop-opacity:1"
+               offset="0.25" />
+            <stop
+               id="stop25984"
+               style="stop-color:#f0f2fa;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop25986"
+               style="stop-color:#e1e1e1;stop-opacity:1"
+               offset="0.75" />
+            <stop
+               id="stop25988"
+               style="stop-color:#f5f6ff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25990">
+            <stop
+               id="stop25992"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25994"
+               style="stop-color:#d0d1d9;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop25996"
+               style="stop-color:#878b9b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25998">
+            <stop
+               id="stop26000"
+               style="stop-color:#e8e8e8;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26002"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient26004"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient26006"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <defs
+             id="defs26008">
+            <linearGradient
+               id="linearGradient26010">
+              <stop
+                 id="stop26012"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop26014"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient26016">
+              <stop
+                 id="stop26018"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop26020"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop26022"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop26024"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop26026"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient26028">
+              <stop
+                 id="stop26030"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop26032"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient26034"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient26036"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient26038"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient26040"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient26042"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs26044">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient26046"
+                 xlink:href="#linearGradient3296"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+            </defs>
+          </defs>
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient26056"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        </defs>
+        <linearGradient
+           x1="36.826332"
+           y1="75.332558"
+           x2="25.761681"
+           y2="135.90358"
+           id="linearGradient26062"
+           xlink:href="#linearGradient2877"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(10.2395,-1.158248,0.749923,11.8711,-691.1427,-704.5108)" />
+        <linearGradient
+           x1="45.023643"
+           y1="20.534979"
+           x2="181.64224"
+           y2="116.28294"
+           id="linearGradient25519"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.961706,1.039819)" />
+        <radialGradient
+           cx="42.007256"
+           cy="39.007645"
+           r="9.8527927"
+           fx="37.805073"
+           fy="39.239628"
+           id="radialGradient48608"
+           xlink:href="#linearGradient1806"
+           gradientUnits="userSpaceOnUse" />
+        <radialGradient
+           cx="41.875938"
+           cy="37.865574"
+           r="12.562782"
+           fx="34.828526"
+           fy="31.584183"
+           id="radialGradient25522"
+           xlink:href="#linearGradient1918"
+           gradientUnits="userSpaceOnUse" />
+        <radialGradient
+           cx="41.875938"
+           cy="37.865574"
+           r="12.562782"
+           fx="46.384533"
+           fy="37.080399"
+           id="radialGradient26067"
+           xlink:href="#linearGradient1918"
+           gradientUnits="userSpaceOnUse" />
+        <radialGradient
+           cx="58.3755"
+           cy="22.775043"
+           r="10.998282"
+           fx="53.432022"
+           fy="22.164028"
+           id="radialGradient26069"
+           xlink:href="#linearGradient1954"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="23.770393"
+           y1="95.243881"
+           x2="53.66283"
+           y2="128.85732"
+           id="linearGradient26071"
+           xlink:href="#linearGradient1990"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988302,1.011837)" />
+        <linearGradient
+           x1="81.211525"
+           y1="116.07082"
+           x2="5.4840093"
+           y2="70.989281"
+           id="linearGradient26073"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988302,1.011837)" />
+        <linearGradient
+           x1="104.84399"
+           y1="321.39783"
+           x2="28.429239"
+           y2="277.92343"
+           id="linearGradient26076"
+           xlink:href="#linearGradient1918"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.946639,1.056369)" />
+        <linearGradient
+           x1="78.753586"
+           y1="397.89075"
+           x2="26.172459"
+           y2="351.19708"
+           id="linearGradient26078"
+           xlink:href="#linearGradient1908"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.184518,0.844225)" />
+        <linearGradient
+           x1="17.133598"
+           y1="12.402272"
+           x2="26.262699"
+           y2="12.402272"
+           id="linearGradient26080"
+           xlink:href="#linearGradient1918"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.598611,0.625543)" />
+        <linearGradient
+           x1="49.627895"
+           y1="396.80029"
+           x2="68.691986"
+           y2="424.20239"
+           id="linearGradient26082"
+           xlink:href="#linearGradient1954"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.233739,0.810545)" />
+        <linearGradient
+           x1="76.440941"
+           y1="246.53215"
+           x2="99.764214"
+           y2="262.3847"
+           id="linearGradient26084"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.789568,1.266516)" />
+        <linearGradient
+           x1="101.15012"
+           y1="378.20697"
+           x2="83.709572"
+           y2="352.44403"
+           id="linearGradient26086"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.168503,0.855796)" />
+        <linearGradient
+           x1="48.353672"
+           y1="99.757843"
+           x2="51.658588"
+           y2="103.12432"
+           id="linearGradient26088"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.917519,1.089896)" />
+        <linearGradient
+           x1="23.057707"
+           y1="411.51218"
+           x2="21.61964"
+           y2="422.44498"
+           id="linearGradient26090"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.088969,0.9183)" />
+        <linearGradient
+           x1="41.803413"
+           y1="372.34344"
+           x2="34.710552"
+           y2="376.63461"
+           id="linearGradient26092"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.967013,1.034112)" />
+        <linearGradient
+           x1="27.254147"
+           y1="436.18506"
+           x2="21.609068"
+           y2="441.86893"
+           id="linearGradient26094"
+           xlink:href="#linearGradient1990"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.121334,0.891795)" />
+        <defs
+           id="defs26096">
+          <linearGradient
+             id="linearGradient26098">
+            <stop
+               id="stop26100"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop26102"
+               style="stop-color:#000000;stop-opacity:0.11299435"
+               offset="0.5" />
+            <stop
+               id="stop26104"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26106">
+            <stop
+               id="stop26108"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26110"
+               style="stop-color:#ffffff;stop-opacity:0.07843138"
+               offset="0.60111111" />
+            <stop
+               id="stop26112"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26114">
+            <stop
+               id="stop26116"
+               style="stop-color:#ffffff;stop-opacity:0.78431374"
+               offset="0" />
+            <stop
+               id="stop26118"
+               style="stop-color:#990000;stop-opacity:0"
+               offset="0.81" />
+            <stop
+               id="stop26120"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26122">
+            <stop
+               id="stop26124"
+               style="stop-color:#000000;stop-opacity:0.40677965"
+               offset="0" />
+            <stop
+               id="stop26126"
+               style="stop-color:#000000;stop-opacity:0.07344633"
+               offset="0.6477778" />
+            <stop
+               id="stop26128"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26130">
+            <stop
+               id="stop48644"
+               style="stop-color:#000000;stop-opacity:0.31638417"
+               offset="0" />
+            <stop
+               id="stop26133"
+               style="stop-color:#000000;stop-opacity:0.07909604"
+               offset="0.5" />
+            <stop
+               id="stop26135"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26137">
+            <stop
+               id="stop26139"
+               style="stop-color:#884631;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26141"
+               style="stop-color:#df421e;stop-opacity:1"
+               offset="0.625" />
+            <stop
+               id="stop26143"
+               style="stop-color:#efa08e;stop-opacity:1"
+               offset="0.8125" />
+            <stop
+               id="stop26145"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0.75690609"
+             y1="0.546875"
+             x2="-0.62430942"
+             y2="-0.6796875"
+             id="linearGradient26167"
+             xlink:href="#linearGradient1908" />
+          <linearGradient
+             x1="-9.8228717e-17"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient26169"
+             xlink:href="#linearGradient1918" />
+          <linearGradient
+             x1="0.42424244"
+             y1="0.375"
+             x2="-0.61818182"
+             y2="-0.625"
+             id="linearGradient26171"
+             xlink:href="#linearGradient1908" />
+          <linearGradient
+             x1="0.72649574"
+             y1="0.7734375"
+             x2="-0.49565217"
+             y2="0.078125"
+             id="linearGradient26173"
+             xlink:href="#linearGradient1918" />
+          <linearGradient
+             x1="0.85123968"
+             y1="0.2734375"
+             x2="0.43801653"
+             y2="0.5234375"
+             id="linearGradient26175"
+             xlink:href="#linearGradient1982" />
+          <linearGradient
+             x1="0.22047244"
+             y1="0.09375"
+             x2="0.81102359"
+             y2="0.7578125"
+             id="linearGradient26177"
+             xlink:href="#linearGradient1990" />
+          <radialGradient
+             cx="0.5"
+             cy="0.5"
+             r="0.5"
+             fx="0.21951219"
+             fy="0.25"
+             id="radialGradient26179"
+             xlink:href="#linearGradient1918" />
+          <radialGradient
+             cx="0.5"
+             cy="0.5"
+             r="0.5"
+             fx="0.67944252"
+             fy="0.46875"
+             id="radialGradient26181"
+             xlink:href="#linearGradient1918" />
+          <radialGradient
+             cx="0.84898806"
+             cy="0.41226101"
+             r="0.42322907"
+             fx="0.56333953"
+             fy="0.18582444"
+             id="radialGradient26183"
+             xlink:href="#linearGradient1918" />
+          <radialGradient
+             cx="0.5"
+             cy="0.5"
+             r="0.5"
+             fx="0.27526131"
+             fy="0.47222221"
+             id="radialGradient26185"
+             xlink:href="#linearGradient1954" />
+          <radialGradient
+             cx="0.50522649"
+             cy="0.54545456"
+             r="0.39214215"
+             fx="0.33797911"
+             fy="0.5546875"
+             id="radialGradient26191"
+             xlink:href="#linearGradient1806" />
+          <linearGradient
+             x1="-0.0051282053"
+             y1="-0.0703125"
+             x2="0.90256411"
+             y2="1.234375"
+             id="linearGradient26193"
+             xlink:href="#linearGradient1954" />
+          <linearGradient
+             x1="-8.569534e-16"
+             y1="0.25"
+             x2="0.66666669"
+             y2="0.703125"
+             id="linearGradient26195"
+             xlink:href="#linearGradient1982" />
+          <linearGradient
+             x1="1.2118226"
+             y1="1.2734375"
+             x2="0.34975371"
+             y2="1.1275703e-16"
+             id="linearGradient26197"
+             xlink:href="#linearGradient1982" />
+          <linearGradient
+             x1="0.50331128"
+             y1="0.25"
+             x2="0.4437086"
+             y2="0.703125"
+             id="linearGradient26199"
+             xlink:href="#linearGradient1982" />
+          <linearGradient
+             x1="0.3539823"
+             y1="0.484375"
+             x2="0.46902654"
+             y2="0.6015625"
+             id="linearGradient26201"
+             xlink:href="#linearGradient1982" />
+          <linearGradient
+             x1="0.50279331"
+             y1="0.40625"
+             x2="0.22346368"
+             y2="0.6875"
+             id="linearGradient26203"
+             xlink:href="#linearGradient1990" />
+          <linearGradient
+             x1="-0.24369748"
+             y1="0.03125"
+             x2="1.9411764"
+             y2="1.5625"
+             id="linearGradient26205"
+             xlink:href="#linearGradient1982" />
+          <linearGradient
+             x1="1.3779528"
+             y1="0.7109375"
+             x2="-0.11811024"
+             y2="-0.1796875"
+             id="linearGradient26207"
+             xlink:href="#linearGradient1982" />
+        </defs>
+        <linearGradient
+           x1="45.023643"
+           y1="20.534979"
+           x2="181.64224"
+           y2="116.28294"
+           id="linearGradient26213"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.961706,1.039819)" />
+        <radialGradient
+           cx="42.007256"
+           cy="39.007645"
+           r="9.8527927"
+           fx="37.805073"
+           fy="39.239628"
+           id="radialGradient26215"
+           xlink:href="#linearGradient1806"
+           gradientUnits="userSpaceOnUse" />
+        <radialGradient
+           cx="41.875938"
+           cy="37.865574"
+           r="12.562782"
+           fx="34.828526"
+           fy="31.584183"
+           id="radialGradient26217"
+           xlink:href="#linearGradient1918"
+           gradientUnits="userSpaceOnUse" />
+        <radialGradient
+           cx="41.875938"
+           cy="37.865574"
+           r="12.562782"
+           fx="46.384533"
+           fy="37.080399"
+           id="radialGradient26219"
+           xlink:href="#linearGradient1918"
+           gradientUnits="userSpaceOnUse" />
+        <radialGradient
+           cx="58.3755"
+           cy="22.775043"
+           r="10.998282"
+           fx="53.432022"
+           fy="22.164028"
+           id="radialGradient26221"
+           xlink:href="#linearGradient1954"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="23.770393"
+           y1="95.243881"
+           x2="53.66283"
+           y2="128.85732"
+           id="linearGradient26223"
+           xlink:href="#linearGradient1990"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988302,1.011837)" />
+        <linearGradient
+           x1="81.211525"
+           y1="116.07082"
+           x2="5.4840093"
+           y2="70.989281"
+           id="linearGradient26225"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988302,1.011837)" />
+        <linearGradient
+           x1="68.265488"
+           y1="370.90509"
+           x2="28.057238"
+           y2="332.33322"
+           id="linearGradient26227"
+           xlink:href="#linearGradient1908"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.133936,0.881884)" />
+        <linearGradient
+           x1="104.84399"
+           y1="321.39783"
+           x2="28.429239"
+           y2="277.92343"
+           id="linearGradient26229"
+           xlink:href="#linearGradient1918"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.946639,1.056369)" />
+        <linearGradient
+           x1="78.753586"
+           y1="397.89075"
+           x2="26.172459"
+           y2="351.19708"
+           id="linearGradient26231"
+           xlink:href="#linearGradient1908"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.184518,0.844225)" />
+        <linearGradient
+           x1="17.133598"
+           y1="12.402272"
+           x2="26.262699"
+           y2="12.402272"
+           id="linearGradient26233"
+           xlink:href="#linearGradient1918"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.598611,0.625543)" />
+        <linearGradient
+           x1="49.627895"
+           y1="396.80029"
+           x2="68.691986"
+           y2="424.20239"
+           id="linearGradient26235"
+           xlink:href="#linearGradient1954"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.233739,0.810545)" />
+        <linearGradient
+           x1="76.440941"
+           y1="246.53215"
+           x2="99.764214"
+           y2="262.3847"
+           id="linearGradient26237"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.789568,1.266516)" />
+        <linearGradient
+           x1="101.15012"
+           y1="378.20697"
+           x2="83.709572"
+           y2="352.44403"
+           id="linearGradient26239"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.168503,0.855796)" />
+        <linearGradient
+           x1="48.353672"
+           y1="99.757843"
+           x2="51.658588"
+           y2="103.12432"
+           id="linearGradient26241"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.917519,1.089896)" />
+        <linearGradient
+           x1="23.057707"
+           y1="411.51218"
+           x2="21.61964"
+           y2="422.44498"
+           id="linearGradient26243"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.088969,0.9183)" />
+        <linearGradient
+           x1="41.803413"
+           y1="372.34344"
+           x2="34.710552"
+           y2="376.63461"
+           id="linearGradient26245"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.967013,1.034112)" />
+        <linearGradient
+           x1="27.254147"
+           y1="436.18506"
+           x2="21.609068"
+           y2="441.86893"
+           id="linearGradient26247"
+           xlink:href="#linearGradient1990"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.121334,0.891795)" />
+        <linearGradient
+           x1="45.023643"
+           y1="20.534979"
+           x2="181.64224"
+           y2="116.28294"
+           id="linearGradient26249"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.961706,1.039819)" />
+        <radialGradient
+           cx="42.007256"
+           cy="39.007645"
+           r="9.8527927"
+           fx="37.805073"
+           fy="39.239628"
+           id="radialGradient26251"
+           xlink:href="#linearGradient1806"
+           gradientUnits="userSpaceOnUse" />
+        <radialGradient
+           cx="41.875938"
+           cy="37.865574"
+           r="12.562782"
+           fx="34.828526"
+           fy="31.584183"
+           id="radialGradient26253"
+           xlink:href="#linearGradient1918"
+           gradientUnits="userSpaceOnUse" />
+        <radialGradient
+           cx="41.875938"
+           cy="37.865574"
+           r="12.562782"
+           fx="46.384533"
+           fy="37.080399"
+           id="radialGradient26255"
+           xlink:href="#linearGradient1918"
+           gradientUnits="userSpaceOnUse" />
+        <radialGradient
+           cx="58.3755"
+           cy="22.775043"
+           r="10.998282"
+           fx="53.432022"
+           fy="22.164028"
+           id="radialGradient26257"
+           xlink:href="#linearGradient1954"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="23.770393"
+           y1="95.243881"
+           x2="53.66283"
+           y2="128.85732"
+           id="linearGradient26259"
+           xlink:href="#linearGradient1990"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988302,1.011837)" />
+        <linearGradient
+           x1="81.211525"
+           y1="116.07082"
+           x2="5.4840093"
+           y2="70.989281"
+           id="linearGradient26261"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988302,1.011837)" />
+        <linearGradient
+           x1="68.265488"
+           y1="370.90509"
+           x2="28.057238"
+           y2="332.33322"
+           id="linearGradient26263"
+           xlink:href="#linearGradient1908"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.133936,0.881884)" />
+        <linearGradient
+           x1="104.84399"
+           y1="321.39783"
+           x2="28.429239"
+           y2="277.92343"
+           id="linearGradient26265"
+           xlink:href="#linearGradient1918"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.946639,1.056369)" />
+        <linearGradient
+           x1="78.753586"
+           y1="397.89075"
+           x2="26.172459"
+           y2="351.19708"
+           id="linearGradient26267"
+           xlink:href="#linearGradient1908"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.184518,0.844225)" />
+        <linearGradient
+           x1="17.133598"
+           y1="12.402272"
+           x2="26.262699"
+           y2="12.402272"
+           id="linearGradient26269"
+           xlink:href="#linearGradient1918"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.598611,0.625543)" />
+        <linearGradient
+           x1="49.627895"
+           y1="396.80029"
+           x2="68.691986"
+           y2="424.20239"
+           id="linearGradient26271"
+           xlink:href="#linearGradient1954"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.233739,0.810545)" />
+        <linearGradient
+           x1="76.440941"
+           y1="246.53215"
+           x2="99.764214"
+           y2="262.3847"
+           id="linearGradient26273"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.789568,1.266516)" />
+        <linearGradient
+           x1="101.15012"
+           y1="378.20697"
+           x2="83.709572"
+           y2="352.44403"
+           id="linearGradient26275"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.168503,0.855796)" />
+        <linearGradient
+           x1="48.353672"
+           y1="99.757843"
+           x2="51.658588"
+           y2="103.12432"
+           id="linearGradient26277"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.917519,1.089896)" />
+        <linearGradient
+           x1="23.057707"
+           y1="411.51218"
+           x2="21.61964"
+           y2="422.44498"
+           id="linearGradient26279"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.088969,0.9183)" />
+        <linearGradient
+           x1="41.803413"
+           y1="372.34344"
+           x2="34.710552"
+           y2="376.63461"
+           id="linearGradient26281"
+           xlink:href="#linearGradient1982"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.967013,1.034112)" />
+        <linearGradient
+           x1="27.254147"
+           y1="436.18506"
+           x2="21.609068"
+           y2="441.86893"
+           id="linearGradient26283"
+           xlink:href="#linearGradient1990"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.121334,0.891795)" />
+      </defs>
+      <linearGradient
+         x1="179.83598"
+         y1="178.66379"
+         x2="200.25706"
+         y2="302.00961"
+         id="linearGradient25641"
+         xlink:href="#linearGradient1502"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.030776,0.970143)" />
+      <linearGradient
+         x1="178.64995"
+         y1="179.87529"
+         x2="198.41254"
+         y2="299.24384"
+         id="linearGradient25643"
+         xlink:href="#linearGradient1502"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.034428,0.966718)" />
+      <linearGradient
+         x1="181.35893"
+         y1="177.20132"
+         x2="202.65994"
+         y2="305.862"
+         id="linearGradient25645"
+         xlink:href="#linearGradient1502"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.026679,0.974015)" />
+      <linearGradient
+         x1="182.83167"
+         y1="175.80452"
+         x2="205.01575"
+         y2="309.7991"
+         id="linearGradient25647"
+         xlink:href="#linearGradient1502"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.022962,0.977554)" />
+      <linearGradient
+         x1="177.86378"
+         y1="181.4277"
+         x2="197.19272"
+         y2="298.17694"
+         id="linearGradient25649"
+         xlink:href="#linearGradient1502"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.036891,0.964422)" />
+      <linearGradient
+         x1="55.601124"
+         y1="-30.810305"
+         x2="40.876816"
+         y2="218.58856"
+         id="linearGradient25651"
+         xlink:href="#linearGradient1454"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.082134,0.9241)" />
+      <linearGradient
+         x1="64.116882"
+         y1="47.803505"
+         x2="37.547989"
+         y2="140.37704"
+         id="linearGradient25653"
+         xlink:href="#linearGradient1546"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.329487,0.75217)" />
+      <linearGradient
+         x1="83.123482"
+         y1="92.632271"
+         x2="77.120087"
+         y2="56.941833"
+         id="linearGradient25655"
+         xlink:href="#linearGradient1494"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.162115,0.8605)" />
+      <linearGradient
+         x1="48.88829"
+         y1="90.157753"
+         x2="99.629562"
+         y2="86.570915"
+         id="linearGradient25657"
+         xlink:href="#linearGradient1461"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.162115,0.8605)" />
+      <linearGradient
+         x1="57.724483"
+         y1="184.34286"
+         x2="55.957409"
+         y2="144.17274"
+         id="linearGradient25659"
+         xlink:href="#linearGradient1502"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.636328,0.611124)" />
+      <linearGradient
+         x1="55.045113"
+         y1="85.877014"
+         x2="109.27901"
+         y2="88.11335"
+         id="linearGradient25661"
+         xlink:href="#linearGradient1461"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.162536,0.860189)" />
+      <linearGradient
+         x1="66.679367"
+         y1="28.158081"
+         x2="66.679367"
+         y2="107.53253"
+         id="linearGradient25663"
+         xlink:href="#linearGradient1494"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.1618,0.860733)" />
+      <linearGradient
+         x1="47.242912"
+         y1="77.450203"
+         x2="109.62949"
+         y2="76.102692"
+         id="linearGradient25665"
+         xlink:href="#linearGradient1461"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.1618,0.860733)" />
+      <linearGradient
+         x1="71.901497"
+         y1="69.209007"
+         x2="85.293274"
+         y2="102.17883"
+         id="linearGradient25667"
+         xlink:href="#linearGradient1494"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.179599,0.847746)" />
+      <linearGradient
+         x1="55.239422"
+         y1="97.356407"
+         x2="25.40143"
+         y2="29.790384"
+         id="linearGradient25669"
+         xlink:href="#linearGradient1461"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.942585,1.060912)" />
+      <linearGradient
+         x1="53.647789"
+         y1="101.89593"
+         x2="53.647789"
+         y2="160.91232"
+         id="linearGradient25671"
+         xlink:href="#linearGradient1494"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.289244,0.775649)" />
+      <linearGradient
+         x1="69.363586"
+         y1="56.763401"
+         x2="71.684402"
+         y2="101.294"
+         id="linearGradient25673"
+         xlink:href="#linearGradient1494"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.20398,0.830579)" />
+      <linearGradient
+         x1="28.813946"
+         y1="221.79578"
+         x2="10.582993"
+         y2="235.65099"
+         id="linearGradient25675"
+         xlink:href="#linearGradient1551"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.709409,0.584998)" />
+      <radialGradient
+         cx="24.825565"
+         cy="176.56438"
+         r="42.859913"
+         fx="40.974991"
+         fy="162.11137"
+         id="radialGradient25677"
+         xlink:href="#linearGradient4545"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="693.25439"
+         y1="697.24719"
+         x2="657.74762"
+         y2="677.27399"
+         id="linearGradient25679"
+         xlink:href="#linearGradient4021"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.983783,1.016484)" />
+      <linearGradient
+         x1="681.34058"
+         y1="728.7738"
+         x2="641.37305"
+         y2="705.9129"
+         id="linearGradient25681"
+         xlink:href="#linearGradient4021"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.986777,1.0134)" />
+      <linearGradient
+         x1="649.57269"
+         y1="677.24323"
+         x2="630.47528"
+         y2="668.91809"
+         id="linearGradient25683"
+         xlink:href="#linearGradient4215"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.988806,1.011321)" />
+      <linearGradient
+         x1="612.97107"
+         y1="685.40314"
+         x2="641.86005"
+         y2="685.40314"
+         id="linearGradient25686"
+         xlink:href="#linearGradient1749"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.975718,1.024886)" />
+      <linearGradient
+         x1="538.89514"
+         y1="277.2775"
+         x2="575.11407"
+         y2="342.66919"
+         id="linearGradient25688"
+         xlink:href="#linearGradient4215"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.998206,1.001797)" />
+      <linearGradient
+         x1="509.06769"
+         y1="327.76361"
+         x2="544.86011"
+         y2="399.38104"
+         id="linearGradient25690"
+         xlink:href="#linearGradient4215"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.972249,1.028543)" />
+      <linearGradient
+         x1="591.27606"
+         y1="330.16998"
+         x2="620.33301"
+         y2="382.54678"
+         id="linearGradient25692"
+         xlink:href="#linearGradient4215"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.044357,0.957527)" />
+      <linearGradient
+         x1="566.74347"
+         y1="415.15009"
+         x2="588.13922"
+         y2="458.04449"
+         id="linearGradient25694"
+         xlink:href="#linearGradient4215"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.03551,0.965707)" />
+      <defs
+         id="defs25696">
+        <linearGradient
+           id="linearGradient25698">
+          <stop
+             id="stop25700"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25702"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25704">
+          <stop
+             id="stop25706"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25708"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25710">
+          <stop
+             id="stop25712"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop25714"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop25716"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop25718"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop25720"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient25722">
+          <stop
+             id="stop25724"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop25726"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="30.722504"
+           y1="28.135216"
+           x2="39.78149"
+           y2="27.315481"
+           id="linearGradient25728"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103232)" />
+        <defs
+           id="defs25730">
+          <linearGradient
+             id="linearGradient25732">
+            <stop
+               id="stop25734"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25736"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient25738">
+            <stop
+               id="stop25740"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop25742"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop25744"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop25746"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop25748"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="392.28751"
+             y1="233.2583"
+             x2="403.24197"
+             y2="233.2583"
+             id="linearGradient25750"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.9128709,1.0954451)">
+            <stop
+               id="stop25752"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25754"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="23.756607"
+             cy="60.078049"
+             r="21.026033"
+             fx="23.756607"
+             fy="60.078049"
+             id="radialGradient25756"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.006281,0.993758)" />
+          <radialGradient
+             cx="92.478806"
+             cy="20.827066"
+             r="45.889046"
+             fx="92.478806"
+             fy="20.827066"
+             id="radialGradient25760"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.506767,1.973294)" />
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient25762"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+          <linearGradient
+             x1="108.49871"
+             y1="17.573528"
+             x2="185.22578"
+             y2="24.330959"
+             id="linearGradient25764"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+          <linearGradient
+             x1="28.814428"
+             y1="-1.616316"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient25766"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.764292,1.3084)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient25768"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <linearGradient
+             x1="30.382267"
+             y1="7.5329666"
+             x2="47.366039"
+             y2="22.769617"
+             id="linearGradient25770"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+          <linearGradient
+             x1="25.954844"
+             y1="25.071495"
+             x2="39.781502"
+             y2="27.315489"
+             id="linearGradient25772"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103231)" />
+          <radialGradient
+             cx="4.9853168"
+             cy="108.47158"
+             r="34.222183"
+             fx="5.2520976"
+             fy="108.73115"
+             id="radialGradient25774"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="36.826332"
+             y1="75.332558"
+             x2="25.761681"
+             y2="135.90358"
+             id="linearGradient25776"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+          <linearGradient
+             x1="78.675774"
+             y1="47.411823"
+             x2="64.05336"
+             y2="34.302757"
+             id="linearGradient25778"
+             xlink:href="#linearGradient4281"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+          <defs
+             id="defs25780">
+            <linearGradient
+               id="linearGradient25782">
+              <stop
+                 id="stop25784"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop25786"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop25788"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+          </defs>
+        </defs>
+        <defs
+           id="defs25800">
+          <linearGradient
+             id="linearGradient25802">
+            <stop
+               id="stop25804"
+               style="stop-color:#826647;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25806"
+               style="stop-color:#575147;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0.36627907"
+             y1="0.8125"
+             x2="0.36627907"
+             y2="0.1796875"
+             id="linearGradient25808"
+             xlink:href="#linearGradient1136"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="-0.109375"
+             y1="0.9140625"
+             x2="1.15625"
+             y2="0.1796875"
+             id="linearGradient25810"
+             xlink:href="#linearGradient1136" />
+        </defs>
+        <radialGradient
+           cx="24.825565"
+           cy="176.56438"
+           r="42.859913"
+           fx="40.974991"
+           fy="162.11137"
+           id="radialGradient25814"
+           xlink:href="#linearGradient1806"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="693.25439"
+           y1="697.24719"
+           x2="657.74762"
+           y2="677.27399"
+           id="linearGradient25816"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.983783,1.016484)" />
+        <linearGradient
+           x1="681.34058"
+           y1="728.7738"
+           x2="641.37305"
+           y2="705.9129"
+           id="linearGradient25818"
+           xlink:href="#linearGradient4021"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.986777,1.0134)" />
+        <linearGradient
+           x1="649.57269"
+           y1="677.24323"
+           x2="630.47528"
+           y2="668.91809"
+           id="linearGradient25820"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.988806,1.011321)" />
+        <linearGradient
+           x1="647.99902"
+           y1="693.73279"
+           x2="629.89734"
+           y2="683.8114"
+           id="linearGradient25822"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.975718,1.024886)" />
+        <linearGradient
+           x1="538.89514"
+           y1="277.2775"
+           x2="575.11407"
+           y2="342.66919"
+           id="linearGradient25824"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.998206,1.001797)" />
+        <linearGradient
+           x1="509.06769"
+           y1="327.76361"
+           x2="544.86011"
+           y2="399.38104"
+           id="linearGradient25826"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.972249,1.028543)" />
+        <linearGradient
+           x1="591.27606"
+           y1="330.16998"
+           x2="620.33301"
+           y2="382.54678"
+           id="linearGradient25829"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.044357,0.957527)" />
+        <linearGradient
+           x1="566.74347"
+           y1="415.15009"
+           x2="588.13922"
+           y2="458.04449"
+           id="linearGradient25831"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.03551,0.965707)" />
+        <defs
+           id="defs25833">
+          <linearGradient
+             x1="0.25179857"
+             y1="-0.0390625"
+             x2="0.53237408"
+             y2="0.5234375"
+             id="linearGradient25835"
+             xlink:href="#linearGradient4215" />
+          <linearGradient
+             x1="0.092198581"
+             y1="-0.2109375"
+             x2="0.4822695"
+             y2="0.4921875"
+             id="linearGradient25837"
+             xlink:href="#linearGradient4215" />
+          <linearGradient
+             x1="0.016528925"
+             y1="-0.4921875"
+             x2="0.51239669"
+             y2="0.5"
+             id="linearGradient25839"
+             xlink:href="#linearGradient4215" />
+          <linearGradient
+             x1="0.05511811"
+             y1="-0.3046875"
+             x2="0.53543305"
+             y2="0.5625"
+             id="linearGradient25841"
+             xlink:href="#linearGradient4215" />
+          <linearGradient
+             x1="1.2125034"
+             y1="0.78833276"
+             x2="0.5859077"
+             y2="0.44490069"
+             id="linearGradient25843"
+             xlink:href="#linearGradient4215"
+             gradientTransform="scale(0.999075,1.000926)" />
+          <linearGradient
+             id="linearGradient25845">
+            <stop
+               id="stop25847"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25849"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="1.1610887"
+             y1="0.61942029"
+             x2="0.47761098"
+             y2="0.3214713"
+             id="linearGradient25851"
+             xlink:href="#linearGradient4215"
+             gradientTransform="scale(1.003618,0.996395)" />
+          <linearGradient
+             x1="1.8455285"
+             y1="1.34375"
+             x2="0.47967479"
+             y2="0.5625"
+             id="linearGradient25853"
+             xlink:href="#linearGradient4021" />
+          <linearGradient
+             id="linearGradient25855">
+            <stop
+               id="stop25857"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25859"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="1.7519705"
+             y1="1.0528145"
+             x2="0.54093099"
+             y2="0.37158158"
+             id="linearGradient25861"
+             xlink:href="#linearGradient4021"
+             gradientTransform="scale(0.990884,1.0092)" />
+          <linearGradient
+             x1="0.24528302"
+             y1="1.6015625"
+             x2="0.28301886"
+             y2="-0.0234375"
+             id="linearGradient25863"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.89719623"
+             y1="-0.1484375"
+             x2="0.40186915"
+             y2="0.5546875"
+             id="linearGradient25865"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.90588236"
+             y1="-0.2734375"
+             x2="0.36470589"
+             y2="0.5078125"
+             id="linearGradient25867"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.56809336"
+             y1="-0.125"
+             x2="0.49027237"
+             y2="0.59375"
+             id="linearGradient25869"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="1.4128441"
+             y1="1.25"
+             x2="0.42201835"
+             y2="0.4140625"
+             id="linearGradient25871"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.084848486"
+             y1="1.1640625"
+             x2="0.53333336"
+             y2="0.359375"
+             id="linearGradient25873"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.76190478"
+             y1="-0.53125"
+             x2="0.6857143"
+             y2="0.5390625"
+             id="linearGradient25875"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             id="linearGradient25877">
+            <stop
+               id="stop25879"
+               style="stop-color:#ffffff;stop-opacity:0.83615822"
+               offset="0" />
+            <stop
+               id="stop25881"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="2.2054794"
+             y1="2.03125"
+             x2="0.56164384"
+             y2="-0.28125"
+             id="linearGradient25883"
+             xlink:href="#linearGradient4823" />
+          <linearGradient
+             x1="0.88832486"
+             y1="1.0390625"
+             x2="0.55837566"
+             y2="0.3046875"
+             id="linearGradient25885"
+             xlink:href="#linearGradient1806" />
+          <linearGradient
+             x1="0.85217392"
+             y1="0.9609375"
+             x2="0.86086959"
+             y2="0.296875"
+             id="linearGradient25887"
+             xlink:href="#linearGradient1806" />
+          <linearGradient
+             x1="0.064220183"
+             y1="1.4375"
+             x2="0.22018349"
+             y2="0.3125"
+             id="linearGradient25889"
+             xlink:href="#linearGradient3970" />
+          <linearGradient
+             id="linearGradient25891">
+            <stop
+               id="stop25893"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop25895"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="1.1011236"
+             y1="0.7421875"
+             x2="0.033707865"
+             y2="0.5703125"
+             id="linearGradient25897"
+             xlink:href="#linearGradient3970" />
+          <linearGradient
+             id="linearGradient25899">
+            <stop
+               id="stop25901"
+               style="stop-color:#000000;stop-opacity:0.2937853"
+               offset="0" />
+            <stop
+               id="stop25903"
+               style="stop-color:#000000;stop-opacity:0.06214689"
+               offset="0.6477778" />
+            <stop
+               id="stop25905"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <radialGradient
+             cx="0.49032259"
+             cy="0.50649351"
+             r="0.38170236"
+             fx="0.63414633"
+             fy="0.37777779"
+             id="radialGradient25907"
+             xlink:href="#linearGradient1806" />
+        </defs>
+        <linearGradient
+           x1="647.99902"
+           y1="693.73279"
+           x2="629.89734"
+           y2="683.8114"
+           id="linearGradient25913"
+           xlink:href="#linearGradient4215"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.975718,1.024886)" />
+      </defs>
+      <radialGradient
+         cx="24.825565"
+         cy="176.56438"
+         r="42.859913"
+         fx="40.974991"
+         fy="162.11137"
+         id="radialGradient25921"
+         xlink:href="#linearGradient4545"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="693.25439"
+         y1="697.24719"
+         x2="657.74762"
+         y2="677.27399"
+         id="linearGradient48862"
+         xlink:href="#linearGradient4021"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.983783,1.016484)" />
+      <linearGradient
+         x1="681.34058"
+         y1="728.7738"
+         x2="641.37305"
+         y2="705.9129"
+         id="linearGradient25925"
+         xlink:href="#linearGradient4021"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.986777,1.0134)" />
+      <linearGradient
+         x1="649.57269"
+         y1="677.24323"
+         x2="630.47528"
+         y2="668.91809"
+         id="linearGradient25927"
+         xlink:href="#linearGradient4215"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.988806,1.011321)" />
+      <linearGradient
+         x1="612.97107"
+         y1="685.40314"
+         x2="641.86005"
+         y2="685.40314"
+         id="linearGradient25929"
+         xlink:href="#linearGradient1749"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.975718,1.024886)" />
+      <linearGradient
+         x1="538.89514"
+         y1="277.2775"
+         x2="575.11407"
+         y2="342.66919"
+         id="linearGradient25931"
+         xlink:href="#linearGradient4215"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.998206,1.001797)" />
+      <linearGradient
+         x1="509.06769"
+         y1="327.76361"
+         x2="544.86011"
+         y2="399.38104"
+         id="linearGradient25933"
+         xlink:href="#linearGradient4215"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.972249,1.028543)" />
+      <linearGradient
+         x1="591.27606"
+         y1="330.16998"
+         x2="620.33301"
+         y2="382.54678"
+         id="linearGradient25935"
+         xlink:href="#linearGradient4215"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.044357,0.957527)" />
+      <linearGradient
+         x1="566.74347"
+         y1="415.15009"
+         x2="588.13922"
+         y2="458.04449"
+         id="linearGradient25937"
+         xlink:href="#linearGradient4215"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.03551,0.965707)" />
+      <linearGradient
+         x1="179.83598"
+         y1="178.66379"
+         x2="200.25706"
+         y2="302.00961"
+         id="linearGradient25939"
+         xlink:href="#linearGradient1502"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.030776,0.970143)" />
+      <linearGradient
+         x1="178.64995"
+         y1="179.87529"
+         x2="198.41254"
+         y2="299.24384"
+         id="linearGradient25941"
+         xlink:href="#linearGradient1502"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.034428,0.966718)" />
+      <linearGradient
+         x1="181.35893"
+         y1="177.20132"
+         x2="202.65994"
+         y2="305.862"
+         id="linearGradient25943"
+         xlink:href="#linearGradient1502"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.026679,0.974015)" />
+      <linearGradient
+         x1="182.83167"
+         y1="175.80452"
+         x2="205.01575"
+         y2="309.7991"
+         id="linearGradient25945"
+         xlink:href="#linearGradient1502"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.022962,0.977554)" />
+      <linearGradient
+         x1="177.86378"
+         y1="181.4277"
+         x2="197.19272"
+         y2="298.17694"
+         id="linearGradient3668"
+         xlink:href="#linearGradient1502"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.036891,0.964422)" />
+      <linearGradient
+         x1="55.601124"
+         y1="-30.810305"
+         x2="40.876816"
+         y2="218.58856"
+         id="linearGradient25948"
+         xlink:href="#linearGradient1454"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.082134,0.9241)" />
+      <linearGradient
+         x1="64.116882"
+         y1="47.803505"
+         x2="37.547989"
+         y2="140.37704"
+         id="linearGradient3670"
+         xlink:href="#linearGradient1546"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.329487,0.75217)" />
+      <linearGradient
+         x1="83.123482"
+         y1="92.632271"
+         x2="77.120087"
+         y2="56.941833"
+         id="linearGradient25951"
+         xlink:href="#linearGradient1494"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.162115,0.8605)" />
+      <linearGradient
+         x1="48.88829"
+         y1="90.157753"
+         x2="99.629562"
+         y2="86.570915"
+         id="linearGradient3672"
+         xlink:href="#linearGradient1461"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.162115,0.8605)" />
+      <linearGradient
+         x1="57.724483"
+         y1="184.34286"
+         x2="55.957409"
+         y2="144.17274"
+         id="linearGradient25954"
+         xlink:href="#linearGradient1502"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.636328,0.611124)" />
+      <linearGradient
+         x1="55.045113"
+         y1="85.877014"
+         x2="109.27901"
+         y2="88.11335"
+         id="linearGradient25956"
+         xlink:href="#linearGradient1461"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.162536,0.860189)" />
+      <linearGradient
+         x1="66.679367"
+         y1="28.158081"
+         x2="66.679367"
+         y2="107.53253"
+         id="linearGradient25959"
+         xlink:href="#linearGradient1494"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.1618,0.860733)" />
+      <linearGradient
+         x1="47.242912"
+         y1="77.450203"
+         x2="109.62949"
+         y2="76.102692"
+         id="linearGradient25961"
+         xlink:href="#linearGradient1461"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.1618,0.860733)" />
+      <linearGradient
+         x1="71.901497"
+         y1="69.209007"
+         x2="85.293274"
+         y2="102.17883"
+         id="linearGradient25963"
+         xlink:href="#linearGradient1494"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.179599,0.847746)" />
+      <linearGradient
+         x1="55.239422"
+         y1="97.356407"
+         x2="25.40143"
+         y2="29.790384"
+         id="linearGradient25965"
+         xlink:href="#linearGradient1461"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.942585,1.060912)" />
+      <linearGradient
+         x1="53.647789"
+         y1="101.89593"
+         x2="53.647789"
+         y2="160.91232"
+         id="linearGradient25967"
+         xlink:href="#linearGradient1494"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.289244,0.775649)" />
+      <linearGradient
+         x1="69.363586"
+         y1="56.763401"
+         x2="71.684402"
+         y2="101.294"
+         id="linearGradient25970"
+         xlink:href="#linearGradient1494"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.20398,0.830579)" />
+      <linearGradient
+         x1="28.813946"
+         y1="221.79578"
+         x2="10.582993"
+         y2="235.65099"
+         id="linearGradient26450"
+         xlink:href="#linearGradient1551"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.709409,0.584998)" />
+      <radialGradient
+         cx="24.825565"
+         cy="176.56438"
+         r="42.859913"
+         fx="40.974991"
+         fy="162.11137"
+         id="radialGradient25973"
+         xlink:href="#linearGradient4545"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="693.25439"
+         y1="697.24719"
+         x2="657.74762"
+         y2="677.27399"
+         id="linearGradient25975"
+         xlink:href="#linearGradient4021"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.983783,1.016484)" />
+      <linearGradient
+         x1="681.34058"
+         y1="728.7738"
+         x2="641.37305"
+         y2="705.9129"
+         id="linearGradient25977"
+         xlink:href="#linearGradient4021"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.986777,1.0134)" />
+      <linearGradient
+         x1="649.57269"
+         y1="677.24323"
+         x2="630.47528"
+         y2="668.91809"
+         id="linearGradient3685"
+         xlink:href="#linearGradient3256"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.988806,1.011321)" />
+      <linearGradient
+         x1="612.97107"
+         y1="685.40314"
+         x2="641.86005"
+         y2="685.40314"
+         id="linearGradient25980"
+         xlink:href="#linearGradient2629"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.975718,1.024886)"
+         spreadMethod="pad" />
+      <linearGradient
+         x1="538.89514"
+         y1="277.2775"
+         x2="575.11407"
+         y2="342.66919"
+         id="linearGradient3687"
+         xlink:href="#linearGradient3256"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.998206,1.001797)" />
+      <linearGradient
+         x1="509.06769"
+         y1="327.76361"
+         x2="544.86011"
+         y2="399.38104"
+         id="linearGradient25983"
+         xlink:href="#linearGradient3256"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.972249,1.028543)" />
+      <linearGradient
+         x1="591.27606"
+         y1="330.16998"
+         x2="620.33301"
+         y2="382.54678"
+         id="linearGradient3689"
+         xlink:href="#linearGradient3256"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.044357,0.957527)" />
+      <linearGradient
+         x1="566.74347"
+         y1="415.15009"
+         x2="588.13922"
+         y2="458.04449"
+         id="linearGradient25986"
+         xlink:href="#linearGradient3256"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.03551,0.965707)" />
+      <linearGradient
+         x1="27.172323"
+         y1="135.45018"
+         x2="51.170948"
+         y2="159.60898"
+         id="linearGradient25988"
+         xlink:href="#linearGradient3057"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.56826,0,0,0.43693,60.1476,67.44818)"
+         spreadMethod="pad" />
+      <defs
+         id="defs26462">
+        <linearGradient
+           id="linearGradient26464">
+          <stop
+             id="stop26466"
+             style="stop-color:#e28700;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop26468"
+             style="stop-color:#ffdbaf;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient26470">
+          <stop
+             id="stop26472"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="0" />
+          <stop
+             id="stop26474"
+             style="stop-color:#ffffff;stop-opacity:0.01568628"
+             offset="0.25315788" />
+          <stop
+             id="stop26476"
+             style="stop-color:#ffffff;stop-opacity:0.69999999"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient26478">
+          <stop
+             id="stop25999"
+             style="stop-color:#000000;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop26481"
+             style="stop-color:#000000;stop-opacity:0.76612902"
+             offset="0.87947369" />
+          <stop
+             id="stop26483"
+             style="stop-color:#000000;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient26485">
+          <stop
+             id="stop26487"
+             style="stop-color:#5ea730;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop26489"
+             style="stop-color:#8eef2c;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient26491">
+          <stop
+             id="stop26493"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop26495"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient26497">
+          <stop
+             id="stop26499"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop26501"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient26503">
+          <stop
+             id="stop26505"
+             style="stop-color:#000000;stop-opacity:0.14835165"
+             offset="0" />
+          <stop
+             id="stop26507"
+             style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+             offset="0.5" />
+          <stop
+             id="stop26509"
+             style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+             offset="0.75" />
+          <stop
+             id="stop26511"
+             style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+             offset="0.875" />
+          <stop
+             id="stop26513"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient48926">
+          <stop
+             id="stop26516"
+             style="stop-color:#b18e4b;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop26518"
+             style="stop-color:#f7dca0;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <radialGradient
+           cx="23.756607"
+           cy="60.078049"
+           r="21.026033"
+           fx="23.756607"
+           fy="60.078049"
+           id="radialGradient26520"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.097963,0,0,1.084299,-101.3931,46.02747)" />
+        <linearGradient
+           x1="31.82851"
+           y1="61.778381"
+           x2="33.198818"
+           y2="6.859036"
+           id="linearGradient48931"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.818391,0,0,1.170453,-100.2521,48.93346)" />
+        <radialGradient
+           cx="92.478806"
+           cy="20.827066"
+           r="45.889046"
+           fx="92.478806"
+           fy="20.827066"
+           id="radialGradient26523"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.552939,0,0,2.153081,-101.3931,46.02747)" />
+        <linearGradient
+           x1="133.07144"
+           y1="28.231943"
+           x2="118.58411"
+           y2="13.431207"
+           id="linearGradient48934"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+        <linearGradient
+           x1="108.49871"
+           y1="17.573528"
+           x2="185.22578"
+           y2="24.330959"
+           id="linearGradient26526"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.492395,0,0,1.945366,-100.2521,48.93346)" />
+        <linearGradient
+           x1="28.814428"
+           y1="-1.616316"
+           x2="47.366039"
+           y2="22.769617"
+           id="linearGradient48937"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.764292,1.3084)" />
+        <linearGradient
+           x1="30.722504"
+           y1="28.135216"
+           x2="39.78149"
+           y2="27.315481"
+           id="linearGradient26529"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103232)" />
+        <linearGradient
+           x1="30.382267"
+           y1="7.5329666"
+           x2="47.366039"
+           y2="22.769617"
+           id="linearGradient26531"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+        <linearGradient
+           x1="25.954844"
+           y1="25.071495"
+           x2="39.781502"
+           y2="27.315489"
+           id="linearGradient48941"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.475459,2.103231)" />
+        <linearGradient
+           x1="74.915154"
+           y1="289.24429"
+           x2="74.915154"
+           y2="143.41141"
+           id="linearGradient26534"
+           xlink:href="#linearGradient869"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.402029,0.713252)" />
+        <linearGradient
+           x1="66.81208"
+           y1="253.09772"
+           x2="66.81208"
+           y2="329.44394"
+           id="linearGradient26536"
+           xlink:href="#linearGradient883"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.599772,0.625089)" />
+        <linearGradient
+           x1="114.98484"
+           y1="133.38522"
+           x2="114.98484"
+           y2="15.619798"
+           id="linearGradient26538"
+           xlink:href="#linearGradient875"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.93614,1.068216)" />
+        <linearGradient
+           x1="76.700623"
+           y1="73.338425"
+           x2="76.700623"
+           y2="20.345196"
+           id="linearGradient26540"
+           xlink:href="#linearGradient940"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.099362,0.909619)" />
+        <defs
+           id="defs26544">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient26546"
+             xlink:href="#linearGradient2208"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient48950"
+             xlink:href="#linearGradient2220"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient26549">
+            <stop
+               id="stop26551"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop26553"
+               style="stop-color:#ffffff;stop-opacity:0.57254905"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient26555"
+             xlink:href="#linearGradient1579"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient26557">
+            <stop
+               id="stop26559"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop26561"
+               style="stop-color:#ffffff;stop-opacity:0.49193549"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient26563"
+             xlink:href="#linearGradient2204"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient48960">
+            <stop
+               id="stop26566"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop26568"
+               style="stop-color:#ffffff;stop-opacity:0.57254905"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26570">
+            <stop
+               id="stop26572"
+               style="stop-color:#dddddd;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26574"
+               style="stop-color:#f5f5f5;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0.49285713"
+             y1="0.98591548"
+             x2="0.49285713"
+             y2="7.0833374e-16"
+             id="linearGradient26576"
+             xlink:href="#linearGradient869" />
+          <linearGradient
+             x1="0.46031743"
+             y1="0.98591542"
+             x2="0.46031743"
+             y2="0.0070422594"
+             id="linearGradient26578"
+             xlink:href="#linearGradient875" />
+          <linearGradient
+             x1="0.48823529"
+             y1="1.0070423"
+             x2="0.48823529"
+             y2="-0.0070422534"
+             id="linearGradient26580"
+             xlink:href="#linearGradient940" />
+          <linearGradient
+             x1="0.49224809"
+             y1="0.0070421356"
+             x2="0.49224809"
+             y2="0.99295789"
+             id="linearGradient26582"
+             xlink:href="#linearGradient883" />
+          <radialGradient
+             cx="0.5"
+             cy="0.5"
+             r="0.5"
+             fx="0.5"
+             fy="0.5"
+             id="radialGradient26584"
+             xlink:href="#linearGradient930" />
+        </defs>
+        <linearGradient
+           x1="114.98484"
+           y1="133.38522"
+           x2="114.98484"
+           y2="15.619798"
+           id="linearGradient26588"
+           xlink:href="#linearGradient875"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.93614,1.068216)" />
+        <linearGradient
+           x1="76.700623"
+           y1="73.338425"
+           x2="76.700623"
+           y2="20.345196"
+           id="linearGradient26590"
+           xlink:href="#linearGradient940"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.099362,0.909619)" />
+        <linearGradient
+           x1="74.915154"
+           y1="289.24429"
+           x2="74.915154"
+           y2="143.41141"
+           id="linearGradient26592"
+           xlink:href="#linearGradient869"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.402029,0.713252)" />
+        <linearGradient
+           x1="66.81208"
+           y1="253.09772"
+           x2="66.81208"
+           y2="329.44394"
+           id="linearGradient26594"
+           xlink:href="#linearGradient883"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.599772,0.625089)" />
+        <linearGradient
+           x1="58.919556"
+           y1="110.96445"
+           x2="52.629063"
+           y2="161.4733"
+           id="linearGradient26596"
+           xlink:href="#linearGradient2354"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.063095,0,0,0.819358,3.271898,9.280837)" />
+      </defs>
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient26069"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="-49.171364"
+         y1="121.40791"
+         x2="-160.71114"
+         y2="-157.53516"
+         id="linearGradient26072"
+         xlink:href="#linearGradient1700"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+      <linearGradient
+         x1="88.712402"
+         y1="138.15012"
+         x2="104.81104"
+         y2="151.63045"
+         id="linearGradient26074"
+         xlink:href="#linearGradient3305"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+      <radialGradient
+         cx="-77.367622"
+         cy="42.633839"
+         r="216.26619"
+         fx="-80.036034"
+         fy="44.468376"
+         id="radialGradient26076"
+         xlink:href="#linearGradient1696"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+      <defs
+         id="defs26078">
+        <linearGradient
+           id="linearGradient26081">
+          <stop
+             id="stop26083"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop26085"
+             style="stop-color:#fafbff;stop-opacity:1"
+             offset="0.25" />
+          <stop
+             id="stop26087"
+             style="stop-color:#f0f2fa;stop-opacity:1"
+             offset="0.5" />
+          <stop
+             id="stop26089"
+             style="stop-color:#e1e1e1;stop-opacity:1"
+             offset="0.75" />
+          <stop
+             id="stop26091"
+             style="stop-color:#f5f6ff;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient26093">
+          <stop
+             id="stop26095"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop26097"
+             style="stop-color:#d0d1d9;stop-opacity:1"
+             offset="0.5" />
+          <stop
+             id="stop26099"
+             style="stop-color:#878b9b;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient26101">
+          <stop
+             id="stop26103"
+             style="stop-color:#e8e8e8;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop26105"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient26107"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <radialGradient
+           cx="-77.367622"
+           cy="42.633839"
+           r="216.26619"
+           fx="-80.036034"
+           fy="44.468376"
+           id="radialGradient26109"
+           xlink:href="#linearGradient1696"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+        <defs
+           id="defs26111">
+          <linearGradient
+             id="linearGradient26113">
+            <stop
+               id="stop26115"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26117"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26119">
+            <stop
+               id="stop26121"
+               style="stop-color:#000000;stop-opacity:0.14835165"
+               offset="0" />
+            <stop
+               id="stop26123"
+               style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+               offset="0.5" />
+            <stop
+               id="stop26125"
+               style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+               offset="0.75" />
+            <stop
+               id="stop26127"
+               style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+               offset="0.875" />
+            <stop
+               id="stop26129"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26131">
+            <stop
+               id="stop26134"
+               style="stop-color:#b18e4b;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26136"
+               style="stop-color:#f7dca0;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient26138"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+          <linearGradient
+             x1="30.722504"
+             y1="28.135216"
+             x2="39.78149"
+             y2="27.315481"
+             id="linearGradient26140"
+             xlink:href="#linearGradient2354"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.475459,2.103232)" />
+          <radialGradient
+             cx="4.9853168"
+             cy="108.47158"
+             r="34.222183"
+             fx="5.2520976"
+             fy="108.73115"
+             id="radialGradient26142"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+             spreadMethod="pad" />
+          <linearGradient
+             x1="36.826332"
+             y1="75.332558"
+             x2="25.761681"
+             y2="135.90358"
+             id="linearGradient26144"
+             xlink:href="#linearGradient2877"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+          <linearGradient
+             x1="78.675774"
+             y1="47.411823"
+             x2="64.05336"
+             y2="34.302757"
+             id="linearGradient26146"
+             xlink:href="#linearGradient4281"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+          <defs
+             id="defs26148">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient26150"
+               xlink:href="#linearGradient3296"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+          </defs>
+        </defs>
+        <linearGradient
+           x1="88.712402"
+           y1="138.15012"
+           x2="104.81104"
+           y2="151.63045"
+           id="linearGradient26162"
+           xlink:href="#linearGradient3305"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+      </defs>
+      <linearGradient
+         x1="52.683483"
+         y1="104.09244"
+         x2="58.380398"
+         y2="252.54866"
+         id="linearGradient4412"
+         xlink:href="#linearGradient2678"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.334689,0,0,1.038479,-0.72121,-66.60727)" />
+      <linearGradient
+         x1="52.19524"
+         y1="64.818008"
+         x2="52.19524"
+         y2="122.69208"
+         id="linearGradient26172"
+         xlink:href="#linearGradient2483"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.111523,0,0,0.771568,-0.72121,-29.98157)" />
+      <linearGradient
+         x1="29.958502"
+         y1="-23.328955"
+         x2="29.958502"
+         y2="190.05157"
+         id="linearGradient26174"
+         xlink:href="#linearGradient2678"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.127153,0,0,0.781382,0.981463,-27.99057)" />
+      <linearGradient
+         x1="96.41098"
+         y1="57.341877"
+         x2="81.065781"
+         y2="196.048"
+         id="linearGradient26176"
+         xlink:href="#linearGradient2871"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(1.176531,0,0,0.821515,0,4.496065)" />
+      <linearGradient
+         x1="483.2298"
+         y1="97.833481"
+         x2="562.21454"
+         y2="1064.5424"
+         id="linearGradient26178"
+         xlink:href="#linearGradient1531"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(1.502271,0.665659)" />
+      <linearGradient
+         x1="314.50467"
+         y1="2690.406"
+         x2="384.80078"
+         y2="2690.406"
+         id="linearGradient26180"
+         xlink:href="#linearGradient3540"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(4.209444,0.237561)" />
+      <radialGradient
+         cx="41.875938"
+         cy="37.865574"
+         r="12.562782"
+         fx="42.023739"
+         fy="37.865574"
+         id="radialGradient26182"
+         xlink:href="#linearGradient4066"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="11276.761"
+         y1="5908"
+         x2="-10290.378"
+         y2="8376.0635"
+         id="linearGradient26184"
+         xlink:href="#linearGradient3296"
+         gradientUnits="userSpaceOnUse" />
+      <linearGradient
+         x1="11701.849"
+         y1="13028.776"
+         x2="15175.786"
+         y2="9521.5176"
+         id="linearGradient26186"
+         xlink:href="#linearGradient3916"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(5.464784e-3,0,0,5.325523e-3,191.6882,44.23734)" />
+      <linearGradient
+         x1="251.82268"
+         y1="115.52762"
+         x2="296.51724"
+         y2="115.52762"
+         id="linearGradient26188"
+         xlink:href="#linearGradient3636"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="scale(0.986883,1.013292)" />
+      <linearGradient
+         x1="-161.57674"
+         y1="253.95526"
+         x2="-116.53033"
+         y2="311.73874"
+         id="linearGradient26190"
+         xlink:href="#linearGradient4063"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-0.846674,0.343014,0.288328,0.736755,18.9977,-80.1446)" />
+      <linearGradient
+         x1="42.53046"
+         y1="133.41551"
+         x2="53.520744"
+         y2="163.73753"
+         id="linearGradient26192"
+         xlink:href="#linearGradient4063"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(-1.790967,0.310143,0.182364,0.974268,282.562,-80.82299)" />
+      <linearGradient
+         x1="248.30553"
+         y1="198.48206"
+         x2="257.16309"
+         y2="148.14442"
+         id="linearGradient26194"
+         xlink:href="#linearGradient3913"
+         gradientUnits="userSpaceOnUse"
+         gradientTransform="matrix(0.842789,0,0,0.800919,18.7268,-73.96861)" />
+      <defs
+         id="defs26660">
+        <linearGradient
+           x1="0"
+           y1="0.5"
+           x2="1"
+           y2="0.5"
+           id="linearGradient26662"
+           xlink:href="#linearGradient6942"
+           gradientUnits="objectBoundingBox"
+           spreadMethod="pad" />
+        <linearGradient
+           id="linearGradient26664">
+          <stop
+             id="stop26666"
+             style="stop-color:#ffffff;stop-opacity:0.74901962"
+             offset="0" />
+          <stop
+             id="stop26668"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient26670">
+          <stop
+             id="stop26672"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop26674"
+             style="stop-color:#ffffff;stop-opacity:0.35164836"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient26676">
+          <stop
+             id="stop26678"
+             style="stop-color:#ffffff;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop26680"
+             style="stop-color:#ffffff;stop-opacity:0"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           id="linearGradient26682">
+          <stop
+             id="stop26684"
+             style="stop-color:#7e818c;stop-opacity:1"
+             offset="0" />
+          <stop
+             id="stop26686"
+             style="stop-color:#d5dbed;stop-opacity:1"
+             offset="1" />
+        </linearGradient>
+        <linearGradient
+           x1="84.960785"
+           y1="92.151367"
+           x2="42.64373"
+           y2="53.360722"
+           id="linearGradient2859"
+           xlink:href="#linearGradient1749"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.321949,0.756459)" />
+        <linearGradient
+           x1="31.82851"
+           y1="61.778381"
+           x2="33.198818"
+           y2="6.859036"
+           id="linearGradient2860"
+           xlink:href="#linearGradient2678"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+        <linearGradient
+           x1="186.07457"
+           y1="23.533224"
+           x2="202.6377"
+           y2="23.47304"
+           id="linearGradient2861"
+           xlink:href="#linearGradient2689"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.388045,2.57702)" />
+        <linearGradient
+           x1="92.631454"
+           y1="54.989693"
+           x2="92.631454"
+           y2="50.608093"
+           id="linearGradient2862"
+           xlink:href="#linearGradient1757"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.787838,1.269296)" />
+        <linearGradient
+           x1="133.07144"
+           y1="28.231943"
+           x2="118.58411"
+           y2="13.431207"
+           id="linearGradient2863"
+           xlink:href="#linearGradient2678"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+        <linearGradient
+           x1="1270.3132"
+           y1="4.8765283"
+           x2="1247.6848"
+           y2="0.72310239"
+           id="linearGradient2864"
+           xlink:href="#linearGradient2678"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(9.440723e-2,10.59241)" />
+        <linearGradient
+           x1="1270.3132"
+           y1="4.8765283"
+           x2="1247.6848"
+           y2="0.72310239"
+           id="linearGradient2865"
+           xlink:href="#linearGradient2678"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+        <linearGradient
+           x1="-191.46153"
+           y1="37.372372"
+           x2="-165.58835"
+           y2="37.372372"
+           id="linearGradient26695"
+           xlink:href="#linearGradient2678"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient26697"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <linearGradient
+           x1="-49.171364"
+           y1="121.40791"
+           x2="-160.71114"
+           y2="-157.53516"
+           id="linearGradient26699"
+           xlink:href="#linearGradient1700"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+        <linearGradient
+           x1="88.712402"
+           y1="138.15012"
+           x2="104.81104"
+           y2="151.63045"
+           id="linearGradient26701"
+           xlink:href="#linearGradient3305"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+        <radialGradient
+           cx="-77.367622"
+           cy="42.633839"
+           r="216.26619"
+           fx="-80.036034"
+           fy="44.468376"
+           id="radialGradient26703"
+           xlink:href="#linearGradient2678"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+        <linearGradient
+           x1="100.76616"
+           y1="77.379333"
+           x2="125.25793"
+           y2="77.379333"
+           id="linearGradient26705"
+           xlink:href="#linearGradient1926"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+        <linearGradient
+           x1="104.09006"
+           y1="83.359146"
+           x2="123.82494"
+           y2="70.956947"
+           id="linearGradient26707"
+           xlink:href="#linearGradient1926"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+        <linearGradient
+           x1="100.76616"
+           y1="77.379333"
+           x2="125.25793"
+           y2="77.379333"
+           id="linearGradient26709"
+           xlink:href="#linearGradient1926"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+        <linearGradient
+           x1="10.145814"
+           y1="21.762129"
+           x2="19.678274"
+           y2="15.811033"
+           id="linearGradient26711"
+           xlink:href="#linearGradient1930"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+        <linearGradient
+           x1="226.35037"
+           y1="198.74835"
+           x2="174.43694"
+           y2="217.6319"
+           id="linearGradient26713"
+           xlink:href="#linearGradient1926"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.959874,1.041804)" />
+        <linearGradient
+           x1="-94.151642"
+           y1="379.97745"
+           x2="-100.4097"
+           y2="374.03232"
+           id="linearGradient26715"
+           xlink:href="#linearGradient1870"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.088448,0.91874)" />
+        <linearGradient
+           x1="97.345161"
+           y1="112.84396"
+           x2="99.20697"
+           y2="115.81121"
+           id="linearGradient26717"
+           xlink:href="#linearGradient2560"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.206907,0.828564)"
+           spreadMethod="reflect" />
+        <linearGradient
+           x1="-13.15085"
+           y1="250.48668"
+           x2="-5.590662"
+           y2="258.31036"
+           id="linearGradient26719"
+           xlink:href="#linearGradient2560"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+        <linearGradient
+           x1="240.97612"
+           y1="200.61511"
+           x2="231.89941"
+           y2="205.45764"
+           id="linearGradient26721"
+           xlink:href="#linearGradient1884"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.866855,1.153596)" />
+        <linearGradient
+           x1="7.1050277"
+           y1="221.98289"
+           x2="46.488174"
+           y2="259.94464"
+           id="linearGradient26723"
+           xlink:href="#linearGradient1884"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+        <linearGradient
+           x1="7.1050277"
+           y1="221.98289"
+           x2="46.488174"
+           y2="259.94464"
+           id="linearGradient26725"
+           xlink:href="#linearGradient1884"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+        <defs
+           id="defs26727">
+          <linearGradient
+             id="linearGradient26729">
+            <stop
+               id="stop26731"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26733"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26735">
+            <stop
+               id="stop26737"
+               style="stop-color:#c86f32;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26739"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26741">
+            <stop
+               id="stop26743"
+               style="stop-color:#d88721;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26745"
+               style="stop-color:#a85c00;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop26747"
+               style="stop-color:#643e0e;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26749">
+            <stop
+               id="stop26751"
+               style="stop-color:#868686;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26753"
+               style="stop-color:#e2e2e2;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26755">
+            <stop
+               id="stop26757"
+               style="stop-color:#ff9870;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26759"
+               style="stop-color:#ffd8c9;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26761">
+            <stop
+               id="stop26763"
+               style="stop-color:#ffd7c0;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26765"
+               style="stop-color:#ffbc96;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26767">
+            <stop
+               id="stop26769"
+               style="stop-color:#ffbc96;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26771"
+               style="stop-color:#ffeafe;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26773">
+            <stop
+               id="stop26775"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26777"
+               style="stop-color:#fafbff;stop-opacity:1"
+               offset="0.25" />
+            <stop
+               id="stop26779"
+               style="stop-color:#f0f2fa;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop26781"
+               style="stop-color:#e1e1e1;stop-opacity:1"
+               offset="0.75" />
+            <stop
+               id="stop26783"
+               style="stop-color:#f5f6ff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26785">
+            <stop
+               id="stop26787"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26789"
+               style="stop-color:#d0d1d9;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop26791"
+               style="stop-color:#878b9b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26793">
+            <stop
+               id="stop26795"
+               style="stop-color:#e8e8e8;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26797"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient26799"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient26801"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <defs
+             id="defs26803">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient26805"
+               xlink:href="#linearGradient1884"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient26807">
+              <stop
+                 id="stop26809"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop26811"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop26813"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop26815"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop26817"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient26819">
+              <stop
+                 id="stop26821"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop26823"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient26825"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient26827"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient26829"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient26831"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient26833"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs26835">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient26837"
+                 xlink:href="#linearGradient3296"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+            </defs>
+          </defs>
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient26847"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          <defs
+             id="defs26849">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient26851"
+               xlink:href="#linearGradient1863"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient26853"
+               xlink:href="#linearGradient2560"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient26855"
+               xlink:href="#linearGradient1926"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient26857"
+               xlink:href="#linearGradient1302"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="96.346039"
+               y1="84.428337"
+               x2="121.44556"
+               y2="65.093857"
+               id="linearGradient26859"
+               xlink:href="#linearGradient1716"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.962035,0,0,1.039463,0.899729,-0.17995)" />
+            <linearGradient
+               x1="104.09006"
+               y1="83.359146"
+               x2="123.82494"
+               y2="70.956947"
+               id="linearGradient26861"
+               xlink:href="#linearGradient1724"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.028242,0.972534)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient26863"
+               xlink:href="#linearGradient1724"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.028607,0.972188)" />
+            <linearGradient
+               x1="97.345161"
+               y1="112.84396"
+               x2="99.20697"
+               y2="115.81121"
+               id="linearGradient26865"
+               xlink:href="#linearGradient1741"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.206907,0.828564)"
+               spreadMethod="reflect" />
+            <linearGradient
+               x1="168.2516"
+               y1="181.01073"
+               x2="185.96996"
+               y2="172.51707"
+               id="linearGradient26867"
+               xlink:href="#linearGradient4873"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.959874,0,0,1.041804,24.17578,34.86402)" />
+            <linearGradient
+               x1="97.281265"
+               y1="84.255211"
+               x2="127.84677"
+               y2="61.142742"
+               id="linearGradient26869"
+               xlink:href="#linearGradient1716"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.962035,1.039463)" />
+            <linearGradient
+               x1="104.09006"
+               y1="83.359146"
+               x2="123.82494"
+               y2="70.956947"
+               id="linearGradient26871"
+               xlink:href="#linearGradient1724"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.028242,0.972534)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient26873"
+               xlink:href="#linearGradient1724"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.028607,0.972188)" />
+            <linearGradient
+               x1="97.281265"
+               y1="84.255211"
+               x2="127.84677"
+               y2="61.142742"
+               id="linearGradient26875"
+               xlink:href="#linearGradient1716"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.962035,1.039463)" />
+          </defs>
+          <linearGradient
+             x1="104.09006"
+             y1="83.359146"
+             x2="123.82494"
+             y2="70.956947"
+             id="linearGradient26881"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+          <linearGradient
+             x1="100.76616"
+             y1="77.379333"
+             x2="125.25793"
+             y2="77.379333"
+             id="linearGradient26883"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+          <linearGradient
+             x1="10.145814"
+             y1="21.762129"
+             x2="19.678274"
+             y2="15.811033"
+             id="linearGradient26885"
+             xlink:href="#linearGradient1930"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+          <linearGradient
+             x1="226.35037"
+             y1="198.74835"
+             x2="174.43694"
+             y2="217.6319"
+             id="linearGradient26887"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.959874,1.041804)" />
+          <linearGradient
+             x1="97.345161"
+             y1="112.84396"
+             x2="99.20697"
+             y2="115.81121"
+             id="linearGradient26889"
+             xlink:href="#linearGradient2560"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.206907,0.828564)"
+             spreadMethod="reflect" />
+          <linearGradient
+             x1="-94.151642"
+             y1="379.97745"
+             x2="-100.4097"
+             y2="374.03232"
+             id="linearGradient26891"
+             xlink:href="#linearGradient1870"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.088448,0.91874)" />
+          <linearGradient
+             x1="-13.15085"
+             y1="250.48668"
+             x2="-5.590662"
+             y2="258.31036"
+             id="linearGradient26893"
+             xlink:href="#linearGradient2560"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+          <linearGradient
+             x1="240.97612"
+             y1="200.61511"
+             x2="231.89941"
+             y2="205.45764"
+             id="linearGradient26895"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.866855,1.153596)" />
+          <linearGradient
+             x1="7.1050277"
+             y1="221.98289"
+             x2="46.488174"
+             y2="259.94464"
+             id="linearGradient26897"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+          <linearGradient
+             x1="7.1050277"
+             y1="221.98289"
+             x2="46.488174"
+             y2="259.94464"
+             id="linearGradient26899"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+          <linearGradient
+             x1="100.76616"
+             y1="77.379333"
+             x2="125.25793"
+             y2="77.379333"
+             id="linearGradient26901"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+        </defs>
+        <linearGradient
+           x1="100.76616"
+           y1="77.379333"
+           x2="125.25793"
+           y2="77.379333"
+           id="linearGradient26907"
+           xlink:href="#linearGradient1926"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+        <linearGradient
+           x1="100.76616"
+           y1="77.379333"
+           x2="125.25793"
+           y2="77.379333"
+           id="linearGradient26909"
+           xlink:href="#linearGradient1926"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+        <linearGradient
+           x1="10.145814"
+           y1="21.762129"
+           x2="19.678274"
+           y2="15.811033"
+           id="linearGradient26911"
+           xlink:href="#linearGradient1930"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+        <linearGradient
+           x1="-94.151642"
+           y1="379.97745"
+           x2="-100.4097"
+           y2="374.03232"
+           id="linearGradient26913"
+           xlink:href="#linearGradient1870"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.088448,0.91874)" />
+        <linearGradient
+           x1="97.345161"
+           y1="112.84396"
+           x2="99.20697"
+           y2="115.81121"
+           id="linearGradient26915"
+           xlink:href="#linearGradient2560"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(1.206907,0.828564)"
+           spreadMethod="reflect" />
+        <linearGradient
+           x1="-13.15085"
+           y1="250.48668"
+           x2="-5.590662"
+           y2="258.31036"
+           id="linearGradient26917"
+           xlink:href="#linearGradient2560"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+        <linearGradient
+           x1="240.97612"
+           y1="200.61511"
+           x2="231.89941"
+           y2="205.45764"
+           id="linearGradient26919"
+           xlink:href="#linearGradient1884"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(0.866855,1.153596)" />
+        <linearGradient
+           x1="7.1050277"
+           y1="221.98289"
+           x2="46.488174"
+           y2="259.94464"
+           id="linearGradient26921"
+           xlink:href="#linearGradient1884"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+        <linearGradient
+           x1="7.1050277"
+           y1="221.98289"
+           x2="46.488174"
+           y2="259.94464"
+           id="linearGradient26923"
+           xlink:href="#linearGradient1884"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+        <linearGradient
+           x1="11276.761"
+           y1="5908"
+           x2="-10290.378"
+           y2="8376.0635"
+           id="linearGradient26925"
+           xlink:href="#linearGradient3296"
+           gradientUnits="userSpaceOnUse" />
+        <linearGradient
+           x1="11701.849"
+           y1="13028.776"
+           x2="15175.786"
+           y2="9521.5176"
+           id="linearGradient26927"
+           xlink:href="#linearGradient3916"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(5.464784e-3,0,0,5.325523e-3,191.6882,44.23734)" />
+        <linearGradient
+           x1="307.43765"
+           y1="234.53671"
+           x2="292.48148"
+           y2="245.30841"
+           id="linearGradient26929"
+           xlink:href="#linearGradient3936"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.847559,0,0,0.796411,18.7268,-73.96861)" />
+        <linearGradient
+           x1="-161.57674"
+           y1="253.95526"
+           x2="-116.53033"
+           y2="311.73874"
+           id="linearGradient26931"
+           xlink:href="#linearGradient4063"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-0.846674,0.343014,0.288328,0.736755,18.9977,-80.1446)" />
+        <linearGradient
+           x1="42.53046"
+           y1="133.41551"
+           x2="53.520744"
+           y2="163.73753"
+           id="linearGradient26933"
+           xlink:href="#linearGradient4063"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(-1.790967,0.310143,0.182364,0.974268,282.562,-80.82299)" />
+        <linearGradient
+           x1="248.30553"
+           y1="198.48206"
+           x2="257.16309"
+           y2="148.14442"
+           id="linearGradient26935"
+           xlink:href="#linearGradient3913"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.842789,0,0,0.800919,18.7268,-73.96861)" />
+        <defs
+           id="defs26937">
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient26939"
+             xlink:href="#linearGradient4066"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient26941">
+            <stop
+               id="stop26943"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26945"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26947">
+            <stop
+               id="stop26949"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="0" />
+            <stop
+               id="stop26951"
+               style="stop-color:#7d8787;stop-opacity:0.1451"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26953">
+            <stop
+               id="stop26955"
+               style="stop-color:#000000;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26957"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26959">
+            <stop
+               id="stop26961"
+               style="stop-color:#57575a;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26963"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26965">
+            <stop
+               id="stop26967"
+               style="stop-color:#9db8d2;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26969"
+               style="stop-color:#6988b7;stop-opacity:0.375"
+               offset="0.5" />
+            <stop
+               id="stop26971"
+               style="stop-color:#929395;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26973">
+            <stop
+               id="stop26975"
+               style="stop-color:#2e97af;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26977"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="0"
+             y1="0.5"
+             x2="1"
+             y2="0.5"
+             id="linearGradient26979"
+             xlink:href="#linearGradient4063"
+             gradientUnits="objectBoundingBox"
+             spreadMethod="pad" />
+          <linearGradient
+             id="linearGradient26981">
+            <stop
+               id="stop26983"
+               style="stop-color:#adc0d2;stop-opacity:0.91764706"
+               offset="0" />
+            <stop
+               id="stop26985"
+               style="stop-color:#4b6983;stop-opacity:0.77319586"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26987">
+            <stop
+               id="stop26989"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop26991"
+               style="stop-color:#fafbff;stop-opacity:1"
+               offset="0.25" />
+            <stop
+               id="stop26993"
+               style="stop-color:#f0f2fa;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop26995"
+               style="stop-color:#e1e1e1;stop-opacity:1"
+               offset="0.75" />
+            <stop
+               id="stop26997"
+               style="stop-color:#f5f6ff;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26999">
+            <stop
+               id="stop27001"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop27003"
+               style="stop-color:#d0d1d9;stop-opacity:1"
+               offset="0.5" />
+            <stop
+               id="stop27005"
+               style="stop-color:#878b9b;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient49217">
+            <stop
+               id="stop27008"
+               style="stop-color:#e8e8e8;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop27010"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient27012"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient27014"
+             xlink:href="#linearGradient1696"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <defs
+             id="defs27016">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient27018"
+               xlink:href="#linearGradient3936"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient27020">
+              <stop
+                 id="stop27022"
+                 style="stop-color:#000000;stop-opacity:0.14835165"
+                 offset="0" />
+              <stop
+                 id="stop27024"
+                 style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                 offset="0.5" />
+              <stop
+                 id="stop27026"
+                 style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                 offset="0.75" />
+              <stop
+                 id="stop27028"
+                 style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                 offset="0.875" />
+              <stop
+                 id="stop27030"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27032">
+              <stop
+                 id="stop27034"
+                 style="stop-color:#b18e4b;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27036"
+                 style="stop-color:#f7dca0;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="133.07144"
+               y1="28.231943"
+               x2="118.58411"
+               y2="13.431207"
+               id="linearGradient27038"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+            <linearGradient
+               x1="30.722504"
+               y1="28.135216"
+               x2="39.78149"
+               y2="27.315481"
+               id="linearGradient27040"
+               xlink:href="#linearGradient2354"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.475459,2.103232)" />
+            <radialGradient
+               cx="4.9853168"
+               cy="108.47158"
+               r="34.222183"
+               fx="5.2520976"
+               fy="108.73115"
+               id="radialGradient27042"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="36.826332"
+               y1="75.332558"
+               x2="25.761681"
+               y2="135.90358"
+               id="linearGradient27044"
+               xlink:href="#linearGradient2877"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+            <linearGradient
+               x1="78.675774"
+               y1="47.411823"
+               x2="64.05336"
+               y2="34.302757"
+               id="linearGradient27046"
+               xlink:href="#linearGradient4281"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+            <defs
+               id="defs27048">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27050"
+                 xlink:href="#linearGradient3296"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+            </defs>
+          </defs>
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient27060"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          <defs
+             id="defs27062">
+            <linearGradient
+               id="linearGradient27064">
+              <stop
+                 id="stop27066"
+                 style="stop-color:#000000;stop-opacity:0.22314049"
+                 offset="0" />
+              <stop
+                 id="stop27068"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient27070"
+               xlink:href="#linearGradient3703"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient27072"
+               xlink:href="#linearGradient1395"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient27074">
+              <stop
+                 id="stop27076"
+                 style="stop-color:#000000;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27078"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient27080"
+               xlink:href="#linearGradient2021"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient26417">
+              <stop
+                 id="stop27083"
+                 style="stop-color:#83a67f;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27085"
+                 style="stop-color:#eaeaea;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient26421"
+               xlink:href="#linearGradient3916"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0.47368422"
+               y1="0.1171875"
+               x2="0.59649122"
+               y2="1.21875"
+               id="linearGradient27088"
+               xlink:href="#linearGradient1443" />
+            <linearGradient
+               x1="0.63380283"
+               y1="0.11764706"
+               x2="0.62676054"
+               y2="0.74369746"
+               id="linearGradient27090"
+               xlink:href="#linearGradient870" />
+            <linearGradient
+               x1="0.56690139"
+               y1="-0.29629636"
+               x2="0.66549295"
+               y2="0.65432096"
+               id="linearGradient27092"
+               xlink:href="#linearGradient1045" />
+            <linearGradient
+               x1="0.78195488"
+               y1="0.3828125"
+               x2="0.57894737"
+               y2="0.609375"
+               id="linearGradient27094"
+               xlink:href="#linearGradient1045" />
+            <linearGradient
+               x1="0.21097578"
+               y1="-1.2339019"
+               x2="1.2504174"
+               y2="-0.10575413"
+               id="linearGradient27096"
+               xlink:href="#linearGradient1125"
+               gradientTransform="scale(1.096129,0.912302)" />
+            <linearGradient
+               x1="-0.21705426"
+               y1="0.5546875"
+               x2="1.5399107"
+               y2="0.5546875"
+               id="linearGradient27098"
+               xlink:href="#linearGradient1125" />
+            <linearGradient
+               x1="0.23239437"
+               y1="-0.2389937"
+               x2="0.62676054"
+               y2="0.8490566"
+               id="linearGradient27100"
+               xlink:href="#linearGradient1045" />
+            <radialGradient
+               cx="0.44718307"
+               cy="0.51748252"
+               r="0.57398623"
+               fx="0.63028163"
+               fy="0.16783214"
+               id="radialGradient27102"
+               xlink:href="#linearGradient1439" />
+            <radialGradient
+               cx="0.46126762"
+               cy="0.5403226"
+               r="0.51062703"
+               fx="0.50704223"
+               fy="0.20025954"
+               id="radialGradient27104"
+               xlink:href="#linearGradient1443" />
+            <linearGradient
+               id="linearGradient27106"
+               xlink:href="#linearGradient1202" />
+          </defs>
+          <linearGradient
+             x1="57.667629"
+             y1="84.017433"
+             x2="60.490723"
+             y2="111.23763"
+             id="linearGradient27112"
+             xlink:href="#linearGradient2021"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.08132,0.924795)" />
+          <linearGradient
+             x1="-2602.7705"
+             y1="6138.4531"
+             x2="9707.4707"
+             y2="6138.2944"
+             id="linearGradient27114"
+             xlink:href="#linearGradient3650"
+             gradientUnits="userSpaceOnUse" />
+          <defs
+             id="defs27116">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient27118"
+               xlink:href="#linearGradient3933"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient27120"
+               xlink:href="#linearGradient3681"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient27122"
+               xlink:href="#linearGradient3913"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <defs
+               id="defs27124">
+              <clipPath
+                 id="clipPath27126">
+                <polygon
+                   points="17084,18485 16474,17828 15861,17169 15244,16508 14623,15843 13998,15175 13369,14505 12735,13831 12097,13154 11455,12473 10808,11789 10157,11102 9501,10412 9517,10188 9741,9851 10061,9507 10369,9259 10554,9215 11207,9890 11877,10561 12558,11228 13247,11891 13940,12550 14633,13207 15321,13859 16001,14509 16668,15156 17320,15800 17951,16442 18559,17082 18536,17278 18315,17593 17977,17949 17605,18268 17279,18472 17084,18485 "
+                   id="polygon27128" />
+              </clipPath>
+            </defs>
+            <linearGradient
+               x1="0.22399895"
+               y1="0.42968741"
+               x2="0.41599995"
+               y2="0.24999991"
+               id="linearGradient27130"
+               xlink:href="#linearGradient3558" />
+            <linearGradient
+               x1="0.39199805"
+               y1="0.52343756"
+               x2="0.66400015"
+               y2="0.51562506"
+               id="linearGradient27132"
+               xlink:href="#linearGradient3655" />
+            <linearGradient
+               x1="-0.24806577"
+               y1="0.53907728"
+               x2="0.86046565"
+               y2="0.53906298"
+               id="linearGradient27134"
+               xlink:href="#linearGradient3650" />
+          </defs>
+          <radialGradient
+             cx="41.875938"
+             cy="37.865574"
+             r="12.562782"
+             fx="42.023739"
+             fy="37.865574"
+             id="radialGradient27140"
+             xlink:href="#linearGradient2002"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="520.57166"
+             y1="506.28723"
+             x2="520.57166"
+             y2="466.2785"
+             id="linearGradient27142"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="522.94183"
+             y1="469.49918"
+             x2="522.94183"
+             y2="505.0845"
+             id="linearGradient27144"
+             xlink:href="#linearGradient1697"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="520.57166"
+             y1="506.28723"
+             x2="520.57166"
+             y2="466.2785"
+             id="linearGradient27146"
+             xlink:href="#linearGradient1735"
+             gradientUnits="userSpaceOnUse" />
+          <linearGradient
+             x1="44.930588"
+             y1="56.725216"
+             x2="45.511845"
+             y2="185.05675"
+             id="linearGradient27148"
+             xlink:href="#linearGradient1702"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.694118,0,0,0.651906,0,-2.410339)" />
+          <defs
+             id="defs27150">
+            <linearGradient
+               id="linearGradient27152">
+              <stop
+                 id="stop27154"
+                 style="stop-color:#e6d500;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27156"
+                 style="stop-color:#ffba61;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27158">
+              <stop
+                 id="stop27160"
+                 style="stop-color:#e6da1e;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27162"
+                 style="stop-color:#fff99b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient27164"
+               xlink:href="#linearGradient4802"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient27166">
+              <stop
+                 id="stop27168"
+                 style="stop-color:#ccff5f;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27170"
+                 style="stop-color:#69db0e;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27172">
+              <stop
+                 id="stop27174"
+                 style="stop-color:#ffffff;stop-opacity:0.69072163"
+                 offset="0" />
+              <stop
+                 id="stop27176"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27178">
+              <stop
+                 id="stop27180"
+                 style="stop-color:#69db0e;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27182"
+                 style="stop-color:#397607;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="520.57166"
+               y1="506.28723"
+               x2="520.57166"
+               y2="466.2785"
+               id="linearGradient27184"
+               xlink:href="#linearGradient1697"
+               gradientUnits="userSpaceOnUse" />
+            <radialGradient
+               cx="522.89532"
+               cy="481.86633"
+               r="15.301119"
+               fx="522.89911"
+               fy="473.03323"
+               id="radialGradient27186"
+               xlink:href="#linearGradient1702"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="522.94183"
+               y1="469.49918"
+               x2="522.94183"
+               y2="505.0845"
+               id="linearGradient27188"
+               xlink:href="#linearGradient1697"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="213.82799"
+               y1="183.48366"
+               x2="214.59154"
+               y2="463.47311"
+               id="linearGradient27190"
+               xlink:href="#linearGradient1702"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+            <linearGradient
+               x1="27.119711"
+               y1="-353.75928"
+               x2="27.018383"
+               y2="-316.47729"
+               id="linearGradient27192"
+               xlink:href="#linearGradient1702"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(2.89873,-0.344979)" />
+            <radialGradient
+               cx="41.875938"
+               cy="37.865574"
+               r="12.562782"
+               fx="42.023739"
+               fy="37.865574"
+               id="radialGradient27194"
+               xlink:href="#linearGradient1845"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="10.68618"
+               y1="22.702703"
+               x2="11.660023"
+               y2="4.1041274"
+               id="linearGradient27196"
+               xlink:href="#linearGradient1302"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.016203,0.984055)" />
+            <linearGradient
+               x1="16.88386"
+               y1="28.772741"
+               x2="12.516754"
+               y2="2.6018224"
+               id="linearGradient27198"
+               xlink:href="#linearGradient1305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.016203,0.984055)" />
+            <defs
+               id="defs27200">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27202"
+                 xlink:href="#linearGradient2002"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27204"
+                 xlink:href="#linearGradient2009"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27206"
+                 xlink:href="#linearGradient2006"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient27208">
+                <stop
+                   id="stop27210"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop27212"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient27214">
+                <stop
+                   id="stop27216"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop27218"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient27220">
+                <stop
+                   id="stop27222"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop27224"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop27226"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop27228"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop27230"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient27232">
+                <stop
+                   id="stop27234"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop27236"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="28.814428"
+                 y1="-1.616316"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient27238"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.764292,1.3084)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient27240"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <linearGradient
+                 x1="30.382267"
+                 y1="7.5329666"
+                 x2="47.366039"
+                 y2="22.769617"
+                 id="linearGradient27242"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+              <linearGradient
+                 x1="25.954844"
+                 y1="25.071495"
+                 x2="39.781502"
+                 y2="27.315489"
+                 id="linearGradient27244"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103231)" />
+              <defs
+                 id="defs27246">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient27248"
+                   xlink:href="#linearGradient1302"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient27250"
+                   xlink:href="#linearGradient1305"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient27252">
+                  <stop
+                     id="stop27254"
+                     style="stop-color:#e6da1e;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop27256"
+                     style="stop-color:#b5ab17;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0.28441054"
+                   y1="0.88272494"
+                   x2="0.32513002"
+                   y2="0.10505857"
+                   id="linearGradient27258"
+                   xlink:href="#linearGradient4114" />
+                <linearGradient
+                   x1="-0.0078431377"
+                   y1="-1.244898"
+                   x2="0.59607846"
+                   y2="0.3605442"
+                   id="linearGradient27260"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="-0.4509804"
+                   y1="-0.15053764"
+                   x2="0.47058824"
+                   y2="0.36559141"
+                   id="linearGradient27262"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="0.45882353"
+                   y1="1.2772278"
+                   x2="0.6901961"
+                   y2="-0.2970297"
+                   id="linearGradient27264"
+                   xlink:href="#linearGradient2122" />
+                <linearGradient
+                   x1="-0.18232045"
+                   y1="-0.43962848"
+                   x2="0.68508285"
+                   y2="0.42414862"
+                   id="linearGradient27266"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   id="linearGradient27268">
+                  <stop
+                     id="stop26514"
+                     style="stop-color:#000000;stop-opacity:0.40784314"
+                     offset="0" />
+                  <stop
+                     id="stop27271"
+                     style="stop-color:#000000;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="1.3783784"
+                   y1="0.25386998"
+                   x2="0.58378381"
+                   y2="0.13003096"
+                   id="linearGradient27273"
+                   xlink:href="#linearGradient2122" />
+                <linearGradient
+                   x1="-0.14213198"
+                   y1="-0.28792569"
+                   x2="0.49753696"
+                   y2="0.35603714"
+                   id="linearGradient27275"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   x1="0.99512196"
+                   y1="0.64396286"
+                   x2="0.32682925"
+                   y2="0.3003096"
+                   id="linearGradient27277"
+                   xlink:href="#linearGradient1918" />
+                <linearGradient
+                   x1="0.27843139"
+                   y1="-0.063694268"
+                   x2="0.4509804"
+                   y2="0.61146498"
+                   id="linearGradient27279"
+                   xlink:href="#linearGradient1513" />
+                <linearGradient
+                   id="linearGradient27281">
+                  <stop
+                     id="stop27283"
+                     style="stop-color:#d6d6d6;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop27285"
+                     style="stop-color:#eaeaea;stop-opacity:1"
+                     offset="0.25769231" />
+                  <stop
+                     id="stop27287"
+                     style="stop-color:#919191;stop-opacity:1"
+                     offset="0.7059449" />
+                  <stop
+                     id="stop27289"
+                     style="stop-color:#d2d2d2;stop-opacity:1"
+                     offset="0.73347497" />
+                  <stop
+                     id="stop27291"
+                     style="stop-color:#a6a6a6;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0.47450981"
+                   y1="0.21771218"
+                   x2="0.80392158"
+                   y2="0.5202952"
+                   id="linearGradient27293"
+                   xlink:href="#linearGradient2317" />
+                <linearGradient
+                   id="linearGradient27295">
+                  <stop
+                     id="stop27297"
+                     style="stop-color:#ffffff;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop27299"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0.41568628"
+                   y1="0.27687296"
+                   x2="0.59607846"
+                   y2="0.44299674"
+                   id="linearGradient27301"
+                   xlink:href="#linearGradient1513" />
+                <radialGradient
+                   cx="0.5"
+                   cy="0.5"
+                   r="0.5"
+                   fx="0.38431373"
+                   fy="0.47619048"
+                   id="radialGradient27303"
+                   xlink:href="#linearGradient1918" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient27305"
+                   xlink:href="#linearGradient1845"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <radialGradient
+                   cx="0.5"
+                   cy="0.5"
+                   r="0.5"
+                   fx="0.50588238"
+                   fy="0.5"
+                   id="radialGradient27307"
+                   xlink:href="#linearGradient1918" />
+                <linearGradient
+                   x1="0.54355544"
+                   y1="1.1365328"
+                   x2="0.36095273"
+                   y2="0.042242367"
+                   id="linearGradient27309"
+                   xlink:href="#linearGradient4111" />
+              </defs>
+            </defs>
+          </defs>
+        </defs>
+        <defs
+           id="defs27327">
+          <linearGradient
+             id="linearGradient27329">
+            <stop
+               id="stop27331"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop27333"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient27335">
+            <stop
+               id="stop27337"
+               style="stop-color:#d6d6d6;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop27339"
+               style="stop-color:#eaeaea;stop-opacity:1"
+               offset="0.25769231" />
+            <stop
+               id="stop27341"
+               style="stop-color:#919191;stop-opacity:1"
+               offset="0.7059449" />
+            <stop
+               id="stop27343"
+               style="stop-color:#d2d2d2;stop-opacity:1"
+               offset="0.73347497" />
+            <stop
+               id="stop27345"
+               style="stop-color:#a6a6a6;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient27347">
+            <stop
+               id="stop27349"
+               style="stop-color:#ffbc96;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop27351"
+               style="stop-color:#ffeafe;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient27353">
+            <stop
+               id="stop27355"
+               style="stop-color:#000000;stop-opacity:0.3137255"
+               offset="0" />
+            <stop
+               id="stop27357"
+               style="stop-color:#000000;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient27359">
+            <stop
+               id="stop27361"
+               style="stop-color:#ffffff;stop-opacity:0.74901962"
+               offset="0" />
+            <stop
+               id="stop27363"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient26567">
+            <stop
+               id="stop27366"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop27368"
+               style="stop-color:#ffffff;stop-opacity:0.35164836"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient27370">
+            <stop
+               id="stop27372"
+               style="stop-color:#ffffff;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop27374"
+               style="stop-color:#ffffff;stop-opacity:0"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             id="linearGradient27376">
+            <stop
+               id="stop27378"
+               style="stop-color:#7e818c;stop-opacity:1"
+               offset="0" />
+            <stop
+               id="stop27380"
+               style="stop-color:#d5dbed;stop-opacity:1"
+               offset="1" />
+          </linearGradient>
+          <linearGradient
+             x1="52.683483"
+             y1="104.09244"
+             x2="58.380398"
+             y2="252.54866"
+             id="linearGradient27382"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.334689,0,0,1.038479,-0.72121,-66.60727)" />
+          <linearGradient
+             x1="52.19524"
+             y1="64.818008"
+             x2="52.19524"
+             y2="122.69208"
+             id="linearGradient27384"
+             xlink:href="#linearGradient2689"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.111523,0,0,0.771568,-0.72121,-29.98157)" />
+          <linearGradient
+             x1="29.958502"
+             y1="-23.328955"
+             x2="29.958502"
+             y2="190.05157"
+             id="linearGradient27386"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.127153,0,0,0.781382,0.981463,-27.99057)" />
+          <linearGradient
+             x1="84.960785"
+             y1="92.151367"
+             x2="42.64373"
+             y2="53.360722"
+             id="linearGradient27388"
+             xlink:href="#linearGradient1749"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.321949,0.756459)" />
+          <linearGradient
+             x1="31.82851"
+             y1="61.778381"
+             x2="33.198818"
+             y2="6.859036"
+             id="linearGradient27390"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.818391,0,0,1.170453,53.43468,-2.095615)" />
+          <linearGradient
+             x1="186.07457"
+             y1="23.533224"
+             x2="202.6377"
+             y2="23.47304"
+             id="linearGradient27392"
+             xlink:href="#linearGradient2689"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.388045,2.57702)" />
+          <linearGradient
+             x1="92.631454"
+             y1="54.989693"
+             x2="92.631454"
+             y2="50.608093"
+             id="linearGradient27394"
+             xlink:href="#linearGradient1757"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.787838,1.269296)" />
+          <linearGradient
+             x1="133.07144"
+             y1="28.231943"
+             x2="118.58411"
+             y2="13.431207"
+             id="linearGradient27396"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.492395,0,0,1.945366,53.10969,-2.377145)" />
+          <linearGradient
+             x1="1270.3132"
+             y1="4.8765283"
+             x2="1247.6848"
+             y2="0.72310239"
+             id="linearGradient27398"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(9.440723e-2,10.59241)" />
+          <linearGradient
+             x1="1270.3132"
+             y1="4.8765283"
+             x2="1247.6848"
+             y2="0.72310239"
+             id="linearGradient27400"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(9.440723e-2,0,0,10.59241,1.24477,0)" />
+          <linearGradient
+             x1="96.41098"
+             y1="57.341877"
+             x2="81.065781"
+             y2="196.048"
+             id="linearGradient26587"
+             xlink:href="#linearGradient2871"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.176531,0,0,0.821515,0,4.496065)" />
+          <linearGradient
+             x1="-191.46153"
+             y1="37.372372"
+             x2="-165.58835"
+             y2="37.372372"
+             id="linearGradient27403"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient27405"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient27407"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient27409"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient27411"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <linearGradient
+             x1="100.76616"
+             y1="77.379333"
+             x2="125.25793"
+             y2="77.379333"
+             id="linearGradient27413"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+          <linearGradient
+             x1="104.09006"
+             y1="83.359146"
+             x2="123.82494"
+             y2="70.956947"
+             id="linearGradient27415"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+          <linearGradient
+             x1="100.76616"
+             y1="77.379333"
+             x2="125.25793"
+             y2="77.379333"
+             id="linearGradient27417"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+          <linearGradient
+             x1="10.145814"
+             y1="21.762129"
+             x2="19.678274"
+             y2="15.811033"
+             id="linearGradient27419"
+             xlink:href="#linearGradient1930"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+          <linearGradient
+             x1="226.35037"
+             y1="198.74835"
+             x2="174.43694"
+             y2="217.6319"
+             id="linearGradient27421"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.959874,1.041804)" />
+          <linearGradient
+             x1="-94.151642"
+             y1="379.97745"
+             x2="-100.4097"
+             y2="374.03232"
+             id="linearGradient27423"
+             xlink:href="#linearGradient1870"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.088448,0.91874)" />
+          <linearGradient
+             x1="97.345161"
+             y1="112.84396"
+             x2="99.20697"
+             y2="115.81121"
+             id="linearGradient27425"
+             xlink:href="#linearGradient2560"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.206907,0.828564)"
+             spreadMethod="reflect" />
+          <linearGradient
+             x1="-13.15085"
+             y1="250.48668"
+             x2="-5.590662"
+             y2="258.31036"
+             id="linearGradient27427"
+             xlink:href="#linearGradient2560"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+          <linearGradient
+             x1="240.97612"
+             y1="200.61511"
+             x2="231.89941"
+             y2="205.45764"
+             id="linearGradient27429"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.866855,1.153596)" />
+          <linearGradient
+             x1="7.1050277"
+             y1="221.98289"
+             x2="46.488174"
+             y2="259.94464"
+             id="linearGradient27431"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+          <linearGradient
+             x1="7.1050277"
+             y1="221.98289"
+             x2="46.488174"
+             y2="259.94464"
+             id="linearGradient27433"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+          <defs
+             id="defs27435">
+            <linearGradient
+               id="linearGradient27437">
+              <stop
+                 id="stop27439"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27441"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27443">
+              <stop
+                 id="stop27445"
+                 style="stop-color:#c86f32;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27447"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27449">
+              <stop
+                 id="stop27451"
+                 style="stop-color:#d88721;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27453"
+                 style="stop-color:#a85c00;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop27455"
+                 style="stop-color:#643e0e;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27457">
+              <stop
+                 id="stop27459"
+                 style="stop-color:#868686;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27461"
+                 style="stop-color:#e2e2e2;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27463">
+              <stop
+                 id="stop27465"
+                 style="stop-color:#ff9870;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27467"
+                 style="stop-color:#ffd8c9;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27469">
+              <stop
+                 id="stop27471"
+                 style="stop-color:#ffd7c0;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27473"
+                 style="stop-color:#ffbc96;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient27475"
+               xlink:href="#linearGradient2150"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient27477">
+              <stop
+                 id="stop27479"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27481"
+                 style="stop-color:#fafbff;stop-opacity:1"
+                 offset="0.25" />
+              <stop
+                 id="stop27483"
+                 style="stop-color:#f0f2fa;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop27485"
+                 style="stop-color:#e1e1e1;stop-opacity:1"
+                 offset="0.75" />
+              <stop
+                 id="stop27487"
+                 style="stop-color:#f5f6ff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27489">
+              <stop
+                 id="stop27491"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27493"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop27495"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27497">
+              <stop
+                 id="stop27499"
+                 style="stop-color:#e8e8e8;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27501"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient27503"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient27505"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <defs
+               id="defs27507">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27509"
+                 xlink:href="#linearGradient1884"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient27511">
+                <stop
+                   id="stop27513"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop27515"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop27517"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop27519"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop27521"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient27523">
+                <stop
+                   id="stop27525"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop49481"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient27528"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient27530"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient27532"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient27534"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient27536"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs27538">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient27540"
+                   xlink:href="#linearGradient3296"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+              </defs>
+            </defs>
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient27550"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            <defs
+               id="defs27552">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27554"
+                 xlink:href="#linearGradient1863"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27556"
+                 xlink:href="#linearGradient2560"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27558"
+                 xlink:href="#linearGradient1926"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27560"
+                 xlink:href="#linearGradient1302"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="96.346039"
+                 y1="84.428337"
+                 x2="121.44556"
+                 y2="65.093857"
+                 id="linearGradient27562"
+                 xlink:href="#linearGradient1716"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.962035,0,0,1.039463,0.899729,-0.17995)" />
+              <linearGradient
+                 x1="104.09006"
+                 y1="83.359146"
+                 x2="123.82494"
+                 y2="70.956947"
+                 id="linearGradient27564"
+                 xlink:href="#linearGradient1724"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.028242,0.972534)" />
+              <linearGradient
+                 x1="100.76616"
+                 y1="77.379333"
+                 x2="125.25793"
+                 y2="77.379333"
+                 id="linearGradient27566"
+                 xlink:href="#linearGradient1724"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.028607,0.972188)" />
+              <linearGradient
+                 x1="97.345161"
+                 y1="112.84396"
+                 x2="99.20697"
+                 y2="115.81121"
+                 id="linearGradient27568"
+                 xlink:href="#linearGradient1741"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.206907,0.828564)"
+                 spreadMethod="reflect" />
+              <linearGradient
+                 x1="168.2516"
+                 y1="181.01073"
+                 x2="185.96996"
+                 y2="172.51707"
+                 id="linearGradient27570"
+                 xlink:href="#linearGradient4873"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.959874,0,0,1.041804,24.17578,34.86402)" />
+              <linearGradient
+                 x1="97.281265"
+                 y1="84.255211"
+                 x2="127.84677"
+                 y2="61.142742"
+                 id="linearGradient27572"
+                 xlink:href="#linearGradient1716"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.962035,1.039463)" />
+              <linearGradient
+                 x1="104.09006"
+                 y1="83.359146"
+                 x2="123.82494"
+                 y2="70.956947"
+                 id="linearGradient27574"
+                 xlink:href="#linearGradient1724"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.028242,0.972534)" />
+              <linearGradient
+                 x1="100.76616"
+                 y1="77.379333"
+                 x2="125.25793"
+                 y2="77.379333"
+                 id="linearGradient27576"
+                 xlink:href="#linearGradient1724"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.028607,0.972188)" />
+              <linearGradient
+                 x1="97.281265"
+                 y1="84.255211"
+                 x2="127.84677"
+                 y2="61.142742"
+                 id="linearGradient27578"
+                 xlink:href="#linearGradient1716"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.962035,1.039463)" />
+            </defs>
+            <linearGradient
+               x1="104.09006"
+               y1="83.359146"
+               x2="123.82494"
+               y2="70.956947"
+               id="linearGradient27584"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.439144,-0.210923,-0.190425,0.501365,62.63665,233.1606)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient27586"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+            <linearGradient
+               x1="10.145814"
+               y1="21.762129"
+               x2="19.678274"
+               y2="15.811033"
+               id="linearGradient27588"
+               xlink:href="#linearGradient1930"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+            <linearGradient
+               x1="226.35037"
+               y1="198.74835"
+               x2="174.43694"
+               y2="217.6319"
+               id="linearGradient27590"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.959874,1.041804)" />
+            <linearGradient
+               x1="97.345161"
+               y1="112.84396"
+               x2="99.20697"
+               y2="115.81121"
+               id="linearGradient27592"
+               xlink:href="#linearGradient2560"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.206907,0.828564)"
+               spreadMethod="reflect" />
+            <linearGradient
+               x1="-94.151642"
+               y1="379.97745"
+               x2="-100.4097"
+               y2="374.03232"
+               id="linearGradient27594"
+               xlink:href="#linearGradient1870"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.088448,0.91874)" />
+            <linearGradient
+               x1="-13.15085"
+               y1="250.48668"
+               x2="-5.590662"
+               y2="258.31036"
+               id="linearGradient27596"
+               xlink:href="#linearGradient2560"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+            <linearGradient
+               x1="240.97612"
+               y1="200.61511"
+               x2="231.89941"
+               y2="205.45764"
+               id="linearGradient27598"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(0.866855,1.153596)" />
+            <linearGradient
+               x1="7.1050277"
+               y1="221.98289"
+               x2="46.488174"
+               y2="259.94464"
+               id="linearGradient27600"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+            <linearGradient
+               x1="7.1050277"
+               y1="221.98289"
+               x2="46.488174"
+               y2="259.94464"
+               id="linearGradient27602"
+               xlink:href="#linearGradient1884"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+            <linearGradient
+               x1="100.76616"
+               y1="77.379333"
+               x2="125.25793"
+               y2="77.379333"
+               id="linearGradient27604"
+               xlink:href="#linearGradient1926"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+          </defs>
+          <linearGradient
+             x1="100.76616"
+             y1="77.379333"
+             x2="125.25793"
+             y2="77.379333"
+             id="linearGradient27610"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+          <linearGradient
+             x1="100.76616"
+             y1="77.379333"
+             x2="125.25793"
+             y2="77.379333"
+             id="linearGradient27612"
+             xlink:href="#linearGradient1926"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.4393,-0.210998,-0.190357,0.501187,62.63665,233.1606)" />
+          <linearGradient
+             x1="10.145814"
+             y1="21.762129"
+             x2="19.678274"
+             y2="15.811033"
+             id="linearGradient27614"
+             xlink:href="#linearGradient1930"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(-0.413149,-0.198439,-0.202406,0.53291,16.26137,245.634)" />
+          <linearGradient
+             x1="-94.151642"
+             y1="379.97745"
+             x2="-100.4097"
+             y2="374.03232"
+             id="linearGradient27616"
+             xlink:href="#linearGradient1870"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.088448,0.91874)" />
+          <linearGradient
+             x1="97.345161"
+             y1="112.84396"
+             x2="99.20697"
+             y2="115.81121"
+             id="linearGradient27618"
+             xlink:href="#linearGradient2560"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.206907,0.828564)"
+             spreadMethod="reflect" />
+          <linearGradient
+             x1="-13.15085"
+             y1="250.48668"
+             x2="-5.590662"
+             y2="258.31036"
+             id="linearGradient27620"
+             xlink:href="#linearGradient2560"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.986927,0,0,1.013246,0.642825,-0.964234)" />
+          <linearGradient
+             x1="240.97612"
+             y1="200.61511"
+             x2="231.89941"
+             y2="205.45764"
+             id="linearGradient27622"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.866855,1.153596)" />
+          <linearGradient
+             x1="7.1050277"
+             y1="221.98289"
+             x2="46.488174"
+             y2="259.94464"
+             id="linearGradient27624"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.107955,0,0,0.831653,-1.073103,28.76249)" />
+          <linearGradient
+             x1="7.1050277"
+             y1="221.98289"
+             x2="46.488174"
+             y2="259.94464"
+             id="linearGradient27626"
+             xlink:href="#linearGradient1884"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.107955,0,0,0.831653,11.62268,17.67377)" />
+          <defs
+             id="defs27628">
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient27630"
+               xlink:href="#linearGradient4066"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient27632">
+              <stop
+                 id="stop27634"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27636"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27638">
+              <stop
+                 id="stop27640"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="0" />
+              <stop
+                 id="stop27642"
+                 style="stop-color:#7d8787;stop-opacity:0.1451"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27644">
+              <stop
+                 id="stop27646"
+                 style="stop-color:#000000;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27648"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27650">
+              <stop
+                 id="stop27652"
+                 style="stop-color:#57575a;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27654"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27656">
+              <stop
+                 id="stop27658"
+                 style="stop-color:#9db8d2;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop26722"
+                 style="stop-color:#6988b7;stop-opacity:0.375"
+                 offset="0.5" />
+              <stop
+                 id="stop27661"
+                 style="stop-color:#929395;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27663">
+              <stop
+                 id="stop27665"
+                 style="stop-color:#2e97af;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27667"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient27669"
+               xlink:href="#linearGradient4063"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient27671">
+              <stop
+                 id="stop27673"
+                 style="stop-color:#adc0d2;stop-opacity:0.91764706"
+                 offset="0" />
+              <stop
+                 id="stop27675"
+                 style="stop-color:#4b6983;stop-opacity:0.77319586"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27677">
+              <stop
+                 id="stop27679"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27681"
+                 style="stop-color:#fafbff;stop-opacity:1"
+                 offset="0.25" />
+              <stop
+                 id="stop27683"
+                 style="stop-color:#f0f2fa;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop27685"
+                 style="stop-color:#e1e1e1;stop-opacity:1"
+                 offset="0.75" />
+              <stop
+                 id="stop27687"
+                 style="stop-color:#f5f6ff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27689">
+              <stop
+                 id="stop27691"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27693"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop27695"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient27697">
+              <stop
+                 id="stop27699"
+                 style="stop-color:#e8e8e8;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop27701"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient27703"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient27705"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <defs
+               id="defs27707">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27709"
+                 xlink:href="#linearGradient3936"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient27711">
+                <stop
+                   id="stop27713"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop27715"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop27717"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop27719"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop27721"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient27723">
+                <stop
+                   id="stop27725"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop27727"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient27729"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient27731"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient27733"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient27735"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient27737"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs27739">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient27741"
+                   xlink:href="#linearGradient3296"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+              </defs>
+            </defs>
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient27751"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            <defs
+               id="defs27753">
+              <linearGradient
+                 id="linearGradient27755">
+                <stop
+                   id="stop27757"
+                   style="stop-color:#000000;stop-opacity:0.22314049"
+                   offset="0" />
+                <stop
+                   id="stop27759"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27761"
+                 xlink:href="#linearGradient3703"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27763"
+                 xlink:href="#linearGradient1395"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient27765">
+                <stop
+                   id="stop49603"
+                   style="stop-color:#000000;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop27768"
+                   style="stop-color:#000000;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27770"
+                 xlink:href="#linearGradient2021"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient27772">
+                <stop
+                   id="stop27774"
+                   style="stop-color:#83a67f;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop27776"
+                   style="stop-color:#eaeaea;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient49610"
+                 xlink:href="#linearGradient3916"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0.47368422"
+                 y1="0.1171875"
+                 x2="0.59649122"
+                 y2="1.21875"
+                 id="linearGradient27779"
+                 xlink:href="#linearGradient1443" />
+              <linearGradient
+                 x1="0.63380283"
+                 y1="0.11764706"
+                 x2="0.62676054"
+                 y2="0.74369746"
+                 id="linearGradient27781"
+                 xlink:href="#linearGradient870" />
+              <linearGradient
+                 x1="0.56690139"
+                 y1="-0.29629636"
+                 x2="0.66549295"
+                 y2="0.65432096"
+                 id="linearGradient27783"
+                 xlink:href="#linearGradient1045" />
+              <linearGradient
+                 x1="0.78195488"
+                 y1="0.3828125"
+                 x2="0.57894737"
+                 y2="0.609375"
+                 id="linearGradient27785"
+                 xlink:href="#linearGradient1045" />
+              <linearGradient
+                 x1="0.21097578"
+                 y1="-1.2339019"
+                 x2="1.2504174"
+                 y2="-0.10575413"
+                 id="linearGradient27787"
+                 xlink:href="#linearGradient1125"
+                 gradientTransform="scale(1.096129,0.912302)" />
+              <linearGradient
+                 x1="-0.21705426"
+                 y1="0.5546875"
+                 x2="1.5399107"
+                 y2="0.5546875"
+                 id="linearGradient27789"
+                 xlink:href="#linearGradient1125" />
+              <linearGradient
+                 x1="0.23239437"
+                 y1="-0.2389937"
+                 x2="0.62676054"
+                 y2="0.8490566"
+                 id="linearGradient26792"
+                 xlink:href="#linearGradient1045" />
+              <radialGradient
+                 cx="0.44718307"
+                 cy="0.51748252"
+                 r="0.57398623"
+                 fx="0.63028163"
+                 fy="0.16783214"
+                 id="radialGradient27792"
+                 xlink:href="#linearGradient1439" />
+              <radialGradient
+                 cx="0.46126762"
+                 cy="0.5403226"
+                 r="0.51062703"
+                 fx="0.50704223"
+                 fy="0.20025954"
+                 id="radialGradient27794"
+                 xlink:href="#linearGradient1443" />
+              <linearGradient
+                 id="linearGradient27796"
+                 xlink:href="#linearGradient1202" />
+            </defs>
+            <linearGradient
+               x1="57.667629"
+               y1="84.017433"
+               x2="60.490723"
+               y2="111.23763"
+               id="linearGradient27802"
+               xlink:href="#linearGradient2021"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.08132,0.924795)" />
+            <linearGradient
+               x1="-2602.7705"
+               y1="6138.4531"
+               x2="9707.4707"
+               y2="6138.2944"
+               id="linearGradient27804"
+               xlink:href="#linearGradient3650"
+               gradientUnits="userSpaceOnUse" />
+            <defs
+               id="defs27806">
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27808"
+                 xlink:href="#linearGradient3933"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27810"
+                 xlink:href="#linearGradient3681"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27812"
+                 xlink:href="#linearGradient3913"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <defs
+                 id="defs27814">
+                <clipPath
+                   id="clipPath27816">
+                  <polygon
+                     points="17084,18485 16474,17828 15861,17169 15244,16508 14623,15843 13998,15175 13369,14505 12735,13831 12097,13154 11455,12473 10808,11789 10157,11102 9501,10412 9517,10188 9741,9851 10061,9507 10369,9259 10554,9215 11207,9890 11877,10561 12558,11228 13247,11891 13940,12550 14633,13207 15321,13859 16001,14509 16668,15156 17320,15800 17951,16442 18559,17082 18536,17278 18315,17593 17977,17949 17605,18268 17279,18472 17084,18485 "
+                     id="polygon27818" />
+                </clipPath>
+              </defs>
+              <linearGradient
+                 x1="0.22399895"
+                 y1="0.42968741"
+                 x2="0.41599995"
+                 y2="0.24999991"
+                 id="linearGradient27820"
+                 xlink:href="#linearGradient3558" />
+              <linearGradient
+                 x1="0.39199805"
+                 y1="0.52343756"
+                 x2="0.66400015"
+                 y2="0.51562506"
+                 id="linearGradient27822"
+                 xlink:href="#linearGradient3655" />
+              <linearGradient
+                 x1="-0.24806577"
+                 y1="0.53907728"
+                 x2="0.86046565"
+                 y2="0.53906298"
+                 id="linearGradient27824"
+                 xlink:href="#linearGradient3650" />
+            </defs>
+            <radialGradient
+               cx="41.875938"
+               cy="37.865574"
+               r="12.562782"
+               fx="42.023739"
+               fy="37.865574"
+               id="radialGradient27830"
+               xlink:href="#linearGradient2002"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="520.57166"
+               y1="506.28723"
+               x2="520.57166"
+               y2="466.2785"
+               id="linearGradient27832"
+               xlink:href="#linearGradient1697"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="522.94183"
+               y1="469.49918"
+               x2="522.94183"
+               y2="505.0845"
+               id="linearGradient27834"
+               xlink:href="#linearGradient1697"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="520.57166"
+               y1="506.28723"
+               x2="520.57166"
+               y2="466.2785"
+               id="linearGradient27836"
+               xlink:href="#linearGradient1735"
+               gradientUnits="userSpaceOnUse" />
+            <linearGradient
+               x1="44.930588"
+               y1="56.725216"
+               x2="45.511845"
+               y2="185.05675"
+               id="linearGradient27838"
+               xlink:href="#linearGradient1702"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.694118,0,0,0.651906,0,-2.410339)" />
+            <defs
+               id="defs27840">
+              <linearGradient
+                 id="linearGradient27842">
+                <stop
+                   id="stop27844"
+                   style="stop-color:#e6d500;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop27846"
+                   style="stop-color:#ffba61;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient27848">
+                <stop
+                   id="stop27850"
+                   style="stop-color:#e6da1e;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop27852"
+                   style="stop-color:#fff99b;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="0"
+                 y1="0.5"
+                 x2="1"
+                 y2="0.5"
+                 id="linearGradient27854"
+                 xlink:href="#linearGradient4802"
+                 gradientUnits="objectBoundingBox"
+                 spreadMethod="pad" />
+              <linearGradient
+                 id="linearGradient27856">
+                <stop
+                   id="stop27858"
+                   style="stop-color:#ccff5f;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop27860"
+                   style="stop-color:#69db0e;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient27862">
+                <stop
+                   id="stop27864"
+                   style="stop-color:#ffffff;stop-opacity:0.69072163"
+                   offset="0" />
+                <stop
+                   id="stop27866"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient27868">
+                <stop
+                   id="stop27870"
+                   style="stop-color:#69db0e;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop27872"
+                   style="stop-color:#397607;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="520.57166"
+                 y1="506.28723"
+                 x2="520.57166"
+                 y2="466.2785"
+                 id="linearGradient27874"
+                 xlink:href="#linearGradient1697"
+                 gradientUnits="userSpaceOnUse" />
+              <radialGradient
+                 cx="522.89532"
+                 cy="481.86633"
+                 r="15.301119"
+                 fx="522.89911"
+                 fy="473.03323"
+                 id="radialGradient27876"
+                 xlink:href="#linearGradient1702"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="522.94183"
+                 y1="469.49918"
+                 x2="522.94183"
+                 y2="505.0845"
+                 id="linearGradient27878"
+                 xlink:href="#linearGradient1697"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="213.82799"
+                 y1="183.48366"
+                 x2="214.59154"
+                 y2="463.47311"
+                 id="linearGradient27880"
+                 xlink:href="#linearGradient1702"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(1.5539,0,0,0.643542,-1.017928,0)" />
+              <linearGradient
+                 x1="27.119711"
+                 y1="-353.75928"
+                 x2="27.018383"
+                 y2="-316.47729"
+                 id="linearGradient27882"
+                 xlink:href="#linearGradient1702"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(2.89873,-0.344979)" />
+              <radialGradient
+                 cx="41.875938"
+                 cy="37.865574"
+                 r="12.562782"
+                 fx="42.023739"
+                 fy="37.865574"
+                 id="radialGradient27884"
+                 xlink:href="#linearGradient1845"
+                 gradientUnits="userSpaceOnUse" />
+              <linearGradient
+                 x1="10.68618"
+                 y1="22.702703"
+                 x2="11.660023"
+                 y2="4.1041274"
+                 id="linearGradient27886"
+                 xlink:href="#linearGradient1302"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.016203,0.984055)" />
+              <linearGradient
+                 x1="16.88386"
+                 y1="28.772741"
+                 x2="12.516754"
+                 y2="2.6018224"
+                 id="linearGradient27888"
+                 xlink:href="#linearGradient1305"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(1.016203,0.984055)" />
+              <defs
+                 id="defs27890">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient27892"
+                   xlink:href="#linearGradient2002"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient27894"
+                   xlink:href="#linearGradient2009"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient27896"
+                   xlink:href="#linearGradient2006"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient27898">
+                  <stop
+                     id="stop27900"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop27902"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient27904"
+                   xlink:href="#linearGradient2780"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+                <linearGradient
+                   id="linearGradient27906">
+                  <stop
+                     id="stop27908"
+                     style="stop-color:#000000;stop-opacity:0.14835165"
+                     offset="0" />
+                  <stop
+                     id="stop27910"
+                     style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                     offset="0.5" />
+                  <stop
+                     id="stop27912"
+                     style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                     offset="0.75" />
+                  <stop
+                     id="stop27914"
+                     style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                     offset="0.875" />
+                  <stop
+                     id="stop27916"
+                     style="stop-color:#ffffff;stop-opacity:0"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   id="linearGradient27918">
+                  <stop
+                     id="stop27920"
+                     style="stop-color:#b18e4b;stop-opacity:1"
+                     offset="0" />
+                  <stop
+                     id="stop27922"
+                     style="stop-color:#f7dca0;stop-opacity:1"
+                     offset="1" />
+                </linearGradient>
+                <linearGradient
+                   x1="28.814428"
+                   y1="-1.616316"
+                   x2="47.366039"
+                   y2="22.769617"
+                   id="linearGradient27924"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.764292,1.3084)" />
+                <linearGradient
+                   x1="30.722504"
+                   y1="28.135216"
+                   x2="39.78149"
+                   y2="27.315481"
+                   id="linearGradient27926"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103232)" />
+                <linearGradient
+                   x1="30.382267"
+                   y1="7.5329666"
+                   x2="47.366039"
+                   y2="22.769617"
+                   id="linearGradient27928"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="matrix(0.479578,0,0,0.81043,36.76785,3.324472)" />
+                <linearGradient
+                   x1="25.954844"
+                   y1="25.071495"
+                   x2="39.781502"
+                   y2="27.315489"
+                   id="linearGradient27930"
+                   xlink:href="#linearGradient2354"
+                   gradientUnits="userSpaceOnUse"
+                   gradientTransform="scale(0.475459,2.103231)" />
+                <defs
+                   id="defs27932">
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient27934"
+                     xlink:href="#linearGradient1302"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient27936"
+                     xlink:href="#linearGradient1305"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <linearGradient
+                     id="linearGradient27938">
+                    <stop
+                       id="stop27940"
+                       style="stop-color:#e6da1e;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop27942"
+                       style="stop-color:#b5ab17;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="0.28441054"
+                     y1="0.88272494"
+                     x2="0.32513002"
+                     y2="0.10505857"
+                     id="linearGradient27944"
+                     xlink:href="#linearGradient4114" />
+                  <linearGradient
+                     x1="-0.0078431377"
+                     y1="-1.244898"
+                     x2="0.59607846"
+                     y2="0.3605442"
+                     id="linearGradient27946"
+                     xlink:href="#linearGradient1513" />
+                  <linearGradient
+                     x1="-0.4509804"
+                     y1="-0.15053764"
+                     x2="0.47058824"
+                     y2="0.36559141"
+                     id="linearGradient49697"
+                     xlink:href="#linearGradient1513" />
+                  <linearGradient
+                     x1="0.45882353"
+                     y1="1.2772278"
+                     x2="0.6901961"
+                     y2="-0.2970297"
+                     id="linearGradient27949"
+                     xlink:href="#linearGradient2122" />
+                  <linearGradient
+                     x1="-0.18232045"
+                     y1="-0.43962848"
+                     x2="0.68508285"
+                     y2="0.42414862"
+                     id="linearGradient27951"
+                     xlink:href="#linearGradient1513" />
+                  <linearGradient
+                     id="linearGradient49701">
+                    <stop
+                       id="stop27954"
+                       style="stop-color:#000000;stop-opacity:0.40784314"
+                       offset="0" />
+                    <stop
+                       id="stop27956"
+                       style="stop-color:#000000;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="1.3783784"
+                     y1="0.25386998"
+                     x2="0.58378381"
+                     y2="0.13003096"
+                     id="linearGradient27958"
+                     xlink:href="#linearGradient2122" />
+                  <linearGradient
+                     x1="-0.14213198"
+                     y1="-0.28792569"
+                     x2="0.49753696"
+                     y2="0.35603714"
+                     id="linearGradient49706"
+                     xlink:href="#linearGradient1513" />
+                  <linearGradient
+                     x1="0.99512196"
+                     y1="0.64396286"
+                     x2="0.32682925"
+                     y2="0.3003096"
+                     id="linearGradient27961"
+                     xlink:href="#linearGradient1918" />
+                  <linearGradient
+                     x1="0.27843139"
+                     y1="-0.063694268"
+                     x2="0.4509804"
+                     y2="0.61146498"
+                     id="linearGradient27963"
+                     xlink:href="#linearGradient1513" />
+                  <linearGradient
+                     id="linearGradient27965">
+                    <stop
+                       id="stop27967"
+                       style="stop-color:#d6d6d6;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop27969"
+                       style="stop-color:#eaeaea;stop-opacity:1"
+                       offset="0.25769231" />
+                    <stop
+                       id="stop27971"
+                       style="stop-color:#919191;stop-opacity:1"
+                       offset="0.7059449" />
+                    <stop
+                       id="stop27973"
+                       style="stop-color:#d2d2d2;stop-opacity:1"
+                       offset="0.73347497" />
+                    <stop
+                       id="stop49715"
+                       style="stop-color:#a6a6a6;stop-opacity:1"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="0.47450981"
+                     y1="0.21771218"
+                     x2="0.80392158"
+                     y2="0.5202952"
+                     id="linearGradient27976"
+                     xlink:href="#linearGradient2317" />
+                  <linearGradient
+                     id="linearGradient27978">
+                    <stop
+                       id="stop27980"
+                       style="stop-color:#ffffff;stop-opacity:1"
+                       offset="0" />
+                    <stop
+                       id="stop27982"
+                       style="stop-color:#ffffff;stop-opacity:0"
+                       offset="1" />
+                  </linearGradient>
+                  <linearGradient
+                     x1="0.41568628"
+                     y1="0.27687296"
+                     x2="0.59607846"
+                     y2="0.44299674"
+                     id="linearGradient27984"
+                     xlink:href="#linearGradient1513" />
+                  <radialGradient
+                     cx="0.5"
+                     cy="0.5"
+                     r="0.5"
+                     fx="0.38431373"
+                     fy="0.47619048"
+                     id="radialGradient27986"
+                     xlink:href="#linearGradient1918" />
+                  <linearGradient
+                     x1="0"
+                     y1="0.5"
+                     x2="1"
+                     y2="0.5"
+                     id="linearGradient27988"
+                     xlink:href="#linearGradient1845"
+                     gradientUnits="objectBoundingBox"
+                     spreadMethod="pad" />
+                  <radialGradient
+                     cx="0.5"
+                     cy="0.5"
+                     r="0.5"
+                     fx="0.50588238"
+                     fy="0.5"
+                     id="radialGradient27990"
+                     xlink:href="#linearGradient1918" />
+                  <linearGradient
+                     x1="0.54355544"
+                     y1="1.1365328"
+                     x2="0.36095273"
+                     y2="0.042242367"
+                     id="linearGradient27992"
+                     xlink:href="#linearGradient4111" />
+                </defs>
+              </defs>
+            </defs>
+          </defs>
+          <radialGradient
+             cx="41.875938"
+             cy="37.865574"
+             r="12.562782"
+             fx="38.969257"
+             fy="37.267345"
+             id="radialGradient28010"
+             xlink:href="#linearGradient4066"
+             gradientUnits="userSpaceOnUse" />
+          <defs
+             id="defs28012">
+            <linearGradient
+               id="linearGradient28014">
+              <stop
+                 id="stop28016"
+                 style="stop-color:#000000;stop-opacity:0.31638417"
+                 offset="0" />
+              <stop
+                 id="stop28018"
+                 style="stop-color:#000000;stop-opacity:0.07909604"
+                 offset="0.5" />
+              <stop
+                 id="stop28020"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <radialGradient
+               cx="0.5"
+               cy="0.5"
+               r="0.5"
+               fx="0.21951219"
+               fy="0.25"
+               id="radialGradient28022"
+               xlink:href="#linearGradient1918" />
+            <linearGradient
+               x1="0"
+               y1="0.5"
+               x2="1"
+               y2="0.5"
+               id="linearGradient28024"
+               xlink:href="#linearGradient2774"
+               gradientUnits="objectBoundingBox"
+               spreadMethod="pad" />
+            <linearGradient
+               id="linearGradient28026">
+              <stop
+                 id="stop28028"
+                 style="stop-color:#000000;stop-opacity:0.40784314"
+                 offset="0" />
+              <stop
+                 id="stop28030"
+                 style="stop-color:#000000;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient28032">
+              <stop
+                 id="stop28034"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop28036"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient28038">
+              <stop
+                 id="stop49749"
+                 style="stop-color:#000000;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop28041"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="0.99512196"
+               y1="0.64396286"
+               x2="0.32682925"
+               y2="0.3003096"
+               id="linearGradient28047"
+               xlink:href="#linearGradient1918" />
+            <linearGradient
+               x1="0.21960784"
+               y1="1.8369565"
+               x2="0.49411765"
+               y2="0.17391305"
+               id="linearGradient28049"
+               xlink:href="#linearGradient2122" />
+            <linearGradient
+               x1="-0.0070921984"
+               y1="-0.53947371"
+               x2="0.78823531"
+               y2="0.76666665"
+               id="linearGradient28051"
+               xlink:href="#linearGradient2122" />
+            <linearGradient
+               x1="3.6666667"
+               y1="0.296875"
+               x2="0.25925925"
+               y2="0.375"
+               id="linearGradient28053"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="0.71770334"
+               y1="0.140625"
+               x2="0.45933014"
+               y2="0.4765625"
+               id="linearGradient28055"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="0.74117649"
+               y1="0.040816326"
+               x2="0.70588237"
+               y2="0.45918366"
+               id="linearGradient28057"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="0.41568628"
+               y1="0.27687296"
+               x2="0.59607846"
+               y2="0.44299674"
+               id="linearGradient28059"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="1.3783784"
+               y1="0.25386998"
+               x2="0.58378381"
+               y2="0.13003096"
+               id="linearGradient28061"
+               xlink:href="#linearGradient2122" />
+            <linearGradient
+               x1="-0.10588235"
+               y1="-0.10497238"
+               x2="0.58431375"
+               y2="0.55248618"
+               id="linearGradient28063"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="-0.25352111"
+               y1="-0.109375"
+               x2="0.67605633"
+               y2="0.4609375"
+               id="linearGradient28065"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="-0.14213198"
+               y1="-0.28792569"
+               x2="0.49753696"
+               y2="0.35603714"
+               id="linearGradient28067"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="0.45882353"
+               y1="-0.58685446"
+               x2="0.65490198"
+               y2="0.45070422"
+               id="linearGradient28069"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="-0.0078431377"
+               y1="-1.244898"
+               x2="0.59607846"
+               y2="0.3605442"
+               id="linearGradient28071"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="0.3764706"
+               y1="-0.84042555"
+               x2="0.56078434"
+               y2="0.52127659"
+               id="linearGradient28073"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="-0.23645321"
+               y1="-0.5078125"
+               x2="0.36453202"
+               y2="0.6328125"
+               id="linearGradient28075"
+               xlink:href="#linearGradient1513" />
+            <linearGradient
+               x1="0.47450981"
+               y1="0.21771218"
+               x2="0.80392158"
+               y2="0.5202952"
+               id="linearGradient28077"
+               xlink:href="#linearGradient2317" />
+            <linearGradient
+               x1="0.90810812"
+               y1="0.55727553"
+               x2="0.49189189"
+               y2="0.44891641"
+               id="linearGradient28079"
+               xlink:href="#linearGradient2122" />
+            <radialGradient
+               cx="0.5"
+               cy="0.5"
+               r="0.5"
+               fx="0.38431373"
+               fy="0.47619048"
+               id="radialGradient28081"
+               xlink:href="#linearGradient1918" />
+          </defs>
+          <linearGradient
+             x1="184.78476"
+             y1="57.899975"
+             x2="140.56078"
+             y2="51.007587"
+             id="linearGradient28087"
+             xlink:href="#linearGradient2122"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.743874,0,0,1.344314,50,-150)" />
+          <linearGradient
+             x1="110.14813"
+             y1="26.185833"
+             x2="145.99422"
+             y2="61.882057"
+             id="linearGradient28089"
+             xlink:href="#linearGradient1513"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.734347,0,0,1.361754,50,-150)" />
+          <linearGradient
+             x1="69.358948"
+             y1="38.345039"
+             x2="78.468063"
+             y2="62.560368"
+             id="linearGradient28091"
+             xlink:href="#linearGradient1513"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.298814,0,0,0.769933,50,-150)" />
+          <linearGradient
+             x1="330.04102"
+             y1="37.053959"
+             x2="254.92361"
+             y2="38.776249"
+             id="linearGradient28093"
+             xlink:href="#linearGradient1513"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.440755,0,0,2.268834,50,-150)" />
+          <linearGradient
+             x1="87.17804"
+             y1="161.48409"
+             x2="95.870804"
+             y2="102.33855"
+             id="linearGradient28095"
+             xlink:href="#linearGradient2122"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.130709,0,0,0.884401,50,-150)" />
+          <linearGradient
+             x1="85.153625"
+             y1="144.6342"
+             x2="90.263031"
+             y2="164.62656"
+             id="linearGradient28097"
+             xlink:href="#linearGradient1513"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.257313,0,0,0.795347,100,-150)" />
+          <linearGradient
+             x1="182.22311"
+             y1="89.382622"
+             x2="142.08492"
+             y2="68.742538"
+             id="linearGradient28099"
+             xlink:href="#linearGradient4066"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.794082,0,0,1.259316,100,-150)" />
+          <linearGradient
+             x1="129.35207"
+             y1="35.074184"
+             x2="160.34494"
+             y2="66.275108"
+             id="linearGradient28101"
+             xlink:href="#linearGradient1513"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(0.766629,0,0,1.304412,100,-150)" />
+          <linearGradient
+             x1="69.358948"
+             y1="38.345039"
+             x2="78.468063"
+             y2="62.560368"
+             id="linearGradient28103"
+             xlink:href="#linearGradient1513"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.053415,0.75976,-0.450383,0.624461,184.0418,-192.118)" />
+          <linearGradient
+             x1="1.4050696"
+             y1="182.46344"
+             x2="62.191277"
+             y2="282.29065"
+             id="linearGradient28105"
+             xlink:href="#linearGradient2122"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.329536,0,0,0.35639,20.57572,14.10475)" />
+          <linearGradient
+             x1="106.69141"
+             y1="21.871695"
+             x2="117.74989"
+             y2="32.055485"
+             id="linearGradient28107"
+             xlink:href="#linearGradient1513"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.895098,1.117196)" />
+          <linearGradient
+             x1="65.040573"
+             y1="73.787125"
+             x2="77.333061"
+             y2="85.078453"
+             id="linearGradient28109"
+             xlink:href="#linearGradient2317"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(0.954815,1.047323)" />
+          <linearGradient
+             x1="23.800308"
+             y1="135.01959"
+             x2="33.550014"
+             y2="142.12923"
+             id="linearGradient28111"
+             xlink:href="#linearGradient2780"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.225045,0.816297)" />
+          <linearGradient
+             x1="-191.46153"
+             y1="37.372372"
+             x2="-165.58835"
+             y2="37.372372"
+             id="linearGradient28113"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.054093,0,0,0.948683,-6.818182,-12.27273)" />
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient28115"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <linearGradient
+             x1="-49.171364"
+             y1="121.40791"
+             x2="-160.71114"
+             y2="-157.53516"
+             id="linearGradient28117"
+             xlink:href="#linearGradient1700"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+          <linearGradient
+             x1="88.712402"
+             y1="138.15012"
+             x2="104.81104"
+             y2="151.63045"
+             id="linearGradient28119"
+             xlink:href="#linearGradient3305"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+          <radialGradient
+             cx="-77.367622"
+             cy="42.633839"
+             r="216.26619"
+             fx="-80.036034"
+             fy="44.468376"
+             id="radialGradient28121"
+             xlink:href="#linearGradient2678"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+          <linearGradient
+             x1="483.2298"
+             y1="97.833481"
+             x2="562.21454"
+             y2="1064.5424"
+             id="linearGradient28123"
+             xlink:href="#linearGradient1531"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(1.502271,0.665659)" />
+          <linearGradient
+             x1="360.48212"
+             y1="2746.856"
+             x2="339.39331"
+             y2="2606.2637"
+             id="linearGradient28125"
+             xlink:href="#linearGradient5274"
+             gradientUnits="userSpaceOnUse"
+             gradientTransform="scale(4.209444,0.237561)" />
+          <defs
+             id="defs28127">
+            <linearGradient
+               id="linearGradient28129">
+              <stop
+                 id="stop28131"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop28133"
+                 style="stop-color:#fafbff;stop-opacity:1"
+                 offset="0.25" />
+              <stop
+                 id="stop28135"
+                 style="stop-color:#f0f2fa;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop28137"
+                 style="stop-color:#e1e1e1;stop-opacity:1"
+                 offset="0.75" />
+              <stop
+                 id="stop28139"
+                 style="stop-color:#f5f6ff;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient28141">
+              <stop
+                 id="stop28143"
+                 style="stop-color:#ffffff;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop28145"
+                 style="stop-color:#d0d1d9;stop-opacity:1"
+                 offset="0.5" />
+              <stop
+                 id="stop28147"
+                 style="stop-color:#878b9b;stop-opacity:1"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               id="linearGradient28149">
+              <stop
+                 id="stop28151"
+                 style="stop-color:#e8e8e8;stop-opacity:1"
+                 offset="0" />
+              <stop
+                 id="stop28153"
+                 style="stop-color:#ffffff;stop-opacity:0"
+                 offset="1" />
+            </linearGradient>
+            <linearGradient
+               x1="-49.171364"
+               y1="121.40791"
+               x2="-160.71114"
+               y2="-157.53516"
+               id="linearGradient28155"
+               xlink:href="#linearGradient1700"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.4102,-11.41845)" />
+            <radialGradient
+               cx="-77.367622"
+               cy="42.633839"
+               r="216.26619"
+               fx="-80.036034"
+               fy="44.468376"
+               id="radialGradient28157"
+               xlink:href="#linearGradient1696"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.129931,0,0,1.110416,165.8648,-12.78208)" />
+            <defs
+               id="defs28159">
+              <linearGradient
+                 id="linearGradient49811">
+                <stop
+                   id="stop28162"
+                   style="stop-color:#ffffff;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop28164"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient28166">
+                <stop
+                   id="stop28168"
+                   style="stop-color:#000000;stop-opacity:0.14835165"
+                   offset="0" />
+                <stop
+                   id="stop28170"
+                   style="stop-color:#7f7f7f;stop-opacity:0.49803922"
+                   offset="0.5" />
+                <stop
+                   id="stop28172"
+                   style="stop-color:#bfbfbf;stop-opacity:0.24705882"
+                   offset="0.75" />
+                <stop
+                   id="stop28174"
+                   style="stop-color:#dfdfdf;stop-opacity:0.12156863"
+                   offset="0.875" />
+                <stop
+                   id="stop28176"
+                   style="stop-color:#ffffff;stop-opacity:0"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient28178">
+                <stop
+                   id="stop28180"
+                   style="stop-color:#b18e4b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop28182"
+                   style="stop-color:#f7dca0;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 x1="133.07144"
+                 y1="28.231943"
+                 x2="118.58411"
+                 y2="13.431207"
+                 id="linearGradient28184"
+                 xlink:href="#linearGradient1696"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(0.451279,0,0,1.782924,1.04579,2.663333)" />
+              <linearGradient
+                 x1="30.722504"
+                 y1="28.135216"
+                 x2="39.78149"
+                 y2="27.315481"
+                 id="linearGradient28186"
+                 xlink:href="#linearGradient2354"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="scale(0.475459,2.103232)" />
+              <radialGradient
+                 cx="4.9853168"
+                 cy="108.47158"
+                 r="34.222183"
+                 fx="5.2520976"
+                 fy="108.73115"
+                 id="radialGradient28188"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(14.85662,0,0,7.656836,118.7844,-641.5134)"
+                 spreadMethod="pad" />
+              <linearGradient
+                 x1="36.826332"
+                 y1="75.332558"
+                 x2="25.761681"
+                 y2="135.90358"
+                 id="linearGradient28190"
+                 xlink:href="#linearGradient2877"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(11.87105,0,0,9.582527,25.161,-508.7635)" />
+              <linearGradient
+                 x1="78.675774"
+                 y1="47.411823"
+                 x2="64.05336"
+                 y2="34.302757"
+                 id="linearGradient28192"
+                 xlink:href="#linearGradient4281"
+                 gradientUnits="userSpaceOnUse"
+                 gradientTransform="matrix(5.501372,0,0,20.67751,25.161,-508.7635)" />
+              <defs
+                 id="defs28194">
+                <linearGradient
+                   x1="0"
+                   y1="0.5"
+                   x2="1"
+                   y2="0.5"
+                   id="linearGradient28196"
+                   xlink:href="#linearGradient3296"
+                   gradientUnits="objectBoundingBox"
+                   spreadMethod="pad" />
+              </defs>
+            </defs>
+            <linearGradient
+               x1="88.712402"
+               y1="138.15012"
+               x2="104.81104"
+               y2="151.63045"
+               id="linearGradient28206"
+               xlink:href="#linearGradient3305"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="matrix(1.250935,0,0,0.807319,0,1.958743)" />
+            <defs
+               id="defs28208">
+              <linearGradient
+                 id="linearGradient28210">
+                <stop
+                   id="stop28212"
+                   style="stop-color:#533b2b;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop28214"
+                   style="stop-color:#ab7958;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+              <linearGradient
+                 id="linearGradient28216">
+                <stop
+                   id="stop28218"
+                   style="stop-color:#1a6e8e;stop-opacity:1"
+                   offset="0" />
+                <stop
+                   id="stop28220"
+                   style="stop-color:#c3efff;stop-opacity:1"
+                   offset="1" />
+              </linearGradient>
+            </defs>
+            <linearGradient
+               x1="483.2298"
+               y1="97.833481"
+               x2="562.21454"
+               y2="1064.5424"
+               id="linearGradient28226"
+               xlink:href="#linearGradient1531"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(1.502271,0.665659)" />
+            <linearGradient
+               x1="360.48212"
+               y1="2746.856"
+               x2="339.39331"
+               y2="2606.2637"
+               id="linearGradient28228"
+               xlink:href="#linearGradient5274"
+               gradientUnits="userSpaceOnUse"
+               gradientTransform="scale(4.209444,0.237561)" />
+          </defs>
+        </defs>
+        <linearGradient
+           x1="360.48212"
+           y1="2746.856"
+           x2="339.39331"
+           y2="2606.2637"
+           id="linearGradient28238"
+           xlink:href="#linearGradient5274"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="scale(4.209444,0.237561)" />
+        <linearGradient
+           x1="307.43765"
+           y1="234.53671"
+           x2="292.48148"
+           y2="245.30841"
+           id="linearGradient28240"
+           xlink:href="#linearGradient3936"
+           gradientUnits="userSpaceOnUse"
+           gradientTransform="matrix(0.847559,0,0,0.796411,18.7268,-73.96861)" />
+      </defs>
+    </defs>
+    <linearGradient
+       id="linearGradient4081">
+      <stop
+         id="stop4083"
+         style="stop-color:#2020f5;stop-opacity:1;"
+         offset="0" />
+      <stop
+         id="stop4085"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4098">
+      <stop
+         id="stop4100"
+         style="stop-color:#2020f5;stop-opacity:1;"
+         offset="0" />
+      <stop
+         id="stop32894"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient9136">
+      <stop
+         id="stop9138"
+         style="stop-color:#c8a3d7;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop9140"
+         style="stop-color:#c8a3d7;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient9152">
+      <stop
+         id="stop9154"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop32877"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="-237.74609"
+       y1="461.36819"
+       x2="-235.8683"
+       y2="461.36819"
+       id="XMLID_19_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,97.04008,97.04008,0,-44746.96,22979.78)">
+      <stop
+         id="stop35042"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop35044"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <mask
+       id="id2">
+      <linearGradient
+         x1="84.989304"
+         y1="182.80299"
+         x2="115.194"
+         y2="209.73199"
+         id="id3"
+         gradientUnits="userSpaceOnUse">
+        <stop
+           id="stop18"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop20"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <rect
+         width="60.581299"
+         height="53.826698"
+         x="69.800797"
+         y="169.354"
+         id="rect22"
+         style="fill:url(#id3)" />
+    </mask>
+    <mask
+       id="id0">
+      <linearGradient
+         x1="84.989304"
+         y1="93.043198"
+         x2="115.194"
+         y2="119.972"
+         id="id1"
+         gradientUnits="userSpaceOnUse">
+        <stop
+           id="stop5967"
+           style="stop-color:#ffffff;stop-opacity:1"
+           offset="0" />
+        <stop
+           id="stop12"
+           style="stop-color:#ffffff;stop-opacity:0"
+           offset="1" />
+      </linearGradient>
+      <rect
+         width="60.581299"
+         height="53.826698"
+         x="69.800797"
+         y="79.594398"
+         id="rect14"
+         style="fill:url(#id1)" />
+    </mask>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1291"
+       id="linearGradient16528"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.3316761,0,0,0.3316761,48.927852,9.2318583)"
+       x1="75.847473"
+       y1="79.6325"
+       x2="109.0923"
+       y2="124.12687" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9136"
+       id="linearGradient16604"
+       gradientUnits="userSpaceOnUse"
+       x1="-600"
+       y1="113"
+       x2="-555"
+       y2="113" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient9152"
+       id="linearGradient16606"
+       gradientUnits="userSpaceOnUse"
+       x1="-440"
+       y1="677.35333"
+       x2="-395"
+       y2="677.35333" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient16608"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-8.609336,-3.181296)"
+       x1="1532.1757"
+       y1="-1324.1742"
+       x2="1686.2981"
+       y2="-1843.0853" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4098"
+       id="linearGradient16610"
+       gradientUnits="userSpaceOnUse"
+       x1="-2921.3145"
+       y1="-3640.7598"
+       x2="-2435.4211"
+       y2="-4221.3647" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient16612"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-8.609336,-3.181296)"
+       x1="883.74811"
+       y1="-2317.053"
+       x2="413.91202"
+       y2="-2885.3936" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4098"
+       id="linearGradient16614"
+       gradientUnits="userSpaceOnUse"
+       x1="-2615.7144"
+       y1="-4105.0332"
+       x2="-3247.1111"
+       y2="-3614.7319" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4081"
+       id="linearGradient16616"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-8.609336,-3.181296)"
+       x1="883.74811"
+       y1="-2317.053"
+       x2="413.91202"
+       y2="-2885.3936" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4098"
+       id="linearGradient16618"
+       gradientUnits="userSpaceOnUse"
+       x1="-2615.7144"
+       y1="-4105.0332"
+       x2="-3247.1111"
+       y2="-3614.7319" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient34137"
+       id="linearGradient20064"
+       gradientUnits="userSpaceOnUse"
+       x1="-77.844841"
+       y1="5.1423945"
+       x2="-77.844841"
+       y2="14.276564" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#XMLID_19_"
+       id="linearGradient16647"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,111.10418,111.10418,0,-49765.5,25278.697)"
+       x1="-237.74609"
+       y1="461.36819"
+       x2="-235.8683"
+       y2="461.36819" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1884"
+       id="linearGradient16649"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.475459,2.103232)"
+       x1="30.722504"
+       y1="28.135216"
+       x2="39.78149"
+       y2="27.315481" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1884"
+       id="linearGradient16651"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(0.475459,2.103231)"
+       x1="25.954844"
+       y1="25.071495"
+       x2="39.781502"
+       y2="27.315489" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1302"
+       id="linearGradient16653"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.3266077,0.7538023)"
+       spreadMethod="pad"
+       x1="17.21314"
+       y1="81.92981"
+       x2="94.640472"
+       y2="81.92981" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8662"
+       id="radialGradient16655"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.536723,0,16.87306)"
+       cx="24.837126"
+       cy="36.421127"
+       fx="24.837126"
+       fy="36.421127"
+       r="15.644737" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4098"
+       id="linearGradient16669"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1929179,0.07847962,-0.1935223,0.07697718,-73.464826,663.03339)"
+       x1="-2921.3145"
+       y1="-3640.7598"
+       x2="-2435.4211"
+       y2="-4221.3647" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1513"
+       id="linearGradient17570"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(4.3872723e-4,-17.091915)"
+       x1="131.52188"
+       y1="198.01724"
+       x2="131.52188"
+       y2="41.586746" />
+    <inkscape:perspective
+       id="perspective4806"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="linearGradient3256-3">
+      <stop
+         id="stop3258-8"
+         style="stop-color:#3d9cde;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3260-4"
+         style="stop-color:#3d9cde;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5083-0">
+      <stop
+         id="stop5085-5"
+         style="stop-color:#df6e6e;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop5097-1"
+         style="stop-color:#df6e6e;stop-opacity:1"
+         offset="0.36000001" />
+      <stop
+         id="stop5087-8"
+         style="stop-color:#fbcaca;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2345-2">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2347-6" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2349-8" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1930-3">
+      <stop
+         id="stop1931-0"
+         style="stop-color:#ff9870;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1932-7"
+         style="stop-color:#ffd8c9;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2355-1">
+      <stop
+         id="stop2359-8"
+         style="stop-color:#b18e4b;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2358-6"
+         style="stop-color:#f7dca0;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3970-8">
+      <stop
+         id="stop3971-3"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3972-4"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2560-7">
+      <stop
+         id="stop2562-3"
+         style="stop-color:#868686;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2561-6"
+         style="stop-color:#e2e2e2;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient13427">
+      <stop
+         id="stop13429"
+         style="stop-color:#868686;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop13431"
+         style="stop-color:#e2e2e2;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1884-1">
+      <stop
+         id="stop1886-4"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1885-9"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient13438">
+      <stop
+         id="stop13440"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop13442"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient13445">
+      <stop
+         id="stop13447"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop13449"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       y2="88.438019"
+       x2="452.19373"
+       y1="275.58682"
+       x1="385.11563"
+       gradientTransform="matrix(0.996701,-0.0811618,0.0811618,0.996701,-17.9181,36.064)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient16088"
+       xlink:href="#linearGradient15945"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="118.20501"
+       x2="197.23351"
+       y1="669.37799"
+       x1="397.16879"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient16086"
+       xlink:href="#linearGradient15934"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="matrix(0.996701,-8.11618e-2,8.11618e-2,0.996701,-17.9181,36.064)"
+       gradientUnits="userSpaceOnUse"
+       y2="88.438019"
+       x2="452.19373"
+       y1="275.58682"
+       x1="385.11563"
+       id="linearGradient15951"
+       xlink:href="#linearGradient15945"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="118.20501"
+       x2="197.23351"
+       y1="669.37799"
+       x1="397.16879"
+       id="linearGradient15940"
+       xlink:href="#linearGradient15934"
+       inkscape:collect="always" />
+    <inkscape:perspective
+       id="perspective15420"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="linearGradient15934"
+       inkscape:collect="always">
+      <stop
+         id="stop15936"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938"
+         offset="1"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient15945"
+       inkscape:collect="always">
+      <stop
+         id="stop15947"
+         offset="0"
+         style="stop-color: rgb(179, 179, 179); stop-opacity: 1;" />
+      <stop
+         id="stop15949"
+         offset="1"
+         style="stop-color: rgb(179, 179, 179); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934"
+       id="linearGradient14264"
+       gradientUnits="userSpaceOnUse"
+       x1="397.16879"
+       y1="669.37799"
+       x2="197.23351"
+       y2="118.20501" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15945"
+       id="linearGradient14266"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.996701,-0.0811618,0.0811618,0.996701,-17.9181,36.064)"
+       x1="385.11563"
+       y1="275.58682"
+       x2="452.19373"
+       y2="88.438019" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1"
+       id="linearGradient14264-5"
+       gradientUnits="userSpaceOnUse"
+       x1="438.95389"
+       y1="493.53238"
+       x2="197.23351"
+       y2="118.20501" />
+    <linearGradient
+       id="linearGradient15934-1">
+      <stop
+         id="stop15936-4"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15945-8"
+       id="linearGradient14266-6"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.996701,-0.0811618,0.0811618,0.996701,-17.9181,36.064)"
+       x1="385.11563"
+       y1="275.58682"
+       x2="452.19373"
+       y2="88.438019" />
+    <linearGradient
+       id="linearGradient15945-8">
+      <stop
+         id="stop15947-9"
+         offset="0"
+         style="stop-color: rgb(179, 179, 179); stop-opacity: 1;" />
+      <stop
+         id="stop15949-1"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1"
+       id="linearGradient15173"
+       x1="499.05939"
+       y1="183.47643"
+       x2="504.08276"
+       y2="181.73146"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-6.2575321,5.050595)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-9"
+       id="linearGradient14264-0"
+       gradientUnits="userSpaceOnUse"
+       x1="397.16879"
+       y1="669.37799"
+       x2="197.23351"
+       y2="118.20501" />
+    <linearGradient
+       id="linearGradient15934-9"
+       inkscape:collect="always">
+      <stop
+         id="stop15936-9"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-98"
+         offset="1"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15945-6"
+       id="linearGradient14266-9"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.996701,-0.0811618,0.0811618,0.996701,-17.9181,36.064)"
+       x1="385.11563"
+       y1="275.58682"
+       x2="452.19373"
+       y2="88.438019" />
+    <linearGradient
+       id="linearGradient15945-6"
+       inkscape:collect="always">
+      <stop
+         id="stop15947-5"
+         offset="0"
+         style="stop-color: rgb(179, 179, 179); stop-opacity: 1;" />
+      <stop
+         id="stop15949-3"
+         offset="1"
+         style="stop-color: rgb(179, 179, 179); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-3"
+       id="linearGradient15173-8"
+       x1="499.05939"
+       y1="183.47643"
+       x2="504.08276"
+       y2="181.73146"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient15934-1-3"
+       inkscape:collect="always">
+      <stop
+         id="stop15936-4-7"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-6"
+         offset="1"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       y2="181.73146"
+       x2="504.08276"
+       y1="183.47643"
+       x1="499.05939"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient15271"
+       xlink:href="#linearGradient15934-1-3"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="181.73146"
+       x2="504.08276"
+       y1="183.47643"
+       x1="499.05939"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient15271-7"
+       xlink:href="#linearGradient15934-1-3-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient15934-1-3-3"
+       inkscape:collect="always">
+      <stop
+         id="stop15936-4-7-9"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-6-8"
+         offset="1"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       y2="181.73146"
+       x2="504.08276"
+       y1="183.47643"
+       x1="499.05939"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient15308"
+       xlink:href="#linearGradient15934-1-3-3"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1"
+       id="linearGradient15327"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-6.2575321,5.050595)"
+       x1="499.05939"
+       y1="183.47643"
+       x2="504.08276"
+       y2="181.73146" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1"
+       id="linearGradient15334"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-6.2575321,5.050595)"
+       x1="502.57938"
+       y1="184.1432"
+       x2="499.96594"
+       y2="179.73331" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1"
+       id="linearGradient15336"
+       gradientUnits="userSpaceOnUse"
+       x1="501.00095"
+       y1="185.08093"
+       x2="502.98251"
+       y2="179.90973" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-9"
+       id="linearGradient15336-5"
+       gradientUnits="userSpaceOnUse"
+       x1="501.00095"
+       y1="185.08093"
+       x2="502.98251"
+       y2="179.90973" />
+    <linearGradient
+       id="linearGradient15934-1-9">
+      <stop
+         id="stop15936-4-3"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-2"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="179.90973"
+       x2="502.98251"
+       y1="185.08093"
+       x1="501.00095"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient15353"
+       xlink:href="#linearGradient15934-1-9"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="179.90973"
+       x2="502.98251"
+       y1="185.08093"
+       x1="501.00095"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient15353-8"
+       xlink:href="#linearGradient15934-1-9-6"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient15934-1-9-6">
+      <stop
+         id="stop15936-4-3-9"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-2-4"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="179.90973"
+       x2="502.98251"
+       y1="185.08093"
+       x1="501.00095"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient15387"
+       xlink:href="#linearGradient15934-1-9-6"
+       inkscape:collect="always"
+       gradientTransform="matrix(0.31018135,0.06837356,-0.06837356,0.31018135,350.04365,90.757625)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-9-6"
+       id="linearGradient15409"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.31018135,0.06837356,-0.06837356,0.31018135,350.04365,90.753719)"
+       x1="501.00095"
+       y1="185.08093"
+       x2="502.98251"
+       y2="179.90973" />
+    <linearGradient
+       y2="179.90973"
+       x2="502.98251"
+       y1="185.08093"
+       x1="501.00095"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient15353-2"
+       xlink:href="#linearGradient15934-1-9-2"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient15934-1-9-2">
+      <stop
+         id="stop15936-4-3-5"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-2-1"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="179.90973"
+       x2="502.98251"
+       y1="185.08093"
+       x1="501.00095"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient15426"
+       xlink:href="#linearGradient15934-1-9-2"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-9-6"
+       id="linearGradient15446"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.31018135,0.06837356,-0.06837356,0.31018135,350.04365,90.753719)"
+       x1="500.08212"
+       y1="185.71164"
+       x2="496.25415"
+       y2="181.49362" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-9"
+       id="linearGradient15474"
+       gradientUnits="userSpaceOnUse"
+       x1="501.00095"
+       y1="185.08093"
+       x2="502.98251"
+       y2="179.90973" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-9-6"
+       id="linearGradient15476"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.31018135,0.06837356,-0.06837356,0.31018135,350.04365,90.753719)"
+       x1="500.08212"
+       y1="185.71164"
+       x2="496.25415"
+       y2="181.49362" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient34137-1"
+       id="linearGradient20956-0"
+       gradientUnits="userSpaceOnUse"
+       x1="-77.844841"
+       y1="5.1423945"
+       x2="-77.844841"
+       y2="14.276564" />
+    <linearGradient
+       id="linearGradient34137-1">
+      <stop
+         id="stop34139-3"
+         style="stop-color:#80bd2b;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop34141-3"
+         style="stop-color:#b1d68e;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient17625">
+      <stop
+         id="stop17627"
+         style="stop-color:#80bd2b;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop17629"
+         style="stop-color:#b1d68e;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1908-2">
+      <stop
+         id="stop1909-2"
+         style="stop-color:#884631;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3698-2"
+         style="stop-color:#df421e;stop-opacity:1"
+         offset="0.625" />
+      <stop
+         id="stop3699-4"
+         style="stop-color:#efa08e;stop-opacity:1"
+         offset="0.8125" />
+      <stop
+         id="stop1910-7"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient17638">
+      <stop
+         id="stop17640"
+         style="stop-color:#80bd2b;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop17642"
+         style="stop-color:#b1d68e;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient34137-1"
+       id="linearGradient20954-8"
+       gradientUnits="userSpaceOnUse"
+       x1="-77.844841"
+       y1="5.1423945"
+       x2="-77.844841"
+       y2="14.276564" />
+    <linearGradient
+       id="linearGradient17645">
+      <stop
+         id="stop17647"
+         style="stop-color:#80bd2b;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop17649"
+         style="stop-color:#b1d68e;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3256-7">
+      <stop
+         id="stop3258-8-7"
+         style="stop-color:#3d9cde;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3260-6"
+         style="stop-color:#3d9cde;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5083-0-5">
+      <stop
+         id="stop5085-6"
+         style="stop-color:#df6e6e;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop5097-4"
+         style="stop-color:#df6e6e;stop-opacity:1"
+         offset="0.36000001" />
+      <stop
+         id="stop5087-3"
+         style="stop-color:#fbcaca;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2345-5">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2347-8" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2349-1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1930-9">
+      <stop
+         id="stop1931-3"
+         style="stop-color:#ff9870;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1932-0"
+         style="stop-color:#ffd8c9;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2355-6">
+      <stop
+         id="stop2359-4"
+         style="stop-color:#b18e4b;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2358-3"
+         style="stop-color:#f7dca0;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3970-6">
+      <stop
+         id="stop3971-7"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3972-0"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2560-1">
+      <stop
+         id="stop2562-9"
+         style="stop-color:#868686;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2561-8"
+         style="stop-color:#e2e2e2;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient17681">
+      <stop
+         id="stop17683"
+         style="stop-color:#868686;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop17685"
+         style="stop-color:#e2e2e2;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1884-0">
+      <stop
+         id="stop1886-1"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1885-5"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient17692">
+      <stop
+         id="stop17694"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop17696"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient17699">
+      <stop
+         id="stop17701"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop17703"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5175-3"
+       id="linearGradient18288"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-40,0)"
+       x1="0"
+       y1="1"
+       x2="15"
+       y2="16" />
+    <linearGradient
+       id="linearGradient5175-3">
+      <stop
+         style="stop-color:#bdcccd;stop-opacity:1;"
+         offset="0"
+         id="stop5177-6" />
+      <stop
+         style="stop-color:#7979ff;stop-opacity:1;"
+         offset="1"
+         id="stop5179-73" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5175-3-3"
+       id="linearGradient18288-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-40,0)"
+       x1="0"
+       y1="1"
+       x2="15"
+       y2="16" />
+    <linearGradient
+       id="linearGradient5175-3-3">
+      <stop
+         style="stop-color:#bdcccd;stop-opacity:1;"
+         offset="0"
+         id="stop5177-6-2" />
+      <stop
+         style="stop-color:#7979ff;stop-opacity:1;"
+         offset="1"
+         id="stop5179-73-7" />
+    </linearGradient>
+    <linearGradient
+       y2="16"
+       x2="15"
+       y1="1"
+       x1="0"
+       gradientTransform="translate(-40,0)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient13249"
+       xlink:href="#linearGradient5175-3-3"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934"
+       id="linearGradient13302"
+       gradientUnits="userSpaceOnUse"
+       x1="397.16879"
+       y1="669.37799"
+       x2="197.23351"
+       y2="118.20501" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15945"
+       id="linearGradient13304"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.996701,-0.0811618,0.0811618,0.996701,-17.9181,36.064)"
+       x1="385.11563"
+       y1="275.58682"
+       x2="452.19373"
+       y2="88.438019" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-6"
+       id="linearGradient15515-4"
+       gradientUnits="userSpaceOnUse"
+       x1="438.95389"
+       y1="493.53238"
+       x2="197.23351"
+       y2="118.20501" />
+    <linearGradient
+       id="linearGradient15934-1-6">
+      <stop
+         id="stop15936-4-1"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-1"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15945-8-2"
+       id="linearGradient15517-6"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.996701,-0.0811618,0.0811618,0.996701,-17.9181,36.064)"
+       x1="385.11563"
+       y1="275.58682"
+       x2="452.19373"
+       y2="88.438019" />
+    <linearGradient
+       id="linearGradient15945-8-2">
+      <stop
+         id="stop15947-9-8"
+         offset="0"
+         style="stop-color: rgb(179, 179, 179); stop-opacity: 1;" />
+      <stop
+         id="stop15949-1-6"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-6"
+       id="linearGradient15519-9"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-6.2575321,5.050595)"
+       x1="502.57938"
+       y1="184.1432"
+       x2="499.96594"
+       y2="179.73331" />
+    <linearGradient
+       id="linearGradient13082">
+      <stop
+         id="stop13084"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop13086"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-6"
+       id="linearGradient15521-8"
+       gradientUnits="userSpaceOnUse"
+       x1="501.00095"
+       y1="185.08093"
+       x2="502.98251"
+       y2="179.90973" />
+    <linearGradient
+       id="linearGradient13089">
+      <stop
+         id="stop13091"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop13093"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-9-3"
+       id="linearGradient15523-5"
+       gradientUnits="userSpaceOnUse"
+       x1="501.00095"
+       y1="185.08093"
+       x2="502.98251"
+       y2="179.90973" />
+    <linearGradient
+       id="linearGradient15934-1-9-3">
+      <stop
+         id="stop15936-4-3-91"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-2-9"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-9-6-5"
+       id="linearGradient15525-5"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.31018135,0.06837356,-0.06837356,0.31018135,350.04365,90.753719)"
+       x1="500.08212"
+       y1="185.71164"
+       x2="496.25415"
+       y2="181.49362" />
+    <linearGradient
+       id="linearGradient15934-1-9-6-5">
+      <stop
+         id="stop15936-4-3-9-6"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-2-4-6"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3256-3-7">
+      <stop
+         id="stop3258-8-1"
+         style="stop-color:#3d9cde;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3260-4-5"
+         style="stop-color:#3d9cde;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5083-0-2">
+      <stop
+         id="stop5085-5-3"
+         style="stop-color:#df6e6e;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop5097-1-0"
+         style="stop-color:#df6e6e;stop-opacity:1"
+         offset="0.36000001" />
+      <stop
+         id="stop5087-8-7"
+         style="stop-color:#fbcaca;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2345-2-5">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2347-6-4" />
+      <stop
+         style="stop-color:#f0f0f0;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2349-8-6" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1930-3-5">
+      <stop
+         id="stop1931-0-0"
+         style="stop-color:#ff9870;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1932-7-0"
+         style="stop-color:#ffd8c9;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2355-1-8">
+      <stop
+         id="stop2359-8-6"
+         style="stop-color:#b18e4b;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2358-6-8"
+         style="stop-color:#f7dca0;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3970-8-4">
+      <stop
+         id="stop3971-3-3"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3972-4-7"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2560-7-5">
+      <stop
+         id="stop2562-3-4"
+         style="stop-color:#868686;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop2561-6-0"
+         style="stop-color:#e2e2e2;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient13133">
+      <stop
+         id="stop13135"
+         style="stop-color:#868686;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop13137"
+         style="stop-color:#e2e2e2;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1884-1-7">
+      <stop
+         id="stop1886-4-2"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1885-9-3"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient13144">
+      <stop
+         id="stop13146"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop13148"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient13151">
+      <stop
+         id="stop13153"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop13155"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1513-2"
+       id="linearGradient17570-2"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.08604141,0,0,0.08604141,553.37039,162.12298)"
+       x1="131.52188"
+       y1="198.01724"
+       x2="131.52188"
+       y2="41.586746" />
+    <linearGradient
+       id="linearGradient1513-2">
+      <stop
+         id="stop1514-3"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1515-2"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1513-2"
+       id="linearGradient13669"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.08604141,0,0,0.08604141,553.38144,142.10088)"
+       x1="131.52188"
+       y1="198.01724"
+       x2="131.52188"
+       y2="41.586746" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1513-2"
+       id="linearGradient13680"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.08604141,0,0,0.08604141,553.38144,142.10088)"
+       x1="131.52188"
+       y1="198.01724"
+       x2="131.52188"
+       y2="41.586746" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1513-2"
+       id="linearGradient13690"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.08604141,0,0,0.08604141,553.38144,142.10088)"
+       x1="131.52188"
+       y1="198.01724"
+       x2="131.52188"
+       y2="41.586746" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1"
+       id="linearGradient13602"
+       gradientUnits="userSpaceOnUse"
+       x1="438.95389"
+       y1="493.53238"
+       x2="197.23351"
+       y2="118.20501" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15945-8"
+       id="linearGradient13604"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.996701,-0.0811618,0.0811618,0.996701,-17.9181,36.064)"
+       x1="385.11563"
+       y1="275.58682"
+       x2="452.19373"
+       y2="88.438019" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1"
+       id="linearGradient13606"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-6.2575321,5.050595)"
+       x1="502.57938"
+       y1="184.1432"
+       x2="499.96594"
+       y2="179.73331" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1"
+       id="linearGradient13608"
+       gradientUnits="userSpaceOnUse"
+       x1="501.00095"
+       y1="185.08093"
+       x2="502.98251"
+       y2="179.90973" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-9"
+       id="linearGradient13610"
+       gradientUnits="userSpaceOnUse"
+       x1="501.00095"
+       y1="185.08093"
+       x2="502.98251"
+       y2="179.90973" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-9-6"
+       id="linearGradient13612"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.31018135,0.06837356,-0.06837356,0.31018135,350.04365,90.753719)"
+       x1="500.08212"
+       y1="185.71164"
+       x2="496.25415"
+       y2="181.49362" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3256-3"
+       id="linearGradient13614"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.044357,0.957527)"
+       x1="591.27606"
+       y1="330.16998"
+       x2="620.33301"
+       y2="382.54678" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5083-0"
+       id="linearGradient13616"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1929605,-0.00426242,0.00585233,0.1786386,680.44209,227.41631)"
+       x1="566.74347"
+       y1="415.15009"
+       x2="588.13922"
+       y2="458.04449" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2345-2"
+       id="linearGradient13618"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.08313961,-0.03722276,-0.03243445,0.0934943,693.52705,270.28905)"
+       x1="100.76616"
+       y1="77.379333"
+       x2="125.25793"
+       y2="77.379333" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1930-3"
+       id="linearGradient13620"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.07819037,-0.03500718,-0.03448742,0.09941203,684.96091,272.7873)"
+       x1="10.145814"
+       y1="21.762129"
+       x2="19.678274"
+       y2="15.811033" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2355-1"
+       id="linearGradient13622"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.00952271,-0.00152943,-0.8372982,1.5053504,699.75234,263.84813)"
+       x1="1270.3132"
+       y1="4.8765283"
+       x2="1247.6848"
+       y2="0.72310239" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3970-8"
+       id="linearGradient13624"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2028254,-0.00448039,0.00556771,0.1699505,680.44209,227.41631)"
+       x1="-94.151642"
+       y1="379.97745"
+       x2="-100.4097"
+       y2="374.03232" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2560-7"
+       id="linearGradient13626"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.1217387,-0.01955224,-0.06549549,0.1177522,699.8779,263.8683)"
+       spreadMethod="reflect"
+       x1="97.345161"
+       y1="112.84396"
+       x2="99.20697"
+       y2="115.81121" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2560-7"
+       id="linearGradient13628"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1839072,-0.00406245,0.0061405,0.1874324,680.55604,227.23529)"
+       x1="-13.15085"
+       y1="250.48668"
+       x2="-5.590662"
+       y2="258.31036" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1884-1"
+       id="linearGradient13630"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.0874385,-0.01404345,-0.09118816,0.1639442,699.8779,263.8683)"
+       x1="240.97612"
+       y1="200.61511"
+       x2="231.89941"
+       y2="205.45764" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1884-1"
+       id="linearGradient13632"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2064601,-0.00456044,0.00503988,0.1538412,680.41644,232.74127)"
+       x1="7.1050277"
+       y1="221.98289"
+       x2="46.488174"
+       y2="259.94464" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1884-1"
+       id="linearGradient13634"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2064601,-0.00456044,0.00503988,0.1538412,682.71501,230.6378)"
+       x1="7.1050277"
+       y1="221.98289"
+       x2="46.488174"
+       y2="259.94464" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3256"
+       id="linearGradient13636"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.044357,0.957527)"
+       x1="591.27606"
+       y1="330.16998"
+       x2="620.33301"
+       y2="382.54678" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5083"
+       id="linearGradient13638"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1929605,-0.00426242,0.00585233,0.1786386,680.44209,227.41631)"
+       x1="566.74347"
+       y1="415.15009"
+       x2="588.13922"
+       y2="458.04449" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2345"
+       id="linearGradient13640"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.08313961,-0.03722276,-0.03243445,0.0934943,693.52705,270.28905)"
+       x1="100.76616"
+       y1="77.379333"
+       x2="125.25793"
+       y2="77.379333" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1930"
+       id="linearGradient13642"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.07819037,-0.03500718,-0.03448742,0.09941203,684.96091,272.7873)"
+       x1="10.145814"
+       y1="21.762129"
+       x2="19.678274"
+       y2="15.811033" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2355"
+       id="linearGradient13644"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.00952271,-0.00152943,-0.8372982,1.5053504,699.75234,263.84813)"
+       x1="1270.3132"
+       y1="4.8765283"
+       x2="1247.6848"
+       y2="0.72310239" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3970"
+       id="linearGradient13646"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2028254,-0.00448039,0.00556771,0.1699505,680.44209,227.41631)"
+       x1="-94.151642"
+       y1="379.97745"
+       x2="-100.40970"
+       y2="374.03232" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2560"
+       id="linearGradient13648"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.1217387,-0.01955224,-0.06549549,0.1177522,699.8779,263.8683)"
+       spreadMethod="reflect"
+       x1="97.345161"
+       y1="112.84396"
+       x2="99.206970"
+       y2="115.81121" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2560"
+       id="linearGradient13650"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1839072,-0.00406245,0.0061405,0.1874324,680.55604,227.23529)"
+       x1="-13.150850"
+       y1="250.48668"
+       x2="-5.5906620"
+       y2="258.31036" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1884"
+       id="linearGradient13652"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.0874385,-0.01404345,-0.09118816,0.1639442,699.8779,263.8683)"
+       x1="240.97612"
+       y1="200.61511"
+       x2="231.89941"
+       y2="205.45764" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1884"
+       id="linearGradient13654"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2064601,-0.00456044,0.00503988,0.1538412,680.41644,232.74127)"
+       x1="7.1050277"
+       y1="221.98289"
+       x2="46.488174"
+       y2="259.94464" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1884"
+       id="linearGradient13656"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.2064601,-0.00456044,0.00503988,0.1538412,682.71501,230.6378)"
+       x1="7.1050277"
+       y1="221.98289"
+       x2="46.488174"
+       y2="259.94464" />
+    <linearGradient
+       id="linearGradient9136-0">
+      <stop
+         id="stop9138-1"
+         style="stop-color:#c8a3d7;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop9140-6"
+         style="stop-color:#c8a3d7;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient9152-1">
+      <stop
+         id="stop9154-8"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop32877-6"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4081-1">
+      <stop
+         id="stop4083-9"
+         style="stop-color:#2020f5;stop-opacity:1;"
+         offset="0" />
+      <stop
+         id="stop4085-5"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4098-6">
+      <stop
+         id="stop4100-5"
+         style="stop-color:#2020f5;stop-opacity:1;"
+         offset="0" />
+      <stop
+         id="stop32894-2"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient13685">
+      <stop
+         id="stop13687"
+         style="stop-color:#2020f5;stop-opacity:1;"
+         offset="0" />
+      <stop
+         id="stop13689"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient13692">
+      <stop
+         id="stop13694"
+         style="stop-color:#2020f5;stop-opacity:1;"
+         offset="0" />
+      <stop
+         id="stop13696"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient13699">
+      <stop
+         id="stop13701"
+         style="stop-color:#2020f5;stop-opacity:1;"
+         offset="0" />
+      <stop
+         id="stop13703"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient13706">
+      <stop
+         id="stop13708"
+         style="stop-color:#2020f5;stop-opacity:1;"
+         offset="0" />
+      <stop
+         id="stop13710"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="-237.74609"
+       y1="461.36819"
+       x2="-235.8683"
+       y2="461.36819"
+       id="XMLID_19_-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,97.04008,97.04008,0,-44746.96,22979.78)">
+      <stop
+         id="stop35042-6"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop35044-8"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient13717">
+      <stop
+         id="stop13719"
+         style="stop-color:#2020f5;stop-opacity:1;"
+         offset="0" />
+      <stop
+         id="stop13721"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1884-4">
+      <stop
+         id="stop1886-8"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1885-4"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient13728">
+      <stop
+         id="stop13730"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop13732"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1302-6">
+      <stop
+         id="stop1304-8"
+         style="stop-color:#ffbc96;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1303-5"
+         style="stop-color:#ffeafe;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8662-8">
+      <stop
+         id="stop8664-6"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop8666-2"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3773"
+       id="linearGradient5274-7"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36202,0,0,0.36792,8.2405,6.3535)"
+       x1="23.997"
+       y1="15.5"
+       x2="-0.073089004"
+       y2="15.5" />
+    <linearGradient
+       id="linearGradient3773"
+       y2="15.5"
+       gradientUnits="userSpaceOnUse"
+       x2="-0.073089004"
+       gradientTransform="matrix(0.36202,0,0,0.36792,8.2405,6.3535)"
+       y1="15.5"
+       x1="23.997">
+      <stop
+         id="stop3700-2"
+         style="stop-color:#ce7ecc"
+         offset="0" />
+      <stop
+         id="stop3702"
+         style="stop-color:#c056bc;stop-opacity:.81569"
+         offset=".76279" />
+      <stop
+         id="stop3704-9"
+         style="stop-color:#f8c9f7;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3775-4"
+       id="linearGradient5276"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.36202,0,0,0.36792,8.2405,6.3535)"
+       x1="36.5"
+       y1="36"
+       x2="-0.097514004"
+       y2="36" />
+    <linearGradient
+       id="linearGradient3775-4"
+       y2="36"
+       gradientUnits="userSpaceOnUse"
+       x2="-0.097514004"
+       gradientTransform="matrix(0.36202,0,0,0.36792,8.2405,6.3535)"
+       y1="36"
+       x1="36.5">
+      <stop
+         id="stop3916"
+         style="stop-color:#c02cbb"
+         offset="0" />
+      <stop
+         id="stop3918-0"
+         style="stop-color:#b329ae;stop-opacity:.49804"
+         offset=".79722" />
+      <stop
+         id="stop3920"
+         style="stop-color:#982394;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3779-2"
+       id="linearGradient5278-1"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-0.43118,0.42426,0,8.8859,25.258)"
+       x1="20.483999"
+       y1="12.82"
+       x2="20.483999"
+       y2="-0.43753999" />
+    <linearGradient
+       id="linearGradient3779-2"
+       y2="-0.43753999"
+       gradientUnits="userSpaceOnUse"
+       x2="20.483999"
+       gradientTransform="matrix(0,-0.43118,0.42426,0,8.8859,25.258)"
+       y1="12.82"
+       x1="20.483999">
+      <stop
+         id="stop2189-5"
+         style="stop-color:#fff;stop-opacity:.64341"
+         offset="0" />
+      <stop
+         id="stop2191"
+         style="stop-color:#fff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       y2="-0.43753999"
+       x2="20.483999"
+       y1="12.82"
+       x1="20.483999"
+       gradientTransform="matrix(0,-0.43118,0.42426,0,8.8859,25.258)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5877"
+       xlink:href="#linearGradient3779-2"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="26.71875"
+       x2="38.826412"
+       y1="26.71875"
+       x1="9.3030529"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient32255"
+       xlink:href="#linearGradient9910"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="56.575912"
+       x2="37.969398"
+       y1="14.004482"
+       x1="17.160095"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient32252"
+       xlink:href="#linearGradient2682"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="37.760422"
+       x2="15.428915"
+       y1="19.500000"
+       x1="16.071430"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-152.982,9.37161)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient32248"
+       xlink:href="#linearGradient6924"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="25.428572"
+       y1="21.857143"
+       xlink:href="#linearGradient4206"
+       x2="25.207588"
+       x1="25.064732"
+       inkscape:collect="always"
+       id="linearGradient33204"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       y2="26.71875"
+       y1="26.71875"
+       xlink:href="#linearGradient9910"
+       x2="38.826412"
+       x1="9.3030529"
+       inkscape:collect="always"
+       id="linearGradient33202"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       y2="56.575912"
+       y1="14.004482"
+       xlink:href="#linearGradient2682"
+       x2="37.969398"
+       x1="17.160095"
+       inkscape:collect="always"
+       id="linearGradient33199"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       y2="30.000000"
+       y1="19.500000"
+       xlink:href="#linearGradient6924"
+       x2="15.785715"
+       x1="16.071430"
+       inkscape:collect="always"
+       id="linearGradient33195"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-152.982,9.37161)" />
+    <linearGradient
+       y2="30.000000"
+       y1="19.500000"
+       xlink:href="#linearGradient6924"
+       x2="15.785715"
+       x1="16.071430"
+       inkscape:collect="always"
+       id="linearGradient33192"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-152.982,9.37161)" />
+    <linearGradient
+       y2="13.284962"
+       y1="16.525082"
+       xlink:href="#linearGradient6932"
+       x2="24"
+       x1="24"
+       inkscape:collect="always"
+       id="linearGradient33190"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y2="56.575912"
+       y1="14.004482"
+       xlink:href="#linearGradient2682"
+       x2="37.969398"
+       x1="17.160095"
+       inkscape:collect="always"
+       id="linearGradient33188"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       y2="25.428572"
+       y1="21.857143"
+       xlink:href="#linearGradient4206"
+       x2="25.207588"
+       x1="25.064732"
+       inkscape:collect="always"
+       id="linearGradient33186"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       y2="26.71875"
+       y1="26.71875"
+       xlink:href="#linearGradient9910"
+       x2="38.826412"
+       x1="9.3030529"
+       inkscape:collect="always"
+       id="linearGradient33184"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <radialGradient
+       xlink:href="#linearGradient2265-1"
+       r="17.142857"
+       inkscape:collect="always"
+       id="radialGradient33182"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5,0,20)"
+       fy="40"
+       fx="23.857143"
+       cy="40"
+       cx="23.857143" />
+    <linearGradient
+       y2="25.428572"
+       y1="21.857143"
+       xlink:href="#linearGradient4206"
+       x2="25.207588"
+       x1="25.064732"
+       inkscape:collect="always"
+       id="linearGradient8109-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       y2="26.71875"
+       y1="26.71875"
+       xlink:href="#linearGradient9910"
+       x2="38.826412"
+       x1="9.3030529"
+       inkscape:collect="always"
+       id="linearGradient8107"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       y2="56.575912"
+       y1="14.004482"
+       xlink:href="#linearGradient2682"
+       x2="37.969398"
+       x1="17.160095"
+       inkscape:collect="always"
+       id="linearGradient8104-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       y2="30.000000"
+       y1="19.500000"
+       xlink:href="#linearGradient6924"
+       x2="15.785715"
+       x1="16.071430"
+       inkscape:collect="always"
+       id="linearGradient8100"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-152.982,9.37161)" />
+    <linearGradient
+       y2="25.428572"
+       y1="21.857143"
+       xlink:href="#linearGradient4206"
+       x2="25.207588"
+       x1="25.064732"
+       inkscape:collect="always"
+       id="linearGradient53126"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       y2="26.71875"
+       y1="26.71875"
+       xlink:href="#linearGradient9910"
+       x2="38.826412"
+       x1="9.3030529"
+       inkscape:collect="always"
+       id="linearGradient53124"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       y2="56.575912"
+       y1="14.004482"
+       xlink:href="#linearGradient2682"
+       x2="37.969398"
+       x1="17.160095"
+       inkscape:collect="always"
+       id="linearGradient53121"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       y2="30.000000"
+       y1="19.500000"
+       xlink:href="#linearGradient6924"
+       x2="15.785715"
+       x1="16.071430"
+       inkscape:collect="always"
+       id="linearGradient53117"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-152.982,9.37161)" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3681"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3679"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3675"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3673"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3669"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3665"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3663"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3659"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3655"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3653"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3649"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3647"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3643"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3641"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3637"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3635"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3631-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3629"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3625"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3623"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3619"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3617"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3613"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3611"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3607"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3605"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient3603"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <linearGradient
+       y2="38.268368"
+       y1="36.942543"
+       xlink:href="#linearGradient2265-1"
+       x2="15.415793"
+       x1="14.017542"
+       inkscape:collect="always"
+       id="linearGradient2762"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.878099,-1.73237e-2,1.73237e-2,0.878099,1021.3138,469.27875)" />
+    <linearGradient
+       y2="33.194965"
+       y1="35.688461"
+       xlink:href="#linearGradient2257-8"
+       x2="10.650805"
+       x1="12.004697"
+       inkscape:collect="always"
+       id="linearGradient2760"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.007254,-2.636526e-2,2.636526e-2,1.007254,1020.7435,465.29004)" />
+    <linearGradient
+       y2="39.443218"
+       y1="32.28376"
+       xlink:href="#linearGradient3087"
+       x2="16.915297"
+       x1="9.7503242"
+       inkscape:collect="always"
+       id="linearGradient2758"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.87827,0,0,0.87827,1021.6871,470.17853)" />
+    <linearGradient
+       y2="9.6568537"
+       y1="19.821514"
+       xlink:href="#linearGradient2250"
+       x2="40.859177"
+       x1="31.177404"
+       inkscape:collect="always"
+       id="linearGradient2756"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1019.1501,465.21085)" />
+    <linearGradient
+       y2="6.6285896"
+       y1="13.602527"
+       xlink:href="#linearGradient3077-1"
+       x2="37.53537"
+       x1="38.227654"
+       inkscape:collect="always"
+       id="linearGradient2754"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.87827,0,0,0.87827,1021.9976,470.79956)" />
+    <linearGradient
+       y2="-4.3002653"
+       y1="-3.6324477"
+       xlink:href="#linearGradient3061-8"
+       x2="25.291086"
+       x1="50.152931"
+       inkscape:collect="always"
+       id="linearGradient2752"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.8782699,0,0,0.8782699,1049.7965,-403.53398)" />
+    <linearGradient
+       y2="6.7758031"
+       y1="42.253601"
+       xlink:href="#linearGradient3049-9"
+       x2="20.631224"
+       x1="19.648342"
+       inkscape:collect="always"
+       id="linearGradient2750"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.87827,0,0,0.87827,1021.6871,470.17853)" />
+    <radialGradient
+       xlink:href="#linearGradient3041-9"
+       r="17.6875"
+       inkscape:collect="always"
+       id="radialGradient2748"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.374558,0,24.47041)"
+       fy="39.125"
+       fx="24.8125"
+       cy="39.125"
+       cx="24.8125" />
+    <radialGradient
+       xlink:href="#linearGradient3041-9"
+       r="17.6875"
+       inkscape:collect="always"
+       id="radialGradient2746"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.374558,0,24.47041)"
+       fy="39.125"
+       fx="24.8125"
+       cy="39.125"
+       cx="24.8125" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient9952">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop9954" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop9956" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient9920-2">
+      <stop
+         style="stop-color:#5b90c8;stop-opacity:1;"
+         offset="0"
+         id="stop9922" />
+      <stop
+         style="stop-color:#8fb0d1;stop-opacity:1;"
+         offset="0.31578946"
+         id="stop9924" />
+      <stop
+         style="stop-color:#34679d;stop-opacity:1;"
+         offset="1"
+         id="stop9926" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient9910">
+      <stop
+         style="stop-color:#d09f5a;stop-opacity:1;"
+         offset="0"
+         id="stop9912-4" />
+      <stop
+         style="stop-color:#e7bf2f;stop-opacity:1;"
+         offset="0.31578946"
+         id="stop9918" />
+      <stop
+         style="stop-color:#a56c1b;stop-opacity:1;"
+         offset="1"
+         id="stop9914" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6395">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop6397" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop6399" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3399">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3401" />
+      <stop
+         style="stop-color:#c9c9c9;stop-opacity:1;"
+         offset="1"
+         id="stop3403" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2984">
+      <stop
+         style="stop-color:#e7e2b8;stop-opacity:1;"
+         offset="0"
+         id="stop2986" />
+      <stop
+         style="stop-color:#e7e2b8;stop-opacity:0;"
+         offset="1"
+         id="stop2988" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3408">
+      <stop
+         style="stop-color:#c1c1c1;stop-opacity:1;"
+         offset="0"
+         id="stop3410" />
+      <stop
+         style="stop-color:#acacac;stop-opacity:1;"
+         offset="1"
+         id="stop3412" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3414">
+      <stop
+         style="stop-color:#ffd1d1;stop-opacity:1;"
+         offset="0"
+         id="stop3416" />
+      <stop
+         style="stop-color:#ff1d1d;stop-opacity:1;"
+         offset="0.5"
+         id="stop3418" />
+      <stop
+         style="stop-color:#6f0000;stop-opacity:1;"
+         offset="1"
+         id="stop3420" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5068">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5070" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.69;"
+         offset="0.32894737"
+         id="stop5078" />
+      <stop
+         style="stop-color:#c2c2c2;stop-opacity:0.34;"
+         offset="0.65789473"
+         id="stop5076" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5072" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5058">
+      <stop
+         style="stop-color:#959791;stop-opacity:1;"
+         offset="0"
+         id="stop5060" />
+      <stop
+         style="stop-color:#f8f8f8;stop-opacity:1;"
+         offset="0.5"
+         id="stop5066" />
+      <stop
+         style="stop-color:#8c8c8c;stop-opacity:1;"
+         offset="1"
+         id="stop3430-9" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5036">
+      <stop
+         style="stop-color:#f5f5f5;stop-opacity:0.09;"
+         offset="0"
+         id="stop5038" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.89999998;"
+         offset="0.2631579"
+         id="stop5044" />
+      <stop
+         style="stop-color:#c7c7c7;stop-opacity:0.46000001;"
+         offset="0.74792242"
+         id="stop5088" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.78039217;"
+         offset="1"
+         id="stop5040" />
+    </linearGradient>
+    <linearGradient
+       y2="26.0846"
+       y1="26.0846"
+       xlink:href="#linearGradient5036"
+       x2="34.250416"
+       x1="15.375"
+       inkscape:collect="always"
+       id="linearGradient5042"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,5.625)" />
+    <radialGradient
+       xlink:href="#linearGradient5048"
+       r="14.875"
+       inkscape:collect="always"
+       id="radialGradient5054"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.420168,0,21.88866)"
+       fy="37.75"
+       fx="23.25"
+       cy="37.75"
+       cx="23.25" />
+    <linearGradient
+       y2="19.0846"
+       y1="19.4596"
+       xlink:href="#linearGradient5058"
+       x2="15.625"
+       x1="30.875"
+       inkscape:collect="always"
+       id="linearGradient5064"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0,5.625)" />
+    <linearGradient
+       y2="14.1875"
+       y1="14.1875"
+       xlink:href="#linearGradient5068"
+       x2="37.625"
+       x1="11.75"
+       inkscape:collect="always"
+       id="linearGradient5074-1"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y2="22.250591"
+       y1="17.376184"
+       xlink:href="#linearGradient2966"
+       x2="50.988335"
+       x1="48.90625"
+       inkscape:collect="always"
+       id="linearGradient6343-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(5.259571e-3,0.999987,0.999987,-5.259571e-3,42.9955,-2.496241)" />
+    <linearGradient
+       y2="22.625"
+       y1="19.8125"
+       xlink:href="#linearGradient2974"
+       x2="47.6875"
+       x1="46"
+       inkscape:collect="always"
+       id="linearGradient6345"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(5.259571e-3,0.999987,0.999987,-5.259571e-3,42.99552,-2.496241)" />
+    <radialGradient
+       xlink:href="#linearGradient2984"
+       r="3.2408545"
+       inkscape:collect="always"
+       id="radialGradient6347"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.53767e-2,2.923527,2.029691,-1.067544e-2,20.39098,-69.72665)"
+       fy="27.640751"
+       fx="29.053354"
+       cy="27.640751"
+       cx="29.053354" />
+    <linearGradient
+       y2="30.703125"
+       y1="31.046875"
+       xlink:href="#linearGradient2994-5"
+       x2="25.514589"
+       x1="25.71875"
+       inkscape:collect="always"
+       id="linearGradient6349"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(5.259571e-3,0.999987,0.999987,-5.259571e-3,48.6929,-14.14491)" />
+    <radialGradient
+       xlink:href="#linearGradient5048"
+       r="14.875"
+       inkscape:collect="always"
+       id="radialGradient6353"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.420168,0,21.88866)"
+       fy="37.75"
+       fx="23.25"
+       cy="37.75"
+       cx="23.25" />
+    <linearGradient
+       y2="44.110912"
+       y1="27.140348"
+       xlink:href="#linearGradient6395"
+       x2="20.682873"
+       x1="20.064156"
+       inkscape:collect="always"
+       id="linearGradient6401"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y2="62.827091"
+       y1="62.401989"
+       xlink:href="#linearGradient9952"
+       x2="38.061356"
+       x1="55.876038"
+       inkscape:collect="always"
+       id="linearGradient9961"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.493304,-0.716654,0.716654,-0.493304,-9.26781,79.4192)" />
+    <linearGradient
+       y2="68.224884"
+       y1="60.445503"
+       xlink:href="#linearGradient9910"
+       x2="28.244684"
+       x1="28.244684"
+       inkscape:collect="always"
+       id="linearGradient9965"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.493304,-0.716654,0.716654,-0.493304,-9.26781,79.4192)" />
+    <linearGradient
+       y2="68.224884"
+       y1="60.445503"
+       xlink:href="#linearGradient9920-2"
+       x2="28.244684"
+       x1="28.244684"
+       inkscape:collect="always"
+       id="linearGradient9968"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.493304,-0.716654,0.716654,-0.493304,-9.26781,79.4192)" />
+    <linearGradient
+       y2="68.224884"
+       y1="60.445503"
+       xlink:href="#linearGradient9910"
+       x2="28.244684"
+       x1="28.244684"
+       inkscape:collect="always"
+       id="linearGradient9972"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-0.493304,-0.716654,0.716654,-0.493304,-9.26781,79.4192)" />
+    <linearGradient
+       y2="50.939667"
+       y1="45.264122"
+       xlink:href="#linearGradient2871-6"
+       x2="45.380436"
+       x1="46.834816"
+       inkscape:collect="always"
+       id="linearGradient7850-5"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y2="26.649362"
+       y1="23.667896"
+       xlink:href="#linearGradient2402"
+       x2="53.588622"
+       x1="18.935766"
+       inkscape:collect="always"
+       id="linearGradient7848"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y2="20.60858"
+       y1="36.061237"
+       xlink:href="#linearGradient2380"
+       x2="15.984863"
+       x1="62.513836"
+       inkscape:collect="always"
+       id="linearGradient5908"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-6.0935847,-5.1483414,-5.1483414,6.0935847,846.16404,624.52042)" />
+    <linearGradient
+       y2="20.60858"
+       y1="36.061237"
+       xlink:href="#linearGradient2380"
+       x2="15.984863"
+       x1="62.513836"
+       inkscape:collect="always"
+       id="linearGradient5903"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient2690">
+      <stop
+         style="stop-color:#57be6f;stop-opacity:1;"
+         offset="0"
+         id="stop2692" />
+      <stop
+         style="stop-color:#c4ebca;stop-opacity:0;"
+         offset="1"
+         id="stop2694" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2682">
+      <stop
+         style="stop-color:#a36518;stop-opacity:1;"
+         offset="0"
+         id="stop2684" />
+      <stop
+         style="stop-color:#729fcf;stop-opacity:0;"
+         offset="1"
+         id="stop2686" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2402">
+      <stop
+         style="stop-color:#72cf7b;stop-opacity:1;"
+         offset="0"
+         id="stop2404" />
+      <stop
+         style="stop-color:#57c552;stop-opacity:1;"
+         offset="1"
+         id="stop2406" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2380">
+      <stop
+         style="stop-color:#b9e7c9;stop-opacity:1;"
+         offset="0"
+         id="stop2382" />
+      <stop
+         style="stop-color:#72cf79;stop-opacity:1;"
+         offset="1"
+         id="stop2384" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2871-6">
+      <stop
+         style="stop-color:#3465a4;stop-opacity:1;"
+         offset="0"
+         id="stop2873-9" />
+      <stop
+         style="stop-color:#3465a4;stop-opacity:1"
+         offset="1"
+         id="stop2875" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2831">
+      <stop
+         style="stop-color:#1d5e23;stop-opacity:1;"
+         offset="0"
+         id="stop2833" />
+      <stop
+         style="stop-color:#329652;stop-opacity:1;"
+         offset="0.33333334"
+         id="stop2855" />
+      <stop
+         style="stop-color:#83d8ab;stop-opacity:0;"
+         offset="1"
+         id="stop2835" />
+    </linearGradient>
+    <linearGradient
+       y2="50.939667"
+       y1="45.264122"
+       xlink:href="#linearGradient2871-6"
+       x2="45.380436"
+       x1="46.834816"
+       inkscape:collect="always"
+       id="linearGradient1501"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y2="20.60858"
+       y1="36.061237"
+       xlink:href="#linearGradient2380"
+       x2="15.984863"
+       x1="62.513836"
+       inkscape:collect="always"
+       id="linearGradient2386"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y2="26.649362"
+       y1="23.667896"
+       xlink:href="#linearGradient2402"
+       x2="53.588622"
+       x1="18.935766"
+       inkscape:collect="always"
+       id="linearGradient2408"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       xlink:href="#linearGradient5060"
+       r="117.14286"
+       inkscape:collect="always"
+       id="radialGradient2641"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+       fy="486.64789"
+       fx="605.71429"
+       cy="486.64789"
+       cx="605.71429" />
+    <radialGradient
+       xlink:href="#linearGradient5060"
+       r="117.14286"
+       inkscape:collect="always"
+       id="radialGradient2649"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+       fy="486.64789"
+       fx="605.71429"
+       cy="486.64789"
+       cx="605.71429" />
+    <linearGradient
+       id="linearGradient2651">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop2653" />
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0.5"
+         id="stop2655" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop2657" />
+    </linearGradient>
+    <linearGradient
+       y2="609.50507"
+       y1="366.64789"
+       xlink:href="#linearGradient5048"
+       x2="302.85715"
+       x1="302.85715"
+       inkscape:collect="always"
+       id="linearGradient2659"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient4542">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop4544" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop4546" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient15662-2">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop15664" />
+      <stop
+         style="stop-color:#f8f8f8;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop15666" />
+    </linearGradient>
+    <radialGradient
+       r="5.257"
+       id="aigrd3"
+       gradientUnits="userSpaceOnUse"
+       fy="64.5679"
+       fx="20.8921"
+       cy="64.5679"
+       cx="20.8921">
+      <stop
+         style="stop-color:#F0F0F0"
+         offset="0"
+         id="stop15573" />
+      <stop
+         style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop15575" />
+    </radialGradient>
+    <radialGradient
+       r="5.256"
+       id="aigrd2"
+       gradientUnits="userSpaceOnUse"
+       fy="114.5684"
+       fx="20.8921"
+       cy="114.5684"
+       cx="20.8921">
+      <stop
+         style="stop-color:#F0F0F0"
+         offset="0"
+         id="stop15566" />
+      <stop
+         style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop15568" />
+    </radialGradient>
+    <linearGradient
+       id="linearGradient269">
+      <stop
+         style="stop-color:#a3a3a3;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop270" />
+      <stop
+         style="stop-color:#4c4c4c;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop271" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient259">
+      <stop
+         style="stop-color:#fafafa;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop260" />
+      <stop
+         style="stop-color:#bbbbbb;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop261" />
+    </linearGradient>
+    <radialGradient
+       xlink:href="#linearGradient4542"
+       r="15.821514"
+       inkscape:collect="always"
+       id="radialGradient4548"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,0.000000,30.08928)"
+       fy="42.07798"
+       fx="24.306795"
+       cy="42.07798"
+       cx="24.306795" />
+    <linearGradient
+       id="linearGradient4440">
+      <stop
+         style="stop-color:#7d7d7d;stop-opacity:1;"
+         offset="0"
+         id="stop4442" />
+      <stop
+         style="stop-color:#b1b1b1;stop-opacity:1.0000000;"
+         offset="0.50000000"
+         id="stop4448-6" />
+      <stop
+         style="stop-color:#686868;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4444-8" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4454-3">
+      <stop
+         style="stop-color:#729fcf;stop-opacity:0.20784314;"
+         offset="0.0000000"
+         id="stop4456-5" />
+      <stop
+         style="stop-color:#729fcf;stop-opacity:0.67619050;"
+         offset="1.0000000"
+         id="stop4458-9" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4467-8">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4469-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.24761905;"
+         offset="1.0000000"
+         id="stop4471-9" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2366-1">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop2368" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.21904762;"
+         offset="0.50000000"
+         id="stop2374" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2370" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2846">
+      <stop
+         style="stop-color:#8a8a8a;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2848" />
+      <stop
+         style="stop-color:#484848;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2850" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2966">
+      <stop
+         style="stop-color:#ffd1d1;stop-opacity:1;"
+         offset="0"
+         id="stop2968-7" />
+      <stop
+         style="stop-color:#ff1d1d;stop-opacity:1;"
+         offset="0.5"
+         id="stop3006" />
+      <stop
+         style="stop-color:#6f0000;stop-opacity:1;"
+         offset="1"
+         id="stop2970-3" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2974">
+      <stop
+         style="stop-color:#c1c1c1;stop-opacity:1;"
+         offset="0"
+         id="stop2976-2" />
+      <stop
+         style="stop-color:#acacac;stop-opacity:1;"
+         offset="1"
+         id="stop2978-7" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2994-5">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2996" />
+      <stop
+         style="stop-color:#c9c9c9;stop-opacity:1;"
+         offset="1"
+         id="stop2998" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5060">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop5062" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5064" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5048">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop5050" />
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0.5"
+         id="stop5056" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5052" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient12512">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop12513" />
+      <stop
+         style="stop-color:#fff520;stop-opacity:0.89108908;"
+         offset="0.50000000"
+         id="stop12517" />
+      <stop
+         style="stop-color:#fff300;stop-opacity:0.0000000;"
+         offset="1.0000000"
+         id="stop12514" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2094-8">
+      <stop
+         style="stop-color:#d6e3f0;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop2096" />
+      <stop
+         style="stop-color:#95b1cf;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2098-2" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2803">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop2805" />
+      <stop
+         style="stop-color:#cbcbcb;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2807" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2795">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.068627454;"
+         offset="0.0000000"
+         id="stop2797" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2799" />
+    </linearGradient>
+    <radialGradient
+       xlink:href="#linearGradient5060"
+       r="117.14286"
+       inkscape:collect="always"
+       id="radialGradient5013"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+       fy="486.64789"
+       fx="605.71429"
+       cy="486.64789"
+       cx="605.71429" />
+    <linearGradient
+       y2="609.50507"
+       y1="366.64789"
+       xlink:href="#linearGradient5048"
+       x2="302.85715"
+       x1="302.85715"
+       inkscape:collect="always"
+       id="linearGradient5016"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" />
+    <radialGradient
+       xlink:href="#linearGradient5060"
+       r="117.14286"
+       inkscape:collect="always"
+       id="radialGradient5020"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+       fy="486.64789"
+       fx="605.71429"
+       cy="486.64789"
+       cx="605.71429" />
+    <linearGradient
+       y2="425.06561"
+       y1="733.39258"
+       x2="411.39359"
+       x1="43.943802"
+       id="SVGID_2_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.9169564,0,0,0.9120098,60.201795,153.71221)">
+      <stop
+         style="stop-color:#525252;stop-opacity:1;"
+         offset="0.0562"
+         id="stop2179-2" />
+      <stop
+         style="stop-color:#8e8e8e;stop-opacity:1;"
+         offset="0.56739998"
+         id="stop2181-2" />
+      <stop
+         style="stop-color:#c9c9c9;stop-opacity:1;"
+         offset="0.9551"
+         id="stop2183-6" />
+    </linearGradient>
+    <linearGradient
+       y2="425.06561"
+       y1="733.39258"
+       x2="411.3941"
+       x1="43.944302"
+       id="SVGID_1_"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(131.91072,132.23618)">
+      <stop
+         style="stop-color:#003F90"
+         offset="0.0562"
+         id="stop2170-3" />
+      <stop
+         style="stop-color:#0093D2"
+         offset="0.5674"
+         id="stop2172-4" />
+      <stop
+         style="stop-color:#EDF3F7"
+         offset="0.9551"
+         id="stop2174-1" />
+    </linearGradient>
+    <radialGradient
+       xlink:href="#linearGradient3041-9"
+       r="17.6875"
+       inkscape:collect="always"
+       id="radialGradient2260"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.374558,0,24.47041)"
+       fy="39.125"
+       fx="24.8125"
+       cy="39.125"
+       cx="24.8125" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3041-9">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3043-8" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3045" />
+    </linearGradient>
+    <radialGradient
+       xlink:href="#linearGradient3041-9"
+       r="17.6875"
+       inkscape:collect="always"
+       id="radialGradient3047"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.374558,0,24.47041)"
+       fy="39.125"
+       fx="24.8125"
+       cy="39.125"
+       cx="24.8125" />
+    <linearGradient
+       y2="6.7758031"
+       y1="42.253601"
+       xlink:href="#linearGradient3049-9"
+       x2="20.631224"
+       x1="19.648342"
+       inkscape:collect="always"
+       id="linearGradient3055"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.87827,0,0,0.87827,1021.6871,470.17853)" />
+    <linearGradient
+       id="linearGradient3049-9">
+      <stop
+         style="stop-color:#b6b6b6;stop-opacity:1;"
+         offset="0"
+         id="stop3051" />
+      <stop
+         style="stop-color:#f2f2f2;stop-opacity:1;"
+         offset="0.5"
+         id="stop2262-3" />
+      <stop
+         style="stop-color:#fafafa;stop-opacity:1;"
+         offset="0.67612958"
+         id="stop2264-5" />
+      <stop
+         style="stop-color:#d8d8d8;stop-opacity:1;"
+         offset="0.84051722"
+         id="stop2268-2" />
+      <stop
+         style="stop-color:#f2f2f2;stop-opacity:1;"
+         offset="0.875"
+         id="stop2266-3" />
+      <stop
+         style="stop-color:#dbdbdb;stop-opacity:1;"
+         offset="1"
+         id="stop3053" />
+    </linearGradient>
+    <linearGradient
+       y2="-4.3002653"
+       y1="-3.6324477"
+       xlink:href="#linearGradient3061-8"
+       x2="25.291086"
+       x1="50.152931"
+       inkscape:collect="always"
+       id="linearGradient3067"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.8782699,0,0,0.8782699,1049.7965,-403.53398)" />
+    <linearGradient
+       id="linearGradient3061-8">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3063" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="1"
+         id="stop3065" />
+    </linearGradient>
+    <linearGradient
+       y2="6.6285896"
+       y1="13.602527"
+       xlink:href="#linearGradient3077-1"
+       x2="37.53537"
+       x1="38.227654"
+       inkscape:collect="always"
+       id="linearGradient3083"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.87827,0,0,0.87827,1021.9976,470.79956)" />
+    <linearGradient
+       id="linearGradient3077-1">
+      <stop
+         style="stop-color:#98a0a9;stop-opacity:1;"
+         offset="0"
+         id="stop3079" />
+      <stop
+         style="stop-color:#c3d0dd;stop-opacity:1;"
+         offset="1"
+         id="stop3081" />
+    </linearGradient>
+    <linearGradient
+       y2="9.6568537"
+       y1="19.821514"
+       xlink:href="#linearGradient2250"
+       x2="40.859177"
+       x1="31.177404"
+       inkscape:collect="always"
+       id="linearGradient2256"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1019.1501,465.21085)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2250">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop2252" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop2254-2" />
+    </linearGradient>
+    <linearGradient
+       y2="39.443218"
+       y1="32.28376"
+       xlink:href="#linearGradient3087"
+       x2="16.915297"
+       x1="9.7503242"
+       inkscape:collect="always"
+       id="linearGradient3093"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.87827,0,0,0.87827,1021.6871,470.17853)" />
+    <linearGradient
+       id="linearGradient3087">
+      <stop
+         style="stop-color:#3465a4;stop-opacity:1;"
+         offset="0"
+         id="stop3089" />
+      <stop
+         style="stop-color:#9fbce1;stop-opacity:1;"
+         offset="0"
+         id="stop3095" />
+      <stop
+         style="stop-color:#6b95ca;stop-opacity:1;"
+         offset="0"
+         id="stop2242-7" />
+      <stop
+         style="stop-color:#3d6aa5;stop-opacity:1;"
+         offset="0.75"
+         id="stop2244-2" />
+      <stop
+         style="stop-color:#386eb4;stop-opacity:1;"
+         offset="1"
+         id="stop3091" />
+    </linearGradient>
+    <linearGradient
+       y2="33.194965"
+       y1="35.688461"
+       xlink:href="#linearGradient2257-8"
+       x2="10.650805"
+       x1="12.004697"
+       inkscape:collect="always"
+       id="linearGradient2263"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.007254,-2.636526e-2,2.636526e-2,1.007254,1020.7435,465.29004)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2257-8">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop2259-3" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop2261-3" />
+    </linearGradient>
+    <linearGradient
+       y2="38.268368"
+       y1="36.942543"
+       xlink:href="#linearGradient2265-1"
+       x2="15.415793"
+       x1="14.017542"
+       inkscape:collect="always"
+       id="linearGradient2271-6"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.878099,-1.73237e-2,1.73237e-2,0.878099,1021.3138,469.27875)" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2265-1">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2267-1" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop2269-9" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3962">
+      <stop
+         style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop3964" />
+      <stop
+         style="stop-color:#d3e9ff;stop-opacity:1.0000000;"
+         offset="0.15517241"
+         id="stop4134" />
+      <stop
+         style="stop-color:#4074ae;stop-opacity:1.0000000;"
+         offset="0.75000000"
+         id="stop4346" />
+      <stop
+         style="stop-color:#36486c;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop3966" />
+    </linearGradient>
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1460"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <linearGradient
+       id="linearGradient4750-9">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop4752" />
+      <stop
+         style="stop-color:#fefefe;stop-opacity:1.0000000;"
+         offset="0.37931034"
+         id="stop4758" />
+      <stop
+         style="stop-color:#1d1d1d;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4754" />
+    </linearGradient>
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1462"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1466"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1470"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1474"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1478"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1482"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1486"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1490"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1494"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1498"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1502-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1506"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1510"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1514"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1518"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1522"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1526"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1528-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1532"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1536"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1538"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1542"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1546"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1550"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1554"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <radialGradient
+       xlink:href="#linearGradient4750-9"
+       r="40.692665"
+       inkscape:collect="always"
+       id="radialGradient1558"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="scale(1.036822,0.964486)"
+       fy="17.810213"
+       fx="18.934305"
+       cy="17.486208"
+       cx="18.633780" />
+    <linearGradient
+       id="linearGradient4126">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop4128" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.16494845;"
+         offset="1.0000000"
+         id="stop4130" />
+    </linearGradient>
+    <radialGradient
+       xlink:href="#linearGradient2265-1"
+       r="17.142857"
+       inkscape:collect="always"
+       id="radialGradient4132"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.5,0,20)"
+       fy="40"
+       fx="23.857143"
+       cy="40"
+       cx="23.857143" />
+    <linearGradient
+       y2="26.71875"
+       y1="26.71875"
+       xlink:href="#linearGradient9910"
+       x2="38.826412"
+       x1="9.3030529"
+       inkscape:collect="always"
+       id="linearGradient4140"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       id="linearGradient4134">
+      <stop
+         style="stop-color:#7e807a;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop4136" />
+      <stop
+         style="stop-color:#babbb8;stop-opacity:1.0000000;"
+         offset="0.25000000"
+         id="stop4148" />
+      <stop
+         style="stop-color:#a5a6a3;stop-opacity:1.0000000;"
+         offset="0.50000000"
+         id="stop4142" />
+      <stop
+         style="stop-color:#333432;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4138" />
+    </linearGradient>
+    <linearGradient
+       y2="25.428572"
+       y1="21.857143"
+       xlink:href="#linearGradient4206"
+       x2="25.207588"
+       x1="25.064732"
+       inkscape:collect="always"
+       id="linearGradient4198"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       id="linearGradient4206">
+      <stop
+         style="stop-color:#204a87;stop-opacity:1;"
+         offset="0"
+         id="stop4208" />
+      <stop
+         style="stop-color:#3465a4;stop-opacity:1;"
+         offset="1"
+         id="stop4210" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4162">
+      <stop
+         style="stop-color:#f79403;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop4164" />
+      <stop
+         style="stop-color:#fdb343;stop-opacity:1.0000000;"
+         offset="0.18691589"
+         id="stop4170" />
+      <stop
+         style="stop-color:#fdb74f;stop-opacity:1.0000000;"
+         offset="0.43008122"
+         id="stop4172" />
+      <stop
+         style="stop-color:#8f5601;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop4166" />
+    </linearGradient>
+    <linearGradient
+       y2="56.575912"
+       y1="14.004482"
+       xlink:href="#linearGradient2682"
+       x2="37.969398"
+       x1="17.160095"
+       inkscape:collect="always"
+       id="linearGradient4182"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-149.9615,-46.50619)" />
+    <linearGradient
+       y2="13.284962"
+       y1="16.525082"
+       xlink:href="#linearGradient6932"
+       x2="24"
+       x1="24"
+       inkscape:collect="always"
+       id="linearGradient4160-9"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       id="linearGradient6932">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop6934" />
+      <stop
+         style="stop-color:#729fcf;stop-opacity:1;"
+         offset="1"
+         id="stop6936" />
+    </linearGradient>
+    <linearGradient
+       y2="30.000000"
+       y1="19.500000"
+       xlink:href="#linearGradient6924"
+       x2="15.785715"
+       x1="16.071430"
+       inkscape:collect="always"
+       id="linearGradient6930"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(21.14292,0,0,21.14292,-152.982,9.37161)" />
+    <linearGradient
+       id="linearGradient6924">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop6926" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop6928" />
+    </linearGradient>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective8097" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5175-3-4"
+       id="linearGradient18288-54"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-40,0)"
+       x1="0"
+       y1="1"
+       x2="15"
+       y2="16" />
+    <linearGradient
+       id="linearGradient5175-3-4">
+      <stop
+         style="stop-color:#bdcccd;stop-opacity:1;"
+         offset="0"
+         id="stop5177-6-4" />
+      <stop
+         style="stop-color:#7979ff;stop-opacity:1;"
+         offset="1"
+         id="stop5179-73-6" />
+    </linearGradient>
+    <linearGradient
+       y2="16"
+       x2="15"
+       y1="1"
+       x1="0"
+       gradientTransform="translate(-40,0)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient13566"
+       xlink:href="#linearGradient5175-3-4"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5175-3-6"
+       id="linearGradient18288-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-40,0)"
+       x1="0"
+       y1="1"
+       x2="15"
+       y2="16" />
+    <linearGradient
+       id="linearGradient5175-3-6">
+      <stop
+         style="stop-color:#bdcccd;stop-opacity:1;"
+         offset="0"
+         id="stop5177-6-9" />
+      <stop
+         style="stop-color:#7979ff;stop-opacity:1;"
+         offset="1"
+         id="stop5179-73-5" />
+    </linearGradient>
+    <linearGradient
+       y2="16"
+       x2="15"
+       y1="1"
+       x1="0"
+       gradientTransform="translate(-40,0)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient13566-2"
+       xlink:href="#linearGradient5175-3-6"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-6-6"
+       id="linearGradient15515-4-4"
+       gradientUnits="userSpaceOnUse"
+       x1="438.95389"
+       y1="493.53238"
+       x2="197.23351"
+       y2="118.20501" />
+    <linearGradient
+       id="linearGradient15934-1-6-6">
+      <stop
+         id="stop15936-4-1-9"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-1-0"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15945-8-2-3"
+       id="linearGradient15517-6-6"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.996701,-0.0811618,0.0811618,0.996701,-17.9181,36.064)"
+       x1="385.11563"
+       y1="275.58682"
+       x2="452.19373"
+       y2="88.438019" />
+    <linearGradient
+       id="linearGradient15945-8-2-3">
+      <stop
+         id="stop15947-9-8-3"
+         offset="0"
+         style="stop-color: rgb(179, 179, 179); stop-opacity: 1;" />
+      <stop
+         id="stop15949-1-6-5"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-6-6"
+       id="linearGradient15519-9-2"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-6.2575321,5.050595)"
+       x1="502.57938"
+       y1="184.1432"
+       x2="499.96594"
+       y2="179.73331" />
+    <linearGradient
+       id="linearGradient13602-1">
+      <stop
+         id="stop13604"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop13606"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-6-6"
+       id="linearGradient15521-8-6"
+       gradientUnits="userSpaceOnUse"
+       x1="501.00095"
+       y1="185.08093"
+       x2="502.98251"
+       y2="179.90973" />
+    <linearGradient
+       id="linearGradient13609">
+      <stop
+         id="stop13611"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop13613"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-9-3-8"
+       id="linearGradient15523-5-0"
+       gradientUnits="userSpaceOnUse"
+       x1="501.00095"
+       y1="185.08093"
+       x2="502.98251"
+       y2="179.90973" />
+    <linearGradient
+       id="linearGradient15934-1-9-3-8">
+      <stop
+         id="stop15936-4-3-91-3"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-2-9-2"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-9-6-5-4"
+       id="linearGradient15525-5-6"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.31018135,0.06837356,-0.06837356,0.31018135,350.04365,90.753719)"
+       x1="500.08212"
+       y1="185.71164"
+       x2="496.25415"
+       y2="181.49362" />
+    <linearGradient
+       id="linearGradient15934-1-9-6-5-4">
+      <stop
+         id="stop15936-4-3-9-6-7"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-2-4-6-3"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1513-2-4"
+       id="linearGradient13690-6"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.08604141,0,0,0.08604141,553.38144,142.10088)"
+       x1="131.52188"
+       y1="198.01724"
+       x2="131.52188"
+       y2="41.586746" />
+    <linearGradient
+       id="linearGradient1513-2-4">
+      <stop
+         id="stop1514-3-3"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1515-2-9"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-6-62"
+       id="linearGradient15515-4-0"
+       gradientUnits="userSpaceOnUse"
+       x1="438.95389"
+       y1="493.53238"
+       x2="197.23351"
+       y2="118.20501" />
+    <linearGradient
+       id="linearGradient15934-1-6-62">
+      <stop
+         id="stop15936-4-1-8"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-1-4"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15945-8-2-1"
+       id="linearGradient15517-6-2"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.996701,-0.0811618,0.0811618,0.996701,-17.9181,36.064)"
+       x1="385.11563"
+       y1="275.58682"
+       x2="452.19373"
+       y2="88.438019" />
+    <linearGradient
+       id="linearGradient15945-8-2-1">
+      <stop
+         id="stop15947-9-8-8"
+         offset="0"
+         style="stop-color: rgb(179, 179, 179); stop-opacity: 1;" />
+      <stop
+         id="stop15949-1-6-55"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-6-62"
+       id="linearGradient15519-9-9"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-6.2575321,5.050595)"
+       x1="502.57938"
+       y1="184.1432"
+       x2="499.96594"
+       y2="179.73331" />
+    <linearGradient
+       id="linearGradient13602-8">
+      <stop
+         id="stop13604-9"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop13606-5"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-6-62"
+       id="linearGradient15521-8-5"
+       gradientUnits="userSpaceOnUse"
+       x1="501.00095"
+       y1="185.08093"
+       x2="502.98251"
+       y2="179.90973" />
+    <linearGradient
+       id="linearGradient13609-2">
+      <stop
+         id="stop13611-5"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop13613-9"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-9-3-3"
+       id="linearGradient15523-5-9"
+       gradientUnits="userSpaceOnUse"
+       x1="501.00095"
+       y1="185.08093"
+       x2="502.98251"
+       y2="179.90973" />
+    <linearGradient
+       id="linearGradient15934-1-9-3-3">
+      <stop
+         id="stop15936-4-3-91-0"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-2-9-8"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient15934-1-9-6-5-7"
+       id="linearGradient15525-5-1"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.31018135,0.06837356,-0.06837356,0.31018135,350.04365,90.753719)"
+       x1="500.08212"
+       y1="185.71164"
+       x2="496.25415"
+       y2="181.49362" />
+    <linearGradient
+       id="linearGradient15934-1-9-6-5-7">
+      <stop
+         id="stop15936-4-3-9-6-6"
+         offset="0"
+         style="stop-color: rgb(77, 77, 77); stop-opacity: 1;" />
+      <stop
+         id="stop15938-9-2-4-6-34"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1513-2-8"
+       id="linearGradient13690-8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.08604141,0,0,0.08604141,553.38144,155.60298)"
+       x1="131.52188"
+       y1="198.01724"
+       x2="131.52188"
+       y2="41.586746" />
+    <linearGradient
+       id="linearGradient1513-2-8">
+      <stop
+         id="stop1514-3-2"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop1515-2-7"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1513-2-8"
+       id="linearGradient13943"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.08604141,0,0,0.08604141,553.38144,155.60298)"
+       x1="131.52188"
+       y1="198.01724"
+       x2="131.52188"
+       y2="41.586746" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1513-2-8"
+       id="linearGradient13953"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.08604141,0,0,0.08604141,553.38144,155.60298)"
+       x1="131.52188"
+       y1="198.01724"
+       x2="131.52188"
+       y2="41.586746" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1513-2-8"
+       id="linearGradient13956"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.06372438,0,0,0.06372438,763.51734,146.63259)"
+       x1="131.52188"
+       y1="198.01724"
+       x2="131.52188"
+       y2="41.586746" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1513-2-8"
+       id="linearGradient14742"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.06372438,0,0,0.06372438,763.51734,146.63259)"
+       x1="131.52188"
+       y1="198.01724"
+       x2="131.52188"
+       y2="41.586746" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient1513-2-8"
+       id="linearGradient14745"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.06372438,0,0,0.06372438,763.51734,136.63259)"
+       x1="131.52188"
+       y1="198.01724"
+       x2="131.52188"
+       y2="41.586746" />
+  </defs>
+  <text
+     style="font-size:40.12579727px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"
+     id="text18397"
+     y="54.610374"
+     x="371.85562"><tspan
+       style="text-align:center;text-anchor:middle"
+       id="tspan18399"
+       y="54.610374"
+       x="371.85562">Etherlab plugin icons</tspan></text>
+  <text
+     style="font-size:20px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+     xml:space="preserve"
+     id="text18377"
+     y="134.61037"
+     x="42.860386"><tspan
+       id="tspan18379"
+       y="134.61037"
+       x="42.860386">Plugin</tspan><tspan
+       id="tspan18381"
+       y="159.61037"
+       x="42.860386">Methods</tspan></text>
+  <text
+     x="167.20854"
+     y="120.42097"
+     id="text16266"
+     xml:space="preserve"
+     style="font-size:12.76095104px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan16268"
+       x="167.20854"
+       y="120.42097">%%ImportESI ImportDatabase ScanNetwork editSlave editCIA402Slave CIA402AxisRef CIA402NetPos%%</tspan></text>
+  <g
+     transform="translate(1268.5327,-372.731)"
+     id="g16313">
+    <rect
+       width="24"
+       height="24"
+       x="-1060.788"
+       y="501.19318"
+       id="ImportESI"
+       style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <g
+       transform="matrix(0.08604141,0,0,0.08604141,-1059.9338,502.14288)"
+       id="g74019">
+      <text
+         sodipodi:linespacing="125%"
+         x="-13.388169"
+         y="239.68744"
+         transform="scale(0.9460798,1.0569933)"
+         id="text10478"
+         xml:space="preserve"
+         style="font-size:184.97383118px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"><tspan
+           x="-13.388169"
+           y="239.68744"
+           id="tspan10480">E</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         x="80.957664"
+         y="239.68744"
+         transform="scale(0.9460798,1.0569933)"
+         id="text10482"
+         xml:space="preserve"
+         style="font-size:184.97383118px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"><tspan
+           x="80.957664"
+           y="239.68744"
+           id="tspan10484">S</tspan></text>
+      <text
+         sodipodi:linespacing="125%"
+         x="170.1553"
+         y="239.68744"
+         transform="scale(0.9460798,1.0569933)"
+         id="text10486"
+         xml:space="preserve"
+         style="font-size:184.97383118px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"><tspan
+           x="170.1553"
+           y="239.68744"
+           id="tspan10488">I</tspan></text>
+      <path
+         style="opacity:0.31627909;fill:url(#linearGradient17570);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:13;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 129.23845,108.16743 c -12.93134,1.1e-4 -23.10295,3.8765 -30.508571,11.25911 -7.405621,7.38284 -11.259114,17.58886 -11.259114,30.50857 0,10.05597 2.400356,17.98854 6.900747,23.97101 1.361321,1.79054 2.975195,3.69415 5.084761,5.44796 11.151957,1.07774 21.860407,1.42838 31.961357,1.45279 8.61666,0.0199 17.24855,-0.42793 26.1502,-1.08959 -4.25784,-3.6945 -9.57202,-6.81777 -15.98068,-9.44313 l -10.89592,-4.72156 c -7.51963,-3.1185 -12.49851,-5.80767 -14.89108,-8.35354 -2.33562,-2.60932 -3.63197,-5.86032 -3.63197,-9.80632 0,-5.09151 1.8376,-8.88549 5.08476,-11.62232 3.24704,-2.73658 7.70605,-4.35825 13.80149,-4.35836 5.46865,1.1e-4 11.1243,1.40455 16.70707,3.63197 5.58266,2.22765 10.93207,5.17902 16.34388,9.44313 l 0,-27.23979 c -5.75363,-2.92755 -11.56606,-5.07361 -17.43347,-6.53755 -5.86752,-1.52729 -11.56606,-2.54227 -17.43346,-2.54238 z m -127.4822287,2.54238 0,42.13087 c 8.2084895,3.96275 16.7937747,7.1805 25.0606077,10.16953 l 0,-27.2398 54.479583,0 0,-25.0606 -79.5401907,0 z m 173.9714687,0 0,25.0606 25.4238,0 0,37.04612 c 8.24847,-2.08504 16.60434,-4.41671 25.06061,-7.62714 l 0,-29.41898 25.42381,0 0,-25.0606 -75.90822,0 z M 36.259957,166.27898 c 13.423537,4.30549 26.596148,7.57089 39.588497,9.80633 l 0,-9.80633 -39.588497,0 z"
+         id="path40832"
+         inkscape:connector-curvature="0" />
+      <g
+         transform="matrix(5.0027792,0,0,5.0027792,-215.17835,-168.84627)"
+         id="g39828">
+        <circle
+           sodipodi:ry="34.144001"
+           sodipodi:rx="34.144001"
+           sodipodi:cy="110.081"
+           sodipodi:cx="100.287"
+           cx="100.287"
+           cy="110.081"
+           r="34.144001"
+           transform="matrix(0.3316761,0,0,0.3316761,48.927852,9.2318583)"
+           id="circle29"
+           style="fill:#84c225;fill-rule:evenodd;stroke:#5d9d35;stroke-width:2.82220006"
+           d="m 134.431,110.081 c 0,18.85721 -15.28679,34.144 -34.144,34.144 -18.857208,0 -34.143998,-15.28679 -34.143998,-34.144 0,-18.85721 15.28679,-34.144 34.143998,-34.144 18.85721,0 34.144,15.28679 34.144,34.144 z" />
+        <path
+           d="m 84.515333,38.943636 0,3.981494 3.981494,0 0,4.799639 -3.981494,0 0,3.981494 -4.782372,0 0,-3.981494 -3.981494,0 0,-4.799639 3.981494,0 0,-3.981494 4.782372,0"
+           id="text1332"
+           style="font-size:12px;font-style:normal;font-weight:normal;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+           inkscape:connector-curvature="0" />
+        <path
+           d="m 82.190677,35.644078 c 5.025924,0 9.194867,3.673581 9.969229,8.481465 -6.921917,-5.82623 -17.958314,0.09291 -16.467662,9.346307 -2.201037,-1.852678 -3.600446,-4.62745 -3.600446,-7.728889 0,-5.576508 4.522377,-10.098883 10.098879,-10.098883 z"
+           id="path33"
+           style="fill:url(#linearGradient16528);fill-opacity:1;fill-rule:evenodd"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+  </g>
+  <g
+     transform="translate(1454.6828,-433.35788)"
+     id="g16552">
+    <g
+       id="g16340">
+      <rect
+         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="ScanNetwork"
+         y="561.30634"
+         x="-1061.1847"
+         height="24"
+         width="24" />
+    </g>
+    <g
+       id="g33042"
+       transform="matrix(0.4732528,0,0,0.4732528,-30.31171,-6.6822749)">
+      <g
+         id="g9192"
+         transform="matrix(0.1559743,0,0,0.1559743,-2069.3916,1123.0816)">
+        <path
+           style="fill:url(#linearGradient16604);fill-opacity:1;fill-rule:evenodd;stroke:none"
+           id="path10587"
+           transform="translate(155,579.35335)"
+           d="m -512.21875,33.03125 -313.84375,124.40625 0,4.15625 116.15625,-45.9375 36,14.1875 1.34375,-3.46875 -32.28125,-12.75 47.875,-19.03125 27.3125,-10.8125 36,14.21875 1.34375,-3.46875 -32.28125,-12.75 113.78125,-45.25 -1.40625,-3.5 z"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:none;stroke:url(#linearGradient16606);stroke-width:1.0106318;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           id="path8200"
+           d="M -660.24451,734.57791 -356.6252,614.08615"
+           inkscape:connector-curvature="0" />
+        <g
+           id="g5077"
+           transform="matrix(0.09090112,0,0,0.09090112,-708.74866,934.66705)">
+          <rect
+             style="fill:#2020f5;fill-opacity:1;fill-rule:nonzero;stroke:#3d993d;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+             id="rect5079"
+             transform="matrix(0.926956,0.375171,0,1,0,0)"
+             y="-2666.4033"
+             x="233.02118"
+             height="419.39819"
+             width="996.81232" />
+          <rect
+             style="fill:url(#linearGradient16608);fill-opacity:1;fill-rule:nonzero;stroke:#3d993d;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+             id="rect5081"
+             transform="matrix(0.929224,-0.369517,0,1,0,0)"
+             y="-1753.9264"
+             x="1226.922"
+             height="420.25934"
+             width="593.28876" />
+          <rect
+             style="fill:url(#linearGradient16610);fill-opacity:1;fill-rule:nonzero;stroke:#3d993d;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+             id="rect5083"
+             transform="matrix(0.926288,0.376817,-0.92919,0.369603,0,0)"
+             y="-4162.4521"
+             x="-3348.2173"
+             height="593.25934"
+             width="995.74323" />
+          <use
+             x="0"
+             y="0"
+             xlink:href="#g13490"
+             id="use13560"
+             transform="matrix(6.0320029,2.5246268,0,6.0320029,-819.42608,-4545.0225)"
+             width="744.09448"
+             height="1052.3622" />
+          <g
+             id="g5085"
+             transform="matrix(1,0.428039,0,1,508,-889.8732)" />
+        </g>
+        <text
+           sodipodi:linespacing="125%"
+           style="font-size:23.17712593px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Nimbus Mono L"
+           xml:space="preserve"
+           id="text5103"
+           transform="matrix(0.9283219,0.3717759,-1.4068749,0.5137849,0,0)"
+           y="892.03345"
+           x="633.36249"><tspan
+             id="tspan5105"
+             y="892.03345"
+             x="633.36249">Master</tspan></text>
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.18643951;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           id="path8204"
+           d="m -424.19823,680.94807 -50.47123,-19.81068"
+           inkscape:connector-curvature="0" />
+        <g
+           id="g8206"
+           transform="matrix(-0.05230834,0,0,0.05230834,-370.7166,804.48617)">
+          <rect
+             style="fill:url(#linearGradient16612);fill-opacity:1;fill-rule:nonzero;stroke:#3d993d;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+             id="rect8208"
+             transform="matrix(0.926956,0.375171,0,1,0,0)"
+             y="-2666.4033"
+             x="233.02118"
+             height="419.39819"
+             width="996.81232" />
+          <rect
+             style="fill:#2020f5;fill-opacity:1;fill-rule:nonzero;stroke:#3d993d;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+             id="rect8210"
+             transform="matrix(0.929224,-0.369517,0,1,0,0)"
+             y="-1753.9264"
+             x="1226.922"
+             height="420.25934"
+             width="593.28876" />
+          <rect
+             style="fill:url(#linearGradient16614);fill-opacity:1;fill-rule:nonzero;stroke:#3d993d;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+             id="rect8212"
+             transform="matrix(0.926288,0.376817,-0.92919,0.369603,0,0)"
+             y="-4162.4521"
+             x="-3348.2173"
+             height="593.25934"
+             width="995.74323" />
+          <g
+             transform="matrix(-4.2446832,-1.7695903,0,4.2446832,2533.2515,-2530.0792)"
+             id="use12717-4">
+            <text
+               xml:space="preserve"
+               style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+               x="340.53214"
+               y="284.15552"
+               id="text13610"
+               sodipodi:linespacing="125%"><tspan
+                 sodipodi:role="line"
+                 id="tspan13612"
+                 x="340.53214"
+                 y="284.15552"
+                 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Ume Gothic C5;-inkscape-font-specification:Ume Gothic C5"
+                 dx="0 -3.3841705 -2.9611492 -2.1151066 -3.8071918">Ether<tspan
+   style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+   id="tspan13614"
+   dx="-3.3841705 -4.6532345 -6.3453197">CAT</tspan></tspan></text>
+            <path
+               style="color:#000000;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+               d="m 474.55583,247.23926 46.68198,0 -0.0748,-5.64517 15.94727,11.21704 -62.55448,0 z"
+               id="path13616"
+               inkscape:connector-curvature="0"
+               sodipodi:nodetypes="cccccc" />
+            <path
+               style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+               d="m 537.07809,260.62642 -17.93418,0 0.0748,5.64517 -15.94727,-11.21704 33.80668,0 z"
+               id="path13618"
+               inkscape:connector-curvature="0"
+               sodipodi:nodetypes="cccccc" />
+          </g>
+        </g>
+        <text
+           sodipodi:linespacing="125%"
+           style="font-size:16.01663589px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999946px;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Nimbus Mono L"
+           xml:space="preserve"
+           id="text8228"
+           transform="matrix(0.9225601,-0.385853,1.2237141,0.5721321,0,0)"
+           y="462.98654"
+           x="-1088.8175"><tspan
+             id="tspan8230"
+             y="462.98654"
+             x="-1088.8175">Slave</tspan></text>
+        <path
+           style="fill:none;stroke:#ffffff;stroke-width:1.18643951;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           id="path8299"
+           d="m -504.19823,712.94807 -50.47123,-19.81068"
+           inkscape:connector-curvature="0" />
+        <g
+           id="g8301"
+           transform="matrix(-0.05230834,0,0,0.05230834,-450.7166,836.48617)">
+          <rect
+             style="fill:url(#linearGradient16616);fill-opacity:1;fill-rule:nonzero;stroke:#3d993d;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+             id="rect8303"
+             transform="matrix(0.926956,0.375171,0,1,0,0)"
+             y="-2666.4033"
+             x="233.02118"
+             height="419.39819"
+             width="996.81232" />
+          <rect
+             style="fill:#2020f5;fill-opacity:1;fill-rule:nonzero;stroke:#3d993d;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+             id="rect8305"
+             transform="matrix(0.929224,-0.369517,0,1,0,0)"
+             y="-1753.9264"
+             x="1226.922"
+             height="420.25934"
+             width="593.28876" />
+          <rect
+             style="fill:url(#linearGradient16618);fill-opacity:1;fill-rule:nonzero;stroke:#3d993d;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+             id="rect8307"
+             transform="matrix(0.926288,0.376817,-0.92919,0.369603,0,0)"
+             y="-4162.4521"
+             x="-3348.2173"
+             height="593.25934"
+             width="995.74323" />
+          <g
+             transform="matrix(-4.2030416,-1.7522306,0,4.2030416,2515.7719,-2515.1885)"
+             id="use12717">
+            <text
+               xml:space="preserve"
+               style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+               x="340.53214"
+               y="284.15552"
+               id="text13622"
+               sodipodi:linespacing="125%"><tspan
+                 sodipodi:role="line"
+                 id="tspan13624"
+                 x="340.53214"
+                 y="284.15552"
+                 style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Ume Gothic C5;-inkscape-font-specification:Ume Gothic C5"
+                 dx="0 -3.3841705 -2.9611492 -2.1151066 -3.8071918">Ether<tspan
+   style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+   id="tspan13626"
+   dx="-3.3841705 -4.6532345 -6.3453197">CAT</tspan></tspan></text>
+            <path
+               style="color:#000000;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+               d="m 474.55583,247.23926 46.68198,0 -0.0748,-5.64517 15.94727,11.21704 -62.55448,0 z"
+               id="path13628"
+               inkscape:connector-curvature="0"
+               sodipodi:nodetypes="cccccc" />
+            <path
+               style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+               d="m 537.07809,260.62642 -17.93418,0 0.0748,5.64517 -15.94727,-11.21704 33.80668,0 z"
+               id="path13630"
+               inkscape:connector-curvature="0"
+               sodipodi:nodetypes="cccccc" />
+          </g>
+        </g>
+        <text
+           sodipodi:linespacing="125%"
+           style="font-size:16.01663589px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999946px;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Nimbus Mono L"
+           xml:space="preserve"
+           id="text8323"
+           transform="matrix(0.9225601,-0.385853,1.2237141,0.5721321,0,0)"
+           y="461.64023"
+           x="-1173.7469"><tspan
+             id="tspan8325"
+             y="461.64023"
+             x="-1173.7469">Slave</tspan></text>
+      </g>
+      <g
+         id="g9184"
+         transform="matrix(0.7769546,0,0,0.7769546,-2279.9093,796.92596)" />
+    </g>
+    <g
+       transform="matrix(0.05329943,0,0,0.05329943,-1050.2736,569.92488)"
+       id="g16611">
+      <path
+         d="m 144.80549,88.557517 c 0,39.134993 -31.76158,70.896673 -70.896401,70.896673 -39.135167,0 -70.8967476,-31.76168 -70.8967476,-70.896673 0,-39.134957 31.7615806,-70.896643 70.8967476,-70.896643 39.134821,0 70.896401,31.761686 70.896401,70.896643 z"
+         id="path16613"
+         style="fill:#373737;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.61199999;marker:none;visibility:visible;display:inline;overflow:visible"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 202.60774,194.21232 c 3.92622,3.92538 3.92622,10.29011 0,14.21632 l -9.21619,9.21617 c -3.92622,3.92705 -10.29105,3.92537 -14.21657,0 L 28.710589,67.179433 c -3.925514,-3.926213 -3.925514,-10.290947 0,-14.216321 l 9.216896,-9.217 c 3.925514,-3.925409 10.291051,-3.926213 14.216565,0 L 202.60774,194.21232 z"
+         id="path16615"
+         style="fill:#373737;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 199.13799,197.60713 c 2.77615,2.77542 2.77615,7.27558 0,10.05159 l -6.51629,6.51626 c -2.77581,2.77661 -7.276,2.77542 -10.05146,0 L 76.185068,107.78914 c -2.775456,-2.77598 -2.775456,-7.27614 0,-10.051559 l 6.51664,-6.51685 c 2.775457,-2.775422 7.27635,-2.776016 10.051806,0 L 199.13799,197.60713 z"
+         id="path16617"
+         style="fill:#483737;fill-opacity:1;stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 122.71901,137.13232 c -26.64544,26.64536 -71.142993,26.65557 -97.797523,0.0205 -26.6471846,-26.64946 -26.6471846,-71.148972 0,-97.798396 26.648584,-26.647394 71.148935,-26.647394 97.797523,0 26.65033,26.633089 26.65033,71.143826 0,97.777936"
+         id="path16619"
+         style="fill:#d3d3d3"
+         inkscape:connector-curvature="0" />
+      <path
+         d="M 119.72914,131.79305 C 96.539469,154.98447 58.641452,157.67301 32.468212,137.86093 5.2505454,117.25588 -1.9740372,78.180456 16.213163,49.255298 -15.910434,97.006413 24.656009,162.35931 81.618108,155.06621 137.97055,147.85076 159.82233,77.723686 120.43603,38.336577 c 24.97771,25.778801 24.66921,68.063923 -0.70689,93.456473"
+         id="path16621"
+         style="fill:#aaaaaa"
+         inkscape:connector-curvature="0" />
+      <path
+         d="M 35.564411,48.442913 C 54.720486,29.286873 86.052194,27.495541 107.43703,44.037614 129.36541,61.002773 135.32486,92.743158 120.53921,116.31268 146.97723,76.924557 112.85188,23.262925 66.150052,29.558683 21.626965,35.557098 1.2907536,93.929556 35.237373,124.97001 14.812318,103.89896 14.724525,69.267689 35.564411,48.442913"
+         id="path16623"
+         style="opacity:0.32790701;fill:#7c7c7c"
+         inkscape:connector-curvature="0" />
+      <path
+         d="M 6.4268355,77.270973 C 12.631477,38.853648 51.158387,13.082017 89.041013,21.675965 122.98658,29.373722 145.9461,62.537617 141.54279,96.976788 136.88206,133.41579 102.86723,160.1061 66.344176,156.11364 27.956476,151.91782 0.27291119,115.34192 6.4268355,77.270973 M 73.8143,18.290503 c -37.772797,0 -69.3598403,31.165075 -69.945362,68.863021 -0.5977638,38.521556 31.332758,71.052926 69.943263,71.052926 37.771399,0 69.370679,-31.16309 69.961449,-68.863061 C 144.37771,50.807525 112.4318,18.290503 73.8143,18.290503"
+         id="path16625"
+         style="fill:url(#linearGradient16647)"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:url(#linearGradient16669);fill-opacity:1;fill-rule:nonzero;stroke:#3d993d;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+         d="M 85.93064,79.962195 23.081268,104.84007 c 7.287315,20.5463 28.181658,35.78923 53.247384,35.78923 27.692408,0 50.300168,-18.4368 54.993198,-42.336038 L 85.93064,79.962195 z"
+         id="rect16657"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 127.15904,88.252024 c 0,29.071296 -24.27047,53.338756 -53.339843,53.338756 -29.06902,0 -53.337741,-24.26949 -53.337741,-53.338756 0,-29.073322 24.259277,-53.354041 53.337741,-53.354041 29.081613,-0.001 53.339843,24.27869 53.339843,53.354041"
+         id="path16627"
+         style="opacity:0.32790701;fill:#ffffff"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 73.819197,140.73953 c -28.235159,0 -51.897722,-23.21796 -52.482194,-51.400233 -0.601961,-29.01505 23.400932,-53.590104 52.483243,-53.590104 28.248804,0 51.916264,23.213908 52.492684,51.411501 0.59182,29.007916 -23.42017,53.578836 -52.493733,53.578836 M 73.83039,34.11421 c -29.954998,0 -54.74873,25.325074 -54.122285,55.278252 0.669118,31.949898 29.836424,56.770178 61.433961,52.491568 C 108.49649,138.18283 129.01669,113.57405 127.9163,86.056038 126.77289,57.399646 102.53599,34.11421 73.83039,34.11421"
+         id="path16629"
+         style="opacity:0.32790701;fill:url(#linearGradient16649)"
+         inkscape:connector-curvature="0" />
+      <path
+         d="M 28.153749,44.866368 C 50.655412,22.362642 87.40407,19.643463 112.92218,38.70342 139.70648,58.707626 146.88734,97.037089 129.0772,125.35014 160.21058,79.127714 121.42939,15.757264 66.209513,22.062221 12.268761,28.223106 -13.149317,98.215302 27.461896,135.99293 3.0945383,110.85893 3.3949942,69.623269 28.153749,44.866368"
+         id="path16631"
+         style="fill:#e5e5e5"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 134.07092,88.35101 c 0,33.29957 -26.99521,60.29471 -60.294745,60.29471 -33.299537,0 -60.294747,-26.99514 -60.294747,-60.29471 0,-33.299537 26.99521,-60.294712 60.294747,-60.294712 33.299535,0 60.294745,26.995175 60.294745,60.294712 z"
+         id="path16633"
+         style="opacity:0.32790701;fill:url(#linearGradient16651);stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         d="M 113.21565,127.99475 C 93.854253,147.36845 62.271058,150.60166 39.848094,134.53678 15.699345,117.24158 9.6569986,83.200902 25.45804,58.257992 -2.0681264,98.926533 31.780556,154.8455 80.752768,148.06741 128.1391,141.51005 148.27,81.978757 114.42446,48.287578 c 21.37155,22.079626 20.367,58.146642 -1.20881,79.707172"
+         id="path16635"
+         style="opacity:0.32790701;fill:#e5e5e5"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 25.527645,85.282478 c 0,1.835299 3.01855,-5.06952 3.466261,-5.89824 4.022052,-7.434132 9.631028,-13.95371 16.419442,-18.999725 9.702732,-7.210312 21.985397,-11.931387 34.129551,-12.193997 4.029047,-0.08584 8.054247,0.356629 11.973115,1.289582 1.62575,0.387304 10.761496,4.379765 10.761496,1.468456 0,-4.921356 -13.01579,-7.448438 -16.201881,-8.131057 C 75.87237,40.632738 64.630633,40.486603 54.776799,44.264477 39.1419,50.2588 25.527645,68.122144 25.527645,85.282478"
+         id="path16637"
+         style="opacity:0.32790701;fill:#e5e5e5"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 122.26955,92.346689 c 0,-1.833236 -3.02065,5.06952 -3.46941,5.898239 -4.02415,7.435142 -9.63733,13.955742 -16.42854,19.000742 -9.704829,7.20625 -21.992041,11.94261 -34.136895,12.20729 -4.029047,0.0879 -8.054247,-0.3546 -11.973115,-1.29063 -1.617705,-0.38423 -10.74296,-4.36442 -10.74296,-1.48273 0,4.92132 13.010545,7.45557 16.200834,8.1392 10.196962,2.18476 21.43765,2.33296 31.285538,-1.45103 15.624408,-6.0015 29.264548,-23.86075 29.264548,-41.021081"
+         id="path16639"
+         style="opacity:0.32790701;fill:#efefef"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 75.557224,82.95634 c 27.448166,-17.366 49.993556,-0.944075 49.993556,-0.944075 -1.01925,-27.475134 -23.615,-49.435837 -51.339836,-49.435837 -28.374019,0 -51.375859,23.001105 -51.375859,51.375929 7e-4,-8.4e-4 25.273622,16.369983 52.722139,-0.996017 z"
+         id="path16641"
+         style="opacity:0.47906979;fill:url(#linearGradient16653);stroke:none"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 40.481863,36.421127 c 0,4.637476 -7.004387,8.396894 -15.644737,8.396894 -8.64035,0 -15.6447375,-3.759418 -15.6447375,-8.396894 0,-4.637476 7.0043875,-8.396894 15.6447375,-8.396894 8.64035,0 15.644737,3.759418 15.644737,8.396894 l 0,0 z"
+         transform="matrix(5.8942914,0,0,3.3456793,14.375906,106.05328)"
+         id="path16643"
+         style="opacity:0.20454544;fill:url(#radialGradient16655);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       transform="matrix(0.11674554,0,0,0.11674554,-1100.4775,535.97889)"
+       id="use13558">
+      <text
+         xml:space="preserve"
+         style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         x="340.53214"
+         y="284.15552"
+         id="text13634"
+         sodipodi:linespacing="125%"><tspan
+           sodipodi:role="line"
+           id="tspan13636"
+           x="340.53214"
+           y="284.15552"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Ume Gothic C5;-inkscape-font-specification:Ume Gothic C5"
+           dx="0 -3.3841705 -2.9611492 -2.1151066 -3.8071918">Ether<tspan
+   style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+   id="tspan13638"
+   dx="-3.3841705 -4.6532345 -6.3453197">CAT</tspan></tspan></text>
+      <path
+         style="color:#000000;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 474.55583,247.23926 46.68198,0 -0.0748,-5.64517 15.94727,11.21704 -62.55448,0 z"
+         id="path13640"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccc" />
+      <path
+         style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 537.07809,260.62642 -17.93418,0 0.0748,5.64517 -15.94727,-11.21704 33.80668,0 z"
+         id="path13642"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccc" />
+    </g>
+  </g>
+  <g
+     id="g12739"
+     transform="translate(110,0)">
+    <rect
+       inkscape:label="#rect16270"
+       style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="editSlave"
+       y="130.25732"
+       x="368.70486"
+       height="24"
+       width="24" />
+    <g
+       id="layer1"
+       inkscape:label="Layer 1"
+       transform="matrix(0.08401613,0,0,0.08401613,351.44488,104.60783)">
+      <g
+         transform="translate(115.71681,3.3131126)"
+         id="g4864-8-8" />
+      <g
+         transform="matrix(0.36747236,0,0,0.36747236,200.01762,267.31026)"
+         id="g6671">
+        <path
+           style="color:#000000;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:5.80000019;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           d="M 394.33668,694.2918 688.90341,513.11968 680.30214,544.70997 385.73541,725.88209 z"
+           id="path3800-4-0-8-5-1-2-9"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc" />
+        <path
+           style="color:#000000;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:5.80000019;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           d="m 668.70364,486.78006 21.25617,25.1783 -296.19663,180.54945 -20.83851,-21.57846 z"
+           id="path3800-4-0-8-5-1-2-6-3"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc" />
+        <path
+           style="color:#000000;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:5.80000019;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           d="m 664.0882,488.3626 8.9568,-28.50725 -293.69907,180.05151 -8.9568,28.50725 z"
+           id="path3800-4-0-8-5-1-2-6-33"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc" />
+        <g
+           id="g5986">
+          <g
+             transform="translate(-570.96263,161.12911)"
+             id="g4792">
+            <path
+               style="color:#000000;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:5.80000019;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+               d="M 989.65834,-52.381783 694.47719,128.23603 949.8447,478.22245 1245.0259,297.60461 z"
+               id="path3800-4-0-8-5-1-2-3-2"
+               inkscape:connector-curvature="0"
+               sodipodi:nodetypes="ccccc" />
+            <path
+               style="color:#000000;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:5.80000019;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+               d="M 733.07291,177.24877 1028.4301,-4.17975"
+               id="path3800-4-0-8-5-1-2-6-31"
+               inkscape:connector-curvature="0"
+               sodipodi:nodetypes="cc" />
+            <path
+               style="color:#000000;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:5.80000019;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+               d="M 917.02219,429.90874 1212.3794,248.48022"
+               id="path3800-4-0-8-5-1-2-6-31-9"
+               inkscape:connector-curvature="0"
+               sodipodi:nodetypes="cc" />
+            <path
+               style="color:#000000;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:5.80000019;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+               d="m 855.85375,101.62012 c 62.49042,85.64375 123.38478,169.10163 179.55535,246.08417 7.5052,10.28603 7.5042,10.28467 0,0 z"
+               id="path3800-4-0-8-5-1-2-3-2-5"
+               inkscape:connector-curvature="0"
+               sodipodi:nodetypes="cccc" />
+          </g>
+          <g
+             id="g5386">
+            <g
+               id="g4864"
+               transform="translate(0,-2)">
+              <path
+                 transform="matrix(0.78084988,0.33275964,-0.21705284,0.51805492,300.93362,120.30394)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.62398381,0.23649988,-0.17344878,0.36819348,346.45879,236.82391)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8"
+                 style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844"
+                 d="m 520.55037,507.5554 25.68498,14.25642"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6"
+                 d="m 522.51466,521.66255 19.97069,-13.24358"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+            <g
+               id="g4864-0"
+               transform="translate(-38.836529,20.485705)">
+              <path
+                 transform="matrix(0.78084988,0.33275964,-0.21705284,0.51805492,300.93362,120.30394)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-2"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.62398381,0.23649988,-0.17344878,0.36819348,346.45879,236.82391)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-4"
+                 style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-8"
+                 d="m 520.55037,507.5554 25.68498,14.25642"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6-6"
+                 d="m 522.51466,521.66255 19.97069,-13.24358"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+            <g
+               id="g4864-5"
+               transform="translate(-77.222326,43.719214)">
+              <path
+                 transform="matrix(0.78084988,0.33275964,-0.21705284,0.51805492,300.93362,120.30394)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-0"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.62398381,0.23649988,-0.17344878,0.36819348,346.45879,236.82391)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-9"
+                 style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-0"
+                 d="m 520.55037,507.5554 25.68498,14.25642"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6-0"
+                 d="m 522.51466,521.66255 19.97069,-13.24358"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+            <g
+               id="g4864-6"
+               transform="translate(-118.63858,68.973027)">
+              <path
+                 transform="matrix(0.78084988,0.33275964,-0.21705284,0.51805492,300.93362,120.30394)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-1"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.62398381,0.23649988,-0.17344878,0.36819348,346.45879,236.82391)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-3"
+                 style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-89"
+                 d="m 520.55037,507.5554 25.68498,14.25642"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6-3"
+                 d="m 522.51466,521.66255 19.97069,-13.24358"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+            <g
+               id="g4864-4"
+               transform="translate(37.95537,-26.971159)">
+              <path
+                 transform="matrix(0.78084988,0.33275964,-0.21705284,0.51805492,300.93362,120.30394)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-4"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.62398381,0.23649988,-0.17344878,0.36819348,346.45879,236.82391)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-6"
+                 style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-06"
+                 d="m 520.55037,507.5554 25.68498,14.25642"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6-61"
+                 d="m 522.51466,521.66255 19.97069,-13.24358"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+            <g
+               id="g4864-8"
+               transform="translate(77.331014,-48.204668)">
+              <path
+                 transform="matrix(0.78084988,0.33275964,-0.21705284,0.51805492,300.93362,120.30394)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-49"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.62398381,0.23649988,-0.17344878,0.36819348,346.45879,236.82391)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-63"
+                 style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-7"
+                 d="m 520.55037,507.5554 25.68498,14.25642"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6-8"
+                 d="m 522.51466,521.66255 19.97069,-13.24358"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+          </g>
+          <g
+             id="g5354">
+            <g
+               id="g4864-6-4"
+               transform="translate(-338.91275,-233.16411)">
+              <path
+                 transform="matrix(0.78084988,0.33275964,-0.21705284,0.51805492,300.93362,120.30394)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-1-2"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.62398381,0.23649988,-0.17344878,0.36819348,346.45879,236.82391)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-3-9"
+                 style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-89-3"
+                 d="m 520.55037,507.5554 25.68498,14.25642"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6-3-0"
+                 d="m 522.51466,521.66255 19.97069,-13.24358"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+            <g
+               id="g4864-6-7"
+               transform="translate(-300.48635,-257.42808)">
+              <path
+                 transform="matrix(0.78084988,0.33275964,-0.21705284,0.51805492,300.93362,120.30394)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-1-7"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.62398381,0.23649988,-0.17344878,0.36819348,346.45879,236.82391)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-3-8"
+                 style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-89-7"
+                 d="m 520.55037,507.5554 25.68498,14.25642"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6-3-3"
+                 d="m 522.51466,521.66255 19.97069,-13.24358"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+            <g
+               id="g4864-6-0"
+               transform="translate(-262.08024,-279.63112)">
+              <path
+                 transform="matrix(0.78084988,0.33275964,-0.21705284,0.51805492,300.93362,120.30394)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-1-3"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.62398381,0.23649988,-0.17344878,0.36819348,346.45879,236.82391)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-3-82"
+                 style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-89-5"
+                 d="m 520.55037,507.5554 25.68498,14.25642"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6-3-2"
+                 d="m 522.51466,521.66255 19.97069,-13.24358"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+            <g
+               id="g4864-6-03"
+               transform="translate(-225.73505,-301.87479)">
+              <path
+                 transform="matrix(0.78084988,0.33275964,-0.21705284,0.51805492,300.93362,120.30394)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-1-72"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.62398381,0.23649988,-0.17344878,0.36819348,346.45879,236.82391)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-3-97"
+                 style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-89-53"
+                 d="m 520.55037,507.5554 25.68498,14.25642"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6-3-4"
+                 d="m 522.51466,521.66255 19.97069,-13.24358"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+            <g
+               id="g4864-6-3"
+               transform="translate(-187.38987,-324.09814)">
+              <path
+                 transform="matrix(0.78084988,0.33275964,-0.21705284,0.51805492,300.93362,120.30394)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-1-21"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.62398381,0.23649988,-0.17344878,0.36819348,346.45879,236.82391)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-3-1"
+                 style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-89-32"
+                 d="m 520.55037,507.5554 25.68498,14.25642"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6-3-5"
+                 d="m 522.51466,521.66255 19.97069,-13.24358"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+            <g
+               id="g4864-6-3-5"
+               transform="translate(-146.92285,-348.21998)">
+              <path
+                 transform="matrix(0.78084988,0.33275964,-0.21705284,0.51805492,300.93362,120.30394)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-1-21-4"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.62398381,0.23649988,-0.17344878,0.36819348,346.45879,236.82391)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-3-1-2"
+                 style="color:#000000;fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-89-32-5"
+                 d="m 520.55037,507.5554 25.68498,14.25642"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6-3-5-3"
+                 d="m 522.51466,521.66255 19.97069,-13.24358"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+          </g>
+          <g
+             id="g5422">
+            <g
+               id="g5099">
+              <path
+                 transform="matrix(0.5574865,0.25839661,-0.15496452,0.40228327,156.52037,154.6326)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-1-1"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.44266247,0.16877889,-0.12304689,0.26276244,189.80984,262.26974)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-3-2"
+                 style="color:#000000;fill:#d3bc5f;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-89-2"
+                 d="m 314.23313,455.50041 17.82784,10.68499"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6-3-26"
+                 d="m 315.48313,466.03613 14.97069,-10.38644"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+            <g
+               transform="translate(40.150726,-21.342207)"
+               id="g5099-7">
+              <path
+                 transform="matrix(0.5574865,0.25839661,-0.15496452,0.40228327,156.52037,154.6326)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-1-1-9"
+                 style="color:#000000;fill:#6c5353;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(0.44266247,0.16877889,-0.12304689,0.26276244,189.80984,262.26974)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-3-2-0"
+                 style="color:#000000;fill:#d3bc5f;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-89-2-5"
+                 d="m 314.23313,455.50041 17.82784,10.68499"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path4844-6-3-26-3"
+                 d="m 315.48313,466.03613 14.97069,-10.38644"
+                 style="fill:none;stroke:#808080;stroke-width:2.37199998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+            </g>
+            <path
+               style="color:#000000;fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:5.80000019;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+               d="m 332.02554,358.218 -51.44716,-70.61223 -0.80731,-1.30773 -92.2991,56.69642 53.48475,71.6693 z"
+               id="path3800-4-0-8-5-1-2-6-36"
+               inkscape:connector-curvature="0"
+               sodipodi:nodetypes="cccccc" />
+            <g
+               id="g5418">
+              <path
+                 transform="matrix(1.950083,0.8615584,-0.54206457,1.3413122,-205.53653,-507.30732)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-1-35"
+                 style="color:#000000;fill:#4d4d4d;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+              <path
+                 transform="matrix(1.6360384,0.68957452,-0.45476959,1.0735601,-111.09891,-300.50721)"
+                 d="m 456.07144,477.71933 c 0,16.17405 -10.63324,29.28571 -23.75,29.28571 -13.11676,0 -23.75,-13.11166 -23.75,-29.28571 0,-16.17405 10.63324,-29.28572 23.75,-29.28572 13.11676,0 23.75,13.11167 23.75,29.28572 z"
+                 sodipodi:ry="29.285715"
+                 sodipodi:rx="23.75"
+                 sodipodi:cy="477.71933"
+                 sodipodi:cx="432.32144"
+                 id="path4822-8-3-6"
+                 style="color:#000000;fill:#1a1a1a;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:1.18972731;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                 sodipodi:type="arc" />
+            </g>
+            <path
+               style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:13.69999981;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+               d="m 263.35199,424.07852 17.20982,23.48214"
+               id="path3800-4-0-8-5-1-5"
+               inkscape:connector-curvature="0"
+               sodipodi:nodetypes="cc" />
+          </g>
+        </g>
+        <g
+           id="g6116">
+          <path
+             sodipodi:nodetypes="ccccc"
+             inkscape:connector-curvature="0"
+             id="path3800-4-0-5-1"
+             d="M 352.85714,847.36218 76.607141,472.00503 106.23215,350.29075 382.48214,725.6479 z"
+             style="color:#000000;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:5.80000019;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+          <g
+             id="g6099">
+            <g
+               id="g6093">
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-8"
+                 d="m 262.70323,692.15695 68.83928,93.92858"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-8-9"
+                 d="m 268.84948,672.41305 68.83928,93.92858"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-8-9-0"
+                 d="m 280.5089,631.22636 68.83928,93.92858"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-8-9-8"
+                 d="m 274.95306,651.9345 68.83928,93.92858"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+            </g>
+            <g
+               id="g5505-1"
+               transform="translate(-107.45428,-152.00805)"
+               style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate">
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-8-4"
+                 d="m 284.70323,728.15695 68.83928,93.92858"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-8-9-7"
+                 d="m 290.84948,708.41305 68.83928,93.92858"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-8-9-8-5"
+                 d="m 296.95306,687.9345 68.83928,93.92858"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-8-9-0-5"
+                 d="m 302.5089,667.22636 68.83928,93.92858"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+            </g>
+            <g
+               id="g5505-4"
+               transform="translate(-192.31142,-266.57948)"
+               style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate">
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-8-5"
+                 d="m 284.70323,728.15695 68.83928,93.92858"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-8-9-04"
+                 d="m 290.84948,708.41305 68.83928,93.92858"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-8-9-8-4"
+                 d="m 296.95306,687.9345 68.83928,93.92858"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-8-9-0-0"
+                 d="m 302.5089,667.22636 68.83928,93.92858"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="g6395">
+          <path
+             sodipodi:nodetypes="ccccccc"
+             inkscape:connector-curvature="0"
+             id="path3800-4-0-8-5-1-2"
+             d="M 390.03278,693.18318 367.93717,667.12581 376.7594,638.39558 120.6031,287.91522 106.38007,350.67599 382.50793,724.86631 z"
+             style="color:#000000;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:5.80000019;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+          <g
+             id="g5963">
+            <g
+               id="g6384">
+              <g
+                 transform="translate(169.42857,-188)"
+                 id="g5635">
+                <path
+                   style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                   d="m 48.1061,664.43462 68.83928,93.92858"
+                   id="path3800-4-0-8-5-1-8-4-6"
+                   inkscape:connector-curvature="0"
+                   sodipodi:nodetypes="cc" />
+                <path
+                   style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                   d="m 54.25235,644.69072 68.83928,93.92858"
+                   id="path3800-4-0-8-5-1-8-9-7-6"
+                   inkscape:connector-curvature="0"
+                   sodipodi:nodetypes="cc" />
+              </g>
+              <g
+                 transform="translate(78.686847,-309.16478)"
+                 id="g5635-6">
+                <path
+                   style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                   d="m 48.1061,664.43462 68.83928,93.92858"
+                   id="path3800-4-0-8-5-1-8-4-6-8"
+                   inkscape:connector-curvature="0"
+                   sodipodi:nodetypes="cc" />
+                <path
+                   style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                   d="m 54.25235,644.69072 68.83928,93.92858"
+                   id="path3800-4-0-8-5-1-8-9-7-6-8"
+                   inkscape:connector-curvature="0"
+                   sodipodi:nodetypes="cc" />
+              </g>
+              <g
+                 id="g5746-9"
+                 transform="translate(230.16111,-191.2911)">
+                <path
+                   style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                   d="m 75.644312,783.18728 17.20982,23.48215 17.209828,23.48214"
+                   id="path3800-4-0-8-5-1-8-4-6-6-2"
+                   inkscape:connector-curvature="0"
+                   sodipodi:nodetypes="ccc" />
+                <path
+                   style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+                   d="m 81.532588,763.46246 17.20982,23.48215 17.209832,23.48214"
+                   id="path3800-4-0-8-5-1-8-4-6-6-6-8"
+                   inkscape:connector-curvature="0"
+                   sodipodi:nodetypes="ccc" />
+              </g>
+            </g>
+          </g>
+        </g>
+        <g
+           id="g6135">
+          <path
+             sodipodi:nodetypes="ccccc"
+             inkscape:connector-curvature="0"
+             id="path3800-4-0-8-5-1-2-6-2"
+             d="M 681.33929,542.36219 651.33928,663.07647 355.80358,846.29074 385.80359,725.57646 z"
+             style="color:#000000;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:5.80000019;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+          <g
+             id="g5974">
+            <g
+               id="g5903"
+               transform="translate(38.571429,-206.85715)">
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-2-6-0"
+                 d="M 346.28601,1009.7363 457.04493,941.70062"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-2-6-0-6"
+                 d="M 351.71202,990.92058 462.47094,922.88492"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-2-6-0-6-9"
+                 d="M 357.45548,971.91629 468.2144,903.88063"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-2-6-0-6-6"
+                 d="M 362.00116,953.22846 472.76008,885.1928"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+            </g>
+            <g
+               id="g5903-1"
+               transform="translate(179.04838,-291.95951)">
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-2-6-0-2"
+                 d="M 346.28601,1009.7363 457.04493,941.70062"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-2-6-0-6-8"
+                 d="M 351.71202,990.92058 462.47094,922.88492"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-2-6-0-6-9-8"
+                 d="M 357.45548,971.91629 468.2144,903.88063"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+              <path
+                 sodipodi:nodetypes="cc"
+                 inkscape:connector-curvature="0"
+                 id="path3800-4-0-8-5-1-2-6-0-6-6-1"
+                 d="M 362.00116,953.22846 472.76008,885.1928"
+                 style="color:#000000;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:3.29999995;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+            </g>
+          </g>
+        </g>
+      </g>
+    </g>
+    <g
+       transform="translate(-291.42772,-141.10485)"
+       id="g20019">
+      <g
+         style="fill:#7f755d;fill-opacity:1"
+         transform="matrix(0.181771,-0.00401536,0.00591171,0.1804431,680.18691,229.08403)"
+         id="g1917">
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc"
+           id="path1918"
+           d="m 1.4170205,261.85309 7.769385,-6.57914 c 0.765446,-1.05831 2.1914695,-2.72284 1.5255835,-4.7977 -0.665889,-2.07485 -5.2273365,-8.82612 -7.5721615,-9.77925 -1.386275,-0.90836 -2.42141895,-0.14712 -3.53780895,0.97913 l -7.97284325,7.1397 9.7878452,13.03726 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccccc"
+           id="path1919"
+           d="m 6.3306155,244.87972 c 0,0 -2.616026,-2.68246 -3.762417,-3.01369 -1.146391,-0.33124 -2.78605395,0.63625 -2.78605395,0.63625 l -8.95013235,8.40586 4.9440407,3.25217 10.5545626,-9.28059 z"
+           style="fill-rule:evenodd;stroke:url(#linearGradient13636);stroke-width:0.12755789pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc"
+           id="path1920"
+           d="m 1.1712645,261.24893 8.55879,-7.37552 c 0.7654475,-1.05831 0.7879145,-1.59597 0.122028,-3.67082 -0.665879,-2.07487 -2.311691,-3.96225 -3.176211,-5.03563 -0.864515,-1.07336 -0.934989,-0.88783 -0.934989,-0.88783 l -9.9615162,8.67619 5.3918982,8.29361 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="ccccccc"
+           id="path1921"
+           d="m 175.51025,216.82807 21.95339,16.91491 6.658,-2.15935 -1.95757,-24.45985 -5.06032,-7.39057 -24.29269,11.33659 2.69919,5.75827 z"
+           style="fill-rule:evenodd;stroke:#7f755d;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc"
+           id="path1922"
+           d="m -116.9537,358.31756 16.25336,-21.84817 9.630572,6.6259 -25.883932,15.22227 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="ccccc"
+           id="path1923"
+           d="m 107.78757,107.46646 65.87052,107.21317 7.55772,-4.67859 -66.95019,-108.29284 -6.47805,5.75826 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc"
+           id="path1924"
+           d="m -14.598686,260.57822 -85.10568,77.2095 -3.842104,-2.09678 84.095096,-76.57048 4.852688,1.45776 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="ccccc"
+           id="path1925"
+           d="m 125.60221,97.389495 66.03955,106.895065 6.84287,-2.66312 -64.60491,-105.491566 -8.27751,1.259621 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc"
+           id="path1926"
+           d="m -9.830588,265.49155 -84.110342,74.87974 -2.59509,-5.77891 83.496785,-74.38768 3.208647,5.28685 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="ccccccccccc"
+           id="path1927"
+           d="m 110.00338,110.582 c 1.2724,0.25448 6.11816,-5.21843 13.67588,-7.73767 7.55773,-2.51925 11.81997,-3.655376 12.7197,-4.914997 0.89973,-1.259621 0.0403,-4.234248 -3.05908,-4.498647 -3.24717,-0.277006 1.97492,-5.3986 -1.61951,-5.578322 -3.59892,-0.179946 -0.35989,-5.398375 -3.59892,-5.038484 -3.59475,0.399416 -8.99729,1.079675 -14.93551,3.598917 -5.93821,2.519242 -13.675879,7.557727 -14.03577,8.27751 -0.359892,0.719784 -0.89973,3.778863 1.79946,4.858538 2.69919,1.079675 -0.17995,3.239025 3.23902,5.038485 3.41898,1.79946 0.23641,6.8944 5.81473,5.99467 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="ccccccc"
+           id="path1928"
+           d="m 173.64877,214.66374 7.4398,-4.83107 c 0,0 1.68699,3.03659 1.95691,5.37588 0.23524,2.03879 1.03469,4.25122 -0.56233,5.08348 -1.39074,0.72474 -2.40677,0.3149 -3.50894,-0.53984 -1.10217,-0.85474 -3.41897,-2.69919 -3.84635,-3.21653 -0.42737,-0.51735 -1.47909,-1.87192 -1.47909,-1.87192 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc"
+           id="path1929"
+           d="m -93.801751,340.32522 c 0,0 -4.095912,3.39042 -5.194629,3.96327 -1.09871,0.57284 -3.92138,1.30285 -4.23982,0.55371 -0.32654,-0.76824 0.98731,-2.98324 1.63991,-4.0857 0.65681,-1.10957 2.826585,-3.81262 3.157733,-4.17955 0.331148,-0.36694 1.995326,-1.9592 1.995326,-1.9592 l 2.64148,5.70747 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc"
+           id="path1930"
+           d="m -96.344601,334.49624 c -0.825291,0.986 -4.161619,4.62437 -5.987149,5.25831 -0.86127,0.49333 -2.11326,1.24051 -2.81892,1.23501 -0.70566,-0.006 -1.47333,0.41108 -0.24286,-1.51529 1.23047,-1.92638 1.7546,-3.108 3.69543,-5.00838 1.57427,-1.79583 3.769887,-3.3333 3.769887,-3.3333 l 1.583612,3.36365 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="cccccc"
+           id="path1931"
+           d="m 197.2837,233.653 7.73767,5.84824 -0.89973,-8.36748 c 0,0 -1.84825,-3.50031 -2.24932,-2.15935 -0.80976,2.69919 -1.25709,3.04451 -3.59892,1.70948 -2.37727,-1.3552 -0.9897,2.96911 -0.9897,2.96911 z"
+           style="fill-rule:evenodd;stroke:#000000;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc"
+           id="path1932"
+           d="m -20.117505,259.67677 c 4.654072,3.69244 6.467237,3.63487 9.644037,12.66822 5.4456249,-6.37534 8.5048862,-7.63703 12.7005112,-11.28509 -2.7465784,-5.39697 -4.9249749,-9.08941 -10.5124624,-11.98639 -3.8303928,4.55715 -6.6380568,6.6143 -11.8320858,10.60326 z"
+           style="opacity:0.66134183;fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="cccccc"
+           id="path1933"
+           d="m 197.2837,233.653 7.73767,5.84824 -0.89973,-8.36748 c 0,0 -1.84825,-3.50031 -2.24932,-2.15935 -0.80976,2.69919 -1.25709,3.04451 -3.59892,1.70948 -2.37727,-1.3552 -0.9897,2.96911 -0.9897,2.96911 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc"
+           id="path1935"
+           d="m -3.0784244,252.19014 -13.3404576,11.17254 -2.594287,-2.38508 13.0932716,-10.60509 2.841473,1.81763 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc"
+           id="path1936"
+           d="m 9.6173564,249.29743 c -6.3752923,-5.91819 -9.05434448,-0.58695 -13.3404576,2.97653 -0.8647623,-0.79503 -1.7295247,-1.59005 -2.594287,-2.38508 3.2394813,-3.69574 4.8719016,-5.62371 9.8791499,-7.87309 0.9471577,0.60588 4.6263188,6.19364 6.0555947,7.28164 z"
+           style="fill-rule:evenodd;stroke:none" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccc"
+         id="path1934"
+         d="m 682.29306,275.84865 1.4079,-1.24901 c 0.13622,-0.19892 0.39186,-0.51269 0.25521,-0.89377 -0.13666,-0.38107 -1.02757,-1.61115 -1.47029,-1.77782 -0.26383,-0.16232 -0.45211,-0.0172 -0.65332,0.19569 l -1.44241,1.35353 1.90291,2.37138 z"
+         style="fill:#ff7556;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccc"
+         id="path1719"
+         d="m 683.10581,272.68865 c 0,0 -0.50374,-0.48544 -0.71937,-0.54199 -0.21563,-0.0566 -0.5153,0.12916 -0.5153,0.12916 l -1.61686,1.59178 0.941,0.58124 1.91053,-1.76019 z"
+         style="fill:url(#linearGradient13638);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient13640);stroke-width:0.02369117pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccc"
+         id="path1086"
+         d="m 682.2436,275.7379 1.55018,-1.39957 c 0.13622,-0.19892 0.13715,-0.29847 4.9e-4,-0.67954 -0.13666,-0.38107 -0.45478,-0.72343 -0.62238,-0.91843 -0.16761,-0.19499 -0.17961,-0.16038 -0.17961,-0.16038 l -1.80369,1.64594 1.05501,1.51198 z"
+         style="fill:url(#linearGradient13642);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccc"
+         id="path4247"
+         d="m 665.03485,291.8397 -3.55147,2.04823 -0.50089,-0.41474 2.13093,-3.44443 1.09463,-0.96833 1.55424,2.00466 -0.72744,0.77461 z"
+         style="fill:url(#linearGradient13644);fill-opacity:1;fill-rule:evenodd;stroke:#7f755d;stroke-width:0.0312406pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc"
+         id="path1869"
+         d="m 660.82006,294.1801 2.8963,-4.10843 1.83475,1.18603 -4.73105,2.9224 z"
+         style="fill:url(#linearGradient13646);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1745"
+         d="m 680.51064,277.3948 -15.11913,14.16958 -0.39251,-0.78734 15.31338,-14.30553 0.19826,0.92329 z"
+         style="fill:#d98100;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1862"
+         d="m 679.30091,275.67874 -15.39097,14.6327 -0.72866,-0.37205 15.20653,-14.51033 0.9131,0.24968 z"
+         style="fill:#eb9a00;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1747"
+         d="m 679.51026,275.6741 -15.11104,14.12163 -0.47972,-0.48933 14.85539,-13.94541 0.73537,0.31311 z"
+         style="fill:#ffe07a;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1746"
+         d="m 680.21919,276.56799 -15.21961,14.19764 -0.51861,-1.05831 15.10827,-14.10409 0.62995,0.96476 z"
+         style="fill:#f5a600;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccccccc"
+         id="path1736"
+         d="m 680.04086,277.80167 c -0.14846,0.0156 -0.20463,-0.84074 -0.76783,-1.3212 -0.56319,-0.48046 -0.90331,-0.71097 -0.8945,-0.90456 0.009,-0.19359 0.33064,-0.60241 0.66417,-0.58977 0.34944,0.0132 0.22754,-0.79922 0.60431,-0.76653 0.37724,0.0327 0.46303,-0.76137 0.76129,-0.65775 0.33103,0.115 0.8222,0.2992 1.22204,0.75342 0.39984,0.45423 0.78205,1.29563 0.76146,1.40375 -0.0206,0.10813 -0.20796,0.55162 -0.56557,0.66133 -0.3576,0.10971 -0.23788,0.46323 -0.72499,0.66357 -0.48711,0.20035 -0.56883,0.97598 -1.06038,0.75774 z"
+         style="fill:url(#linearGradient13648);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccc"
+         id="path1748"
+         d="m 665.3937,291.56227 -0.36856,-0.8071 c 0,0 -0.4102,0.40422 -0.62234,0.7323 -0.18488,0.28593 -0.44041,0.5874 -0.34511,0.73155 0.083,0.12553 0.21788,0.0837 0.39662,-0.0199 0.17873,-0.10362 0.55823,-0.32821 0.64223,-0.39481 0.084,-0.0666 0.29716,-0.24207 0.29716,-0.24207 z"
+         style="fill:#d98100;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccc"
+         id="path3001"
+         d="m 665.02523,290.75654 c 0,0 -0.7427,0.64402 -0.94397,0.75451 -0.20126,0.11049 -0.72282,0.25715 -0.7867,0.11988 -0.0655,-0.14077 0.1659,-0.55591 0.28082,-0.76253 0.11567,-0.20796 0.50361,-0.7169 0.5631,-0.78614 0.0595,-0.0692 0.35994,-0.37063 0.35994,-0.37063 l 0.52681,1.04491 z"
+         style="fill:#f5a600;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccc"
+         id="path3624"
+         d="m 664.51606,289.68875 c -0.14781,0.18578 -0.74746,0.87255 -1.0838,0.99733 -0.1575,0.0948 -0.38627,0.23817 -0.5178,0.24006 -0.13153,0.002 -0.27205,0.0821 -0.0544,-0.2793 0.21762,-0.36141 0.30812,-0.58215 0.65827,-0.94167 0.28247,-0.33868 0.68229,-0.63212 0.68229,-0.63212 l 0.31548,0.6157 z"
+         style="fill:#ffe07a;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccc"
+         id="path4877"
+         d="m 661.50864,293.87805 -1.24277,0.70578 0.75218,-1.17458 c 0,0 0.46311,-0.4675 0.39757,-0.27044 -0.13168,0.39672 -0.11386,0.45304 0.22789,0.30125 0.34692,-0.15408 -0.13487,0.43799 -0.13487,0.43799 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.0312406pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1874"
+         d="m 678.26705,275.53471 c 0.88963,0.66388 1.22716,0.64576 1.87388,2.3037 0.97612,-1.20174 1.53854,-1.44773 2.29826,-2.13982 -0.54451,-0.98704 -0.97282,-1.66111 -2.03157,-2.174 -0.68615,0.85876 -1.19687,1.25085 -2.14057,2.01012 z"
+         style="opacity:0.66134183;fill:url(#linearGradient13650);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccc"
+         id="path1879"
+         d="m 661.50864,293.87805 -1.24277,0.70578 0.75218,-1.17458 c 0,0 0.46311,-0.4675 0.39757,-0.27044 -0.13168,0.39672 -0.11386,0.45304 0.22789,0.30125 0.34692,-0.15408 -0.13487,0.43799 -0.13487,0.43799 z"
+         style="fill:url(#linearGradient13652);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1891"
+         d="m 681.35307,274.03857 -2.37447,2.16274 -0.49788,-0.43052 2.30861,-2.11935 0.56374,0.38713 z"
+         style="fill:url(#linearGradient13654);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1896"
+         d="m 683.74504,273.49232 c -1.22386,-1.06852 -1.69077,-0.0713 -2.46786,0.60552 -0.16596,-0.14351 -0.33193,-0.28702 -0.49789,-0.43052 0.58126,-0.69698 0.87377,-1.06034 1.79321,-1.49705 0.18016,0.10818 0.89961,1.12667 1.17254,1.32205 z"
+         style="fill:url(#linearGradient13656);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+    </g>
+  </g>
+  <text
+     style="font-size:20px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"
+     id="text18377-4"
+     y="294.98721"
+     x="47.111958"><tspan
+       id="tspan18379-2"
+       y="294.98721"
+       x="47.111958">Logos</tspan></text>
+  <g
+     id="g13490"
+     transform="matrix(5.2771659,0,0,5.2771659,-1218.602,-533.38524)">
+    <g
+       id="text13434"
+       style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#6e6e6e;fill-opacity:1;stroke:none;font-family:Sans">
+      <path
+         sodipodi:nodetypes="ccccccccccccc"
+         inkscape:connector-curvature="0"
+         id="path13460"
+         d="m 266.58594,152.17992 4.60937,0 0,0.83007 -3.62304,0 0,2.15821 3.47168,0 0,0.83008 -3.47168,0 0,2.6416 12.36526,0 0,0.83008 -13.35159,0 0,-7.29004" />
+    </g>
+    <g
+       id="text13434-4"
+       style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#6e6e6e;fill-opacity:1;stroke:none;font-family:Sans">
+      <path
+         sodipodi:nodetypes="ccccccc"
+         inkscape:connector-curvature="0"
+         id="path13463"
+         d="m 280.58594,152.17992 0.98633,0 0,6.45996 5.92407,0 0,0.83008 -6.9104,0 0,-7.29004" />
+    </g>
+    <text
+       sodipodi:linespacing="125%"
+       id="text13465"
+       y="157.09047"
+       x="271.47394"
+       style="font-size:4px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       xml:space="preserve"><tspan
+         y="157.09047"
+         x="271.47394"
+         id="tspan13467"
+         sodipodi:role="line">ther</tspan></text>
+    <text
+       sodipodi:linespacing="125%"
+       id="text13465-3"
+       y="157.09047"
+       x="282.16135"
+       style="font-size:4px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       xml:space="preserve"><tspan
+         y="157.09047"
+         x="282.16135"
+         id="tspan13467-8"
+         sodipodi:role="line">ab</tspan></text>
+  </g>
+  <text
+     xml:space="preserve"
+     style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+     x="340.53214"
+     y="304.15552"
+     id="text13524"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan13526"
+       x="340.53214"
+       y="304.15552"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Ume Gothic C5;-inkscape-font-specification:Ume Gothic C5"
+       dx="0 -3.3841705 -2.9611492 -2.1151066 -3.8071918">Ether<tspan
+   style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+   id="tspan13528" /></tspan></text>
+  <g
+     transform="translate(189.64271,0.17806707)"
+     id="g12739-1">
+    <rect
+       inkscape:label="#rect16270"
+       style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="editCIA402Slave"
+       y="130.25732"
+       x="368.70486"
+       height="24"
+       width="24" />
+    <g
+       id="g15478"
+       transform="matrix(1.8400527,0,0,1.8400527,-545.66816,-193.08435)">
+      <g
+         inkscape:label="Calque 1"
+         id="layer1-1-9"
+         transform="matrix(-0.03037121,0,0,0.03037121,515.46377,170.91105)">
+        <g
+           id="g16056-4"
+           transform="translate(-48,0)">
+          <path
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc"
+             id="rect15422-9"
+             d="m 261.23647,217.28623 175.53201,57.07437 -3.125,208.62261 -170.15701,-72.94937 z"
+             style="fill:url(#linearGradient13602);fill-opacity:1;stroke:none" />
+          <path
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc"
+             id="rect15942-8"
+             d="M 257.63822,217.28208 452.87456,201.38389 632.56367,259.59396 436.54848,274.2032 z"
+             style="fill:url(#linearGradient13604);fill-opacity:1;stroke:none" />
+          <path
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc"
+             id="rect15953-6"
+             d="m 436.5,273.54968 195.5,-14.25 0.59315,205.70147 -198.84315,17.5 z"
+             style="fill:#333333;fill-opacity:1;stroke:none" />
+        </g>
+      </g>
+      <g
+         transform="matrix(0.98401111,0.21690648,-0.21690648,0.98401111,54.630578,-109.30701)"
+         id="g15330">
+        <path
+           style="color:#000000;fill:url(#linearGradient13606);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           d="m 494.71875,185.46875 c -0.35176,0 -0.69473,0.1022 -0.96875,0.28125 -0.10135,0.0662 -0.34443,0.21161 -0.42188,0.28906 l -0.0625,0.0625 c 0.34548,-0.16642 0.5872,-0.19531 0.82813,-0.19531 0.96372,0 1.75,0.78628 1.75,1.75 0,0.5778 -0.28613,1.08868 -0.71875,1.40625 l 0.5625,-0.40625 c 0.0312,-0.0211 0.0641,-0.0395 0.0937,-0.0625 0.41238,-0.31916 0.65625,-0.81319 0.65625,-1.375 0,-0.96372 -0.75503,-1.75 -1.71875,-1.75 z"
+           id="path14397"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="scscsscccss" />
+        <path
+           sodipodi:type="arc"
+           style="color:#000000;fill:url(#linearGradient13608);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path14397-8"
+           sodipodi:cx="500.96298"
+           sodipodi:cy="182.15448"
+           sodipodi:rx="1.7449629"
+           sodipodi:ry="1.7449629"
+           d="m 502.70795,182.15448 c 0,0.96372 -0.78125,1.74496 -1.74497,1.74496 -0.96371,0 -1.74496,-0.78124 -1.74496,-1.74496 0,-0.96372 0.78125,-1.74496 1.74496,-1.74496 0.96372,0 1.74497,0.78124 1.74497,1.74496 z"
+           transform="translate(-6.874099,5.4992756)" />
+      </g>
+      <g
+         transform="translate(6.9375,1.125)"
+         id="g15470">
+        <path
+           transform="matrix(0.31018135,0.06837356,-0.06837356,0.31018135,347.67882,91.940035)"
+           d="m 502.70795,182.15448 c 0,0.96372 -0.78125,1.74496 -1.74497,1.74496 -0.96371,0 -1.74496,-0.78124 -1.74496,-1.74496 0,-0.96372 0.78125,-1.74496 1.74496,-1.74496 0.96372,0 1.74497,0.78124 1.74497,1.74496 z"
+           sodipodi:ry="1.7449629"
+           sodipodi:rx="1.7449629"
+           sodipodi:cy="182.15448"
+           sodipodi:cx="500.96298"
+           id="path14397-8-8"
+           style="color:#000000;fill:url(#linearGradient13610);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc" />
+        <path
+           inkscape:connector-curvature="0"
+           style="color:#000000;fill:url(#linearGradient13612);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           d="m 492.875,180.96875 c -0.046,0.009 -0.0831,0.0119 -0.125,0.0312 l -0.0625,0.0312 -2.375,1.1875 c 0.11954,-0.0764 0.25679,-0.0954 0.40625,-0.0625 0.29893,0.0659 0.50339,0.35732 0.4375,0.65625 -0.033,0.14946 -0.13046,0.26739 -0.25,0.34375 0.77078,-0.3938 1.58077,-0.78916 2.34375,-1.15625 0.13759,-0.0738 0.24501,-0.21059 0.28125,-0.375 0.0659,-0.29893 -0.13857,-0.59036 -0.4375,-0.65625 -0.0747,-0.0165 -0.14796,-0.0131 -0.21875,0 z"
+           id="path14397-8-8-5" />
+      </g>
+    </g>
+    <g
+       transform="translate(-291.42772,-141.10485)"
+       id="g20019-1">
+      <g
+         style="fill:#7f755d;fill-opacity:1"
+         transform="matrix(0.181771,-0.00401536,0.00591171,0.1804431,680.18691,229.08403)"
+         id="g1917-7">
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc"
+           id="path1918-2"
+           d="m 1.4170205,261.85309 7.769385,-6.57914 c 0.765446,-1.05831 2.1914695,-2.72284 1.5255835,-4.7977 -0.665889,-2.07485 -5.2273365,-8.82612 -7.5721615,-9.77925 -1.386275,-0.90836 -2.42141895,-0.14712 -3.53780895,0.97913 l -7.97284325,7.1397 9.7878452,13.03726 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccccc"
+           id="path1919-2"
+           d="m 6.3306155,244.87972 c 0,0 -2.616026,-2.68246 -3.762417,-3.01369 -1.146391,-0.33124 -2.78605395,0.63625 -2.78605395,0.63625 l -8.95013235,8.40586 4.9440407,3.25217 10.5545626,-9.28059 z"
+           style="fill-rule:evenodd;stroke:url(#linearGradient13614);stroke-width:0.12755789pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc"
+           id="path1920-8"
+           d="m 1.1712645,261.24893 8.55879,-7.37552 c 0.7654475,-1.05831 0.7879145,-1.59597 0.122028,-3.67082 -0.665879,-2.07487 -2.311691,-3.96225 -3.176211,-5.03563 -0.864515,-1.07336 -0.934989,-0.88783 -0.934989,-0.88783 l -9.9615162,8.67619 5.3918982,8.29361 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="ccccccc"
+           id="path1921-3"
+           d="m 175.51025,216.82807 21.95339,16.91491 6.658,-2.15935 -1.95757,-24.45985 -5.06032,-7.39057 -24.29269,11.33659 2.69919,5.75827 z"
+           style="fill-rule:evenodd;stroke:#7f755d;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc"
+           id="path1922-2"
+           d="m -116.9537,358.31756 16.25336,-21.84817 9.630572,6.6259 -25.883932,15.22227 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="ccccc"
+           id="path1923-2"
+           d="m 107.78757,107.46646 65.87052,107.21317 7.55772,-4.67859 -66.95019,-108.29284 -6.47805,5.75826 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc"
+           id="path1924-3"
+           d="m -14.598686,260.57822 -85.10568,77.2095 -3.842104,-2.09678 84.095096,-76.57048 4.852688,1.45776 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="ccccc"
+           id="path1925-4"
+           d="m 125.60221,97.389495 66.03955,106.895065 6.84287,-2.66312 -64.60491,-105.491566 -8.27751,1.259621 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc"
+           id="path1926-6"
+           d="m -9.830588,265.49155 -84.110342,74.87974 -2.59509,-5.77891 83.496785,-74.38768 3.208647,5.28685 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="ccccccccccc"
+           id="path1927-9"
+           d="m 110.00338,110.582 c 1.2724,0.25448 6.11816,-5.21843 13.67588,-7.73767 7.55773,-2.51925 11.81997,-3.655376 12.7197,-4.914997 0.89973,-1.259621 0.0403,-4.234248 -3.05908,-4.498647 -3.24717,-0.277006 1.97492,-5.3986 -1.61951,-5.578322 -3.59892,-0.179946 -0.35989,-5.398375 -3.59892,-5.038484 -3.59475,0.399416 -8.99729,1.079675 -14.93551,3.598917 -5.93821,2.519242 -13.675879,7.557727 -14.03577,8.27751 -0.359892,0.719784 -0.89973,3.778863 1.79946,4.858538 2.69919,1.079675 -0.17995,3.239025 3.23902,5.038485 3.41898,1.79946 0.23641,6.8944 5.81473,5.99467 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="ccccccc"
+           id="path1928-1"
+           d="m 173.64877,214.66374 7.4398,-4.83107 c 0,0 1.68699,3.03659 1.95691,5.37588 0.23524,2.03879 1.03469,4.25122 -0.56233,5.08348 -1.39074,0.72474 -2.40677,0.3149 -3.50894,-0.53984 -1.10217,-0.85474 -3.41897,-2.69919 -3.84635,-3.21653 -0.42737,-0.51735 -1.47909,-1.87192 -1.47909,-1.87192 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc"
+           id="path1929-8"
+           d="m -93.801751,340.32522 c 0,0 -4.095912,3.39042 -5.194629,3.96327 -1.09871,0.57284 -3.92138,1.30285 -4.23982,0.55371 -0.32654,-0.76824 0.98731,-2.98324 1.63991,-4.0857 0.65681,-1.10957 2.826585,-3.81262 3.157733,-4.17955 0.331148,-0.36694 1.995326,-1.9592 1.995326,-1.9592 l 2.64148,5.70747 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc"
+           id="path1930-8"
+           d="m -96.344601,334.49624 c -0.825291,0.986 -4.161619,4.62437 -5.987149,5.25831 -0.86127,0.49333 -2.11326,1.24051 -2.81892,1.23501 -0.70566,-0.006 -1.47333,0.41108 -0.24286,-1.51529 1.23047,-1.92638 1.7546,-3.108 3.69543,-5.00838 1.57427,-1.79583 3.769887,-3.3333 3.769887,-3.3333 l 1.583612,3.36365 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="cccccc"
+           id="path1931-1"
+           d="m 197.2837,233.653 7.73767,5.84824 -0.89973,-8.36748 c 0,0 -1.84825,-3.50031 -2.24932,-2.15935 -0.80976,2.69919 -1.25709,3.04451 -3.59892,1.70948 -2.37727,-1.3552 -0.9897,2.96911 -0.9897,2.96911 z"
+           style="fill-rule:evenodd;stroke:#000000;stroke-width:0.25pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc"
+           id="path1932-0"
+           d="m -20.117505,259.67677 c 4.654072,3.69244 6.467237,3.63487 9.644037,12.66822 5.4456249,-6.37534 8.5048862,-7.63703 12.7005112,-11.28509 -2.7465784,-5.39697 -4.9249749,-9.08941 -10.5124624,-11.98639 -3.8303928,4.55715 -6.6380568,6.6143 -11.8320858,10.60326 z"
+           style="opacity:0.66134183;fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           transform="matrix(-0.538066,-0.09955063,-0.448862,0.758281,97.82153,199.2334)"
+           sodipodi:nodetypes="cccccc"
+           id="path1933-7"
+           d="m 197.2837,233.653 7.73767,5.84824 -0.89973,-8.36748 c 0,0 -1.84825,-3.50031 -2.24932,-2.15935 -0.80976,2.69919 -1.25709,3.04451 -3.59892,1.70948 -2.37727,-1.3552 -0.9897,2.96911 -0.9897,2.96911 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc"
+           id="path1935-7"
+           d="m -3.0784244,252.19014 -13.3404576,11.17254 -2.594287,-2.38508 13.0932716,-10.60509 2.841473,1.81763 z"
+           style="fill-rule:evenodd;stroke:none" />
+        <path
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccc"
+           id="path1936-8"
+           d="m 9.6173564,249.29743 c -6.3752923,-5.91819 -9.05434448,-0.58695 -13.3404576,2.97653 -0.8647623,-0.79503 -1.7295247,-1.59005 -2.594287,-2.38508 3.2394813,-3.69574 4.8719016,-5.62371 9.8791499,-7.87309 0.9471577,0.60588 4.6263188,6.19364 6.0555947,7.28164 z"
+           style="fill-rule:evenodd;stroke:none" />
+      </g>
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccc"
+         id="path1934-2"
+         d="m 682.29306,275.84865 1.4079,-1.24901 c 0.13622,-0.19892 0.39186,-0.51269 0.25521,-0.89377 -0.13666,-0.38107 -1.02757,-1.61115 -1.47029,-1.77782 -0.26383,-0.16232 -0.45211,-0.0172 -0.65332,0.19569 l -1.44241,1.35353 1.90291,2.37138 z"
+         style="fill:#ff7556;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccc"
+         id="path1719-4"
+         d="m 683.10581,272.68865 c 0,0 -0.50374,-0.48544 -0.71937,-0.54199 -0.21563,-0.0566 -0.5153,0.12916 -0.5153,0.12916 l -1.61686,1.59178 0.941,0.58124 1.91053,-1.76019 z"
+         style="fill:url(#linearGradient13616);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient13618);stroke-width:0.02369117pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccc"
+         id="path1086-6"
+         d="m 682.2436,275.7379 1.55018,-1.39957 c 0.13622,-0.19892 0.13715,-0.29847 4.9e-4,-0.67954 -0.13666,-0.38107 -0.45478,-0.72343 -0.62238,-0.91843 -0.16761,-0.19499 -0.17961,-0.16038 -0.17961,-0.16038 l -1.80369,1.64594 1.05501,1.51198 z"
+         style="fill:url(#linearGradient13620);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccc"
+         id="path4247-9"
+         d="m 665.03485,291.8397 -3.55147,2.04823 -0.50089,-0.41474 2.13093,-3.44443 1.09463,-0.96833 1.55424,2.00466 -0.72744,0.77461 z"
+         style="fill:url(#linearGradient13622);fill-opacity:1;fill-rule:evenodd;stroke:#7f755d;stroke-width:0.0312406pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccc"
+         id="path1869-3"
+         d="m 660.82006,294.1801 2.8963,-4.10843 1.83475,1.18603 -4.73105,2.9224 z"
+         style="fill:url(#linearGradient13624);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1745-0"
+         d="m 680.51064,277.3948 -15.11913,14.16958 -0.39251,-0.78734 15.31338,-14.30553 0.19826,0.92329 z"
+         style="fill:#d98100;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1862-4"
+         d="m 679.30091,275.67874 -15.39097,14.6327 -0.72866,-0.37205 15.20653,-14.51033 0.9131,0.24968 z"
+         style="fill:#eb9a00;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1747-7"
+         d="m 679.51026,275.6741 -15.11104,14.12163 -0.47972,-0.48933 14.85539,-13.94541 0.73537,0.31311 z"
+         style="fill:#ffe07a;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1746-7"
+         d="m 680.21919,276.56799 -15.21961,14.19764 -0.51861,-1.05831 15.10827,-14.10409 0.62995,0.96476 z"
+         style="fill:#f5a600;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccccccc"
+         id="path1736-0"
+         d="m 680.04086,277.80167 c -0.14846,0.0156 -0.20463,-0.84074 -0.76783,-1.3212 -0.56319,-0.48046 -0.90331,-0.71097 -0.8945,-0.90456 0.009,-0.19359 0.33064,-0.60241 0.66417,-0.58977 0.34944,0.0132 0.22754,-0.79922 0.60431,-0.76653 0.37724,0.0327 0.46303,-0.76137 0.76129,-0.65775 0.33103,0.115 0.8222,0.2992 1.22204,0.75342 0.39984,0.45423 0.78205,1.29563 0.76146,1.40375 -0.0206,0.10813 -0.20796,0.55162 -0.56557,0.66133 -0.3576,0.10971 -0.23788,0.46323 -0.72499,0.66357 -0.48711,0.20035 -0.56883,0.97598 -1.06038,0.75774 z"
+         style="fill:url(#linearGradient13626);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccc"
+         id="path1748-8"
+         d="m 665.3937,291.56227 -0.36856,-0.8071 c 0,0 -0.4102,0.40422 -0.62234,0.7323 -0.18488,0.28593 -0.44041,0.5874 -0.34511,0.73155 0.083,0.12553 0.21788,0.0837 0.39662,-0.0199 0.17873,-0.10362 0.55823,-0.32821 0.64223,-0.39481 0.084,-0.0666 0.29716,-0.24207 0.29716,-0.24207 z"
+         style="fill:#d98100;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccc"
+         id="path3001-0"
+         d="m 665.02523,290.75654 c 0,0 -0.7427,0.64402 -0.94397,0.75451 -0.20126,0.11049 -0.72282,0.25715 -0.7867,0.11988 -0.0655,-0.14077 0.1659,-0.55591 0.28082,-0.76253 0.11567,-0.20796 0.50361,-0.7169 0.5631,-0.78614 0.0595,-0.0692 0.35994,-0.37063 0.35994,-0.37063 l 0.52681,1.04491 z"
+         style="fill:#f5a600;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccccc"
+         id="path3624-7"
+         d="m 664.51606,289.68875 c -0.14781,0.18578 -0.74746,0.87255 -1.0838,0.99733 -0.1575,0.0948 -0.38627,0.23817 -0.5178,0.24006 -0.13153,0.002 -0.27205,0.0821 -0.0544,-0.2793 0.21762,-0.36141 0.30812,-0.58215 0.65827,-0.94167 0.28247,-0.33868 0.68229,-0.63212 0.68229,-0.63212 l 0.31548,0.6157 z"
+         style="fill:#ffe07a;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccc"
+         id="path4877-0"
+         d="m 661.50864,293.87805 -1.24277,0.70578 0.75218,-1.17458 c 0,0 0.46311,-0.4675 0.39757,-0.27044 -0.13168,0.39672 -0.11386,0.45304 0.22789,0.30125 0.34692,-0.15408 -0.13487,0.43799 -0.13487,0.43799 z"
+         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.0312406pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1874-3"
+         d="m 678.26705,275.53471 c 0.88963,0.66388 1.22716,0.64576 1.87388,2.3037 0.97612,-1.20174 1.53854,-1.44773 2.29826,-2.13982 -0.54451,-0.98704 -0.97282,-1.66111 -2.03157,-2.174 -0.68615,0.85876 -1.19687,1.25085 -2.14057,2.01012 z"
+         style="opacity:0.66134183;fill:url(#linearGradient13628);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccc"
+         id="path1879-8"
+         d="m 661.50864,293.87805 -1.24277,0.70578 0.75218,-1.17458 c 0,0 0.46311,-0.4675 0.39757,-0.27044 -0.13168,0.39672 -0.11386,0.45304 0.22789,0.30125 0.34692,-0.15408 -0.13487,0.43799 -0.13487,0.43799 z"
+         style="fill:url(#linearGradient13630);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1891-6"
+         d="m 681.35307,274.03857 -2.37447,2.16274 -0.49788,-0.43052 2.30861,-2.11935 0.56374,0.38713 z"
+         style="fill:url(#linearGradient13632);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="ccccc"
+         id="path1896-5"
+         d="m 683.74504,273.49232 c -1.22386,-1.06852 -1.69077,-0.0713 -2.46786,0.60552 -0.16596,-0.14351 -0.33193,-0.28702 -0.49789,-0.43052 0.58126,-0.69698 0.87377,-1.06034 1.79321,-1.49705 0.18016,0.10818 0.89961,1.12667 1.17254,1.32205 z"
+         style="fill:url(#linearGradient13634);fill-opacity:1;fill-rule:evenodd;stroke:none" />
+    </g>
+  </g>
+  <g
+     transform="matrix(-0.03037121,0,0,0.03037121,471.53163,160.27438)"
+     id="layer1-1"
+     inkscape:label="Calque 1">
+    <g
+       transform="translate(-48,0)"
+       id="g16056">
+      <path
+         style="opacity:0.77950296;fill:url(#linearGradient13302);fill-opacity:1;stroke:none"
+         d="m 236.86183,217.28623 199.90665,57.07437 -3.125,603.73364 -194.53165,-72.94937 -2.25,-587.85864 z"
+         id="rect15422"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:url(#linearGradient13304);fill-opacity:1;stroke:none"
+         d="M 236.74567,217.28208 431.98201,201.38389 632.56367,259.59396 436.54848,274.2032 236.74567,217.28208 z"
+         id="rect15942"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#333333;fill-opacity:1;stroke:none"
+         d="m 436.5,273.54968 195.5,-14.25 0.59315,600.8125 -198.84315,17.5 2.75,-604.0625 z"
+         id="rect15953"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,840.86218 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="rect16004"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,815.33719 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16007"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,764.28717 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16009"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,713.23718 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16011"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,662.18719 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16013"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,611.1372 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16015"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,585.61219 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16017"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,534.5622 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16019"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,457.98719 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16021"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,432.46217 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16023"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,381.41224 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16025"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,355.88721 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16027"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,330.36219 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16029"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,406.9372 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16031"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,483.51221 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16033"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,509.03724 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16035"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,560.0872 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16037"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,636.66217 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16039"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,687.71219 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16041"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,738.76217 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16043"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.77950296;fill:#000000;fill-opacity:1;stroke:none"
+         d="m 452.25,789.81219 171.5,-14 0,18 -171.5,14 0,-18 z"
+         id="path16045"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.55263199;fill:#4d4d4d;fill-opacity:1;stroke:none"
+         d="m 255.81729,710.76923 159.22033,59.91169 0,76.36748 -159.22033,-59.91164 0,-76.36753 z"
+         id="rect16047"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.55263199;fill:#4d4d4d;fill-opacity:1;stroke:none"
+         d="m 255.81729,613.2537 159.22033,59.91169 0,76.36748 -159.22033,-59.91164 0,-76.36753 z"
+         id="path16050"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.55263199;fill:#4d4d4d;fill-opacity:1;stroke:none"
+         d="m 255.81729,515.73816 159.22033,59.91169 0,76.36748 -159.22033,-59.91164 0,-76.36753 z"
+         id="path16052"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.55263199;fill:#4d4d4d;fill-opacity:1;stroke:none"
+         d="m 255.81729,418.2226 159.22033,59.91169 0,76.36748 -159.22033,-59.91164 0,-76.36753 z"
+         id="path16054"
+         sodipodi:nodetypes="ccccc"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+  <text
+     style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     xml:space="preserve"
+     id="text18383-9"
+     y="206.56827"
+     x="40.31776"
+     sodipodi:linespacing="125%"><tspan
+       sodipodi:role="line"
+       id="tspan18181"
+       x="40.31776"
+       y="206.56827">Plugin</tspan><tspan
+       sodipodi:role="line"
+       id="tspan18183"
+       x="40.31776"
+       y="231.56827">Tabs icons</tspan></text>
+  <text
+     sodipodi:linespacing="125%"
+     style="font-size:12.76000023px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+     xml:space="preserve"
+     id="text60407-6"
+     y="208.63211"
+     x="175.23717"><tspan
+       y="208.63211"
+       x="175.23717"
+       id="tspan16195-0"
+       sodipodi:role="line">%% Ethercat Slave CIA402Slave %%</tspan></text>
+  <g
+     transform="translate(310.76843,213.90813)"
+     style="display:inline"
+     id="Slave"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:url(#linearGradient18288);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+       d="m -40,0 0,16 16,0 0,-16 -16,0 z m 1,1 14,0 0,14 -14,0 0,-14 z"
+       id="path3806"
+       sodipodi:nodetypes="cccccccccc"
+       inkscape:label="#rect2160" />
+  </g>
+  <g
+     transform="translate(372.41593,213.68848)"
+     style="display:inline"
+     id="CIA402Slave"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:url(#linearGradient13249);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+       d="m -40,0 0,16 16,0 0,-16 -16,0 z m 1,1 14,0 0,14 -14,0 0,-14 z"
+       id="path3806-9"
+       sodipodi:nodetypes="cccccccccc"
+       inkscape:label="#rect2160" />
+  </g>
+  <use
+     x="0"
+     y="0"
+     xlink:href="#g12739"
+     id="use13270"
+     transform="matrix(0.53043689,0,0,0.53043689,18.559641,146.32621)"
+     width="744.09448"
+     height="1052.3622" />
+  <use
+     x="0"
+     y="0"
+     xlink:href="#g12739-1"
+     id="use13306"
+     transform="matrix(0.51386408,0,0,0.51386408,47.179085,148.43892)"
+     width="744.09448"
+     height="1052.3622" />
+  <g
+     transform="translate(293.64271,0.1780684)"
+     id="g12739-1-7">
+    <rect
+       inkscape:label="#rect16270"
+       style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="CIA402AxisRef"
+       y="130.25732"
+       x="368.70486"
+       height="24"
+       width="24" />
+    <g
+       id="g15478-1"
+       transform="matrix(1.8400527,0,0,1.8400527,-545.66816,-193.08435)">
+      <g
+         inkscape:label="Calque 1"
+         id="layer1-1-9-4"
+         transform="matrix(-0.03037121,0,0,0.03037121,515.46377,170.91105)">
+        <g
+           id="g16056-4-2"
+           transform="translate(-48,0)">
+          <path
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc"
+             id="rect15422-9-9"
+             d="m 261.23647,217.28623 175.53201,57.07437 -3.125,208.62261 -170.15701,-72.94937 z"
+             style="fill:url(#linearGradient15515-4);fill-opacity:1;stroke:none" />
+          <path
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc"
+             id="rect15942-8-8"
+             d="M 257.63822,217.28208 452.87456,201.38389 632.56367,259.59396 436.54848,274.2032 z"
+             style="fill:url(#linearGradient15517-6);fill-opacity:1;stroke:none" />
+          <path
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc"
+             id="rect15953-6-8"
+             d="m 436.5,273.54968 195.5,-14.25 0.59315,205.70147 -198.84315,17.5 z"
+             style="fill:#333333;fill-opacity:1;stroke:none" />
+        </g>
+      </g>
+      <g
+         transform="matrix(0.98401111,0.21690648,-0.21690648,0.98401111,54.630578,-109.30701)"
+         id="g15330-3">
+        <path
+           style="color:#000000;fill:url(#linearGradient15519-9);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           d="m 494.71875,185.46875 c -0.35176,0 -0.69473,0.1022 -0.96875,0.28125 -0.10135,0.0662 -0.34443,0.21161 -0.42188,0.28906 l -0.0625,0.0625 c 0.34548,-0.16642 0.5872,-0.19531 0.82813,-0.19531 0.96372,0 1.75,0.78628 1.75,1.75 0,0.5778 -0.28613,1.08868 -0.71875,1.40625 l 0.5625,-0.40625 c 0.0312,-0.0211 0.0641,-0.0395 0.0937,-0.0625 0.41238,-0.31916 0.65625,-0.81319 0.65625,-1.375 0,-0.96372 -0.75503,-1.75 -1.71875,-1.75 z"
+           id="path14397-5"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="scscsscccss" />
+        <path
+           sodipodi:type="arc"
+           style="color:#000000;fill:url(#linearGradient15521-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           id="path14397-8-0"
+           sodipodi:cx="500.96298"
+           sodipodi:cy="182.15448"
+           sodipodi:rx="1.7449629"
+           sodipodi:ry="1.7449629"
+           d="m 502.70795,182.15448 c 0,0.96372 -0.78125,1.74496 -1.74497,1.74496 -0.96371,0 -1.74496,-0.78124 -1.74496,-1.74496 0,-0.96372 0.78125,-1.74496 1.74496,-1.74496 0.96372,0 1.74497,0.78124 1.74497,1.74496 z"
+           transform="translate(-6.874099,5.4992756)" />
+      </g>
+      <g
+         transform="translate(6.9375,1.125)"
+         id="g15470-3">
+        <path
+           transform="matrix(0.31018135,0.06837356,-0.06837356,0.31018135,347.67882,91.940035)"
+           d="m 502.70795,182.15448 c 0,0.96372 -0.78125,1.74496 -1.74497,1.74496 -0.96371,0 -1.74496,-0.78124 -1.74496,-1.74496 0,-0.96372 0.78125,-1.74496 1.74496,-1.74496 0.96372,0 1.74497,0.78124 1.74497,1.74496 z"
+           sodipodi:ry="1.7449629"
+           sodipodi:rx="1.7449629"
+           sodipodi:cy="182.15448"
+           sodipodi:cx="500.96298"
+           id="path14397-8-8-6"
+           style="color:#000000;fill:url(#linearGradient15523-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           sodipodi:type="arc" />
+        <path
+           inkscape:connector-curvature="0"
+           style="color:#000000;fill:url(#linearGradient15525-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           d="m 492.875,180.96875 c -0.046,0.009 -0.0831,0.0119 -0.125,0.0312 l -0.0625,0.0312 -2.375,1.1875 c 0.11954,-0.0764 0.25679,-0.0954 0.40625,-0.0625 0.29893,0.0659 0.50339,0.35732 0.4375,0.65625 -0.033,0.14946 -0.13046,0.26739 -0.25,0.34375 0.77078,-0.3938 1.58077,-0.78916 2.34375,-1.15625 0.13759,-0.0738 0.24501,-0.21059 0.28125,-0.375 0.0659,-0.29893 -0.13857,-0.59036 -0.4375,-0.65625 -0.0747,-0.0165 -0.14796,-0.0131 -0.21875,0 z"
+           id="path14397-8-8-5-0" />
+      </g>
+    </g>
+    <g
+       id="g13671"
+       transform="matrix(0.7406245,0,0,0.7406245,-33.973222,31.211141)">
+      <text
+         style="font-size:15.91540909px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#5d9d35;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"
+         xml:space="preserve"
+         id="text10478-2"
+         transform="scale(0.9460798,1.0569933)"
+         y="156.47406"
+         x="583.03015"
+         sodipodi:linespacing="125%"><tspan
+           style="fill:#5d9d35;fill-opacity:1"
+           id="tspan10480-6"
+           y="156.47406"
+           x="583.03015">R</tspan></text>
+      <text
+         style="font-size:15.91540909px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#5d9d35;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"
+         xml:space="preserve"
+         id="text10482-7"
+         transform="scale(0.9460798,1.0569933)"
+         y="156.47406"
+         x="591.87451"
+         sodipodi:linespacing="125%"><tspan
+           style="fill:#5d9d35;fill-opacity:1"
+           id="tspan10484-7"
+           y="156.47406"
+           x="591.87451">E</tspan></text>
+      <text
+         style="font-size:15.91540909px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#5d9d35;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"
+         xml:space="preserve"
+         id="text10486-9"
+         transform="scale(0.9460798,1.0569933)"
+         y="156.47406"
+         x="599.54919"
+         sodipodi:linespacing="125%"><tspan
+           style="fill:#5d9d35;fill-opacity:1"
+           id="tspan10488-4"
+           y="156.47406"
+           x="599.54919">F</tspan></text>
+      <path
+         inkscape:connector-curvature="0"
+         id="path40832-7"
+         d="m 552.6048,153.1029 0,3.625 c 0.69372,0.30918 1.41168,0.56749 2.15625,0.8125 l 0,-2.375 1,0 c 0.59618,2e-5 1.02713,0.14748 1.28125,0.40625 0.2541,0.25877 0.40624,0.68116 0.40625,1.28125 -10e-6,0.60015 -0.14726,1.01698 -0.40625,1.28125 -0.0194,0.0198 -0.041,0.0443 -0.0625,0.0625 0.72794,0.17475 1.48059,0.28192 2.21875,0.40625 0.31246,-0.4903 0.46875,-1.12023 0.46875,-1.90625 0,-1.2663 -0.29053,-2.18841 -0.90625,-2.75 -0.61087,-0.56157 -1.65508,-0.84373 -3.0625,-0.84375 l -3.09375,0 z m 8.59375,0 0,5.78125 c 1.19169,0.13165 2.37992,0.23393 3.5,0.25 0.98673,-0.0138 1.94165,-0.0818 2.875,-0.1875 l 0,-1.03125 -4.1875,0 0,-2.65625 4.625,0 0,-2.15625 -6.8125,0 z m 7.34375,0 0,5.71875 c 1.3859,-0.20593 2.73697,-0.50634 4.09375,-0.90625 l -1.9375,0 0,-2.65625 4.6875,0 0,-2.15625 -6.84375,0 z"
+         style="opacity:0.31627909;fill:url(#linearGradient13690);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:13;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    </g>
+  </g>
+  <g
+     transform="translate(1350.1329,-435.58678)"
+     id="g16552-4">
+    <g
+       id="g16340-3">
+      <rect
+         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="ImportDatabase"
+         y="561.30634"
+         x="-1061.1847"
+         height="24"
+         width="24" />
+    </g>
+  </g>
+  <g
+     inkscape:label="Ebene 1"
+     id="layer1-2"
+     transform="matrix(0.02393707,0,0,0.02393707,292.54285,124.97379)">
+    <g
+       id="g32772">
+      <rect
+         y="115.85568"
+         x="-64.879845"
+         width="850"
+         style="fill:none;stroke:none"
+         id="rect2300"
+         height="850" />
+      <path
+         transform="matrix(22.38511,0,0,24.34097,-173.556,-227.5451)"
+         style="fill:url(#radialGradient33182);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible"
+         sodipodi:type="arc"
+         sodipodi:ry="8.5714283"
+         sodipodi:rx="17.142857"
+         sodipodi:cy="40"
+         sodipodi:cx="23.857143"
+         id="path3366"
+         d="m 41,40 c 0,4.733869 -7.675118,8.571428 -17.142857,8.571428 -9.467738,0 -17.1428562,-3.837559 -17.1428562,-8.571428 0,-4.733869 7.6751182,-8.571428 17.1428562,-8.571428 C 33.324882,31.428572 41,35.266131 41,40 z" />
+      <path
+         style="fill:url(#linearGradient32255);fill-opacity:1;fill-rule:nonzero;stroke:#864a18;stroke-width:27;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible"
+         sodipodi:nodetypes="csszssz"
+         id="path3068"
+         d="m 356.14658,141.79793 c -166.17064,0 -301.286141,59.25303 -301.286141,132.14323 0,5.23055 0,483.48267 0,488.92993 0,72.89021 135.115501,132.14324 301.286141,132.14324 166.17062,0 306.66742,-59.25303 306.66742,-132.14324 0,-4.31441 0,-484.61551 0,-488.92993 0,-72.8902 -140.4968,-132.14323 -306.66742,-132.14323 l 0,0 z"
+         inkscape:connector-curvature="0" />
+      <path
+         style="opacity:0.5443038;fill:none;stroke:url(#linearGradient32252);stroke-width:21.14291763;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible"
+         sodipodi:nodetypes="csszssz"
+         id="path4174"
+         d="m 356.32841,158.27504 c -154.92895,0 -280.90458,55.24474 -280.90458,123.20421 0,4.87661 0,462.73513 0,467.81387 0,67.95926 125.97563,123.20399 280.90458,123.20399 154.93104,0 285.92199,-55.24473 285.92199,-123.20399 0,-4.02266 0,-463.79144 0,-467.81387 0,-67.95947 -130.99095,-123.20421 -285.92199,-123.20421 l 0,0 z"
+         inkscape:connector-curvature="0" />
+      <path
+         transform="matrix(21.274874,0,0,19.579266,-153.12834,-3.3607684)"
+         style="fill:#a46530;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.42590630000000007;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:block;overflow:visible"
+         sodipodi:type="arc"
+         sodipodi:ry="5.5"
+         sodipodi:rx="12.857142"
+         sodipodi:cy="14.071428"
+         sodipodi:cx="24"
+         id="path3364"
+         d="m 36.857142,14.071428 c 0,3.037566 -5.756338,5.5 -12.857142,5.5 -7.100804,0 -12.857142,-2.462434 -12.857142,-5.5 0,-3.037566 5.756338,-5.4999997 12.857142,-5.4999997 7.100804,0 12.857142,2.4624337 12.857142,5.4999997 z" />
+      <path
+         style="fill:url(#linearGradient32248);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block;overflow:visible"
+         sodipodi:nodetypes="cccccccc"
+         id="path6922"
+         d="m 138.48871,370.3112 1.89227,449.19676 149.45944,57.35892 6.41056,-472.20371 c 0,0 -12.78317,-5.65786 58.19783,-10.18857 -110.27723,-4.92778 -234.56375,-59.86576 -277.50352,-90.60524 29.95803,44.23478 61.54342,66.44184 61.54342,66.44184 l 0,0 z"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+  <g
+     style="display:inline"
+     transform="matrix(-1,0,0,1,313.23634,127.23877)"
+     id="layer1-0">
+    <g
+       id="g3490-1"
+       style="stroke-width:1.88259995"
+       transform="matrix(0.54593,0,0,0.51685,-0.96573,-0.57818)">
+      <g
+         id="g5022-9"
+         style="stroke-width:104.95999908"
+         transform="matrix(0.021652,0,0,0.014857,43.008,42.685)" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       id="path1432"
+       style="fill:url(#linearGradient5274-7);stroke:url(#linearGradient5276);stroke-linecap:round;stroke-linejoin:round;display:block"
+       d="m 17.5,7.4997 6,5.3693 -6,5.631 V 15.4994 H 7.5004 v -4.999 H 17.5 V 7.4998 z" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3777"
+       style="opacity:0.4;fill:none;stroke:url(#linearGradient5877);display:block"
+       d="M 18.531,8.7812 V 10 A 0.51754,0.51754 0 0 1 18,10.531 H 9.4375 l 0.03125,2.9375 h 8.5312 a 0.51754,0.51754 0 0 1 0.531,0.532 v 1.1562 l 3.469,-3.281 -3.469,-3.0938 z"
+       transform="translate(0,0.99987)" />
+  </g>
+  <g
+     transform="translate(259.01843,213.90813)"
+     style="display:inline"
+     id="Ethercat"
+     inkscape:export-xdpi="90"
+     inkscape:export-ydpi="90">
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:url(#linearGradient13566);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
+       d="m -40,0 0,16 16,0 0,-16 -16,0 z m 1,1 14,0 0,14 -14,0 0,-14 z"
+       id="path3806-1"
+       sodipodi:nodetypes="cccccccccc"
+       inkscape:label="#rect2160" />
+  </g>
+  <g
+     id="g13706">
+    <path
+       sodipodi:nodetypes="cccccc"
+       inkscape:connector-curvature="0"
+       id="rect13530"
+       d="m 474.55583,267.23926 46.68198,0 -0.0748,-5.64517 15.94727,11.21704 -62.55448,0 z"
+       style="color:#000000;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <path
+       sodipodi:nodetypes="cccccc"
+       inkscape:connector-curvature="0"
+       id="rect13530-2"
+       d="m 537.07809,280.62642 -17.93418,0 0.0748,5.64517 -15.94727,-11.21704 33.80668,0 z"
+       style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text13524-5"
+       y="304.15552"
+       x="428.53214"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       xml:space="preserve"><tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Ume Gothic C5;-inkscape-font-specification:Ume Gothic C5"
+         y="304.15552"
+         x="428.53214"
+         id="tspan13526-0"
+         sodipodi:role="line"><tspan
+           dx="-3.3841705 -4.6532345 -6.3453197"
+           id="tspan13528-3"
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold">CAT</tspan></tspan></text>
+  </g>
+  <g
+     id="g13717"
+     transform="matrix(0.11737773,0,0,0.11737773,193.85555,200.05415)">
+    <use
+       height="1052.3622"
+       width="744.09448"
+       transform="translate(-100,-124.66768)"
+       id="use13713"
+       xlink:href="#text13524"
+       y="0"
+       x="0" />
+    <use
+       height="1052.3622"
+       width="744.09448"
+       transform="translate(-200,-78)"
+       id="use13715"
+       xlink:href="#g13706"
+       y="0"
+       x="0" />
+  </g>
+  <rect
+     width="24"
+     height="24"
+     x="756.3476"
+     y="130.43539"
+     id="CIA402NetPos"
+     style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     inkscape:label="#rect16270" />
+  <g
+     transform="matrix(1.8400527,0,0,1.8400527,-158.02545,-192.90628)"
+     id="g15478-1-9">
+    <g
+       transform="matrix(-0.03037121,0,0,0.03037121,515.46377,170.91105)"
+       id="layer1-1-9-4-7"
+       inkscape:label="Calque 1">
+      <g
+         transform="translate(-48,0)"
+         id="g16056-4-2-4">
+        <path
+           style="fill:url(#linearGradient15515-4-0);fill-opacity:1;stroke:none"
+           d="m 261.23647,217.28623 175.53201,57.07437 -3.125,208.62261 -170.15701,-72.94937 z"
+           id="rect15422-9-9-3"
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:url(#linearGradient15517-6-2);fill-opacity:1;stroke:none"
+           d="M 257.63822,217.28208 452.87456,201.38389 632.56367,259.59396 436.54848,274.2032 z"
+           id="rect15942-8-8-8"
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0" />
+        <path
+           style="fill:#333333;fill-opacity:1;stroke:none"
+           d="m 436.5,273.54968 195.5,-14.25 0.59315,205.70147 -198.84315,17.5 z"
+           id="rect15953-6-8-5"
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0" />
+      </g>
+    </g>
+    <g
+       id="g15330-3-1"
+       transform="matrix(0.98401111,0.21690648,-0.21690648,0.98401111,54.630578,-109.30701)">
+      <path
+         sodipodi:nodetypes="scscsscccss"
+         inkscape:connector-curvature="0"
+         id="path14397-5-6"
+         d="m 494.71875,185.46875 c -0.35176,0 -0.69473,0.1022 -0.96875,0.28125 -0.10135,0.0662 -0.34443,0.21161 -0.42188,0.28906 l -0.0625,0.0625 c 0.34548,-0.16642 0.5872,-0.19531 0.82813,-0.19531 0.96372,0 1.75,0.78628 1.75,1.75 0,0.5778 -0.28613,1.08868 -0.71875,1.40625 l 0.5625,-0.40625 c 0.0312,-0.0211 0.0641,-0.0395 0.0937,-0.0625 0.41238,-0.31916 0.65625,-0.81319 0.65625,-1.375 0,-0.96372 -0.75503,-1.75 -1.71875,-1.75 z"
+         style="color:#000000;fill:url(#linearGradient15519-9-9);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+      <path
+         transform="translate(-6.874099,5.4992756)"
+         d="m 502.70795,182.15448 c 0,0.96372 -0.78125,1.74496 -1.74497,1.74496 -0.96371,0 -1.74496,-0.78124 -1.74496,-1.74496 0,-0.96372 0.78125,-1.74496 1.74496,-1.74496 0.96372,0 1.74497,0.78124 1.74497,1.74496 z"
+         sodipodi:ry="1.7449629"
+         sodipodi:rx="1.7449629"
+         sodipodi:cy="182.15448"
+         sodipodi:cx="500.96298"
+         id="path14397-8-0-6"
+         style="color:#000000;fill:url(#linearGradient15521-8-5);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         sodipodi:type="arc" />
+    </g>
+    <g
+       id="g15470-3-1"
+       transform="translate(6.9375,1.125)">
+      <path
+         sodipodi:type="arc"
+         style="color:#000000;fill:url(#linearGradient15523-5-9);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="path14397-8-8-6-7"
+         sodipodi:cx="500.96298"
+         sodipodi:cy="182.15448"
+         sodipodi:rx="1.7449629"
+         sodipodi:ry="1.7449629"
+         d="m 502.70795,182.15448 c 0,0.96372 -0.78125,1.74496 -1.74497,1.74496 -0.96371,0 -1.74496,-0.78124 -1.74496,-1.74496 0,-0.96372 0.78125,-1.74496 1.74496,-1.74496 0.96372,0 1.74497,0.78124 1.74497,1.74496 z"
+         transform="matrix(0.31018135,0.06837356,-0.06837356,0.31018135,347.67882,91.940035)" />
+      <path
+         id="path14397-8-8-5-0-1"
+         d="m 492.875,180.96875 c -0.046,0.009 -0.0831,0.0119 -0.125,0.0312 l -0.0625,0.0312 -2.375,1.1875 c 0.11954,-0.0764 0.25679,-0.0954 0.40625,-0.0625 0.29893,0.0659 0.50339,0.35732 0.4375,0.65625 -0.033,0.14946 -0.13046,0.26739 -0.25,0.34375 0.77078,-0.3938 1.58077,-0.78916 2.34375,-1.15625 0.13759,-0.0738 0.24501,-0.21059 0.28125,-0.375 0.0659,-0.29893 -0.13857,-0.59036 -0.4375,-0.65625 -0.0747,-0.0165 -0.14796,-0.0131 -0.21875,0 z"
+         style="color:#000000;fill:url(#linearGradient15525-5-1);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72142136px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+  <text
+     style="font-size:11.78734207px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#5d9d35;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"
+     xml:space="preserve"
+     id="text10478-2-1"
+     transform="scale(0.9460798,1.0569933)"
+     y="145.58522"
+     x="805.63269"
+     sodipodi:linespacing="125%"><tspan
+       style="fill:#5d9d35;fill-opacity:1"
+       id="tspan10480-6-6"
+       y="145.58522"
+       x="805.63269">P</tspan></text>
+  <text
+     style="font-size:11.78734207px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#5d9d35;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"
+     xml:space="preserve"
+     id="text10482-7-8"
+     transform="scale(0.9460798,1.0569933)"
+     y="145.58522"
+     x="811.7536"
+     sodipodi:linespacing="125%"><tspan
+       style="fill:#5d9d35;fill-opacity:1"
+       id="tspan10484-7-1"
+       y="145.58522"
+       x="811.7536">O</tspan></text>
+  <text
+     style="font-size:11.78734207px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#5d9d35;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"
+     xml:space="preserve"
+     id="text10486-9-1"
+     transform="scale(0.9460798,1.0569933)"
+     y="145.58522"
+     x="817.86713"
+     sodipodi:linespacing="125%"><tspan
+       style="fill:#5d9d35;fill-opacity:1"
+       id="tspan10488-4-0"
+       y="145.58522"
+       x="817.86713">S</tspan></text>
+  <path
+     style="opacity:0.31627909;fill:url(#linearGradient14745);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:13;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     d="m 771,144.78125 c -0.81802,0.0876 -1.46833,0.46859 -1.90625,1.15625 -0.44532,0.69928 -0.70105,1.71167 -0.75,3 0.33547,0.0498 0.68443,0.0936 0.96875,0.125 0.0538,0.006 0.20377,0.0234 0.28125,0.0312 0.0312,-1.01046 0.20309,-1.79471 0.46875,-2.3125 0.29574,-0.57642 0.7025,-0.84375 1.28125,-0.84375 0.58142,0 1.00034,0.25847 1.28125,0.8125 0.26273,0.50831 0.41655,1.34853 0.4375,2.4375 0.41071,-0.0291 0.79139,-0.0736 0.96875,-0.0937 0.13552,-0.0154 0.22665,-0.0252 0.28125,-0.0312 -0.0385,-1.29724 -0.28269,-2.35062 -0.75,-3.09375 -0.44479,-0.71616 -1.0825,-1.09969 -1.875,-1.1875 l -0.6875,0 z m 6.25,0 c -0.82892,1e-5 -1.47907,0.20515 -1.96875,0.625 -0.4858,0.41555 -0.75,0.98907 -0.75,1.71875 0,0.67462 0.15854,1.22389 0.5,1.65625 l 0.0312,0 c 0.0432,0.0536 0.10675,0.10464 0.15625,0.15625 0.45646,-0.0809 1.00789,-0.18704 1.65625,-0.34375 -0.38579,-0.18339 -0.69641,-0.37661 -0.84375,-0.53125 -0.21604,-0.23023 -0.3125,-0.54117 -0.3125,-0.9375 0,-0.40297 0.13474,-0.68101 0.375,-0.875 0.24027,-0.19399 0.60678,-0.3125 1.125,-0.3125 0.58603,0 1.24517,0.1874 1.9375,0.5 l 0.0937,0.0312 0.0312,-0.0937 0.34375,-1 0.0312,-0.0937 -0.0937,-0.0312 c -0.69397,-0.3234 -1.46898,-0.46874 -2.3125,-0.46875 z m -14.1875,0.125 0,0.0937 0,2.53125 c 0.38579,0.16668 0.79056,0.29379 1.1875,0.4375 l 0,-1.90625 1,0 c 0.5984,0 1.02954,0.14825 1.3125,0.40625 0.28295,0.258 0.4375,0.6399 0.4375,1.1875 0,0.40855 -0.0853,0.74374 -0.21875,1 0.39233,0.0723 0.85752,0.15823 1.03125,0.1875 0.0399,0.007 0.16048,0.0221 0.21875,0.0312 0.14633,-0.37677 0.21874,-0.7996 0.21875,-1.28125 -10e-6,-0.88609 -0.22442,-1.57736 -0.71875,-2.03125 -0.49433,-0.4539 -1.23923,-0.65624 -2.1875,-0.65625 l -2.1875,0 -0.0937,0 z"
+     id="path40832-7-1"
+     inkscape:connector-curvature="0" />
+  <g
+     transform="scale(0.9460798,1.0569933)"
+     style="font-size:11.78734206999999934px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#5d9d35;fill-opacity:1;stroke:#000000;font-family:Bitstream Vera Sans Mono;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     id="text10478-2-1-5" />
+  <g
+     transform="scale(0.9460798,1.0569933)"
+     style="font-size:11.78734207px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#5d9d35;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"
+     id="text10482-7-8-5" />
+  <g
+     transform="scale(0.9460798,1.0569933)"
+     style="font-size:11.78734207px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#5d9d35;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"
+     id="text10486-9-1-9" />
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/plc_cia402node.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,193 @@
+/*
+
+Template C code used to produce target Ethercat C CIA402 code
+
+Copyright (C) 2011-2014: Laurent BESSARD, Edouard TISSERANT
+
+Distributed under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+See COPYING file for copyrights details.
+
+*/
+
+#include "ecrt.h"
+
+#include "beremiz.h"
+#include "iec_types_all.h"
+
+#include "accessor.h"
+#include "POUS.h"
+
+/* From CiA402, page 27
+
+        Table 30 - State coding
+    Statusword      |      PDS FSA state
+xxxx xxxx x0xx 0000 | Not ready to switch on
+xxxx xxxx x1xx 0000 | Switch on disabled
+xxxx xxxx x01x 0001 | Ready to switch on
+xxxx xxxx x01x 0011 | Switched on
+xxxx xxxx x01x 0111 | Operation enabled
+xxxx xxxx x00x 0111 | Quick stop active
+xxxx xxxx x0xx 1111 | Fault reaction active
+xxxx xxxx x0xx 1000 | Fault
+*/
+#define FSAFromStatusWord(SW) (SW & 0x006f)
+#define NotReadyToSwitchOn  0b00000000 FSA_sep 0b00100000
+#define SwitchOnDisabled    0b01000000 FSA_sep 0b01100000
+#define ReadyToSwitchOn     0b00100001
+#define SwitchedOn          0b00100011
+#define OperationEnabled    0b00100111
+#define QuickStopActive     0b00000111
+#define FaultReactionActive 0b00001111 FSA_sep 0b00101111
+#define Fault               0b00001000 FSA_sep 0b00101000
+
+// SatusWord bits :
+#define SW_ReadyToSwitchOn     0x0001
+#define SW_SwitchedOn          0x0002
+#define SW_OperationEnabled    0x0004
+#define SW_Fault               0x0008
+#define SW_VoltageEnabled      0x0010
+#define SW_QuickStop           0x0020
+#define SW_SwitchOnDisabled    0x0040
+#define SW_Warning             0x0080
+#define SW_Remote              0x0200
+#define SW_TargetReached       0x0400
+#define SW_InternalLimitActive 0x0800
+
+// ControlWord bits :
+#define SwitchOn        0x0001
+#define EnableVoltage   0x0002
+#define QuickStop       0x0004
+#define EnableOperation 0x0008
+#define FaultReset      0x0080
+#define Halt            0x0100
+
+
+IEC_INT beremiz__IW%(location_str)s = %(slave_pos)s;
+IEC_INT *__IW%(location_str)s = &beremiz__IW%(location_str)s;
+IEC_INT beremiz__IW%(location_str)s_402;
+IEC_INT *__IW%(location_str)s_402 = &beremiz__IW%(location_str)s_402;
+
+%(MCL_headers)s
+
+static IEC_BOOL __FirstTick = 1;
+
+typedef struct {
+%(entry_variables)s
+    axis_s* axis;
+} __CIA402Node;
+
+#define AxsPub __CIA402Node_%(location_str)s
+
+static __CIA402Node AxsPub;
+
+%(extern_located_variables_declaration)s
+
+%(fieldbus_interface_declaration)s
+
+int __init_%(location_str)s()
+{
+    __FirstTick = 1;
+%(init_entry_variables)s
+	*(AxsPub.ModesOfOperation) = 0x08;
+    return 0;
+}
+
+void __cleanup_%(location_str)s()
+{
+}
+
+void __retrieve_%(location_str)s()
+{
+	if (__FirstTick) {
+		*__IW%(location_str)s_402 = __MK_Alloc_AXIS_REF();
+		AxsPub.axis = 
+            __MK_GetPublic_AXIS_REF(*__IW%(location_str)s_402);
+		AxsPub.axis->NetworkPosition = beremiz__IW%(location_str)s;
+%(init_axis_params)s
+%(fieldbus_interface_definition)s
+		__FirstTick = 0;
+	}
+
+	// Default variables retrieve
+	AxsPub.axis->CommunicationReady = 
+        *(AxsPub.StatusWord) != 0;
+#define FSA_sep || FSA ==
+    {
+        uint16_t FSA = FSAFromStatusWord(*(AxsPub.StatusWord));
+        AxsPub.axis->ReadyForPowerOn = FSA == ReadyToSwitchOn;
+        AxsPub.axis->PowerFeedback = FSA == OperationEnabled;
+    }
+#undef FSA_sep 
+	AxsPub.axis->ActualRawPosition = *(AxsPub.ActualPosition);
+	AxsPub.axis->ActualRawVelocity = *(AxsPub.ActualVelocity);
+	AxsPub.axis->ActualRawTorque = *(AxsPub.ActualTorque);
+
+	// Extra variables retrieve
+%(extra_variables_retrieve)s
+}
+
+void __publish_%(location_str)s()
+{
+	IEC_BOOL power = 
+        ((*(AxsPub.StatusWord) & SW_VoltageEnabled) != 0) 
+        && AxsPub.axis->Power;
+    uint16_t CW = *(AxsPub.ControlWord);
+
+#define FSA_sep : case
+	// CIA402 node state transition computation
+	switch (FSAFromStatusWord(*(AxsPub.StatusWord))) {
+	    case SwitchOnDisabled :
+            CW &= ~(SwitchOn | FaultReset);
+            CW |= EnableVoltage | QuickStop;
+	    	break;
+	    case ReadyToSwitchOn :
+	    case OperationEnabled :
+	    	if (!power) {
+                CW &= ~(FaultReset | EnableOperation);
+                CW |= SwitchOn | EnableVoltage | QuickStop;
+	    		break;
+	    	}
+	    case SwitchedOn :
+	    	if (power) {
+                CW &= ~(FaultReset);
+                CW |= SwitchOn | EnableVoltage | QuickStop | EnableOperation;
+	    	}
+	    	break;
+	    case Fault :
+            /* TODO reset fault only when MC_Reset */
+            CW &= ~(SwitchOn | EnableVoltage | QuickStop | EnableOperation);
+            CW |= FaultReset;
+	    	break;
+	    default:
+	    	break;
+	}
+#undef FSA_sep 
+    *(AxsPub.ControlWord) = CW;
+
+	// CIA402 node modes of operation computation according to axis motion mode
+	switch (AxsPub.axis->AxisMotionMode) {
+		case mc_mode_cst:
+			*(AxsPub.ModesOfOperation) = 0x0a;
+			break;
+		case mc_mode_csv:
+			*(AxsPub.ModesOfOperation) = 0x09;
+			break;
+		default:
+			*(AxsPub.ModesOfOperation) = 0x08;
+			break;
+	}
+
+	// Default variables publish
+	*(AxsPub.TargetPosition) = 
+            AxsPub.axis->RawPositionSetPoint;
+	*(AxsPub.TargetVelocity) = 
+            AxsPub.axis->RawVelocitySetPoint;
+	*(AxsPub.TargetTorque) = 
+            AxsPub.axis->RawTorqueSetPoint;
+
+	// Extra variables publish
+%(extra_variables_publish)s
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/plc_etherlab.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,168 @@
+/*
+
+Template C code used to produce target Ethercat C code
+
+Copyright (C) 2011-2014: Laurent BESSARD, Edouard TISSERANT
+
+Distributed under the terms of the GNU Lesser General Public License as
+published by the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+See COPYING file for copyrights details.
+
+*/
+
+#include <rtdm/rtdm.h>
+#include <native/task.h>
+#include <native/timer.h>
+
+#include "ecrt.h"
+
+#include "beremiz.h"
+#include "iec_types_all.h"
+
+// declaration of interface variables
+%(located_variables_declaration)s
+
+// process data
+uint8_t *domain1_pd = NULL;
+%(used_pdo_entry_offset_variables_declaration)s
+
+const static ec_pdo_entry_reg_t domain1_regs[] = {
+%(used_pdo_entry_configuration)s
+    {}
+};
+/*****************************************************************************/
+
+%(pdos_configuration_declaration)s
+
+long long wait_period_ns = 100000LL;
+
+// EtherCAT
+static ec_master_t *master = NULL;
+static ec_domain_t *domain1 = NULL;
+static int first_sent=0;
+%(slaves_declaration)s
+#define SLOGF(level, format, args...)\
+{\
+    char sbuf[256];\
+    int slen = snprintf(sbuf , sizeof(sbuf) , format , ##args);\
+    LogMessage(level, sbuf, slen);\
+}
+
+/* Beremiz plugin functions */
+int __init_%(location)s(int argc,char **argv)
+{
+    uint32_t abort_code;
+    size_t result_size;
+    
+    abort_code = 0;
+    result_size = 0;
+
+    master = ecrt_request_master(%(master_number)d);
+    if (!master) {
+        SLOGF(LOG_CRITICAL, "EtherCAT master request failed!");
+        return -1;
+    }
+
+    if(!(domain1 = ecrt_master_create_domain(master))){
+        SLOGF(LOG_CRITICAL, "EtherCAT Domain Creation failed!");
+        goto ecat_failed;
+    }
+
+    // slaves PDO configuration
+%(slaves_configuration)s
+
+    if (ecrt_domain_reg_pdo_entry_list(domain1, domain1_regs)) {
+        SLOGF(LOG_CRITICAL, "EtherCAT PDO registration failed!");
+        goto ecat_failed;
+    }
+
+    ecrt_master_set_send_interval(master, common_ticktime__);
+
+    // slaves initialization
+%(slaves_initialization)s
+
+    // extracting default value for not mapped entry in output PDOs
+%(slaves_output_pdos_default_values_extraction)s
+
+    if (ecrt_master_activate(master)){
+        SLOGF(LOG_CRITICAL, "EtherCAT Master activation failed");
+        goto ecat_failed;
+    }
+
+    if (!(domain1_pd = ecrt_domain_data(domain1))) {
+        SLOGF(LOG_CRITICAL, "Failed to map EtherCAT process data");
+        goto ecat_failed;
+    }
+
+    SLOGF(LOG_INFO, "Master %(master_number)d activated.");
+    
+    first_sent = 0;
+
+    return 0;
+
+ecat_failed:
+    ecrt_release_master(master);
+    return -1;
+
+}
+
+void __cleanup_%(location)s(void)
+{
+    //release master
+    ecrt_release_master(master);
+    first_sent = 0;
+}
+
+void __retrieve_%(location)s(void)
+{
+    // receive ethercat
+    if(first_sent){
+        ecrt_master_receive(master);
+        ecrt_domain_process(domain1);
+%(retrieve_variables)s
+    }
+
+}
+
+static RTIME _last_occur=0;
+static RTIME _last_publish=0;
+RTIME _current_lag=0;
+RTIME _max_jitter=0;
+static inline RTIME max(RTIME a,RTIME b){return a>b?a:b;}
+
+void __publish_%(location)s(void)
+{
+%(publish_variables)s
+    ecrt_domain_queue(domain1);
+    {
+        RTIME current_time = rt_timer_read();
+        // Limit spining max 1/5 of common_ticktime
+        RTIME maxdeadline = current_time + (common_ticktime__ / 5);
+        RTIME deadline = _last_occur ? 
+            _last_occur + common_ticktime__ : 
+            current_time + _max_jitter; 
+        if(deadline > maxdeadline) deadline = maxdeadline;
+        _current_lag = deadline - current_time;
+        if(_last_publish != 0){
+            RTIME period = current_time - _last_publish;
+            if(period > common_ticktime__ )
+                _max_jitter = max(_max_jitter, period - common_ticktime__);
+            else
+                _max_jitter = max(_max_jitter, common_ticktime__ - period);
+        }
+        _last_publish = current_time;
+        _last_occur = current_time;
+        while(current_time < deadline) {
+            _last_occur = current_time; //Drift backward by default
+            current_time = rt_timer_read();
+        }
+        if( _max_jitter * 10 < common_ticktime__ && _current_lag < _max_jitter){
+            //Consuming security margin ?
+            _last_occur = current_time; //Drift forward
+        }
+    }
+    ecrt_master_send(master);
+    first_sent = 1;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/pous.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,1311 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.plcopen.org/xml/tc6.xsd"
+         xsi:schemaLocation="http://www.plcopen.org/xml/tc6.xsd"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns:xhtml="http://www.w3.org/1999/xhtml">
+  <fileHeader companyName="EtherlabMaster"
+              productName="EtherlabMaster"
+              productVersion="1"
+              creationDateTime="2012-10-22T12:12:45"/>
+  <contentHeader name="EtherlabMaster SDO Blocks"
+                 modificationDateTime="2012-11-13T18:03:39">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="0" y="0"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="EtherLabSDOUpload" pouType="functionBlock">
+        <interface>
+          <inputVars>
+            <variable name="EXECUTE">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="POS">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="INDEX">
+              <type>
+                <UINT/>
+              </type>
+            </variable>
+            <variable name="SUBINDEX">
+              <type>
+                <USINT/>
+              </type>
+            </variable>
+            <variable name="VARTYPE">
+              <type>
+                <string/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="ACK">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="VALID">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="VALUE">
+              <type>
+                <string/>
+              </type>
+            </variable>
+          </outputVars>
+          <localVars>
+            <variable name="PY0">
+              <type>
+                <derived name="python_eval"/>
+              </type>
+            </variable>
+            <variable name="PY1">
+              <type>
+                <derived name="python_eval"/>
+              </type>
+            </variable>
+            <variable name="EXECUTE0">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="STATE">
+              <type>
+                <INT/>
+              </type>
+              <initialValue>
+                <simpleValue value="0"/>
+              </initialValue>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <ST>
+<![CDATA[{extern int AcquireSDOLock();}
+{extern int HasAnswer();}
+{extern void ReleaseSDOLock();}
+CASE STATE OF
+  0:
+    IF EXECUTE AND NOT EXECUTE0 THEN
+      STATE := 1;
+      ACK := 0;
+      VALID := 0;
+      VALUE := 'None';
+    END_IF;
+  1:
+    {if (AcquireSDOLock()) __SET_VAR(data__->,STATE,, 2)}
+  2:
+    IF PY0.ACK THEN
+      STATE := 3;
+    END_IF;
+  3:
+    {if (HasAnswer()) __SET_VAR(data__->,STATE,, 4)}
+  4:
+    IF PY1.ACK THEN
+      ACK := 1;
+      VALUE := PY1.RESULT;
+      VALID := NE(VALUE, 'None');
+      STATE := 0;
+      {ReleaseSDOLock();}
+    END_IF;
+ELSE
+  STATE := 0;
+END_CASE;
+
+EXECUTE0 := EXECUTE;
+PY0(TRIG := STATE = 2, 
+    CODE := CONCAT('EthercatSDOUpload(',
+                   INT_TO_STRING(POS),
+                   ',',
+                   UINT_TO_STRING(INDEX),
+                   ',',
+                   USINT_TO_STRING(SUBINDEX),
+                   ',"',
+                   VARTYPE,
+                   '")'));
+PY1(TRIG := STATE = 4, 
+    CODE := 'GetResult()');
+]]>
+          </ST>
+        </body>
+      </pou>
+      <pou name="EtherLabSDODownload" pouType="functionBlock">
+        <interface>
+          <inputVars>
+            <variable name="EXECUTE">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="POS">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="INDEX">
+              <type>
+                <UINT/>
+              </type>
+            </variable>
+            <variable name="SUBINDEX">
+              <type>
+                <USINT/>
+              </type>
+            </variable>
+            <variable name="VARTYPE">
+              <type>
+                <string/>
+              </type>
+            </variable>
+            <variable name="VALUE">
+              <type>
+                <string/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="ACK">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="ERROR">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </outputVars>
+          <localVars>
+            <variable name="PY0">
+              <type>
+                <derived name="python_eval"/>
+              </type>
+            </variable>
+            <variable name="PY1">
+              <type>
+                <derived name="python_eval"/>
+              </type>
+            </variable>
+            <variable name="EXECUTE0">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="STATE">
+              <type>
+                <INT/>
+              </type>
+              <initialValue>
+                <simpleValue value="0"/>
+              </initialValue>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <ST>
+<![CDATA[{extern int AcquireSDOLock();}
+{extern int HasAnswer();}
+{extern void ReleaseSDOLock();}
+CASE STATE OF
+  0:
+    IF EXECUTE AND NOT EXECUTE0 THEN
+      STATE := 1;
+      ACK := 0;
+      ERROR := 0;
+    END_IF;
+  1:
+    {if (AcquireSDOLock()) __SET_VAR(data__->,STATE,, 2)}
+  2:
+    IF PY0.ACK THEN
+      STATE := 3;
+    END_IF;
+  3:
+    {if (HasAnswer()) __SET_VAR(data__->,STATE,, 4)}
+  4:
+    IF PY1.ACK THEN
+      ACK := 1;
+      ERROR := EQ(PY1.RESULT, 'False');
+      STATE := 0;
+      {ReleaseSDOLock();}
+    END_IF;
+ELSE
+  STATE := 0;
+END_CASE;
+EXECUTE0 := EXECUTE;
+PY0(TRIG := STATE = 2, 
+    CODE := CONCAT('EthercatSDODownload(',
+                   INT_TO_STRING(POS),
+                   ',',
+                   UINT_TO_STRING(INDEX),
+                   ',',
+                   USINT_TO_STRING(SUBINDEX),
+                   ',"',
+                   VARTYPE,
+                   '",',
+                   VALUE,
+                   ')'));
+PY1(TRIG := STATE = 4, 
+    CODE := 'GetResult()');
+]]>
+          </ST>
+        </body>
+      </pou>
+      <pou name="EtherLabSetTorqueLimit" pouType="functionBlock">
+        <interface>
+          <inputVars>
+            <variable name="Pos">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Execute">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="TorqueLimitPos">
+              <type>
+                <UINT/>
+              </type>
+            </variable>
+            <variable name="TorqueLimitNeg">
+              <type>
+                <UINT/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="Done">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Busy">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Error">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="ErrorID">
+              <type>
+                <WORD/>
+              </type>
+            </variable>
+          </outputVars>
+          <localVars>
+            <variable name="EtherLabSDOUpload0">
+              <type>
+                <derived name="EtherLabSDODownload"/>
+              </type>
+            </variable>
+            <variable name="EtherLabSDOUpload1">
+              <type>
+                <derived name="EtherLabSDODownload"/>
+              </type>
+            </variable>
+            <variable name="RS0">
+              <type>
+                <derived name="RS"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <block localId="1" width="168" height="238" typeName="EtherLabSDODownload" instanceName="EtherLabSDOUpload0">
+              <position x="479" y="70"/>
+              <inputVariables>
+                <variable formalParameter="EXECUTE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="38"/>
+                    <connection refLocalId="3">
+                      <position x="479" y="108"/>
+                      <position x="111" y="108"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="POS">
+                  <connectionPointIn>
+                    <relPosition x="0" y="74"/>
+                    <connection refLocalId="4">
+                      <position x="479" y="144"/>
+                      <position x="423" y="144"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="INDEX">
+                  <connectionPointIn>
+                    <relPosition x="0" y="110"/>
+                    <connection refLocalId="6">
+                      <position x="479" y="180"/>
+                      <position x="423" y="180"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="SUBINDEX">
+                  <connectionPointIn>
+                    <relPosition x="0" y="146"/>
+                    <connection refLocalId="8">
+                      <position x="479" y="216"/>
+                      <position x="423" y="216"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="VARTYPE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="182"/>
+                    <connection refLocalId="10">
+                      <position x="479" y="252"/>
+                      <position x="423" y="252"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="VALUE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="218"/>
+                    <connection refLocalId="25" formalParameter="OUT">
+                      <position x="479" y="288"/>
+                      <position x="450" y="288"/>
+                      <position x="450" y="306"/>
+                      <position x="422" y="306"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="ACK">
+                  <connectionPointOut>
+                    <relPosition x="168" y="38"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="ERROR">
+                  <connectionPointOut>
+                    <relPosition x="168" y="74"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="2" width="168" height="264" typeName="EtherLabSDODownload" instanceName="EtherLabSDOUpload1">
+              <position x="482" y="351"/>
+              <inputVariables>
+                <variable formalParameter="EXECUTE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="40"/>
+                    <connection refLocalId="3">
+                      <position x="482" y="391"/>
+                      <position x="131" y="391"/>
+                      <position x="131" y="108"/>
+                      <position x="111" y="108"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="POS">
+                  <connectionPointIn>
+                    <relPosition x="0" y="80"/>
+                    <connection refLocalId="5">
+                      <position x="482" y="431"/>
+                      <position x="431" y="431"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="INDEX">
+                  <connectionPointIn>
+                    <relPosition x="0" y="120"/>
+                    <connection refLocalId="7">
+                      <position x="482" y="471"/>
+                      <position x="431" y="471"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="SUBINDEX">
+                  <connectionPointIn>
+                    <relPosition x="0" y="160"/>
+                    <connection refLocalId="9">
+                      <position x="482" y="511"/>
+                      <position x="430" y="511"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="VARTYPE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="200"/>
+                    <connection refLocalId="11">
+                      <position x="482" y="551"/>
+                      <position x="431" y="551"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="VALUE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="240"/>
+                    <connection refLocalId="12" formalParameter="OUT">
+                      <position x="482" y="591"/>
+                      <position x="456" y="591"/>
+                      <position x="456" y="610"/>
+                      <position x="431" y="610"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="ACK">
+                  <connectionPointOut>
+                    <relPosition x="168" y="40"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="ERROR">
+                  <connectionPointOut>
+                    <relPosition x="168" y="80"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="3" height="27" width="63">
+              <position x="48" y="95"/>
+              <connectionPointOut>
+                <relPosition x="63" y="13"/>
+              </connectionPointOut>
+              <expression>Execute</expression>
+            </inVariable>
+            <inVariable localId="4" height="27" width="35">
+              <position x="388" y="131"/>
+              <connectionPointOut>
+                <relPosition x="35" y="13"/>
+              </connectionPointOut>
+              <expression>Pos</expression>
+            </inVariable>
+            <inVariable localId="5" height="27" width="35">
+              <position x="396" y="418"/>
+              <connectionPointOut>
+                <relPosition x="35" y="13"/>
+              </connectionPointOut>
+              <expression>Pos</expression>
+            </inVariable>
+            <inVariable localId="6" height="27" width="68">
+              <position x="355" y="167"/>
+              <connectionPointOut>
+                <relPosition x="68" y="13"/>
+              </connectionPointOut>
+              <expression>16#60E0</expression>
+            </inVariable>
+            <inVariable localId="7" height="27" width="68">
+              <position x="363" y="458"/>
+              <connectionPointOut>
+                <relPosition x="68" y="13"/>
+              </connectionPointOut>
+              <expression>16#60E1</expression>
+            </inVariable>
+            <inVariable localId="8" height="27" width="33">
+              <position x="390" y="203"/>
+              <connectionPointOut>
+                <relPosition x="33" y="13"/>
+              </connectionPointOut>
+              <expression>0</expression>
+            </inVariable>
+            <inVariable localId="9" height="27" width="33">
+              <position x="397" y="498"/>
+              <connectionPointOut>
+                <relPosition x="33" y="13"/>
+              </connectionPointOut>
+              <expression>0</expression>
+            </inVariable>
+            <inVariable localId="10" height="27" width="60">
+              <position x="363" y="239"/>
+              <connectionPointOut>
+                <relPosition x="60" y="13"/>
+              </connectionPointOut>
+              <expression>'uint16'</expression>
+            </inVariable>
+            <inVariable localId="11" height="27" width="60">
+              <position x="371" y="538"/>
+              <connectionPointOut>
+                <relPosition x="60" y="13"/>
+              </connectionPointOut>
+              <expression>'uint16'</expression>
+            </inVariable>
+            <block localId="16" width="67" height="98" typeName="AND">
+              <position x="763" y="69"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="39"/>
+                    <connection refLocalId="1" formalParameter="ACK">
+                      <position x="763" y="108"/>
+                      <position x="647" y="108"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="78"/>
+                    <connection refLocalId="2" formalParameter="ACK">
+                      <position x="763" y="147"/>
+                      <position x="707" y="147"/>
+                      <position x="707" y="391"/>
+                      <position x="650" y="391"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="39"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="17" height="27" width="45">
+              <position x="941" y="95"/>
+              <connectionPointIn>
+                <relPosition x="0" y="13"/>
+                <connection refLocalId="16" formalParameter="OUT">
+                  <position x="941" y="108"/>
+                  <position x="830" y="108"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Done</expression>
+            </outVariable>
+            <block localId="18" width="67" height="111" typeName="OR">
+              <position x="778" y="344"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="42"/>
+                    <connection refLocalId="1" formalParameter="ERROR">
+                      <position x="778" y="386"/>
+                      <position x="752" y="386"/>
+                      <position x="752" y="254"/>
+                      <position x="659" y="254"/>
+                      <position x="659" y="144"/>
+                      <position x="647" y="144"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="87"/>
+                    <connection refLocalId="2" formalParameter="ERROR">
+                      <position x="778" y="431"/>
+                      <position x="650" y="431"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="42"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="19" width="67" height="98" typeName="AND">
+              <position x="933" y="308"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="39"/>
+                    <connection refLocalId="16" formalParameter="OUT">
+                      <position x="933" y="347"/>
+                      <position x="886" y="347"/>
+                      <position x="886" y="108"/>
+                      <position x="830" y="108"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="78"/>
+                    <connection refLocalId="18" formalParameter="OUT">
+                      <position x="933" y="386"/>
+                      <position x="845" y="386"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="39"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="20" height="27" width="45">
+              <position x="1037" y="334"/>
+              <connectionPointIn>
+                <relPosition x="0" y="13"/>
+                <connection refLocalId="19" formalParameter="OUT">
+                  <position x="1037" y="347"/>
+                  <position x="1000" y="347"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Error</expression>
+            </outVariable>
+            <block localId="22" width="97" height="93" typeName="RS" instanceName="RS0">
+              <position x="854" y="498"/>
+              <inputVariables>
+                <variable formalParameter="S">
+                  <connectionPointIn>
+                    <relPosition x="0" y="38"/>
+                    <connection refLocalId="23">
+                      <position x="854" y="536"/>
+                      <position x="795" y="536"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="R1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="74"/>
+                    <connection refLocalId="21">
+                      <position x="854" y="572"/>
+                      <position x="790" y="572"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q1">
+                  <connectionPointOut>
+                    <relPosition x="97" y="38"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="21" height="27" width="45">
+              <position x="745" y="559"/>
+              <connectionPointOut>
+                <relPosition x="45" y="13"/>
+              </connectionPointOut>
+              <expression>Done</expression>
+            </inVariable>
+            <inVariable localId="23" height="27" width="63">
+              <position x="732" y="523"/>
+              <connectionPointOut>
+                <relPosition x="63" y="13"/>
+              </connectionPointOut>
+              <expression>Execute</expression>
+            </inVariable>
+            <outVariable localId="24" height="27" width="41">
+              <position x="1006" y="523"/>
+              <connectionPointIn>
+                <relPosition x="0" y="13"/>
+                <connection refLocalId="22" formalParameter="Q1">
+                  <position x="1006" y="536"/>
+                  <position x="951" y="536"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Busy</expression>
+            </outVariable>
+            <block localId="25" width="126" height="40" typeName="UINT_TO_STRING">
+              <position x="296" y="276"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="14">
+                      <position x="296" y="306"/>
+                      <position x="262" y="306"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="126" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="14" height="27" width="117">
+              <position x="145" y="293"/>
+              <connectionPointOut>
+                <relPosition x="117" y="13"/>
+              </connectionPointOut>
+              <expression>TorqueLimitPos</expression>
+            </inVariable>
+            <block localId="12" width="126" height="40" typeName="UINT_TO_STRING">
+              <position x="305" y="580"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="15">
+                      <position x="305" y="610"/>
+                      <position x="283" y="610"/>
+                      <position x="283" y="611"/>
+                      <position x="262" y="611"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="126" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="15" height="27" width="119">
+              <position x="143" y="598"/>
+              <connectionPointOut>
+                <relPosition x="119" y="13"/>
+              </connectionPointOut>
+              <expression>TorqueLimitNeg</expression>
+            </inVariable>
+          </FBD>
+        </body>
+      </pou>
+      <pou name="EtherLabGetTorqueLimit" pouType="functionBlock">
+        <interface>
+          <inputVars>
+            <variable name="Pos">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Execute">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="Done">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Busy">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Error">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="ErrorID">
+              <type>
+                <WORD/>
+              </type>
+            </variable>
+            <variable name="TorqueLimitPos">
+              <type>
+                <UINT/>
+              </type>
+            </variable>
+            <variable name="TorqueLimitNeg">
+              <type>
+                <UINT/>
+              </type>
+            </variable>
+          </outputVars>
+          <localVars>
+            <variable name="EtherLabSDOUpload0">
+              <type>
+                <derived name="EtherLabSDOUpload"/>
+              </type>
+            </variable>
+            <variable name="EtherLabSDOUpload1">
+              <type>
+                <derived name="EtherLabSDOUpload"/>
+              </type>
+            </variable>
+            <variable name="RS0">
+              <type>
+                <derived name="RS"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <block localId="1" width="149" height="203" typeName="EtherLabSDOUpload" instanceName="EtherLabSDOUpload0">
+              <position x="283" y="70"/>
+              <inputVariables>
+                <variable formalParameter="EXECUTE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="38"/>
+                    <connection refLocalId="3">
+                      <position x="283" y="108"/>
+                      <position x="111" y="108"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="POS">
+                  <connectionPointIn>
+                    <relPosition x="0" y="74"/>
+                    <connection refLocalId="4">
+                      <position x="283" y="144"/>
+                      <position x="219" y="144"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="INDEX">
+                  <connectionPointIn>
+                    <relPosition x="0" y="110"/>
+                    <connection refLocalId="6">
+                      <position x="283" y="180"/>
+                      <position x="219" y="180"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="SUBINDEX">
+                  <connectionPointIn>
+                    <relPosition x="0" y="146"/>
+                    <connection refLocalId="8">
+                      <position x="283" y="216"/>
+                      <position x="219" y="216"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="VARTYPE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="182"/>
+                    <connection refLocalId="10">
+                      <position x="283" y="252"/>
+                      <position x="219" y="252"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="ACK">
+                  <connectionPointOut>
+                    <relPosition x="149" y="38"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="VALID">
+                  <connectionPointOut>
+                    <relPosition x="149" y="74"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="VALUE">
+                  <connectionPointOut>
+                    <relPosition x="149" y="110"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="2" width="149" height="228" typeName="EtherLabSDOUpload" instanceName="EtherLabSDOUpload1">
+              <position x="284" y="321"/>
+              <inputVariables>
+                <variable formalParameter="EXECUTE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="40"/>
+                    <connection refLocalId="3">
+                      <position x="284" y="361"/>
+                      <position x="131" y="361"/>
+                      <position x="131" y="108"/>
+                      <position x="111" y="108"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="POS">
+                  <connectionPointIn>
+                    <relPosition x="0" y="81"/>
+                    <connection refLocalId="5">
+                      <position x="284" y="402"/>
+                      <position x="219" y="402"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="INDEX">
+                  <connectionPointIn>
+                    <relPosition x="0" y="122"/>
+                    <connection refLocalId="7">
+                      <position x="284" y="443"/>
+                      <position x="219" y="443"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="SUBINDEX">
+                  <connectionPointIn>
+                    <relPosition x="0" y="163"/>
+                    <connection refLocalId="9">
+                      <position x="284" y="484"/>
+                      <position x="219" y="484"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="VARTYPE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="204"/>
+                    <connection refLocalId="11">
+                      <position x="284" y="525"/>
+                      <position x="219" y="525"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="ACK">
+                  <connectionPointOut>
+                    <relPosition x="149" y="40"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="VALID">
+                  <connectionPointOut>
+                    <relPosition x="149" y="81"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="VALUE">
+                  <connectionPointOut>
+                    <relPosition x="149" y="122"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="3" height="27" width="63">
+              <position x="48" y="95"/>
+              <connectionPointOut>
+                <relPosition x="63" y="13"/>
+              </connectionPointOut>
+              <expression>Execute</expression>
+            </inVariable>
+            <inVariable localId="4" height="27" width="35">
+              <position x="184" y="131"/>
+              <connectionPointOut>
+                <relPosition x="35" y="13"/>
+              </connectionPointOut>
+              <expression>Pos</expression>
+            </inVariable>
+            <inVariable localId="5" height="27" width="35">
+              <position x="184" y="389"/>
+              <connectionPointOut>
+                <relPosition x="35" y="13"/>
+              </connectionPointOut>
+              <expression>Pos</expression>
+            </inVariable>
+            <inVariable localId="6" height="27" width="68">
+              <position x="151" y="167"/>
+              <connectionPointOut>
+                <relPosition x="68" y="13"/>
+              </connectionPointOut>
+              <expression>16#60E0</expression>
+            </inVariable>
+            <inVariable localId="7" height="27" width="68">
+              <position x="151" y="430"/>
+              <connectionPointOut>
+                <relPosition x="68" y="13"/>
+              </connectionPointOut>
+              <expression>16#60E1</expression>
+            </inVariable>
+            <inVariable localId="8" height="27" width="33">
+              <position x="186" y="203"/>
+              <connectionPointOut>
+                <relPosition x="33" y="13"/>
+              </connectionPointOut>
+              <expression>0</expression>
+            </inVariable>
+            <inVariable localId="9" height="27" width="33">
+              <position x="186" y="471"/>
+              <connectionPointOut>
+                <relPosition x="33" y="13"/>
+              </connectionPointOut>
+              <expression>0</expression>
+            </inVariable>
+            <inVariable localId="10" height="27" width="60">
+              <position x="159" y="239"/>
+              <connectionPointOut>
+                <relPosition x="60" y="13"/>
+              </connectionPointOut>
+              <expression>'uint16'</expression>
+            </inVariable>
+            <inVariable localId="11" height="27" width="60">
+              <position x="159" y="512"/>
+              <connectionPointOut>
+                <relPosition x="60" y="13"/>
+              </connectionPointOut>
+              <expression>'uint16'</expression>
+            </inVariable>
+            <block localId="12" width="126" height="40" typeName="STRING_TO_UINT">
+              <position x="492" y="150"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="1" formalParameter="VALUE">
+                      <position x="492" y="180"/>
+                      <position x="432" y="180"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="126" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="13" width="126" height="40" typeName="STRING_TO_UINT">
+              <position x="498" y="413"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="2" formalParameter="VALUE">
+                      <position x="498" y="443"/>
+                      <position x="433" y="443"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="126" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="14" height="27" width="117">
+              <position x="673" y="167"/>
+              <connectionPointIn>
+                <relPosition x="0" y="13"/>
+                <connection refLocalId="12" formalParameter="OUT">
+                  <position x="673" y="180"/>
+                  <position x="618" y="180"/>
+                </connection>
+              </connectionPointIn>
+              <expression>TorqueLimitPos</expression>
+            </outVariable>
+            <outVariable localId="15" height="27" width="119">
+              <position x="679" y="430"/>
+              <connectionPointIn>
+                <relPosition x="0" y="13"/>
+                <connection refLocalId="13" formalParameter="OUT">
+                  <position x="679" y="443"/>
+                  <position x="624" y="443"/>
+                </connection>
+              </connectionPointIn>
+              <expression>TorqueLimitNeg</expression>
+            </outVariable>
+            <block localId="16" width="67" height="98" typeName="AND">
+              <position x="861" y="69"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="39"/>
+                    <connection refLocalId="1" formalParameter="ACK">
+                      <position x="861" y="108"/>
+                      <position x="432" y="108"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="78"/>
+                    <connection refLocalId="2" formalParameter="ACK">
+                      <position x="861" y="147"/>
+                      <position x="804" y="147"/>
+                      <position x="804" y="361"/>
+                      <position x="433" y="361"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="39"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="17" height="27" width="45">
+              <position x="1009" y="95"/>
+              <connectionPointIn>
+                <relPosition x="0" y="13"/>
+                <connection refLocalId="16" formalParameter="OUT">
+                  <position x="1009" y="108"/>
+                  <position x="928" y="108"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Done</expression>
+            </outVariable>
+            <block localId="18" width="67" height="111" typeName="OR">
+              <position x="862" y="315"/>
+              <inputVariables>
+                <variable formalParameter="IN1" negated="true">
+                  <connectionPointIn>
+                    <relPosition x="0" y="42"/>
+                    <connection refLocalId="1" formalParameter="VALID">
+                      <position x="862" y="357"/>
+                      <position x="839" y="357"/>
+                      <position x="839" y="254"/>
+                      <position x="469" y="254"/>
+                      <position x="469" y="144"/>
+                      <position x="432" y="144"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2" negated="true">
+                  <connectionPointIn>
+                    <relPosition x="0" y="87"/>
+                    <connection refLocalId="2" formalParameter="VALID">
+                      <position x="862" y="402"/>
+                      <position x="433" y="402"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="42"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="19" width="67" height="98" typeName="AND">
+              <position x="989" y="279"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="39"/>
+                    <connection refLocalId="16" formalParameter="OUT">
+                      <position x="989" y="318"/>
+                      <position x="958" y="318"/>
+                      <position x="958" y="108"/>
+                      <position x="928" y="108"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="78"/>
+                    <connection refLocalId="18" formalParameter="OUT">
+                      <position x="989" y="357"/>
+                      <position x="929" y="357"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="39"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="20" height="27" width="45">
+              <position x="1102" y="305"/>
+              <connectionPointIn>
+                <relPosition x="0" y="13"/>
+                <connection refLocalId="19" formalParameter="OUT">
+                  <position x="1102" y="318"/>
+                  <position x="1056" y="318"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Error</expression>
+            </outVariable>
+            <block localId="22" width="97" height="93" typeName="RS" instanceName="RS0">
+              <position x="657" y="517"/>
+              <inputVariables>
+                <variable formalParameter="S">
+                  <connectionPointIn>
+                    <relPosition x="0" y="38"/>
+                    <connection refLocalId="23">
+                      <position x="657" y="555"/>
+                      <position x="600" y="555"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="R1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="74"/>
+                    <connection refLocalId="21">
+                      <position x="657" y="591"/>
+                      <position x="599" y="591"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q1">
+                  <connectionPointOut>
+                    <relPosition x="97" y="38"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="21" height="27" width="45">
+              <position x="554" y="578"/>
+              <connectionPointOut>
+                <relPosition x="45" y="13"/>
+              </connectionPointOut>
+              <expression>Done</expression>
+            </inVariable>
+            <inVariable localId="23" height="27" width="63">
+              <position x="537" y="542"/>
+              <connectionPointOut>
+                <relPosition x="63" y="13"/>
+              </connectionPointOut>
+              <expression>Execute</expression>
+            </inVariable>
+            <outVariable localId="24" height="27" width="41">
+              <position x="811" y="542"/>
+              <connectionPointIn>
+                <relPosition x="0" y="13"/>
+                <connection refLocalId="22" formalParameter="Q1">
+                  <position x="811" y="555"/>
+                  <position x="754" y="555"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Busy</expression>
+            </outVariable>
+          </FBD>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations/>
+  </instances>
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/register_information.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,7114 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RegisterInfo>
+  <!--ESC Information-->
+  <Register>
+    <Index>0000</Index>
+    <Description>ESC Rev/Type</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>Type</Description>
+        <Enum>
+          <item>
+            <value>00000010</value>
+            <Description>ESC10/ESC20</Description>
+          </item>
+          <item>
+            <value>00000100</value>
+            <Description>IP Core</Description>
+          </item>
+          <item>
+            <value>00010001</value>
+            <Description>ET1100</Description>
+          </item>
+          <item>
+            <value>00010010</value>
+            <Description>ET1200</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>Revision</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0002</Index>
+    <Description>ESC Build</Description>
+    <Details>
+      <Detail esc="04">
+        <Range>0-3</Range>
+        <Description>Maintenance version</Description>
+      </Detail>
+      <Detail esc="04">
+        <Range>4-7</Range>
+        <Description>Minor version</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0004</Index>
+    <Description>SM/FMMU Cnt</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>FMMU cnt</Description>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>SM cnt</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0006</Index>
+    <Description>Ports/DPRAM</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>DPRAM (Kbyte)</Description>
+      </Detail>
+      <Detail>
+        <Range>8-9</Range>
+        <Description>Port A</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Not implemented</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Not configured (EEPROM)</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>EBUS</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>MII/RMII</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10-11</Range>
+        <Description>Port B</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Not implemented</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Not configured (EEPROM)</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>EBUS</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>MII/RMII</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12-13</Range>
+        <Description>Port C</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Not implemented</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Not configured (EEPROM)</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>EBUS</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>MII/RMII</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14-15</Range>
+        <Description>Port D</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Not implemented</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Not configured (EEPROM)</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>EBUS</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>MII/RMII</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0008</Index>
+    <Description>Features</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>FMMU Operation</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Bit oriented</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Byte oriented</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>DC support</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>DC 64 bit support</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE
+</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>E-Bus low jitter</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>E-Bus ext. link detection</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>6</Range>
+        <Description>MII ext. link detection</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>7</Range>
+        <Description>Separate Handling of FCS Errors</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>DC SYNC ext. Activation</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>EtherCAT LRW cmd. support</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>EtherCAT R/W cmd. support</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>Fixed FMMU/SM Cfg.</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <!--Station Address-->
+  <Register>
+    <Index>0010</Index>
+    <Description>Phys Addr</Description>
+  </Register>
+  <Register>
+    <Index>0012</Index>
+    <Description>Configured Station Alias</Description>
+  </Register>
+  <!--Write Protection-->
+  <Register>
+    <Index>0020</Index>
+    <Description>Register Protect</Description>
+  </Register>
+  <Register>
+    <Index>0030</Index>
+    <Description>Access Protect</Description>
+  </Register>
+  <!--Data Link Layer-->
+  <Register>
+    <Index>0040</Index>
+    <Description>ESC Reset</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>ESC reset ECAT</Description>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>ESC reset PDI</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0100</Index>
+    <Description>ESC Ctrl</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Kill non EtherCATframes</Description>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>Temporary loop control</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Permanent use</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Use for about 1 sec.</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8-9</Range>
+        <Description>Port A</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Auto loop</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Auto close</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Loop open</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Loop closed</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10-11</Range>
+        <Description>Port B</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Auto loop</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Auto close</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Loop open</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Loop closed</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12-13</Range>
+        <Description>Port C</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Auto loop</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Auto close</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Loop open</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Loop closed</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14-15</Range>
+        <Description>Port D</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Auto loop</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Auto close</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Loop open</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Loop closed</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0102</Index>
+    <Description>ESC Ctrl Ext</Description>
+    <Details>
+      <Detail>
+        <Range>0-2</Range>
+        <Description>RX FIFO size</Description>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>EBUS Low jitter</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Normal jitter</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Reducedjitter</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>6</Range>
+        <Description>EBUSremote link down signaling time</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Default</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Reduced</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>Station alias</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Ignore</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Available</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0108</Index>
+    <Description>Phys. RW Offset</Description>
+  </Register>
+  <Register>
+    <Index>0110</Index>
+    <Description>ESC Status</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Operation</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>PDI watchdog</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>expired</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>reloaded</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>Enh. Link Detection</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Deactive</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>Physical link Port A</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>Physical link Port B</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>6</Range>
+        <Description>Physical link Port C</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>7</Range>
+        <Description>Physical link Port D</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8-9</Range>
+        <Description>Port A</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Loop Open, no link</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Loop closed, no link</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Loop open, with link</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Loop closed, with link</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10-11</Range>
+        <Description>Port B</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Loop Open, no link</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Loop closed, no link</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Loop open, with link</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Loop closed, with link</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12-13</Range>
+        <Description>Port C</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Loop Open, no link</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Loop closed, no link</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Loop open, with link</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Loop closed, with link</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14-15</Range>
+        <Description>Port D</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Loop Open, no link</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Loop closed, no link</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Loop open, with link</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Loop closed, with link</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <!--Application Layer-->
+  <Register>
+    <Index>0120</Index>
+    <Description>AL Ctrl</Description>
+    <Details>
+      <Detail>
+        <Range>0-3</Range>
+        <Description>AL Ctrl</Description>
+        <Enum>
+          <item>
+            <value>0000</value>
+            <Description>INIT</Description>
+          </item>
+          <item>
+            <value>0011</value>
+            <Description>Bootstrap</Description>
+          </item>
+          <item>
+            <value>0010</value>
+            <Description>PREOP</Description>
+          </item>
+          <item>
+            <value>0100</value>
+            <Description>SAFEOP</Description>
+          </item>
+          <item>
+            <value>1000</value>
+            <Description>OP</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>Error Ack</Description>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>Device Identification</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>No request</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Device Identification request</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0130</Index>
+    <Description>AL Status</Description>
+    <Details>
+      <Detail>
+        <Range>0-3</Range>
+        <Description>AL Status</Description>
+        <Enum>
+          <item>
+            <value>0000</value>
+            <Description>INIT</Description>
+          </item>
+          <item>
+            <value>0011</value>
+            <Description>Bootstrap</Description>
+          </item>
+          <item>
+            <value>0010</value>
+            <Description>PREOP</Description>
+          </item>
+          <item>
+            <value>0100</value>
+            <Description>SAFEOP</Description>
+          </item>
+          <item>
+            <value>1000</value>
+            <Description>OP</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>Error</Description>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>Device Identification</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>not valid</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>loaded</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0134</Index>
+    <Description>AL Status Code</Description>
+  </Register>
+  <Register>
+    <Index>0138</Index>
+    <Description>RUN/ERR LED Override</Description>
+    <Details>
+      <Detail esc="04">
+        <Range>0-3</Range>
+        <Description>RUN LED Code</Description>
+        <Enum>
+          <item>
+            <value>0000</value>
+            <Description>Off</Description>
+          </item>
+          <item>
+            <value>0001</value>
+            <Description>Flash 1x</Description>
+          </item>
+          <item>
+            <value>0010</value>
+            <Description>Flash 2x</Description>
+          </item>
+          <item>
+            <value>0011</value>
+            <Description>Flash 3x</Description>
+          </item>
+          <item>
+            <value>0100</value>
+            <Description>Flash 4x</Description>
+          </item>
+          <item>
+            <value>0101</value>
+            <Description>Flash 5x</Description>
+          </item>
+          <item>
+            <value>0110</value>
+            <Description>Flash 6x</Description>
+          </item>
+          <item>
+            <value>0111</value>
+            <Description>Flash 7x</Description>
+          </item>
+          <item>
+            <value>1000</value>
+            <Description>Flash 8x</Description>
+          </item>
+          <item>
+            <value>1001</value>
+            <Description>Flash 9x</Description>
+          </item>
+          <item>
+            <value>1010</value>
+            <Description>Flash 10x</Description>
+          </item>
+          <item>
+            <value>1011</value>
+            <Description>Flash 11x</Description>
+          </item>
+          <item>
+            <value>1100</value>
+            <Description>Flash 12x</Description>
+          </item>
+          <item>
+            <value>1101</value>
+            <Description>Blinking</Description>
+          </item>
+          <item>
+            <value>1110</value>
+            <Description>Flickering</Description>
+          </item>
+          <item>
+            <value>1111</value>
+            <Description>On</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail esc="04">
+        <Range>4</Range>
+        <Description>Enable RUN LED Override</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail esc="04">
+        <Range>8-11</Range>
+        <Description>ERR LED Code</Description>
+        <Enum>
+          <item>
+            <value>0000</value>
+            <Description>Off</Description>
+          </item>
+          <item>
+            <value>0001</value>
+            <Description>Flash 1x</Description>
+          </item>
+          <item>
+            <value>0010</value>
+            <Description>Flash 2x</Description>
+          </item>
+          <item>
+            <value>0011</value>
+            <Description>Flash 3x</Description>
+          </item>
+          <item>
+            <value>0100</value>
+            <Description>Flash 4x</Description>
+          </item>
+          <item>
+            <value>0101</value>
+            <Description>Flash 5x</Description>
+          </item>
+          <item>
+            <value>0110</value>
+            <Description>Flash 6x</Description>
+          </item>
+          <item>
+            <value>0111</value>
+            <Description>Flash 7x</Description>
+          </item>
+          <item>
+            <value>1000</value>
+            <Description>Flash 8x</Description>
+          </item>
+          <item>
+            <value>1001</value>
+            <Description>Flash 9x</Description>
+          </item>
+          <item>
+            <value>1010</value>
+            <Description>Flash 10x</Description>
+          </item>
+          <item>
+            <value>1011</value>
+            <Description>Flash 11x</Description>
+          </item>
+          <item>
+            <value>1100</value>
+            <Description>Flash 12x</Description>
+          </item>
+          <item>
+            <value>1101</value>
+            <Description>Blinking</Description>
+          </item>
+          <item>
+            <value>1110</value>
+            <Description>Flickering</Description>
+          </item>
+          <item>
+            <value>1111</value>
+            <Description>On</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail esc="04">
+        <Range>12</Range>
+        <Description>Enable ERR LED Override</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <!--PDI/ESC Configuration-->
+  <Register>
+    <Index>0140</Index>
+    <Description>PDI Ctrl</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>PDI</Description>
+        <Enum>
+          <item>
+            <value>00000000</value>
+            <Description>none</Description>
+          </item>
+          <item>
+            <value>00000001</value>
+            <Description>4 Digital Input</Description>
+          </item>
+          <item>
+            <value>00000010</value>
+            <Description>4 Digital Output</Description>
+          </item>
+          <item>
+            <value>00000011</value>
+            <Description>2 DI and 2 DO</Description>
+          </item>
+          <item>
+            <value>00000100</value>
+            <Description>Digital I/O</Description>
+          </item>
+          <item>
+            <value>00000101</value>
+            <Description>SPI Slave</Description>
+          </item>
+          <item>
+            <value>00000110</value>
+            <Description>Oversampling I/O</Description>
+          </item>
+          <item>
+            <value>00000111</value>
+            <Description>EtherCAT Bridge (port3)</Description>
+          </item>
+          <item>
+            <value>00001000</value>
+            <Description>uC async. 16bit</Description>
+          </item>
+          <item>
+            <value>00001001</value>
+            <Description>uC async. 8bit</Description>
+          </item>
+          <item>
+            <value>00001010</value>
+            <Description>uC sync. 16bit</Description>
+          </item>
+          <item>
+            <value>00001011</value>
+            <Description>uC sync. 8bit</Description>
+          </item>
+          <item>
+            <value>00010000</value>
+            <Description>32 Digital Input and 0 Digital Output</Description>
+          </item>
+          <item>
+            <value>00010001</value>
+            <Description>24 Digital Input and 8 Digital Output</Description>
+          </item>
+          <item>
+            <value>00010010</value>
+            <Description>16 Digital Input and 16 Digital Output</Description>
+          </item>
+          <item>
+            <value>00010011</value>
+            <Description>8 Digital Input and 24 Digital Output</Description>
+          </item>
+          <item>
+            <value>00010100</value>
+            <Description>0 Digital Input and 32 Digital Output</Description>
+          </item>
+          <item>
+            <value>11111111</value>
+            <Description>On-chip bus</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>Device emulation</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>Enhanced link detection all ports</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>DC SYNC Out Unit</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>DC Latch In Unit</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>Enhanced link port 0</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>Enhanced link port 1</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14</Range>
+        <Description>Enhanced link port 2</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>15</Range>
+        <Description>Enhanced link port 3</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>014e</Index>
+    <Description>PDI Information</Description>
+    <Details>
+      <Detail esc="04">
+        <Range>0</Range>
+        <Description>PDI register function ack. by write </Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail esc="04">
+        <Range>1</Range>
+        <Description>PDI configured</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail esc="04">
+        <Range>2</Range>
+        <Description>PDI Active</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail esc="04">
+        <Range>3</Range>
+        <Description>PDI config. invalid</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="04">
+    <Index>0150</Index>
+    <Description>PDI Cfg</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>OUTVALID polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active high</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active low</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>OUTVALID mode</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Output event signaling</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>WD_TRIG signaling</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>mode of direction</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Unidirectional</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Bidirectional</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>Watchdog behavior</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Immediately output reset</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Wait output reset</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4-5</Range>
+        <Description>Input data is sampled at</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Start of Frame</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Rising edge of LATCH_IN</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>DC SYNC0 event</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>DC SYNC1 event</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>6-7</Range>
+        <Description>Input data is sampled at</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>End of Frame</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>DC SYNC0 event</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>DC SYNC1 event</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="05">
+    <Index>0150</Index>
+    <Description>PDI Cfg</Description>
+    <Details>
+      <Detail>
+        <Range>0-1</Range>
+        <Description>SPI mode</Description>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>SPI IRQ output driver</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push-Pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>SPI IRQ polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>SPI SEL polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>Data output sample mode</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Normal</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Late</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>SYNC output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>SYNC0 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>SYNC0 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>SYNC0 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>SYNC1 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>15</Range>
+        <Description>SYNC1 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="08">
+    <Index>0150</Index>
+    <Description>PDI Cfg</Description>
+    <Details>
+      <Detail>
+        <Range>0-1</Range>
+        <Description>BUSY output driver/polarity</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Push-Pull active low</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Open Drain (Active low)</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Push-Pull active high</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Open source (Active high)</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2-3</Range>
+        <Description>IRQ output driver/polarity</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Push-Pull active low</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Open Drain (Active low)</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Push-Pull active high</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Open source (Active high)</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>BHE polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>7</Range>
+        <Description>RD polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>SYNC output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>SYNC0 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>SYNC0 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>SYNC0 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>SYNC1 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>15</Range>
+        <Description>SYNC1 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="09">
+    <Index>0150</Index>
+    <Description>PDI Cfg</Description>
+    <Details>
+      <Detail>
+        <Range>0-1</Range>
+        <Description>BUSY output driver/polarity</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Push-Pull active low</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Open Drain (Active low)</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Push-Pull active high</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Open source (Active high)</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2-3</Range>
+        <Description>IRQ output driver/polarity</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Push-Pull active low</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Open Drain (Active low)</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Push-Pull active high</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Open source (Active high)</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>BHE polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>7</Range>
+        <Description>RD polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>SYNC output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>SYNC0 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>SYNC0 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>SYNC0 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>SYNC1 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>15</Range>
+        <Description>SYNC1 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="0a">
+    <Index>0150</Index>
+    <Description>PDI Cfg</Description>
+    <Details>
+      <Detail>
+        <Range>0-1</Range>
+        <Description>TA output driver/polarity</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Push-pull active low</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Open Drain (Active low)</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Push-pull active high</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Open Source (Active high)</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2-3</Range>
+        <Description>IRQ output driver/polarity</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Push-pull active low</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Open Drain (Active low)</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Push-pull active high</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Open Source (Active high)</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>BHE polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>ADR(0) polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>6</Range>
+        <Description>Byte accessmode</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>BHE or Byte select mode</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Transfer size mode</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>7</Range>
+        <Description>TS polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>SYNC output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>SYNC0 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>SYNC0 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>SYNC0 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>SYNC1 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>15</Range>
+        <Description>SYNC1 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="0b">
+    <Index>0150</Index>
+    <Description>PDI Cfg</Description>
+    <Details>
+      <Detail>
+        <Range>0-1</Range>
+        <Description>TA output driver/polarity</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Push-pull active low</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Open Drain (Active low)</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Push-pull active high</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Open Source (Active high)</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2-3</Range>
+        <Description>IRQ output driver/polarity</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Push-pull active low</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Open Drain (Active low)</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Push-pull active high</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Open Source (Active high)</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>BHE polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>ADR(0) polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>6</Range>
+        <Description>Byte accessmode</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>BHE or Byte select mode</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Transfer size mode</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>7</Range>
+        <Description>TS polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>SYNC output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>SYNC0 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>SYNC0 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>SYNC0 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>SYNC1 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>15</Range>
+        <Description>SYNC1 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="07">
+    <Index>0150</Index>
+    <Description>PDI Cfg</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Bridge port physical layer</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>EBUS</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>MII</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>SYNC output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>SYNC0 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>SYNC0 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>SYNC0 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>SYNC1 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>15</Range>
+        <Description>SYNC1 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="ff">
+    <Index>0150</Index>
+    <Description>PDI Cfg</Description>
+    <Details>
+      <Detail>
+        <Range>0-6</Range>
+        <Description>Bus clock multiplication factor</Description>
+      </Detail>
+      <Detail>
+        <Range>7</Range>
+        <Description>On-chip bus</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Altera Avalon</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Xilinx OPB</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>SYNC0 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>SYNC0 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>SYNC0 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>SYNC0 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Push pull</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Open</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>SYNC1 polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14</Range>
+        <Description>SYNC1 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>15</Range>
+        <Description>SYNC1 to AL event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="04">
+    <Index>0152</Index>
+    <Description>PDI Cfg Ext</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Direction of I/O[1:0]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>Direction of I/O[3:2]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>Direction of I/O[5:4]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>Direction of I/O[7:6]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>Direction of I/O[9:8]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>Direction of I/O[11:10]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>6</Range>
+        <Description>Direction of I/O[13:12]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>7</Range>
+        <Description>Direction of I/O[15:14]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>Direction of I/O[17:16]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>Direction of I/O[19:18]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>Direction of I/O[21:20]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>Direction of I/O[23:22]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>Direction of I/O[25:24]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>Direction of I/O[27:26]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14</Range>
+        <Description>Direction of I/O[29:28]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>15</Range>
+        <Description>Direction of I/O[31:30]</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Input</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Output</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="08">
+    <Index>0152</Index>
+    <Description>PDI Cfg Ext</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Read BUSY delay</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Normal read</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Delayed read</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="09">
+    <Index>0152</Index>
+    <Description>PDI Cfg Ext</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Read BUSY delay</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Normal read</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Delayed read</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="0a">
+    <Index>0152</Index>
+    <Description>PDI Cfg Ext</Description>
+    <Details>
+      <Detail>
+        <Range>8</Range>
+        <Description>Write data valid</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Oneclock cycle after CS</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Together with CS</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>Read mode</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Use Byte Select</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Always read 16 bit</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>CS mode</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Sample with rising edge</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Sample with falling edge</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>TA/IRQ mode</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Update with rising edge</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Update with falling edge</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="0b">
+    <Index>0152</Index>
+    <Description>PDI Cfg Ext</Description>
+    <Details>
+      <Detail>
+        <Range>8</Range>
+        <Description>Write data valid</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Oneclock cycle after CS</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Together with CS</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>Read mode</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Use Byte Select</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Always read 16 bit</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>CS mode</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Sample with rising edge</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Sample with falling edge</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>TA/IRQ mode</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Update with rising edge</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Update with falling edge</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="ff">
+    <Index>0152</Index>
+    <Description>PDI Cfg Ext</Description>
+    <Details>
+      <Detail>
+        <Range>0-1</Range>
+        <Description>Data bus width</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>4Bytes</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>1Byte</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>2Bytes</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <!--Interrupts-->
+  <Register>
+    <Index>0200</Index>
+    <Description>ECAT IRQ Mask</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Latch event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>ESC Status event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>AL Status event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="0">
+        <Range>4</Range>
+        <Description>SM0 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="1">
+        <Range>5</Range>
+        <Description>SM1 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="2">
+        <Range>6</Range>
+        <Description>SM2 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="3">
+        <Range>7</Range>
+        <Description>SM3 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="4">
+        <Range>8</Range>
+        <Description>SM4 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="5">
+        <Range>9</Range>
+        <Description>SM5 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="6">
+        <Range>10</Range>
+        <Description>SM6 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="7">
+        <Range>11</Range>
+        <Description>SM7 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0204</Index>
+    <Description>PDI IRQ Mask L</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>AL Ctrl</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>Latch input</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>SYNC 0</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>SYNC 1</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail esc="02">
+        <Range>4</Range>
+        <Description>SM Changed</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>EEPROM command pending</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="0">
+        <Range>8</Range>
+        <Description>SM0</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="1">
+        <Range>9</Range>
+        <Description>SM1</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="2">
+        <Range>10</Range>
+        <Description>SM2</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="3">
+        <Range>11</Range>
+        <Description>SM3</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="4">
+        <Range>12</Range>
+        <Description>SM4</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="5">
+        <Range>13</Range>
+        <Description>SM5</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="6">
+        <Range>14</Range>
+        <Description>SM6</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="7">
+        <Range>15</Range>
+        <Description>SM7</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0206</Index>
+    <Description>PDI IRQ Mask H</Description>
+    <Details>
+      <Detail sm="8">
+        <Range>0</Range>
+        <Description>SM8</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="9">
+        <Range>1</Range>
+        <Description>SM9</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="10">
+        <Range>2</Range>
+        <Description>SM10</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="11">
+        <Range>3</Range>
+        <Description>SM11</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="12">
+        <Range>4</Range>
+        <Description>SM12</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="13">
+        <Range>5</Range>
+        <Description>SM13</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="14">
+        <Range>6</Range>
+        <Description>SM14</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="15">
+        <Range>7</Range>
+        <Description>SM15</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0210</Index>
+    <Description>ECAT IRQ</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Latch event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>ESC Status event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>AL Status event</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="0">
+        <Range>4</Range>
+        <Description>SM0 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="1">
+        <Range>5</Range>
+        <Description>SM1 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="2">
+        <Range>6</Range>
+        <Description>SM2 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="3">
+        <Range>7</Range>
+        <Description>SM3 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="4">
+        <Range>8</Range>
+        <Description>SM4 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="5">
+        <Range>9</Range>
+        <Description>SM5 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="6">
+        <Range>10</Range>
+        <Description>SM6 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="7">
+        <Range>11</Range>
+        <Description>SM7 IRQ</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0220</Index>
+    <Description>PDI IRQ 1</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>AL Ctrl</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>Latch input</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>DC SYNC 0</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>DC SYNC 1</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>SM activation reg. changed</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>EEPROM command pending</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>6</Range>
+        <Description>Watchdog Process Data expired</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="0">
+        <Range>8</Range>
+        <Description>SM0</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="1">
+        <Range>9</Range>
+        <Description>SM1</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="2">
+        <Range>10</Range>
+        <Description>SM2</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="3">
+        <Range>11</Range>
+        <Description>SM3</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="4">
+        <Range>12</Range>
+        <Description>SM4</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="5">
+        <Range>13</Range>
+        <Description>SM5</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="6">
+        <Range>14</Range>
+        <Description>SM6</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="7">
+        <Range>15</Range>
+        <Description>SM7</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0222</Index>
+    <Description>PDI IRQ 2</Description>
+    <Details>
+      <Detail sm="8">
+        <Range>0</Range>
+        <Description>SM8</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="9">
+        <Range>1</Range>
+        <Description>SM9</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="10">
+        <Range>2</Range>
+        <Description>SM10</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="11">
+        <Range>3</Range>
+        <Description>SM11</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="12">
+        <Range>4</Range>
+        <Description>SM12</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="13">
+        <Range>5</Range>
+        <Description>SM13</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="14">
+        <Range>6</Range>
+        <Description>SM14</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail sm="15">
+        <Range>7</Range>
+        <Description>SM15</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <!--Error Counters-->
+  <Register>
+    <Index>0300</Index>
+    <Description>CRC A</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>Invalid frame</Description>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>RX error</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0302</Index>
+    <Description>CRC B</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>Invalid frame</Description>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>RX error</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0304</Index>
+    <Description>CRC C</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>Invalid frame</Description>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>RX error</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0306</Index>
+    <Description>CRC D</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>Invalid frame</Description>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>RX error</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0308</Index>
+    <Description>Forw. CRC A/B</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>Port A</Description>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>Port B</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>030a</Index>
+    <Description>Forw. CRC C/D</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>Port C</Description>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>Port D</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>030c</Index>
+    <Description>Proc. CRC/PDI Err</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>Process unit error</Description>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>PDI error</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="05">
+    <Index>030e</Index>
+    <Description>PDI Error Code</Description>
+    <Details>
+      <Detail>
+        <Range>0-2</Range>
+        <Description>Number of SPI CLK cycles of whole access</Description>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>Busy violation during read access</Description>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>Read termination missing</Description>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>Access continued</Description>
+      </Detail>
+      <Detail>
+        <Range>6-7</Range>
+        <Description>SPI command</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="08" esc="04">
+    <Index>030e</Index>
+    <Description>PDI Error Code</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Busy violation during read access</Description>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>Busy violation during write access</Description>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>Addressing error for a read access</Description>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>Addressing error for a write access</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="09" esc="04">
+    <Index>030e</Index>
+    <Description>PDI Error Code</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Busy violation during read access</Description>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>Busy violation during write access</Description>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>Addressing error for a read access</Description>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>Addressing error for a write access</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="0a" esc="04">
+    <Index>030e</Index>
+    <Description>PDI Error Code</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Busy violation during read access</Description>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>Busy violation during write access</Description>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>Addressing error for a read access</Description>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>Addressing error for a write access</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register pdi="0b" esc="04">
+    <Index>030e</Index>
+    <Description>PDI Error Code</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Busy violation during read access</Description>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>Busy violation during write access</Description>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>Addressing error for a read access</Description>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>Addressing error for a write access</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0310</Index>
+    <Description>Link Lost A/B</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>Port A</Description>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>Port B</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0312</Index>
+    <Description>Link Lost C/D</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>Port C</Description>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>Port D</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <!--Watchdogs-->
+  <Register>
+    <Index>0400</Index>
+    <Description>WD Divisor</Description>
+  </Register>
+  <Register>
+    <Index>0410</Index>
+    <Description>WD Time PDI</Description>
+  </Register>
+  <Register>
+    <Index>0420</Index>
+    <Description>WD Time SM</Description>
+  </Register>
+  <Register>
+    <Index>0440</Index>
+    <Description>WD Status</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>PD watchdog</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>expired</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>active or disabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0442</Index>
+    <Description>WD PDI/SM Counter</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>SM watchdog cnt</Description>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>PDI watchdog cnt</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <!--SII EEPROM Interface-->
+  <Register>
+    <Index>0500</Index>
+    <Description>EEPROM Assign</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>EEPROM access ctrl</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>ECAT</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>PDI</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>Reset PDIaccess</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Do not change Bit 501.0</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Reset Bit 501.0 to 0</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>EEPROM access status</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>ECAT</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>PDI</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0502</Index>
+    <Description>EEPROM Ctrl/Status</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Write access</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>EEPROM emulation</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Normal operation</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>PDI emulates EEPROM</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>6</Range>
+        <Description>8 byte access</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>7</Range>
+        <Description>2 byte address</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>Read access</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>Write access</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>Reload access</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>CRC error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>Load error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>Cmd error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14</Range>
+        <Description>Write error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>15</Range>
+        <Description>Busy</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0504</Index>
+    <Description>EEPROM Address L</Description>
+  </Register>
+  <Register>
+    <Index>0506</Index>
+    <Description>EEPROM Address H</Description>
+  </Register>
+  <Register>
+    <Index>0508</Index>
+    <Description>EEPROM Data 0</Description>
+  </Register>
+  <Register>
+    <Index>050a</Index>
+    <Description>EEPROM Data 1</Description>
+  </Register>
+  <Register>
+    <Index>050c</Index>
+    <Description>EEPROM Data 2</Description>
+  </Register>
+  <Register>
+    <Index>050e</Index>
+    <Description>EEPROM Data 3</Description>
+  </Register>
+  <!--MII Management Interface-->
+  <Register>
+    <Index>0510</Index>
+    <Description>Phy MIO Ctrl/Status</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Write enable</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>PDI control possible</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>Link detection active</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>3-7</Range>
+        <Description>Phy address offset</Description>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>Read access</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>Write access</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>Read error occured</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14</Range>
+        <Description>Write error occured</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>15</Range>
+        <Description>Busy</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0512</Index>
+    <Description>Phy MIO Address</Description>
+    <Details>
+      <Detail>
+        <Range>0-4</Range>
+        <Description>Phy address</Description>
+      </Detail>
+      <Detail>
+        <Range>8-11</Range>
+        <Description>MIO address</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0514</Index>
+    <Description>Phy MIO Data</Description>
+  </Register>
+  <Register>
+    <Index>0516</Index>
+    <Description>MIO Access</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>ECAT claims exclusive access</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>PDI hasaccess to MII management</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>Force PDI to reset 517.0</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0518</Index>
+    <Description>MIO Port Status A/B</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Port A: Physical link detected</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>Port A: Link detected</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>Port A: Link status error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>Port A: Read error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>Port A: Link partner error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>Port A: Phy config updated</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>Port B: Physical link detected</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>Port B: Link detected</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>Port B:  Link status error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>Port B: Read error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>Port B: Link partner error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>Port B: Phy config updated</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>051a</Index>
+    <Description>MIO Port Status C/D</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Port C: Physical link detected</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>Port C: Link detected</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>Port C: Link status eror</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>Port C: Read error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>Port C: Link partner error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>Port C: Phy config updated</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>Port D: Physical link detected</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>Port D: Link detected</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>Port D: Link status error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>Port D: Read error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>Port D: Link partner error</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>Port D: Phy config updated</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <!--FMMU-->
+  <Register fmmu="0">
+    <Index>0600</Index>
+    <Description>F0 lStart L</Description>
+  </Register>
+  <Register fmmu="0">
+    <Index>0602</Index>
+    <Description>F0 lStart H</Description>
+  </Register>
+  <Register fmmu="0">
+    <Index>0604</Index>
+    <Description>F0 lLength</Description>
+  </Register>
+  <Register fmmu="0">
+    <Index>0606</Index>
+    <Description>F0 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="0">
+    <Index>0608</Index>
+    <Description>F0 pStart</Description>
+  </Register>
+  <Register fmmu="0">
+    <Index>060a</Index>
+    <Description>F0 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="0">
+    <Index>060c</Index>
+    <Description>F0 Enable</Description>
+  </Register>
+  <Register fmmu="1">
+    <Index>0610</Index>
+    <Description>F1 lStart L</Description>
+  </Register>
+  <Register fmmu="1">
+    <Index>0612</Index>
+    <Description>F1 lStart H</Description>
+  </Register>
+  <Register fmmu="1">
+    <Index>0614</Index>
+    <Description>F1 lLength</Description>
+  </Register>
+  <Register fmmu="1">
+    <Index>0616</Index>
+    <Description>F1 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="1">
+    <Index>0618</Index>
+    <Description>F1 pStart</Description>
+  </Register>
+  <Register fmmu="1">
+    <Index>061a</Index>
+    <Description>F01 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="1">
+    <Index>061c</Index>
+    <Description>F1 Enable</Description>
+  </Register>
+  <Register fmmu="2">
+    <Index>0620</Index>
+    <Description>F2 lStart L</Description>
+  </Register>
+  <Register fmmu="2">
+    <Index>0622</Index>
+    <Description>F2 lStart H</Description>
+  </Register>
+  <Register fmmu="2">
+    <Index>0624</Index>
+    <Description>F2 lLength</Description>
+  </Register>
+  <Register fmmu="2">
+    <Index>0626</Index>
+    <Description>F2 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="2">
+    <Index>0628</Index>
+    <Description>F2 pStart</Description>
+  </Register>
+  <Register fmmu="2">
+    <Index>062a</Index>
+    <Description>F2 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="2">
+    <Index>062c</Index>
+    <Description>F2 Enable</Description>
+  </Register>
+  <Register fmmu="3">
+    <Index>0630</Index>
+    <Description>F3 lStart L</Description>
+  </Register>
+  <Register fmmu="3">
+    <Index>0632</Index>
+    <Description>F3 lStart H</Description>
+  </Register>
+  <Register fmmu="3">
+    <Index>0634</Index>
+    <Description>F3 lLength</Description>
+  </Register>
+  <Register fmmu="3">
+    <Index>0636</Index>
+    <Description>F3 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="3">
+    <Index>0638</Index>
+    <Description>F3 pStart</Description>
+  </Register>
+  <Register fmmu="3">
+    <Index>063a</Index>
+    <Description>F3 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="3">
+    <Index>063c</Index>
+    <Description>F3 Enable</Description>
+  </Register>
+  <Register fmmu="4">
+    <Index>0640</Index>
+    <Description>F4 lStart L</Description>
+  </Register>
+  <Register fmmu="4">
+    <Index>0642</Index>
+    <Description>F4 lStart H</Description>
+  </Register>
+  <Register fmmu="4">
+    <Index>0644</Index>
+    <Description>F4 lLength</Description>
+  </Register>
+  <Register fmmu="4">
+    <Index>0646</Index>
+    <Description>F4 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="4">
+    <Index>0648</Index>
+    <Description>F4 pStart</Description>
+  </Register>
+  <Register fmmu="4">
+    <Index>064a</Index>
+    <Description>F4 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="4">
+    <Index>064c</Index>
+    <Description>F4 Enable</Description>
+  </Register>
+  <Register fmmu="5">
+    <Index>0650</Index>
+    <Description>F5 lStart L</Description>
+  </Register>
+  <Register fmmu="5">
+    <Index>0652</Index>
+    <Description>F5 lStart H</Description>
+  </Register>
+  <Register fmmu="5">
+    <Index>0654</Index>
+    <Description>F5 lLength</Description>
+  </Register>
+  <Register fmmu="5">
+    <Index>0656</Index>
+    <Description>F5 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="5">
+    <Index>0658</Index>
+    <Description>F5 pStart</Description>
+  </Register>
+  <Register fmmu="5">
+    <Index>065a</Index>
+    <Description>F5 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="5">
+    <Index>065c</Index>
+    <Description>F5 Enable</Description>
+  </Register>
+  <Register fmmu="6">
+    <Index>0660</Index>
+    <Description>F6 lStart L</Description>
+  </Register>
+  <Register fmmu="6">
+    <Index>0662</Index>
+    <Description>F6 lStart H</Description>
+  </Register>
+  <Register fmmu="6">
+    <Index>0664</Index>
+    <Description>F6 lLength</Description>
+  </Register>
+  <Register fmmu="6">
+    <Index>0666</Index>
+    <Description>F6 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="6">
+    <Index>0668</Index>
+    <Description>F6 pStart</Description>
+  </Register>
+  <Register fmmu="6">
+    <Index>066a</Index>
+    <Description>F6 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="6">
+    <Index>066c</Index>
+    <Description>F6 Enable</Description>
+  </Register>
+  <Register fmmu="7">
+    <Index>0670</Index>
+    <Description>F7 lStart L</Description>
+  </Register>
+  <Register fmmu="7">
+    <Index>0672</Index>
+    <Description>F7 lStart H</Description>
+  </Register>
+  <Register fmmu="7">
+    <Index>0674</Index>
+    <Description>F7 lLength</Description>
+  </Register>
+  <Register fmmu="7">
+    <Index>0676</Index>
+    <Description>F7 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="7">
+    <Index>0678</Index>
+    <Description>F7 pStart</Description>
+  </Register>
+  <Register fmmu="7">
+    <Index>067a</Index>
+    <Description>F7 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="7">
+    <Index>067c</Index>
+    <Description>F7 Enable</Description>
+  </Register>
+  <Register fmmu="8">
+    <Index>0680</Index>
+    <Description>F8 lStart L</Description>
+  </Register>
+  <Register fmmu="8">
+    <Index>0682</Index>
+    <Description>F8 lStart H</Description>
+  </Register>
+  <Register fmmu="8">
+    <Index>0684</Index>
+    <Description>F8 lLength</Description>
+  </Register>
+  <Register fmmu="8">
+    <Index>0686</Index>
+    <Description>F8 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="8">
+    <Index>0688</Index>
+    <Description>F8 pStart</Description>
+  </Register>
+  <Register fmmu="8">
+    <Index>068a</Index>
+    <Description>F8 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="8">
+    <Index>068c</Index>
+    <Description>F8 Enable</Description>
+  </Register>
+  <Register fmmu="9">
+    <Index>0690</Index>
+    <Description>F9 lStart L</Description>
+  </Register>
+  <Register fmmu="9">
+    <Index>0692</Index>
+    <Description>F9 lStart H</Description>
+  </Register>
+  <Register fmmu="9">
+    <Index>0694</Index>
+    <Description>F9 lLength</Description>
+  </Register>
+  <Register fmmu="9">
+    <Index>0696</Index>
+    <Description>F9 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="9">
+    <Index>0698</Index>
+    <Description>F9 pStart</Description>
+  </Register>
+  <Register fmmu="9">
+    <Index>069a</Index>
+    <Description>F9 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="9">
+    <Index>069c</Index>
+    <Description>F9 Enable</Description>
+  </Register>
+  <Register fmmu="10">
+    <Index>06a0</Index>
+    <Description>F10 lStart L</Description>
+  </Register>
+  <Register fmmu="10">
+    <Index>06a2</Index>
+    <Description>F10 lStart H</Description>
+  </Register>
+  <Register fmmu="10">
+    <Index>06a4</Index>
+    <Description>F10 lLength</Description>
+  </Register>
+  <Register fmmu="10">
+    <Index>06a6</Index>
+    <Description>F10 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="10">
+    <Index>06a8</Index>
+    <Description>F10 pStart</Description>
+  </Register>
+  <Register fmmu="10">
+    <Index>06aa</Index>
+    <Description>F10 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="10">
+    <Index>06ac</Index>
+    <Description>F10 Enable</Description>
+  </Register>
+  <Register fmmu="11">
+    <Index>06b0</Index>
+    <Description>F11 lStart L</Description>
+  </Register>
+  <Register fmmu="11">
+    <Index>06b2</Index>
+    <Description>F11 lStart H</Description>
+  </Register>
+  <Register fmmu="11">
+    <Index>06b4</Index>
+    <Description>F11 lLength</Description>
+  </Register>
+  <Register fmmu="11">
+    <Index>06b6</Index>
+    <Description>F11 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="11">
+    <Index>06b8</Index>
+    <Description>F11 pStart</Description>
+  </Register>
+  <Register fmmu="11">
+    <Index>06ba</Index>
+    <Description>F11 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="11">
+    <Index>06bc</Index>
+    <Description>F11 Enable</Description>
+  </Register>
+  <Register fmmu="12">
+    <Index>06c0</Index>
+    <Description>F12 lStart L</Description>
+  </Register>
+  <Register fmmu="12">
+    <Index>06c2</Index>
+    <Description>F12 lStart H</Description>
+  </Register>
+  <Register fmmu="12">
+    <Index>06c4</Index>
+    <Description>F12 lLength</Description>
+  </Register>
+  <Register fmmu="12">
+    <Index>06c6</Index>
+    <Description>F12 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="12">
+    <Index>06c8</Index>
+    <Description>F12 pStart</Description>
+  </Register>
+  <Register fmmu="12">
+    <Index>06ca</Index>
+    <Description>F12 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="12">
+    <Index>06cc</Index>
+    <Description>F12 Enable</Description>
+  </Register>
+  <Register fmmu="13">
+    <Index>06d0</Index>
+    <Description>F13 lStart L</Description>
+  </Register>
+  <Register fmmu="13">
+    <Index>06d2</Index>
+    <Description>F13 lStart H</Description>
+  </Register>
+  <Register fmmu="13">
+    <Index>06d4</Index>
+    <Description>F13 lLength</Description>
+  </Register>
+  <Register fmmu="13">
+    <Index>06d6</Index>
+    <Description>F13 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="13">
+    <Index>06d8</Index>
+    <Description>F13 pStart</Description>
+  </Register>
+  <Register fmmu="13">
+    <Index>06da</Index>
+    <Description>F13 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="13">
+    <Index>06dc</Index>
+    <Description>F13 Enable</Description>
+  </Register>
+  <Register fmmu="14">
+    <Index>06e0</Index>
+    <Description>F14 lStart L</Description>
+  </Register>
+  <Register fmmu="14">
+    <Index>06e2</Index>
+    <Description>F14 lStart H</Description>
+  </Register>
+  <Register fmmu="14">
+    <Index>06e4</Index>
+    <Description>F14 lLength</Description>
+  </Register>
+  <Register fmmu="14">
+    <Index>06e6</Index>
+    <Description>F14 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="14">
+    <Index>06e8</Index>
+    <Description>F14 pStart</Description>
+  </Register>
+  <Register fmmu="14">
+    <Index>06ea</Index>
+    <Description>F14 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="14">
+    <Index>06ec</Index>
+    <Description>F14 Enable</Description>
+  </Register>
+  <Register fmmu="15">
+    <Index>06f0</Index>
+    <Description>F15 lStart L</Description>
+  </Register>
+  <Register fmmu="15">
+    <Index>06f2</Index>
+    <Description>F15 lStart H</Description>
+  </Register>
+  <Register fmmu="15">
+    <Index>06f4</Index>
+    <Description>F15 lLength</Description>
+  </Register>
+  <Register fmmu="15">
+    <Index>06f6</Index>
+    <Description>F15 lStartEndBit</Description>
+  </Register>
+  <Register fmmu="15">
+    <Index>06f8</Index>
+    <Description>F15 pStart</Description>
+  </Register>
+  <Register fmmu="15">
+    <Index>06fa</Index>
+    <Description>F15 pStartBit/Dir</Description>
+  </Register>
+  <Register fmmu="15">
+    <Index>06fc</Index>
+    <Description>F15 Enable</Description>
+  </Register>
+  <!--SyncManager-->
+  <Register sm="0">
+    <Index>0800</Index>
+    <Description>SM0 Start</Description>
+  </Register>
+  <Register sm="0">
+    <Index>0802</Index>
+    <Description>SM0 Length</Description>
+  </Register>
+  <Register sm="0">
+    <Index>0804</Index>
+    <Description>SM0 Ctrl/Status</Description>
+  </Register>
+  <Register sm="0">
+    <Index>0806</Index>
+    <Description>SM0 Enable</Description>
+  </Register>
+  <Register sm="1">
+    <Index>0808</Index>
+    <Description>SM1 Start</Description>
+  </Register>
+  <Register sm="1">
+    <Index>080a</Index>
+    <Description>SM1 Length</Description>
+  </Register>
+  <Register sm="1">
+    <Index>080c</Index>
+    <Description>SM1 Ctrl/Status</Description>
+  </Register>
+  <Register sm="1">
+    <Index>080e</Index>
+    <Description>SM1 Enable</Description>
+  </Register>
+  <Register sm="2">
+    <Index>0810</Index>
+    <Description>SM2 Start</Description>
+  </Register>
+  <Register sm="2">
+    <Index>0812</Index>
+    <Description>SM2 Length</Description>
+  </Register>
+  <Register sm="2">
+    <Index>0814</Index>
+    <Description>SM2 Ctrl/Status</Description>
+  </Register>
+  <Register sm="2">
+    <Index>0816</Index>
+    <Description>SM2 Enable</Description>
+  </Register>
+  <Register sm="3">
+    <Index>0818</Index>
+    <Description>SM3 Start</Description>
+  </Register>
+  <Register sm="3">
+    <Index>081a</Index>
+    <Description>SM3 Length</Description>
+  </Register>
+  <Register sm="3">
+    <Index>081c</Index>
+    <Description>SM3 Ctrl/Status</Description>
+  </Register>
+  <Register sm="3">
+    <Index>081e</Index>
+    <Description>SM3 Enable</Description>
+  </Register>
+  <Register sm="4">
+    <Index>0820</Index>
+    <Description>SM4 Start</Description>
+  </Register>
+  <Register sm="4">
+    <Index>0822</Index>
+    <Description>SM4 Length</Description>
+  </Register>
+  <Register sm="4">
+    <Index>0824</Index>
+    <Description>SM4 Ctrl/Status</Description>
+  </Register>
+  <Register sm="4">
+    <Index>0826</Index>
+    <Description>SM4 Enable</Description>
+  </Register>
+  <Register sm="5">
+    <Index>0828</Index>
+    <Description>SM5 Start</Description>
+  </Register>
+  <Register sm="5">
+    <Index>082a</Index>
+    <Description>SM5 Length</Description>
+  </Register>
+  <Register sm="5">
+    <Index>082c</Index>
+    <Description>SM5 Ctrl/Status</Description>
+  </Register>
+  <Register sm="5">
+    <Index>082e</Index>
+    <Description>SM5 Enable</Description>
+  </Register>
+  <Register sm="6">
+    <Index>0830</Index>
+    <Description>SM6 Start</Description>
+  </Register>
+  <Register sm="6">
+    <Index>0832</Index>
+    <Description>SM6 Length</Description>
+  </Register>
+  <Register sm="6">
+    <Index>0834</Index>
+    <Description>SM6 Ctrl/Status</Description>
+  </Register>
+  <Register sm="6">
+    <Index>0836</Index>
+    <Description>SM6 Enable</Description>
+  </Register>
+  <Register sm="7">
+    <Index>0838</Index>
+    <Description>SM7 Start</Description>
+  </Register>
+  <Register sm="7">
+    <Index>083a</Index>
+    <Description>SM7 Length</Description>
+  </Register>
+  <Register sm="7">
+    <Index>083c</Index>
+    <Description>SM7 Ctrl/Status</Description>
+  </Register>
+  <Register sm="7">
+    <Index>083e</Index>
+    <Description>SM7 Enable</Description>
+  </Register>
+  <Register sm="8">
+    <Index>0840</Index>
+    <Description>SM8 Start</Description>
+  </Register>
+  <Register sm="8">
+    <Index>0842</Index>
+    <Description>SM8 Length</Description>
+  </Register>
+  <Register sm="8">
+    <Index>0844</Index>
+    <Description>SM8 Ctrl/Status</Description>
+  </Register>
+  <Register sm="8">
+    <Index>0846</Index>
+    <Description>SM8 Enable</Description>
+  </Register>
+  <Register sm="9">
+    <Index>0848</Index>
+    <Description>SM9 Start</Description>
+  </Register>
+  <Register sm="9">
+    <Index>084a</Index>
+    <Description>SM9 Length</Description>
+  </Register>
+  <Register sm="9">
+    <Index>084c</Index>
+    <Description>SM9 Ctrl/Status</Description>
+  </Register>
+  <Register sm="9">
+    <Index>084e</Index>
+    <Description>SM9 Enable</Description>
+  </Register>
+  <Register sm="10">
+    <Index>0850</Index>
+    <Description>SM10 Start</Description>
+  </Register>
+  <Register sm="10">
+    <Index>0852</Index>
+    <Description>SM10 Length</Description>
+  </Register>
+  <Register sm="10">
+    <Index>0854</Index>
+    <Description>SM10 Ctrl/Status</Description>
+  </Register>
+  <Register sm="10">
+    <Index>0856</Index>
+    <Description>SM10 Enable</Description>
+  </Register>
+  <Register sm="11">
+    <Index>0858</Index>
+    <Description>SM11 Start</Description>
+  </Register>
+  <Register sm="11">
+    <Index>085a</Index>
+    <Description>SM11 Length</Description>
+  </Register>
+  <Register sm="11">
+    <Index>085c</Index>
+    <Description>SM11 Ctrl/Status</Description>
+  </Register>
+  <Register sm="11">
+    <Index>085e</Index>
+    <Description>SM11 Enable</Description>
+  </Register>
+  <Register sm="12">
+    <Index>0860</Index>
+    <Description>SM12 Start</Description>
+  </Register>
+  <Register sm="12">
+    <Index>0862</Index>
+    <Description>SM12 Length</Description>
+  </Register>
+  <Register sm="12">
+    <Index>0864</Index>
+    <Description>SM12 Ctrl/Status</Description>
+  </Register>
+  <Register sm="12">
+    <Index>0866</Index>
+    <Description>SM12 Enable</Description>
+  </Register>
+  <Register sm="13">
+    <Index>0868</Index>
+    <Description>SM13 Start</Description>
+  </Register>
+  <Register sm="13">
+    <Index>086a</Index>
+    <Description>SM13 Length</Description>
+  </Register>
+  <Register sm="13">
+    <Index>086c</Index>
+    <Description>SM13 Ctrl/Status</Description>
+  </Register>
+  <Register sm="13">
+    <Index>086e</Index>
+    <Description>SM13 Enable</Description>
+  </Register>
+  <Register sm="14">
+    <Index>0870</Index>
+    <Description>SM14 Start</Description>
+  </Register>
+  <Register sm="14">
+    <Index>0872</Index>
+    <Description>SM14 Length</Description>
+  </Register>
+  <Register sm="14">
+    <Index>0874</Index>
+    <Description>SM14 Ctrl/Status</Description>
+  </Register>
+  <Register sm="14">
+    <Index>0876</Index>
+    <Description>SM14 Enable</Description>
+  </Register>
+  <Register sm="15">
+    <Index>0878</Index>
+    <Description>SM15 Start</Description>
+  </Register>
+  <Register sm="15">
+    <Index>087a</Index>
+    <Description>SM15 Length</Description>
+  </Register>
+  <Register sm="15">
+    <Index>087c</Index>
+    <Description>SM15 Ctrl/Status</Description>
+  </Register>
+  <Register sm="15">
+    <Index>087e</Index>
+    <Description>SM15 Enable</Description>
+  </Register>
+  <!--DC - Receive Times-->
+  <Register>
+    <Index>0900</Index>
+    <Description>DC RecvTimeL_A</Description>
+  </Register>
+  <Register>
+    <Index>0902</Index>
+    <Description>DC RecvTimeH_A</Description>
+  </Register>
+  <Register>
+    <Index>0904</Index>
+    <Description>DC RecvTimeL_B</Description>
+  </Register>
+  <Register>
+    <Index>0906</Index>
+    <Description>DC RecvTimeH_B</Description>
+  </Register>
+  <Register>
+    <Index>0908</Index>
+    <Description>DC RecvTimeL_C</Description>
+  </Register>
+  <Register>
+    <Index>090a</Index>
+    <Description>DC RecvTimeH_C</Description>
+  </Register>
+  <Register>
+    <Index>090c</Index>
+    <Description>DC RecvTimeL_D</Description>
+  </Register>
+  <Register>
+    <Index>090e</Index>
+    <Description>DC RecvTimeH_D</Description>
+  </Register>
+  <!--DC - Time Loop Control Unit-->
+  <Register>
+    <Index>0910</Index>
+    <Description>DC SysTimeLL</Description>
+  </Register>
+  <Register>
+    <Index>0912</Index>
+    <Description>DC SysTimeLH</Description>
+  </Register>
+  <Register>
+    <Index>0914</Index>
+    <Description>DC SysTimeHL</Description>
+  </Register>
+  <Register>
+    <Index>0916</Index>
+    <Description>DC SysTimeHH</Description>
+  </Register>
+  <Register>
+    <Index>0918</Index>
+    <Description>DC RecvTimeLL_A</Description>
+  </Register>
+  <Register>
+    <Index>091a</Index>
+    <Description>DC RecvTimeLH_A</Description>
+  </Register>
+  <Register>
+    <Index>091c</Index>
+    <Description>DC RecvTimeHL_A</Description>
+  </Register>
+  <Register>
+    <Index>091e</Index>
+    <Description>DC RecvTimeHH_A</Description>
+  </Register>
+  <Register>
+    <Index>0920</Index>
+    <Description>DC SysTimeOffsLL</Description>
+  </Register>
+  <Register>
+    <Index>0922</Index>
+    <Description>DC SysTimeOffsLH</Description>
+  </Register>
+  <Register>
+    <Index>0924</Index>
+    <Description>DC SysTimeOffsHL</Description>
+  </Register>
+  <Register>
+    <Index>0926</Index>
+    <Description>DC SysTimeOffsHH
+</Description>
+  </Register>
+  <Register>
+    <Index>0928</Index>
+    <Description>DC SysTimeDelayL</Description>
+  </Register>
+  <Register>
+    <Index>092a</Index>
+    <Description>DC SysTimeDelayH</Description>
+  </Register>
+  <Register>
+    <Index>092c</Index>
+    <Description>DC CtrlErrorL</Description>
+  </Register>
+  <Register>
+    <Index>092e</Index>
+    <Description>DC CtrlErrorH</Description>
+  </Register>
+  <Register>
+    <Index>0930</Index>
+    <Description>DC SpeedStart</Description>
+  </Register>
+  <Register>
+    <Index>0932</Index>
+    <Description>DC SpeedDiff</Description>
+  </Register>
+  <Register>
+    <Index>0934</Index>
+    <Description>DC FiltExp</Description>
+    <Details>
+      <Detail>
+        <Range>0-7</Range>
+        <Description>System time diff</Description>
+      </Detail>
+      <Detail>
+        <Range>8-15</Range>
+        <Description>Speed counter</Description>
+      </Detail>
+    </Details>
+  </Register>
+  <Register esc="02">
+    <Index>0936</Index>
+    <Description>Receive Time Latch Mode</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Receive Time Latch Mode</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Forwarding mode</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Reverse mode</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register esc="12">
+    <Index>0936</Index>
+    <Description>Receive Time Latch Mode</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Receive Time Latch Mode</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Forwarding mode</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Reverse mode</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <!--DC - Cyclic Unit Control / SYNC Out Unit-->
+  <Register>
+    <Index>0980</Index>
+    <Description>DC Assign/Active</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Write access cyclic</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>ECAT</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>PDI</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>Write access Latch 0</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>ECAT</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>PDI</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>Write access Latch 1</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>ECAT</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>PDI</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>Sync out unit activation</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Deactivated</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Activated</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>Generate SYNC 0</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>Generate SYNC 1</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>Auto activation</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>Start time extension 32-&gt;64</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>Start time check</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14</Range>
+        <Description>Half range</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>15</Range>
+        <Description>Debuspulse</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0982</Index>
+    <Description>DC CycImpulse</Description>
+  </Register>
+  <Register>
+    <Index>0984</Index>
+    <Description>DC Activation Status</Description>
+    <Details>
+      <Detail esc="04">
+        <Range>0</Range>
+        <Description>SYNC0 pending</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail esc="04">
+        <Range>1</Range>
+        <Description>SYNC1 pending</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail esc="04">
+        <Range>2</Range>
+        <Description>Start Time</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Within near future</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Out of near future</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>098e</Index>
+    <Description>DC CycSync State</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>SYNC 0 triggered</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>SYNC 1 triggered</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>0990</Index>
+    <Description>DC StartTime0 LL</Description>
+  </Register>
+  <Register>
+    <Index>0992</Index>
+    <Description>DC StartTime0 LH</Description>
+  </Register>
+  <Register>
+    <Index>0994</Index>
+    <Description>DC StartTime0 HL</Description>
+  </Register>
+  <Register>
+    <Index>0996</Index>
+    <Description>DC StartTime0 HH</Description>
+  </Register>
+  <Register>
+    <Index>0998</Index>
+    <Description>DC StartTime1 LL</Description>
+  </Register>
+  <Register>
+    <Index>099a</Index>
+    <Description>DC StartTime1 LH</Description>
+  </Register>
+  <Register>
+    <Index>099c</Index>
+    <Description>DC StartTime1 HL</Description>
+  </Register>
+  <Register>
+    <Index>099e</Index>
+    <Description>DC StartTime1 HH</Description>
+  </Register>
+  <Register>
+    <Index>09a0</Index>
+    <Description>DC CycTime0 L</Description>
+  </Register>
+  <Register>
+    <Index>09a2</Index>
+    <Description>DC CycTime0 H</Description>
+  </Register>
+  <Register>
+    <Index>09a4</Index>
+    <Description>DC CycTime1 L</Description>
+  </Register>
+  <Register>
+    <Index>09a6</Index>
+    <Description>DC CycTime1 H</Description>
+  </Register>
+  <!--DC - Latch In Unit-->
+  <Register>
+    <Index>09a8</Index>
+    <Description>DC Latch Ctrl</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Latch 0 pos</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Continuous</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Single event</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>Latch 0 neg</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Continuous</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Single event</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>Latch 1 pos</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Continuous</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Single event</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>Latch 1 neg</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Continuous</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Single event</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>09ae</Index>
+    <Description>DC Latch Status</Description>
+    <Details>
+      <Detail>
+        <Range>0</Range>
+        <Description>Event Latch 0 pos</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>1</Range>
+        <Description>Event Latch 0 neg</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>Latch 0 pin state</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8</Range>
+        <Description>Event Latch 1 pos</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>9</Range>
+        <Description>Event Latch 1 neg</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>Latch 1 pin state</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>FALSE</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>TRUE</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register>
+    <Index>09b0</Index>
+    <Description>DC Latch0 Pos LL</Description>
+  </Register>
+  <Register>
+    <Index>09b2</Index>
+    <Description>DC Latch0 Pos LH</Description>
+  </Register>
+  <Register>
+    <Index>09b4</Index>
+    <Description>DC Latch0 Pos HL</Description>
+  </Register>
+  <Register>
+    <Index>09b6</Index>
+    <Description>DC Latch0 Pos HH</Description>
+  </Register>
+  <Register>
+    <Index>09b8</Index>
+    <Description>DC Latch0 Neg LL</Description>
+  </Register>
+  <Register>
+    <Index>09ba</Index>
+    <Description>DC Latch0 Neg LH</Description>
+  </Register>
+  <Register>
+    <Index>09bc</Index>
+    <Description>DC Latch0 Neg HL</Description>
+  </Register>
+  <Register>
+    <Index>09be</Index>
+    <Description>DC Latch0 Neg HH</Description>
+  </Register>
+  <Register>
+    <Index>09c0</Index>
+    <Description>DC Latch1 Pos LL</Description>
+  </Register>
+  <Register>
+    <Index>09c2</Index>
+    <Description>DC Latch1 Pos LH</Description>
+  </Register>
+  <Register>
+    <Index>09c4</Index>
+    <Description>DC Latch1 Pos HL</Description>
+  </Register>
+  <Register>
+    <Index>09c6</Index>
+    <Description>DC Latch1 Pos HH</Description>
+  </Register>
+  <Register>
+    <Index>09c8</Index>
+    <Description>DC Latch1 Neg LL</Description>
+  </Register>
+  <Register>
+    <Index>09ca</Index>
+    <Description>DC Latch1 Neg LH</Description>
+  </Register>
+  <Register>
+    <Index>09cc</Index>
+    <Description>DC Latch1 Neg HL</Description>
+  </Register>
+  <Register>
+    <Index>09ce</Index>
+    <Description>DC Latch1 Neg HH</Description>
+  </Register>
+  <!--DC - SyncManager Event Times-->
+  <Register>
+    <Index>09f0</Index>
+    <Description>DC RecvSMChange L</Description>
+  </Register>
+  <Register>
+    <Index>09f2</Index>
+    <Description>DC RecvSMChange H</Description>
+  </Register>
+  <Register>
+    <Index>09f8</Index>
+    <Description>DC PDISMStart L</Description>
+  </Register>
+  <Register>
+    <Index>09fa</Index>
+    <Description>DC PDISMStart H</Description>
+  </Register>
+  <Register>
+    <Index>09fc</Index>
+    <Description>DC PDISMChange L</Description>
+  </Register>
+  <Register>
+    <Index>09fe</Index>
+    <Description>DC PDISMChange H</Description>
+  </Register>
+  <!--ESC specific-->
+  <Register esc="04">
+    <Index>0e00</Index>
+    <Description>Product ID</Description>
+  </Register>
+  <Register esc="04">
+    <Index>0e02</Index>
+    <Description>Product ID</Description>
+  </Register>
+  <Register esc="04">
+    <Index>0e04</Index>
+    <Description>Product ID
+</Description>
+  </Register>
+  <Register esc="04">
+    <Index>0e06</Index>
+    <Description>Product ID</Description>
+  </Register>
+  <Register esc="04">
+    <Index>0e08</Index>
+    <Description>Vendor ID
+</Description>
+  </Register>
+  <Register esc="04">
+    <Index>0e0a</Index>
+    <Description>Vendor ID</Description>
+  </Register>
+  <Register esc="04">
+    <Index>0e0c</Index>
+    <Description>Vendor ID</Description>
+  </Register>
+  <Register esc="04">
+    <Index>0e0e</Index>
+    <Description>Vendor ID</Description>
+  </Register>
+  <Register esc="11">
+    <Index>0e00</Index>
+    <Description>Power On</Description>
+    <Details>
+      <Detail>
+        <Range>0-1</Range>
+        <Description>Port mode</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Port 0, 1</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>Port 0, 1, 2</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Port 0, 1, 3</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Port 0, 1, 2, 3</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2</Range>
+        <Description>Logical port 0</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>EBUS</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>MII</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>3</Range>
+        <Description>Logical port 1</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>EBUS</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>MII</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4</Range>
+        <Description>Logical port 2</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>EBUS</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>MII</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>5</Range>
+        <Description>Logical port 3</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>EBUS</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>MII</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>6-7</Range>
+        <Description>CPU clock output</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Off - PDI[7] available as PDI port</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>PDI[7]=25MHz</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>PDI[7]=20MHz</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>PDI[7]=10MHz</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>8-9</Range>
+        <Description>TX signal shift</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>MII TX shifted 0</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>MII TX shifted 90</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>MII TX shifted 180</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>MII TX shifted 270</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>10</Range>
+        <Description>Clock 25 output</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>11</Range>
+        <Description>Transparent mode MII</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>12</Range>
+        <Description>Digital Ctrl/Status move</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>PDI[39:32]</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>the highest available PDI Byte</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>13</Range>
+        <Description>Phy offset</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>No offset</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>16 offset</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>14</Range>
+        <Description>Phy link polarity</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Active low</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Active high</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <Register esc="12">
+    <Index>0e00</Index>
+    <Description>Power On</Description>
+    <Details>
+      <Detail>
+        <Range>0-1</Range>
+        <Description>Chip mode</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Port0:EBUS, Port1:EBUS, 18bit PDI</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>Port0:MII, Port1:EBUS, 8bit PDI</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>Port0:EBUS, Port1:MII, 8bit PDI</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>2-3</Range>
+        <Description>CPU clock output</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>Off - PDI[7] available as PDI port</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>PDI[7]=25MHz</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>PDI[7]=20MHz</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>PDI[7]=10MHz</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>4-5</Range>
+        <Description>TX signal shift</Description>
+        <Enum>
+          <item>
+            <value>00</value>
+            <Description>MII TX signals shifted by 0</Description>
+          </item>
+          <item>
+            <value>01</value>
+            <Description>MII TX signals shifted by 90</Description>
+          </item>
+          <item>
+            <value>10</value>
+            <Description>MII TX signals shifted by 180</Description>
+          </item>
+          <item>
+            <value>11</value>
+            <Description>MII TX signals shifted by 270</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>6</Range>
+        <Description>CLK25 Output Enable</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>Disabled</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>Enabled</Description>
+          </item>
+        </Enum>
+      </Detail>
+      <Detail>
+        <Range>7</Range>
+        <Description>Phy address offset</Description>
+        <Enum>
+          <item>
+            <value>0</value>
+            <Description>No offset</Description>
+          </item>
+          <item>
+            <value>1</value>
+            <Description>16 offset</Description>
+          </item>
+        </Enum>
+      </Detail>
+    </Details>
+  </Register>
+  <!--ESC specific I/O-->
+  <Register>
+    <Index>0f00</Index>
+    <Description>Digital Out L</Description>
+  </Register>
+  <Register>
+    <Index>0f02</Index>
+    <Description>Digital Out H</Description>
+  </Register>
+  <Register>
+    <Index>0f10</Index>
+    <Description>GPO LL</Description>
+  </Register>
+  <Register>
+    <Index>0f12</Index>
+    <Description>GPO LH</Description>
+  </Register>
+  <Register>
+    <Index>0f14</Index>
+    <Description>GPO HL</Description>
+  </Register>
+  <Register>
+    <Index>0f16</Index>
+    <Description>GPO HH</Description>
+  </Register>
+  <Register>
+    <Index>0f18</Index>
+    <Description>GPI LL</Description>
+  </Register>
+  <Register>
+    <Index>0f1a</Index>
+    <Description>GPI LH</Description>
+  </Register>
+  <Register>
+    <Index>0f1c</Index>
+    <Description>GPI HL</Description>
+  </Register>
+  <Register>
+    <Index>0f1e</Index>
+    <Description>GPI HH</Description>
+  </Register>
+  <!--User RAM-->
+  <Register>
+    <Index>0f80</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f82</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f84</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f86</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f88</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f8a</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f8c</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f8e</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f90</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f92</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f94</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f96</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f98</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f9a</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f9c</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0f9e</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fa0</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fa2</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fa4</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fa6</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fa8</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0faa</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fac</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fae</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fb0</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fb2</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fb4</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fb6</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fb8</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fba</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fbc</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fbe</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fc0</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fc2</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fc4</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fc6</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fc8</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fca</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fcc</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fce</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fd0</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fd2</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fd4</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fd6</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fd8</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fda</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fdc</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fde</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fe0</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fe2</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fe4</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fe6</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fe8</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fea</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fec</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0fee</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0ff0</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0ff2</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0ff4</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0ff6</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0ff8</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0ffa</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0ffc</Index>
+    <Description>User Ram</Description>
+  </Register>
+  <Register>
+    <Index>0ffe</Index>
+    <Description>User Ram</Description>
+  </Register>
+</RegisterInfo>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/etherlab/runtime_etherlab.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,121 @@
+from __future__ import absolute_import
+import os
+import signal
+import subprocess
+import ctypes
+from threading import Thread
+import time
+import re
+
+import runtime.PLCObject as PLCObject
+from runtime.loglevels import LogLevelsDict
+
+SDOAnswered = PLCBinary.SDOAnswered
+SDOAnswered.restype = None
+SDOAnswered.argtypes = []
+
+SDOThread = None
+SDOProc = None
+Result = None
+
+
+def SDOThreadProc(*params):
+    global Result, SDOProc
+    if params[0] == "upload":
+        cmdfmt = "ethercat upload -p %d -t %s 0x%.4x 0x%.2x"
+    else:
+        cmdfmt = "ethercat download -p %d -t %s 0x%.4x 0x%.2x %s"
+
+    command = cmdfmt % params[1:]
+    SDOProc = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
+    res = SDOProc.wait()
+    output = SDOProc.communicate()[0]
+
+    if params[0] == "upload":
+        Result = None
+        if res == 0:
+            if params[2] in ["float", "double"]:
+                Result = float(output)
+            elif params[2] in ["string", "octet_string", "unicode_string"]:
+                Result = output
+            else:
+                hex_value, dec_value = output.split()
+                if int(hex_value, 16) == int(dec_value):
+                    Result = int(dec_value)
+    else:
+        Result = res == 0
+
+    SDOAnswered()
+    if res != 0:
+        PLCObject.LogMessage(
+            LogLevelsDict["WARNING"],
+            "%s : %s" % (command, output))
+
+
+def EthercatSDOUpload(pos, index, subindex, var_type):
+    global SDOThread
+    SDOThread = Thread(target=SDOThreadProc, args=["upload", pos, var_type, index, subindex])
+    SDOThread.start()
+
+
+def EthercatSDODownload(pos, index, subindex, var_type, value):
+    global SDOThread
+    SDOThread = Thread(target=SDOThreadProc, args=["download", pos, var_type, index, subindex, value])
+    SDOThread.start()
+
+
+def GetResult():
+    return Result
+
+
+KMSGPollThread = None
+StopKMSGThread = False
+
+
+def KMSGPollThreadProc():
+    """
+    Logs Kernel messages starting with EtherCAT
+    Uses GLibc wrapper to Linux syscall "klogctl"
+    Last 4 KB are polled, and lines compared to last
+    captured line to detect new lines
+    """
+    libc = ctypes.CDLL("libc.so.6")
+    klog = libc.klogctl
+    klog.argtypes = [ctypes.c_int, ctypes.c_char_p, ctypes.c_int]
+    klog.restype = ctypes.c_int
+    s = ctypes.create_string_buffer(4*1024)
+    last = None
+    while not StopKMSGThread:
+        bytes_to_read = klog(3, s, len(s)-1)
+        log = s.value[:bytes_to_read-1]
+        if last:
+            log = log.rpartition(last)[2]
+        if log:
+            last = log.rpartition('\n')[2]
+            for lvl, msg in re.findall(
+                    r'<(\d)>\[\s*\d*\.\d*\]\s*(EtherCAT\s*.*)$',
+                    log, re.MULTILINE):
+                PLCObject.LogMessage(
+                    LogLevelsDict[{
+                        "4": "WARNING",
+                        "3": "CRITICAL"}.get(lvl, "DEBUG")],
+                    msg)
+        time.sleep(0.5)
+
+
+def _runtime_etherlab_init():
+    global KMSGPollThread, StopKMSGThread
+    StopKMSGThread = False
+    KMSGPollThread = Thread(target=KMSGPollThreadProc)
+    KMSGPollThread.start()
+
+
+def _runtime_etherlab_cleanup():
+    global KMSGPollThread, StopKMSGThread, SDOThread
+    try:
+        os.kill(SDOProc.pid, signal.SIGTERM)
+    except Exception:
+        pass
+    SDOThread = None
+    StopKMSGThread = True
+    KMSGPollThread = None
--- a/features.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/features.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,34 +1,23 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+# This file is part of Beremiz
 #
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2007: Laurent BESSARD
+# Copyright (C) 2007-2018: Edouard TISSERANT
 #
 # See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 libraries = [
-    ('Native', 'NativeLib.NativeLibrary'),
-    ('Python', 'py_ext.PythonLibrary'),
-    ('SVGUI', 'svgui.SVGUILibrary')]
+    ('Native', 'NativeLib.NativeLibrary', True),
+    ('Python', 'py_ext.PythonLibrary', True),
+    ('Etherlab', 'etherlab.EthercatMaster.EtherlabLibrary', False),
+    ('SVGUI', 'svgui.SVGUILibrary', False)]
 
 catalog = [
     ('canfestival', _('CANopen support'), _('Map located variables over CANopen'), 'canfestival.canfestival.RootClass'),
+    ('bacnet', _('Bacnet support'), _('Map located variables over Bacnet'), 'bacnet.bacnet.RootClass'),
+    ('etherlab', _('EtherCAT master'), _('Map located variables over EtherCAT'), 'etherlab.etherlab.RootClass'),
     ('modbus', _('Modbus support'), _('Map located variables over Modbus'), 'modbus.modbus.RootClass'),
     ('c_ext', _('C extension'), _('Add C code accessing located variables synchronously'), 'c_ext.CFile'),
     ('py_ext', _('Python file'), _('Add Python code executed asynchronously'), 'py_ext.PythonFile'),
--- a/graphics/DebugDataConsumer.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/graphics/DebugDataConsumer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,11 +22,15 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
 import datetime
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                        Date and Time conversion function
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 SECOND = 1000000      # Number of microseconds in one second
 MINUTE = 60 * SECOND  # Number of microseconds in one minute
@@ -36,6 +40,7 @@
 # Date corresponding to Epoch (1970 January the first)
 DATE_ORIGIN = datetime.datetime(1970, 1, 1)
 
+
 def get_microseconds(value):
     """
     Function converting time duration expressed in day, second and microseconds
@@ -43,10 +48,10 @@
     @param value: Time duration to convert
     @return: Time duration expressed in microsecond
     """
-    return float(value.days * DAY + \
-                 value.seconds * SECOND + \
+    return float(value.days * DAY +
+                 value.seconds * SECOND +
                  value.microseconds)
-    return 
+
 
 def generate_time(value):
     """
@@ -56,40 +61,41 @@
     @return: IEC 61131 TIME literal
     """
     microseconds = get_microseconds(value)
-    
+
     # Get absolute microseconds value and save if it was negative
     negative = microseconds < 0
     microseconds = abs(microseconds)
-    
+
     # TIME literal prefix
     data = "T#"
     if negative:
         data += "-"
-    
+
     # In TIME literal format, it isn't mandatory to indicate null values
     # if no greater non-null values are available. This variable is used to
     # inhibit formatting until a non-null value is found
     not_null = False
-    
+
     for val, format in [
-            (int(microseconds) / DAY, "%dd"),                # Days
-            ((int(microseconds) % DAY) / HOUR, "%dh"),       # Hours
-            ((int(microseconds) % HOUR) / MINUTE, "%dm"),    # Minutes
-            ((int(microseconds) % MINUTE) / SECOND, "%ds")]: # Seconds
-        
-        # Add value to TIME literal if value is non-null or another non-null 
+            (int(microseconds) // DAY, "%dd"),                 # Days
+            ((int(microseconds) % DAY) // HOUR, "%dh"),        # Hours
+            ((int(microseconds) % HOUR) // MINUTE, "%dm"),     # Minutes
+            ((int(microseconds) % MINUTE) // SECOND, "%ds")]:  # Seconds
+
+        # Add value to TIME literal if value is non-null or another non-null
         # value have already be found
         if val > 0 or not_null:
             data += format % val
-            
+
             # Update non-null variable
             not_null = True
-    
-    # In any case microseconds have to be added to TIME literal 
+
+    # In any case microseconds have to be added to TIME literal
     data += "%gms" % (microseconds % SECOND / 1000.)
-    
+
     return data
 
+
 def generate_date(value):
     """
     Function converting time duration expressed in day, second and microseconds
@@ -99,6 +105,7 @@
     """
     return (DATE_ORIGIN + value).strftime("DATE#%Y-%m-%d")
 
+
 def generate_datetime(value):
     """
     Function converting time duration expressed in day, second and microseconds
@@ -108,6 +115,7 @@
     """
     return (DATE_ORIGIN + value).strftime("DT#%Y-%m-%d-%H:%M:%S.%f")
 
+
 def generate_timeofday(value):
     """
     Function converting time duration expressed in day, second and microseconds
@@ -116,22 +124,23 @@
     @return: IEC 61131 TIME_OF_DAY literal
     """
     microseconds = get_microseconds(value)
-    
+
     # TIME_OF_DAY literal prefix
     data = "TOD#"
-    
+
     for val, format in [
-            (int(microseconds) / HOUR, "%2.2d:"),               # Hours
-            ((int(microseconds) % HOUR) / MINUTE, "%2.2d:"),    # Minutes
-            ((int(microseconds) % MINUTE) / SECOND, "%2.2d."),  # Seconds
+            (int(microseconds) // HOUR, "%2.2d:"),               # Hours
+            ((int(microseconds) % HOUR) // MINUTE, "%2.2d:"),    # Minutes
+            ((int(microseconds) % MINUTE) // SECOND, "%2.2d."),  # Seconds
             (microseconds % SECOND, "%6.6d")]:                  # Microseconds
-        
+
         # Add value to TIME_OF_DAY literal
         data += format % val
-    
+
     return data
 
-# Dictionary of translation functions from value send by debugger to IEC 
+
+# Dictionary of translation functions from value send by debugger to IEC
 # literal stored by type
 TYPE_TRANSLATOR = {
     "TIME": generate_time,
@@ -143,18 +152,19 @@
     "REAL": lambda v: "%.6g" % v,
     "LREAL": lambda v: "%.6g" % v}
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                            Debug Data Consumer Class
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements an element that consumes debug values
-Value update can be inhibited during the time the associated Debug Viewer is
-refreshing
-"""
-
-class DebugDataConsumer:
-    
+# -------------------------------------------------------------------------------
+
+
+class DebugDataConsumer(object):
+    """
+    Class that implements an element that consumes debug values
+    Value update can be inhibited during the time the associated Debug Viewer is
+    refreshing
+    """
+
     def __init__(self):
         """
         Constructor
@@ -162,17 +172,17 @@
         # Debug value and forced flag
         self.Value = None
         self.Forced = False
-        
+
         # Store debug value and forced flag when value update is inhibited
         self.LastValue = None
         self.LastForced = False
-        
+
         # Value IEC data type
         self.DataType = None
-        
+
         # Flag that value update is inhibited
         self.Inhibited = False
-    
+
     def Inhibit(self, inhibit):
         """
         Set flag to inhibit or activate value update
@@ -180,23 +190,23 @@
         """
         # Save inhibit flag
         self.Inhibited = inhibit
-        
+
         # When reactivated update value and forced flag with stored values
         if not inhibit and self.LastValue is not None:
             self.SetForced(self.LastForced)
             self.SetValue(self.LastValue)
-            
+
             # Reset stored values
             self.LastValue = None
             self.LastForced = False
-    
+
     def SetDataType(self, data_type):
         """
         Set value IEC data type
         @param data_type: Value IEC data type
         """
         self.DataType = data_type
-    
+
     def NewValues(self, tick, values, raw="BOOL"):
         """
         Function called by debug thread when a new debug value is available
@@ -206,21 +216,21 @@
         @param raw: Data type of values not translated (default: 'BOOL')
         """
         value, forced = values
-        
+
         # Translate value to IEC literal
         if self.DataType != raw:
             value = TYPE_TRANSLATOR.get(self.DataType, str)(value)
-        
+
         # Store value and forced flag when value update is inhibited
         if self.Inhibited:
             self.LastValue = value
             self.LastForced = forced
-        
+
         # Update value and forced flag in any other case
         else:
             self.SetForced(forced)
             self.SetValue(value)
-    
+
     def SetValue(self, value):
         """
         Update value.
@@ -228,14 +238,14 @@
         @param value: New value
         """
         self.Value = value
-    
+
     def GetValue(self):
         """
         Return current value
         @return: Current value
         """
         return self.Value
-    
+
     def SetForced(self, forced):
         """
         Update Forced flag.
@@ -243,7 +253,7 @@
         @param forced: New forced flag
         """
         self.Forced = forced
-    
+
     def IsForced(self):
         """
         Indicate if current value is forced
--- a/graphics/FBD_Objects.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/graphics/FBD_Objects.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,26 +22,32 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
 import wx
+from six.moves import xrange
 
 from graphics.GraphicCommons import *
 from plcopen.structures import *
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                         Function Block Diagram Block
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements the graphic representation of a function block
-"""
+# -------------------------------------------------------------------------------
+
 
 def TestConnectorName(name, block_type):
     return name in ["OUT", "MN", "MX"] or name.startswith("IN") and (block_type, name) != ("EXPT", "IN2")
 
+
 class FBD_Block(Graphic_Element):
-    
+    """
+    Class that implements the graphic representation of a function block
+    """
+
     # Create a new block
-    def __init__(self, parent, type, name, id = None, extension = 0, inputs = None, connectors = {}, executionControl = False, executionOrder = 0):
+    def __init__(self, parent, type, name, id=None, extension=0, inputs=None, connectors=None, executionControl=False, executionOrder=0):
         Graphic_Element.__init__(self, parent)
         self.Type = None
         self.Description = None
@@ -56,9 +62,9 @@
         self.Pen = MiterPen(wx.BLACK)
         self.SetType(type, extension, inputs, connectors, executionControl)
         self.Highlights = {}
-    
+
     # Make a clone of this FBD_Block
-    def Clone(self, parent, id = None, name = "", pos = None):
+    def Clone(self, parent, id=None, name="", pos=None):
         if self.Name != "" and name == "":
             name = self.Name
         block = FBD_Block(parent, self.Type, name, id, self.Extension)
@@ -70,10 +76,10 @@
         block.Inputs = [input.Clone(block) for input in self.Inputs]
         block.Outputs = [output.Clone(block) for output in self.Outputs]
         return block
-    
+
     def GetConnectorTranslation(self, element):
         return dict(zip(self.Inputs + self.Outputs, element.Inputs + element.Outputs))
-    
+
     def Flush(self):
         for input in self.Inputs:
             input.Flush()
@@ -81,9 +87,9 @@
         for output in self.Outputs:
             output.Flush()
         self.Outputs = []
-    
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         rect = Graphic_Element.GetRedrawRect(self, movex, movey)
         if movex != 0 or movey != 0:
             for input in self.Inputs:
@@ -93,26 +99,26 @@
                 if output.IsConnected():
                     rect = rect.Union(output.GetConnectedRedrawRect(movex, movey))
         return rect
-    
+
     # Delete this block by calling the appropriate method
     def Delete(self):
         self.Parent.DeleteBlock(self)
-    
+
     # Unconnect all inputs and outputs
     def Clean(self):
         for input in self.Inputs:
-            input.UnConnect(delete = True)
+            input.UnConnect(delete=True)
         for output in self.Outputs:
-            output.UnConnect(delete = True)
-    
+            output.UnConnect(delete=True)
+
     # Refresh the size of text for name
     def RefreshNameSize(self):
         self.NameSize = self.Parent.GetTextExtent(self.Name)
-    
+
     # Refresh the size of text for execution order
     def RefreshExecutionOrderSize(self):
         self.ExecutionOrderSize = self.Parent.GetTextExtent(str(self.ExecutionOrder))
-    
+
     # Returns if the point given is in the bounding box
     def HitTest(self, pt, connectors=True):
         if self.Name != "":
@@ -121,16 +127,16 @@
             test_text = False
         test_block = self.GetBlockBoundingBox(connectors).InsideXY(pt.x, pt.y)
         return test_text or test_block
-    
+
     # Returns the bounding box of the name outside the block
     def GetTextBoundingBox(self):
         # Calculate the size of the name outside the block
         text_width, text_height = self.NameSize
-        return wx.Rect(self.Pos.x + (self.Size[0] - text_width) / 2,
+        return wx.Rect(self.Pos.x + (self.Size[0] - text_width) // 2,
                        self.Pos.y - (text_height + 2),
                        text_width,
                        text_height)
-    
+
     # Returns the bounding box of function block without name outside
     def GetBlockBoundingBox(self, connectors=True):
         bbx_x, bbx_y = self.Pos.x, self.Pos.y
@@ -143,22 +149,22 @@
             bbx_width = max(bbx_width, bbx_width + self.Pos.x + self.ExecutionOrderSize[0] - bbx_x - self.Size[0])
             bbx_height = bbx_height + (self.ExecutionOrderSize[1] + 2)
         return wx.Rect(bbx_x, bbx_y, bbx_width + 1, bbx_height + 1)
-    
+
     # Refresh the block bounding box
     def RefreshBoundingBox(self):
         self.BoundingBox = self.GetBlockBoundingBox()
         if self.Name != "":
             self.BoundingBox.Union(self.GetTextBoundingBox())
-    
+
     # Refresh the positions of the block connectors
     def RefreshConnectors(self):
         scaling = self.Parent.GetScaling()
         # Calculate the size for the connector lines
         lines = max(len(self.Inputs), len(self.Outputs))
         if lines > 0:
-            linesize = max((self.Size[1] - BLOCK_LINE_SIZE) / lines, BLOCK_LINE_SIZE)
+            linesize = max((self.Size[1] - BLOCK_LINE_SIZE) // lines, BLOCK_LINE_SIZE)
             # Update inputs and outputs positions
-            position = BLOCK_LINE_SIZE + linesize / 2
+            position = BLOCK_LINE_SIZE + linesize // 2
             for i in xrange(lines):
                 if scaling is not None:
                     ypos = round_scaling(self.Pos.y + position, scaling[1]) - self.Pos.y
@@ -170,16 +176,16 @@
                     self.Outputs[i].SetPosition(wx.Point(self.Size[0], ypos))
                 position += linesize
         self.RefreshConnected()
-    
+
     # Refresh the positions of wires connected to inputs and outputs
-    def RefreshConnected(self, exclude = []):
+    def RefreshConnected(self, exclude=None):
         for input in self.Inputs:
             input.MoveConnected(exclude)
         for output in self.Outputs:
             output.MoveConnected(exclude)
-    
-    # Returns the block connector that starts with the point given if it exists 
-    def GetConnector(self, position, output_name = None, input_name = None):
+
+    # Returns the block connector that starts with the point given if it exists
+    def GetConnector(self, position, output_name=None, input_name=None):
         if input_name is not None:
             # Test each input connector
             for input in self.Inputs:
@@ -193,14 +199,14 @@
         if input_name is None and output_name is None:
             return self.FindNearestConnector(position, self.Inputs + self.Outputs)
         return None
-        
+
     def GetInputTypes(self):
         return tuple([input.GetType(True) for input in self.Inputs if input.GetName() != "EN"])
-    
+
     def SetOutputValues(self, values):
         for output in self.Outputs:
-            output.SetValue(values.get(ouput.getName(), None))
-    
+            output.SetValue(values.get(output.getName(), None))
+
     def GetConnectionResultType(self, connector, connectortype):
         if not TestConnectorName(connector.GetName(), self.Type):
             return connectortype
@@ -216,13 +222,13 @@
                 if resulttype is None or outputtype is not None and self.IsOfType(outputtype, resulttype):
                     resulttype = outputtype
         return resulttype
-        
+
     # Returns all the block connectors
     def GetConnectors(self):
-        return {"inputs" : self.Inputs, "outputs" : self.Outputs}
-    
+        return {"inputs": self.Inputs, "outputs": self.Outputs}
+
     # Test if point given is on one of the block connectors
-    def TestConnector(self, pt, direction = None, exclude = True):
+    def TestConnector(self, pt, direction=None, exclude=True):
         # Test each input connector
         for input in self.Inputs:
             if input.TestPoint(pt, direction, exclude):
@@ -232,10 +238,10 @@
             if output.TestPoint(pt, direction, exclude):
                 return output
         return None
-    
+
     # Changes the block type
-    def SetType(self, type, extension, inputs = None, connectors = {}, executionControl = False):
-        if type != self.Type or self.Extension != extension or executionControl != self.ExecutionControl: 
+    def SetType(self, type, extension, inputs=None, connectors=None, executionControl=False):
+        if type != self.Type or self.Extension != extension or executionControl != self.ExecutionControl:
             if type != self.Type:
                 self.Type = type
                 self.TypeSize = self.Parent.GetTextExtent(self.Type)
@@ -250,25 +256,26 @@
                 outputs = [output for output in blocktype["outputs"]]
                 if blocktype["extensible"]:
                     start = int(inputs[-1][0].replace("IN", ""))
-                    for i in xrange(self.Extension - len(blocktype["inputs"])):
+                    for dummy in xrange(self.Extension - len(blocktype["inputs"])):
                         start += 1
-                        inputs.append(("IN%d"%start, inputs[-1][1], inputs[-1][2]))
+                        inputs.append(("IN%d" % start, inputs[-1][1], inputs[-1][2]))
                 comment = blocktype["comment"]
                 self.Description = _(comment) + blocktype.get("usage", "")
             else:
                 self.Colour = wx.RED
+                connectors = {} if connectors is None else connectors
                 inputs = connectors.get("inputs", [])
                 outputs = connectors.get("outputs", [])
                 self.Description = None
             if self.ExecutionControl:
-                inputs.insert(0, ("EN","BOOL","none"))
-                outputs.insert(0, ("ENO","BOOL","none"))
+                inputs.insert(0,  ("EN",   "BOOL", "none"))
+                outputs.insert(0, ("ENO",  "BOOL", "none"))
             self.Pen = MiterPen(self.Colour)
-            
+
             # Extract the inputs properties and create or modify the corresponding connector
             input_connectors = []
             for input_name, input_type, input_modifier in inputs:
-                connector = Connector(self, input_name, input_type, wx.Point(0, 0), WEST, onlyone = True)
+                connector = Connector(self, input_name, input_type, wx.Point(0, 0), WEST, onlyone=True)
                 if input_modifier == "negated":
                     connector.SetNegated(True)
                 elif input_modifier != "none":
@@ -282,9 +289,9 @@
                         break
                 input_connectors.append(connector)
             for input in self.Inputs:
-                input.UnConnect(delete = True)
+                input.UnConnect(delete=True)
             self.Inputs = input_connectors
-            
+
             # Extract the outputs properties and create or modify the corresponding connector
             output_connectors = []
             for output_name, output_type, output_modifier in outputs:
@@ -302,100 +309,100 @@
                         break
                 output_connectors.append(connector)
             for output in self.Outputs:
-                output.UnConnect(delete = True)
+                output.UnConnect(delete=True)
             self.Outputs = output_connectors
-                
+
             self.RefreshMinSize()
             self.RefreshConnectors()
             for output in self.Outputs:
                 output.RefreshWires()
             self.RefreshBoundingBox()
-    
+
     # Returns the block type
     def GetType(self):
         return self.Type
-    
+
     # Changes the block name
     def SetName(self, name):
         self.Name = name
         self.RefreshNameSize()
-    
+
     # Returs the block name
     def GetName(self):
         return self.Name
-    
+
     # Changes the extension name
     def SetExtension(self, extension):
         self.Extension = extension
-    
+
     # Returs the extension name
     def GetExtension(self):
         return self.Extension
-    
+
     # Changes the execution order
     def SetExecutionOrder(self, executionOrder):
         self.ExecutionOrder = executionOrder
         self.RefreshExecutionOrderSize()
-    
+
     # Returs the execution order
     def GetExecutionOrder(self):
         return self.ExecutionOrder
-    
+
     # Returs the execution order
     def GetExecutionControl(self):
         return self.ExecutionControl
-    
+
     # Refresh the block minimum size
     def RefreshMinSize(self):
         # Calculate the inputs maximum width
         max_input = 0
         for input in self.Inputs:
-            w, h = input.GetNameSize()
+            w, _h = input.GetNameSize()
             max_input = max(max_input, w)
         # Calculate the outputs maximum width
         max_output = 0
         for output in self.Outputs:
-            w, h = output.GetNameSize()
+            w, _h = output.GetNameSize()
             max_output = max(max_output, w)
         width = max(self.TypeSize[0] + 10, max_input + max_output + 15)
         height = (max(len(self.Inputs), len(self.Outputs)) + 1) * BLOCK_LINE_SIZE
         self.MinSize = width, height
-    
+
     # Returns the block minimum size
     def GetMinSize(self):
         return self.MinSize
-    
+
     # Changes the negated property of the connector handled
     def SetConnectorNegated(self, negated):
         handle_type, handle = self.Handle
         if handle_type == HANDLE_CONNECTOR:
             handle.SetNegated(negated)
             self.RefreshModel(False)
-    
+
     # Changes the edge property of the connector handled
     def SetConnectorEdge(self, edge):
         handle_type, handle = self.Handle
         if handle_type == HANDLE_CONNECTOR:
             handle.SetEdge(edge)
             self.RefreshModel(False)
-    
-##    # Method called when a Motion event have been generated
-##    def OnMotion(self, event, dc, scaling):
-##        if not event.Dragging():
-##            pos = event.GetLogicalPosition(dc)
-##            for input in self.Inputs:
-##                rect = input.GetRedrawRect()
-##                if rect.InsideXY(pos.x, pos.y):
-##                    print "Find input"
-##                    tip = wx.TipWindow(self.Parent, "Test")
-##                    tip.SetBoundingRect(rect)
-##        return Graphic_Element.OnMotion(self, event, dc, scaling)
-    
+
+#    # Method called when a Motion event have been generated
+#    def OnMotion(self, event, dc, scaling):
+#        if not event.Dragging():
+#            pos = event.GetLogicalPosition(dc)
+#            for input in self.Inputs:
+#                rect = input.GetRedrawRect()
+#                if rect.InsideXY(pos.x, pos.y):
+#                    print "Find input"
+#                    tip = wx.TipWindow(self.Parent, "Test")
+#                    tip.SetBoundingRect(rect)
+#        return Graphic_Element.OnMotion(self, event, dc, scaling)
+
     # Method called when a LeftDClick event have been generated
     def OnLeftDClick(self, event, dc, scaling):
         # Edit the block properties
         self.Parent.EditBlockContent(self)
-    
+
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         pos = GetScaledEventPosition(event, dc, scaling)
@@ -406,7 +413,7 @@
             self.Parent.PopupBlockMenu(connector)
         else:
             self.Parent.PopupBlockMenu()
-    
+
     # Refreshes the block model
     def RefreshModel(self, move=True):
         self.Parent.RefreshBlockModel(self)
@@ -414,12 +421,12 @@
         if move:
             for output in self.Outputs:
                 output.RefreshWires()
-    
+
     def GetToolTipValue(self):
         return self.Description
-    
+
     # Adds an highlight to the block
-    def AddHighlight(self, infos, start, end ,highlight_type):
+    def AddHighlight(self, infos, start, end, highlight_type):
         if infos[0] in ["type", "name"] and start[0] == 0 and end[0] == 0:
             highlights = self.Highlights.setdefault(infos[0], [])
             AddHighlight(highlights, (start, end, highlight_type))
@@ -427,7 +434,7 @@
             self.Inputs[infos[1]].AddHighlight(infos[2:], start, end, highlight_type)
         elif infos[0] == "output" and infos[1] < len(self.Outputs):
             self.Outputs[infos[1]].AddHighlight(infos[2:], start, end, highlight_type)
-    
+
     # Removes an highlight from the block
     def RemoveHighlight(self, infos, start, end, highlight_type):
         if infos[0] in ["type", "name"]:
@@ -438,7 +445,7 @@
             self.Inputs[infos[1]].RemoveHighlight(infos[2:], start, end, highlight_type)
         elif infos[0] == "output" and infos[1] < len(self.Outputs):
             self.Outputs[infos[1]].RemoveHighlight(infos[2:], start, end, highlight_type)
-            
+
     # Removes all the highlights of one particular type from the block
     def ClearHighlight(self, highlight_type=None):
         if highlight_type is None:
@@ -453,14 +460,14 @@
             input.ClearHighlights(highlight_type)
         for output in self.Outputs:
             output.ClearHighlights(highlight_type)
-    
+
     # Draws block
     def Draw(self, dc):
         Graphic_Element.Draw(self, dc)
         dc.SetPen(self.Pen)
         dc.SetBrush(wx.WHITE_BRUSH)
         dc.SetTextForeground(self.Colour)
-        
+
         if getattr(dc, "printing", False):
             name_size = dc.GetTextExtent(self.Name)
             type_size = dc.GetTextExtent(self.Type)
@@ -469,13 +476,13 @@
             name_size = self.NameSize
             type_size = self.TypeSize
             executionorder_size = self.ExecutionOrderSize
-            
+
         # Draw a rectangle with the block size
         dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
         # Draw block name and block type
-        name_pos = (self.Pos.x + (self.Size[0] - name_size[0]) / 2,
+        name_pos = (self.Pos.x + (self.Size[0] - name_size[0]) // 2,
                     self.Pos.y - (name_size[1] + 2))
-        type_pos = (self.Pos.x + (self.Size[0] - type_size[0]) / 2,
+        type_pos = (self.Pos.x + (self.Size[0] - type_size[0]) // 2,
                     self.Pos.y + 5)
         dc.DrawText(self.Name, name_pos[0], name_pos[1])
         dc.DrawText(self.Type, type_pos[0], type_pos[1])
@@ -487,25 +494,25 @@
         if self.ExecutionOrder != 0:
             # Draw block execution order
             dc.DrawText(str(self.ExecutionOrder), self.Pos.x + self.Size[0] - executionorder_size[0],
-                    self.Pos.y + self.Size[1] + 2)
-        
+                        self.Pos.y + self.Size[1] + 2)
+
         if not getattr(dc, "printing", False):
             DrawHighlightedText(dc, self.Name, self.Highlights.get("name", []), name_pos[0], name_pos[1])
             DrawHighlightedText(dc, self.Type, self.Highlights.get("type", []), type_pos[0], type_pos[1])
-        
-
-#-------------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------------
 #                        Function Block Diagram Variable
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements the graphic representation of a variable
-"""
+# -------------------------------------------------------------------------------
+
 
 class FBD_Variable(Graphic_Element):
+    """
+    Class that implements the graphic representation of a variable
+    """
 
     # Create a new variable
-    def __init__(self, parent, type, name, value_type, id = None, executionOrder = 0):
+    def __init__(self, parent, type, name, value_type, id=None, executionOrder=0):
         Graphic_Element.__init__(self, parent)
         self.Type = None
         self.ValueType = None
@@ -516,9 +523,9 @@
         self.Output = None
         self.SetType(type, value_type)
         self.Highlights = []
-    
+
     # Make a clone of this FBD_Variable
-    def Clone(self, parent, id = None, pos = None):
+    def Clone(self, parent, id=None, pos=None):
         variable = FBD_Variable(parent, self.Type, self.Name, self.ValueType, id)
         variable.SetSize(self.Size[0], self.Size[1])
         if pos is not None:
@@ -530,7 +537,7 @@
         if self.Output:
             variable.Output = self.Output.Clone(variable)
         return variable
-    
+
     def GetConnectorTranslation(self, element):
         connectors = {}
         if self.Input is not None:
@@ -538,7 +545,7 @@
         if self.Output is not None:
             connectors[self.Output] = element.Output
         return connectors
-    
+
     def Flush(self):
         if self.Input is not None:
             self.Input.Flush()
@@ -546,9 +553,9 @@
         if self.Output is not None:
             self.Output.Flush()
             self.Output = None
-    
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         rect = Graphic_Element.GetRedrawRect(self, movex, movey)
         if movex != 0 or movey != 0:
             if self.Input and self.Input.IsConnected():
@@ -556,26 +563,26 @@
             if self.Output and self.Output.IsConnected():
                 rect = rect.Union(self.Output.GetConnectedRedrawRect(movex, movey))
         return rect
-    
+
     # Unconnect connector
     def Clean(self):
         if self.Input:
-            self.Input.UnConnect(delete = True)
+            self.Input.UnConnect(delete=True)
         if self.Output:
-            self.Output.UnConnect(delete = True)
-    
+            self.Output.UnConnect(delete=True)
+
     # Delete this variable by calling the appropriate method
     def Delete(self):
         self.Parent.DeleteVariable(self)
-    
+
     # Refresh the size of text for name
     def RefreshNameSize(self):
         self.NameSize = self.Parent.GetTextExtent(self.Name)
-    
+
     # Refresh the size of text for execution order
     def RefreshExecutionOrderSize(self):
         self.ExecutionOrderSize = self.Parent.GetTextExtent(str(self.ExecutionOrder))
-    
+
     # Refresh the variable bounding box
     def RefreshBoundingBox(self):
         if self.Type in (OUTPUT, INOUT):
@@ -586,7 +593,7 @@
             bbx_width = self.Size[0] + 2 * CONNECTOR_SIZE
         else:
             bbx_width = self.Size[0] + CONNECTOR_SIZE
-        bbx_x = min(bbx_x, self.Pos.x + (self.Size[0] - self.NameSize[0]) / 2)
+        bbx_x = min(bbx_x, self.Pos.x + (self.Size[0] - self.NameSize[0]) // 2)
         bbx_width = max(bbx_width, self.NameSize[0])
         bbx_height = self.Size[1]
         if self.ExecutionOrder != 0:
@@ -594,41 +601,41 @@
             bbx_width = max(bbx_width, bbx_width + self.Pos.x + self.ExecutionOrderSize[0] - bbx_x - self.Size[0])
             bbx_height = bbx_height + (self.ExecutionOrderSize[1] + 2)
         self.BoundingBox = wx.Rect(bbx_x, self.Pos.y, bbx_width + 1, bbx_height + 1)
-    
+
     # Refresh the position of the variable connector
     def RefreshConnectors(self):
         scaling = self.Parent.GetScaling()
         if scaling is not None:
-            position = round_scaling(self.Pos.y + self.Size[1] / 2, scaling[1]) - self.Pos.y
-        else:
-            position = self.Size[1] / 2
+            position = round_scaling(self.Pos.y + self.Size[1] // 2, scaling[1]) - self.Pos.y
+        else:
+            position = self.Size[1] // 2
         if self.Input:
             self.Input.SetPosition(wx.Point(0, position))
         if self.Output:
             self.Output.SetPosition(wx.Point(self.Size[0], position))
         self.RefreshConnected()
-    
+
     # Refresh the position of wires connected to connector
-    def RefreshConnected(self, exclude = []):
+    def RefreshConnected(self, exclude=None):
         if self.Input:
             self.Input.MoveConnected(exclude)
         if self.Output:
             self.Output.MoveConnected(exclude)
-        
+
     # Test if point given is on the variable connector
-    def TestConnector(self, pt, direction = None, exclude=True):
+    def TestConnector(self, pt, direction=None, exclude=True):
         if self.Input and self.Input.TestPoint(pt, direction, exclude):
             return self.Input
         if self.Output and self.Output.TestPoint(pt, direction, exclude):
             return self.Output
         return None
-    
-    # Returns the block connector that starts with the point given if it exists 
-    def GetConnector(self, position, name = None):
+
+    # Returns the block connector that starts with the point given if it exists
+    def GetConnector(self, position, name=None):
         # if a name is given
         if name is not None:
             # Test input and output connector if they exists
-            #if self.Input and name == self.Input.GetName():
+            # if self.Input and name == self.Input.GetName():
             #    return self.Input
             if self.Output and name == self.Output.GetName():
                 return self.Output
@@ -640,8 +647,8 @@
         if self.Output:
             connectors.append(self.Output)
         return self.FindNearestConnector(position, connectors)
-    
-    # Returns all the block connectors 
+
+    # Returns all the block connectors
     def GetConnectors(self):
         connectors = {"inputs": [], "outputs": []}
         if self.Input:
@@ -649,14 +656,14 @@
         if self.Output:
             connectors["outputs"].append(self.Output)
         return connectors
-    
+
     # Changes the negated property of the variable connector if handled
     def SetConnectorNegated(self, negated):
         handle_type, handle = self.Handle
         if handle_type == HANDLE_CONNECTOR:
             handle.SetNegated(negated)
             self.RefreshModel(False)
-    
+
     # Changes the variable type
     def SetType(self, type, value_type):
         if type != self.Type:
@@ -664,15 +671,15 @@
             # Create an input or output connector according to variable type
             if self.Type != INPUT:
                 if self.Input is None:
-                    self.Input = Connector(self, "", value_type, wx.Point(0, 0), WEST, onlyone = True)
+                    self.Input = Connector(self, "", value_type, wx.Point(0, 0), WEST, onlyone=True)
             elif self.Input:
-                self.Input.UnConnect(delete = True)
+                self.Input.UnConnect(delete=True)
                 self.Input = None
             if self.Type != OUTPUT:
                 if self.Output is None:
                     self.Output = Connector(self, "", value_type, wx.Point(0, 0), EAST)
             elif self.Output:
-                self.Output.UnConnect(delete = True)
+                self.Output.UnConnect(delete=True)
                 self.Output = None
             self.RefreshConnectors()
             self.RefreshBoundingBox()
@@ -680,38 +687,38 @@
             if self.Input:
                 self.Input.SetType(value_type)
             if self.Output:
-                self.Output.SetType(value_type)            
-        
+                self.Output.SetType(value_type)
+
     # Returns the variable type
     def GetType(self):
         return self.Type
-    
+
     # Returns the variable value type
     def GetValueType(self):
         return self.ValueType
-    
+
     # Changes the variable name
     def SetName(self, name):
         self.Name = name
         self.RefreshNameSize()
-    
+
     # Returns the variable name
     def GetName(self):
         return self.Name
-    
+
     # Changes the execution order
     def SetExecutionOrder(self, executionOrder):
         self.ExecutionOrder = executionOrder
         self.RefreshExecutionOrderSize()
-    
+
     # Returs the execution order
     def GetExecutionOrder(self):
         return self.ExecutionOrder
-    
+
     # Returns the variable minimum size
     def GetMinSize(self):
         return self.NameSize[0] + 10, self.NameSize[1] + 10
-    
+
     # Set size of the variable to the minimum size
     def SetBestSize(self, scaling):
         if self.Type == INPUT:
@@ -720,22 +727,22 @@
             return Graphic_Element.SetBestSize(self, scaling, x_factor=0.)
         else:
             return Graphic_Element.SetBestSize(self, scaling)
-    
+
     # Method called when a LeftDClick event have been generated
     def OnLeftDClick(self, event, dc, scaling):
         if event.ControlDown():
-            # Change variable type 
+            # Change variable type
             types = [INPUT, OUTPUT, INOUT]
-            self.Parent.ChangeVariableType(self,
-                types[(types.index(self.Type) + 1) % len(types)])
+            self.Parent.ChangeVariableType(
+                self, types[(types.index(self.Type) + 1) % len(types)])
         else:
             # Edit the variable properties
             self.Parent.EditVariableContent(self)
-    
+
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         self.Parent.PopupVariableMenu()
-    
+
     # Refreshes the variable model
     def RefreshModel(self, move=True):
         self.Parent.RefreshVariableModel(self)
@@ -744,36 +751,36 @@
         if move and self.Type != OUTPUT:
             if self.Output:
                 self.Output.RefreshWires()
-    
+
     # Adds an highlight to the variable
     def AddHighlight(self, infos, start, end, highlight_type):
         if infos[0] == "expression" and start[0] == 0 and end[0] == 0:
             AddHighlight(self.Highlights, (start, end, highlight_type))
-    
+
     # Removes an highlight from the variable
     def RemoveHighlight(self, infos, start, end, highlight_type):
         if infos[0] == "expression":
             RemoveHighlight(self.Highlights, (start, end, highlight_type))
-    
+
     # Removes all the highlights of one particular type from the variable
     def ClearHighlight(self, highlight_type=None):
         ClearHighlights(self.Highlights, highlight_type)
-    
+
     # Draws variable
     def Draw(self, dc):
         Graphic_Element.Draw(self, dc)
         dc.SetPen(MiterPen(wx.BLACK))
         dc.SetBrush(wx.WHITE_BRUSH)
-        
+
         if getattr(dc, "printing", False):
             name_size = dc.GetTextExtent(self.Name)
             executionorder_size = dc.GetTextExtent(str(self.ExecutionOrder))
         else:
             name_size = self.NameSize
             executionorder_size = self.ExecutionOrderSize
-        
-        text_pos = (self.Pos.x + (self.Size[0] - name_size[0]) / 2, 
-                    self.Pos.y + (self.Size[1] - name_size[1]) / 2)
+
+        text_pos = (self.Pos.x + (self.Size[0] - name_size[0]) // 2,
+                    self.Pos.y + (self.Size[1] - name_size[1]) // 2)
         # Draw a rectangle with the variable size
         dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
         # Draw variable name
@@ -781,27 +788,28 @@
         # Draw connectors
         if self.Input:
             self.Input.Draw(dc)
-        if self.Output:    
+        if self.Output:
             self.Output.Draw(dc)
         if self.ExecutionOrder != 0:
             # Draw variable execution order
             dc.DrawText(str(self.ExecutionOrder), self.Pos.x + self.Size[0] - executionorder_size[0],
-                    self.Pos.y + self.Size[1] + 2)
+                        self.Pos.y + self.Size[1] + 2)
         if not getattr(dc, "printing", False):
             DrawHighlightedText(dc, self.Name, self.Highlights, text_pos[0], text_pos[1])
-            
-#-------------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------------
 #                        Function Block Diagram Connector
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements the graphic representation of a connection
-"""
+# -------------------------------------------------------------------------------
+
 
 class FBD_Connector(Graphic_Element):
+    """
+    Class that implements the graphic representation of a connection
+    """
 
     # Create a new connection
-    def __init__(self, parent, type, name, id = None):
+    def __init__(self, parent, type, name, id=None):
         Graphic_Element.__init__(self, parent)
         self.Type = type
         self.Id = id
@@ -811,27 +819,27 @@
         self.Highlights = []
         # Create an input or output connector according to connection type
         if self.Type == CONNECTOR:
-            self.Connector = Connector(self, "", "ANY", wx.Point(0, 0), WEST, onlyone = True)
+            self.Connector = Connector(self, "", "ANY", wx.Point(0, 0), WEST, onlyone=True)
         else:
             self.Connector = Connector(self, "", "ANY", wx.Point(0, 0), EAST)
         self.RefreshConnectors()
         self.RefreshNameSize()
-    
+
     def Flush(self):
         if self.Connector:
             self.Connector.Flush()
             self.Connector = None
-    
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         rect = Graphic_Element.GetRedrawRect(self, movex, movey)
         if movex != 0 or movey != 0:
             if self.Connector and self.Connector.IsConnected():
                 rect = rect.Union(self.Connector.GetConnectedRedrawRect(movex, movey))
         return rect
-    
+
     # Make a clone of this FBD_Connector
-    def Clone(self, parent, id = None, pos = None):
+    def Clone(self, parent, id=None, pos=None):
         connection = FBD_Connector(parent, self.Type, self.Name, id)
         connection.SetSize(self.Size[0], self.Size[1])
         if pos is not None:
@@ -840,23 +848,23 @@
             connection.SetPosition(self.Pos.x, self.Pos.y)
         connection.Connector = self.Connector.Clone(connection)
         return connection
-    
+
     def GetConnectorTranslation(self, element):
-        return {self.Connector : element.Connector}
+        return {self.Connector: element.Connector}
 
     # Unconnect connector
     def Clean(self):
         if self.Connector:
-            self.Connector.UnConnect(delete = True)
-    
+            self.Connector.UnConnect(delete=True)
+
     # Delete this connection by calling the appropriate method
     def Delete(self):
         self.Parent.DeleteConnection(self)
-    
+
     # Refresh the size of text for name
     def RefreshNameSize(self):
         self.NameSize = self.Parent.GetTextExtent(self.Name)
-    
+
     # Refresh the connection bounding box
     def RefreshBoundingBox(self):
         if self.Type == CONNECTOR:
@@ -865,36 +873,36 @@
             bbx_x = self.Pos.x
         bbx_width = self.Size[0] + CONNECTOR_SIZE
         self.BoundingBox = wx.Rect(bbx_x, self.Pos.y, bbx_width, self.Size[1])
-    
+
     # Refresh the position of the connection connector
     def RefreshConnectors(self):
         scaling = self.Parent.GetScaling()
         if scaling is not None:
-            position = round_scaling(self.Pos.y + self.Size[1] / 2, scaling[1]) - self.Pos.y
-        else:
-            position = self.Size[1] / 2
+            position = round_scaling(self.Pos.y + self.Size[1] // 2, scaling[1]) - self.Pos.y
+        else:
+            position = self.Size[1] // 2
         if self.Type == CONNECTOR:
             self.Connector.SetPosition(wx.Point(0, position))
         else:
             self.Connector.SetPosition(wx.Point(self.Size[0], position))
         self.RefreshConnected()
-    
+
     # Refresh the position of wires connected to connector
-    def RefreshConnected(self, exclude = []):
+    def RefreshConnected(self, exclude=None):
         if self.Connector:
             self.Connector.MoveConnected(exclude)
-    
+
     # Test if point given is on the connection connector
-    def TestConnector(self, pt, direction = None, exclude=True):
+    def TestConnector(self, pt, direction=None, exclude=True):
         if self.Connector and self.Connector.TestPoint(pt, direction, exclude):
             return self.Connector
         return None
-    
+
     # Returns the connection connector
-    def GetConnector(self, position = None, name = None):
+    def GetConnector(self, position=None, name=None):
         return self.Connector
-    
-        # Returns all the block connectors 
+
+        # Returns all the block connectors
     def GetConnectors(self):
         connectors = {"inputs": [], "outputs": []}
         if self.Type == CONNECTOR:
@@ -918,50 +926,50 @@
             self.Clean()
             # Create an input or output connector according to connection type
             if self.Type == CONNECTOR:
-                self.Connector = Connector(self, "", "ANY", wx.Point(0, 0), WEST, onlyone = True)
+                self.Connector = Connector(self, "", "ANY", wx.Point(0, 0), WEST, onlyone=True)
             else:
                 self.Connector = Connector(self, "", "ANY", wx.Point(0, 0), EAST)
             self.RefreshConnectors()
             self.RefreshBoundingBox()
-    
+
     # Returns the connection type
     def GetType(self):
         return self.Type
-    
+
     def GetConnectionResultType(self, connector, connectortype):
         if self.Type == CONTINUATION:
             connector = self.Parent.GetConnectorByName(self.Name)
             if connector is not None:
                 return connector.Connector.GetConnectedType()
         return connectortype
-    
+
     # Changes the connection name
     def SetName(self, name):
         self.Name = name
         self.RefreshNameSize()
-        
+
     # Returns the connection name
     def GetName(self):
         return self.Name
-    
+
     # Set size of the variable to the minimum size
     def SetBestSize(self, scaling):
         if self.Type == CONTINUATION:
             return Graphic_Element.SetBestSize(self, scaling, x_factor=1.)
         else:
             return Graphic_Element.SetBestSize(self, scaling, x_factor=0.)
-    
+
     # Returns the connection minimum size
     def GetMinSize(self):
         text_width, text_height = self.NameSize
         if text_height % 2 == 1:
             text_height += 1
         return text_width + text_height + 20, text_height + 10
-    
+
     # Method called when a LeftDClick event have been generated
     def OnLeftDClick(self, event, dc, scaling):
         if event.ControlDown():
-            # Change connection type 
+            # Change connection type
             if self.Type == CONNECTOR:
                 self.Parent.ChangeConnectionType(self, CONTINUATION)
             else:
@@ -969,12 +977,12 @@
         else:
             # Edit the connection properties
             self.Parent.EditConnectionContent(self)
-    
+
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         # Popup the default menu
         self.Parent.PopupConnectionMenu()
-    
+
     # Refreshes the connection model
     def RefreshModel(self, move=True):
         self.Parent.RefreshConnectionModel(self)
@@ -983,51 +991,50 @@
         if move and self.Type == CONTINUATION:
             if self.Connector:
                 self.Connector.RefreshWires()
-    
+
     # Adds an highlight to the connection
     def AddHighlight(self, infos, start, end, highlight_type):
         if infos[0] == "name" and start[0] == 0 and end[0] == 0:
             AddHighlight(self.Highlights, (start, end, highlight_type))
-    
+
     # Removes an highlight from the connection
     def RemoveHighlight(self, infos, start, end, highlight_type):
         if infos[0] == "name":
             RemoveHighlight(self.Highlights, (start, end, highlight_type))
-    
+
     # Removes all the highlights of one particular type from the connection
     def ClearHighlight(self, highlight_type=None):
         ClearHighlights(self.Highlights, highlight_type)
-    
+
     # Draws connection
     def Draw(self, dc):
         Graphic_Element.Draw(self, dc)
         dc.SetPen(MiterPen(wx.BLACK))
         dc.SetBrush(wx.WHITE_BRUSH)
-        
+
         if getattr(dc, "printing", False):
             name_size = dc.GetTextExtent(self.Name)
         else:
             name_size = self.NameSize
-        
+
         # Draw a rectangle with the connection size with arrows inside
         dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
-        arrowsize = min(self.Size[1] / 2, (self.Size[0] - name_size[0] - 10) / 2)
-        dc.DrawLine(self.Pos.x, self.Pos.y, self.Pos.x + arrowsize, 
-                self.Pos.y + self.Size[1] / 2)
-        dc.DrawLine(self.Pos.x + arrowsize, self.Pos.y + self.Size[1] / 2, 
-                self.Pos.x, self.Pos.y + self.Size[1])
-        dc.DrawLine(self.Pos.x + self.Size[0] - arrowsize, self.Pos.y, 
-                self.Pos.x + self.Size[0], self.Pos.y + self.Size[1] / 2)
-        dc.DrawLine(self.Pos.x + self.Size[0], self.Pos.y + self.Size[1] / 2, 
-                self.Pos.x + self.Size[0] - arrowsize, self.Pos.y + self.Size[1])
+        arrowsize = min(self.Size[1] // 2, (self.Size[0] - name_size[0] - 10) // 2)
+        dc.DrawLine(self.Pos.x, self.Pos.y, self.Pos.x + arrowsize,
+                    self.Pos.y + self.Size[1] // 2)
+        dc.DrawLine(self.Pos.x + arrowsize, self.Pos.y + self.Size[1] // 2,
+                    self.Pos.x, self.Pos.y + self.Size[1])
+        dc.DrawLine(self.Pos.x + self.Size[0] - arrowsize, self.Pos.y,
+                    self.Pos.x + self.Size[0], self.Pos.y + self.Size[1] // 2)
+        dc.DrawLine(self.Pos.x + self.Size[0], self.Pos.y + self.Size[1] // 2,
+                    self.Pos.x + self.Size[0] - arrowsize, self.Pos.y + self.Size[1])
         # Draw connection name
-        text_pos = (self.Pos.x + (self.Size[0] - name_size[0]) / 2, 
-                    self.Pos.y + (self.Size[1] - name_size[1]) / 2)
+        text_pos = (self.Pos.x + (self.Size[0] - name_size[0]) // 2,
+                    self.Pos.y + (self.Size[1] - name_size[1]) // 2)
         dc.DrawText(self.Name, text_pos[0], text_pos[1])
         # Draw connector
         if self.Connector:
             self.Connector.Draw(dc)
-        
+
         if not getattr(dc, "printing", False):
             DrawHighlightedText(dc, self.Name, self.Highlights, text_pos[0], text_pos[1])
-        
--- a/graphics/GraphicCommons.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/graphics/GraphicCommons.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,22 +22,23 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
+from math import *
+from future.builtins import round
+from six import string_types
+from six.moves import xrange
+
 import wx
-from math import *
-from types import *
-import datetime
-from threading import Lock,Timer
-
 from graphics.ToolTipProducer import ToolTipProducer
 from graphics.DebugDataConsumer import DebugDataConsumer
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                               Common constants
-#-------------------------------------------------------------------------------
-
-"""
-Definition of constants for dimensions of graphic elements
-"""
+#
+#            Definition of constants for dimensions of graphic elements
+# -------------------------------------------------------------------------------
 
 # FBD and SFC constants
 MIN_MOVE = 5                            # Minimum move before starting a element dragging
@@ -78,17 +79,17 @@
 [HANDLE_MOVE, HANDLE_RESIZE, HANDLE_POINT, HANDLE_SEGMENT, HANDLE_CONNECTOR] = range(5)
 
 # List of value for resize handle that are valid
-VALID_HANDLES = [(1,1), (1,2), (1,3), (2,3), (3,3), (3,2), (3,1), (2,1)]
+VALID_HANDLES = [(1, 1), (1, 2), (1, 3), (2, 3), (3, 3), (3, 2), (3, 1), (2, 1)]
 
 # Contants for defining the direction of a connector
-[EAST, NORTH, WEST, SOUTH] = [(1,0), (0,-1), (-1,0), (0,1)]
-
-# Contants for defining which mode is selected for each view 
-[MODE_SELECTION, MODE_BLOCK, MODE_VARIABLE, MODE_CONNECTION, MODE_COMMENT, 
- MODE_COIL, MODE_CONTACT, MODE_POWERRAIL, MODE_INITIALSTEP, MODE_STEP, 
+[EAST, NORTH, WEST, SOUTH] = [(1, 0), (0, -1), (-1, 0), (0, 1)]
+
+# Contants for defining which mode is selected for each view
+[MODE_SELECTION, MODE_BLOCK, MODE_VARIABLE, MODE_CONNECTION, MODE_COMMENT,
+ MODE_COIL, MODE_CONTACT, MODE_POWERRAIL, MODE_INITIALSTEP, MODE_STEP,
  MODE_TRANSITION, MODE_DIVERGENCE, MODE_JUMP, MODE_ACTION, MODE_MOTION] = range(15)
 
-# Contants for defining alignment types for graphic group 
+# Contants for defining alignment types for graphic group
 [ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT, ALIGN_TOP, ALIGN_MIDDLE, ALIGN_BOTTOM] = range(6)
 
 # Contants for defining which drawing mode is selected for app
@@ -105,43 +106,53 @@
 REFRESH_HIGHLIGHT_PERIOD = 0.1
 
 HANDLE_CURSORS = {
-    (1, 1) : 2,
-    (3, 3) : 2,
-    (1, 3) : 3,
-    (3, 1) : 3,
-    (1, 2) : 4,
-    (3, 2) : 4,
-    (2, 1) : 5,
-    (2, 3) : 5
+    (1, 1): 2,
+    (3, 3): 2,
+    (1, 3): 3,
+    (3, 1): 3,
+    (1, 2): 4,
+    (3, 2): 4,
+    (2, 1): 5,
+    (2, 3): 5
 }
 
+
 def round_scaling(x, n, constraint=0):
-    fraction = float(x) / float(n)
+    fraction = x / n
     if constraint == -1:
         xround = int(fraction)
     else:
         xround = round(fraction)
         if constraint == 1 and xround < fraction:
-            xround += 1 
+            xround += 1
     return int(xround * n)
 
-"""
-Basic vector operations for calculate wire points
-"""
-
-# Create a vector from two points and define if vector must be normal
-def vector(p1, p2, normal = True):
+
+# -------------------------------------------------------------------------------
+# Basic vector operations for calculate wire points
+# -------------------------------------------------------------------------------
+
+def vector(p1, p2, normal=True):
+    """
+    Create a vector from two points and define if vector must be normal
+    """
     vector = (p2.x - p1.x, p2.y - p1.y)
     if normal:
         return normalize(vector)
     return vector
 
-# Calculate the norm of a given vector
+
 def norm(v):
+    """
+    Calculate the norm of a given vector
+    """
     return sqrt(v[0] * v[0] + v[1] * v[1])
 
-# Normalize a given vector
+
 def normalize(v):
+    """
+    Normalize a given vector
+    """
     v_norm = norm(v)
     # Verifie if it is not a null vector
     if v_norm > 0:
@@ -149,36 +160,43 @@
     else:
         return v
 
-# Calculate the scalar product of two vectors
+
 def is_null_vector(v):
+    """
+    Calculate the scalar product of two vectors
+    """
     return v == (0, 0)
 
-# Calculate the scalar product of two vectors
+
 def add_vectors(v1, v2):
+    """
+    Calculate the scalar product of two vectors
+    """
     return (v1[0] + v2[0], v1[1] + v2[1])
 
-# Calculate the scalar product of two vectors
+
 def product(v1, v2):
+    """
+    Calculate the scalar product of two vectors
+    """
     return v1[0] * v2[0] + v1[1] * v2[1]
 
 
-"""
-Function that calculates the nearest point of the grid defined by scaling for the given point
-"""
-
 def GetScaledEventPosition(event, dc, scaling):
+    """
+    Function that calculates the nearest point of the grid defined by scaling for the given point
+    """
     pos = event.GetLogicalPosition(dc)
     if scaling:
-        pos.x = round(float(pos.x) / float(scaling[0])) * scaling[0]
-        pos.y = round(float(pos.y) / float(scaling[1])) * scaling[1]
+        pos.x = round(pos.x / scaling[0]) * scaling[0]
+        pos.y = round(pos.y / scaling[1]) * scaling[1]
     return pos
 
 
-"""
-Function that choose a direction during the wire points generation
-"""
-
 def DirectionChoice(v_base, v_target, dir_target):
+    """
+    Function that choose a direction during the wire points generation
+    """
     dir_product = product(v_base, v_target)
     if dir_product < 0:
         return (-v_base[0], -v_base[1])
@@ -186,37 +204,43 @@
         return dir_target
     return v_base
 
+
 def MiterPen(colour, width=1, style=wx.SOLID):
     pen = wx.Pen(colour, width, style)
     pen.SetJoin(wx.JOIN_MITER)
     pen.SetCap(wx.CAP_PROJECTING)
     return pen
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                    Helpers for highlighting text
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 def AddHighlight(highlights, infos):
     RemoveHighlight(highlights, infos)
     highlights.append(infos)
 
+
 def RemoveHighlight(highlights, infos):
     if infos in highlights:
         highlights.remove(infos)
         return True
     return False
 
-def ClearHighlight(highlights, highlight_type=None):
+
+def ClearHighlights(highlights, highlight_type=None):
     if highlight_type is not None:
         return [highlight for highlight in highlights if highlight[2] != highlight_type]
     return []
 
+
 def DrawHighlightedText(dc, text, highlights, x, y):
     current_pen = dc.GetPen()
     dc.SetPen(wx.TRANSPARENT_PEN)
     for start, end, highlight_type in highlights:
         dc.SetBrush(wx.Brush(highlight_type[0]))
-        offset_width, offset_height = dc.GetTextExtent(text[:start[1]])
+        offset_width, _offset_height = dc.GetTextExtent(text[:start[1]])
         part = text[start[1]:end[1] + 1]
         part_width, part_height = dc.GetTextExtent(part)
         dc.DrawRectangle(x + offset_width, y, part_width, part_height)
@@ -224,26 +248,27 @@
         dc.DrawText(part, x + offset_width, y)
     dc.SetPen(current_pen)
     dc.SetTextForeground(wx.BLACK)
-    
-#-------------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------------
 #                           Graphic element base class
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a generic graphic element
-"""
+# -------------------------------------------------------------------------------
+
 
 class Graphic_Element(ToolTipProducer):
-    
+    """
+    Class that implements a generic graphic element
+    """
+
     # Create a new graphic element
-    def __init__(self, parent, id = None):
+    def __init__(self, parent, id=None):
         ToolTipProducer.__init__(self, parent)
         self.Parent = parent
         self.Id = id
         self.oldPos = None
         self.StartPos = None
         self.CurrentDrag = None
-        self.Handle = (None,None)
+        self.Handle = (None, None)
         self.Dragging = False
         self.Selected = False
         self.Highlighted = False
@@ -251,22 +276,22 @@
         self.Size = wx.Size(0, 0)
         self.BoundingBox = wx.Rect(0, 0, 0, 0)
         self.Visible = False
-    
+
     def GetDefinition(self):
         return [self.Id], []
-    
+
     def TestVisible(self, screen):
         self.Visible = self.Selected or self.GetRedrawRect().Intersects(screen)
-    
+
     def IsVisible(self):
         return self.Visible
-    
+
     def SpreadCurrent(self):
         pass
-    
+
     def GetConnectorTranslation(self, element):
         return {}
-    
+
     def FindNearestConnector(self, position, connectors):
         distances = []
         for connector in connectors:
@@ -278,20 +303,20 @@
         if len(distances) > 0:
             return distances[0][1]
         return None
-        
+
     def IsOfType(self, type, reference):
         return self.Parent.IsOfType(type, reference)
-    
+
     def IsEndType(self, type):
         return self.Parent.IsEndType(type)
-        
+
     def GetDragging(self):
         return self.Dragging
-    
+
     # Make a clone of this element
     def Clone(self, parent):
         return Graphic_Element(parent, self.Id)
-    
+
     # Changes the block position
     def SetPosition(self, x, y):
         self.Pos.x = x
@@ -302,7 +327,7 @@
     # Returns the block position
     def GetPosition(self):
         return self.Pos.x, self.Pos.y
-    
+
     # Changes the element size
     def SetSize(self, width, height):
         self.Size.SetWidth(width)
@@ -313,11 +338,11 @@
     # Returns the element size
     def GetSize(self):
         return self.Size.GetWidth(), self.Size.GetHeight()
-    
+
     # Returns the minimum element size
     def GetMinSize(self):
         return 0, 0
-    
+
     # Set size of the element to the minimum size
     def SetBestSize(self, scaling, x_factor=0.5, y_factor=0.5):
         width, height = self.GetSize()
@@ -336,31 +361,27 @@
             height = round_scaling(height, scaling[1], 1)
         self.SetSize(width, height)
         return self.Pos.x - posx, self.Pos.y - posy
-    
-    # Refresh the element Bounding Box
-    def RefreshBoundingBox(self):
-        self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y, self.Size[0], self.Size[1])
-    
+
     # Refresh the element connectors position
     def RefreshConnectors(self):
         pass
-    
+
     # Refresh the position of wires connected to element inputs and outputs
-    def RefreshConnected(self):
+    def RefreshConnected(self, exclude=None):
         pass
-    
+
     # Change the parent
     def SetParent(self, parent):
         self.Parent = parent
-    
+
     # Override this method for defining the method to call for deleting this element
     def Delete(self):
         pass
-    
+
     # Returns the Id
     def GetId(self):
         return self.Id
-    
+
     # Returns if the point given is in the bounding box
     def HitTest(self, pt, connectors=True):
         if connectors:
@@ -368,21 +389,21 @@
         else:
             rect = wx.Rect(self.Pos.x, self.Pos.y, self.Size[0], self.Size[1])
         return rect.InsideXY(pt.x, pt.y)
-    
+
     # Returns if the point given is in the bounding box
     def IsInSelection(self, rect):
         return rect.InsideXY(self.BoundingBox.x, self.BoundingBox.y) and rect.InsideXY(self.BoundingBox.x + self.BoundingBox.width, self.BoundingBox.y + self.BoundingBox.height)
-    
+
     # Override this method for refreshing the bounding box
     def RefreshBoundingBox(self):
         pass
-    
+
     # Returns the bounding box
     def GetBoundingBox(self):
         return self.BoundingBox
-    
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         scalex, scaley = self.Parent.GetViewScale()
         rect = wx.Rect()
         rect.x = self.BoundingBox.x - int(HANDLE_SIZE / scalex) - 3 - abs(movex)
@@ -390,42 +411,42 @@
         rect.width = self.BoundingBox.width + 2 * (int(HANDLE_SIZE / scalex) + abs(movex) + 1) + 4
         rect.height = self.BoundingBox.height + 2 * (int(HANDLE_SIZE / scaley) + abs(movey) + 1) + 4
         return rect
-    
-    def Refresh(self, rect = None):
+
+    def Refresh(self, rect=None):
         if self.Visible:
             if rect is not None:
                 self.Parent.RefreshRect(self.Parent.GetScrolledRect(rect), False)
             else:
                 self.Parent.RefreshRect(self.Parent.GetScrolledRect(self.GetRedrawRect()), False)
-    
+
     # Change the variable that indicates if this element is selected
     def SetSelected(self, selected):
         self.Selected = selected
         self.Refresh()
-    
+
     # Change the variable that indicates if this element is highlighted
     def SetHighlighted(self, highlighted):
         self.Highlighted = highlighted
         self.Refresh()
-    
+
     # Test if the point is on a handle of this element
     def TestHandle(self, event):
         dc = self.Parent.GetLogicalDC()
         scalex, scaley = dc.GetUserScale()
         pos = event.GetPosition()
         pt = wx.Point(*self.Parent.CalcUnscrolledPosition(pos.x, pos.y))
-        
+
         left = (self.BoundingBox.x - 2) * scalex - HANDLE_SIZE
-        center = (self.BoundingBox.x + self.BoundingBox.width / 2) * scalex - HANDLE_SIZE / 2
+        center = (self.BoundingBox.x + self.BoundingBox.width // 2) * scalex - HANDLE_SIZE // 2
         right = (self.BoundingBox.x + self.BoundingBox.width + 2) * scalex
-        
+
         top = (self.BoundingBox.y - 2) * scaley - HANDLE_SIZE
-        middle = (self.BoundingBox.y + self.BoundingBox.height / 2) * scaley - HANDLE_SIZE / 2
+        middle = (self.BoundingBox.y + self.BoundingBox.height / 2) * scaley - HANDLE_SIZE // 2
         bottom = (self.BoundingBox.y + self.BoundingBox.height + 2) * scaley
-        
+
         extern_rect = wx.Rect(left, top, right + HANDLE_SIZE - left, bottom + HANDLE_SIZE - top)
         intern_rect = wx.Rect(left + HANDLE_SIZE, top + HANDLE_SIZE, right - left - HANDLE_SIZE, bottom - top - HANDLE_SIZE)
-        
+
         # Verify that this element is selected
         if self.Selected and extern_rect.InsideXY(pt.x, pt.y) and not intern_rect.InsideXY(pt.x, pt.y):
             # Find if point is on a handle horizontally
@@ -450,10 +471,9 @@
             if (handle_x, handle_y) in VALID_HANDLES:
                 return handle_x, handle_y
         return 0, 0
-    
+
     # Method called when a LeftDown event have been generated
     def OnLeftDown(self, event, dc, scaling):
-        pos = event.GetLogicalPosition(dc)
         # Test if an handle have been clicked
         handle = self.TestHandle(event)
         # Find which type of handle have been clicked,
@@ -469,7 +489,7 @@
         self.oldPos = GetScaledEventPosition(event, dc, scaling)
         self.StartPos = wx.Point(self.Pos.x, self.Pos.y)
         self.CurrentDrag = wx.Point(0, 0)
-    
+
     # Method called when a LeftUp event have been generated
     def OnLeftUp(self, event, dc, scaling):
         # If a dragging have been initiated
@@ -498,7 +518,7 @@
     # Method called when a LeftDClick event have been generated
     def OnLeftDClick(self, event, dc, scaling):
         pass
-    
+
     # Method called when a Motion event have been generated
     def OnMotion(self, event, dc, scaling):
         # If the cursor is dragging and the element have been clicked
@@ -532,19 +552,19 @@
             return 0, 0
 
     # Moves the element
-    def Move(self, dx, dy, exclude = []):
+    def Move(self, dx, dy, exclude=None):
         self.Pos.x += max(-self.BoundingBox.x, dx)
         self.Pos.y += max(-self.BoundingBox.y, dy)
         self.RefreshConnected(exclude)
         self.RefreshBoundingBox()
-    
+
     # Resizes the element from position and size given
     def Resize(self, x, y, width, height):
         self.Move(x, y)
         self.SetSize(width, height)
-    
+
     # Refreshes the element state according to move defined and handle selected
-    def ProcessDragging(self, movex, movey, event, scaling, width_fac = 1, height_fac = 1):
+    def ProcessDragging(self, movex, movey, event, scaling, width_fac=1, height_fac=1):
         handle_type, handle = self.Handle
         # If it is a resize handle, calculate the values from resizing
         if handle_type == HANDLE_RESIZE:
@@ -618,27 +638,27 @@
                     movey = self.StartPos.y - self.Pos.y
                 else:
                     movex = self.StartPos.x - self.Pos.x
-                    movey = self.StartPos.y + self.CurrentDrag.y - self.Pos.y   
+                    movey = self.StartPos.y + self.CurrentDrag.y - self.Pos.y
             self.Move(movex, movey)
             return movex, movey
         return 0, 0
-    
+
     # Override this method for defining the method to call for adding an highlight to this element
     def AddHighlight(self, infos, start, end, highlight_type):
         pass
-    
+
     # Override this method for defining the method to call for removing an highlight from this element
     def RemoveHighlight(self, infos, start, end, highlight_type):
         pass
-    
+
     # Override this method for defining the method to call for removing all the highlights of one particular type from this element
     def ClearHighlight(self, highlight_type=None):
         pass
-    
+
     # Override this method for defining the method to call for refreshing the model of this element
     def RefreshModel(self, move=True):
         pass
-    
+
     # Draws the highlightment of this element if it is highlighted (can be overwritten)
     def DrawHighlightment(self, dc):
         scalex, scaley = dc.GetUserScale()
@@ -646,13 +666,13 @@
         dc.SetPen(MiterPen(HIGHLIGHTCOLOR))
         dc.SetBrush(wx.Brush(HIGHLIGHTCOLOR))
         dc.SetLogicalFunction(wx.AND)
-        dc.DrawRectangle(int(round((self.Pos.x - 1) * scalex)) - 2, 
-                         int(round((self.Pos.y - 1) * scaley)) - 2, 
-                         int(round((self.Size.width + 3) * scalex)) + 5, 
+        dc.DrawRectangle(int(round((self.Pos.x - 1) * scalex)) - 2,
+                         int(round((self.Pos.y - 1) * scaley)) - 2,
+                         int(round((self.Size.width + 3) * scalex)) + 5,
                          int(round((self.Size.height + 3) * scaley)) + 5)
         dc.SetLogicalFunction(wx.COPY)
         dc.SetUserScale(scalex, scaley)
-    
+
     # Draws the handles of this element if it is selected
     def Draw(self, dc):
         if not getattr(dc, "printing", False):
@@ -663,55 +683,55 @@
                 dc.SetUserScale(1, 1)
                 dc.SetPen(MiterPen(wx.BLACK))
                 dc.SetBrush(wx.BLACK_BRUSH)
-                
+
                 left = (self.BoundingBox.x - 2) * scalex - HANDLE_SIZE
-                center = (self.BoundingBox.x + self.BoundingBox.width / 2) * scalex - HANDLE_SIZE / 2
+                center = (self.BoundingBox.x + self.BoundingBox.width // 2) * scalex - HANDLE_SIZE // 2
                 right = (self.BoundingBox.x + self.BoundingBox.width + 2) * scalex
-                
+
                 top = (self.BoundingBox.y - 2) * scaley - HANDLE_SIZE
-                middle = (self.BoundingBox.y + self.BoundingBox.height / 2) * scaley - HANDLE_SIZE / 2
+                middle = (self.BoundingBox.y + self.BoundingBox.height // 2) * scaley - HANDLE_SIZE // 2
                 bottom = (self.BoundingBox.y + self.BoundingBox.height + 2) * scaley
-                
+
                 for x, y in [(left, top), (center, top), (right, top),
                              (left, middle), (right, middle),
                              (left, bottom), (center, bottom), (right, bottom)]:
                     dc.DrawRectangle(x, y, HANDLE_SIZE, HANDLE_SIZE)
-                
+
                 dc.SetUserScale(scalex, scaley)
 
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                           Group of graphic elements
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a group of graphic elements
-"""
+# -------------------------------------------------------------------------------
+
 
 class Graphic_Group(Graphic_Element):
-    
+    """
+    Class that implements a group of graphic elements
+    """
+
     # Create a new group of graphic elements
     def __init__(self, parent):
         Graphic_Element.__init__(self, parent)
         self.Elements = []
         self.RefreshWireExclusion()
         self.RefreshBoundingBox()
-    
+
     # Destructor
     def __del__(self):
         self.Elements = []
-    
+
     def GetDefinition(self):
-        blocks = [] 
+        blocks = []
         wires = []
         for element in self.Elements:
             block, wire = element.GetDefinition()
             blocks.extend(block)
             wires.extend(wire)
         return blocks, wires
-    
+
     # Make a clone of this element
-    def Clone(self, parent, pos = None):
+    def Clone(self, parent, pos=None):
         group = Graphic_Group(parent)
         connectors = {}
         exclude_names = {}
@@ -729,9 +749,9 @@
                     if parent.IsNamedElement(element):
                         name = parent.GenerateNewName(element, exclude_names)
                         exclude_names[name.upper()] = True
-                        new_element = element.Clone(parent, newid, name, pos = new_pos)
+                        new_element = element.Clone(parent, newid, name, pos=new_pos)
                     else:
-                        new_element = element.Clone(parent, newid, pos = new_pos)
+                        new_element = element.Clone(parent, newid, pos=new_pos)
                     new_element.SetBestSize(parent.Scaling)
                 else:
                     new_element = element.Clone(parent)
@@ -751,20 +771,20 @@
                 if not isinstance(element, Wire):
                     parent.AddBlockInModel(element)
         return group
-    
+
     def CanAddBlocks(self, parent):
         valid = True
         for element in self.Elements:
             if not isinstance(element, Wire):
                 valid &= parent.CanAddElement(element)
         return valid
-    
+
     def IsVisible(self):
         for element in self.Elements:
             if element.IsVisible():
                 return True
         return False
-    
+
     # Refresh the list of wire excluded
     def RefreshWireExclusion(self):
         self.WireExcluded = []
@@ -774,9 +794,9 @@
                 endblock = element.EndConnected.GetParentBlock()
                 if startblock in self.Elements and endblock in self.Elements:
                     self.WireExcluded.append(element)
-    
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         rect = None
         for element in self.Elements:
             if rect is None:
@@ -784,41 +804,41 @@
             else:
                 rect = rect.Union(element.GetRedrawRect(movex, movey))
         return rect
-    
+
     # Clean this group of elements
     def Clean(self):
         # Clean all the elements of the group
         for element in self.Elements:
             element.Clean()
-    
+
     # Delete this group of elements
     def Delete(self):
         # Delete all the elements of the group
         for element in self.Elements:
             element.Delete()
         self.WireExcluded = []
-    
+
     # Returns if the point given is in the bounding box of one of the elements of this group
     def HitTest(self, pt, connectors=True):
         result = False
         for element in self.Elements:
             result |= element.HitTest(pt, connectors)
         return result
-    
+
     # Returns if the element given is in this group
     def IsElementIn(self, element):
         return element in self.Elements
-    
+
     # Change the elements of the group
     def SetElements(self, elements):
         self.Elements = elements
         self.RefreshWireExclusion()
         self.RefreshBoundingBox()
-    
+
     # Returns the elements of the group
     def GetElements(self):
         return self.Elements
-    
+
     # Align the group elements
     def AlignElements(self, horizontally, vertically):
         minx = self.BoundingBox.x + self.BoundingBox.width
@@ -841,24 +861,24 @@
                 if horizontally == ALIGN_LEFT:
                     movex = minx - posx
                 elif horizontally == ALIGN_CENTER:
-                    movex = (maxx + minx - width) / 2 - posx
+                    movex = (maxx + minx - width) // 2 - posx
                 elif horizontally == ALIGN_RIGHT:
                     movex = maxx - width - posx
                 if vertically == ALIGN_TOP:
                     movey = miny - posy
                 elif vertically == ALIGN_MIDDLE:
-                    movey = (maxy + miny - height) / 2 - posy
+                    movey = (maxy + miny - height) // 2 - posy
                 elif vertically == ALIGN_BOTTOM:
                     movey = maxy - height - posy
                 if movex != 0 or movey != 0:
                     element.Move(movex, movey)
                     element.RefreshModel()
         self.RefreshBoundingBox()
-    
+
     # Add the given element to the group of elements
     def AddElement(self, element):
         self.Elements.append(element)
-        
+
     # Remove or select the given element if it is or not in the group
     def SelectElement(self, element):
         if element in self.Elements:
@@ -867,7 +887,7 @@
             self.Elements.append(element)
         self.RefreshWireExclusion()
         self.RefreshBoundingBox()
-    
+
     # Move this group of elements
     def Move(self, movex, movey):
         movex = max(-self.BoundingBox.x, movex)
@@ -879,7 +899,7 @@
             elif element in self.WireExcluded:
                 element.Move(movex, movey, True)
         self.RefreshBoundingBox()
-    
+
     # Refreshes the bounding box of this group of elements
     def RefreshBoundingBox(self):
         if len(self.Elements) > 0:
@@ -900,9 +920,9 @@
         self.Size = wx.Size(self.BoundingBox.width, self.BoundingBox.height)
 
     # Forbids to change the group position
-    def SetPosition(x, y):
+    def SetPosition(self, x, y):
         pass
-    
+
     # Returns the position of this group
     def GetPosition(self, exclude_wires=False):
         if exclude_wires:
@@ -919,15 +939,15 @@
                 return 0, 0
             return posx, posy
         return self.BoundingBox.x, self.BoundingBox.y
-    
+
     # Forbids to change the group size
-    def SetSize(width, height):
+    def SetSize(self, width, height):
         pass
-    
+
     # Returns the size of this group
     def GetSize(self):
         return self.BoundingBox.width, self.BoundingBox.height
-    
+
     # Set size of the group elements to their minimum size
     def SetBestSize(self, scaling):
         max_movex = max_movey = 0
@@ -936,10 +956,10 @@
             max_movex = max(max_movex, movex)
             max_movey = max(max_movey, movey)
         return max_movex, max_movey
-    
+
     # Refreshes the group elements to move defined and handle selected
     def ProcessDragging(self, movex, movey, event, scaling):
-        handle_type, handle = self.Handle
+        handle_type, _handle = self.Handle
         # If it is a move handle, Move this group elements
         if handle_type == HANDLE_MOVE:
             movex = max(-self.BoundingBox.x, movex)
@@ -960,17 +980,17 @@
             self.Move(movex, movey)
             return movex, movey
         return 0, 0
-    
+
     # Change the variable that indicates if this element is highlighted
     def SetHighlighted(self, highlighted):
         for element in self.Elements:
             element.SetHighlighted(highlighted)
-    
+
     def HighlightPoint(self, pos):
         for element in self.Elements:
             if isinstance(element, Wire):
                 element.HighlightPoint(pos)
-    
+
     # Method called when a LeftDown event have been generated
     def OnLeftDown(self, event, dc, scaling):
         Graphic_Element.OnLeftDown(self, event, dc, scaling)
@@ -998,18 +1018,19 @@
         for element in self.Elements:
             element.Draw(dc)
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                         Connector for all types of blocks
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a connector for any type of block
-"""
+# -------------------------------------------------------------------------------
+
 
 class Connector(DebugDataConsumer, ToolTipProducer):
-    
+    """
+    Class that implements a connector for any type of block
+    """
+
     # Create a new connector
-    def __init__(self, parent, name, type, position, direction, negated = False, edge = "none", onlyone = False):
+    def __init__(self, parent, name, type, position, direction, negated=False, edge="none", onlyone=False):
         DebugDataConsumer.__init__(self)
         ToolTipProducer.__init__(self, parent.Parent)
         self.ParentBlock = parent
@@ -1033,15 +1054,15 @@
         self.Selected = False
         self.Highlights = []
         self.RefreshNameSize()
-    
+
     def Flush(self):
         self.ParentBlock = None
-        for wire, handle in self.Wires:
+        for wire, _handle in self.Wires:
             wire.Flush()
         self.Wires = []
-    
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         parent_pos = self.ParentBlock.GetPosition()
         x = min(parent_pos[0] + self.Pos.x, parent_pos[0] + self.Pos.x + self.Direction[0] * CONNECTOR_SIZE)
         y = min(parent_pos[1] + self.Pos.y, parent_pos[1] + self.Pos.y + self.Direction[1] * CONNECTOR_SIZE)
@@ -1060,43 +1081,44 @@
             if self.Edge == "rising" and self.Direction[1] == 1:
                 y -= 5
                 height += 5
-        rect =  wx.Rect(x - abs(movex), y - abs(movey), width + 2 * abs(movex), height + 2 * abs(movey))
-        if self.ValueSize is None and isinstance(self.ComputedValue, (StringType, UnicodeType)):
+        rect = wx.Rect(x - abs(movex), y - abs(movey), width + 2 * abs(movex), height + 2 * abs(movey))
+        if self.ValueSize is None and isinstance(self.ComputedValue, string_types):
             self.ValueSize = self.ParentBlock.Parent.GetMiniTextExtent(self.ComputedValue)
         if self.ValueSize is not None:
             width, height = self.ValueSize
-            rect = rect.Union(wx.Rect(
-                    parent_pos[0] + self.Pos.x + CONNECTOR_SIZE * self.Direction[0] + \
-                                    width * (self.Direction[0] - 1) / 2,
-                    parent_pos[1] + self.Pos.y + CONNECTOR_SIZE * self.Direction[1] + \
-                                    height * (self.Direction[1] - 1),
+            rect = rect.Union(
+                wx.Rect(
+                    parent_pos[0] + self.Pos.x + CONNECTOR_SIZE * self.Direction[0] +
+                    width * (self.Direction[0] - 1) // 2,
+                    parent_pos[1] + self.Pos.y + CONNECTOR_SIZE * self.Direction[1] +
+                    height * (self.Direction[1] - 1),
                     width, height))
         return rect
-    
+
     # Change the connector selection
     def SetSelected(self, selected):
         self.Selected = selected
-    
+
     # Make a clone of the connector
-    def Clone(self, parent = None):
+    def Clone(self, parent=None):
         if parent is None:
             parent = self.ParentBlock
         return Connector(parent, self.Name, self.Type, wx.Point(self.Pos[0], self.Pos[1]),
-                self.Direction, self.Negated)
-    
+                         self.Direction, self.Negated)
+
     # Returns the connector parent block
     def GetParentBlock(self):
         return self.ParentBlock
-    
+
     # Returns the connector type
-    def GetType(self, raw = False):
+    def GetType(self, raw=False):
         if self.ParentBlock.IsEndType(self.Type) or raw:
             return self.Type
         elif (self.Negated or self.Edge != "none") and self.ParentBlock.IsOfType("BOOL", self.Type):
             return "BOOL"
         else:
             return self.ParentBlock.GetConnectionResultType(self, self.Type)
-    
+
     # Returns the connector type
     def GetConnectedType(self):
         if self.ParentBlock.IsEndType(self.Type):
@@ -1104,32 +1126,32 @@
         elif len(self.Wires) == 1:
             return self.Wires[0][0].GetOtherConnectedType(self.Wires[0][1])
         return self.Type
-    
+
     # Returns the connector type
     def GetConnectedRedrawRect(self, movex, movey):
         rect = None
-        for wire, handle in self.Wires:
+        for wire, _handle in self.Wires:
             if rect is None:
                 rect = wire.GetRedrawRect()
             else:
                 rect = rect.Union(wire.GetRedrawRect())
         return rect
-    
+
     # Returns if connector type is compatible with type given
     def IsCompatible(self, type):
         reference = self.GetType()
         return self.ParentBlock.IsOfType(type, reference) or self.ParentBlock.IsOfType(reference, type)
-    
+
     # Changes the connector name
     def SetType(self, type):
         self.Type = type
-        for wire, handle in self.Wires:
+        for wire, _handle in self.Wires:
             wire.SetValid(wire.IsConnectedCompatible())
-    
+
     # Returns the connector name
     def GetName(self):
         return self.Name
-    
+
     # Changes the connector name
     def SetName(self, name):
         self.Name = name
@@ -1140,15 +1162,15 @@
             self.Forced = forced
             if self.Visible:
                 self.Parent.ElementNeedRefresh(self)
-    
+
     def GetComputedValue(self):
-        if self.Value is not None and self.Value != "undefined" and not isinstance(self.Value, BooleanType):
+        if self.Value is not None and self.Value != "undefined" and not isinstance(self.Value, bool):
             return self.Value
         return None
-    
+
     def GetToolTipValue(self):
         return self.GetComputedValue()
-    
+
     def SetValue(self, value):
         if self.Value != value:
             self.Value = value
@@ -1161,59 +1183,59 @@
             self.ValueSize = None
             if self.ParentBlock.Visible:
                 self.ParentBlock.Parent.ElementNeedRefresh(self)
-    
+
     def RefreshForced(self):
         self.Forced = False
-        for wire, handle in self.Wires:
+        for wire, _handle in self.Wires:
             self.Forced |= wire.IsForced()
 
     def RefreshValue(self):
         self.Value = self.ReceivingCurrent()
-    
+
     def RefreshValid(self):
         self.Valid = True
-        for wire, handle in self.Wires:
+        for wire, _handle in self.Wires:
             self.Valid &= wire.GetValid()
-    
+
     def ReceivingCurrent(self):
         current = False
-        for wire, handle in self.Wires:
+        for wire, _handle in self.Wires:
             value = wire.GetValue()
-            if current != "undefined" and isinstance(value, BooleanType):
+            if current != "undefined" and isinstance(value, bool):
                 current |= wire.GetValue()
             elif value == "undefined":
                 current = "undefined"
         return current
-    
+
     def SpreadCurrent(self, spreading):
-        for wire, handle in self.Wires:
+        for wire, _handle in self.Wires:
             wire.SetValue(spreading)
-    
+
     # Changes the connector name size
     def RefreshNameSize(self):
         if self.Name != "":
             self.NameSize = self.ParentBlock.Parent.GetTextExtent(self.Name)
         else:
             self.NameSize = 0, 0
-    
+
     # Returns the connector name size
     def GetNameSize(self):
         return self.NameSize
-    
+
     # Returns the wires connected to the connector
     def GetWires(self):
         return self.Wires
-    
+
     # Returns the parent block Id
     def GetBlockId(self):
         return self.ParentBlock.GetId()
-    
+
     # Returns the connector relative position
     def GetRelPosition(self):
         return self.Pos
-    
+
     # Returns the connector absolute position
-    def GetPosition(self, size = True):
+    def GetPosition(self, size=True):
         parent_pos = self.ParentBlock.GetPosition()
         # If the position of the end of the connector is asked
         if size:
@@ -1223,25 +1245,25 @@
             x = parent_pos[0] + self.Pos.x
             y = parent_pos[1] + self.Pos.y
         return wx.Point(x, y)
-    
+
     # Change the connector relative position
     def SetPosition(self, pos):
         self.Pos = pos
-    
+
     # Returns the connector direction
     def GetDirection(self):
         return self.Direction
-    
+
     # Change the connector direction
     def SetDirection(self, direction):
         self.Direction = direction
-    
+
     # Connect a wire to this connector at the last place
-    def Connect(self, wire, refresh = True):
+    def Connect(self, wire, refresh=True):
         self.InsertConnect(len(self.Wires), wire, refresh)
-    
+
     # Connect a wire to this connector at the place given
-    def InsertConnect(self, idx, wire, refresh = True):
+    def InsertConnect(self, idx, wire, refresh=True):
         if wire not in self.Wires:
             self.Wires.insert(idx, wire)
             if wire[1] == 0:
@@ -1250,16 +1272,16 @@
                 wire[0].ConnectEndPoint(None, self)
             if refresh:
                 self.ParentBlock.RefreshModel(False)
-    
+
     # Returns the index of the wire given in the list of connected
     def GetWireIndex(self, wire):
-        for i, (tmp_wire, handle) in enumerate(self.Wires):
+        for i, (tmp_wire, _handle) in enumerate(self.Wires):
             if tmp_wire == wire:
                 return i
         return None
-    
+
     # Unconnect a wire or all wires connected to the connector
-    def UnConnect(self, wire = None, unconnect = True, delete = False):
+    def UnConnect(self, wire=None, unconnect=True, delete=False):
         i = 0
         found = False
         while i < len(self.Wires) and not found:
@@ -1281,13 +1303,13 @@
         if not delete:
             self.RefreshValid()
             self.ParentBlock.RefreshModel(False)
-    
+
     # Returns if connector has one or more wire connected
     def IsConnected(self):
         return len(self.Wires) > 0
-    
+
     # Move the wires connected
-    def MoveConnected(self, exclude = []):
+    def MoveConnected(self, exclude=None):
         if len(self.Wires) > 0:
             # Calculate the new position of the end point
             parent_pos = self.ParentBlock.GetPosition()
@@ -1295,26 +1317,26 @@
             y = parent_pos[1] + self.Pos.y + self.Direction[1] * CONNECTOR_SIZE
             # Move the corresponding point on all the wires connected
             for wire, index in self.Wires:
-                if wire not in exclude:
+                if (exclude is None) or (wire not in exclude):
                     if index == 0:
                         wire.MoveStartPoint(wx.Point(x, y))
                     else:
                         wire.MoveEndPoint(wx.Point(x, y))
-    
+
     # Refreshes the model of all the wires connected
     def RefreshWires(self):
         for wire in self.Wires:
             wire[0].RefreshModel()
-    
+
     # Refreshes the parent block model
     def RefreshParentBlock(self):
         self.ParentBlock.RefreshModel(False)
-    
+
     # Highlight the parent block
     def HighlightParentBlock(self, highlight):
         self.ParentBlock.SetHighlighted(highlight)
         self.ParentBlock.Refresh()
-    
+
     # Returns all the blocks connected to this connector
     def GetConnectedBlocks(self):
         blocks = []
@@ -1330,44 +1352,44 @@
                 if block not in blocks:
                     blocks.append(block)
         return blocks
-    
+
     # Returns the connector negated property
     def IsNegated(self):
         return self.Negated
-    
+
     # Changes the connector negated property
     def SetNegated(self, negated):
         if self.ParentBlock.IsOfType("BOOL", self.Type):
             self.Negated = negated
             self.Edge = "none"
-    
+
     # Returns the connector edge property
     def GetEdge(self):
         return self.Edge
-    
+
     # Changes the connector edge property
     def SetEdge(self, edge):
         if self.ParentBlock.IsOfType("BOOL", self.Type):
-            self.Edge = edge    
+            self.Edge = edge
             self.Negated = False
-    
+
     # assume that pointer is already inside of this connector
     def ConnectionAvailable(self, direction=None, exclude=True):
         wire_nums = len(self.Wires)
-        
-        connector_free = (wire_nums<= 0)
+
+        connector_free = (wire_nums <= 0)
         connector_max_used = ((wire_nums > 0) and self.OneConnected)
         if (self.Parent.CurrentLanguage in ["SFC", "LD"]) and (self.Type == "BOOL"):
-            connector_max_used = False;
+            connector_max_used = False
 
         # connector is available for new connection
-        connect  = connector_free or not connector_max_used
+        connect = connector_free or not connector_max_used
         return connect, connector_max_used
-                           
+
     # Tests if the point given is near from the end point of this connector
     def TestPoint(self, pt, direction=None, exclude=True):
-        inside = False;
-        check_point = (not exclude) and (direction is None or self.Direction == direction);
+        inside = False
+        check_point = (not exclude) and (direction is None or self.Direction == direction)
 
         if check_point:
             # Calculate a square around the end point of this connector
@@ -1377,10 +1399,10 @@
             width = ANCHOR_DISTANCE * 2 + abs(self.Direction[0]) * CONNECTOR_SIZE
             height = ANCHOR_DISTANCE * 2 + abs(self.Direction[1]) * CONNECTOR_SIZE
             rect = wx.Rect(x, y, width, height)
-            inside = rect.InsideXY(pt.x, pt.y);
-                           
+            inside = rect.InsideXY(pt.x, pt.y)
+
         return inside
-    
+
     # Draws the highlightment of this element if it is highlighted
     def DrawHighlightment(self, dc):
         scalex, scaley = dc.GetUserScale()
@@ -1391,9 +1413,7 @@
         dc.SetBrush(wx.Brush(HIGHLIGHTCOLOR))
         dc.SetLogicalFunction(wx.AND)
         parent_pos = self.ParentBlock.GetPosition()
-        posx = parent_pos[0] + self.Pos.x
-        posy = parent_pos[1] + self.Pos.y
-        xstart = parent_pos[0] + self.Pos.x 
+        xstart = parent_pos[0] + self.Pos.x
         ystart = parent_pos[1] + self.Pos.y
         if self.Direction[0] < 0:
             xstart += 1
@@ -1401,18 +1421,18 @@
             ystart += 1
         xend = xstart + CONNECTOR_SIZE * self.Direction[0]
         yend = ystart + CONNECTOR_SIZE * self.Direction[1]
-        dc.DrawLine(round((xstart + self.Direction[0]) * scalex), round((ystart + self.Direction[1]) * scaley), 
+        dc.DrawLine(round((xstart + self.Direction[0]) * scalex), round((ystart + self.Direction[1]) * scaley),
                     round(xend * scalex), round(yend * scaley))
         dc.SetLogicalFunction(wx.COPY)
         dc.SetUserScale(scalex, scaley)
-    
+
     # Adds an highlight to the connector
     def AddHighlight(self, infos, start, end, highlight_type):
         if highlight_type == ERROR_HIGHLIGHT:
-            for wire, handle in self.Wires:
+            for wire, _handle in self.Wires:
                 wire.SetValid(False)
         AddHighlight(self.Highlights, (start, end, highlight_type))
-    
+
     # Removes an highlight from the connector
     def RemoveHighlight(self, infos, start, end, highlight_type):
         error = False
@@ -1423,9 +1443,9 @@
                 error |= highlight == ERROR_HIGHLIGHT
         self.Highlights = highlights
         if not error:
-            for wire, handle in self.Wires:
+            for wire, _handle in self.Wires:
                 wire.SetValid(wire.IsConnectedCompatible())
-    
+
     # Removes all the highlights of one particular type from the connector
     def ClearHighlight(self, highlight_type=None):
         error = False
@@ -1439,21 +1459,21 @@
                     error |= highlight == ERROR_HIGHLIGHT
             self.Highlights = highlights
         if not error:
-            for wire, handle in self.Wires:
+            for wire, _handle in self.Wires:
                 wire.SetValid(wire.IsConnectedCompatible())
-    
+
     # Draws the connector
     def Draw(self, dc):
         if self.Selected:
             dc.SetPen(MiterPen(wx.BLUE, 3))
             dc.SetBrush(wx.WHITE_BRUSH)
-        #elif len(self.Highlights) > 0:
+        # elif len(self.Highlights) > 0:
         #    dc.SetPen(MiterPen(self.Highlights[-1][1]))
         #    dc.SetBrush(wx.Brush(self.Highlights[-1][0]))
         else:
             if not self.Valid:
                 dc.SetPen(MiterPen(wx.RED))
-            elif isinstance(self.Value, BooleanType) and self.Value:
+            elif isinstance(self.Value, bool) and self.Value:
                 if self.Forced:
                     dc.SetPen(MiterPen(wx.CYAN))
                 else:
@@ -1466,19 +1486,19 @@
                 dc.SetPen(MiterPen(wx.BLACK))
             dc.SetBrush(wx.WHITE_BRUSH)
         parent_pos = self.ParentBlock.GetPosition()
-        
+
         if getattr(dc, "printing", False):
             name_size = dc.GetTextExtent(self.Name)
         else:
             name_size = self.NameSize
-        
+
         if self.Negated:
             # If connector is negated, draw a circle
-            xcenter = parent_pos[0] + self.Pos.x + (CONNECTOR_SIZE * self.Direction[0]) / 2
-            ycenter = parent_pos[1] + self.Pos.y + (CONNECTOR_SIZE * self.Direction[1]) / 2
-            dc.DrawCircle(xcenter, ycenter, CONNECTOR_SIZE / 2)
+            xcenter = parent_pos[0] + self.Pos.x + (CONNECTOR_SIZE * self.Direction[0]) // 2
+            ycenter = parent_pos[1] + self.Pos.y + (CONNECTOR_SIZE * self.Direction[1]) // 2
+            dc.DrawCircle(xcenter, ycenter, CONNECTOR_SIZE // 2)
         else:
-            xstart = parent_pos[0] + self.Pos.x 
+            xstart = parent_pos[0] + self.Pos.x
             ystart = parent_pos[1] + self.Pos.y
             if self.Edge == "rising":
                 # If connector has a rising edge, draw a right arrow
@@ -1501,13 +1521,13 @@
                 yend = ystart + CONNECTOR_SIZE * self.Direction[1]
                 dc.DrawLine(xstart + self.Direction[0], ystart + self.Direction[1], xend, yend)
         if self.Direction[0] != 0:
-            ytext = parent_pos[1] + self.Pos.y - name_size[1] / 2
+            ytext = parent_pos[1] + self.Pos.y - name_size[1] // 2
             if self.Direction[0] < 0:
                 xtext = parent_pos[0] + self.Pos.x + 5
             else:
                 xtext = parent_pos[0] + self.Pos.x - (name_size[0] + 5)
         if self.Direction[1] != 0:
-            xtext = parent_pos[0] + self.Pos.x - name_size[0] / 2
+            xtext = parent_pos[0] + self.Pos.x - name_size[0] // 2
             if self.Direction[1] < 0:
                 ytext = parent_pos[1] + self.Pos.y + 5
             else:
@@ -1517,33 +1537,34 @@
         if not getattr(dc, "printing", False):
             DrawHighlightedText(dc, self.Name, self.Highlights, xtext, ytext)
 
-        if self.Value is not None and not isinstance(self.Value, BooleanType) and self.Value != "undefined":
+        if self.Value is not None and not isinstance(self.Value, bool) and self.Value != "undefined":
             dc.SetFont(self.ParentBlock.Parent.GetMiniFont())
             dc.SetTextForeground(wx.NamedColour("purple"))
-            if self.ValueSize is None and isinstance(self.ComputedValue, (StringType, UnicodeType)):
+            if self.ValueSize is None and isinstance(self.ComputedValue, string_types):
                 self.ValueSize = self.ParentBlock.Parent.GetMiniTextExtent(self.ComputedValue)
             if self.ValueSize is not None:
                 width, height = self.ValueSize
-                dc.DrawText(self.ComputedValue, 
-                    parent_pos[0] + self.Pos.x + CONNECTOR_SIZE * self.Direction[0] + \
-                                    width * (self.Direction[0] - 1) / 2,
-                    parent_pos[1] + self.Pos.y + CONNECTOR_SIZE * self.Direction[1] + \
-                                    height * (self.Direction[1] - 1))
+                dc.DrawText(self.ComputedValue,
+                            parent_pos[0] + self.Pos.x + CONNECTOR_SIZE * self.Direction[0] +
+                            width * (self.Direction[0] - 1) // 2,
+                            parent_pos[1] + self.Pos.y + CONNECTOR_SIZE * self.Direction[1] +
+                            height * (self.Direction[1] - 1))
             dc.SetFont(self.ParentBlock.Parent.GetFont())
             dc.SetTextForeground(wx.BLACK)
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                           Common Wire Element
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a wire for connecting two blocks
-"""
+# -------------------------------------------------------------------------------
+
 
 class Wire(Graphic_Element, DebugDataConsumer):
-    
+    """
+    Class that implements a wire for connecting two blocks
+    """
+
     # Create a new wire
-    def __init__(self, parent, start = None, end = None):
+    def __init__(self, parent, start=None, end=None):
         Graphic_Element.__init__(self, parent)
         DebugDataConsumer.__init__(self)
         self.StartPoint = start
@@ -1568,47 +1589,48 @@
         self.ComputingType = False
         self.Font = parent.GetMiniFont()
         self.ErrHighlight = False
-    
+
     def GetDefinition(self):
         if self.StartConnected is not None and self.EndConnected is not None:
             startblock = self.StartConnected.GetParentBlock()
             endblock = self.EndConnected.GetParentBlock()
             return [], [(startblock.GetId(), endblock.GetId())]
         return [], []
-    
+
     def Flush(self):
         self.StartConnected = None
         self.EndConnected = None
-    
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         rect = Graphic_Element.GetRedrawRect(self, movex, movey)
         if self.StartConnected:
             rect = rect.Union(self.StartConnected.GetRedrawRect(movex, movey))
         if self.EndConnected:
             rect = rect.Union(self.EndConnected.GetRedrawRect(movex, movey))
-        if self.ValueSize is None and isinstance(self.ComputedValue, (StringType, UnicodeType)):
+        if self.ValueSize is None and isinstance(self.ComputedValue, string_types):
             self.ValueSize = self.Parent.GetMiniTextExtent(self.ComputedValue)
         if self.ValueSize is not None:
             width, height = self.ValueSize
             if self.BoundingBox[2] > width * 4 or self.BoundingBox[3] > height * 4:
-                x = self.Points[0].x + width * self.StartPoint[1][0] / 2
+                x = self.Points[0].x + width * self.StartPoint[1][0] // 2
                 y = self.Points[0].y + height * (self.StartPoint[1][1] - 1)
                 rect = rect.Union(wx.Rect(x, y, width, height))
-                x = self.Points[-1].x + width * self.EndPoint[1][0] / 2
+                x = self.Points[-1].x + width * self.EndPoint[1][0] // 2
                 y = self.Points[-1].y + height * (self.EndPoint[1][1] - 1)
                 rect = rect.Union(wx.Rect(x, y, width, height))
             else:
-                middle = len(self.Segments) / 2 + len(self.Segments) % 2 - 1
-                x = (self.Points[middle].x + self.Points[middle + 1].x - width) / 2
+                middle = len(self.Segments) // 2 + len(self.Segments) % 2 - 1
+                x = (self.Points[middle].x + self.Points[middle + 1].x - width) // 2
                 if self.BoundingBox[3] > height and self.Segments[middle] in [NORTH, SOUTH]:
-                    y = (self.Points[middle].y + self.Points[middle + 1].y - height) / 2
+                    y = (self.Points[middle].y + self.Points[middle + 1].y - height) // 2
                 else:
                     y = self.Points[middle].y - height
                 rect = rect.Union(wx.Rect(x, y, width, height))
         return rect
-    
-    def Clone(self, parent, connectors = {}, dx = 0, dy = 0):
+
+    def Clone(self, parent, connectors=None, dx=0, dy=0):
+        connectors = {} if connectors is None else connectors
         start_connector = connectors.get(self.StartConnected, None)
         end_connector = connectors.get(self.EndConnected, None)
         if start_connector is not None and end_connector is not None:
@@ -1620,18 +1642,15 @@
             wire.ConnectEndPoint(end_connector.GetPosition(), end_connector)
             return wire
         return None
-    
+
     # Forbids to change the wire position
-    def SetPosition(x, y):
+    def SetPosition(self, x, y):
         pass
-    
+
     # Forbids to change the wire size
-    def SetSize(width, height):
+    def SetSize(self, width, height):
         pass
-    
-    # Forbids to et size of the group elements to their minimum size
-        pass
-    
+
     # Moves and Resizes the element for fitting scaling
     def SetBestSize(self, scaling):
         if scaling is not None:
@@ -1664,11 +1683,11 @@
                     point.y += movey
             return movex_max, movey_max
         return 0, 0
-    
+
     # Returns connector to which start point is connected
     def GetStartConnected(self):
         return self.StartConnected
-    
+
     # Returns connector to which start point is connected
     def GetStartConnectedType(self):
         if self.StartConnected and not self.ComputingType:
@@ -1677,11 +1696,11 @@
             self.ComputingType = False
             return computed_type
         return None
-    
+
     # Returns connector to which end point is connected
     def GetEndConnected(self):
         return self.EndConnected
-    
+
     # Returns connector to which end point is connected
     def GetEndConnectedType(self):
         if self.EndConnected and not self.ComputingType:
@@ -1690,7 +1709,7 @@
             self.ComputingType = False
             return computed_type
         return None
-    
+
     def GetConnectionDirection(self):
         if self.StartConnected is None and self.EndConnected is None:
             return None
@@ -1707,26 +1726,26 @@
                 else:
                     return (-self.StartPoint[1][0], -self.StartPoint[1][1])
         return None
-    
+
     def GetOtherConnected(self, connector):
         if self.StartConnected == connector:
             return self.EndConnected
         else:
             return self.StartConnected
-    
+
     def GetOtherConnectedType(self, handle):
         if handle == 0:
             return self.GetEndConnectedType()
         else:
             return self.GetStartConnectedType()
-    
+
     def IsConnectedCompatible(self):
         if self.StartConnected:
             return self.StartConnected.IsCompatible(self.GetEndConnectedType())
         elif self.EndConnected:
             return True
         return False
-    
+
     def SetForced(self, forced):
         if self.Forced != forced:
             self.Forced = forced
@@ -1738,10 +1757,10 @@
                 self.Parent.ElementNeedRefresh(self)
 
     def GetComputedValue(self):
-        if self.Value is not None and self.Value != "undefined" and not isinstance(self.Value, BooleanType):
+        if self.Value is not None and self.Value != "undefined" and not isinstance(self.Value, bool):
             return self.Value
         return None
-    
+
     def GetToolTipValue(self):
         return self.GetComputedValue()
 
@@ -1770,28 +1789,28 @@
                 self.EndConnected.RefreshValue()
             if self.Visible:
                 self.Parent.ElementNeedRefresh(self)
-            if isinstance(value, BooleanType) and self.StartConnected is not None:
+            if isinstance(value, bool) and self.StartConnected is not None:
                 block = self.StartConnected.GetParentBlock()
                 block.SpreadCurrent()
-    
+
     # Unconnect the start and end points
     def Clean(self):
         if self.StartConnected:
             self.UnConnectStartPoint()
         if self.EndConnected:
             self.UnConnectEndPoint()
-    
+
     # Delete this wire by calling the corresponding method
     def Delete(self):
         self.Parent.DeleteWire(self)
-    
+
     # Select a segment and not the whole wire. It's useful for Ladder Diagram
     def SetSelectedSegment(self, segment):
         # The last segment is indicated
         if segment == -1:
             segment = len(self.Segments) - 1
         # The selected segment is reinitialised
-        if segment == None:
+        if segment is None:
             if self.StartConnected:
                 self.StartConnected.SetSelected(False)
             if self.EndConnected:
@@ -1814,17 +1833,17 @@
                 self.EndConnected.SetSelected(True)
         self.SelectedSegment = segment
         self.Refresh()
-    
+
     def SetValid(self, valid):
         self.Valid = valid
         if self.StartConnected:
             self.StartConnected.RefreshValid()
         if self.EndConnected:
             self.EndConnected.RefreshValid()
-    
+
     def GetValid(self):
         return self.Valid
-    
+
     # Reinitialize the wire points
     def ResetPoints(self):
         if self.StartPoint and self.EndPoint:
@@ -1833,7 +1852,7 @@
         else:
             self.Points = []
             self.Segments = []
-    
+
     # Refresh the wire bounding box
     def RefreshBoundingBox(self):
         if len(self.Points) > 0:
@@ -1862,7 +1881,7 @@
             self.Pos.x, self.Pos.y = minx, miny
             self.Size = wx.Size(maxx - minx, maxy - miny)
             self.BoundingBox = wx.Rect(minbbxx, minbbxy, maxbbxx - minbbxx + 1, maxbbxy - minbbxy + 1)
-    
+
     # Refresh the realpoints that permits to keep the proportionality in wire during resizing
     def RefreshRealPoints(self):
         if len(self.Points) > 0:
@@ -1870,8 +1889,8 @@
             # Calculate float relative position of each point with the minimum point
             for point in self.Points:
                 self.RealPoints.append([float(point.x - self.Pos.x), float(point.y - self.Pos.y)])
-    
-    # Returns the wire minimum size 
+
+    # Returns the wire minimum size
     def GetMinSize(self):
         width = 1
         height = 1
@@ -1893,7 +1912,7 @@
             width = MIN_SEGMENT_SIZE
             height = MIN_SEGMENT_SIZE
         return width + 1, height + 1
-    
+
     # Returns if the point given is on one of the wire segments
     def HitTest(self, pt, connectors=True):
         test = False
@@ -1903,7 +1922,7 @@
                 x1 = self.Points[i].x - self.Segments[0][0] * CONNECTOR_SIZE
                 y1 = self.Points[i].y - self.Segments[0][1] * CONNECTOR_SIZE
             else:
-                x1, y1 = self.Points[i].x, self.Points[i].y    
+                x1, y1 = self.Points[i].x, self.Points[i].y
             if i == len(self.Points) - 2 and self.EndConnected is not None:
                 x2 = self.Points[i + 1].x + self.Segments[-1][0] * CONNECTOR_SIZE
                 y2 = self.Points[i + 1].y + self.Segments[-1][1] * CONNECTOR_SIZE
@@ -1911,25 +1930,25 @@
                 x2, y2 = self.Points[i + 1].x, self.Points[i + 1].y
             # Calculate a rectangle around the segment
             rect = wx.Rect(min(x1, x2) - ANCHOR_DISTANCE, min(y1, y2) - ANCHOR_DISTANCE,
-                abs(x1 - x2) + 2 * ANCHOR_DISTANCE, abs(y1 - y2) + 2 * ANCHOR_DISTANCE)
-            test |= rect.InsideXY(pt.x, pt.y) 
+                           abs(x1 - x2) + 2 * ANCHOR_DISTANCE, abs(y1 - y2) + 2 * ANCHOR_DISTANCE)
+            test |= rect.InsideXY(pt.x, pt.y)
         return test
-    
-    # Returns the wire start or end point if the point given is on one of them 
+
+    # Returns the wire start or end point if the point given is on one of them
     def TestPoint(self, pt):
         # Test the wire start point
         rect = wx.Rect(self.Points[0].x - ANCHOR_DISTANCE, self.Points[0].y - ANCHOR_DISTANCE,
-            2 * ANCHOR_DISTANCE, 2 * ANCHOR_DISTANCE)
+                       2 * ANCHOR_DISTANCE, 2 * ANCHOR_DISTANCE)
         if rect.InsideXY(pt.x, pt.y):
             return 0
         # Test the wire end point
         if len(self.Points) > 1:
             rect = wx.Rect(self.Points[-1].x - ANCHOR_DISTANCE, self.Points[-1].y - ANCHOR_DISTANCE,
-                2 * ANCHOR_DISTANCE, 2 * ANCHOR_DISTANCE)
+                           2 * ANCHOR_DISTANCE, 2 * ANCHOR_DISTANCE)
             if rect.InsideXY(pt.x, pt.y):
                 return -1
         return None
-    
+
     # Returns the wire segment if the point given is on it
     def TestSegment(self, pt, all=False):
         for i in xrange(len(self.Segments)):
@@ -1939,11 +1958,11 @@
                 x2, y2 = self.Points[i + 1].x, self.Points[i + 1].y
                 # Calculate a rectangle around the segment
                 rect = wx.Rect(min(x1, x2) - ANCHOR_DISTANCE, min(y1, y2) - ANCHOR_DISTANCE,
-                    abs(x1 - x2) + 2 * ANCHOR_DISTANCE, abs(y1 - y2) + 2 * ANCHOR_DISTANCE)
+                               abs(x1 - x2) + 2 * ANCHOR_DISTANCE, abs(y1 - y2) + 2 * ANCHOR_DISTANCE)
                 if rect.InsideXY(pt.x, pt.y):
                     return i, self.Segments[i]
         return None
-    
+
     # Define the wire points
     def SetPoints(self, points, verify=True):
         if len(points) > 1:
@@ -1952,10 +1971,10 @@
             self.StartPoint = [None, vector(self.Points[0], self.Points[1])]
             self.EndPoint = [None, vector(self.Points[-1], self.Points[-2])]
             # Calculate the start and end points
-            self.StartPoint[0] = wx.Point(self.Points[0].x + CONNECTOR_SIZE * self.StartPoint[1][0], 
-                self.Points[0].y + CONNECTOR_SIZE * self.StartPoint[1][1])
-            self.EndPoint[0] = wx.Point(self.Points[-1].x + CONNECTOR_SIZE * self.EndPoint[1][0], 
-                self.Points[-1].y + CONNECTOR_SIZE * self.EndPoint[1][1])
+            self.StartPoint[0] = wx.Point(self.Points[0].x + CONNECTOR_SIZE * self.StartPoint[1][0],
+                                          self.Points[0].y + CONNECTOR_SIZE * self.StartPoint[1][1])
+            self.EndPoint[0] = wx.Point(self.Points[-1].x + CONNECTOR_SIZE * self.EndPoint[1][0],
+                                        self.Points[-1].y + CONNECTOR_SIZE * self.EndPoint[1][1])
             self.Points[0] = self.StartPoint[0]
             self.Points[-1] = self.EndPoint[0]
             # Calculate the segments directions
@@ -1965,7 +1984,7 @@
                 if verify and 0 < i < len(self.Points) - 2 and \
                    self.Points[i] == self.Points[i + 1] and \
                    self.Segments[-1] == vector(self.Points[i + 1], self.Points[i + 2]):
-                    for j in xrange(2):
+                    for dummy in xrange(2):
                         self.Points.pop(i)
                 else:
                     segment = vector(self.Points[i], self.Points[i + 1])
@@ -1979,37 +1998,37 @@
                     i += 1
             self.RefreshBoundingBox()
             self.RefreshRealPoints()
-    
+
     # Returns the position of the point indicated
     def GetPoint(self, index):
         if index < len(self.Points):
             return self.Points[index].x, self.Points[index].y
         return None
-    
+
     # Returns a list of the position of all wire points
-    def GetPoints(self, invert = False):
+    def GetPoints(self, invert=False):
         points = self.VerifyPoints()
-        points[0] = wx.Point(points[0].x - CONNECTOR_SIZE * self.StartPoint[1][0], 
-                points[0].y - CONNECTOR_SIZE * self.StartPoint[1][1])
-        points[-1] = wx.Point(points[-1].x - CONNECTOR_SIZE * self.EndPoint[1][0], 
-                points[-1].y - CONNECTOR_SIZE * self.EndPoint[1][1])
+        points[0] = wx.Point(points[0].x - CONNECTOR_SIZE * self.StartPoint[1][0],
+                             points[0].y - CONNECTOR_SIZE * self.StartPoint[1][1])
+        points[-1] = wx.Point(points[-1].x - CONNECTOR_SIZE * self.EndPoint[1][0],
+                              points[-1].y - CONNECTOR_SIZE * self.EndPoint[1][1])
         # An inversion of the list is asked
         if invert:
             points.reverse()
         return points
-    
+
     # Returns the position of the two selected segment points
     def GetSelectedSegmentPoints(self):
-        if self.SelectedSegment != None and len(self.Points) > 1:
+        if self.SelectedSegment is not None and len(self.Points) > 1:
             return self.Points[self.SelectedSegment:self.SelectedSegment + 2]
         return []
-    
+
     # Returns if the selected segment is the first and/or the last of the wire
     def GetSelectedSegmentConnections(self):
-        if self.SelectedSegment != None and len(self.Points) > 1:
+        if self.SelectedSegment is not None and len(self.Points) > 1:
             return self.SelectedSegment == 0, self.SelectedSegment == len(self.Segments) - 1
         return (True, True)
-    
+
     # Returns the connectors on which the wire is connected
     def GetConnected(self):
         connected = []
@@ -2018,7 +2037,7 @@
         if self.EndConnected and self.EndPoint[1] == WEST:
             connected.append(self.EndConnected)
         return connected
-    
+
     # Returns the id of the block connected to the first or the last wire point
     def GetConnectedInfos(self, index):
         if index == 0 and self.StartConnected:
@@ -2026,15 +2045,15 @@
         elif index == -1 and self.EndConnected:
             return self.EndConnected.GetBlockId(), self.EndConnected.GetName()
         return None
-    
+
     # Update the wire points position by keeping at most possible the current positions
-    def GeneratePoints(self, realpoints = True):
+    def GeneratePoints(self, realpoints=True):
         i = 0
         # Calculate the start enad end points with the minimum segment size in the right direction
         end = wx.Point(self.EndPoint[0].x + self.EndPoint[1][0] * MIN_SEGMENT_SIZE,
-            self.EndPoint[0].y + self.EndPoint[1][1] * MIN_SEGMENT_SIZE)
-        start = wx.Point(self.StartPoint[0].x + self.StartPoint[1][0] * MIN_SEGMENT_SIZE, 
-            self.StartPoint[0].y + self.StartPoint[1][1] * MIN_SEGMENT_SIZE)
+                       self.EndPoint[0].y + self.EndPoint[1][1] * MIN_SEGMENT_SIZE)
+        start = wx.Point(self.StartPoint[0].x + self.StartPoint[1][0] * MIN_SEGMENT_SIZE,
+                         self.StartPoint[0].y + self.StartPoint[1][1] * MIN_SEGMENT_SIZE)
         # Evaluate the point till it's the last
         while i < len(self.Points) - 1:
             # The next point is the last
@@ -2046,15 +2065,17 @@
                     # If the end point is not in the start direction, a point is added
                     if v_end != self.Segments[0] or v_end == self.EndPoint[1]:
                         self.Points.insert(1, wx.Point(start.x, start.y))
-                        self.Segments.insert(1, DirectionChoice((self.Segments[0][1], 
-                            self.Segments[0][0]), v_end, self.EndPoint[1]))
+                        self.Segments.insert(1, DirectionChoice(
+                            (self.Segments[0][1],
+                             self.Segments[0][0]), v_end, self.EndPoint[1]))
                 # The current point is the second
                 elif i == 1:
                     # The previous direction and the target direction are mainly opposed, a point is added
                     if product(v_end, self.Segments[0]) < 0:
                         self.Points.insert(2, wx.Point(self.Points[1].x, self.Points[1].y))
-                        self.Segments.insert(2, DirectionChoice((self.Segments[1][1], 
-                            self.Segments[1][0]), v_end, self.EndPoint[1]))
+                        self.Segments.insert(2, DirectionChoice(
+                            (self.Segments[1][1],
+                             self.Segments[1][0]), v_end, self.EndPoint[1]))
                     # The previous direction and the end direction are the same or they are
                     # perpendiculars and the end direction points towards current segment
                     elif product(self.Segments[0], self.EndPoint[1]) >= 0 and product(self.Segments[1], self.EndPoint[1]) <= 0:
@@ -2066,18 +2087,20 @@
                         # If the previous direction and the end direction are the same, a point is added
                         if product(self.Segments[0], self.EndPoint[1]) > 0:
                             self.Points.insert(2, wx.Point(self.Points[1].x, self.Points[1].y))
-                            self.Segments.insert(2, DirectionChoice((self.Segments[1][1], 
-                                self.Segments[1][0]), v_end, self.EndPoint[1]))
+                            self.Segments.insert(2, DirectionChoice(
+                                (self.Segments[1][1],
+                                 self.Segments[1][0]), v_end, self.EndPoint[1]))
                     else:
                         # Current point is positioned in the middle of start point
                         # and end point on the current direction and a point is added
                         if self.Segments[0][0] != 0:
-                            self.Points[1].x = (end.x + start.x) / 2
+                            self.Points[1].x = (end.x + start.x) // 2
                         if self.Segments[0][1] != 0:
-                            self.Points[1].y = (end.y + start.y) / 2
+                            self.Points[1].y = (end.y + start.y) // 2
                         self.Points.insert(2, wx.Point(self.Points[1].x, self.Points[1].y))
-                        self.Segments.insert(2, DirectionChoice((self.Segments[1][1], 
-                            self.Segments[1][0]), v_end, self.EndPoint[1]))
+                        self.Segments.insert(2, DirectionChoice(
+                            (self.Segments[1][1],
+                             self.Segments[1][0]), v_end, self.EndPoint[1]))
                 else:
                     # The previous direction and the end direction are perpendiculars
                     if product(self.Segments[i - 1], self.EndPoint[1]) == 0:
@@ -2093,7 +2116,7 @@
                                 self.Segments[i - 1] = (-self.Segments[i - 1][0], -self.Segments[i - 1][1])
                         else:
                             test = True
-                            # If the current point is the third, test if the second 
+                            # If the current point is the third, test if the second
                             # point can be aligned with the end point
                             if i == 2:
                                 test_point = wx.Point(self.Points[1].x, self.Points[1].y)
@@ -2115,12 +2138,16 @@
                                 # Current point is positioned in the middle of previous point
                                 # and end point on the current direction and a point is added
                                 if self.Segments[1][0] != 0:
-                                    self.Points[2].x = (self.Points[1].x + end.x) / 2
+                                    self.Points[2].x = (self.Points[1].x + end.x) // 2
                                 if self.Segments[1][1] != 0:
-                                    self.Points[2].y = (self.Points[1].y + end.y) / 2
+                                    self.Points[2].y = (self.Points[1].y + end.y) // 2
                                 self.Points.insert(3, wx.Point(self.Points[2].x, self.Points[2].y))
-                                self.Segments.insert(3, DirectionChoice((self.Segments[2][1], 
-                                    self.Segments[2][0]), v_end, self.EndPoint[1]))
+                                self.Segments.insert(
+                                    3,
+                                    DirectionChoice((self.Segments[2][1],
+                                                     self.Segments[2][0]),
+                                                    v_end,
+                                                    self.EndPoint[1]))
                     else:
                         # Current point is aligned with end point
                         if self.Segments[i - 1][0] != 0:
@@ -2135,21 +2162,27 @@
                             # Current point is positioned in the middle of previous point
                             # and end point on the current direction
                             if self.Segments[i - 1][0] != 0:
-                                self.Points[i].x = (end.x + self.Points[i - 1].x) / 2
+                                self.Points[i].x = (end.x + self.Points[i - 1].x) // 2
                             if self.Segments[i - 1][1] != 0:
-                                self.Points[i].y = (end.y + self.Points[i - 1].y) / 2
+                                self.Points[i].y = (end.y + self.Points[i - 1].y) // 2
                         # A point is added
                         self.Points.insert(i + 1, wx.Point(self.Points[i].x, self.Points[i].y))
-                        self.Segments.insert(i + 1, DirectionChoice((self.Segments[i][1], 
-                                self.Segments[i][0]), v_end, self.EndPoint[1]))
+                        self.Segments.insert(
+                            i + 1,
+                            DirectionChoice((self.Segments[i][1],
+                                             self.Segments[i][0]), v_end, self.EndPoint[1]))
             else:
                 # Current point is the first, and second is not mainly in the first direction
                 if i == 0 and product(vector(start, self.Points[1]), self.Segments[0]) < 0:
-                    # If first and second directions aren't perpendiculars, a point is added 
+                    # If first and second directions aren't perpendiculars, a point is added
                     if product(self.Segments[0], self.Segments[1]) != 0:
                         self.Points.insert(1, wx.Point(start.x, start.y))
-                        self.Segments.insert(1, DirectionChoice((self.Segments[0][1], 
-                            self.Segments[0][0]), vector(start, self.Points[1]), self.Segments[1]))
+                        self.Segments.insert(
+                            1,
+                            DirectionChoice((self.Segments[0][1],
+                                             self.Segments[0][0]),
+                                            vector(start, self.Points[1]),
+                                            self.Segments[1]))
                     else:
                         self.Points[1].x, self.Points[1].y = start.x, start.y
                 else:
@@ -2165,7 +2198,7 @@
         self.RefreshBoundingBox()
         if realpoints:
             self.RefreshRealPoints()
-    
+
     # Verify that two consecutive points haven't the same position
     def VerifyPoints(self):
         points = [point for point in self.Points]
@@ -2173,7 +2206,7 @@
         i = 1
         while i < len(points) - 1:
             if points[i] == points[i + 1] and segments[i - 1] == segments[i + 1]:
-                for j in xrange(2):
+                for dummy in xrange(2):
                     points.pop(i)
                     segments.pop(i)
             else:
@@ -2185,9 +2218,9 @@
             self.RefreshBoundingBox()
             self.RefreshRealPoints()
         return points
-    
+
     # Moves all the wire points except the first and the last if they are connected
-    def Move(self, dx, dy, endpoints = False):
+    def Move(self, dx, dy, endpoints=False):
         for i, point in enumerate(self.Points):
             if endpoints or not (i == 0 and self.StartConnected) and not (i == len(self.Points) - 1 and self.EndConnected):
                 point.x += dx
@@ -2195,7 +2228,7 @@
         self.StartPoint[0] = self.Points[0]
         self.EndPoint[0] = self.Points[-1]
         self.GeneratePoints()
-    
+
     # Resize the wire from position and size given
     def Resize(self, x, y, width, height):
         if len(self.Points) > 1:
@@ -2211,10 +2244,10 @@
                         dir = self.EndPoint[1]
                     else:
                         dir = (0, 0)
-                    pointx = max(-dir[0] * MIN_SEGMENT_SIZE, min(int(round(point[0] * width / float(max(lastwidth, 1)))),
-                            width - dir[0] * MIN_SEGMENT_SIZE))
-                    pointy = max(-dir[1] * MIN_SEGMENT_SIZE, min(int(round(point[1] * height / float(max(lastheight, 1)))),
-                            height - dir[1] * MIN_SEGMENT_SIZE))
+                    pointx = max(-dir[0] * MIN_SEGMENT_SIZE, min(int(round(point[0] * width / max(lastwidth, 1))),
+                                                                 width - dir[0] * MIN_SEGMENT_SIZE))
+                    pointy = max(-dir[1] * MIN_SEGMENT_SIZE, min(int(round(point[1] * height / max(lastheight, 1))),
+                                                                 height - dir[1] * MIN_SEGMENT_SIZE))
                     self.Points[i] = wx.Point(minx + x + pointx, miny + y + pointy)
             self.StartPoint[0] = self.Points[0]
             self.EndPoint[0] = self.Points[-1]
@@ -2235,8 +2268,8 @@
             # during a resize dragging
             for i, point in enumerate(self.RealPoints):
                 if not (i == 0 and self.StartConnected) and not (i == len(self.Points) - 1 and self.EndConnected):
-                    point[0] = point[0] * width / float(max(lastwidth, 1))
-                    point[1] = point[1] * height / float(max(lastheight, 1))
+                    point[0] = point[0] * width / max(lastwidth, 1)
+                    point[1] = point[1] * height / max(lastheight, 1)
             # Calculate the correct position of the points from real points
             for i, point in enumerate(self.RealPoints):
                 if not (i == 0 and self.StartConnected) and not (i == len(self.Points) - 1 and self.EndConnected):
@@ -2246,33 +2279,35 @@
                         dir = self.EndPoint[1]
                     else:
                         dir = (0, 0)
-                    realpointx = max(-dir[0] * MIN_SEGMENT_SIZE, min(int(round(point[0])),
-                            width - dir[0] * MIN_SEGMENT_SIZE))
-                    realpointy = max(-dir[1] * MIN_SEGMENT_SIZE, min(int(round(point[1])),
-                            height - dir[1] * MIN_SEGMENT_SIZE))
+                    realpointx = max(-dir[0] * MIN_SEGMENT_SIZE,
+                                     min(int(round(point[0])),
+                                         width - dir[0] * MIN_SEGMENT_SIZE))
+                    realpointy = max(-dir[1] * MIN_SEGMENT_SIZE,
+                                     min(int(round(point[1])),
+                                         height - dir[1] * MIN_SEGMENT_SIZE))
                     self.Points[i] = wx.Point(minx + x + realpointx, miny + y + realpointy)
             self.StartPoint[0] = self.Points[0]
             self.EndPoint[0] = self.Points[-1]
             self.GeneratePoints(False)
-    
+
     # Moves the wire start point and update the wire points
     def MoveStartPoint(self, point):
         if len(self.Points) > 1:
             self.StartPoint[0] = point
             self.Points[0] = point
             self.GeneratePoints()
-    
+
     # Changes the wire start direction and update the wire points
     def SetStartPointDirection(self, dir):
         if len(self.Points) > 1:
             self.StartPoint[1] = dir
             self.Segments[0] = dir
             self.GeneratePoints()
-    
+
     # Rotates the wire start direction by an angle of 90 degrees anticlockwise
     def RotateStartPoint(self):
         self.SetStartPointDirection((self.StartPoint[1][1], -self.StartPoint[1][0]))
-    
+
     # Connects wire start point to the connector given and moves wire start point
     # to given point
     def ConnectStartPoint(self, point, connector):
@@ -2280,17 +2315,17 @@
             self.MoveStartPoint(point)
         self.StartConnected = connector
         self.RefreshBoundingBox()
-    
+
     # Unconnects wire start point
-    def UnConnectStartPoint(self, delete = False):
+    def UnConnectStartPoint(self, delete=False):
         if delete:
             self.StartConnected = None
             self.Delete()
         elif self.StartConnected:
-            self.StartConnected.UnConnect(self, unconnect = False)
+            self.StartConnected.UnConnect(self, unconnect=False)
             self.StartConnected = None
             self.RefreshBoundingBox()
-    
+
     # Moves the wire end point and update the wire points
     def MoveEndPoint(self, point):
         if len(self.Points) > 1:
@@ -2303,7 +2338,7 @@
         if len(self.Points) > 1:
             self.EndPoint[1] = dir
             self.GeneratePoints()
-            
+
     # Rotates the wire end direction by an angle of 90 degrees anticlockwise
     def RotateEndPoint(self):
         self.SetEndPointDirection((self.EndPoint[1][1], -self.EndPoint[1][0]))
@@ -2315,17 +2350,17 @@
             self.MoveEndPoint(point)
         self.EndConnected = connector
         self.RefreshBoundingBox()
-    
+
     # Unconnects wire end point
-    def UnConnectEndPoint(self, delete = False):
+    def UnConnectEndPoint(self, delete=False):
         if delete:
             self.EndConnected = None
             self.Delete()
         elif self.EndConnected:
-            self.EndConnected.UnConnect(self, unconnect = False)
+            self.EndConnected.UnConnect(self, unconnect=False)
             self.EndConnected = None
             self.RefreshBoundingBox()
-    
+
     # Moves the wire segment given by its index
     def MoveSegment(self, idx, movex, movey, scaling):
         if 0 < idx < len(self.Segments) - 1:
@@ -2356,7 +2391,7 @@
                 if start_y != self.Points[idx].y:
                     return 0, self.Points[idx].y - start_y
         return 0, 0
-    
+
     # Adds two points in the middle of the handled segment
     def AddSegment(self):
         handle_type, handle = self.Handle
@@ -2366,9 +2401,9 @@
                 pointx = self.Points[segment].x
                 pointy = self.Points[segment].y
                 if dir[0] != 0:
-                    pointx = (self.Points[segment].x + self.Points[segment + 1].x) / 2
+                    pointx = (self.Points[segment].x + self.Points[segment + 1].x) // 2
                 if dir[1] != 0:
-                    pointy = (self.Points[segment].y + self.Points[segment + 1].y) / 2
+                    pointy = (self.Points[segment].y + self.Points[segment + 1].y) // 2
                 self.Points.insert(segment + 1, wx.Point(pointx, pointy))
                 self.Segments.insert(segment + 1, (dir[1], dir[0]))
                 self.Points.insert(segment + 2, wx.Point(pointx, pointy))
@@ -2377,11 +2412,11 @@
                 p1x = p2x = self.Points[segment].x
                 p1y = p2y = self.Points[segment].y
                 if dir[0] != 0:
-                    p1x = (2 * self.Points[segment].x + self.Points[segment + 1].x) / 3
-                    p2x = (self.Points[segment].x + 2 * self.Points[segment + 1].x) / 3
+                    p1x = (2 * self.Points[segment].x + self.Points[segment + 1].x) // 3
+                    p2x = (self.Points[segment].x + 2 * self.Points[segment + 1].x) // 3
                 if dir[1] != 0:
-                    p1y = (2 * self.Points[segment].y + self.Points[segment + 1].y) / 3
-                    p2y = (self.Points[segment].y + 2 * self.Points[segment + 1].y) / 3
+                    p1y = (2 * self.Points[segment].y + self.Points[segment + 1].y) // 3
+                    p2y = (self.Points[segment].y + 2 * self.Points[segment + 1].y) // 3
                 self.Points.insert(segment + 1, wx.Point(p1x, p1y))
                 self.Segments.insert(segment + 1, (dir[1], dir[0]))
                 self.Points.insert(segment + 2, wx.Point(p1x, p1y))
@@ -2391,30 +2426,30 @@
                 self.Points.insert(segment + 4, wx.Point(p2x, p2y))
                 self.Segments.insert(segment + 4, dir)
             self.GeneratePoints()
-    
+
     # Delete the handled segment by removing the two segment points
     def DeleteSegment(self):
         handle_type, handle = self.Handle
         if handle_type == HANDLE_SEGMENT:
-            segment, dir = handle
-            for i in xrange(2):
+            segment, _dir = handle
+            for dummy in xrange(2):
                 self.Points.pop(segment)
                 self.Segments.pop(segment)
             self.GeneratePoints()
             self.RefreshModel()
-            
+
     # Method called when a LeftDown event have been generated
     def OnLeftDown(self, event, dc, scaling):
         pos = GetScaledEventPosition(event, dc, scaling)
         # Test if a point have been handled
-        #result = self.TestPoint(pos)
-        #if result != None:
+        # result = self.TestPoint(pos)
+        # if result != None:
         #    self.Handle = (HANDLE_POINT, result)
         #    wx.CallAfter(self.Parent.SetCurrentCursor, 1)
-        #else:
+        # else:
         # Test if a segment have been handled
         result = self.TestSegment(pos)
-        if result != None:
+        if result is not None:
             if result[1] in (NORTH, SOUTH):
                 wx.CallAfter(self.Parent.SetCurrentCursor, 4)
             elif result[1] in (EAST, WEST):
@@ -2424,29 +2459,29 @@
         else:
             Graphic_Element.OnLeftDown(self, event, dc, scaling)
         self.oldPos = pos
-    
+
     # Method called when a RightUp event has been generated
     def OnRightUp(self, event, dc, scaling):
         pos = GetScaledEventPosition(event, dc, scaling)
         # Test if a segment has been handled
         result = self.TestSegment(pos, True)
-        if result != None:
+        if result is not None:
             self.Handle = (HANDLE_SEGMENT, result)
             # Popup the menu with special items for a wire
             self.Parent.PopupWireMenu(0 < result[0] < len(self.Segments) - 1)
         else:
             # Execute the default method for a graphic element
             Graphic_Element.OnRightUp(self, event, dc, scaling)
-    
+
     # Method called when a LeftDClick event has been generated
     def OnLeftDClick(self, event, dc, scaling):
         rect = self.GetRedrawRect()
         if event.ControlDown():
             direction = (self.StartPoint[1], self.EndPoint[1])
             if direction in [(EAST, WEST), (WEST, EAST)]:
-                avgy = (self.StartPoint[0].y + self.EndPoint[0].y) / 2
+                avgy = (self.StartPoint[0].y + self.EndPoint[0].y) // 2
                 if scaling is not None:
-                    avgy = round(float(avgy) / scaling[1]) * scaling[1]
+                    avgy = round(avgy / scaling[1]) * scaling[1]
                 if self.StartConnected is not None:
                     movey = avgy - self.StartPoint[0].y
                     startblock = self.StartConnected.GetParentBlock()
@@ -2465,9 +2500,9 @@
                     self.MoveEndPoint(wx.Point(self.EndPoint[0].x, avgy))
                 self.Parent.RefreshBuffer()
             elif direction in [(NORTH, SOUTH), (SOUTH, NORTH)]:
-                avgx = (self.StartPoint[0].x + self.EndPoint[0].x) / 2
+                avgx = (self.StartPoint[0].x + self.EndPoint[0].x) // 2
                 if scaling is not None:
-                    avgx = round(float(avgx) / scaling[0]) * scaling[0]
+                    avgx = round(avgx / scaling[0]) * scaling[0]
                 if self.StartConnected is not None:
                     movex = avgx - self.StartPoint[0].x
                     startblock = self.StartConnected.GetParentBlock()
@@ -2492,7 +2527,7 @@
             self.Parent.RefreshBuffer()
         rect.Union(self.GetRedrawRect())
         self.Parent.RefreshRect(self.Parent.GetScrolledRect(rect), False)
-        
+
     # Method called when a Motion event has been generated
     def OnMotion(self, event, dc, scaling):
         pos = GetScaledEventPosition(event, dc, scaling)
@@ -2511,7 +2546,7 @@
         else:
             # Execute the default method for a graphic element
             return Graphic_Element.OnMotion(self, event, dc, scaling)
-    
+
     # Refreshes the wire state according to move defined and handle selected
     def ProcessDragging(self, movex, movey, event, scaling):
         handle_type, handle = self.Handle
@@ -2572,14 +2607,14 @@
         # Execute the default method for a graphic element
         else:
             return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling)
-    
+
     # Refreshes the wire model
     def RefreshModel(self, move=True):
         if self.StartConnected and self.StartPoint[1] in [WEST, NORTH]:
             self.StartConnected.RefreshParentBlock()
         if self.EndConnected and self.EndPoint[1] in [WEST, NORTH]:
             self.EndConnected.RefreshParentBlock()
-    
+
     # Change the variable that indicates if this element is highlighted
     def SetHighlighted(self, highlighted):
         self.Highlighted = highlighted
@@ -2587,28 +2622,27 @@
             self.OverStart = False
             self.OverEnd = False
         self.Refresh()
-    
+
     def HighlightPoint(self, pos):
-        refresh = False
         start, end = self.OverStart, self.OverEnd
         self.OverStart = False
         self.OverEnd = False
         # Test if a point has been handled
         result = self.TestPoint(pos)
-        if result != None:
+        if result is not None:
             if result == 0 and self.StartConnected is not None:
                 self.OverStart = True
             elif result != 0 and self.EndConnected is not None:
                 self.OverEnd = True
         if start != self.OverStart or end != self.OverEnd:
             self.Refresh()
-    
+
     # Draws the highlightment of this element if it is highlighted
     def DrawHighlightment(self, dc):
         scalex, scaley = dc.GetUserScale()
         dc.SetUserScale(1, 1)
         # If user trying to connect wire with wrong input, highlight will become red.
-        if self.ErrHighlight == True and not (self.EndConnected):
+        if self.ErrHighlight and not self.EndConnected:
             highlightcolor = wx.RED
         else:
             highlightcolor = HIGHLIGHTCOLOR
@@ -2617,38 +2651,38 @@
         dc.SetLogicalFunction(wx.AND)
         # Draw the start and end points if they are not connected or the mouse is over them
         if len(self.Points) > 0 and (not self.StartConnected or self.OverStart):
-            dc.DrawCircle(round(self.Points[0].x * scalex), 
-                          round(self.Points[0].y * scaley), 
+            dc.DrawCircle(round(self.Points[0].x * scalex),
+                          round(self.Points[0].y * scaley),
                           (POINT_RADIUS + 1) * scalex + 2)
         if len(self.Points) > 1 and (not self.EndConnected or self.OverEnd):
             dc.DrawCircle(self.Points[-1].x * scalex, self.Points[-1].y * scaley, (POINT_RADIUS + 1) * scalex + 2)
         # Draw the wire lines and the last point (it seems that DrawLines stop before the last point)
         if len(self.Points) > 1:
-            points = [wx.Point(round((self.Points[0].x - self.Segments[0][0]) * scalex), 
+            points = [wx.Point(round((self.Points[0].x - self.Segments[0][0]) * scalex),
                                round((self.Points[0].y - self.Segments[0][1]) * scaley))]
             points.extend([wx.Point(round(point.x * scalex), round(point.y * scaley)) for point in self.Points[1:-1]])
-            points.append(wx.Point(round((self.Points[-1].x + self.Segments[-1][0]) * scalex), 
+            points.append(wx.Point(round((self.Points[-1].x + self.Segments[-1][0]) * scalex),
                                    round((self.Points[-1].y + self.Segments[-1][1]) * scaley)))
         else:
             points = []
         dc.DrawLines(points)
         dc.SetLogicalFunction(wx.COPY)
         dc.SetUserScale(scalex, scaley)
-        
+
         if self.StartConnected is not None:
             self.StartConnected.DrawHighlightment(dc)
             self.StartConnected.Draw(dc)
         if self.EndConnected is not None:
             self.EndConnected.DrawHighlightment(dc)
             self.EndConnected.Draw(dc)
-    
+
     # Draws the wire lines and points
     def Draw(self, dc):
         Graphic_Element.Draw(self, dc)
         if not self.Valid:
             dc.SetPen(MiterPen(wx.RED))
             dc.SetBrush(wx.RED_BRUSH)
-        elif isinstance(self.Value, BooleanType) and self.Value:
+        elif isinstance(self.Value, bool) and self.Value:
             if self.Forced:
                 dc.SetPen(MiterPen(wx.CYAN))
                 dc.SetBrush(wx.CYAN_BRUSH)
@@ -2686,25 +2720,25 @@
                 end = 1
             dc.DrawLine(self.Points[self.SelectedSegment].x - 1, self.Points[self.SelectedSegment].y,
                         self.Points[self.SelectedSegment + 1].x + end, self.Points[self.SelectedSegment + 1].y)
-        if self.Value is not None and not isinstance(self.Value, BooleanType) and self.Value != "undefined":
+        if self.Value is not None and not isinstance(self.Value, bool) and self.Value != "undefined":
             dc.SetFont(self.Parent.GetMiniFont())
             dc.SetTextForeground(wx.NamedColour("purple"))
-            if self.ValueSize is None and isinstance(self.ComputedValue, (StringType, UnicodeType)):
+            if self.ValueSize is None and isinstance(self.ComputedValue, string_types):
                 self.ValueSize = self.Parent.GetMiniTextExtent(self.ComputedValue)
             if self.ValueSize is not None:
                 width, height = self.ValueSize
                 if self.BoundingBox[2] > width * 4 or self.BoundingBox[3] > height * 4:
-                    x = self.Points[0].x + width * (self.StartPoint[1][0] - 1) / 2
+                    x = self.Points[0].x + width * (self.StartPoint[1][0] - 1) // 2
                     y = self.Points[0].y + height * (self.StartPoint[1][1] - 1)
                     dc.DrawText(self.ComputedValue, x, y)
-                    x = self.Points[-1].x + width * (self.EndPoint[1][0] - 1) / 2
+                    x = self.Points[-1].x + width * (self.EndPoint[1][0] - 1) // 2
                     y = self.Points[-1].y + height * (self.EndPoint[1][1] - 1)
                     dc.DrawText(self.ComputedValue, x, y)
                 else:
-                    middle = len(self.Segments) / 2 + len(self.Segments) % 2 - 1
-                    x = (self.Points[middle].x + self.Points[middle + 1].x - width) / 2
+                    middle = len(self.Segments) // 2 + len(self.Segments) % 2 - 1
+                    x = (self.Points[middle].x + self.Points[middle + 1].x - width) // 2
                     if self.BoundingBox[3] > height and self.Segments[middle] in [NORTH, SOUTH]:
-                        y = (self.Points[middle].y + self.Points[middle + 1].y - height) / 2
+                        y = (self.Points[middle].y + self.Points[middle + 1].y - height) // 2
                     else:
                         y = self.Points[middle].y - height
                     dc.DrawText(self.ComputedValue, x, y)
@@ -2712,9 +2746,10 @@
             dc.SetTextForeground(wx.BLACK)
 
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                           Graphic comment element
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 def FilterHighlightsByRow(highlights, row, length):
     _highlights = []
@@ -2727,6 +2762,7 @@
             _highlights.append((start, end, highlight_type))
     return _highlights
 
+
 def FilterHighlightsByColumn(highlights, start_col, end_col):
     _highlights = []
     for start, end, highlight_type in highlights:
@@ -2736,41 +2772,41 @@
             _highlights.append((start, end, highlight_type))
     return _highlights
 
-"""
-Class that implements a comment
-"""
 
 class Comment(Graphic_Element):
+    """
+    Class that implements a comment
+    """
 
     # Create a new comment
-    def __init__(self, parent, content, id = None):
+    def __init__(self, parent, content, id=None):
         Graphic_Element.__init__(self, parent)
         self.Id = id
         self.Content = content
         self.Pos = wx.Point(0, 0)
         self.Size = wx.Size(0, 0)
         self.Highlights = []
-    
+
     # Make a clone of this comment
-    def Clone(self, parent, id = None, pos = None):
+    def Clone(self, parent, id=None, pos=None):
         comment = Comment(parent, self.Content, id)
         if pos is not None:
             comment.SetPosition(pos.x, pos.y)
         comment.SetSize(self.Size[0], self.Size[1])
         return comment
-    
+
     # Method for keeping compatibility with others
     def Clean(self):
         pass
-    
+
     # Delete this comment by calling the corresponding method
     def Delete(self):
         self.Parent.DeleteComment(self)
-    
+
     # Refresh the comment bounding box
     def RefreshBoundingBox(self):
         self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
-    
+
     # Changes the comment size
     def SetSize(self, width, height):
         self.Size.SetWidth(width)
@@ -2780,7 +2816,7 @@
     # Returns the comment size
     def GetSize(self):
         return self.Size.GetWidth(), self.Size.GetHeight()
-    
+
     # Returns the comment minimum size
     def GetMinSize(self):
         dc = wx.ClientDC(self.Parent)
@@ -2793,7 +2829,7 @@
                 min_width = max(min_width, wordwidth)
                 min_height = max(min_height, wordheight)
         return min_width + 20, min_height + 20
-    
+
     # Changes the comment position
     def SetPosition(self, x, y):
         self.Pos.x = x
@@ -2815,51 +2851,51 @@
     # Returns the comment position
     def GetPosition(self):
         return self.Pos.x, self.Pos.y
-    
+
     # Moves the comment
-    def Move(self, dx, dy, connected = True):
+    def Move(self, dx, dy, connected=True):
         self.Pos.x += dx
         self.Pos.y += dy
         self.RefreshBoundingBox()
-    
+
     # Resizes the comment with the position and the size given
     def Resize(self, x, y, width, height):
         self.Move(x, y)
         self.SetSize(width, height)
-    
+
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         # Popup the default menu
         self.Parent.PopupDefaultMenu()
-    
+
     # Refreshes the wire state according to move defined and handle selected
     def ProcessDragging(self, movex, movey, event, scaling):
         if self.Parent.GetDrawingMode() != FREEDRAWING_MODE and self.Parent.CurrentLanguage == "LD":
             movex = movey = 0
         return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling)
-        
+
     # Refreshes the comment model
     def RefreshModel(self, move=True):
         self.Parent.RefreshCommentModel(self)
-    
+
     # Method called when a LeftDClick event have been generated
     def OnLeftDClick(self, event, dc, scaling):
         # Edit the comment content
         self.Parent.EditCommentContent(self)
-    
+
     # Adds an highlight to the comment
     def AddHighlight(self, infos, start, end, highlight_type):
         if infos[0] == "content":
             AddHighlight(self.Highlights, (start, end, highlight_type))
-    
+
     # Removes an highlight from the comment
     def RemoveHighlight(self, infos, start, end, highlight_type):
         RemoveHighlight(self.Highlights, (start, end, highlight_type))
-    
+
     # Removes all the highlights of one particular type from the comment
     def ClearHighlight(self, highlight_type=None):
         self.Highlights = ClearHighlights(self.Highlights, highlight_type)
-    
+
     # Draws the highlightment of this element if it is highlighted
     def DrawHighlightment(self, dc):
         scalex, scaley = dc.GetUserScale()
@@ -2867,29 +2903,29 @@
         dc.SetPen(MiterPen(HIGHLIGHTCOLOR))
         dc.SetBrush(wx.Brush(HIGHLIGHTCOLOR))
         dc.SetLogicalFunction(wx.AND)
-        
+
         left = (self.Pos.x - 1) * scalex - 2
         right = (self.Pos.x + self.Size[0] + 1) * scalex + 2
         top = (self.Pos.y - 1) * scaley - 2
         bottom = (self.Pos.y + self.Size[1] + 1) * scaley + 2
         angle_top = (self.Pos.x + self.Size[0] - 9) * scalex + 2
         angle_right = (self.Pos.y + 9) * scaley - 2
-        
+
         polygon = [wx.Point(left, top), wx.Point(angle_top, top),
                    wx.Point(right, angle_right), wx.Point(right, bottom),
                    wx.Point(left, bottom)]
         dc.DrawPolygon(polygon)
-        
+
         dc.SetLogicalFunction(wx.COPY)
         dc.SetUserScale(scalex, scaley)
-        
+
     # Draws the comment and its content
     def Draw(self, dc):
         Graphic_Element.Draw(self, dc)
         dc.SetPen(MiterPen(wx.BLACK))
         dc.SetBrush(wx.WHITE_BRUSH)
         # Draws the comment shape
-        polygon = [wx.Point(self.Pos.x, self.Pos.y), 
+        polygon = [wx.Point(self.Pos.x, self.Pos.y),
                    wx.Point(self.Pos.x + self.Size[0] - 10, self.Pos.y),
                    wx.Point(self.Pos.x + self.Size[0], self.Pos.y + 10),
                    wx.Point(self.Pos.x + self.Size[0], self.Pos.y + self.Size[1]),
@@ -2951,4 +2987,3 @@
                     y += wordheight + 5
             if y + wordheight > self.Pos.y + self.Size[1] - 10:
                 break
-
--- a/graphics/LD_Objects.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/graphics/LD_Objects.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,22 +22,28 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
 import wx
+from future.builtins import round
+from six.moves import xrange
 
 from graphics.GraphicCommons import *
 from graphics.DebugDataConsumer import DebugDataConsumer
 from plcopen.structures import *
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                         Ladder Diagram PowerRail
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements the graphic representation of a power rail
-"""
+# -------------------------------------------------------------------------------
+
 
 class LD_PowerRail(Graphic_Element):
-    
+    """
+    Class that implements the graphic representation of a power rail
+    """
+
     # Create a new power rail
     def __init__(self, parent, type, id=None, connectors=1):
         Graphic_Element.__init__(self, parent)
@@ -45,16 +51,16 @@
         self.Connectors = []
         self.RealConnectors = None
         self.Id = id
-        self.Extensions = [LD_LINE_SIZE / 2, LD_LINE_SIZE / 2]
+        self.Extensions = [LD_LINE_SIZE // 2, LD_LINE_SIZE // 2]
         self.SetType(type, connectors)
-        
+
     def Flush(self):
         for connector in self.Connectors:
             connector.Flush()
         self.Connectors = []
-    
+
     # Make a clone of this LD_PowerRail
-    def Clone(self, parent, id = None, pos = None):
+    def Clone(self, parent, id=None, pos=None):
         powerrail = LD_PowerRail(parent, self.Type, id)
         powerrail.SetSize(self.Size[0], self.Size[1])
         if pos is not None:
@@ -65,13 +71,13 @@
         for connector in self.Connectors:
             powerrail.Connectors.append(connector.Clone(powerrail))
         return powerrail
-    
+
     def GetConnectorTranslation(self, element):
         return dict(zip([connector for connector in self.Connectors],
                         [connector for connector in element.Connectors]))
-    
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         rect = Graphic_Element.GetRedrawRect(self, movex, movey)
         for connector in self.Connectors:
             rect = rect.Union(connector.GetRedrawRect(movex, movey))
@@ -80,7 +86,7 @@
                 if connector.IsConnected():
                     rect = rect.Union(connector.GetConnectedRedrawRect(movex, movey))
         return rect
-    
+
     # Forbids to change the power rail size
     def SetSize(self, width, height):
         if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
@@ -88,47 +94,47 @@
         else:
             Graphic_Element.SetSize(self, LD_POWERRAIL_WIDTH, height)
         self.RefreshConnectors()
-    
+
     # Forbids to select a power rail
     def HitTest(self, pt, connectors=True):
         if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
-            return Graphic_Element.HitTest(self, pt, connectors) or self.TestConnector(pt, exclude=False) != None
+            return Graphic_Element.HitTest(self, pt, connectors) or self.TestConnector(pt, exclude=False) is not None
         return False
-    
+
     # Forbids to select a power rail
     def IsInSelection(self, rect):
         if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
             return Graphic_Element.IsInSelection(self, rect)
         return False
-    
+
     # Deletes this power rail by calling the appropriate method
     def Delete(self):
         self.Parent.DeletePowerRail(self)
-    
+
     # Unconnect all connectors
     def Clean(self):
         for connector in self.Connectors:
-            connector.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
-                
+            connector.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+
     # Refresh the power rail bounding box
     def RefreshBoundingBox(self):
         self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
-    
+
     # Refresh the power rail size
     def RefreshSize(self):
         self.Size = wx.Size(LD_POWERRAIL_WIDTH, max(LD_LINE_SIZE * len(self.Connectors), self.Size[1]))
         self.RefreshBoundingBox()
-    
+
     # Returns the block minimum size
     def GetMinSize(self, default=False):
         height = (LD_LINE_SIZE * (len(self.Connectors) - 1)
                   if default else 0)
         return LD_POWERRAIL_WIDTH, height + self.Extensions[0] + self.Extensions[1]
-    
+
     # Add a connector or a blank to this power rail at the last place
     def AddConnector(self):
         self.InsertConnector(len(self.Connectors))
-    
+
     # Add a connector or a blank to this power rail at the place given
     def InsertConnector(self, idx):
         if self.Type == LEFTRAIL:
@@ -138,7 +144,7 @@
         self.Connectors.insert(idx, connector)
         self.RefreshSize()
         self.RefreshConnectors()
-    
+
     # Moves the divergence connector given
     def MoveConnector(self, connector, movey):
         position = connector.GetRelPosition()
@@ -163,44 +169,44 @@
         self.Size[1] = max(maxy + self.Extensions[1], self.Size[1])
         connector.MoveConnected()
         self.RefreshBoundingBox()
-    
+
     # Returns the index in connectors list for the connector given
     def GetConnectorIndex(self, connector):
         if connector in self.Connectors:
             return self.Connectors.index(connector)
         return None
-    
+
     # Delete the connector or blank from connectors list at the index given
     def DeleteConnector(self, idx):
         self.Connectors.pop(idx)
         self.RefreshConnectors()
         self.RefreshSize()
-    
+
     # Refresh the positions of the power rail connectors
     def RefreshConnectors(self):
         scaling = self.Parent.GetScaling()
         height = self.Size[1] - self.Extensions[0] - self.Extensions[1]
-        interval = float(height) / float(max(len(self.Connectors) - 1, 1))
+        interval = height / max(len(self.Connectors) - 1, 1)
         for i, connector in enumerate(self.Connectors):
             if self.RealConnectors:
                 position = self.Extensions[0] + int(round(self.RealConnectors[i] * height))
             else:
                 position = self.Extensions[0] + int(round(i * interval))
             if scaling is not None:
-                position = round(float(self.Pos.y + position) / float(scaling[1])) * scaling[1] - self.Pos.y
+                position = round((self.Pos.y + position) / scaling[1]) * scaling[1] - self.Pos.y
             if self.Type == LEFTRAIL:
                 connector.SetPosition(wx.Point(self.Size[0], position))
             elif self.Type == RIGHTRAIL:
                 connector.SetPosition(wx.Point(0, position))
         self.RefreshConnected()
-    
+
     # Refresh the position of wires connected to power rail
-    def RefreshConnected(self, exclude = []):
+    def RefreshConnected(self, exclude=None):
         for connector in self.Connectors:
             connector.MoveConnected(exclude)
-    
-    # Returns the power rail connector that starts with the point given if it exists 
-    def GetConnector(self, position, name = None):
+
+    # Returns the power rail connector that starts with the point given if it exists
+    def GetConnector(self, position, name=None):
         # if a name is given
         if name is not None:
             # Test each connector if it exists
@@ -208,22 +214,22 @@
                 if name == connector.GetName():
                     return connector
         return self.FindNearestConnector(position, [connector for connector in self.Connectors if connector is not None])
-    
-    # Returns all the power rail connectors 
+
+    # Returns all the power rail connectors
     def GetConnectors(self):
         connectors = [connector for connector in self.Connectors if connector]
         if self.Type == LEFTRAIL:
             return {"inputs": [], "outputs": connectors}
         else:
             return {"inputs": connectors, "outputs": []}
-    
+
     # Test if point given is on one of the power rail connectors
-    def TestConnector(self, pt, direction = None, exclude = True):
+    def TestConnector(self, pt, direction=None, exclude=True):
         for connector in self.Connectors:
             if connector.TestPoint(pt, direction, exclude):
                 return connector
         return None
-    
+
     # Returns the power rail type
     def SetType(self, type, connectors):
         if type != self.Type or len(self.Connectors) != connectors:
@@ -232,14 +238,14 @@
             self.Type = type
             self.Clean()
             self.Connectors = []
-            for connector in xrange(connectors):
+            for dummy in xrange(connectors):
                 self.AddConnector()
             self.RefreshSize()
-    
+
     # Returns the power rail type
     def GetType(self):
         return self.Type
-    
+
     # Method called when a LeftDown event have been generated
     def OnLeftDown(self, event, dc, scaling):
         self.RealConnectors = []
@@ -247,18 +253,18 @@
         if height > 0:
             for connector in self.Connectors:
                 position = connector.GetRelPosition()
-                self.RealConnectors.append(max(0., min(float(position.y - self.Extensions[0]) / float(height), 1.)))
+                self.RealConnectors.append(max(0., min((position.y - self.Extensions[0]) / height, 1.)))
         elif len(self.Connectors) > 1:
-            self.RealConnectors = map(lambda x : x * 1 / (len(self.Connectors) - 1), xrange(len(self.Connectors)))
+            self.RealConnectors = map(lambda x: x * 1 / (len(self.Connectors) - 1), xrange(len(self.Connectors)))
         else:
             self.RealConnectors = [0.5]
         Graphic_Element.OnLeftDown(self, event, dc, scaling)
-    
+
     # Method called when a LeftUp event have been generated
     def OnLeftUp(self, event, dc, scaling):
         Graphic_Element.OnLeftUp(self, event, dc, scaling)
         self.RealConnectors = None
-    
+
     # Method called when a LeftDown event have been generated
     def OnRightDown(self, event, dc, scaling):
         pos = GetScaledEventPosition(event, dc, scaling)
@@ -272,12 +278,12 @@
             self.oldPos = GetScaledEventPosition(event, dc, scaling)
         else:
             Graphic_Element.OnRightDown(self, event, dc, scaling)
-    
+
     # Method called when a LeftDClick event have been generated
     def OnLeftDClick(self, event, dc, scaling):
         # Edit the powerrail properties
         self.Parent.EditPowerRailContent(self)
-    
+
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         handle_type, handle = self.Handle
@@ -292,7 +298,7 @@
             Graphic_Element.OnRightUp(self, event, dc, scaling)
         else:
             self.Parent.PopupDefaultMenu()
-    
+
     def Resize(self, x, y, width, height):
         self.Move(x, y)
         if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
@@ -308,22 +314,22 @@
             movey = max(-self.BoundingBox.y, movey)
             if scaling is not None:
                 position = handle.GetRelPosition()
-                movey = round(float(self.Pos.y + position.y + movey) / float(scaling[1])) * scaling[1] - self.Pos.y - position.y
+                movey = round((self.Pos.y + position.y + movey) / scaling[1]) * scaling[1] - self.Pos.y - position.y
             self.MoveConnector(handle, movey)
             return 0, movey
         elif self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
             return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling)
         return 0, 0
-    
+
     # Refreshes the power rail model
     def RefreshModel(self, move=True):
         self.Parent.RefreshPowerRailModel(self)
-        # If power rail has moved and power rail is of type LEFT, refresh the model 
+        # If power rail has moved and power rail is of type LEFT, refresh the model
         # of wires connected to connectors
         if move and self.Type == LEFTRAIL:
             for connector in self.Connectors:
                 connector.RefreshWires()
-    
+
     # Draws power rail
     def Draw(self, dc):
         Graphic_Element.Draw(self, dc)
@@ -337,20 +343,20 @@
         # Draw connectors
         for connector in self.Connectors:
             connector.Draw(dc)
-        
-
-#-------------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------------
 #                         Ladder Diagram Contact
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements the graphic representation of a contact
-"""
+# -------------------------------------------------------------------------------
+
 
 class LD_Contact(Graphic_Element, DebugDataConsumer):
-    
+    """
+    Class that implements the graphic representation of a contact
+    """
+
     # Create a new contact
-    def __init__(self, parent, type, name, id = None):
+    def __init__(self, parent, type, name, id=None):
         Graphic_Element.__init__(self, parent)
         DebugDataConsumer.__init__(self)
         self.Type = type
@@ -359,13 +365,13 @@
         self.Size = wx.Size(LD_ELEMENT_SIZE[0], LD_ELEMENT_SIZE[1])
         self.Highlights = {}
         # Create an input and output connector
-        self.Input = Connector(self, "", "BOOL", wx.Point(0, self.Size[1] / 2 + 1), WEST)
-        self.Output = Connector(self, "", "BOOL", wx.Point(self.Size[0], self.Size[1] / 2 + 1), EAST)
+        self.Input = Connector(self, "", "BOOL", wx.Point(0, self.Size[1] // 2 + 1), WEST)
+        self.Output = Connector(self, "", "BOOL", wx.Point(self.Size[0], self.Size[1] // 2 + 1), EAST)
         self.PreviousValue = False
         self.PreviousSpreading = False
         self.RefreshNameSize()
         self.RefreshTypeSize()
-    
+
     def Flush(self):
         if self.Input is not None:
             self.Input.Flush()
@@ -373,13 +379,13 @@
         if self.Output is not None:
             self.Output.Flush()
             self.Output = None
-    
+
     def SetForced(self, forced):
         if self.Forced != forced:
             self.Forced = forced
             if self.Visible:
                 self.Parent.ElementNeedRefresh(self)
-    
+
     def SetValue(self, value):
         if self.Type == CONTACT_RISING:
             refresh = self.Value and not self.PreviousValue
@@ -393,7 +399,7 @@
             if self.Visible:
                 self.Parent.ElementNeedRefresh(self)
             self.SpreadCurrent()
-    
+
     def SpreadCurrent(self):
         if self.Parent.Debug:
             if self.Value is None:
@@ -414,9 +420,9 @@
             elif not spreading and self.PreviousSpreading:
                 self.Output.SpreadCurrent(False)
             self.PreviousSpreading = spreading
-    
+
     # Make a clone of this LD_Contact
-    def Clone(self, parent, id = None, pos = None):
+    def Clone(self, parent, id=None, pos=None):
         contact = LD_Contact(parent, self.Type, self.Name, id)
         contact.SetSize(self.Size[0], self.Size[1])
         if pos is not None:
@@ -426,12 +432,12 @@
         contact.Input = self.Input.Clone(contact)
         contact.Output = self.Output.Clone(contact)
         return contact
-    
+
     def GetConnectorTranslation(self, element):
-        return {self.Input : element.Input, self.Output : element.Output}
-    
+        return {self.Input: element.Input, self.Output: element.Output}
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         rect = Graphic_Element.GetRedrawRect(self, movex, movey)
         rect = rect.Union(self.Input.GetRedrawRect(movex, movey))
         rect = rect.Union(self.Output.GetRedrawRect(movex, movey))
@@ -445,30 +451,30 @@
     def ProcessDragging(self, movex, movey, event, scaling):
         if self.Parent.GetDrawingMode() != FREEDRAWING_MODE:
             movex = movey = 0
-        return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling, height_fac = 2)
-    
+        return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling, height_fac=2)
+
     # Forbids to change the contact size
     def SetSize(self, width, height):
         if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
             Graphic_Element.SetSize(self, width, height)
             self.RefreshConnectors()
-    
+
     # Delete this contact by calling the appropriate method
     def Delete(self):
         self.Parent.DeleteContact(self)
-    
+
     # Unconnect input and output
     def Clean(self):
-        self.Input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
-        self.Output.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
-    
+        self.Input.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+        self.Output.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+
     # Refresh the size of text for name
     def RefreshNameSize(self):
         if self.Name != "":
             self.NameSize = self.Parent.GetTextExtent(self.Name)
         else:
             self.NameSize = 0, 0
-    
+
     # Refresh the size of text for type
     def RefreshTypeSize(self):
         typetext = ""
@@ -482,14 +488,14 @@
             self.TypeSize = self.Parent.GetTextExtent(typetext)
         else:
             self.TypeSize = 0, 0
-    
+
     # Refresh the contact bounding box
     def RefreshBoundingBox(self):
         # Calculate the size of the name outside the contact
         text_width, text_height = self.Parent.GetTextExtent(self.Name)
         # Calculate the bounding box size
         if self.Name != "":
-            bbx_x = self.Pos.x - max(0, (text_width - self.Size[0]) / 2)
+            bbx_x = self.Pos.x - max(0, (text_width - self.Size[0]) // 2)
             bbx_width = max(self.Size[0], text_width)
             bbx_y = self.Pos.y - (text_height + 2)
             bbx_height = self.Size[1] + (text_height + 2)
@@ -499,33 +505,33 @@
             bbx_y = self.Pos.y
             bbx_height = self.Size[1]
         self.BoundingBox = wx.Rect(bbx_x, bbx_y, bbx_width + 1, bbx_height + 1)
-    
+
     # Returns the block minimum size
     def GetMinSize(self):
         return LD_ELEMENT_SIZE
-    
+
     # Refresh the position of wire connected to contact
-    def RefreshConnected(self, exclude = []):
+    def RefreshConnected(self, exclude=None):
         self.Input.MoveConnected(exclude)
         self.Output.MoveConnected(exclude)
-    
-    # Returns the contact connector that starts with the point given if it exists 
-    def GetConnector(self, position, name = None):
+
+    # Returns the contact connector that starts with the point given if it exists
+    def GetConnector(self, position, name=None):
         # if a name is given
         if name is not None:
             # Test input and output connector
-            #if name == self.Input.GetName():
+            # if name == self.Input.GetName():
             #    return self.Input
             if name == self.Output.GetName():
                 return self.Output
         return self.FindNearestConnector(position, [self.Input, self.Output])
-    
-    # Returns input and output contact connectors 
+
+    # Returns input and output contact connectors
     def GetConnectors(self):
         return {"inputs": [self.Input], "outputs": [self.Output]}
-    
+
     # Test if point given is on contact input or output connector
-    def TestConnector(self, pt, direction = None, exclude=True):
+    def TestConnector(self, pt, direction=None, exclude=True):
         # Test input connector
         if self.Input.TestPoint(pt, direction, exclude):
             return self.Input
@@ -537,9 +543,9 @@
     # Refresh the positions of the block connectors
     def RefreshConnectors(self):
         scaling = self.Parent.GetScaling()
-        position = self.Size[1] / 2 + 1
+        position = self.Size[1] // 2 + 1
         if scaling is not None:
-            position = round(float(self.Pos.y + position) / float(scaling[1])) * scaling[1] - self.Pos.y
+            position = round((self.Pos.y + position) / scaling[1]) * scaling[1] - self.Pos.y
         self.Input.SetPosition(wx.Point(0, position))
         self.Output.SetPosition(wx.Point(self.Size[0], position))
         self.RefreshConnected()
@@ -561,24 +567,24 @@
     # Returns the contact type
     def GetType(self):
         return self.Type
-    
+
     # Method called when a LeftDClick event have been generated
     def OnLeftDClick(self, event, dc, scaling):
         # Edit the contact properties
         self.Parent.EditContactContent(self)
-    
+
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         # Popup the default menu
         self.Parent.PopupDefaultMenu()
-    
+
     # Refreshes the contact model
     def RefreshModel(self, move=True):
         self.Parent.RefreshContactModel(self)
         # If contact has moved, refresh the model of wires connected to output
         if move:
             self.Output.RefreshWires()
-    
+
     # Draws the highlightment of this element if it is highlighted
     def DrawHighlightment(self, dc):
         scalex, scaley = dc.GetUserScale()
@@ -592,12 +598,12 @@
         top = (self.Pos.y - 1) * scaley - 2
         width = 4 * scalex + 5
         height = (self.Size[1] + 3) * scaley + 5
-        
+
         dc.DrawRectangle(left_left, top, width, height)
         dc.DrawRectangle(right_left, top, width, height)
         dc.SetLogicalFunction(wx.COPY)
         dc.SetUserScale(scalex, scaley)
-    
+
     # Adds an highlight to the connection
     def AddHighlight(self, infos, start, end, highlight_type):
         highlights = self.Highlights.setdefault(infos[0], [])
@@ -606,13 +612,13 @@
                 AddHighlight(highlights, (start, end, highlight_type))
         else:
             AddHighlight(highlights, ((0, 0), (0, 1), highlight_type))
-    
+
     # Removes an highlight from the connection
     def RemoveHighlight(self, infos, start, end, highlight_type):
         highlights = self.Highlights.get(infos[0], [])
         if RemoveHighlight(highlights, (start, end, highlight_type)) and len(highlights) == 0:
             self.Highlights.pop(infos[0])
-    
+
     # Removes all the highlights of one particular type from the connection
     def ClearHighlight(self, highlight_type=None):
         if highlight_type is None:
@@ -620,14 +626,14 @@
         else:
             highlight_items = self.Highlights.items()
             for name, highlights in highlight_items:
-                highlights = ClearHighlights(highlight, highlight_type)
+                highlights = ClearHighlights(highlights, highlight_type)
                 if len(highlights) == 0:
                     self.Highlights.pop(name)
-    
+
     # Draws contact
     def Draw(self, dc):
         Graphic_Element.Draw(self, dc)
-        if self.Value is not None:            
+        if self.Value is not None:
             if self.Type == CONTACT_NORMAL and self.Value or \
                self.Type == CONTACT_REVERSE and not self.Value or \
                self.Type == CONTACT_RISING and self.Value and not self.PreviousValue or \
@@ -643,7 +649,7 @@
         else:
             dc.SetPen(MiterPen(wx.BLACK))
         dc.SetBrush(wx.BLACK_BRUSH)
-        
+
         # Compiling contact type modifier symbol
         typetext = ""
         if self.Type == CONTACT_REVERSE:
@@ -652,7 +658,7 @@
             typetext = "P"
         elif self.Type == CONTACT_FALLING:
             typetext = "N"
-        
+
         if getattr(dc, "printing", False):
             name_size = dc.GetTextExtent(self.Name)
             if typetext != "":
@@ -661,23 +667,23 @@
             name_size = self.NameSize
             if typetext != "":
                 type_size = self.TypeSize
-        
+
         # Draw two rectangles for representing the contact
         dc.DrawRectangle(self.Pos.x, self.Pos.y, 2, self.Size[1] + 1)
         dc.DrawRectangle(self.Pos.x + self.Size[0] - 1, self.Pos.y, 2, self.Size[1] + 1)
         # Draw contact name
-        name_pos = (self.Pos.x + (self.Size[0] - name_size[0]) / 2,
+        name_pos = (self.Pos.x + (self.Size[0] - name_size[0]) // 2,
                     self.Pos.y - (name_size[1] + 2))
         dc.DrawText(self.Name, name_pos[0], name_pos[1])
         # Draw the modifier symbol in the middle of contact
         if typetext != "":
-            type_pos = (self.Pos.x + (self.Size[0] - type_size[0]) / 2 + 1,
-                        self.Pos.y + (self.Size[1] - type_size[1]) / 2)
+            type_pos = (self.Pos.x + (self.Size[0] - type_size[0]) // 2 + 1,
+                        self.Pos.y + (self.Size[1] - type_size[1]) // 2)
             dc.DrawText(typetext, type_pos[0], type_pos[1])
         # Draw input and output connectors
         self.Input.Draw(dc)
         self.Output.Draw(dc)
-        
+
         if not getattr(dc, "printing", False):
             for name, highlights in self.Highlights.iteritems():
                 if name == "reference":
@@ -685,18 +691,19 @@
                 elif typetext != "":
                     DrawHighlightedText(dc, typetext, highlights, type_pos[0], type_pos[1])
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                         Ladder Diagram Coil
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements the graphic representation of a coil
-"""
+# -------------------------------------------------------------------------------
+
 
 class LD_Coil(Graphic_Element):
-    
+    """
+    Class that implements the graphic representation of a coil
+    """
+
     # Create a new coil
-    def __init__(self, parent, type, name, id = None):
+    def __init__(self, parent, type, name, id=None):
         Graphic_Element.__init__(self, parent)
         self.Type = type
         self.Name = name
@@ -704,13 +711,13 @@
         self.Size = wx.Size(LD_ELEMENT_SIZE[0], LD_ELEMENT_SIZE[1])
         self.Highlights = {}
         # Create an input and output connector
-        self.Input = Connector(self, "", "BOOL", wx.Point(0, self.Size[1] / 2 + 1), WEST)
-        self.Output = Connector(self, "", "BOOL", wx.Point(self.Size[0], self.Size[1] / 2 + 1), EAST)
+        self.Input = Connector(self, "", "BOOL", wx.Point(0, self.Size[1] // 2 + 1), WEST)
+        self.Output = Connector(self, "", "BOOL", wx.Point(self.Size[0], self.Size[1] // 2 + 1), EAST)
         self.Value = None
         self.PreviousValue = False
         self.RefreshNameSize()
         self.RefreshTypeSize()
-        
+
     def Flush(self):
         if self.Input is not None:
             self.Input.Flush()
@@ -718,7 +725,7 @@
         if self.Output is not None:
             self.Output.Flush()
             self.Output = None
-    
+
     def SpreadCurrent(self):
         if self.Parent.Debug:
             self.PreviousValue = self.Value
@@ -729,9 +736,9 @@
                 self.Output.SpreadCurrent(False)
             if self.Value != self.PreviousValue and self.Visible:
                 self.Parent.ElementNeedRefresh(self)
-    
+
     # Make a clone of this LD_Coil
-    def Clone(self, parent, id = None, pos = None):
+    def Clone(self, parent, id=None, pos=None):
         coil = LD_Coil(parent, self.Type, self.Name, id)
         coil.SetSize(self.Size[0], self.Size[1])
         if pos is not None:
@@ -741,12 +748,12 @@
         coil.Input = self.Input.Clone(coil)
         coil.Output = self.Output.Clone(coil)
         return coil
-    
+
     def GetConnectorTranslation(self, element):
-        return {self.Input : element.Input, self.Output : element.Output}
-    
+        return {self.Input: element.Input, self.Output: element.Output}
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         rect = Graphic_Element.GetRedrawRect(self, movex, movey)
         rect = rect.Union(self.Input.GetRedrawRect(movex, movey))
         rect = rect.Union(self.Output.GetRedrawRect(movex, movey))
@@ -756,34 +763,34 @@
             if self.Output.IsConnected():
                 rect = rect.Union(self.Output.GetConnectedRedrawRect(movex, movey))
         return rect
-    
+
     def ProcessDragging(self, movex, movey, event, scaling):
         if self.Parent.GetDrawingMode() != FREEDRAWING_MODE:
             movex = movey = 0
-        return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling, height_fac = 2)    
-    
+        return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling, height_fac=2)
+
     # Forbids to change the Coil size
     def SetSize(self, width, height):
         if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
             Graphic_Element.SetSize(self, width, height)
             self.RefreshConnectors()
-    
+
     # Delete this coil by calling the appropriate method
     def Delete(self):
         self.Parent.DeleteCoil(self)
-    
+
     # Unconnect input and output
     def Clean(self):
-        self.Input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
-        self.Output.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
-                
+        self.Input.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+        self.Output.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+
     # Refresh the size of text for name
     def RefreshNameSize(self):
         if self.Name != "":
             self.NameSize = self.Parent.GetTextExtent(self.Name)
         else:
             self.NameSize = 0, 0
-    
+
     # Refresh the size of text for type
     def RefreshTypeSize(self):
         typetext = ""
@@ -801,14 +808,14 @@
             self.TypeSize = self.Parent.GetTextExtent(typetext)
         else:
             self.TypeSize = 0, 0
-    
+
     # Refresh the coil bounding box
     def RefreshBoundingBox(self):
         # Calculate the size of the name outside the coil
         text_width, text_height = self.Parent.GetTextExtent(self.Name)
         # Calculate the bounding box size
         if self.Name != "":
-            bbx_x = self.Pos.x - max(0, (text_width - self.Size[0]) / 2)
+            bbx_x = self.Pos.x - max(0, (text_width - self.Size[0]) // 2)
             bbx_width = max(self.Size[0], text_width)
             bbx_y = self.Pos.y - (text_height + 2)
             bbx_height = self.Size[1] + (text_height + 2)
@@ -818,33 +825,33 @@
             bbx_y = self.Pos.y
             bbx_height = self.Size[1]
         self.BoundingBox = wx.Rect(bbx_x, bbx_y, bbx_width + 1, bbx_height + 1)
-        
+
     # Returns the block minimum size
     def GetMinSize(self):
         return LD_ELEMENT_SIZE
-    
+
     # Refresh the position of wire connected to coil
-    def RefreshConnected(self, exclude = []):
+    def RefreshConnected(self, exclude=None):
         self.Input.MoveConnected(exclude)
         self.Output.MoveConnected(exclude)
-    
-    # Returns the coil connector that starts with the point given if it exists 
-    def GetConnector(self, position, name = None):
+
+    # Returns the coil connector that starts with the point given if it exists
+    def GetConnector(self, position, name=None):
         # if a name is given
         if name is not None:
             # Test input and output connector
-            #if self.Input and name == self.Input.GetName():
+            # if self.Input and name == self.Input.GetName():
             #    return self.Input
             if self.Output and name == self.Output.GetName():
                 return self.Output
         return self.FindNearestConnector(position, [self.Input, self.Output])
-    
-    # Returns input and output coil connectors 
+
+    # Returns input and output coil connectors
     def GetConnectors(self):
         return {"inputs": [self.Input], "outputs": [self.Output]}
-    
+
     # Test if point given is on coil input or output connector
-    def TestConnector(self, pt, direction = None, exclude=True):
+    def TestConnector(self, pt, direction=None, exclude=True):
         # Test input connector
         if self.Input.TestPoint(pt, direction, exclude):
             return self.Input
@@ -852,17 +859,17 @@
         if self.Output.TestPoint(pt, direction, exclude):
             return self.Output
         return None
-    
+
     # Refresh the positions of the block connectors
     def RefreshConnectors(self):
         scaling = self.Parent.GetScaling()
-        position = self.Size[1] / 2 + 1
+        position = self.Size[1] // 2 + 1
         if scaling is not None:
-            position = round(float(self.Pos.y + position) / float(scaling[1])) * scaling[1] - self.Pos.y
+            position = round((self.Pos.y + position) / scaling[1]) * scaling[1] - self.Pos.y
         self.Input.SetPosition(wx.Point(0, position))
         self.Output.SetPosition(wx.Point(self.Size[0], position))
         self.RefreshConnected()
-    
+
     # Changes the coil name
     def SetName(self, name):
         self.Name = name
@@ -871,33 +878,33 @@
     # Returns the coil name
     def GetName(self):
         return self.Name
-    
+
     # Changes the coil type
     def SetType(self, type):
         self.Type = type
         self.RefreshTypeSize()
-    
+
     # Returns the coil type
     def GetType(self):
         return self.Type
-    
+
     # Method called when a LeftDClick event have been generated
     def OnLeftDClick(self, event, dc, scaling):
         # Edit the coil properties
         self.Parent.EditCoilContent(self)
-    
+
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         # Popup the default menu
         self.Parent.PopupDefaultMenu()
-    
+
     # Refreshes the coil model
     def RefreshModel(self, move=True):
         self.Parent.RefreshCoilModel(self)
         # If coil has moved, refresh the model of wires connected to output
         if move:
             self.Output.RefreshWires()
-    
+
     # Draws the highlightment of this element if it is highlighted
     def DrawHighlightment(self, dc):
         scalex, scaley = dc.GetUserScale()
@@ -906,19 +913,19 @@
         dc.SetBrush(wx.TRANSPARENT_BRUSH)
         dc.SetLogicalFunction(wx.AND)
         # Draw a two circle arcs for representing the coil
-        dc.DrawEllipticArc(round(self.Pos.x * scalex), 
-                           round((self.Pos.y - int(self.Size[1] * (sqrt(2) - 1.) / 2.) + 1) * scaley), 
-                           round(self.Size[0] * scalex), 
+        dc.DrawEllipticArc(round(self.Pos.x * scalex),
+                           round((self.Pos.y - int(self.Size[1] * (sqrt(2) - 1.) / 2.) + 1) * scaley),
+                           round(self.Size[0] * scalex),
                            round((int(self.Size[1] * sqrt(2)) - 1) * scaley),
                            135, 225)
-        dc.DrawEllipticArc(round(self.Pos.x * scalex), 
-                           round((self.Pos.y - int(self.Size[1] * (sqrt(2) - 1.) / 2.) + 1) * scaley), 
-                           round(self.Size[0] * scalex), 
+        dc.DrawEllipticArc(round(self.Pos.x * scalex),
+                           round((self.Pos.y - int(self.Size[1] * (sqrt(2) - 1.) / 2.) + 1) * scaley),
+                           round(self.Size[0] * scalex),
                            round((int(self.Size[1] * sqrt(2)) - 1) * scaley),
                            -45, 45)
         dc.SetLogicalFunction(wx.COPY)
         dc.SetUserScale(scalex, scaley)
-    
+
     # Adds an highlight to the connection
     def AddHighlight(self, infos, start, end, highlight_type):
         highlights = self.Highlights.setdefault(infos[0], [])
@@ -927,13 +934,13 @@
                 AddHighlight(highlights, (start, end, highlight_type))
         else:
             AddHighlight(highlights, ((0, 0), (0, 1), highlight_type))
-    
+
     # Removes an highlight from the connection
     def RemoveHighlight(self, infos, start, end, highlight_type):
         highlights = self.Highlights.get(infos[0], [])
         if RemoveHighlight(highlights, (start, end, highlight_type)) and len(highlights) == 0:
             self.Highlights.pop(infos[0])
-    
+
     # Removes all the highlights of one particular type from the connection
     def ClearHighlight(self, highlight_type=None):
         if highlight_type is None:
@@ -941,10 +948,10 @@
         else:
             highlight_items = self.Highlights.items()
             for name, highlights in highlight_items:
-                highlights = ClearHighlights(highlight, highlight_type)
+                highlights = ClearHighlights(highlights, highlight_type)
                 if len(highlights) == 0:
                     self.Highlights.pop(name)
-    
+
     # Draws coil
     def Draw(self, dc):
         Graphic_Element.Draw(self, dc)
@@ -953,8 +960,8 @@
         else:
             dc.SetPen(MiterPen(wx.BLACK, 2, wx.SOLID))
         dc.SetBrush(wx.TRANSPARENT_BRUSH)
-        
-        # Compiling coil type modifier symbol 
+
+        # Compiling coil type modifier symbol
         typetext = ""
         if self.Type == COIL_REVERSE:
             typetext = "/"
@@ -966,7 +973,7 @@
             typetext = "P"
         elif self.Type == COIL_FALLING:
             typetext = "N"
-        
+
         if getattr(dc, "printing", False) and not isinstance(dc, wx.PostScriptDC):
             # Draw an clipped ellipse for representing the coil
             clipping_box = dc.GetClippingBox()
@@ -988,19 +995,19 @@
                     dc.SetPen(MiterPen(wx.GREEN))
                 else:
                     dc.SetPen(MiterPen(wx.BLACK))
-                dc.DrawPoint(self.Pos.x + 1, self.Pos.y + self.Size[1] / 2 + 1)
+                dc.DrawPoint(self.Pos.x + 1, self.Pos.y + self.Size[1] // 2 + 1)
             name_size = self.NameSize
             if typetext != "":
                 type_size = self.TypeSize
-            
+
         # Draw coil name
-        name_pos = (self.Pos.x + (self.Size[0] - name_size[0]) / 2,
+        name_pos = (self.Pos.x + (self.Size[0] - name_size[0]) // 2,
                     self.Pos.y - (name_size[1] + 2))
         dc.DrawText(self.Name, name_pos[0], name_pos[1])
         # Draw the modifier symbol in the middle of coil
         if typetext != "":
-            type_pos = (self.Pos.x + (self.Size[0] - type_size[0]) / 2 + 1,
-                        self.Pos.y + (self.Size[1] - type_size[1]) / 2)
+            type_pos = (self.Pos.x + (self.Size[0] - type_size[0]) // 2 + 1,
+                        self.Pos.y + (self.Size[1] - type_size[1]) // 2)
             dc.DrawText(typetext, type_pos[0], type_pos[1])
         # Draw input and output connectors
         self.Input.Draw(dc)
@@ -1012,5 +1019,3 @@
                     DrawHighlightedText(dc, self.Name, highlights, name_pos[0], name_pos[1])
                 elif typetext != "":
                     DrawHighlightedText(dc, typetext, highlights, type_pos[0], type_pos[1])
-            
-        
--- a/graphics/RubberBand.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/graphics/RubberBand.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,32 +22,35 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from graphics.GraphicCommons import GetScaledEventPosition
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                               Viewer RubberBand
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
-"""
-Class that implements a rubberband for graphic Viewers
-"""
 
-class RubberBand:
-    
+class RubberBand(object):
+    """
+    Class that implements a rubberband for graphic Viewers
+    """
+
     def __init__(self, viewer):
         """
         Constructor
         @param viewer: Viewer on which rubberband must be drawn
         """
         self.Viewer = viewer
-        
+
         # wx.Panel on which rubberband will be drawn
         self.DrawingSurface = viewer.Editor
-        
+
         self.Reset()
-    
+
     def Reset(self):
         """
         Initialize internal attributes of rubberband
@@ -55,14 +58,14 @@
         self.StartPoint = None
         self.CurrentBBox = None
         self.LastBBox = None
-    
+
     def IsShown(self):
         """
         Indicate if rubberband is drawn on viewer
         @return: True if rubberband is drawn
         """
-        return self.CurrentBBox != None
-    
+        return self.CurrentBBox is not None
+
     def GetCurrentExtent(self):
         """
         Return the rubberband bounding box
@@ -73,7 +76,7 @@
         if self.IsShown():
             return self.CurrentBBox
         return self.LastBBox
-    
+
     def OnLeftDown(self, event, dc, scaling):
         """
         Called when left mouse is pressed on Viewer. Starts to edit a new
@@ -85,16 +88,16 @@
         # Save the point where mouse was pressed in Viewer unit, position may
         # be modified by scroll and zoom applied on viewer
         self.StartPoint = GetScaledEventPosition(event, dc, scaling)
-        
+
         # Initialize rubberband bounding box
         self.CurrentBBox = wx.Rect(self.StartPoint.x, self.StartPoint.y, 0, 0)
-        
+
         # Change viewer mouse cursor to reflect a rubberband bounding box is
         # edited
         self.DrawingSurface.SetCursor(wx.StockCursor(wx.CURSOR_CROSS))
-        
+
         self.Redraw()
-    
+
     def OnMotion(self, event, dc, scaling):
         """
         Called when mouse is dragging over Viewer. Update the current edited
@@ -106,19 +109,19 @@
         # Get mouse position in Viewer unit, position may be modified by scroll
         # and zoom applied on viewer
         pos = GetScaledEventPosition(event, dc, scaling)
-        
+
         # Save the last bounding box drawn for erasing it later
         self.LastBBox = wx.Rect(0, 0, 0, 0)
         self.LastBBox.Union(self.CurrentBBox)
-        
-        # Calculate new position and size of the box 
+
+        # Calculate new position and size of the box
         self.CurrentBBox.x = min(pos.x, self.StartPoint.x)
         self.CurrentBBox.y = min(pos.y, self.StartPoint.y)
         self.CurrentBBox.width = abs(pos.x - self.StartPoint.x) + 1
         self.CurrentBBox.height = abs(pos.y - self.StartPoint.y) + 1
-        
+
         self.Redraw()
-    
+
     def OnLeftUp(self, event, dc, scaling):
         """
         Called when mouse is release from Viewer. Erase the current edited
@@ -129,16 +132,16 @@
         """
         # Change viewer mouse cursor to default
         self.DrawingSurface.SetCursor(wx.NullCursor)
-        
+
         # Save the last edited bounding box
         self.LastBBox = self.CurrentBBox
         self.CurrentBBox = None
-        
+
         self.Redraw()
-    
+
     def DrawBoundingBoxes(self, bboxes, dc=None):
         """
-        Draw a list of bounding box on Viewer in the order given using XOR 
+        Draw a list of bounding box on Viewer in the order given using XOR
         logical function
         @param bboxes: List of bounding boxes to draw on viewer
         @param dc: Device Context of Viewer (default None)
@@ -146,38 +149,38 @@
         # Get viewer Device Context if not given
         if dc is None:
             dc = self.Viewer.GetLogicalDC()
-        
+
         # Save current viewer scale factors before resetting them in order to
         # avoid rubberband pen to be scaled
         scalex, scaley = dc.GetUserScale()
         dc.SetUserScale(1, 1)
-        
+
         # Set DC drawing style
         dc.SetPen(wx.Pen(wx.WHITE, style=wx.DOT))
         dc.SetBrush(wx.TRANSPARENT_BRUSH)
         dc.SetLogicalFunction(wx.XOR)
-        
+
         # Draw the bounding boxes using viewer scale factor
         for bbox in bboxes:
             if bbox is not None:
                 dc.DrawRectangle(
-                    bbox.x * scalex, bbox.y * scaley, 
+                    bbox.x * scalex, bbox.y * scaley,
                     bbox.width * scalex, bbox.height * scaley)
-        
+
         dc.SetLogicalFunction(wx.COPY)
-        
+
         # Restore Viewer scale factor
         dc.SetUserScale(scalex, scaley)
-    
-    def Redraw(self, dc = None):
+
+    def Redraw(self, dc=None):
         """
         Redraw rubberband on Viewer
         @param dc: Device Context of Viewer (default None)
         """
         # Erase last bbox and draw current bbox
         self.DrawBoundingBoxes([self.LastBBox, self.CurrentBBox], dc)
-    
-    def Erase(self, dc = None):
+
+    def Erase(self, dc=None):
         """
         Erase rubberband from Viewer
         @param dc: Device Context of Viewer (default None)
@@ -185,7 +188,7 @@
         # Erase last bbox
         self.DrawBoundingBoxes([self.LastBBox], dc)
 
-    def Draw(self, dc = None):
+    def Draw(self, dc=None):
         """
         Draw rubberband on Viewer
         @param dc: Device Context of Viewer (default None)
--- a/graphics/SFC_Objects.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/graphics/SFC_Objects.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,30 +22,37 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
+from future.builtins import round
+
 import wx
+from six.moves import xrange
 
 from graphics.GraphicCommons import *
 from graphics.DebugDataConsumer import DebugDataConsumer
 from plcopen.structures import *
 
+
 def GetWireSize(block):
     if isinstance(block, SFC_Step):
         return SFC_WIRE_MIN_SIZE + block.GetActionExtraLineNumber() * SFC_ACTION_MIN_SIZE[1]
     else:
         return SFC_WIRE_MIN_SIZE
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                         Sequencial Function Chart Step
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements the graphic representation of a step
-"""
+# -------------------------------------------------------------------------------
+
 
 class SFC_Step(Graphic_Element, DebugDataConsumer):
-    
+    """
+    Class that implements the graphic representation of a step
+    """
+
     # Create a new step
-    def __init__(self, parent, name, initial = False, id = None):
+    def __init__(self, parent, name, initial=False, id=None):
         Graphic_Element.__init__(self, parent)
         DebugDataConsumer.__init__(self)
         self.SetName(name)
@@ -55,14 +62,14 @@
         self.Size = wx.Size(SFC_STEP_DEFAULT_SIZE[0], SFC_STEP_DEFAULT_SIZE[1])
         # Create an input and output connector
         if not self.Initial:
-            self.Input = Connector(self, "", None, wx.Point(self.Size[0] / 2, 0), NORTH)
+            self.Input = Connector(self, "", None, wx.Point(self.Size[0] // 2, 0), NORTH)
         else:
             self.Input = None
         self.Output = None
         self.Action = None
         self.PreviousValue = None
         self.PreviousSpreading = False
-    
+
     def Flush(self):
         if self.Input is not None:
             self.Input.Flush()
@@ -70,16 +77,16 @@
         if self.Output is not None:
             self.Output.Flush()
             self.Output = None
-        if self.Output is not None:
+        if self.Action is not None:
             self.Action.Flush()
             self.Action = None
-    
+
     def SetForced(self, forced):
         if self.Forced != forced:
             self.Forced = forced
             if self.Visible:
                 self.Parent.ElementNeedRefresh(self)
-    
+
     def SetValue(self, value):
         self.PreviousValue = self.Value
         self.Value = value
@@ -87,7 +94,7 @@
             if self.Visible:
                 self.Parent.ElementNeedRefresh(self)
             self.SpreadCurrent()
-    
+
     def SpreadCurrent(self):
         if self.Parent.Debug:
             spreading = self.Value
@@ -102,9 +109,9 @@
                 if self.Action is not None:
                     self.Action.SpreadCurrent(False)
             self.PreviousSpreading = spreading
-    
+
     # Make a clone of this SFC_Step
-    def Clone(self, parent, id = None, name = "Step", pos = None):
+    def Clone(self, parent, id=None, name="Step", pos=None):
         step = SFC_Step(parent, name, self.Initial, id)
         step.SetSize(self.Size[0], self.Size[1])
         if pos is not None:
@@ -118,7 +125,7 @@
         if self.Action:
             step.Action = self.Action.Clone(step)
         return step
-    
+
     def GetConnectorTranslation(self, element):
         connectors = {}
         if self.Input is not None:
@@ -128,9 +135,9 @@
         if self.Action is not None:
             connectors[self.Action] = element.Action
         return connectors
-    
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         rect = Graphic_Element.GetRedrawRect(self, movex, movey)
         if self.Input:
             rect = rect.Union(self.Input.GetRedrawRect(movex, movey))
@@ -146,91 +153,93 @@
             if self.Action and self.Action.IsConnected():
                 rect = rect.Union(self.Action.GetConnectedRedrawRect(movex, movey))
         return rect
-    
+
     # Delete this step by calling the appropriate method
     def Delete(self):
         self.Parent.DeleteStep(self)
-    
+
     # Unconnect input and output
     def Clean(self):
         if self.Input:
-            self.Input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+            self.Input.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
         if self.Output:
-            self.Output.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+            self.Output.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
         if self.Action:
-            self.Action.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
-    
+            self.Action.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+
     # Refresh the size of text for name
     def RefreshNameSize(self):
         self.NameSize = self.Parent.GetTextExtent(self.Name)
-    
+
     # Add output connector to step
     def AddInput(self):
         if not self.Input:
-            self.Input = Connector(self, "", None, wx.Point(self.Size[0] / 2, 0), NORTH)
+            self.Input = Connector(self, "", None, wx.Point(self.Size[0] // 2, 0), NORTH)
             self.RefreshBoundingBox()
-    
+
     # Remove output connector from step
     def RemoveInput(self):
         if self.Input:
-            self.Input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+            self.Input.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
             self.Input = None
             self.RefreshBoundingBox()
-    
+
     # Add output connector to step
     def AddOutput(self):
         if not self.Output:
-            self.Output = Connector(self, "", None, wx.Point(self.Size[0] / 2, self.Size[1]), SOUTH, onlyone = True)
+            self.Output = Connector(self, "", None, wx.Point(self.Size[0] // 2, self.Size[1]), SOUTH, onlyone=True)
             self.RefreshBoundingBox()
-    
+
     # Remove output connector from step
     def RemoveOutput(self):
         if self.Output:
-            self.Output.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+            self.Output.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
             self.Output = None
             self.RefreshBoundingBox()
-    
+
     # Add action connector to step
     def AddAction(self):
         if not self.Action:
-            self.Action = Connector(self, "", None, wx.Point(self.Size[0], self.Size[1] / 2), EAST, onlyone = True)
+            self.Action = Connector(self, "", None, wx.Point(self.Size[0], self.Size[1] // 2), EAST, onlyone=True)
             self.RefreshBoundingBox()
-    
+
     # Remove action connector from step
     def RemoveAction(self):
         if self.Action:
-            self.Action.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+            self.Action.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
             self.Action = None
             self.RefreshBoundingBox()
-    
+
     # Refresh the step bounding box
     def RefreshBoundingBox(self):
+        # TODO: check and remove dead coded
+        #
         # Calculate the bounding box size
-        if self.Action:
-            bbx_width = self.Size[0] + CONNECTOR_SIZE
-        else:
-            bbx_width = self.Size[0]
-        if self.Initial:
-            bbx_y = self.Pos.y
-            bbx_height = self.Size[1]
-            if self.Output:
-                bbx_height += CONNECTOR_SIZE
-        else:
-            bbx_y = self.Pos.y - CONNECTOR_SIZE
-            bbx_height = self.Size[1] + CONNECTOR_SIZE
-            if self.Output:
-                bbx_height += CONNECTOR_SIZE
-        #self.BoundingBox = wx.Rect(self.Pos.x, bbx_y, bbx_width + 1, bbx_height + 1)
+        # if self.Action:
+        #     bbx_width = self.Size[0] + CONNECTOR_SIZE
+        # else:
+        #     bbx_width = self.Size[0]
+        # if self.Initial:
+        #     bbx_y = self.Pos.y
+        #     bbx_height = self.Size[1]
+        #     if self.Output:
+        #         bbx_height += CONNECTOR_SIZE
+        # else:
+        #     bbx_y = self.Pos.y - CONNECTOR_SIZE
+        #     bbx_height = self.Size[1] + CONNECTOR_SIZE
+        #     if self.Output:
+        #         bbx_height += CONNECTOR_SIZE
+        # self.BoundingBox = wx.Rect(self.Pos.x, bbx_y, bbx_width + 1, bbx_height + 1)
         self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
-        
+
     # Refresh the positions of the step connectors
     def RefreshConnectors(self):
         scaling = self.Parent.GetScaling()
-        horizontal_pos = self.Size[0] / 2
-        vertical_pos = self.Size[1] / 2
+        horizontal_pos = self.Size[0] // 2
+        vertical_pos = self.Size[1] // 2
         if scaling is not None:
-            horizontal_pos = round(float(self.Pos.x + horizontal_pos) / float(scaling[0])) * scaling[0] - self.Pos.x
-            vertical_pos = round(float(self.Pos.y + vertical_pos) / float(scaling[1])) * scaling[1] - self.Pos.y
+            horizontal_pos = round((self.Pos.x + horizontal_pos) / scaling[0]) * scaling[0] - self.Pos.x
+            vertical_pos = round((self.Pos.y + vertical_pos) / scaling[1]) * scaling[1] - self.Pos.y
         # Update input position if it exists
         if self.Input:
             self.Input.SetPosition(wx.Point(horizontal_pos, 0))
@@ -241,22 +250,22 @@
         if self.Action:
             self.Action.SetPosition(wx.Point(self.Size[0], vertical_pos))
         self.RefreshConnected()
-    
+
     # Refresh the position of wires connected to step
-    def RefreshConnected(self, exclude = []):
+    def RefreshConnected(self, exclude=None):
         if self.Input:
             self.Input.MoveConnected(exclude)
         if self.Output:
             self.Output.MoveConnected(exclude)
         if self.Action:
             self.Action.MoveConnected(exclude)
-    
-    # Returns the step connector that starts with the point given if it exists 
-    def GetConnector(self, position, name = None):
+
+    # Returns the step connector that starts with the point given if it exists
+    def GetConnector(self, position, name=None):
         # if a name is given
         if name is not None:
             # Test input, output and action connector if they exists
-            #if self.Input and name == self.Input.GetName():
+            # if self.Input and name == self.Input.GetName():
             #    return self.Input
             if self.Output and name == self.Output.GetName():
                 return self.Output
@@ -273,12 +282,12 @@
         if self.Action:
             connectors.append(self.Action)
         return self.FindNearestConnector(position, connectors)
-    
-    # Returns action step connector 
+
+    # Returns action step connector
     def GetActionConnector(self):
         return self.Action
-        
-    # Returns input and output step connectors 
+
+    # Returns input and output step connectors
     def GetConnectors(self):
         connectors = {"inputs": [], "outputs": []}
         if self.Input:
@@ -286,9 +295,9 @@
         if self.Output:
             connectors["outputs"].append(self.Output)
         return connectors
-    
+
     # Test if point given is on step input or output connector
-    def TestConnector(self, pt, direction = None, exclude=True):
+    def TestConnector(self, pt, direction=None, exclude=True):
         # Test input connector if it exists
         if self.Input and self.Input.TestPoint(pt, direction, exclude):
             return self.Input
@@ -312,7 +321,7 @@
     # Returns the step initial property
     def GetInitial(self):
         return self.Initial
-    
+
     # Returns the connector connected to input
     def GetPreviousConnector(self):
         if self.Input:
@@ -320,7 +329,7 @@
             if len(wires) == 1:
                 return wires[0][0].GetOtherConnected(self.Input)
         return None
-    
+
     # Returns the connector connected to output
     def GetNextConnector(self):
         if self.Output:
@@ -328,7 +337,7 @@
             if len(wires) == 1:
                 return wires[0][0].GetOtherConnected(self.Output)
         return None
-    
+
     # Returns the connector connected to action
     def GetActionConnected(self):
         if self.Action:
@@ -336,7 +345,7 @@
             if len(wires) == 1:
                 return wires[0][0].GetOtherConnected(self.Action)
         return None
-    
+
     # Returns the number of action line
     def GetActionExtraLineNumber(self):
         if self.Action:
@@ -346,7 +355,7 @@
             action_block = wires[0][0].GetOtherConnected(self.Action).GetParentBlock()
             return max(0, action_block.GetLineNumber() - 1)
         return 0
-    
+
     # Returns the step minimum size
     def GetMinSize(self):
         text_width, text_height = self.Parent.GetTextExtent(self.Name)
@@ -354,10 +363,10 @@
             return text_width + 14, text_height + 14
         else:
             return text_width + 10, text_height + 10
-    
+
     # Updates the step size
     def UpdateSize(self, width, height):
-        diffx = self.Size.GetWidth() / 2 - width / 2
+        diffx = self.Size.GetWidth() // 2 - width // 2
         diffy = height - self.Size.GetHeight()
         self.Move(diffx, 0)
         Graphic_Element.SetSize(self, width, height)
@@ -365,7 +374,7 @@
             self.RefreshConnected()
         else:
             self.RefreshOutputPosition((0, diffy))
-    
+
     # Align input element with this step
     def RefreshInputPosition(self):
         if self.Input:
@@ -382,9 +391,9 @@
                         input_block.MoveActionBlock((diffx, 0))
                     input_block.Move(diffx, 0)
                     input_block.RefreshInputPosition()
-    
+
     # Align output element with this step
-    def RefreshOutputPosition(self, move = None):
+    def RefreshOutputPosition(self, move=None):
         if self.Output:
             wires = self.Output.GetWires()
             if len(wires) != 1:
@@ -400,7 +409,7 @@
                 if isinstance(output_block, SFC_Step):
                     output_block.MoveActionBlock((diffx, diffy))
                 wires[0][0].SetPoints([wx.Point(current_pos.x, current_pos.y + wire_size),
-                    wx.Point(current_pos.x, current_pos.y)])
+                                       wx.Point(current_pos.x, current_pos.y)])
                 if not isinstance(output_block, SFC_Divergence) or output_block.GetConnectors()["inputs"].index(output) == 0:
                     output_block.Move(diffx, diffy, self.Parent.Wires)
                     output_block.RefreshOutputPosition((diffx, diffy))
@@ -422,7 +431,7 @@
                     output_block.MoveActionBlock((diffx, 0))
                 output_block.Move(diffx, 0)
                 output_block.RefreshOutputPosition()
-    
+
     # Refresh action element with this step
     def MoveActionBlock(self, move):
         if self.Action:
@@ -432,34 +441,33 @@
             action_block = wires[0][0].GetOtherConnected(self.Action).GetParentBlock()
             action_block.Move(move[0], move[1], self.Parent.Wires)
             wires[0][0].Move(move[0], move[1], True)
-    
+
     # Resize the divergence from position and size given
     def Resize(self, x, y, width, height):
         if self.Parent.GetDrawingMode() != FREEDRAWING_MODE:
             self.UpdateSize(width, height)
         else:
             Graphic_Element.Resize(self, x, y, width, height)
-    
+
     # Method called when a LeftDClick event have been generated
     def OnLeftDClick(self, event, dc, scaling):
         # Edit the step properties
         self.Parent.EditStepContent(self)
-    
+
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         # Popup the menu with special items for a step
         self.Parent.PopupDefaultMenu()
-    
+
     # Refreshes the step state according to move defined and handle selected
     def ProcessDragging(self, movex, movey, event, scaling):
-        handle_type, handle = self.Handle
+        handle_type, _handle = self.Handle
         if handle_type == HANDLE_MOVE:
             movex = max(-self.BoundingBox.x, movex)
             movey = max(-self.BoundingBox.y, movey)
             if scaling is not None:
-                movex = round(float(self.Pos.x + movex) / float(scaling[0])) * scaling[0] - self.Pos.x
-                movey = round(float(self.Pos.y + movey) / float(scaling[1])) * scaling[1] - self.Pos.y
-            action_block = None
+                movex = round((self.Pos.x + movex) / scaling[0]) * scaling[0] - self.Pos.x
+                movey = round((self.Pos.y + movey) / scaling[1]) * scaling[1] - self.Pos.y
             if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
                 self.Move(movex, movey)
                 self.RefreshConnected()
@@ -477,17 +485,17 @@
                 return movex, 0
         else:
             return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling)
-    
+
     # Refresh input element model
     def RefreshInputModel(self):
         if self.Input:
             input = self.GetPreviousConnector()
-            if input:                
+            if input:
                 input_block = input.GetParentBlock()
                 input_block.RefreshModel(False)
                 if not isinstance(input_block, SFC_Divergence):
                     input_block.RefreshInputModel()
-    
+
     # Refresh output element model
     def RefreshOutputModel(self, move=False):
         if self.Output:
@@ -497,7 +505,7 @@
                 output_block.RefreshModel(False)
                 if not isinstance(output_block, SFC_Divergence) or move:
                     output_block.RefreshOutputModel(move)
-    
+
     # Refreshes the step model
     def RefreshModel(self, move=True):
         self.Parent.RefreshStepModel(self)
@@ -513,21 +521,21 @@
                 self.RefreshOutputModel(self.Initial)
             elif self.Output:
                 self.Output.RefreshWires()
-    
+
     # Adds an highlight to the connection
     def AddHighlight(self, infos, start, end, highlight_type):
         if infos[0] == "name" and start[0] == 0 and end[0] == 0:
             AddHighlight(self.Highlights, (start, end, highlight_type))
-    
+
     # Removes an highlight from the connection
     def RemoveHighlight(self, infos, start, end, highlight_type):
         if infos[0] == "name":
             RemoveHighlight(self.Highlights, (start, end, highlight_type))
-    
+
     # Removes all the highlights of one particular type from the connection
     def ClearHighlight(self, highlight_type=None):
         ClearHighlights(self.Highlights, highlight_type)
-    
+
     # Draws step
     def Draw(self, dc):
         Graphic_Element.Draw(self, dc)
@@ -541,19 +549,19 @@
         else:
             dc.SetPen(MiterPen(wx.BLACK))
         dc.SetBrush(wx.WHITE_BRUSH)
-        
+
         if getattr(dc, "printing", False):
             name_size = dc.GetTextExtent(self.Name)
         else:
             name_size = self.NameSize
-        
+
         # Draw two rectangles for representing the step
         dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
         if self.Initial:
             dc.DrawRectangle(self.Pos.x + 2, self.Pos.y + 2, self.Size[0] - 3, self.Size[1] - 3)
         # Draw step name
-        name_pos = (self.Pos.x + (self.Size[0] - name_size[0]) / 2,
-                    self.Pos.y + (self.Size[1] - name_size[1]) / 2)
+        name_pos = (self.Pos.x + (self.Size[0] - name_size[0]) // 2,
+                    self.Pos.y + (self.Size[1] - name_size[1]) // 2)
         dc.DrawText(self.Name, name_pos[0], name_pos[1])
         # Draw input and output connectors
         if self.Input:
@@ -562,23 +570,23 @@
             self.Output.Draw(dc)
         if self.Action:
             self.Action.Draw(dc)
-        
+
         if not getattr(dc, "printing", False):
             DrawHighlightedText(dc, self.Name, self.Highlights, name_pos[0], name_pos[1])
-        
-
-#-------------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------------
 #                       Sequencial Function Chart Transition
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements the graphic representation of a transition
-"""
+# -------------------------------------------------------------------------------
+
 
 class SFC_Transition(Graphic_Element, DebugDataConsumer):
-    
+    """
+    Class that implements the graphic representation of a transition
+    """
+
     # Create a new transition
-    def __init__(self, parent, type = "reference", condition = None, priority = 0, id = None):
+    def __init__(self, parent, type="reference", condition=None, priority=0, id=None):
         Graphic_Element.__init__(self, parent)
         DebugDataConsumer.__init__(self)
         self.Type = None
@@ -586,14 +594,14 @@
         self.Priority = 0
         self.Size = wx.Size(SFC_TRANSITION_SIZE[0], SFC_TRANSITION_SIZE[1])
         # Create an input and output connector
-        self.Input = Connector(self, "", None, wx.Point(self.Size[0] / 2, 0), NORTH, onlyone = True)
-        self.Output = Connector(self, "", None, wx.Point(self.Size[0] / 2, self.Size[1]), SOUTH, onlyone = True)
+        self.Input = Connector(self,  "", None, wx.Point(self.Size[0] // 2, 0),            NORTH, onlyone=True)
+        self.Output = Connector(self, "", None, wx.Point(self.Size[0] // 2, self.Size[1]), SOUTH, onlyone=True)
         self.SetType(type, condition)
         self.SetPriority(priority)
         self.Highlights = {}
         self.PreviousValue = None
         self.PreviousSpreading = False
-    
+
     def Flush(self):
         if self.Input is not None:
             self.Input.Flush()
@@ -604,13 +612,13 @@
         if self.Type == "connection" and self.Condition is not None:
             self.Condition.Flush()
             self.Condition = None
-    
+
     def SetForced(self, forced):
         if self.Forced != forced:
             self.Forced = forced
             if self.Visible:
                 self.Parent.ElementNeedRefresh(self)
-        
+
     def SetValue(self, value):
         self.PreviousValue = self.Value
         self.Value = value
@@ -618,7 +626,7 @@
             if self.Visible:
                 self.Parent.ElementNeedRefresh(self)
             self.SpreadCurrent()
-    
+
     def SpreadCurrent(self):
         if self.Parent.Debug:
             if self.Value is None:
@@ -629,9 +637,9 @@
             elif not spreading and self.PreviousSpreading:
                 self.Output.SpreadCurrent(False)
             self.PreviousSpreading = spreading
-    
+
     # Make a clone of this SFC_Transition
-    def Clone(self, parent, id = None, pos = None):
+    def Clone(self, parent, id=None, pos=None):
         transition = SFC_Transition(parent, self.Type, self.Condition, self.Priority, id)
         transition.SetSize(self.Size[0], self.Size[1])
         if pos is not None:
@@ -643,18 +651,20 @@
         if self.Type == "connection":
             transition.Condition = self.Condition.Clone(transition)
         return transition
-    
+
     def GetConnectorTranslation(self, element):
-        connectors = {self.Input : element.Input, self.Output : element.Output}
+        connectors = {self.Input: element.Input, self.Output: element.Output}
         if self.Type == "connection" and self.Condition is not None:
             connectors[self.Condition] = element.Condition
         return connectors
-    
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         rect = Graphic_Element.GetRedrawRect(self, movex, movey)
-        rect = rect.Union(self.Input.GetRedrawRect(movex, movey))
-        rect = rect.Union(self.Output.GetRedrawRect(movex, movey))
+        if self.Input:
+            rect = rect.Union(self.Input.GetRedrawRect(movex, movey))
+        if self.Output:
+            rect = rect.Union(self.Output.GetRedrawRect(movex, movey))
         if movex != 0 or movey != 0:
             if self.Input.IsConnected():
                 rect = rect.Union(self.Input.GetConnectedRedrawRect(movex, movey))
@@ -663,17 +673,17 @@
             if self.Type == "connection" and self.Condition.IsConnected():
                 rect = rect.Union(self.Condition.GetConnectedRedrawRect(movex, movey))
         return rect
-    
+
     # Forbids to change the transition size
     def SetSize(self, width, height):
         if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
             Graphic_Element.SetSize(self, width, height)
-    
+
     # Forbids to resize the transition
     def Resize(self, x, y, width, height):
         if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
             Graphic_Element.Resize(self, x, y, width, height)
-    
+
     # Refresh the size of text for name
     def RefreshConditionSize(self):
         if self.Type != "connection":
@@ -681,7 +691,7 @@
                 self.ConditionSize = self.Parent.GetTextExtent(self.Condition)
             else:
                 self.ConditionSize = self.Parent.GetTextExtent("Transition")
-    
+
     # Refresh the size of text for name
     def RefreshPrioritySize(self):
         if self.Priority != "":
@@ -692,28 +702,28 @@
     # Delete this transition by calling the appropriate method
     def Delete(self):
         self.Parent.DeleteTransition(self)
-    
+
     # Unconnect input and output
     def Clean(self):
-        self.Input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
-        self.Output.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+        self.Input.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+        self.Output.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
         if self.Type == "connection":
-            self.Condition.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
-    
+            self.Condition.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+
     # Returns if the point given is in the bounding box
     def HitTest(self, pt, connectors=True):
         if self.Type != "connection":
             # Calculate the bounding box of the condition outside the transition
             text_width, text_height = self.ConditionSize
             text_bbx = wx.Rect(self.Pos.x + self.Size[0] + 5,
-                               self.Pos.y + (self.Size[1] - text_height) / 2,
+                               self.Pos.y + (self.Size[1] - text_height) // 2,
                                text_width,
                                text_height)
             test_text = text_bbx.InsideXY(pt.x, pt.y)
         else:
             test_text = False
         return test_text or Graphic_Element.HitTest(self, pt, connectors)
-    
+
     # Refresh the transition bounding box
     def RefreshBoundingBox(self):
         bbx_x, bbx_y, bbx_width, bbx_height = self.Pos.x, self.Pos.y, self.Size[0], self.Size[1]
@@ -728,32 +738,32 @@
             text_width, text_height = self.ConditionSize
             # Calculate the bounding box size
             bbx_width = max(bbx_width, self.Size[0] + 5 + text_width)
-            bbx_y = min(bbx_y, self.Pos.y - max(0, (text_height - self.Size[1]) / 2))
-            bbx_height = max(bbx_height, self.Pos.y - bbx_y + (self.Size[1] + text_height) / 2)
+            bbx_y = min(bbx_y, self.Pos.y - max(0, (text_height - self.Size[1]) // 2))
+            bbx_height = max(bbx_height, self.Pos.y - bbx_y + (self.Size[1] + text_height) // 2)
         self.BoundingBox = wx.Rect(bbx_x, bbx_y, bbx_width + 1, bbx_height + 1)
-        
+
     # Returns the connector connected to input
     def GetPreviousConnector(self):
         wires = self.Input.GetWires()
         if len(wires) == 1:
             return wires[0][0].GetOtherConnected(self.Input)
         return None
-    
+
     # Returns the connector connected to output
     def GetNextConnector(self):
         wires = self.Output.GetWires()
         if len(wires) == 1:
             return wires[0][0].GetOtherConnected(self.Output)
         return None
-    
+
     # Refresh the positions of the transition connectors
     def RefreshConnectors(self):
         scaling = self.Parent.GetScaling()
-        horizontal_pos = self.Size[0] / 2
-        vertical_pos = self.Size[1] / 2
+        horizontal_pos = self.Size[0] // 2
+        vertical_pos = self.Size[1] // 2
         if scaling is not None:
-            horizontal_pos = round(float(self.Pos.x + horizontal_pos) / float(scaling[0])) * scaling[0] - self.Pos.x
-            vertical_pos = round(float(self.Pos.y + vertical_pos) / float(scaling[1])) * scaling[1] - self.Pos.y
+            horizontal_pos = round((self.Pos.x + horizontal_pos) / scaling[0]) * scaling[0] - self.Pos.x
+            vertical_pos = round((self.Pos.y + vertical_pos) / scaling[1]) * scaling[1] - self.Pos.y
         # Update input position
         self.Input.SetPosition(wx.Point(horizontal_pos, 0))
         # Update output position
@@ -761,20 +771,20 @@
         if self.Type == "connection":
             self.Condition.SetPosition(wx.Point(0, vertical_pos))
         self.RefreshConnected()
-    
+
     # Refresh the position of the wires connected to transition
-    def RefreshConnected(self, exclude = []):
+    def RefreshConnected(self, exclude=None):
         self.Input.MoveConnected(exclude)
         self.Output.MoveConnected(exclude)
         if self.Type == "connection":
             self.Condition.MoveConnected(exclude)
-    
-    # Returns the transition connector that starts with the point given if it exists 
-    def GetConnector(self, position, name = None):
+
+    # Returns the transition connector that starts with the point given if it exists
+    def GetConnector(self, position, name=None):
         # if a name is given
         if name is not None:
             # Test input and output connector
-            #if name == self.Input.GetName():
+            # if name == self.Input.GetName():
             #    return self.Input
             if name == self.Output.GetName():
                 return self.Output
@@ -784,19 +794,19 @@
         if self.Type == "connection":
             connectors.append(self.Condition)
         return self.FindNearestConnector(position, connectors)
-    
+
     # Returns the transition condition connector
     def GetConditionConnector(self):
         if self.Type == "connection":
             return self.Condition
         return None
-        
+
     # Returns input and output transition connectors
     def GetConnectors(self):
         return {"inputs": [self.Input], "outputs": [self.Output]}
-        
+
     # Test if point given is on transition input or output connector
-    def TestConnector(self, pt, direction = None, exclude=True):
+    def TestConnector(self, pt, direction=None, exclude=True):
         # Test input connector
         if self.Input.TestPoint(pt, direction, exclude):
             return self.Input
@@ -809,25 +819,25 @@
         return None
 
     # Changes the transition type
-    def SetType(self, type, condition = None):
+    def SetType(self, type, condition=None):
         if self.Type != type:
             if self.Type == "connection":
-               self.Condition.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) 
+                self.Condition.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
             self.Type = type
             if type == "connection":
-                self.Condition = Connector(self, "", "BOOL", wx.Point(0, self.Size[1] / 2), WEST)
+                self.Condition = Connector(self, "", "BOOL", wx.Point(0, self.Size[1] // 2), WEST)
             else:
-                if condition == None:
+                if condition is None:
                     condition = ""
                 self.Condition = condition
                 self.RefreshConditionSize()
         elif self.Type != "connection":
-            if condition == None:
+            if condition is None:
                 condition = ""
             self.Condition = condition
             self.RefreshConditionSize()
         self.RefreshBoundingBox()
-        
+
     # Returns the transition type
     def GetType(self):
         return self.Type
@@ -837,7 +847,7 @@
         self.Priority = priority
         self.RefreshPrioritySize()
         self.RefreshBoundingBox()
-        
+
     # Returns the transition type
     def GetPriority(self):
         return self.Priority
@@ -847,14 +857,13 @@
         if self.Type != "connection":
             return self.Condition
         return None
-        
+
     # Returns the transition minimum size
     def GetMinSize(self):
         return SFC_TRANSITION_SIZE
-    
+
     # Align input element with this step
     def RefreshInputPosition(self):
-        wires = self.Input.GetWires()
         current_pos = self.Input.GetPosition(False)
         input = self.GetPreviousConnector()
         if input:
@@ -868,9 +877,9 @@
                     input_block.MoveActionBlock((diffx, 0))
                 input_block.Move(diffx, 0)
                 input_block.RefreshInputPosition()
-    
+
     # Align output element with this step
-    def RefreshOutputPosition(self, move = None):
+    def RefreshOutputPosition(self, move=None):
         wires = self.Output.GetWires()
         if len(wires) != 1:
             return
@@ -900,25 +909,25 @@
     def OnLeftDClick(self, event, dc, scaling):
         # Edit the transition properties
         self.Parent.EditTransitionContent(self)
-    
+
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         # Popup the menu with special items for a step
         self.Parent.PopupDefaultMenu()
-    
+
     # Refreshes the transition state according to move defined and handle selected
     def ProcessDragging(self, movex, movey, event, scaling):
         if self.Parent.GetDrawingMode() != FREEDRAWING_MODE:
             movex = max(-self.BoundingBox.x, movex)
             if scaling is not None:
-                movex = round(float(self.Pos.x + movex) / float(scaling[0])) * scaling[0] - self.Pos.x
+                movex = round((self.Pos.x + movex) / scaling[0]) * scaling[0] - self.Pos.x
             self.Move(movex, 0)
             self.RefreshInputPosition()
             self.RefreshOutputPosition()
             return movex, 0
         else:
-            return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling, width_fac = 2, height_fac = 2)
-    
+            return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling, width_fac=2, height_fac=2)
+
     # Refresh input element model
     def RefreshInputModel(self):
         if self.Parent.GetDrawingMode() != FREEDRAWING_MODE:
@@ -928,7 +937,7 @@
                 input_block.RefreshModel(False)
                 if not isinstance(input_block, SFC_Divergence):
                     input_block.RefreshInputModel()
-    
+
     # Refresh output element model
     def RefreshOutputModel(self, move=False):
         output = self.GetNextConnector()
@@ -937,7 +946,7 @@
             output_block.RefreshModel(False)
             if not isinstance(output_block, SFC_Divergence) or move:
                 output_block.RefreshOutputModel(move)
-    
+
     # Refreshes the transition model
     def RefreshModel(self, move=True):
         self.Parent.RefreshTransitionModel(self)
@@ -948,20 +957,20 @@
                 self.RefreshOutputModel()
             else:
                 self.Output.RefreshWires()
-    
+
     # Adds an highlight to the block
-    def AddHighlight(self, infos, start, end ,highlight_type):
+    def AddHighlight(self, infos, start, end, highlight_type):
         if infos[0] in ["reference", "inline", "priority"] and start[0] == 0 and end[0] == 0:
             highlights = self.Highlights.setdefault(infos[0], [])
             AddHighlight(highlights, (start, end, highlight_type))
-    
+
     # Removes an highlight from the block
     def RemoveHighlight(self, infos, start, end, highlight_type):
         if infos[0] in ["reference", "inline", "priority"]:
             highlights = self.Highlights.get(infos[0], [])
             if RemoveHighlight(highlights, (start, end, highlight_type)) and len(highlights) == 0:
                 self.Highlights.pop(infos[0])
-            
+
     # Removes all the highlights of one particular type from the block
     def ClearHighlight(self, highlight_type=None):
         if highlight_type is None:
@@ -969,10 +978,10 @@
         else:
             highlight_items = self.Highlights.items()
             for name, highlights in highlight_items:
-                highlights = ClearHighlights(highlight, highlight_type)
+                highlights = ClearHighlights(highlights, highlight_type)
                 if len(highlights) == 0:
                     self.Highlights.pop(name)
-    
+
     # Draws transition
     def Draw(self, dc):
         Graphic_Element.Draw(self, dc)
@@ -989,7 +998,7 @@
         else:
             dc.SetPen(MiterPen(wx.BLACK))
             dc.SetBrush(wx.BLACK_BRUSH)
-        
+
         if getattr(dc, "printing", False):
             if self.Type != "connection":
                 condition_size = dc.GetTextExtent(self.Condition)
@@ -1000,14 +1009,14 @@
                 condition_size = self.ConditionSize
             if self.Priority != 0:
                 priority_size = self.PrioritySize
-        
+
         # Draw plain rectangle for representing the transition
-        dc.DrawRectangle(self.Pos.x, 
-                         self.Pos.y + (self.Size[1] - SFC_TRANSITION_SIZE[1])/2, 
+        dc.DrawRectangle(self.Pos.x,
+                         self.Pos.y + (self.Size[1] - SFC_TRANSITION_SIZE[1]) // 2,
                          self.Size[0] + 1,
                          SFC_TRANSITION_SIZE[1] + 1)
         vertical_line_x = self.Input.GetPosition()[0]
-        dc.DrawLine(vertical_line_x, self.Pos.y, vertical_line_x, self.Pos.y + self.Size[1] + 1) 
+        dc.DrawLine(vertical_line_x, self.Pos.y, vertical_line_x, self.Pos.y + self.Size[1] + 1)
         # Draw transition condition
         if self.Type != "connection":
             if self.Condition != "":
@@ -1015,7 +1024,7 @@
             else:
                 condition = "Transition"
             condition_pos = (self.Pos.x + self.Size[0] + 5,
-                             self.Pos.y + (self.Size[1] - condition_size[1]) / 2)
+                             self.Pos.y + (self.Size[1] - condition_size[1]) // 2)
             dc.DrawText(condition, condition_pos[0], condition_pos[1])
         # Draw priority number
         if self.Priority != 0:
@@ -1026,7 +1035,7 @@
         self.Output.Draw(dc)
         if self.Type == "connection":
             self.Condition.Draw(dc)
-        
+
         if not getattr(dc, "printing", False):
             for name, highlights in self.Highlights.iteritems():
                 if name == "priority":
@@ -1034,19 +1043,20 @@
                 else:
                     DrawHighlightedText(dc, condition, highlights, condition_pos[0], condition_pos[1])
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                Sequencial Function Chart Divergence and Convergence
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements the graphic representation of a divergence or convergence,
-selection or simultaneous
-"""
+# -------------------------------------------------------------------------------
+
 
 class SFC_Divergence(Graphic_Element):
-    
+    """
+    Class that implements the graphic representation of a divergence or convergence,
+    selection or simultaneous
+    """
+
     # Create a new divergence
-    def __init__(self, parent, type, number = 2, id = None):
+    def __init__(self, parent, type, number=2, id=None):
         Graphic_Element.__init__(self, parent)
         self.Type = type
         self.Id = id
@@ -1055,18 +1065,18 @@
         self.Size = wx.Size((number - 1) * SFC_DEFAULT_SEQUENCE_INTERVAL, self.GetMinSize()[1])
         # Create an input and output connector
         if self.Type in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]:
-            self.Inputs = [Connector(self, "", None, wx.Point(self.Size[0] / 2, 0), NORTH, onlyone = True)]
+            self.Inputs = [Connector(self, "", None, wx.Point(self.Size[0] // 2, 0), NORTH, onlyone=True)]
             self.Outputs = []
             for i in xrange(number):
-                self.Outputs.append(Connector(self, "", None, wx.Point(i * SFC_DEFAULT_SEQUENCE_INTERVAL, self.Size[1]), SOUTH, onlyone = True))
+                self.Outputs.append(Connector(self, "", None, wx.Point(i * SFC_DEFAULT_SEQUENCE_INTERVAL, self.Size[1]), SOUTH, onlyone=True))
         elif self.Type in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]:
             self.Inputs = []
             for i in xrange(number):
-                self.Inputs.append(Connector(self, "", None, wx.Point(i * SFC_DEFAULT_SEQUENCE_INTERVAL, 0), NORTH, onlyone = True))
-            self.Outputs = [Connector(self, "", None, wx.Point(self.Size[0] / 2, self.Size[1]), SOUTH, onlyone = True)]
+                self.Inputs.append(Connector(self, "", None, wx.Point(i * SFC_DEFAULT_SEQUENCE_INTERVAL, 0), NORTH, onlyone=True))
+            self.Outputs = [Connector(self, "", None, wx.Point(self.Size[0] // 2, self.Size[1]), SOUTH, onlyone=True)]
         self.Value = None
         self.PreviousValue = None
-    
+
     def Flush(self):
         for input in self.Inputs:
             input.Flush()
@@ -1074,7 +1084,7 @@
         for output in self.Outputs:
             output.Flush()
         self.Outputs = []
-    
+
     def SpreadCurrent(self):
         if self.Parent.Debug:
             self.PreviousValue = self.Value
@@ -1100,9 +1110,9 @@
                     self.Parent.ElementNeedRefresh(self)
                 for output in self.Outputs:
                     output.SpreadCurrent(False)
-    
+
     # Make a clone of this SFC_Divergence
-    def Clone(self, parent, id = None, pos = None):
+    def Clone(self, parent, id=None, pos=None):
         divergence = SFC_Divergence(parent, self.Type, max(len(self.Inputs), len(self.Outputs)), id)
         divergence.SetSize(self.Size[0], self.Size[1])
         if pos is not None:
@@ -1112,12 +1122,12 @@
         divergence.Inputs = [input.Clone(divergence) for input in self.Inputs]
         divergence.Outputs = [output.Clone(divergence) for output in self.Outputs]
         return divergence
-    
+
     def GetConnectorTranslation(self, element):
         return dict(zip(self.Inputs + self.Outputs, element.Inputs + element.Outputs))
-    
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         rect = Graphic_Element.GetRedrawRect(self, movex, movey)
         if movex != 0 or movey != 0:
             for input in self.Inputs:
@@ -1127,27 +1137,27 @@
                 if output.IsConnected():
                     rect = rect.Union(output.GetConnectedRedrawRect(movex, movey))
         return rect
-    
+
     # Forbids to resize the divergence
     def Resize(self, x, y, width, height):
         if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
             Graphic_Element.Resize(self, x, 0, width, self.GetMinSize()[1])
-    
+
     # Delete this divergence by calling the appropriate method
     def Delete(self):
         self.Parent.DeleteDivergence(self)
-    
+
     # Returns the divergence type
     def GetType(self):
         return self.Type
-    
+
     # Unconnect input and output
     def Clean(self):
         for input in self.Inputs:
-            input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+            input.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
         for output in self.Outputs:
-            output.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
-    
+            output.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+
     # Add a branch to the divergence
     def AddBranch(self):
         if self.Type in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]:
@@ -1155,7 +1165,7 @@
             for output in self.Outputs:
                 pos = output.GetRelPosition()
                 maxx = max(maxx, pos.x)
-            connector = Connector(self, "", None, wx.Point(maxx + SFC_DEFAULT_SEQUENCE_INTERVAL, self.Size[1]), SOUTH, onlyone = True)
+            connector = Connector(self, "", None, wx.Point(maxx + SFC_DEFAULT_SEQUENCE_INTERVAL, self.Size[1]), SOUTH, onlyone=True)
             self.Outputs.append(connector)
             self.MoveConnector(connector, 0)
         elif self.Type in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]:
@@ -1163,10 +1173,10 @@
             for input in self.Inputs:
                 pos = input.GetRelPosition()
                 maxx = max(maxx, pos.x)
-            connector = Connector(self, "", None, wx.Point(maxx + SFC_DEFAULT_SEQUENCE_INTERVAL, 0), NORTH, onlyone = True)
+            connector = Connector(self, "", None, wx.Point(maxx + SFC_DEFAULT_SEQUENCE_INTERVAL, 0), NORTH, onlyone=True)
             self.Inputs.append(connector)
             self.MoveConnector(connector, SFC_DEFAULT_SEQUENCE_INTERVAL)
-    
+
     # Remove a branch from the divergence
     def RemoveBranch(self, connector):
         if self.Type in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]:
@@ -1177,41 +1187,42 @@
             if connector in self.Inputs and len(self.Inputs) > 2:
                 self.Inputs.remove(connector)
                 self.MoveConnector(self.Inputs[0], 0)
-    
+
     # Remove the handled branch from the divergence
     def RemoveHandledBranch(self):
         handle_type, handle = self.Handle
         if handle_type == HANDLE_CONNECTOR:
             handle.UnConnect(delete=True)
             self.RemoveBranch(handle)
-            
+
     # Return the number of branches for the divergence
     def GetBranchNumber(self):
         if self.Type in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]:
             return len(self.Outputs)
         elif self.Type in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]:
             return len(self.Inputs)
-    
+
     # Returns if the point given is in the bounding box
     def HitTest(self, pt, connectors=True):
-        return self.BoundingBox.InsideXY(pt.x, pt.y) or self.TestConnector(pt, exclude=False) != None
-    
+        return self.BoundingBox.InsideXY(pt.x, pt.y) or self.TestConnector(pt, exclude=False) is not None
+
     # Refresh the divergence bounding box
     def RefreshBoundingBox(self):
         if self.Type in [SELECTION_DIVERGENCE, SELECTION_CONVERGENCE]:
-            self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y, 
-                self.Size[0] + 1, self.Size[1] + 1)
+            self.BoundingBox = wx.Rect(self.Pos.x,       self.Pos.y,
+                                       self.Size[0] + 1, self.Size[1] + 1)
         elif self.Type in [SIMULTANEOUS_DIVERGENCE, SIMULTANEOUS_CONVERGENCE]:
-            self.BoundingBox = wx.Rect(self.Pos.x - SFC_SIMULTANEOUS_SEQUENCE_EXTRA, self.Pos.y, 
+            self.BoundingBox = wx.Rect(
+                self.Pos.x - SFC_SIMULTANEOUS_SEQUENCE_EXTRA,           self.Pos.y,
                 self.Size[0] + 2 * SFC_SIMULTANEOUS_SEQUENCE_EXTRA + 1, self.Size[1] + 1)
-    
+
     # Refresh the position of wires connected to divergence
-    def RefreshConnected(self, exclude = []):
+    def RefreshConnected(self, exclude=None):
         for input in self.Inputs:
             input.MoveConnected(exclude)
         for output in self.Outputs:
             output.MoveConnected(exclude)
-    
+
     # Moves the divergence connector given
     def MoveConnector(self, connector, movex):
         position = connector.GetRelPosition()
@@ -1239,26 +1250,26 @@
         self.Size[0] = maxx - minx
         connector.MoveConnected()
         self.RefreshBoundingBox()
-    
-    # Returns the divergence connector that starts with the point given if it exists 
-    def GetConnector(self, position, name = None):
+
+    # Returns the divergence connector that starts with the point given if it exists
+    def GetConnector(self, position, name=None):
         # if a name is given
         if name is not None:
             # Test each input and output connector
-            #for input in self.Inputs:
+            # for input in self.Inputs:
             #    if name == input.GetName():
             #        return input
             for output in self.Outputs:
                 if name == output.GetName():
                     return output
         return self.FindNearestConnector(position, self.Inputs + self.Outputs)
-    
-    # Returns input and output divergence connectors 
+
+    # Returns input and output divergence connectors
     def GetConnectors(self):
         return {"inputs": self.Inputs, "outputs": self.Outputs}
-    
+
     # Test if point given is on divergence input or output connector
-    def TestConnector(self, pt, direction = None, exclude=True):
+    def TestConnector(self, pt, direction=None, exclude=True):
         # Test input connector
         for input in self.Inputs:
             if input.TestPoint(pt, direction, exclude):
@@ -1268,7 +1279,7 @@
             if output.TestPoint(pt, direction, exclude):
                 return output
         return None
-    
+
     # Changes the divergence size
     def SetSize(self, width, height):
         height = self.GetMinSize()[1]
@@ -1277,18 +1288,18 @@
             if self.RealConnectors:
                 input.SetPosition(wx.Point(int(round(self.RealConnectors["Inputs"][i] * width)), 0))
             else:
-                input.SetPosition(wx.Point(int(round(float(position.x)*float(width)/float(self.Size[0]))), 0))
+                input.SetPosition(wx.Point(int(round(position.x*width / self.Size[0])), 0))
             input.MoveConnected()
         for i, output in enumerate(self.Outputs):
             position = output.GetRelPosition()
             if self.RealConnectors:
                 output.SetPosition(wx.Point(int(round(self.RealConnectors["Outputs"][i] * width)), height))
             else:
-                output.SetPosition(wx.Point(int(round(float(position.x)*float(width)/float(self.Size[0]))), height))
+                output.SetPosition(wx.Point(int(round(position.x*width / self.Size[0])), height))
             output.MoveConnected()
         self.Size = wx.Size(width, height)
         self.RefreshBoundingBox()
-    
+
     # Returns the divergence minimum size
     def GetMinSize(self, default=False):
         width = 0
@@ -1302,7 +1313,7 @@
         elif self.Type in [SIMULTANEOUS_DIVERGENCE, SIMULTANEOUS_CONVERGENCE]:
             return width, 3
         return 0, 0
-    
+
     # Refresh the position of the block connected to connector
     def RefreshConnectedPosition(self, connector):
         wires = connector.GetWires()
@@ -1338,18 +1349,15 @@
             self.RefreshOutputPosition((0, diffy))
         for input in self.Inputs:
             input.MoveConnected()
-    
+
     # Align output element with this divergence
-    def RefreshOutputPosition(self, move = None):
+    def RefreshOutputPosition(self, move=None):
         if move:
             for output_connector in self.Outputs:
                 wires = output_connector.GetWires()
                 if len(wires) != 1:
                     return
-                current_pos = output_connector.GetPosition(False)
                 output = wires[0][0].GetOtherConnected(self.Output)
-                output_pos = output.GetPosition(False)
-                diffx = current_pos.x - output_pos.x
                 output_block = output.GetParentBlock()
                 if isinstance(output_block, SFC_Step):
                     output_block.MoveActionBlock(move)
@@ -1357,23 +1365,23 @@
                 if not isinstance(output_block, SFC_Divergence) or output_block.GetConnectors()["inputs"].index(output) == 0:
                     output_block.Move(move[0], move[1], self.Parent.Wires)
                     output_block.RefreshOutputPosition(move)
-    
+
     # Method called when a LeftDown event have been generated
     def OnLeftDown(self, event, dc, scaling):
-        self.RealConnectors = {"Inputs":[],"Outputs":[]}
+        self.RealConnectors = {"Inputs": [], "Outputs": []}
         for input in self.Inputs:
             position = input.GetRelPosition()
-            self.RealConnectors["Inputs"].append(float(position.x)/float(self.Size[0]))
+            self.RealConnectors["Inputs"].append(position.x / self.Size[0])
         for output in self.Outputs:
             position = output.GetRelPosition()
-            self.RealConnectors["Outputs"].append(float(position.x)/float(self.Size[0]))
+            self.RealConnectors["Outputs"].append(position.x / self.Size[0])
         Graphic_Element.OnLeftDown(self, event, dc, scaling)
-    
+
     # Method called when a LeftUp event have been generated
     def OnLeftUp(self, event, dc, scaling):
         Graphic_Element.OnLeftUp(self, event, dc, scaling)
         self.RealConnectors = None
-    
+
     # Method called when a RightDown event have been generated
     def OnRightDown(self, event, dc, scaling):
         pos = GetScaledEventPosition(event, dc, scaling)
@@ -1387,7 +1395,7 @@
             self.oldPos = GetScaledEventPosition(event, dc, scaling)
         else:
             Graphic_Element.OnRightDown(self, event, dc, scaling)
-    
+
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         pos = GetScaledEventPosition(event, dc, scaling)
@@ -1412,7 +1420,7 @@
             else:
                 # Popup the divergence menu without delete branch
                 self.Parent.PopupDivergenceMenu(False)
-        
+
     # Refreshes the divergence state according to move defined and handle selected
     def ProcessDragging(self, movex, movey, event, scaling):
         handle_type, handle = self.Handle
@@ -1420,7 +1428,7 @@
         if handle_type == HANDLE_CONNECTOR:
             movex = max(-self.BoundingBox.x, movex)
             if scaling is not None:
-                movex = round(float(self.Pos.x + movex) / float(scaling[0])) * scaling[0] - self.Pos.x
+                movex = round((self.Pos.x + movex) / scaling[0]) * scaling[0] - self.Pos.x
             self.MoveConnector(handle, movex)
             if self.Parent.GetDrawingMode() != FREEDRAWING_MODE:
                 self.RefreshConnectedPosition(handle)
@@ -1428,7 +1436,7 @@
         elif self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
             return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling)
         return 0, 0
-    
+
     # Refresh output element model
     def RefreshOutputModel(self, move=False):
         if move and self.Parent.GetDrawingMode() != FREEDRAWING_MODE:
@@ -1440,7 +1448,7 @@
                 output_block.RefreshModel(False)
                 if not isinstance(output_block, SFC_Divergence) or move:
                     output_block.RefreshOutputModel(move)
-    
+
     # Refreshes the divergence model
     def RefreshModel(self, move=True):
         self.Parent.RefreshDivergenceModel(self)
@@ -1451,7 +1459,7 @@
             else:
                 for output in self.Outputs:
                     output.RefreshWires()
-    
+
     # Draws the highlightment of this element if it is highlighted
     def DrawHighlightment(self, dc):
         scalex, scaley = dc.GetUserScale()
@@ -1465,13 +1473,13 @@
         if self.Type in [SIMULTANEOUS_DIVERGENCE, SIMULTANEOUS_CONVERGENCE]:
             posx -= SFC_SIMULTANEOUS_SEQUENCE_EXTRA
             width += SFC_SIMULTANEOUS_SEQUENCE_EXTRA * 2
-        dc.DrawRectangle(int(round((posx - 1) * scalex)) - 2, 
-                         int(round((self.Pos.y - 1) * scaley)) - 2, 
-                         int(round((width + 3) * scalex)) + 5, 
+        dc.DrawRectangle(int(round((posx - 1) * scalex)) - 2,
+                         int(round((self.Pos.y - 1) * scaley)) - 2,
+                         int(round((width + 3) * scalex)) + 5,
                          int(round((self.Size.height + 3) * scaley)) + 5)
         dc.SetLogicalFunction(wx.COPY)
         dc.SetUserScale(scalex, scaley)
-        
+
     # Draws divergence
     def Draw(self, dc):
         Graphic_Element.Draw(self, dc)
@@ -1485,53 +1493,53 @@
         if self.Type in [SELECTION_DIVERGENCE, SELECTION_CONVERGENCE]:
             dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
         elif self.Type in [SIMULTANEOUS_DIVERGENCE, SIMULTANEOUS_CONVERGENCE]:
-            dc.DrawLine(self.Pos.x - SFC_SIMULTANEOUS_SEQUENCE_EXTRA, self.Pos.y, 
+            dc.DrawLine(self.Pos.x - SFC_SIMULTANEOUS_SEQUENCE_EXTRA, self.Pos.y,
                         self.Pos.x + self.Size[0] + SFC_SIMULTANEOUS_SEQUENCE_EXTRA + 1, self.Pos.y)
-            dc.DrawLine(self.Pos.x - SFC_SIMULTANEOUS_SEQUENCE_EXTRA, self.Pos.y + self.Size[1], 
+            dc.DrawLine(self.Pos.x - SFC_SIMULTANEOUS_SEQUENCE_EXTRA, self.Pos.y + self.Size[1],
                         self.Pos.x + self.Size[0] + SFC_SIMULTANEOUS_SEQUENCE_EXTRA + 1, self.Pos.y + self.Size[1])
         # Draw inputs and outputs connectors
         for input in self.Inputs:
             input.Draw(dc)
         for output in self.Outputs:
             output.Draw(dc)
-        
-
-#-------------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------------
 #                   Sequencial Function Chart Jump to Step
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements the graphic representation of a jump to step
-"""
+# -------------------------------------------------------------------------------
+
 
 class SFC_Jump(Graphic_Element):
-    
+    """
+    Class that implements the graphic representation of a jump to step
+    """
+
     # Create a new jump
-    def __init__(self, parent, target, id = None):
+    def __init__(self, parent, target, id=None):
         Graphic_Element.__init__(self, parent)
         self.SetTarget(target)
         self.Id = id
         self.Size = wx.Size(SFC_JUMP_SIZE[0], SFC_JUMP_SIZE[1])
         self.Highlights = []
         # Create an input and output connector
-        self.Input = Connector(self, "", None, wx.Point(self.Size[0] / 2, 0), NORTH, onlyone = True)
+        self.Input = Connector(self, "", None, wx.Point(self.Size[0] // 2, 0), NORTH, onlyone=True)
         self.Value = None
         self.PreviousValue = None
-        
+
     def Flush(self):
         if self.Input is not None:
             self.Input.Flush()
             self.Input = None
-    
+
     def SpreadCurrent(self):
         if self.Parent.Debug:
             self.PreviousValue = self.Value
             self.Value = self.Input.ReceivingCurrent()
             if self.Value != self.PreviousValue and self.Visible:
                 self.Parent.ElementNeedRefresh(self)
-    
+
     # Make a clone of this SFC_Jump
-    def Clone(self, parent, id = None, pos = None):
+    def Clone(self, parent, id=None, pos=None):
         jump = SFC_Jump(parent, self.Target, id)
         jump.SetSize(self.Size[0], self.Size[1])
         if pos is not None:
@@ -1540,109 +1548,110 @@
             jump.SetPosition(self.Pos.x, self.Pos.y)
         jump.Input = self.Input.Clone(jump)
         return jump
-    
+
     def GetConnectorTranslation(self, element):
-        return {self.Input : element.Input}
-    
+        return {self.Input: element.Input}
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         rect = Graphic_Element.GetRedrawRect(self, movex, movey)
-        rect = rect.Union(self.Input.GetRedrawRect(movex, movey))
+        if self.Input:
+            rect = rect.Union(self.Input.GetRedrawRect(movex, movey))
         if movex != 0 or movey != 0:
             if self.Input.IsConnected():
                 rect = rect.Union(self.Input.GetConnectedRedrawRect(movex, movey))
         return rect
-    
+
     # Forbids to change the jump size
     def SetSize(self, width, height):
         if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
             Graphic_Element.SetSize(self, width, height)
-    
+
     # Forbids to resize jump
     def Resize(self, x, y, width, height):
         if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
             Graphic_Element.Resize(self, x, y, width, height)
-    
+
     # Delete this jump by calling the appropriate method
     def Delete(self):
         self.Parent.DeleteJump(self)
-    
+
     # Unconnect input
     def Clean(self):
-        self.Input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
-    
+        self.Input.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+
     # Refresh the size of text for target
     def RefreshTargetSize(self):
         self.TargetSize = self.Parent.GetTextExtent(self.Target)
-    
+
     # Returns if the point given is in the bounding box
     def HitTest(self, pt, connectors=True):
         # Calculate the bounding box of the condition outside the transition
         text_width, text_height = self.TargetSize
         text_bbx = wx.Rect(self.Pos.x + self.Size[0] + 2,
-                           self.Pos.y + (self.Size[1] - text_height) / 2,
+                           self.Pos.y + (self.Size[1] - text_height) // 2,
                            text_width,
                            text_height)
         return text_bbx.InsideXY(pt.x, pt.y) or Graphic_Element.HitTest(self, pt, connectors)
-    
+
     # Refresh the jump bounding box
     def RefreshBoundingBox(self):
-        text_width, text_height = self.Parent.GetTextExtent(self.Target)
+        text_width, _text_height = self.Parent.GetTextExtent(self.Target)
         # Calculate the bounding box size
         bbx_width = self.Size[0] + 2 + text_width
-        self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y - CONNECTOR_SIZE, 
-                bbx_width + 1, self.Size[1] + CONNECTOR_SIZE + 1)
-    
+        self.BoundingBox = wx.Rect(self.Pos.x,    self.Pos.y - CONNECTOR_SIZE,
+                                   bbx_width + 1, self.Size[1] + CONNECTOR_SIZE + 1)
+
     # Returns the connector connected to input
     def GetPreviousConnector(self):
         wires = self.Input.GetWires()
         if len(wires) == 1:
             return wires[0][0].GetOtherConnected(self.Input)
         return None
-    
+
     # Refresh the element connectors position
     def RefreshConnectors(self):
         scaling = self.Parent.GetScaling()
-        horizontal_pos = self.Size[0] / 2
+        horizontal_pos = self.Size[0] // 2
         if scaling is not None:
-            horizontal_pos = round(float(self.Pos.x + horizontal_pos) / float(scaling[0])) * scaling[0] - self.Pos.x
+            horizontal_pos = round((self.Pos.x + horizontal_pos) / scaling[0]) * scaling[0] - self.Pos.x
         self.Input.SetPosition(wx.Point(horizontal_pos, 0))
         self.RefreshConnected()
-    
+
     # Refresh the position of wires connected to jump
-    def RefreshConnected(self, exclude = []):
+    def RefreshConnected(self, exclude=None):
         if self.Input:
             self.Input.MoveConnected(exclude)
-    
-    # Returns input jump connector 
-    def GetConnector(self, position = None, name = None):
+
+    # Returns input jump connector
+    def GetConnector(self, position=None, name=None):
         return self.Input
-    
-    # Returns all the jump connectors 
+
+    # Returns all the jump connectors
     def GetConnectors(self):
         return {"inputs": [self.Input], "outputs": []}
-    
+
     # Test if point given is on jump input connector
-    def TestConnector(self, pt, direction = None, exclude = True):
+    def TestConnector(self, pt, direction=None, exclude=True):
         # Test input connector
         if self.Input and self.Input.TestPoint(pt, direction, exclude):
             return self.Input
         return None
-    
+
     # Changes the jump target
     def SetTarget(self, target):
         self.Target = target
         self.RefreshTargetSize()
         self.RefreshBoundingBox()
-    
+
     # Returns the jump target
     def GetTarget(self):
         return self.Target
-    
+
     # Returns the jump minimum size
     def GetMinSize(self):
         return SFC_JUMP_SIZE
-    
+
     # Align input element with this jump
     def RefreshInputPosition(self):
         if self.Input:
@@ -1659,33 +1668,33 @@
                         input_block.MoveActionBlock((diffx, 0))
                     input_block.Move(diffx, 0)
                     input_block.RefreshInputPosition()
-    
+
     # Can't align output element, because there is no output
-    def RefreshOutputPosition(self, move = None):
+    def RefreshOutputPosition(self, move=None):
         pass
-    
+
     # Method called when a LeftDClick event have been generated
     def OnLeftDClick(self, event, dc, scaling):
         # Edit the jump properties
         self.Parent.EditJumpContent(self)
-    
+
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         # Popup the default menu
         self.Parent.PopupDefaultMenu()
-    
+
     # Refreshes the jump state according to move defined and handle selected
     def ProcessDragging(self, movex, movey, event, scaling):
         if self.Parent.GetDrawingMode() != FREEDRAWING_MODE:
             movex = max(-self.BoundingBox.x, movex)
             if scaling is not None:
-                movex = round(float(self.Pos.x + movex) / float(scaling[0])) * scaling[0] - self.Pos.x
+                movex = round((self.Pos.x + movex) / scaling[0]) * scaling[0] - self.Pos.x
             self.Move(movex, 0)
             self.RefreshInputPosition()
             return movex, 0
         else:
-            return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling, width_fac = 2)
-    
+            return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling, width_fac=2)
+
     # Refresh input element model
     def RefreshInputModel(self):
         if self.Parent.GetDrawingMode() != FREEDRAWING_MODE:
@@ -1695,32 +1704,32 @@
                 input_block.RefreshModel(False)
                 if not isinstance(input_block, SFC_Divergence):
                     input_block.RefreshInputModel()
-    
+
     # Refresh output element model
     def RefreshOutputModel(self, move=False):
         pass
-    
+
     # Refreshes the jump model
     def RefreshModel(self, move=True):
         self.Parent.RefreshJumpModel(self)
         if move:
             if self.Parent.GetDrawingMode() != FREEDRAWING_MODE:
                 self.RefreshInputModel()
-    
+
     # Adds an highlight to the variable
     def AddHighlight(self, infos, start, end, highlight_type):
         if infos[0] == "target" and start[0] == 0 and end[0] == 0:
             AddHighlight(self.Highlights, (start, end, highlight_type))
-    
+
     # Removes an highlight from the variable
     def RemoveHighlight(self, infos, start, end, highlight_type):
         if infos[0] == "target":
             RemoveHighlight(self.Highlights, (start, end, highlight_type))
-    
+
     # Removes all the highlights of one particular type from the variable
     def ClearHighlight(self, highlight_type=None):
         ClearHighlights(self.Highlights, highlight_type)
-    
+
     # Draws the highlightment of this element if it is highlighted
     def DrawHighlightment(self, dc):
         scalex, scaley = dc.GetUserScale()
@@ -1728,16 +1737,16 @@
         dc.SetPen(MiterPen(HIGHLIGHTCOLOR))
         dc.SetBrush(wx.Brush(HIGHLIGHTCOLOR))
         dc.SetLogicalFunction(wx.AND)
-        points = [wx.Point(int(round((self.Pos.x - 2) * scalex)) - 3, 
+        points = [wx.Point(int(round((self.Pos.x - 2) * scalex)) - 3,
                            int(round((self.Pos.y - 2) * scaley)) - 2),
-                  wx.Point(int(round((self.Pos.x + self.Size[0] + 2) * scalex)) + 4, 
+                  wx.Point(int(round((self.Pos.x + self.Size[0] + 2) * scalex)) + 4,
                            int(round((self.Pos.y - 2) * scaley)) - 2),
-                  wx.Point(int(round((self.Pos.x + self.Size[0] / 2) * scalex)), 
+                  wx.Point(int(round((self.Pos.x + self.Size[0] / 2) * scalex)),
                            int(round((self.Pos.y + self.Size[1] + 3) * scaley)) + 4)]
         dc.DrawPolygon(points)
         dc.SetLogicalFunction(wx.COPY)
         dc.SetUserScale(scalex, scaley)
-    
+
     # Draws divergence
     def Draw(self, dc):
         Graphic_Element.Draw(self, dc)
@@ -1747,67 +1756,67 @@
         else:
             dc.SetPen(MiterPen(wx.BLACK))
             dc.SetBrush(wx.BLACK_BRUSH)
-        
+
         if getattr(dc, "printing", False):
             target_size = dc.GetTextExtent(self.Target)
         else:
             target_size = self.TargetSize
-        
+
         # Draw plain rectangle for representing the divergence
-        dc.DrawLine(self.Pos.x + self.Size[0] / 2, self.Pos.y, self.Pos.x + self.Size[0] / 2, self.Pos.y + self.Size[1])
+        dc.DrawLine(self.Pos.x + self.Size[0] // 2, self.Pos.y, self.Pos.x + self.Size[0] // 2, self.Pos.y + self.Size[1])
         points = [wx.Point(self.Pos.x, self.Pos.y),
-                  wx.Point(self.Pos.x + self.Size[0] / 2, self.Pos.y + self.Size[1] / 3),
+                  wx.Point(self.Pos.x + self.Size[0] // 2, self.Pos.y + self.Size[1] // 3),
                   wx.Point(self.Pos.x + self.Size[0], self.Pos.y),
-                  wx.Point(self.Pos.x + self.Size[0] / 2, self.Pos.y + self.Size[1])]
+                  wx.Point(self.Pos.x + self.Size[0] // 2, self.Pos.y + self.Size[1])]
         dc.DrawPolygon(points)
         target_pos = (self.Pos.x + self.Size[0] + 2,
-                      self.Pos.y + (self.Size[1] - target_size[1]) / 2)
+                      self.Pos.y + (self.Size[1] - target_size[1]) // 2)
         dc.DrawText(self.Target, target_pos[0], target_pos[1])
         # Draw input connector
         if self.Input:
             self.Input.Draw(dc)
-            
+
         if not getattr(dc, "printing", False):
             DrawHighlightedText(dc, self.Target, self.Highlights, target_pos[0], target_pos[1])
-        
-
-#-------------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------------
 #                   Sequencial Function Chart Action Block
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements the graphic representation of an action block
-"""
+# -------------------------------------------------------------------------------
+
 
 class SFC_ActionBlock(Graphic_Element):
-    
+    """
+    Class that implements the graphic representation of an action block
+    """
+
     # Create a new action block
-    def __init__(self, parent, actions = [], id = None):
+    def __init__(self, parent, actions=None, id=None):
         Graphic_Element.__init__(self, parent)
         self.Id = id
         self.Size = wx.Size(SFC_ACTION_MIN_SIZE[0], SFC_ACTION_MIN_SIZE[1])
         self.MinSize = wx.Size(SFC_ACTION_MIN_SIZE[0], SFC_ACTION_MIN_SIZE[1])
         self.Highlights = {}
         # Create an input and output connector
-        self.Input = Connector(self, "", None, wx.Point(0, SFC_ACTION_MIN_SIZE[1] / 2), WEST, onlyone = True)
+        self.Input = Connector(self, "", None, wx.Point(0, SFC_ACTION_MIN_SIZE[1] // 2), WEST, onlyone=True)
         self.SetActions(actions)
         self.Value = None
         self.PreviousValue = None
-    
+
     def Flush(self):
         if self.Input is not None:
             self.Input.Flush()
             self.Input = None
-    
+
     def SpreadCurrent(self):
         if self.Parent.Debug:
             self.PreviousValue = self.Value
             self.Value = self.Input.ReceivingCurrent()
             if self.Value != self.PreviousValue and self.Visible:
                 self.Parent.ElementNeedRefresh(self)
-    
+
     # Make a clone of this SFC_ActionBlock
-    def Clone(self, parent, id = None, pos = None):
+    def Clone(self, parent, id=None, pos=None):
         actions = [action.copy() for action in self.Actions]
         action_block = SFC_ActionBlock(parent, actions, id)
         action_block.SetSize(self.Size[0], self.Size[1])
@@ -1817,29 +1826,30 @@
             action_block.SetPosition(self.Pos.x, self.Pos.y)
         action_block.Input = self.Input.Clone(action_block)
         return action_block
-    
+
     def GetConnectorTranslation(self, element):
-        return {self.Input : element.Input}
-    
+        return {self.Input: element.Input}
+
     # Returns the RedrawRect
-    def GetRedrawRect(self, movex = 0, movey = 0):
+    def GetRedrawRect(self, movex=0, movey=0):
         rect = Graphic_Element.GetRedrawRect(self, movex, movey)
-        rect = rect.Union(self.Input.GetRedrawRect(movex, movey))
+        if self.Input:
+            rect = rect.Union(self.Input.GetRedrawRect(movex, movey))
         if movex != 0 or movey != 0:
             if self.Input.IsConnected():
                 rect = rect.Union(self.Input.GetConnectedRedrawRect(movex, movey))
         return rect
-    
+
     # Returns the number of action lines
     def GetLineNumber(self):
         return len(self.Actions)
-    
+
     def GetLineSize(self):
         if len(self.Actions) > 0:
-            return self.Size[1] / len(self.Actions)
+            return self.Size[1] // len(self.Actions)
         else:
             return SFC_ACTION_MIN_SIZE[1]
-    
+
     # Forbids to resize the action block
     def Resize(self, x, y, width, height):
         if self.Parent.GetDrawingMode() != FREEDRAWING_MODE:
@@ -1847,49 +1857,50 @@
                 self.SetSize(width, self.Size[1])
         else:
             Graphic_Element.Resize(self, x, y, width, height)
-    
+
     # Delete this action block by calling the appropriate method
     def Delete(self):
         self.Parent.DeleteActionBlock(self)
-    
+
     # Unconnect input and output
     def Clean(self):
-        self.Input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
-        
+        self.Input.UnConnect(delete=self.Parent.GetDrawingMode() == FREEDRAWING_MODE)
+
     # Refresh the action block bounding box
     def RefreshBoundingBox(self):
         self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
-    
+
     # Refresh the position of wires connected to action block
-    def RefreshConnected(self, exclude = []):
+    def RefreshConnected(self, exclude=None):
         self.Input.MoveConnected(exclude)
-    
-    # Returns input action block connector 
-    def GetConnector(self, position = None, name = None):
+
+    # Returns input action block connector
+    def GetConnector(self, position=None, name=None):
         return self.Input
-    
-    # Returns all the action block connectors 
+
+    # Returns all the action block connectors
     def GetConnectors(self):
         return {"inputs": [self.Input], "outputs": []}
-    
+
     # Test if point given is on action block input connector
-    def TestConnector(self, pt, direction = None, exclude = True):
+    def TestConnector(self, pt, direction=None, exclude=True):
         # Test input connector
         if self.Input.TestPoint(pt, direction, exclude):
             return self.Input
         return None
-    
+
     # Refresh the element connectors position
     def RefreshConnectors(self):
         scaling = self.Parent.GetScaling()
-        vertical_pos = SFC_ACTION_MIN_SIZE[1] / 2
+        vertical_pos = SFC_ACTION_MIN_SIZE[1] // 2
         if scaling is not None:
-            vertical_pos = round(float(self.Pos.y + vertical_pos) / float(scaling[1])) * scaling[1] - self.Pos.y
+            vertical_pos = round((self.Pos.y + vertical_pos) / scaling[1]) * scaling[1] - self.Pos.y
         self.Input.SetPosition(wx.Point(0, vertical_pos))
         self.RefreshConnected()
-    
+
     # Changes the action block actions
-    def SetActions(self, actions):
+    def SetActions(self, actions=None):
+        actions = [] if actions is None else actions
         self.Actions = actions
         self.ColSize = [0, 0, 0]
         min_height = 0
@@ -1913,13 +1924,14 @@
         if self.Parent.GetDrawingMode() == FREEDRAWING_MODE:
             self.Size = wx.Size(self.ColSize[0] + self.ColSize[1] + self.ColSize[2], max(min_height, SFC_ACTION_MIN_SIZE[1], self.Size[1]))
             self.MinSize = max(self.ColSize[0] + self.ColSize[1] + self.ColSize[2],
-                SFC_ACTION_MIN_SIZE[0]), max(SFC_ACTION_MIN_SIZE[1], min_height)
+                               SFC_ACTION_MIN_SIZE[0]), max(SFC_ACTION_MIN_SIZE[1], min_height)
             self.RefreshBoundingBox()
         else:
             self.Size = wx.Size(max(self.ColSize[0] + self.ColSize[1] + self.ColSize[2],
-                SFC_ACTION_MIN_SIZE[0]), len(self.Actions) * SFC_ACTION_MIN_SIZE[1])
+                                    SFC_ACTION_MIN_SIZE[0]),
+                                len(self.Actions) * SFC_ACTION_MIN_SIZE[1])
             self.MinSize = max(self.ColSize[0] + self.ColSize[1] + self.ColSize[2],
-                SFC_ACTION_MIN_SIZE[0]), len(self.Actions) * SFC_ACTION_MIN_SIZE[1]
+                               SFC_ACTION_MIN_SIZE[0]), len(self.Actions) * SFC_ACTION_MIN_SIZE[1]
             self.RefreshBoundingBox()
             if self.Input is not None:
                 wires = self.Input.GetWires()
@@ -1927,33 +1939,33 @@
                     input_block = wires[0][0].GetOtherConnected(self.Input).GetParentBlock()
                     input_block.RefreshOutputPosition()
                     input_block.RefreshOutputModel(True)
-    
+
     # Returns the action block actions
     def GetActions(self):
         return self.Actions
-    
+
     # Returns the action block minimum size
     def GetMinSize(self):
         return self.MinSize
-    
+
     # Method called when a LeftDClick event have been generated
     def OnLeftDClick(self, event, dc, scaling):
         # Edit the action block properties
         self.Parent.EditActionBlockContent(self)
-    
+
     # Method called when a RightUp event have been generated
     def OnRightUp(self, event, dc, scaling):
         # Popup the default menu
         self.Parent.PopupDefaultMenu()
-    
+
     # Refreshes the action block state according to move defined and handle selected
     def ProcessDragging(self, movex, movey, event, scaling):
         if self.Parent.GetDrawingMode() != FREEDRAWING_MODE:
-            handle_type, handle = self.Handle
+            handle_type, _handle = self.Handle
             if handle_type == HANDLE_MOVE:
                 movex = max(-self.BoundingBox.x, movex)
                 if scaling is not None:
-                    movex = round(float(self.Pos.x + movex) / float(scaling[0])) * scaling[0] - self.Pos.x
+                    movex = round((self.Pos.x + movex) / scaling[0]) * scaling[0] - self.Pos.x
                 wires = self.Input.GetWires()
                 if len(wires) == 1:
                     input_pos = wires[0][0].GetOtherConnected(self.Input).GetPosition(False)
@@ -1966,18 +1978,17 @@
         else:
             return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling)
 
-    
     # Refreshes the action block model
     def RefreshModel(self, move=True):
         self.Parent.RefreshActionBlockModel(self)
-    
+
     # Adds an highlight to the variable
     def AddHighlight(self, infos, start, end, highlight_type):
         if infos[0] == "action" and infos[1] < len(self.Actions):
             action_highlights = self.Highlights.setdefault(infos[1], {})
             attribute_highlights = action_highlights.setdefault(infos[2], [])
             AddHighlight(attribute_highlights, (start, end, highlight_type))
-    
+
     # Removes an highlight from the block
     def RemoveHighlight(self, infos, start, end, highlight_type):
         if infos[0] == "action" and infos[1] < len(self.Actions):
@@ -1987,7 +1998,7 @@
                 action_highlights.pop(infos[2])
                 if len(action_highlights) == 0:
                     self.Highlights.pop(infos[1])
-    
+
     # Removes all the highlights of one particular type from the block
     def ClearHighlight(self, highlight_type=None):
         if highlight_type is None:
@@ -1996,13 +2007,13 @@
             highlight_items = self.Highlights.items()
             for number, action_highlights in highlight_items:
                 action_highlight_items = action_highlights.items()
-                for name, attribute_highlights in action_highlights:
+                for name, attribute_highlights in action_highlight_items:
                     attribute_highlights = ClearHighlights(attribute_highlights, highlight_type)
                     if len(attribute_highlights) == 0:
                         action_highlights.pop(name)
                 if len(action_highlights) == 0:
                     self.Highlights.pop(number)
-    
+
     # Draws divergence
     def Draw(self, dc):
         Graphic_Element.Draw(self, dc)
@@ -2014,37 +2025,37 @@
         colsize = [self.ColSize[0], self.Size[0] - self.ColSize[0] - self.ColSize[2], self.ColSize[2]]
         # Draw plain rectangle for representing the action block
         dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1)
-        dc.DrawLine(self.Pos.x + colsize[0], self.Pos.y, 
-                self.Pos.x + colsize[0], self.Pos.y + self.Size[1])
-        dc.DrawLine(self.Pos.x + colsize[0] + colsize[1], self.Pos.y, 
-                self.Pos.x + colsize[0] + colsize[1], self.Pos.y + self.Size[1])
+        dc.DrawLine(self.Pos.x + colsize[0], self.Pos.y,
+                    self.Pos.x + colsize[0], self.Pos.y + self.Size[1])
+        dc.DrawLine(self.Pos.x + colsize[0] + colsize[1], self.Pos.y,
+                    self.Pos.x + colsize[0] + colsize[1], self.Pos.y + self.Size[1])
         line_size = self.GetLineSize()
         for i, action in enumerate(self.Actions):
             if i != 0:
-                dc.DrawLine(self.Pos.x, self.Pos.y + i * line_size, 
-                    self.Pos.x + self.Size[0], self.Pos.y + i * line_size)
+                dc.DrawLine(self.Pos.x, self.Pos.y + i * line_size,
+                            self.Pos.x + self.Size[0], self.Pos.y + i * line_size)
             qualifier_size = dc.GetTextExtent(action.qualifier)
             if action.duration != "":
-                qualifier_pos = (self.Pos.x + (colsize[0] - qualifier_size[0]) / 2,
-                                 self.Pos.y + i * line_size + line_size / 2 - qualifier_size[1])
+                qualifier_pos = (self.Pos.x + (colsize[0] - qualifier_size[0]) // 2,
+                                 self.Pos.y + i * line_size + line_size // 2 - qualifier_size[1])
                 duration_size = dc.GetTextExtent(action.duration)
-                duration_pos = (self.Pos.x + (colsize[0] - duration_size[0]) / 2,
-                                self.Pos.y + i * line_size + line_size / 2)
+                duration_pos = (self.Pos.x + (colsize[0] - duration_size[0]) // 2,
+                                self.Pos.y + i * line_size + line_size // 2)
                 dc.DrawText(action.duration, duration_pos[0], duration_pos[1])
             else:
-                qualifier_pos = (self.Pos.x + (colsize[0] - qualifier_size[0]) / 2,
-                                 self.Pos.y + i * line_size + (line_size - qualifier_size[1]) / 2)
+                qualifier_pos = (self.Pos.x + (colsize[0] - qualifier_size[0]) // 2,
+                                 self.Pos.y + i * line_size + (line_size - qualifier_size[1]) // 2)
             dc.DrawText(action.qualifier, qualifier_pos[0], qualifier_pos[1])
             content_size = dc.GetTextExtent(action.value)
-            content_pos = (self.Pos.x + colsize[0] + (colsize[1] - content_size[0]) / 2,
-                           self.Pos.y + i * line_size + (line_size - content_size[1]) / 2)
+            content_pos = (self.Pos.x + colsize[0] + (colsize[1] - content_size[0]) // 2,
+                           self.Pos.y + i * line_size + (line_size - content_size[1]) // 2)
             dc.DrawText(action.value, content_pos[0], content_pos[1])
             if action.indicator != "":
                 indicator_size = dc.GetTextExtent(action.indicator)
-                indicator_pos = (self.Pos.x + colsize[0] + colsize[1] + (colsize[2] - indicator_size[0]) / 2,
-                                 self.Pos.y + i * line_size + (line_size - indicator_size[1]) / 2)
+                indicator_pos = (self.Pos.x + colsize[0] + colsize[1] + (colsize[2] - indicator_size[0]) // 2,
+                                 self.Pos.y + i * line_size + (line_size - indicator_size[1]) // 2)
                 dc.DrawText(action.indicator, indicator_pos[0], indicator_pos[1])
-            
+
             if not getattr(dc, "printing", False):
                 action_highlights = self.Highlights.get(i, {})
                 for name, attribute_highlights in action_highlights.iteritems():
@@ -2056,7 +2067,6 @@
                         DrawHighlightedText(dc, action.value, attribute_highlights, content_pos[0], content_pos[1])
                     elif name == "indicator":
                         DrawHighlightedText(dc, action.indicator, attribute_highlights, indicator_pos[0], indicator_pos[1])
-        
+
         # Draw input connector
         self.Input.Draw(dc)
-        
--- a/graphics/ToolTipProducer.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/graphics/ToolTipProducer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,42 +22,45 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import wx
 
 from controls.CustomToolTip import CustomToolTip, TOOLTIP_WAIT_PERIOD
-    
-#-------------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------------
 #                           Tool Tip Producer class
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
-"""
-Class that implements an element that generate Tool Tip
-"""
 
-class ToolTipProducer:
-    
+class ToolTipProducer(object):
+    """
+    Class that implements an element that generate Tool Tip
+    """
+
     def __init__(self, parent):
         """
         Constructor
         @param parent: Parent Viewer
         """
         self.Parent = parent
-        
+
         self.ToolTip = None
         self.ToolTipPos = None
-        
+
         # Timer for firing Tool tip display
         self.ToolTipTimer = wx.Timer(self.Parent, -1)
-        self.Parent.Bind(wx.EVT_TIMER, 
-            self.OnToolTipTimer, 
-            self.ToolTipTimer)
-    
+        self.Parent.Bind(wx.EVT_TIMER,
+                         self.OnToolTipTimer,
+                         self.ToolTipTimer)
+
     def __del__(self):
         """
         Destructor
         """
         self.DestroyToolTip()
-    
+
     def OnToolTipTimer(self, event):
         """
         Callback for Tool Tip firing timer Event
@@ -65,21 +68,21 @@
         """
         # Get Tool Tip text
         value = self.GetToolTipValue()
-        
+
         if value is not None and self.ToolTipPos is not None:
             # Create Tool Tip
             self.ToolTip = CustomToolTip(self.Parent, value)
             self.ToolTip.SetToolTipPosition(self.ToolTipPos)
             self.ToolTip.Show()
-    
+
     def GetToolTipValue(self):
         """
         Return tool tip text
-        Have to be overridden by inherited classes 
-        @return: Tool tip text (None if not overridden) 
+        Have to be overridden by inherited classes
+        @return: Tool tip text (None if not overridden)
         """
         return None
-    
+
     def DisplayToolTip(self, pos):
         """
         Display Tool tip
@@ -87,14 +90,14 @@
         """
         # Destroy current displayed Tool tip
         self.DestroyToolTip()
-        
+
         # Save Tool Tip position
         self.ToolTipPos = pos
         # Start Tool tip firing timer
         self.ToolTipTimer.Start(
-            int(TOOLTIP_WAIT_PERIOD * 1000), 
+            int(TOOLTIP_WAIT_PERIOD * 1000),
             oneShot=True)
-    
+
     def SetToolTipText(self, text):
         """
         Set current Tool tip text
@@ -102,7 +105,7 @@
         """
         if self.ToolTip is not None:
             self.ToolTip.SetTip(text)
-    
+
     def DestroyToolTip(self):
         """
         Destroy current displayed Tool Tip
@@ -110,7 +113,7 @@
         # Stop Tool tip firing timer
         self.ToolTipTimer.Stop()
         self.ToolTipPos = None
-        
+
         # Destroy Tool Tip
         if self.ToolTip is not None:
             self.ToolTip.Destroy()
--- a/graphics/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/graphics/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -23,10 +23,3 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 # Package initialisation
-
-from GraphicCommons import *
-from FBD_Objects import *
-from LD_Objects import *
-from SFC_Objects import *
-from RubberBand import RubberBand
-from DebugDataConsumer import DebugDataConsumer
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/.tx/config	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,10 @@
+[main]
+host = https://www.transifex.com
+
+[beremiz-ide.beremiz]
+file_filter = Beremiz_<lang>.po
+minimum_perc = 0
+source_file = messages.pot
+source_lang = en
+type = PO
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/Beremiz_bn_BD.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4030 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Adhir Dutta <likhon52@gmail.com>, 2017\n"
+"Language-Team: Bengali (Bangladesh) (https://www.transifex.com/beremiz/teams/75746/bn_BD/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: bn_BD\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
+msgid ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+msgstr ""
+"\n"
+"একটি ব্যতিক্রমী অসঙ্গতির (বাগ) প্রাদুর্ভাব ঘটেছে। সংরক্ষিত অসঙ্গতির নথিটিঃ\n"
+"(%s)\n"
+"\n"
+"এই ঠিকানায় অনুগ্রহপূর্বক নথিটি প্রেরণ করুনঃ\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"আপনাকে প্রোগ্রামটি পুনঃআরম্ভ করতে হবে.\n"
+"\n"
+"উপাত্তসমূহ:\n"
+
+#: ../controls/VariablePanel.py:90
+msgid "   External"
+msgstr "বাহ্যিক"
+
+#: ../controls/VariablePanel.py:89
+msgid "   InOut"
+msgstr "ইনআউট"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Input"
+msgstr "ইনপুট"
+
+#: ../controls/VariablePanel.py:90
+msgid "   Local"
+msgstr "স্থানীয়"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Output"
+msgstr "আউটপুট"
+
+#: ../controls/VariablePanel.py:91
+msgid "   Temp"
+msgstr "সাময়িক"
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
+#, python-format
+msgid " and %s"
+msgstr "এবং %s"
+
+#: ../ProjectController.py:1182
+msgid " generation failed !\n"
+msgstr "উত্পাদন ব্যর্থ !\n"
+
+#: ../plcopen/plcopen.py:1029
+#, python-format
+msgid "\"%s\" Data Type doesn't exist !!!"
+msgstr "\"%s\" Data Type অস্তিত্বহীন !!!"
+
+#: ../plcopen/plcopen.py:1047
+#, python-format
+msgid "\"%s\" POU already exists !!!"
+msgstr "\"%s\"  POU ইতিমধ্যেই বিদ্যমান !!!"
+
+#: ../plcopen/plcopen.py:1068
+#, python-format
+msgid "\"%s\" POU doesn't exist !!!"
+msgstr "\"%s\" POU এর অস্তিত্ব নেই !!!"
+
+#: ../editors/Viewer.py:288
+#, python-format
+msgid "\"%s\" can't use itself!"
+msgstr "\"%s\" স্বীয়কার্যে ব্যবহার অযোগ্য! "
+
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
+#, python-format
+msgid "\"%s\" config already exists!"
+msgstr "\"%s\"  config ইতিমধ্যেই বিদ্যমান!"
+
+#: ../plcopen/plcopen.py:531
+#, python-format
+msgid "\"%s\" configuration already exists !!!"
+msgstr "\"%s\" configuration ইতিমধ্যেই বিদ্যমান !!!"
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr ""
+
+#: ../IDEFrame.py:1638
+#, python-format
+msgid "\"%s\" data type already exists!"
+msgstr "\"%s\" data type ইতিমধ্যেই বিদ্যমান!  "
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
+#, python-format
+msgid "\"%s\" element for this pou already exists!"
+msgstr "\"%s\" এই pou এর উপাদান ইতিমধ্যেই বিদ্যমান!"
+
+#: ../BeremizIDE.py:928
+#, python-format
+msgid "\"%s\" folder is not a valid Beremiz project\n"
+msgstr "\"%s\" ফোল্ডারটিতে বেরিমিজ প্রকল্প নেই\n"
+
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
+#, python-format
+msgid "\"%s\" is a keyword. It can't be used!"
+msgstr "\"%s\" একটি কি-ওয়ার্ড। তাই ব্যবহার অযোগ্য!"
+
+#: ../plcopen/plcopen.py:2836
+#, python-format
+msgid "\"%s\" is an invalid value!"
+msgstr "\"%s\" একটি অযৌক্তিক সংখ্যা!"
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
+msgid "\"%s\" is not a valid folder!"
+msgstr "\"%s\" যৌক্তিক ফ্লোল্ডার নয়!"
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
+#, python-format
+msgid "\"%s\" is not a valid identifier!"
+msgstr "\"%s\" একটি অযৌক্তিক শনাক্তকারী!"
+
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr "\"%s\" এক বা একাধিক POU তে ব্যবহৃত। আপনি কি কাজ করবেন?"
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
+#, python-format
+msgid "\"%s\" pou already exists!"
+msgstr "\"%s\" POU ইতিমধ্যেই বিদ্যমান!"
+
+#: ../dialogs/SFCStepNameDialog.py:62
+#, python-format
+msgid "\"%s\" step already exists!"
+msgstr "\"%s\" step ইতিমধ্যেই বিদ্যমান!"
+
+#: ../editors/DataTypeEditor.py:566
+#, python-format
+msgid "\"%s\" value already defined!"
+msgstr "\"%s\" মান ইতিমধ্যেই সংজ্ঞায়িত!"
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
+#, python-format
+msgid "\"%s\" value isn't a valid array dimension!"
+msgstr "\"%s\" সাংখ্যমানটি অ্যারের জন্য অযৌক্তিক মাত্রা!"
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
+#, python-format
+msgid ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+msgstr ""
+"\"%s\" সাংখ্যমানটি অ্যারের জন্য অযৌক্তিক মাত্রা!\n"
+"ডানের সাংখ্যমান অবশ্যই বামের চেয়ে বড় হতে হবে."
+
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr "\"{a1}\" ফাংশন বাতিল \"{a2}\" তে POU: কোনও ইনপুট প্রযুক্ত হয়নি"
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr "\"{a1}\" ইতিমধ্যেই \"{a2}\" দ্বারা ব্যবহৃত!"
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr "\"{a1}\" এর সম্পদ ইতিমধ্যেই \"{a2}\" এর configuration এ বিদ্যমান !!!"
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr "\"{a1}\" এর সম্পদ \"{a2}\" এর configuration এ ব্যবহৃত হয়নি !!!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr "%03gমিসে"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr "%dদি"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr "%dঘ"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr "%dমি"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr "%dমিসে"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr "%dসে"
+
+#: ../PLCControler.py:1114
+#, python-format
+msgid "%s Data Types"
+msgstr "%s Data Types"
+
+#: ../PLCControler.py:1097
+#, python-format
+msgid "%s POUs"
+msgstr "%sPOUs"
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
+#, python-format
+msgid "%s Profile"
+msgstr "%s Profile"
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
+#, python-format
+msgid "%s body don't have instances!"
+msgstr "%sপ্রধান অংশে প্রতিলিপি নেই!"
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
+#, python-format
+msgid "%s body don't have text!"
+msgstr "%sপ্রধান অংশে  text নেই!"
+
+#: ../IDEFrame.py:388
+msgid "&Add Element"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr ""
+
+#: ../IDEFrame.py:361
+msgid "&Configuration"
+msgstr ""
+
+#: ../IDEFrame.py:350
+msgid "&Data Type"
+msgstr ""
+
+#: ../IDEFrame.py:392
+msgid "&Delete"
+msgstr ""
+
+#: ../IDEFrame.py:342
+msgid "&Display"
+msgstr ""
+
+#: ../IDEFrame.py:341
+msgid "&Edit"
+msgstr ""
+
+#: ../IDEFrame.py:340
+msgid "&File"
+msgstr ""
+
+#: ../IDEFrame.py:352
+msgid "&Function"
+msgstr ""
+
+#: ../IDEFrame.py:343
+msgid "&Help"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr ""
+
+#: ../IDEFrame.py:356
+msgid "&Program"
+msgstr ""
+
+#: ../PLCOpenEditor.py:98
+msgid "&Properties"
+msgstr ""
+
+#: ../BeremizIDE.py:244
+msgid "&Recent Projects"
+msgstr ""
+
+#: ../IDEFrame.py:358
+msgid "&Resource"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:298
+#, python-format
+msgid "(%d matches)"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
+#, python-format
+msgid ", %s"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr ""
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr ""
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr ""
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr ""
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
+#, python-format
+msgid "A POU named \"%s\" already exists!"
+msgstr ""
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:229
+msgid "A location must be selected!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
+#, python-format
+msgid "A variable with \"%s\" as name already exists in this pou!"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr ""
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
+msgid "About"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:22
+msgid "Absolute number"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
+msgid "Action"
+msgstr ""
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
+msgid "Action Block"
+msgstr ""
+
+#: ../dialogs/PouActionDialog.py:89
+msgid "Action Name"
+msgstr ""
+
+#: ../dialogs/PouActionDialog.py:56
+msgid "Action Name:"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1567
+#, python-format
+msgid "Action with name %s doesn't exist!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Actions"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:139
+msgid "Actions:"
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
+msgid "Add"
+msgstr ""
+
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
+msgid "Add Action"
+msgstr ""
+
+#: ../features.py:33
+msgid "Add C code accessing located variables synchronously"
+msgstr ""
+
+#: ../IDEFrame.py:1907
+msgid "Add Configuration"
+msgstr ""
+
+#: ../IDEFrame.py:1887
+msgid "Add DataType"
+msgstr ""
+
+#: ../editors/Viewer.py:609
+msgid "Add Divergence Branch"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:121
+msgid "Add IP"
+msgstr ""
+
+#: ../IDEFrame.py:1895
+msgid "Add POU"
+msgstr ""
+
+#: ../features.py:34
+msgid "Add Python code executed asynchronously"
+msgstr ""
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
+msgid "Add Resource"
+msgstr ""
+
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
+msgid "Add Transition"
+msgstr ""
+
+#: ../editors/Viewer.py:596
+msgid "Add Wire Segment"
+msgstr ""
+
+#: ../editors/SFCViewer.py:447
+msgid "Add a new initial step"
+msgstr ""
+
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
+msgid "Add a new jump"
+msgstr ""
+
+#: ../editors/SFCViewer.py:469
+msgid "Add a new step"
+msgstr ""
+
+#: ../features.py:35
+msgid "Add a simple WxGlade based GUI."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:143
+msgid "Add action"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:364
+msgid "Add element"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:283
+msgid "Add instance"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:110
+msgid "Add slave"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:252
+msgid "Add task"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
+msgid "Add variable"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:33
+msgid "Addition"
+msgstr ""
+
+#: ../plcopen/definitions.py:51
+msgid "Additional function blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr ""
+
+#: ../editors/Viewer.py:1720
+msgid "Alignment"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
+msgid "All"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:37
+msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+msgstr ""
+
+#: ../ProjectController.py:1670
+msgid "Already connected. Please disconnect\n"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:607
+#, python-format
+msgid "An element named \"%s\" already exists in this structure!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:31
+msgid "Arc cosine"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:30
+msgid "Arc sine"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:32
+msgid "Arc tangent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:33
+msgid "Arithmetic"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
+msgid "Array"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:39
+msgid "Assignment"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:226
+msgid "At least a variable or an expression must be selected!"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:111
+msgid "Author"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:108
+msgid "Author Name (optional):"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:80
+msgid "Backward"
+msgstr ""
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
+#, python-format
+msgid "Bad location size : %s"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
+msgid "Base Type:"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
+msgid "Base Types"
+msgstr ""
+
+#: ../BeremizIDE.py:483
+msgid "Beremiz"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:70
+msgid "Binary selection (1 of 2)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Bit-shift"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise AND"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:67
+msgid "Bitwise OR"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:68
+msgid "Bitwise XOR"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:69
+msgid "Bitwise inverting"
+msgstr ""
+
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
+msgid "Block"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:63
+msgid "Block Properties"
+msgstr ""
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr ""
+
+#: ../editors/Viewer.py:586
+msgid "Bottom"
+msgstr ""
+
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
+msgid "Browse %s values library"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:72
+msgid "Browse Locations"
+msgstr ""
+
+#: ../ProjectController.py:1815
+msgid "Build"
+msgstr ""
+
+#: ../ProjectController.py:1335
+msgid "Build directory already clean\n"
+msgstr ""
+
+#: ../ProjectController.py:1816
+msgid "Build project into build folder"
+msgstr ""
+
+#: ../ProjectController.py:1108
+msgid "C Build crashed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1105
+msgid "C Build failed.\n"
+msgstr ""
+
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr ""
+
+#: ../ProjectController.py:1186
+msgid "C code generated successfully.\n"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:199
+#, python-format
+msgid "C compilation of %s failed.\n"
+msgstr ""
+
+#: ../features.py:33
+msgid "C extension"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr ""
+
+#: ../features.py:31
+msgid "CANopen support"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
+msgid "Can only generate execution order on FBD networks!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:291
+msgid "Can only give a location to local or global variables"
+msgstr ""
+
+#: ../PLCOpenEditor.py:318
+#, python-format
+msgid "Can't generate program to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:289
+msgid "Can't give a location to a function block instance"
+msgstr ""
+
+#: ../PLCOpenEditor.py:363
+#, python-format
+msgid "Can't save project to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:339
+msgid "Can't set an initial value to a function block instance"
+msgstr ""
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr ""
+
+#: ../ConfigTreeNode.py:454
+#, python-format
+msgid "Cannot find lower free IEC channel than %d\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:139
+msgid "Cannot get PLC status - connection failed.\n"
+msgstr ""
+
+#: ../ProjectController.py:967
+msgid "Cannot open/parse VARIABLES.csv!\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
+msgid "Case sensitive"
+msgstr ""
+
+#: ../editors/Viewer.py:581
+msgid "Center"
+msgstr ""
+
+#: ../Beremiz_service.py:276
+msgid "Change IP of interface to bind"
+msgstr ""
+
+#: ../Beremiz_service.py:275
+msgid "Change Name"
+msgstr ""
+
+#: ../IDEFrame.py:1977
+msgid "Change POU Type To"
+msgstr ""
+
+#: ../Beremiz_service.py:277
+msgid "Change Port Number"
+msgstr ""
+
+#: ../Beremiz_service.py:278
+msgid "Change working directory"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Character string"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "Choose a SVG file"
+msgstr ""
+
+#: ../ProjectController.py:561
+msgid "Choose a directory to save project"
+msgstr ""
+
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
+msgid "Choose a file"
+msgstr ""
+
+#: ../BeremizIDE.py:900
+msgid "Choose a project"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
+msgid "Choose a value for %s:"
+msgstr ""
+
+#: ../Beremiz_service.py:333
+msgid "Choose a working directory "
+msgstr ""
+
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr ""
+
+#: ../ProjectController.py:468
+msgid "Chosen folder doesn't contain a program. It's not a valid project!"
+msgstr ""
+
+#: ../ProjectController.py:435
+msgid "Chosen folder isn't empty. You can't use it for a new project!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:60
+msgid "Class"
+msgstr ""
+
+#: ../controls/VariablePanel.py:472
+msgid "Class Filter:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:74
+msgid "Class:"
+msgstr ""
+
+#: ../ProjectController.py:1821
+msgid "Clean"
+msgstr ""
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr ""
+
+#: ../ProjectController.py:1822
+msgid "Clean project build folder"
+msgstr ""
+
+#: ../ProjectController.py:1332
+msgid "Cleaning the build directory\n"
+msgstr ""
+
+#: ../IDEFrame.py:437
+msgid "Clear Errors"
+msgstr ""
+
+#: ../editors/Viewer.py:680
+msgid "Clear Execution Order"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr ""
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
+msgid "Close Application"
+msgstr ""
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
+msgid "Close Project"
+msgstr ""
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
+msgid "Close Tab"
+msgstr ""
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
+msgid "Coil"
+msgstr ""
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
+msgid "Comment"
+msgstr ""
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:106
+msgid "Company Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:107
+msgid "Company URL (optional):"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Comparison"
+msgstr ""
+
+#: ../ProjectController.py:756
+msgid "Compiling IEC Program into C code...\n"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:85
+msgid "Concatenation"
+msgstr ""
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr ""
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:43
+msgid "Configuration"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Configurations"
+msgstr ""
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr ""
+
+#: ../ProjectController.py:1842
+msgid "Connect"
+msgstr ""
+
+#: ../ProjectController.py:1843
+msgid "Connect to the target PLC"
+msgstr ""
+
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
+msgid "Connection"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:55
+msgid "Connection Properties"
+msgstr ""
+
+#: ../ProjectController.py:1691
+msgid "Connection canceled!\n"
+msgstr ""
+
+#: ../ProjectController.py:1714
+#, python-format
+msgid "Connection failed to %s!\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
+msgid "Connection to '%s' failed.\n"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
+msgid "Connector"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:68
+msgid "Connectors:"
+msgstr ""
+
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr ""
+
+#: ../controls/VariablePanel.py:75
+msgid "Constant"
+msgstr ""
+
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
+msgid "Contact"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:217
+msgid "Content Description (optional):"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
+msgid "Continuation"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:18
+msgid "Conversion from BCD"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:19
+msgid "Conversion to BCD"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:21
+msgid "Conversion to date"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:20
+msgid "Conversion to time-of-day"
+msgstr ""
+
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
+msgid "Copy"
+msgstr ""
+
+#: ../IDEFrame.py:1964
+msgid "Copy POU"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:68
+msgid "Copy file from left folder to right"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:67
+msgid "Copy file from right folder to left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:28
+msgid "Cosine"
+msgstr ""
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr ""
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../PLCControler.py:552
+msgid "Couldn't paste non-POU object."
+msgstr ""
+
+#: ../ProjectController.py:1636
+msgid "Couldn't start PLC !\n"
+msgstr ""
+
+#: ../ProjectController.py:1644
+msgid "Couldn't stop PLC !\n"
+msgstr ""
+
+#: ../svgui/svgui.py:57
+msgid "Create HMI"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:54
+msgid "Create a new POU"
+msgstr ""
+
+#: ../dialogs/PouActionDialog.py:45
+msgid "Create a new action"
+msgstr ""
+
+#: ../IDEFrame.py:166
+msgid "Create a new action block"
+msgstr ""
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
+msgid "Create a new block"
+msgstr ""
+
+#: ../IDEFrame.py:139
+msgid "Create a new branch"
+msgstr ""
+
+#: ../IDEFrame.py:133
+msgid "Create a new coil"
+msgstr ""
+
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
+msgid "Create a new comment"
+msgstr ""
+
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
+msgid "Create a new connection"
+msgstr ""
+
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
+msgid "Create a new contact"
+msgstr ""
+
+#: ../IDEFrame.py:169
+msgid "Create a new divergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:54
+msgid "Create a new divergence or convergence"
+msgstr ""
+
+#: ../IDEFrame.py:157
+msgid "Create a new initial step"
+msgstr ""
+
+#: ../IDEFrame.py:172
+msgid "Create a new jump"
+msgstr ""
+
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
+msgid "Create a new power rail"
+msgstr ""
+
+#: ../IDEFrame.py:130
+msgid "Create a new rung"
+msgstr ""
+
+#: ../IDEFrame.py:160
+msgid "Create a new step"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
+msgid "Create a new transition"
+msgstr ""
+
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
+msgid "Create a new variable"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr ""
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr ""
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
+msgid "Cut"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Cyclic"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:60
+msgid "DEPRECATED"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
+msgid "DS-301 Profile"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
+msgid "DS-302 Profile"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:39
+msgid "Data Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Data Types"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Data type conversion"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
+msgid "Date addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
+msgid "Date and time subtraction"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
+msgid "Date subtraction"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:46
+msgid "Days:"
+msgstr ""
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:144
+msgid "Debug instance"
+msgstr ""
+
+#: ../editors/Viewer.py:490
+#, python-format
+msgid "Debug: %s"
+msgstr ""
+
+#: ../ProjectController.py:1471
+#, python-format
+msgid "Debug: Unknown variable '%s'\n"
+msgstr ""
+
+#: ../ProjectController.py:1469
+#, python-format
+msgid "Debug: Unsupported type to debug '%s'\n"
+msgstr ""
+
+#: ../IDEFrame.py:660
+msgid "Debugger"
+msgstr ""
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr ""
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
+msgid "Delete"
+msgstr ""
+
+#: ../editors/Viewer.py:610
+msgid "Delete Divergence Branch"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:157
+msgid "Delete File"
+msgstr ""
+
+#: ../editors/Viewer.py:597
+msgid "Delete Wire Segment"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:44
+msgid "Delete item"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:88
+msgid "Deletion (within)"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:161
+msgid "Derivation Type:"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr ""
+
+#: ../controls/VariablePanel.py:463
+msgid "Description:"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
+msgid "Dimensions:"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:69
+msgid "Direction"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:102
+msgid "Direction:"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Directly"
+msgstr ""
+
+#: ../ProjectController.py:1855
+msgid "Disconnect"
+msgstr ""
+
+#: ../ProjectController.py:1856
+msgid "Disconnect from PLC"
+msgstr ""
+
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr ""
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
+msgid "Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:36
+msgid "Division"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:156
+#, python-format
+msgid "Do you really want to delete the file '%s'?"
+msgstr ""
+
+#: ../controls/VariablePanel.py:65
+msgid "Documentation"
+msgstr ""
+
+#: ../PLCOpenEditor.py:312
+msgid "Done"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Duration"
+msgstr ""
+
+#: ../canfestival/canfestival.py:174
+msgid "EDS files (*.eds)|*.eds|All files|*.*"
+msgstr ""
+
+#: ../editors/Viewer.py:668
+msgid "Edit Block"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:56
+msgid "Edit Contact Values"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:62
+msgid "Edit Duration"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:53
+msgid "Edit Step"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
+msgid "Edit a WxWidgets GUI with WXGlade"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:127
+msgid "Edit action block properties"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:47
+msgid "Edit array type properties"
+msgstr ""
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
+msgid "Edit comment"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:69
+msgid "Edit file"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:42
+msgid "Edit item"
+msgstr ""
+
+#: ../editors/Viewer.py:3059
+msgid "Edit jump target"
+msgstr ""
+
+#: ../ProjectController.py:1873
+msgid "Edit raw IEC code added to code generated by PLCGenerator"
+msgstr ""
+
+#: ../editors/SFCViewer.py:815
+msgid "Edit step name"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:53
+msgid "Edit transition"
+msgstr ""
+
+#: ../IDEFrame.py:632
+msgid "Editor ToolBar"
+msgstr ""
+
+#: ../ProjectController.py:1294
+msgid "Editor selection"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:360
+msgid "Elements :"
+msgstr ""
+
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr ""
+
+#: ../Beremiz_service.py:341
+msgid "Enter a name "
+msgstr ""
+
+#: ../Beremiz_service.py:326
+msgid "Enter a port number "
+msgstr ""
+
+#: ../Beremiz_service.py:317
+msgid "Enter the IP of the interface to bind"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Enumerated"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:77
+msgid "Equal to"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
+msgid "Error"
+msgstr ""
+
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+
+#: ../ProjectController.py:803
+#, python-format
+msgid "Error : IEC to C compiler returned %d\n"
+msgstr ""
+
+#: ../ProjectController.py:731
+#, python-format
+msgid ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+msgstr ""
+
+#: ../ConfigTreeNode.py:219
+#, python-format
+msgid "Error while saving \"%s\"\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:179
+msgid "Error: Export slave failed\n"
+msgstr ""
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:388
+msgid "Error: No Master generated\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:383
+msgid "Error: No PLC built\n"
+msgstr ""
+
+#: ../ProjectController.py:1708
+#, python-format
+msgid "Exception while connecting %s!\n"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:123
+msgid "Execution Control:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
+msgid "Execution Order:"
+msgstr ""
+
+#: ../features.py:36
+msgid "Experimental web based HMI"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:38
+msgid "Exponent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:26
+msgid "Exponentiation"
+msgstr ""
+
+#: ../canfestival/canfestival.py:186
+msgid "Export CanOpen slave to EDS file"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
+msgid "Export graph values to clipboard"
+msgstr ""
+
+#: ../canfestival/canfestival.py:185
+msgid "Export slave"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:94
+msgid "Expression:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "External"
+msgstr ""
+
+#: ../ProjectController.py:826
+msgid "Extracting Located Variables...\n"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "FBD"
+msgstr ""
+
+#: ../ProjectController.py:1773
+msgid "Failed : Must build before transfer.\n"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
+msgid "Falling Edge"
+msgstr ""
+
+#: ../ProjectController.py:1098
+msgid "Fatal : cannot get builder.\n"
+msgstr ""
+
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
+msgid "Field %s hasn't a valid value!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
+msgid "Fields %s haven't a valid value!"
+msgstr ""
+
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
+msgid "Find"
+msgstr ""
+
+#: ../IDEFrame.py:379
+msgid "Find Next"
+msgstr ""
+
+#: ../IDEFrame.py:381
+msgid "Find Previous"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:90
+msgid "Find position"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:58
+msgid "Find:"
+msgstr ""
+
+#: ../editors/Viewer.py:1633
+msgid "Force value"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:176
+msgid "Forcing Variable Value"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
+#, python-format
+msgid "Form isn't complete. %s must be filled!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
+msgid "Form isn't complete. Name must be filled!"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:235
+msgid "Form isn't complete. Valid block type must be selected!"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:75
+msgid "Forward"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
+msgid "Function"
+msgstr ""
+
+#: ../IDEFrame.py:354
+msgid "Function &Block"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
+msgid "Function Block"
+msgstr ""
+
+#: ../controls/VariablePanel.py:868
+msgid "Function Block Types"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Function Blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:290
+msgid "Function Blocks can't be used in Functions!"
+msgstr ""
+
+#: ../PLCControler.py:1907
+#, python-format
+msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Functions"
+msgstr ""
+
+#: ../PLCOpenEditor.py:88
+msgid "Generate Program"
+msgstr ""
+
+#: ../ProjectController.py:722
+msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Global"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
+msgid "Go to current value"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:189
+msgid "Graphics"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Greater than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:76
+msgid "Greater than or equal to"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:149
+msgid "Grid Resolution:"
+msgstr ""
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:135
+msgid "Height:"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:89
+msgid "Home Directory:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:165
+msgid "Horizontal:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:47
+msgid "Hours:"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "IL"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr ""
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
+msgid "IP is not valid!"
+msgstr ""
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
+msgid "Import SVG"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
+msgid "InOut"
+msgstr ""
+
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr ""
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:306
+#, python-format
+msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Indicator"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr ""
+
+#: ../editors/Viewer.py:650
+msgid "Initial Step"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
+msgid "Initial Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
+msgid "Initial Value:"
+msgstr ""
+
+#: ../svgui/svgui.py:56
+msgid "Inkscape"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
+msgid "Inline"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Input"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:99
+msgid "Inputs:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:87
+msgid "Insertion (into)"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1948
+#, python-format
+msgid "Instance with id %d doesn't exist!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:279
+msgid "Instances:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:88
+msgid "Interface"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Interrupt"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Interval"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+
+#: ../PLCControler.py:1895
+msgid "Invalid plcopen element(s)!!!"
+msgstr ""
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr ""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
+#, python-format
+msgid "Invalid value \"%s\" for debug variable"
+msgstr ""
+
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
+msgid "Invalid value \"%s\" for variable grid element"
+msgstr ""
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
+#, python-format
+msgid "Invalid value \"%s\" for viewer block"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:124
+msgid ""
+"Invalid value!\n"
+"You must fill a numeric value."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr ""
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
+msgid "Jump"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "LD"
+msgstr ""
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
+#, python-format
+msgid "Ladder element with id %d is on more than one rung."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
+msgid "Language"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:206
+msgid "Language (optional):"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
+msgid "Language:"
+msgstr ""
+
+#: ../ProjectController.py:1779
+msgid "Latest build already matches current target. Transfering anyway...\n"
+msgstr ""
+
+#: ../Beremiz_service.py:281
+msgid "Launch WX GUI inspector"
+msgstr ""
+
+#: ../Beremiz_service.py:280
+msgid "Launch a live Python shell"
+msgstr ""
+
+#: ../editors/Viewer.py:580
+msgid "Left"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:64
+msgid "Left PowerRail"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Length of string"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:78
+msgid "Less than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:79
+msgid "Less than or equal to"
+msgstr ""
+
+#: ../IDEFrame.py:652
+msgid "Library"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:73
+msgid "Limitation"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:209
+msgid "Linking :\n"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
+msgid "Local"
+msgstr ""
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr ""
+
+#: ../ProjectController.py:1685
+msgid "Local service discovery failed!\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:62
+msgid "Location"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:79
+msgid "Locations available:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:25
+msgid "Logarithm to base 10"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:102
+#, python-format
+msgid "MDNS resolution failure for '%s'\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
+msgid "Map Variable"
+msgstr ""
+
+#: ../features.py:31
+msgid "Map located variables over CANopen"
+msgstr ""
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:113
+msgid "Master"
+msgstr ""
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr ""
+
+#: ../plcopen/iec_std.csv:71
+msgid "Maximum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:246
+msgid "Maximum:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Memory"
+msgstr ""
+
+#: ../IDEFrame.py:617
+msgid "Menu ToolBar"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:51
+msgid "Microseconds:"
+msgstr ""
+
+#: ../editors/Viewer.py:585
+msgid "Middle"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:50
+msgid "Milliseconds:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:72
+msgid "Minimum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:233
+msgid "Minimum:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:48
+msgid "Minutes:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:231
+msgid "Miscellaneous"
+msgstr ""
+
+#: ../features.py:32
+msgid "Modbus support"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:65
+msgid "Modifier:"
+msgstr ""
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:146
+msgid "Move action down"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:145
+msgid "Move action up"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:46
+msgid "Move down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:367
+msgid "Move element down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:366
+msgid "Move element up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:254
+msgid "Move task up"
+msgstr ""
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
+msgid "Move the view"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:45
+msgid "Move up"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
+msgid "Move variable down"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
+msgid "Move variable up"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:74
+msgid "Multiplexer (select 1 of N)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:34
+msgid "Multiplication"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:87
+msgid "My Computer:"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
+#: ../controls/VariablePanel.py:59
+msgid "Name"
+msgstr ""
+
+#: ../Beremiz_service.py:342
+msgid "Name must not be null!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
+msgid "Name:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:24
+msgid "Natural logarithm"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
+msgid "Negated"
+msgstr ""
+
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr ""
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
+msgid "New"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:43
+msgid "New item"
+msgstr ""
+
+#: ../editors/Viewer.py:553
+msgid "No Modifier"
+msgstr ""
+
+#: ../ProjectController.py:1808
+msgid "No PLC to transfer (did build succeed ?)\n"
+msgstr ""
+
+#: ../PLCGenerator.py:1678
+#, python-format
+msgid "No body defined in \"%s\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCOpenEditor.py:331
+msgid ""
+"No documentation available.\n"
+"Coming soon."
+msgstr ""
+
+#: ../PLCGenerator.py:841
+#, python-format
+msgid "No informations found for \"%s\" block"
+msgstr ""
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:175
+msgid "No search results available."
+msgstr ""
+
+#: ../svgui/svgui.py:142
+#, python-format
+msgid "No such SVG file: %s\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr ""
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+msgid "No valid value selected!"
+msgstr ""
+
+#: ../PLCGenerator.py:1676
+#, python-format
+msgid "No variable defined in \"%s\" POU"
+msgstr ""
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr ""
+
+#: ../controls/VariablePanel.py:79
+msgid "Non-Retain"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78
+msgid "Normal"
+msgstr ""
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:80
+msgid "Not equal to"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:91
+msgid "Number of sequences:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:22
+msgid "Numerical"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:88
+msgid "Only Elements"
+msgstr ""
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
+msgid "Open"
+msgstr ""
+
+#: ../svgui/svgui.py:151
+msgid "Open Inkscape"
+msgstr ""
+
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+
+#: ../ProjectController.py:1879
+msgid "Open a file explorer to manage project files"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
+msgid "Open wxGlade"
+msgstr ""
+
+#: ../controls/VariablePanel.py:64
+msgid "Option"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
+msgid "Options"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:109
+msgid "Organization (optional):"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
+msgid "Other Profile"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Output"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
+msgid "PDO Receive"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
+msgid "PDO Transmit"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:174
+msgid "PLC :\n"
+msgstr ""
+
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr ""
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr ""
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr ""
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr ""
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
+msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
+msgstr ""
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
+msgid "PLCOpenEditor"
+msgstr ""
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:109
+msgid "POU Name"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:66
+msgid "POU Name:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:111
+msgid "POU Type"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:73
+msgid "POU Type:"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr ""
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
+msgid "Page Setup"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:124
+msgid "Page Size (optional):"
+msgstr ""
+
+#: ../IDEFrame.py:2640
+#, python-format
+msgid "Page: %d"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:134
+msgid "Parent instance"
+msgstr ""
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
+msgid "Paste"
+msgstr ""
+
+#: ../IDEFrame.py:1899
+msgid "Paste POU"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:60
+msgid "Pattern to search:"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:75
+msgid "Pin number:"
+msgstr ""
+
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
+msgid "Please choose a target"
+msgstr ""
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr ""
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
+msgid "Please enter comment text"
+msgstr ""
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
+msgid "Please enter step name"
+msgstr ""
+
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
+msgid "Please enter value for a \"%s\" variable:"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be 0 <= port <= 65535!"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be an integer!"
+msgstr ""
+
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
+msgid "Power Rail"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:52
+msgid "Power Rail Properties"
+msgstr ""
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
+msgid "Preview"
+msgstr ""
+
+#: ../dialogs/BlockPreviewDialog.py:59
+msgid "Preview:"
+msgstr ""
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
+msgid "Print"
+msgstr ""
+
+#: ../IDEFrame.py:1110
+msgid "Print preview"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Priority"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:91
+msgid "Priority:"
+msgstr ""
+
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:90
+msgid "Product Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:92
+msgid "Product Release (optional):"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:91
+msgid "Product Version (required):"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
+msgid "Program"
+msgstr ""
+
+#: ../PLCOpenEditor.py:321
+msgid "Program was successfully generated!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Programs"
+msgstr ""
+
+#: ../editors/Viewer.py:285
+msgid "Programs can't be used by other POUs!"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
+msgid "Project"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:180
+#, python-format
+msgid "Project '%s':"
+msgstr ""
+
+#: ../ProjectController.py:1878
+msgid "Project Files"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:88
+msgid "Project Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:89
+msgid "Project Version (optional):"
+msgstr ""
+
+#: ../PLCControler.py:2717
+msgid ""
+"Project file syntax error:\n"
+"\n"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
+msgid "Project properties"
+msgstr ""
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Properties"
+msgstr ""
+
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr ""
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr ""
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr ""
+
+#: ../features.py:34
+msgid "Python file"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Qualifier"
+msgstr ""
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
+msgid "Quit"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
+msgid "Range:"
+msgstr ""
+
+#: ../ProjectController.py:1872
+msgid "Raw IEC code"
+msgstr ""
+
+#: ../BeremizIDE.py:1083
+#, python-format
+msgid "Really delete node '%s'?"
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
+msgid "Redo"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:76
+msgid "Reference"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
+msgid "Refresh"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:70
+msgid "Regular expression"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:99
+msgid "Regular expressions"
+msgstr ""
+
+#: ../editors/Viewer.py:1636
+msgid "Release value"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:37
+msgid "Remainder (modulo)"
+msgstr ""
+
+#: ../BeremizIDE.py:1084
+#, python-format
+msgid "Remove %s node"
+msgstr ""
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr ""
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:144
+msgid "Remove action"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:365
+msgid "Remove element"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:66
+msgid "Remove file from left folder"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:284
+msgid "Remove instance"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:111
+msgid "Remove slave"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:253
+msgid "Remove task"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
+msgid "Remove variable"
+msgstr ""
+
+#: ../IDEFrame.py:1979
+msgid "Rename"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:187
+msgid "Replace File"
+msgstr ""
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:89
+msgid "Replacement (within)"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Reset"
+msgstr ""
+
+#: ../editors/Viewer.py:681
+msgid "Reset Execution Order"
+msgstr ""
+
+#: ../IDEFrame.py:453
+msgid "Reset Perspective"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:103
+msgid "Reset search result"
+msgstr ""
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
+msgid "Resources"
+msgstr ""
+
+#: ../controls/VariablePanel.py:77
+msgid "Retain"
+msgstr ""
+
+#: ../controls/VariablePanel.py:455
+msgid "Return Type:"
+msgstr ""
+
+#: ../editors/Viewer.py:582
+msgid "Right"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:65
+msgid "Right PowerRail"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
+msgid "Rising Edge"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:65
+msgid "Rotate left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:64
+msgid "Rotate right"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:17
+msgid "Rounding up/down"
+msgstr ""
+
+#: ../ProjectController.py:1828
+msgid "Run"
+msgstr ""
+
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
+msgid "SDO Client"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
+msgid "SDO Server"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "SFC"
+msgstr ""
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr ""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "ST"
+msgstr ""
+
+#: ../PLCOpenEditor.py:308
+msgid "ST files (*.st)|*.st|All files|*.*"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "SVG files (*.svg)|*.svg|All files|*.*"
+msgstr ""
+
+#: ../features.py:36
+msgid "SVGUI"
+msgstr ""
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
+msgid "Save"
+msgstr ""
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
+msgid "Save As..."
+msgstr ""
+
+#: ../BeremizIDE.py:249
+msgid "Save as"
+msgstr ""
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:73
+msgid "Scope"
+msgstr ""
+
+#: ../IDEFrame.py:644
+msgid "Search"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
+msgid "Search in Project"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:49
+msgid "Seconds:"
+msgstr ""
+
+#: ../IDEFrame.py:390
+msgid "Select All"
+msgstr ""
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
+msgid "Select a variable class:"
+msgstr ""
+
+#: ../ProjectController.py:1293
+msgid "Select an editor:"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:292
+msgid "Select an instance"
+msgstr ""
+
+#: ../IDEFrame.py:628
+msgid "Select an object"
+msgstr ""
+
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:70
+msgid "Selection"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:65
+msgid "Selection Divergence"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:104
+msgid "Services available:"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Set"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Shift left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:63
+msgid "Shift right"
+msgstr ""
+
+#: ../ProjectController.py:1863
+msgid "Show IEC code generated by PLCGenerator"
+msgstr ""
+
+#: ../canfestival/canfestival.py:407
+msgid "Show Master"
+msgstr ""
+
+#: ../canfestival/canfestival.py:408
+msgid "Show Master generated by config_utils"
+msgstr ""
+
+#: ../ProjectController.py:1862
+msgid "Show code"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:67
+msgid "Simultaneous Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:27
+msgid "Sine"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Single"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr ""
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+
+#: ../plcopen/iec_std.csv:23
+msgid "Square root (base 2)"
+msgstr ""
+
+#: ../plcopen/definitions.py:50
+msgid "Standard function blocks"
+msgstr ""
+
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
+msgid "Start PLC"
+msgstr ""
+
+#: ../ProjectController.py:1074
+#, python-format
+msgid "Start build in %s\n"
+msgstr ""
+
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr ""
+
+#: ../ProjectController.py:1633
+msgid "Starting PLC\n"
+msgstr ""
+
+#: ../BeremizIDE.py:393
+msgid "Status ToolBar"
+msgstr ""
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
+msgid "Step"
+msgstr ""
+
+#: ../ProjectController.py:1835
+msgid "Stop"
+msgstr ""
+
+#: ../Beremiz_service.py:272
+msgid "Stop PLC"
+msgstr ""
+
+#: ../ProjectController.py:1836
+msgid "Stop Running PLC"
+msgstr ""
+
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Structure"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Subrange"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:35
+msgid "Subtraction"
+msgstr ""
+
+#: ../ProjectController.py:1113
+msgid "Successfully built.\n"
+msgstr ""
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
+msgid "Syntax error in regular expression of pattern to search!"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:29
+msgid "Tangent"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:97
+msgid "Task"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:248
+msgid "Tasks:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Temp"
+msgstr ""
+
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:186
+#, python-format
+msgid ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+msgstr ""
+
+#: ../editors/LDViewer.py:893
+msgid "The group of block must be coherent!"
+msgstr ""
+
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
+msgid "There are changes, do you want to save?"
+msgstr ""
+
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+
+#: ../IDEFrame.py:1133
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+
+#: ../editors/LDViewer.py:902
+msgid "This option isn't available yet!"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40
+msgid "Time"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
+msgid "Time addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:86
+msgid "Time concatenation"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
+msgid "Time division"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
+msgid "Time multiplication"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
+msgid "Time subtraction"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
+msgid "Time-of-day addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
+msgid "Time-of-day subtraction"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr ""
+
+#: ../editors/Viewer.py:584
+msgid "Top"
+msgstr ""
+
+#: ../ProjectController.py:1848
+msgid "Transfer"
+msgstr ""
+
+#: ../ProjectController.py:1849
+msgid "Transfer PLC"
+msgstr ""
+
+#: ../ProjectController.py:1802
+msgid "Transfer completed successfully.\n"
+msgstr ""
+
+#: ../ProjectController.py:1805
+msgid "Transfer failed\n"
+msgstr ""
+
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
+msgid "Transition"
+msgstr ""
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:91
+msgid "Transition Name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:60
+msgid "Transition Name:"
+msgstr ""
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1526
+#, python-format
+msgid "Transition with name %s doesn't exist!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Transitions"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Triggering"
+msgstr ""
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
+msgid "Type"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr ""
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
+#, python-format
+msgid "Type conflict for location \"%s\""
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Type conversion"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:170
+msgid "Type infos:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
+msgid "Type:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
+#, python-format
+msgid "Unable to define PDO mapping for node %02x"
+msgstr ""
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
+msgid "Unable to get Xenomai's %s \n"
+msgstr ""
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:261
+#, python-format
+msgid "Undefined pou type \"%s\""
+msgstr ""
+
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
+msgid "Undo"
+msgstr ""
+
+#: ../ProjectController.py:442
+msgid "Unknown"
+msgstr ""
+
+#: ../editors/Viewer.py:437
+#, python-format
+msgid "Unknown variable \"%s\" for this POU!"
+msgstr ""
+
+#: ../ProjectController.py:439 ../ProjectController.py:440
+msgid "Unnamed"
+msgstr ""
+
+#: ../PLCControler.py:263
+#, python-format
+msgid "Unnamed%d"
+msgstr ""
+
+#: ../controls/VariablePanel.py:308
+#, python-format
+msgid "Unrecognized data size \"%s\""
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
+msgid "User Data Types"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
+msgid "User Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "User-defined POUs"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:267
+msgid "Values:"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
+msgid "Variable"
+msgstr ""
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:68
+msgid "Variable Properties"
+msgstr ""
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
+msgid "Variable class"
+msgstr ""
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
+msgid "Variable don't belong to this POU!"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "Variables"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:166
+msgid "Vertical:"
+msgstr ""
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr ""
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr ""
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr ""
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr ""
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr ""
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr ""
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr ""
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr ""
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
+msgid "WXGLADE GUI"
+msgstr ""
+
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
+msgid "Warning"
+msgstr ""
+
+#: ../ProjectController.py:726
+msgid "Warnings in ST/IL/SFC code generator :\n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:82
+msgid "Whole Project"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:134
+msgid "Width:"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:94
+msgid "Wrap search"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr ""
+
+#: ../features.py:35
+msgid "WxGlade GUI"
+msgstr ""
+
+#: ../svgui/svgui.py:150
+msgid ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:160
+msgid ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+msgstr ""
+
+#: ../ProjectController.py:390
+msgid ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+msgstr ""
+
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+
+#: ../editors/LDViewer.py:677
+msgid "You must select the wire where a contact should be added!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
+msgid "You must type a name!"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:209
+msgid "You must type a value!"
+msgstr ""
+
+#: ../IDEFrame.py:440
+msgid "Zoom"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr ""
+
+#: ../PLCOpenEditor.py:317
+#, python-format
+msgid "error: %s\n"
+msgstr ""
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "function"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "functionBlock"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr ""
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "program"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:84
+msgid "string from the middle"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:82
+msgid "string left of"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:83
+msgid "string right of"
+msgstr ""
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr ""
+
+#: ../PLCOpenEditor.py:315
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr ""
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr ""
+
+msgid "CAN_Device"
+msgstr ""
+
+msgid "CAN_Baudrate"
+msgstr ""
+
+msgid "NodeId"
+msgstr ""
+
+msgid "Sync_Align"
+msgstr ""
+
+msgid "Sync_Align_Ratio"
+msgstr ""
+
+msgid "CanFestivalNode"
+msgstr ""
+
+msgid "Sync_TPDOs"
+msgstr ""
+
+msgid "CanFestivalInstance"
+msgstr ""
+
+msgid "CAN_Driver"
+msgstr ""
+
+msgid "Generic"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Xenomai"
+msgstr ""
+
+msgid "XenoConfig"
+msgstr ""
+
+msgid "Compiler"
+msgstr ""
+
+msgid "CFLAGS"
+msgstr ""
+
+msgid "Linker"
+msgstr ""
+
+msgid "LDFLAGS"
+msgstr ""
+
+msgid "Linux"
+msgstr ""
+
+msgid "Win32"
+msgstr ""
+
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr ""
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
+msgid "BaseParams"
+msgstr ""
+
+msgid "IEC_Channel"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "BeremizRoot"
+msgstr ""
+
+msgid "TargetType"
+msgstr ""
+
+msgid "Libraries"
+msgstr ""
+
+msgid "URI_location"
+msgstr ""
+
+msgid "Disable_Extensions"
+msgstr ""
+
+msgid "%(codefile_name)s"
+msgstr ""
+
+msgid "variables"
+msgstr ""
+
+msgid "variable"
+msgstr ""
+
+msgid "name"
+msgstr ""
+
+msgid "type"
+msgstr ""
+
+msgid "class"
+msgstr ""
+
+msgid "initial"
+msgstr ""
+
+msgid "desc"
+msgstr ""
+
+msgid "onchange"
+msgstr ""
+
+msgid "opts"
+msgstr ""
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr ""
+
+msgid "Preset datetime"
+msgstr ""
+
+msgid "Copy of IN"
+msgstr ""
+
+msgid "Datetime, current or relative to PDT"
+msgstr ""
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+
+msgid "1 = integrate, 0 = hold"
+msgstr ""
+
+msgid "Overriding reset"
+msgstr ""
+
+msgid "Input variable"
+msgstr ""
+
+msgid "Initial value"
+msgstr ""
+
+msgid "Sampling period"
+msgstr ""
+
+msgid "NOT R1"
+msgstr ""
+
+msgid "Integrated output"
+msgstr ""
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr ""
+
+msgid "0 = reset"
+msgstr ""
+
+msgid "Input to be differentiated"
+msgstr ""
+
+msgid "Differentiated output"
+msgstr ""
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+
+msgid "0 - manual , 1 - automatic"
+msgstr ""
+
+msgid "Process variable"
+msgstr ""
+
+msgid "Set point"
+msgstr ""
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr ""
+
+msgid "Proportionality constant"
+msgstr ""
+
+msgid "Reset time"
+msgstr ""
+
+msgid "Derivative time constant"
+msgstr ""
+
+msgid "PV - SP"
+msgstr ""
+
+msgid "FB for integral term"
+msgstr ""
+
+msgid "FB for derivative term"
+msgstr ""
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr ""
+
+msgid "Ramp duration"
+msgstr ""
+
+msgid "BUSY = 1 during ramping period"
+msgstr ""
+
+msgid "Elapsed time of ramp"
+msgstr ""
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr ""
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr ""
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr ""
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+
+msgid "first input parameter"
+msgstr ""
+
+msgid "second input parameter"
+msgstr ""
+
+msgid "first output parameter"
+msgstr ""
+
+msgid "second output parameter"
+msgstr ""
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr ""
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
--- a/i18n/Beremiz_de_DE.po	Sat Jun 02 11:56:01 2018 +0100
+++ b/i18n/Beremiz_de_DE.po	Mon Jan 07 13:50:39 2019 +0100
@@ -1,49 +1,25 @@
 # SOME DESCRIPTIVE TITLE.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the Beremiz package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-09-07 01:17+0200\n"
-"PO-Revision-Date: 2012-09-09 18:40+0100\n"
-"Last-Translator: Laurent BESSARD <laurent.bessard@gmail.com>\n"
-"Language-Team: LANGUAGE <mark.muzenhardt@googlemail.com>\n"
-"Language: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Hendrik Knackstedt <h.knackstedt@stud.uni-hannover.de>, 2017\n"
+"Language-Team: German (Germany) (https://www.transifex.com/beremiz/teams/75746/de_DE/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: German\n"
-"X-Poedit-Country: GERMANY\n"
-
-#: ../PLCOpenEditor.py:520
-#, fuzzy
-msgid ""
-"\n"
-"An error has occurred.\n"
-"\n"
-"Click OK to save an error report.\n"
-"\n"
-"Please be kind enough to send this file to:\n"
-"edouard.tisserant@gmail.com\n"
-"\n"
-"Error:\n"
-msgstr ""
-"\n"
-"Ein nicht behandelter Fehler ist aufgetreten. Fehlerreport gespeichert unter: \n"
-"(%s)\n"
-"\n"
-"Bitte unterstützen Sie uns und senden ihn hierher:\n"
-"edouard.tisserant@gmail.com\n"
-"\n"
-"Sie sollten Beremiz nun neu starten.\n"
-"\n"
-"Traceback:\n"
-
-#: ../Beremiz.py:1071
-#, fuzzy, python-format
+"Language: de_DE\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
 msgid ""
 "\n"
 "An unhandled exception (bug) occured. Bug report saved at :\n"
@@ -52,3505 +28,3601 @@
 "Please be kind enough to send this file to:\n"
 "beremiz-devel@lists.sourceforge.net\n"
 "\n"
-"You should now restart Beremiz.\n"
+"You should now restart program.\n"
 "\n"
 "Traceback:\n"
 msgstr ""
 "\n"
-"Ein nicht behandelter Fehler ist aufgetreten. Fehlerreport gespeichert unter: \n"
+"Eine unbehandelte Ausnahme (Fehler) ist aufgetreten. Fehlerbericht gespeichert unter:\n"
 "(%s)\n"
 "\n"
-"Bitte unterstützen Sie uns und senden ihn hierher:\n"
-"edouard.tisserant@gmail.com\n"
+"Bitte schicken Sie die Datei an:\n"
+"beremiz-devel@lists.sourceforge.net\n"
 "\n"
-"Sie sollten Beremiz nun neu starten.\n"
+"Sie sollten das Programm jetzt neu starten.\n"
 "\n"
 "Traceback:\n"
 
-#: ../controls/VariablePanel.py:77
+#: ../controls/VariablePanel.py:90
 msgid "   External"
-msgstr ""
-
-#: ../controls/VariablePanel.py:76
+msgstr "   Extern"
+
+#: ../controls/VariablePanel.py:89
 msgid "   InOut"
-msgstr ""
-
-#: ../controls/VariablePanel.py:76
+msgstr "EinAusgang"
+
+#: ../controls/VariablePanel.py:89
 msgid "   Input"
-msgstr ""
-
-#: ../controls/VariablePanel.py:77
-#, fuzzy
+msgstr "Eingang"
+
+#: ../controls/VariablePanel.py:90
 msgid "   Local"
-msgstr "Lokal"
-
-#: ../controls/VariablePanel.py:76
+msgstr "   Lokal"
+
+#: ../controls/VariablePanel.py:89
 msgid "   Output"
-msgstr ""
-
-#: ../controls/VariablePanel.py:78
+msgstr "Ausgang"
+
+#: ../controls/VariablePanel.py:91
 msgid "   Temp"
-msgstr ""
-
-#: ../PLCOpenEditor.py:530
-#, fuzzy
-msgid " : "
-msgstr "Datei : "
-
-#: ../dialogs/PouTransitionDialog.py:94
-#: ../dialogs/PouActionDialog.py:91
-#: ../dialogs/PouDialog.py:111
-#: ../dialogs/SFCTransitionDialog.py:144
+msgstr "   Temp"
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
 #, python-format
 msgid " and %s"
-msgstr ""
-
-#: ../ProjectController.py:890
+msgstr "und %s"
+
+#: ../ProjectController.py:1182
 msgid " generation failed !\n"
 msgstr " Erstellung fehlgeschlagen !\n"
 
-#: ../plcopen/plcopen.py:1051
+#: ../plcopen/plcopen.py:1029
 #, python-format
 msgid "\"%s\" Data Type doesn't exist !!!"
-msgstr ""
-
-#: ../plcopen/plcopen.py:1069
+msgstr "Datentyp \"%s\" existiert nicht !!!"
+
+#: ../plcopen/plcopen.py:1047
 #, python-format
 msgid "\"%s\" POU already exists !!!"
-msgstr ""
-
-#: ../plcopen/plcopen.py:1090
+msgstr "Baustein \"%s\" existiert bereits !!!"
+
+#: ../plcopen/plcopen.py:1068
 #, python-format
 msgid "\"%s\" POU doesn't exist !!!"
-msgstr ""
-
-#: ../editors/Viewer.py:234
+msgstr "Baustein \"%s\" existiert nicht !!!"
+
+#: ../editors/Viewer.py:288
 #, python-format
 msgid "\"%s\" can't use itself!"
-msgstr ""
-
-#: ../IDEFrame.py:1706
-#: ../IDEFrame.py:1725
+msgstr "\"%s\" kann sich nicht selbst aufrufen!"
+
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
 #, python-format
 msgid "\"%s\" config already exists!"
-msgstr ""
-
-#: ../plcopen/plcopen.py:315
+msgstr "Konfiguration \"%s\" existiert bereits!"
+
+#: ../plcopen/plcopen.py:531
 #, python-format
 msgid "\"%s\" configuration already exists !!!"
-msgstr ""
-
-#: ../IDEFrame.py:1660
+msgstr "Konfiguration \"%s\" existiert bereits !!!"
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr "Konfiguration \"%s\" existiert nicht !!!"
+
+#: ../IDEFrame.py:1638
 #, python-format
 msgid "\"%s\" data type already exists!"
-msgstr ""
-
-#: ../PLCControler.py:2040
-#: ../PLCControler.py:2044
-#, python-format
-msgid "\"%s\" element can't be pasted here!!!"
-msgstr ""
-
-#: ../editors/TextViewer.py:305
-#: ../editors/TextViewer.py:325
-#: ../editors/Viewer.py:252
-#: ../dialogs/PouTransitionDialog.py:105
-#: ../dialogs/ConnectionDialog.py:150
-#: ../dialogs/PouActionDialog.py:102
-#: ../dialogs/FBDBlockDialog.py:162
+msgstr "Datentyp \"%s\" existiert bereits!"
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
 #, python-format
 msgid "\"%s\" element for this pou already exists!"
-msgstr ""
-
-#: ../Beremiz.py:894
+msgstr "\"%s\" Element ist für diesen Baustein bereits vorhanden!"
+
+#: ../BeremizIDE.py:928
 #, python-format
 msgid "\"%s\" folder is not a valid Beremiz project\n"
 msgstr "Verzeichnis \"%s\" ist kein korrektes Beremiz-Projekt\n"
 
-#: ../plcopen/structures.py:106
-#, python-format
-msgid "\"%s\" function cancelled in \"%s\" POU: No input connected"
-msgstr ""
-
-#: ../controls/VariablePanel.py:656
-#: ../IDEFrame.py:1651
-#: ../editors/DataTypeEditor.py:548
-#: ../editors/DataTypeEditor.py:577
-#: ../dialogs/PouNameDialog.py:49
-#: ../dialogs/PouTransitionDialog.py:101
-#: ../dialogs/SFCStepNameDialog.py:51
-#: ../dialogs/ConnectionDialog.py:146
-#: ../dialogs/FBDVariableDialog.py:199
-#: ../dialogs/PouActionDialog.py:98
-#: ../dialogs/PouDialog.py:118
-#: ../dialogs/SFCStepDialog.py:122
-#: ../dialogs/FBDBlockDialog.py:158
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
 #, python-format
 msgid "\"%s\" is a keyword. It can't be used!"
-msgstr ""
-
-#: ../editors/Viewer.py:240
-#, python-format
-msgid "\"%s\" is already used by \"%s\"!"
-msgstr ""
-
-#: ../plcopen/plcopen.py:2786
+msgstr "\"%s\" ist ein Schlüsselwort. Es kann nicht verwendet werden!"
+
+#: ../plcopen/plcopen.py:2836
 #, python-format
 msgid "\"%s\" is an invalid value!"
-msgstr ""
-
-#: ../PLCOpenEditor.py:362
-#: ../PLCOpenEditor.py:399
-#, fuzzy, python-format
+msgstr "\"%s\" ist ein ungültiger Wert!"
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
 msgid "\"%s\" is not a valid folder!"
-msgstr "IP ist nicht gültig!"
-
-#: ../controls/VariablePanel.py:654
-#: ../IDEFrame.py:1649
-#: ../editors/DataTypeEditor.py:572
-#: ../dialogs/PouNameDialog.py:47
-#: ../dialogs/PouTransitionDialog.py:99
-#: ../dialogs/SFCStepNameDialog.py:49
-#: ../dialogs/ConnectionDialog.py:144
-#: ../dialogs/PouActionDialog.py:96
-#: ../dialogs/PouDialog.py:116
-#: ../dialogs/SFCStepDialog.py:120
-#: ../dialogs/FBDBlockDialog.py:156
-#, fuzzy, python-format
+msgstr "\"%s\" ist kein Ordner!"
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
+#, python-format
 msgid "\"%s\" is not a valid identifier!"
-msgstr "Verzeichnis \"%s\" ist kein korrektes Beremiz-Projekt\n"
-
-#: ../IDEFrame.py:214
-#: ../IDEFrame.py:2445
-#: ../IDEFrame.py:2464
-#, python-format
-msgid "\"%s\" is used by one or more POUs. It can't be removed!"
-msgstr ""
-
-#: ../controls/VariablePanel.py:311
-#: ../IDEFrame.py:1669
-#: ../editors/TextViewer.py:303
-#: ../editors/TextViewer.py:323
-#: ../editors/TextViewer.py:360
-#: ../editors/Viewer.py:250
-#: ../editors/Viewer.py:295
-#: ../editors/Viewer.py:312
-#: ../dialogs/ConnectionDialog.py:148
-#: ../dialogs/PouDialog.py:120
-#: ../dialogs/FBDBlockDialog.py:160
+msgstr "\"%s\" ist kein gültiger Bezeichner!"
+
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr ""
+"\"%s\" wird von einer oder mehreren Bausteinen benutzt. Wollen Sie "
+"fortfahren?"
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
 #, python-format
 msgid "\"%s\" pou already exists!"
-msgstr ""
-
-#: ../plcopen/plcopen.py:346
-#, python-format
-msgid "\"%s\" resource already exists in \"%s\" configuration !!!"
-msgstr ""
-
-#: ../plcopen/plcopen.py:362
-#, python-format
-msgid "\"%s\" resource doesn't exist in \"%s\" configuration !!!"
-msgstr ""
-
-#: ../dialogs/SFCStepNameDialog.py:57
-#: ../dialogs/SFCStepDialog.py:128
+msgstr "Baustein \"%s\" existiert bereits!"
+
+#: ../dialogs/SFCStepNameDialog.py:62
 #, python-format
 msgid "\"%s\" step already exists!"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:543
+msgstr "Schritt \"%s\" existiert bereits!"
+
+#: ../editors/DataTypeEditor.py:566
 #, python-format
 msgid "\"%s\" value already defined!"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:719
-#: ../dialogs/ArrayTypeDialog.py:97
+msgstr "Wert \"%s\" bereits definiert!"
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
 #, python-format
 msgid "\"%s\" value isn't a valid array dimension!"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:726
-#: ../dialogs/ArrayTypeDialog.py:103
+msgstr "Wert \"%s\" ist keine gültige Array-Größe!"
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
 #, python-format
 msgid ""
 "\"%s\" value isn't a valid array dimension!\n"
 "Right value must be greater than left value."
 msgstr ""
-
-#: ../PLCControler.py:793
-#, python-format
-msgid "%s \"%s\" can't be pasted as a %s."
-msgstr ""
-
-#: ../PLCControler.py:1422
+"Wert \"%s\" ist keine gültige Array-Größe!\n"
+"Der rechte Wert muss größer sein als der linke."
+
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr "Funktion \"{a1}\" in \"{a2}\" abgebrochen POU: Nicht mit Eingang verbunden"
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr "\"{a1}\" wird von \"{a2}\" bereits benutzt?"
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr "Ressource \"{a1}\" existiert in Konfiguration \"{a2}\" bereits !!!"
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr "Ressource \"{a1}\" existiert in Konfiguration \"{a2}\" nicht !!!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr "%03g ms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr "%d T"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr "%d S"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr "%d M"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr "%d ms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr "%d s"
+
+#: ../PLCControler.py:1114
 #, python-format
 msgid "%s Data Types"
-msgstr ""
-
-#: ../editors/GraphicViewer.py:278
-#, python-format
-msgid "%s Graphics"
-msgstr ""
-
-#: ../PLCControler.py:1417
+msgstr "%s Datentypen"
+
+#: ../PLCControler.py:1097
 #, python-format
 msgid "%s POUs"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:42
-#: ../canfestival/NetworkEditor.py:72
+msgstr "%s Bausteine"
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
 #, python-format
 msgid "%s Profile"
-msgstr ""
-
-#: ../plcopen/plcopen.py:1780
-#: ../plcopen/plcopen.py:1790
-#: ../plcopen/plcopen.py:1800
-#: ../plcopen/plcopen.py:1810
-#: ../plcopen/plcopen.py:1819
+msgstr "%s Profil"
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
 #, python-format
 msgid "%s body don't have instances!"
-msgstr ""
-
-#: ../plcopen/plcopen.py:1842
-#: ../plcopen/plcopen.py:1849
+msgstr "Baustein \"%s\" besitzt keine Instanzen!"
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
 #, python-format
 msgid "%s body don't have text!"
-msgstr ""
-
-#: ../IDEFrame.py:364
+msgstr "Baustein \"%s\" ist leer!"
+
+#: ../IDEFrame.py:388
 msgid "&Add Element"
-msgstr ""
-
-#: ../IDEFrame.py:334
+msgstr "&Element hinzufügen"
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr "&Schließen"
+
+#: ../IDEFrame.py:361
 msgid "&Configuration"
-msgstr ""
-
-#: ../IDEFrame.py:325
-#, fuzzy
+msgstr "&Konfiguration"
+
+#: ../IDEFrame.py:350
 msgid "&Data Type"
-msgstr "ZielTyp"
-
-#: ../IDEFrame.py:368
+msgstr "&Datentyp"
+
+#: ../IDEFrame.py:392
 msgid "&Delete"
-msgstr ""
-
-#: ../IDEFrame.py:317
+msgstr "&Löschen"
+
+#: ../IDEFrame.py:342
 msgid "&Display"
-msgstr ""
-
-#: ../IDEFrame.py:316
+msgstr "&Ansicht"
+
+#: ../IDEFrame.py:341
 msgid "&Edit"
 msgstr "&Bearbeiten"
 
-#: ../IDEFrame.py:315
+#: ../IDEFrame.py:340
 msgid "&File"
-msgstr ""
-
-#: ../IDEFrame.py:327
-#, fuzzy
+msgstr "&Datei"
+
+#: ../IDEFrame.py:352
 msgid "&Function"
-msgstr "Funktion : "
-
-#: ../IDEFrame.py:318
+msgstr "&Funktion"
+
+#: ../IDEFrame.py:343
 msgid "&Help"
-msgstr ""
-
-#: ../IDEFrame.py:331
+msgstr "&Hilfe"
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr "&Lizenz"
+
+#: ../IDEFrame.py:356
 msgid "&Program"
-msgstr ""
-
-#: ../PLCOpenEditor.py:148
-#, fuzzy
+msgstr "&Programm"
+
+#: ../PLCOpenEditor.py:98
 msgid "&Properties"
-msgstr "Eigenschaften"
-
-#: ../Beremiz.py:310
-#, fuzzy
+msgstr "&Einstellungen"
+
+#: ../BeremizIDE.py:244
 msgid "&Recent Projects"
-msgstr "Projekt schließen"
-
-#: ../Beremiz.py:352
+msgstr "&Zuletzt verwendete Projekte"
+
+#: ../IDEFrame.py:358
 msgid "&Resource"
-msgstr ""
-
-#: ../controls/SearchResultPanel.py:237
-#, python-format
-msgid "'%s' - %d match in project"
-msgstr ""
-
-#: ../controls/SearchResultPanel.py:239
-#, python-format
-msgid "'%s' - %d matches in project"
-msgstr ""
-
-#: ../connectors/PYRO/__init__.py:51
-#, python-format
-msgid "'%s' is located at %s\n"
-msgstr ""
-
-#: ../controls/SearchResultPanel.py:289
+msgstr "&Ressource"
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr "'{a1}' - {a2} Übereinstimmung im Projekt"
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr "'{a1}' - {a2} Übereinstimmungen im Projekt"
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr "'{a1}' befindet sich unter {a2}\n"
+
+#: ../controls/SearchResultPanel.py:298
 #, python-format
 msgid "(%d matches)"
-msgstr ""
-
-#: ../PLCOpenEditor.py:508
-#: ../PLCOpenEditor.py:510
-#: ../PLCOpenEditor.py:511
-msgid ",   "
-msgstr ",   "
-
-#: ../dialogs/PouTransitionDialog.py:96
-#: ../dialogs/PouActionDialog.py:93
-#: ../dialogs/PouDialog.py:113
-#: ../dialogs/SFCTransitionDialog.py:146
+msgstr "(%d Ergebnisse)"
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
 #, python-format
 msgid ", %s"
-msgstr ""
-
-#: ../PLCOpenEditor.py:506
-msgid ". "
-msgstr ". "
-
-#: ../ProjectController.py:1268
-#, fuzzy
-msgid "... debugger recovered\n"
-msgstr "Warte auf Selbstheilung des Debuggers...\n"
-
-#: ../IDEFrame.py:1672
-#: ../IDEFrame.py:1714
-#: ../IDEFrame.py:1733
-#: ../dialogs/PouDialog.py:122
-#, python-format
-msgid "A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?"
-msgstr ""
-
-#: ../controls/VariablePanel.py:658
-#: ../IDEFrame.py:1684
-#: ../IDEFrame.py:1695
-#: ../dialogs/PouNameDialog.py:51
-#: ../dialogs/PouTransitionDialog.py:103
-#: ../dialogs/SFCStepNameDialog.py:53
-#: ../dialogs/PouActionDialog.py:100
-#: ../dialogs/SFCStepDialog.py:124
-#, fuzzy, python-format
+msgstr ", %s"
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr ""
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr "1T"
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr "1S"
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr "1m"
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr "1s"
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+"Ein POU enthält ein Element mit dem Namen \"%s\". Das könnte eine Kollision "
+"sein. Möchten Sie fortfahren?"
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
+#, python-format
 msgid "A POU named \"%s\" already exists!"
-msgstr "Ein Zweigname \"%s\" existiert bereits -> \"%s\"\n"
-
-#: ../ConfigTreeNode.py:371
-#, fuzzy, python-format
-msgid "A child named \"%s\" already exist -> \"%s\"\n"
-msgstr "Ein Zweigname \"%s\" existiert bereits -> \"%s\"\n"
-
-#: ../dialogs/BrowseLocationsDialog.py:175
+msgstr "Baustein mit dem Namen \"%s\" existiert bereits!"
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr "Ein Kind mit dem Namen \"{a1}\" existiert bereits -> \"{a2}\"\n"
+
+#: ../dialogs/BrowseLocationsDialog.py:229
 msgid "A location must be selected!"
-msgstr ""
-
-#: ../controls/VariablePanel.py:660
-#: ../IDEFrame.py:1686
-#: ../IDEFrame.py:1697
-#: ../dialogs/SFCStepNameDialog.py:55
-#: ../dialogs/SFCStepDialog.py:126
+msgstr "Bitte wählen Sie einen Ort aus!"
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr "Task mit dem gleichen Namen existiert bereits!"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
 #, python-format
 msgid "A variable with \"%s\" as name already exists in this pou!"
-msgstr ""
-
-#: ../Beremiz.py:362
-#: ../PLCOpenEditor.py:181
+msgstr "Variable mit den Namen \"%s\" existiert bereits im Baustein!"
+
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr "Variable mit dem Namen \"%s\" existiert bereits!"
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
 msgid "About"
 msgstr "Über"
 
-#: ../Beremiz.py:931
-msgid "About Beremiz"
-msgstr "Über Beremiz"
-
-#: ../PLCOpenEditor.py:376
-msgid "About PLCOpenEditor"
-msgstr ""
-
 #: ../plcopen/iec_std.csv:22
 msgid "Absolute number"
-msgstr ""
-
-#: ../dialogs/ActionBlockDialog.py:41
-#: ../dialogs/SFCStepDialog.py:69
+msgstr "Absolute Zahl"
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
 msgid "Action"
-msgstr ""
-
-#: ../editors/Viewer.py:495
+msgstr "Aktion"
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
 msgid "Action Block"
-msgstr ""
-
-#: ../dialogs/PouActionDialog.py:81
+msgstr "Aktionsblock"
+
+#: ../dialogs/PouActionDialog.py:89
 msgid "Action Name"
-msgstr ""
-
-#: ../dialogs/PouActionDialog.py:49
-#, fuzzy
+msgstr "Aktionname"
+
+#: ../dialogs/PouActionDialog.py:56
 msgid "Action Name:"
-msgstr "Funktion : "
-
-#: ../plcopen/plcopen.py:1480
+msgstr "Aktionname:"
+
+#: ../plcopen/plcopen.py:1567
 #, python-format
 msgid "Action with name %s doesn't exist!"
-msgstr ""
-
-#: ../PLCControler.py:95
+msgstr "Aktion mit dem Namen %s existiert nicht!"
+
+#: ../plcopen/types_enums.py:76
 msgid "Actions"
-msgstr ""
-
-#: ../dialogs/ActionBlockDialog.py:134
-#, fuzzy
+msgstr "Aktionen"
+
+#: ../dialogs/ActionBlockDialog.py:139
 msgid "Actions:"
-msgstr "Funktion : "
-
-#: ../canfestival/SlaveEditor.py:54
-#: ../canfestival/NetworkEditor.py:84
-#: ../editors/Viewer.py:527
+msgstr "Aktionen:"
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr "Aktiv"
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
 msgid "Add"
-msgstr ""
-
-#: ../IDEFrame.py:1925
-#: ../IDEFrame.py:1956
-#, fuzzy
+msgstr "Hinzufügen"
+
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
 msgid "Add Action"
-msgstr "Plugin hinzufügen"
-
-#: ../features.py:7
+msgstr "Aktion hinzufügen"
+
+#: ../features.py:33
 msgid "Add C code accessing located variables synchronously"
-msgstr ""
-
-#: ../IDEFrame.py:1908
+msgstr "Synchron ausführenden C-Code hinzufügen"
+
+#: ../IDEFrame.py:1907
 msgid "Add Configuration"
-msgstr ""
-
-#: ../IDEFrame.py:1888
+msgstr "Konfiguration hinzufügen"
+
+#: ../IDEFrame.py:1887
 msgid "Add DataType"
-msgstr ""
-
-#: ../editors/Viewer.py:453
+msgstr "Datentyp hinzufügen"
+
+#: ../editors/Viewer.py:609
 msgid "Add Divergence Branch"
-msgstr ""
-
-#: ../dialogs/DiscoveryDialog.py:115
-#, fuzzy
+msgstr "Zweig hinzufügen"
+
+#: ../dialogs/DiscoveryDialog.py:121
 msgid "Add IP"
-msgstr "Plugin hinzufügen"
-
-#: ../IDEFrame.py:1896
+msgstr "IP hinzufügen"
+
+#: ../IDEFrame.py:1895
 msgid "Add POU"
-msgstr ""
-
-#: ../features.py:8
+msgstr "Baustein hinzufügen"
+
+#: ../features.py:34
 msgid "Add Python code executed asynchronously"
-msgstr ""
-
-#: ../IDEFrame.py:1936
-#: ../IDEFrame.py:1982
+msgstr "Asynchron auszuführenden Python-Code hinzufügen"
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
 msgid "Add Resource"
-msgstr ""
-
-#: ../IDEFrame.py:1914
-#: ../IDEFrame.py:1953
+msgstr "Ressource hinzufügen"
+
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
 msgid "Add Transition"
-msgstr ""
-
-#: ../editors/Viewer.py:442
+msgstr "Transitionsbedingung hinzufügen"
+
+#: ../editors/Viewer.py:596
 msgid "Add Wire Segment"
-msgstr ""
-
-#: ../editors/SFCViewer.py:359
+msgstr "Drahtsegment hinzufügen "
+
+#: ../editors/SFCViewer.py:447
 msgid "Add a new initial step"
-msgstr ""
-
-#: ../editors/Viewer.py:2289
-#: ../editors/SFCViewer.py:696
+msgstr "Den ersten Schritt hinzufügen"
+
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
 msgid "Add a new jump"
-msgstr ""
-
-#: ../editors/SFCViewer.py:381
+msgstr "Neuen Sprung hinzufügen"
+
+#: ../editors/SFCViewer.py:469
 msgid "Add a new step"
-msgstr ""
-
-#: ../features.py:9
+msgstr "Neuen Schritt hinzufügen"
+
+#: ../features.py:35
 msgid "Add a simple WxGlade based GUI."
-msgstr ""
-
-#: ../dialogs/ActionBlockDialog.py:138
-#, fuzzy
+msgstr "Einfache WxGlade basierte GUI hinzufügen."
+
+#: ../dialogs/ActionBlockDialog.py:143
 msgid "Add action"
-msgstr "Plugin hinzufügen"
-
-#: ../editors/DataTypeEditor.py:345
+msgstr "Aktion hinzufügen"
+
+#: ../editors/DataTypeEditor.py:364
 msgid "Add element"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:251
+msgstr "Komponent hinzufügen"
+
+#: ../editors/ResourceEditor.py:283
 msgid "Add instance"
-msgstr ""
-
-#: ../canfestival/NetworkEditor.py:86
+msgstr "Instanz hinzufügen"
+
+#: ../canfestival/NetworkEditor.py:110
 msgid "Add slave"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:222
+msgstr "Slave hinzufügen"
+
+#: ../editors/ResourceEditor.py:252
 msgid "Add task"
-msgstr ""
-
-#: ../controls/VariablePanel.py:378
+msgstr "Task hinzufügen"
+
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
 msgid "Add variable"
-msgstr ""
+msgstr "Variable hinzufügen"
 
 #: ../plcopen/iec_std.csv:33
 msgid "Addition"
-msgstr ""
-
-#: ../plcopen/structures.py:250
+msgstr "Addition"
+
+#: ../plcopen/definitions.py:51
 msgid "Additional function blocks"
-msgstr ""
-
-#: ../editors/Viewer.py:1395
+msgstr "Zusätzliche Bausteine"
+
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr "Bausteingröße anpassen"
+
+#: ../editors/Viewer.py:1720
 msgid "Alignment"
-msgstr ""
-
-#: ../controls/VariablePanel.py:75
-#: ../dialogs/BrowseLocationsDialog.py:35
-#: ../dialogs/BrowseLocationsDialog.py:116
+msgstr "Ausrichtung"
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
 msgid "All"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:35
-#, fuzzy
+msgstr "Alle"
+
+#: ../editors/FileManagementPanel.py:37
 msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
-msgstr "SVG files (*.svg)|*.svg|Alle Dateien|*.*"
-
-#: ../ProjectController.py:1335
+msgstr "Alle Dateien (*.*)|*.*|CSV Dateien (*.csv)|*.csv"
+
+#: ../ProjectController.py:1670
 msgid "Already connected. Please disconnect\n"
 msgstr "Bereits verbunden. Bitte Verbindung trennen\n"
 
-#: ../editors/DataTypeEditor.py:587
-#, fuzzy, python-format
+#: ../editors/DataTypeEditor.py:607
+#, python-format
 msgid "An element named \"%s\" already exists in this structure!"
-msgstr "Ein Zweigname \"%s\" existiert bereits -> \"%s\"\n"
+msgstr "Komponent mit den Namen \"%s\" existiert bereits in der Struktur!"
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr "Instanz mit dem gleichen Namen existiert bereits!"
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr "Umbenennen alle Fortsetzungen mit dem gleichen Namen"
 
 #: ../plcopen/iec_std.csv:31
 msgid "Arc cosine"
-msgstr ""
+msgstr " Arkuskosinus"
 
 #: ../plcopen/iec_std.csv:30
 msgid "Arc sine"
-msgstr ""
+msgstr "Arkussinus"
 
 #: ../plcopen/iec_std.csv:32
 msgid "Arc tangent"
-msgstr ""
+msgstr "Arkustangens"
 
 #: ../plcopen/iec_std.csv:33
 msgid "Arithmetic"
-msgstr ""
-
-#: ../controls/VariablePanel.py:729
-#: ../editors/DataTypeEditor.py:52
+msgstr "Arithmetik"
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
 msgid "Array"
-msgstr ""
+msgstr "Array"
 
 #: ../plcopen/iec_std.csv:39
 msgid "Assignment"
-msgstr ""
-
-#: ../dialogs/FBDVariableDialog.py:197
+msgstr "Zuordnung"
+
+#: ../dialogs/FBDVariableDialog.py:226
 msgid "At least a variable or an expression must be selected!"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:99
+msgstr "Mindestens eine Variable oder ein Ausdruck muss ausgewählt werden!"
+
+#: ../controls/ProjectPropertiesPanel.py:111
 msgid "Author"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:96
+msgstr "Autor"
+
+#: ../controls/ProjectPropertiesPanel.py:108
 msgid "Author Name (optional):"
-msgstr ""
-
-#: ../dialogs/FindInPouDialog.py:72
+msgstr "Autor (optional):"
+
+#: ../dialogs/FindInPouDialog.py:80
 msgid "Backward"
-msgstr ""
-
-#: ../util/Zeroconf.py:599
-msgid "Bad domain name (circular) at "
-msgstr ""
-
-#: ../util/Zeroconf.py:602
-msgid "Bad domain name at "
-msgstr ""
-
-#: ../canfestival/config_utils.py:341
-#: ../canfestival/config_utils.py:623
+msgstr "Zurück"
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
 #, python-format
 msgid "Bad location size : %s"
 msgstr "Fehlerhafte location size : %s"
 
-#: ../editors/DataTypeEditor.py:168
-#: ../editors/DataTypeEditor.py:198
-#: ../editors/DataTypeEditor.py:290
-#: ../dialogs/ArrayTypeDialog.py:55
-#, fuzzy
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
 msgid "Base Type:"
-msgstr "ZielTyp"
-
-#: ../controls/VariablePanel.py:699
-#: ../editors/DataTypeEditor.py:617
-#, fuzzy
+msgstr "Basistyp:"
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
 msgid "Base Types"
-msgstr "ZielTyp"
-
-#: ../Beremiz.py:486
+msgstr "Basistypen"
+
+#: ../BeremizIDE.py:483
 msgid "Beremiz"
 msgstr "Beremiz"
 
 #: ../plcopen/iec_std.csv:70
 msgid "Binary selection (1 of 2)"
-msgstr ""
+msgstr "Binärauswahl (1 von 2)"
 
 #: ../plcopen/iec_std.csv:62
 msgid "Bit-shift"
-msgstr ""
+msgstr "Bit-Shift"
 
 #: ../plcopen/iec_std.csv:66
 msgid "Bitwise"
-msgstr ""
+msgstr "Bitweise Operationen"
 
 #: ../plcopen/iec_std.csv:66
 msgid "Bitwise AND"
-msgstr ""
+msgstr "bitweises UND"
 
 #: ../plcopen/iec_std.csv:67
 msgid "Bitwise OR"
-msgstr ""
+msgstr "bitweises ODER"
 
 #: ../plcopen/iec_std.csv:68
 msgid "Bitwise XOR"
-msgstr ""
+msgstr "bitweises XOR"
 
 #: ../plcopen/iec_std.csv:69
 msgid "Bitwise inverting"
-msgstr ""
-
-#: ../editors/Viewer.py:465
+msgstr "bitweises NICHT"
+
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
 msgid "Block"
-msgstr ""
-
-#: ../dialogs/FBDBlockDialog.py:38
-#, fuzzy
+msgstr "Funktionsblock"
+
+#: ../dialogs/FBDBlockDialog.py:63
 msgid "Block Properties"
-msgstr "Eigenschaften"
-
-#: ../editors/Viewer.py:434
+msgstr "Funktionsblockeigenschaften"
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr "Blockname"
+
+#: ../editors/Viewer.py:586
 msgid "Bottom"
-msgstr ""
-
-#: ../dialogs/BrowseValuesLibraryDialog.py:37
+msgstr "Unten"
+
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr "Gebrochen"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
 #, python-format
 msgid "Browse %s values library"
-msgstr ""
-
-#: ../dialogs/BrowseLocationsDialog.py:55
-#, fuzzy
+msgstr "Wert für %s wählen"
+
+#: ../dialogs/BrowseLocationsDialog.py:72
 msgid "Browse Locations"
-msgstr "schließe Applikation"
-
-#: ../ProjectController.py:1484
+msgstr "Verfügbare IEC-Adressen:"
+
+#: ../ProjectController.py:1815
 msgid "Build"
 msgstr "Build"
 
-#: ../ProjectController.py:1051
+#: ../ProjectController.py:1335
 msgid "Build directory already clean\n"
 msgstr "Build-Verzeichnis bereits sauber\n"
 
-#: ../ProjectController.py:1485
+#: ../ProjectController.py:1816
 msgid "Build project into build folder"
 msgstr "Build-Projekt nach Build-Verzeichnis"
 
-#: ../ProjectController.py:910
+#: ../ProjectController.py:1108
 msgid "C Build crashed !\n"
 msgstr "C Build abgestürzt !\n"
 
-#: ../ProjectController.py:907
+#: ../ProjectController.py:1105
 msgid "C Build failed.\n"
 msgstr "C Build fehlgeschlagen.\n"
 
-#: ../ProjectController.py:895
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr "C code"
+
+#: ../ProjectController.py:1186
 msgid "C code generated successfully.\n"
 msgstr "C Code erfolgreich generiert.\n"
 
-#: ../targets/toolchain_gcc.py:132
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr "C Kompilierung fehlgeschlagen.\n"
+
+#: ../targets/toolchain_gcc.py:199
 #, python-format
 msgid "C compilation of %s failed.\n"
 msgstr "C Kompilierung von %s fehlgeschlagen.\n"
 
-#: ../features.py:7
-#, fuzzy
+#: ../features.py:33
 msgid "C extension"
-msgstr "CExtension"
-
-#: ../features.py:6
+msgstr "C-Erweiterung"
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr "&Beiträge"
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr "CANOpen Netzwerk"
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr "CANOpen slave"
+
+#: ../features.py:31
 msgid "CANopen support"
-msgstr ""
-
-#: ../plcopen/plcopen.py:1722
-#: ../plcopen/plcopen.py:1736
-#: ../plcopen/plcopen.py:1757
-#: ../plcopen/plcopen.py:1773
+msgstr "CANopen support"
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
 msgid "Can only generate execution order on FBD networks!"
-msgstr ""
-
-#: ../controls/VariablePanel.py:256
+msgstr "Abarbeitungsreihenfolge kann nur für FUP Bausteine bestimmt werden!"
+
+#: ../controls/VariablePanel.py:291
 msgid "Can only give a location to local or global variables"
-msgstr ""
-
-#: ../PLCOpenEditor.py:357
+msgstr "EIC-Nur lokale oder globale Variable können eine zugeordnet sein."
+
+#: ../PLCOpenEditor.py:318
 #, python-format
 msgid "Can't generate program to file %s!"
-msgstr ""
-
-#: ../controls/VariablePanel.py:254
+msgstr "Code-Erzeugung zur Datei \"%s\" ist fehlgeschlagen!"
+
+#: ../controls/VariablePanel.py:289
 msgid "Can't give a location to a function block instance"
-msgstr ""
-
-#: ../PLCOpenEditor.py:397
+msgstr "IEC-Adresse für eine Funktionsbausteininstanz ist nicht erlaubt "
+
+#: ../PLCOpenEditor.py:363
 #, python-format
 msgid "Can't save project to file %s!"
-msgstr ""
-
-#: ../controls/VariablePanel.py:298
+msgstr "Projekt kann nicht in die Datei %s gespeichert werden!"
+
+#: ../controls/VariablePanel.py:339
 msgid "Can't set an initial value to a function block instance"
-msgstr ""
-
-#: ../ConfigTreeNode.py:470
-#, python-format
-msgid "Cannot create child %s of type %s "
-msgstr "Kann Zweig %s von Typ %s nicht erstellen"
-
-#: ../ConfigTreeNode.py:400
+msgstr "Anfangswert für eine Funktionsbausteininstanz ist nicht erlaubt"
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr "Kann nicht Kind {a1} vom Typ {a2} erstellen"
+
+#: ../ConfigTreeNode.py:454
 #, python-format
 msgid "Cannot find lower free IEC channel than %d\n"
 msgstr "Kann keinen niedrigeren IEC-Kanal als %d finden\n"
 
-#: ../connectors/PYRO/__init__.py:92
+#: ../connectors/PYRO/__init__.py:139
 msgid "Cannot get PLC status - connection failed.\n"
 msgstr "Kann den SPS-Status nicht einlesen - Verbindung gescheitert.\n"
 
-#: ../ProjectController.py:715
+#: ../ProjectController.py:967
 msgid "Cannot open/parse VARIABLES.csv!\n"
 msgstr "Kann die Datei VARIABLES.csv nicht öffnen/lesen!\n"
 
-#: ../canfestival/config_utils.py:371
-#, python-format
-msgid "Cannot set bit offset for non bool '%s' variable (ID:%d,Idx:%x,sIdx:%x))"
-msgstr "Unmöglich, den Bit-Offset in der nicht boolschen Variable '%s' zu setzen! (ID:%d,Idx:%x,sIdx:%x))"
-
-#: ../dialogs/FindInPouDialog.py:81
-#: ../dialogs/SearchInProjectDialog.py:67
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+"Kann Bit-Offset für nicht-bool '{a1}' Variable (ID: {a2}, Idx: {a3}, sIdx: "
+"{a4})) nicht setzen"
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
 msgid "Case sensitive"
-msgstr ""
-
-#: ../editors/Viewer.py:429
+msgstr "Case-sensitive"
+
+#: ../editors/Viewer.py:581
 msgid "Center"
-msgstr ""
-
-#: ../Beremiz_service.py:322
+msgstr "Zentriert"
+
+#: ../Beremiz_service.py:276
 msgid "Change IP of interface to bind"
 msgstr "Ändere IP-Adresse des zu verbindenden Interfaces."
 
-#: ../Beremiz_service.py:321
+#: ../Beremiz_service.py:275
 msgid "Change Name"
 msgstr "Ändere Name"
 
-#: ../IDEFrame.py:1974
+#: ../IDEFrame.py:1977
 msgid "Change POU Type To"
-msgstr ""
-
-#: ../Beremiz_service.py:325
+msgstr "Bausteintyp konvertieren nach"
+
+#: ../Beremiz_service.py:277
 msgid "Change Port Number"
 msgstr "Ändere Port-Nummer"
 
-#: ../Beremiz_service.py:327
+#: ../Beremiz_service.py:278
 msgid "Change working directory"
 msgstr "Ändere Arbeitsverzeichnis"
 
 #: ../plcopen/iec_std.csv:81
 msgid "Character string"
-msgstr ""
-
-#: ../svgui/svgui.py:92
+msgstr "Zeichenkette"
+
+#: ../svgui/svgui.py:136
 msgid "Choose a SVG file"
 msgstr "Wählen Sie eine SVG-Datei"
 
-#: ../ProjectController.py:353
+#: ../ProjectController.py:561
 msgid "Choose a directory to save project"
 msgstr "Wählen Sie ein Verzeichnis um das Projekt zu speichern"
 
-#: ../canfestival/canfestival.py:118
-#: ../PLCOpenEditor.py:313
-#: ../PLCOpenEditor.py:347
-#: ../PLCOpenEditor.py:391
-#, fuzzy
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
 msgid "Choose a file"
-msgstr "Wählen Sie eine SVG-Datei"
-
-#: ../Beremiz.py:831
-#: ../Beremiz.py:866
+msgstr "Datei auswählen"
+
+#: ../BeremizIDE.py:900
 msgid "Choose a project"
 msgstr "Wähle Projekt"
 
-#: ../dialogs/BrowseValuesLibraryDialog.py:42
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
 #, python-format
 msgid "Choose a value for %s:"
-msgstr ""
-
-#: ../Beremiz_service.py:373
+msgstr "Wählen Sie den Wert für %s:"
+
+#: ../Beremiz_service.py:333
 msgid "Choose a working directory "
 msgstr "Wähle Arbeitsverzeichnis"
 
-#: ../ProjectController.py:281
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr "Wählen Sie leeres Verzeichnis für neues Projekt"
+
+#: ../ProjectController.py:468
 msgid "Chosen folder doesn't contain a program. It's not a valid project!"
-msgstr "Ausgewählter Ordner beinhaltet kein Programm. Es handelt sich dabei nicht um ein gültiges Projekt!"
-
-#: ../ProjectController.py:247
+msgstr ""
+"Ausgewählter Ordner beinhaltet kein Programm. Es handelt sich dabei nicht um"
+" ein gültiges Projekt!"
+
+#: ../ProjectController.py:435
 msgid "Chosen folder isn't empty. You can't use it for a new project!"
-msgstr "Gewählter Ordner ist nicht leer. Sie können diesen nicht für ein neues Projekt verwenden!"
-
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
+msgstr ""
+"Gewählter Ordner ist nicht leer. Sie können diesen nicht für ein neues "
+"Projekt verwenden!"
+
+#: ../controls/VariablePanel.py:60
 msgid "Class"
-msgstr ""
-
-#: ../controls/VariablePanel.py:369
+msgstr "Klasse"
+
+#: ../controls/VariablePanel.py:472
 msgid "Class Filter:"
-msgstr ""
-
-#: ../dialogs/FBDVariableDialog.py:62
+msgstr "Klassenfilter:"
+
+#: ../dialogs/FBDVariableDialog.py:74
 msgid "Class:"
-msgstr ""
-
-#: ../ProjectController.py:1488
+msgstr "Klasse:"
+
+#: ../ProjectController.py:1821
 msgid "Clean"
-msgstr "Säubern"
-
-#: ../ProjectController.py:1490
+msgstr "Aufräumen"
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr "Protokoll zurücksetzen"
+
+#: ../ProjectController.py:1822
 msgid "Clean project build folder"
-msgstr "Säubere Projekt-Build Verzeichnis"
-
-#: ../ProjectController.py:1048
+msgstr "Projekt-Build-Verzeichnis leeren"
+
+#: ../ProjectController.py:1332
 msgid "Cleaning the build directory\n"
-msgstr "Säubere das Build-Verzeichnis\n"
-
-#: ../IDEFrame.py:411
+msgstr "Build-Verzeichnis leeren\n"
+
+#: ../IDEFrame.py:437
 msgid "Clear Errors"
-msgstr ""
-
-#: ../editors/Viewer.py:520
+msgstr "Fehlermeldungen zurücksetzen"
+
+#: ../editors/Viewer.py:680
 msgid "Clear Execution Order"
-msgstr ""
-
-#: ../editors/GraphicViewer.py:125
-msgid "Clear the graph values"
-msgstr ""
-
-#: ../Beremiz.py:598
-#: ../PLCOpenEditor.py:221
+msgstr "Ausführungsreihenfolge zurücksetzen"
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr "Schließen"
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
 msgid "Close Application"
-msgstr "schließe Applikation"
-
-#: ../IDEFrame.py:1089
-#: ../Beremiz.py:319
-#: ../Beremiz.py:552
-#: ../PLCOpenEditor.py:131
+msgstr "Anwendung beenden"
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
 msgid "Close Project"
 msgstr "Projekt schließen"
 
-#: ../Beremiz.py:317
-#: ../PLCOpenEditor.py:129
-#, fuzzy
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
 msgid "Close Tab"
-msgstr "Schließe Tab\tCTRL+W"
-
-#: ../editors/Viewer.py:481
+msgstr "Reiter schließen"
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
 msgid "Coil"
-msgstr ""
-
-#: ../editors/Viewer.py:501
-#: ../editors/LDViewer.py:503
+msgstr "Spule"
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
 msgid "Comment"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:94
+msgstr "Kommentar"
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr "Community Unterstützung"
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr "Firmenname"
+
+#: ../controls/ProjectPropertiesPanel.py:106
 msgid "Company Name (required):"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:95
+msgstr "Firmenname (erforderlich):"
+
+#: ../controls/ProjectPropertiesPanel.py:107
 msgid "Company URL (optional):"
-msgstr ""
+msgstr "Firmenwebseite (optional):"
 
 #: ../plcopen/iec_std.csv:75
 msgid "Comparison"
-msgstr ""
-
-#: ../ProjectController.py:538
+msgstr "Vergleich"
+
+#: ../ProjectController.py:756
 msgid "Compiling IEC Program into C code...\n"
 msgstr "Kompilliere IEC Programm zu c-Code...\n"
 
 #: ../plcopen/iec_std.csv:85
 msgid "Concatenation"
-msgstr ""
-
-#: ../dialogs/SearchInProjectDialog.py:47
+msgstr "Konkatenation"
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr "Konfiguration"
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr "Konfigurationsvariablen"
+
+#: ../dialogs/SearchInProjectDialog.py:43
 msgid "Configuration"
-msgstr ""
-
-#: ../PLCControler.py:96
+msgstr "Konfiguration"
+
+#: ../plcopen/types_enums.py:77
 msgid "Configurations"
-msgstr ""
-
-#: ../ProjectController.py:1503
+msgstr "Konfigurationen"
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr "Variablennamen bestätigen oder anpassen"
+
+#: ../ProjectController.py:1842
 msgid "Connect"
 msgstr "Verbinden"
 
-#: ../ProjectController.py:1504
+#: ../ProjectController.py:1843
 msgid "Connect to the target PLC"
-msgstr "Verbinde zur Ziel-SPS"
-
-#: ../connectors/PYRO/__init__.py:40
-#, python-format
-msgid "Connecting to URI : %s\n"
-msgstr "verbinde zu URI: %s\n"
-
-#: ../editors/Viewer.py:467
-#: ../dialogs/SFCTransitionDialog.py:76
-#, fuzzy
+msgstr "Mit Ziel-SPS verbinden"
+
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr "Verbunden mit URI: %s"
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
 msgid "Connection"
-msgstr "Verbinden"
-
-#: ../dialogs/ConnectionDialog.py:37
-#, fuzzy
+msgstr "Verbindung"
+
+#: ../dialogs/ConnectionDialog.py:55
 msgid "Connection Properties"
-msgstr "Eigenschaften"
-
-#: ../ProjectController.py:1359
+msgstr "Verbindungseigenschaften"
+
+#: ../ProjectController.py:1691
 msgid "Connection canceled!\n"
 msgstr "Verbindung abgebrochen!\n"
 
-#: ../ProjectController.py:1384
+#: ../ProjectController.py:1714
 #, python-format
 msgid "Connection failed to %s!\n"
-msgstr "Verbindung zu %s! gescheitert!\n"
-
-#: ../connectors/PYRO/__init__.py:63
-#, fuzzy, python-format
+msgstr "Verbindung zu %s gescheitert!\n"
+
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr "Verbindung verloren!\n"
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
 msgid "Connection to '%s' failed.\n"
-msgstr "C Kompilierung von %s fehlgeschlagen.\n"
-
-#: ../dialogs/ConnectionDialog.py:56
-#, fuzzy
+msgstr "Verbindung zu '%s' gescheitert.\n"
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
 msgid "Connector"
-msgstr "Verbinden"
-
-#: ../dialogs/SFCStepDialog.py:58
-#, fuzzy
+msgstr "Anschluss"
+
+#: ../dialogs/SFCStepDialog.py:68
 msgid "Connectors:"
-msgstr "Verbinden"
-
-#: ../controls/VariablePanel.py:65
+msgstr "Anschlüsse:"
+
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr "Konsole"
+
+#: ../controls/VariablePanel.py:75
 msgid "Constant"
-msgstr ""
-
-#: ../editors/Viewer.py:477
+msgstr "Konstante"
+
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
 msgid "Contact"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:197
+msgstr "Kontakt"
+
+#: ../controls/ProjectPropertiesPanel.py:217
 msgid "Content Description (optional):"
-msgstr ""
-
-#: ../dialogs/ConnectionDialog.py:61
+msgstr "Beschreibung (optional):"
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
 msgid "Continuation"
-msgstr ""
+msgstr "Fortsetzung"
 
 #: ../plcopen/iec_std.csv:18
 msgid "Conversion from BCD"
-msgstr ""
+msgstr "Konvertierung von BCD"
 
 #: ../plcopen/iec_std.csv:19
 msgid "Conversion to BCD"
-msgstr ""
+msgstr "Konvertierung in BCD"
 
 #: ../plcopen/iec_std.csv:21
 msgid "Conversion to date"
-msgstr ""
+msgstr "Umwandlung in Datum"
 
 #: ../plcopen/iec_std.csv:20
 msgid "Conversion to time-of-day"
-msgstr ""
-
-#: ../IDEFrame.py:348
-#: ../IDEFrame.py:401
-#: ../editors/Viewer.py:536
+msgstr "Umwandlung in Tageszeit"
+
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
 msgid "Copy"
-msgstr ""
-
-#: ../IDEFrame.py:1961
+msgstr "Kopieren"
+
+#: ../IDEFrame.py:1964
 msgid "Copy POU"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:283
+msgstr "Baustein kopieren"
+
+#: ../editors/FileManagementPanel.py:68
 msgid "Copy file from left folder to right"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:282
+msgstr "Datei vom linken Ordner nach den rechten kopieren"
+
+#: ../editors/FileManagementPanel.py:67
 msgid "Copy file from right folder to left"
-msgstr ""
+msgstr "Datei vom rechten Ordner nach den linken kopieren"
 
 #: ../plcopen/iec_std.csv:28
 msgid "Cosine"
-msgstr ""
-
-#: ../ConfigTreeNode.py:582
-#, python-format
-msgid ""
-"Could not add child \"%s\", type %s :\n"
-"%s\n"
-msgstr ""
-"Konnte Zweig nicht hinzufügen \"%s\", type %s :\n"
-"%s\n"
-
-#: ../ConfigTreeNode.py:559
-#, fuzzy, python-format
-msgid ""
-"Couldn't load confnode base parameters %s :\n"
-" %s"
-msgstr ""
-"Konnte PlugIn Basis Parameter %s nicht laden :\n"
-" %s"
-
-#: ../ConfigTreeNode.py:570
-#, fuzzy, python-format
-msgid ""
-"Couldn't load confnode parameters %s :\n"
-" %s"
-msgstr ""
-"Konnte PlugIn Parameter %s nicht laden :\n"
-" %s"
-
-#: ../PLCControler.py:765
-#: ../PLCControler.py:802
+msgstr "Kosinus"
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+"Kind \"{a1}\", Typ {a2} konnte nicht hinzugefügt werden:\n"
+"{a3}\n"
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr "Die alte Datei %s konnte nicht importiert weden."
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Confnode Basis-Parameter {a1} konnten nicht geladen werden :\n"
+"{a2}"
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Confnode Parameter {a1} konnten nicht geladen werden :\n"
+"{a2}"
+
+#: ../PLCControler.py:552
 msgid "Couldn't paste non-POU object."
-msgstr ""
-
-#: ../ProjectController.py:1317
+msgstr "Nur Bausteine können eingefügt werden."
+
+#: ../ProjectController.py:1636
 msgid "Couldn't start PLC !\n"
 msgstr "Konnte SPS nicht starten !\n"
 
-#: ../ProjectController.py:1325
+#: ../ProjectController.py:1644
 msgid "Couldn't stop PLC !\n"
 msgstr "Konnte SPS nicht anhalten !\n"
 
-#: ../ProjectController.py:1295
-#, fuzzy
-msgid "Couldn't stop debugger.\n"
-msgstr "Konnte SPS nicht anhalten !\n"
-
-#: ../svgui/svgui.py:22
+#: ../svgui/svgui.py:57
 msgid "Create HMI"
-msgstr "Erstelle HMI"
-
-#: ../dialogs/PouDialog.py:43
+msgstr "HMI erstellen"
+
+#: ../dialogs/PouDialog.py:54
 msgid "Create a new POU"
-msgstr ""
-
-#: ../dialogs/PouActionDialog.py:38
+msgstr "Neuer Baustein"
+
+#: ../dialogs/PouActionDialog.py:45
 msgid "Create a new action"
-msgstr ""
-
-#: ../IDEFrame.py:135
+msgstr "Neue Aktion"
+
+#: ../IDEFrame.py:166
 msgid "Create a new action block"
-msgstr ""
-
-#: ../IDEFrame.py:84
-#: ../IDEFrame.py:114
-#: ../IDEFrame.py:147
+msgstr "Neuer Aktionsblock"
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
 msgid "Create a new block"
-msgstr ""
-
-#: ../IDEFrame.py:108
+msgstr "Neuer Funktionsblock"
+
+#: ../IDEFrame.py:139
 msgid "Create a new branch"
-msgstr ""
-
-#: ../IDEFrame.py:102
+msgstr "Neuer Zweig"
+
+#: ../IDEFrame.py:133
 msgid "Create a new coil"
-msgstr ""
-
-#: ../IDEFrame.py:78
-#: ../IDEFrame.py:93
-#: ../IDEFrame.py:123
+msgstr "Neue Spule"
+
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
 msgid "Create a new comment"
-msgstr ""
-
-#: ../IDEFrame.py:87
-#: ../IDEFrame.py:117
-#: ../IDEFrame.py:150
+msgstr "Neuer Kommentar"
+
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
 msgid "Create a new connection"
-msgstr ""
-
-#: ../IDEFrame.py:105
-#: ../IDEFrame.py:156
+msgstr "Neue Verbindung"
+
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
 msgid "Create a new contact"
-msgstr ""
-
-#: ../IDEFrame.py:138
+msgstr "Neuer Kontakt"
+
+#: ../IDEFrame.py:169
 msgid "Create a new divergence"
-msgstr ""
-
-#: ../dialogs/SFCDivergenceDialog.py:36
+msgstr "Neue Verzweigung"
+
+#: ../dialogs/SFCDivergenceDialog.py:54
 msgid "Create a new divergence or convergence"
-msgstr ""
-
-#: ../IDEFrame.py:126
+msgstr "Neue Verzweigung"
+
+#: ../IDEFrame.py:157
 msgid "Create a new initial step"
-msgstr ""
-
-#: ../IDEFrame.py:141
+msgstr "Erster Schritt"
+
+#: ../IDEFrame.py:172
 msgid "Create a new jump"
-msgstr ""
-
-#: ../IDEFrame.py:96
-#: ../IDEFrame.py:153
+msgstr "Neuer Sprung"
+
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
 msgid "Create a new power rail"
-msgstr ""
-
-#: ../IDEFrame.py:99
+msgstr "Neue Stomleitung"
+
+#: ../IDEFrame.py:130
 msgid "Create a new rung"
-msgstr ""
-
-#: ../IDEFrame.py:129
+msgstr "Neues KOP-Netzwerk"
+
+#: ../IDEFrame.py:160
 msgid "Create a new step"
-msgstr ""
-
-#: ../IDEFrame.py:132
-#: ../dialogs/PouTransitionDialog.py:42
+msgstr "Neuer Schritt"
+
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
 msgid "Create a new transition"
-msgstr ""
-
-#: ../IDEFrame.py:81
-#: ../IDEFrame.py:111
-#: ../IDEFrame.py:144
+msgstr "Neue Transitionsbedingung"
+
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
 msgid "Create a new variable"
-msgstr ""
-
-#: ../IDEFrame.py:346
-#: ../IDEFrame.py:400
-#: ../editors/Viewer.py:535
+msgstr "Erstellen eine neue Variable"
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr "Mitwirkende"
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr "Arbeitsverzeichnis :"
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
 msgid "Cut"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:71
+msgstr "Ausschneiden"
+
+#: ../editors/ResourceEditor.py:81
 msgid "Cyclic"
-msgstr ""
-
-#: ../plcopen/iec_std.csv:42
-#: ../plcopen/iec_std.csv:44
-#: ../plcopen/iec_std.csv:46
-#: ../plcopen/iec_std.csv:50
-#: ../plcopen/iec_std.csv:52
-#: ../plcopen/iec_std.csv:54
-#: ../plcopen/iec_std.csv:56
-#: ../plcopen/iec_std.csv:58
+msgstr "Zyklisch"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
 #: ../plcopen/iec_std.csv:60
 msgid "DEPRECATED"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:50
-#: ../canfestival/NetworkEditor.py:80
+msgstr "VERALTET"
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
 msgid "DS-301 Profile"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:51
-#: ../canfestival/NetworkEditor.py:81
+msgstr "DS-301 Profil"
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
 msgid "DS-302 Profile"
-msgstr ""
-
-#: ../dialogs/SearchInProjectDialog.py:43
-#, fuzzy
+msgstr "DS-302 Profil"
+
+#: ../dialogs/SearchInProjectDialog.py:39
 msgid "Data Type"
-msgstr "ZielTyp"
-
-#: ../PLCControler.py:95
-#, fuzzy
+msgstr "Datentyp"
+
+#: ../plcopen/types_enums.py:76
 msgid "Data Types"
-msgstr "ZielTyp"
+msgstr "Datentypen"
 
 #: ../plcopen/iec_std.csv:16
 msgid "Data type conversion"
-msgstr ""
-
-#: ../plcopen/iec_std.csv:44
-#: ../plcopen/iec_std.csv:45
+msgstr "Datentypumwandlung"
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
 msgid "Date addition"
-msgstr ""
-
-#: ../plcopen/iec_std.csv:56
-#: ../plcopen/iec_std.csv:57
-#: ../plcopen/iec_std.csv:58
-#: ../plcopen/iec_std.csv:59
+msgstr "Datumsaddition"
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
 msgid "Date and time subtraction"
-msgstr ""
-
-#: ../plcopen/iec_std.csv:50
-#: ../plcopen/iec_std.csv:51
+msgstr "Datums- und Zeitsubstraktion"
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
 msgid "Date subtraction"
-msgstr ""
-
-#: ../dialogs/DurationEditorDialog.py:43
+msgstr "Datumssubstraktion"
+
+#: ../dialogs/DurationEditorDialog.py:46
 msgid "Days:"
-msgstr ""
-
-#: ../ProjectController.py:1405
-msgid "Debug connect matching running PLC\n"
-msgstr "Debug Verbindung entspricht laufender SPS\n"
-
-#: ../ProjectController.py:1408
-msgid "Debug do not match PLC - stop/transfert/start to re-enable\n"
-msgstr "Debug entspricht nicht der SPS - stop/transfert/start um neu zu aktivieren\n"
-
-#: ../controls/PouInstanceVariablesPanel.py:52
-#, fuzzy
+msgstr "Tage:"
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr ""
+"Debug entspricht der SPS nicht - stoppen/übertragen/starten um Debug wieder "
+"zu aktivieren\n"
+
+#: ../controls/PouInstanceVariablesPanel.py:144
 msgid "Debug instance"
-msgstr "Debugger deaktiviert\n"
-
-#: ../editors/Viewer.py:3222
+msgstr "Debuginstanz"
+
+#: ../editors/Viewer.py:490
 #, python-format
 msgid "Debug: %s"
-msgstr ""
-
-#: ../ProjectController.py:1122
-#, fuzzy, python-format
+msgstr "Debug: %s"
+
+#: ../ProjectController.py:1471
+#, python-format
 msgid "Debug: Unknown variable '%s'\n"
-msgstr "Debug : Unbekannte Variable %s\n"
-
-#: ../ProjectController.py:1120
+msgstr "Debug: Unbekannte Variable '%s'\n"
+
+#: ../ProjectController.py:1469
 #, python-format
 msgid "Debug: Unsupported type to debug '%s'\n"
-msgstr ""
-
-#: ../IDEFrame.py:608
-#, fuzzy
+msgstr "Debug: Datentyp '%s' ist nicht unterstützt\n"
+
+#: ../IDEFrame.py:660
 msgid "Debugger"
-msgstr "Debug_Modus"
-
-#: ../ProjectController.py:1285
-msgid "Debugger disabled\n"
-msgstr "Debugger deaktiviert\n"
-
-#: ../ProjectController.py:1297
-#, fuzzy
-msgid "Debugger stopped.\n"
-msgstr "Debugger deaktiviert\n"
-
-#: ../IDEFrame.py:1990
-#: ../Beremiz.py:958
-#: ../editors/Viewer.py:511
+msgstr "Debugger"
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr "Debugger ist bereit\n"
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
 msgid "Delete"
-msgstr ""
-
-#: ../editors/Viewer.py:454
+msgstr "Löschen"
+
+#: ../editors/Viewer.py:610
 msgid "Delete Divergence Branch"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:371
-#, fuzzy
+msgstr "Zweig löschen"
+
+#: ../editors/FileManagementPanel.py:157
 msgid "Delete File"
-msgstr "lösche dieses PlugIn"
-
-#: ../editors/Viewer.py:443
+msgstr "Datei löschen"
+
+#: ../editors/Viewer.py:597
 msgid "Delete Wire Segment"
-msgstr ""
-
-#: ../controls/CustomEditableListBox.py:41
+msgstr "Kabelabschnitt löschen"
+
+#: ../controls/CustomEditableListBox.py:44
 msgid "Delete item"
-msgstr ""
+msgstr "Object löschen"
 
 #: ../plcopen/iec_std.csv:88
 msgid "Deletion (within)"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:146
+msgstr "Löschen (innerhalb)"
+
+#: ../editors/DataTypeEditor.py:161
 msgid "Derivation Type:"
-msgstr ""
-
-#: ../plcopen/structures.py:264
-msgid ""
-"Derivative\n"
-"The derivative function block produces an output XOUT proportional to the rate of change of the input XIN."
-msgstr ""
-
-#: ../controls/VariablePanel.py:360
+msgstr "Referenz:"
+
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr "Beschreibung"
+
+#: ../controls/VariablePanel.py:463
 msgid "Description:"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:314
-#: ../dialogs/ArrayTypeDialog.py:61
+msgstr "Beschreibung:"
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
 msgid "Dimensions:"
-msgstr ""
-
-#: ../dialogs/FindInPouDialog.py:61
+msgstr "Dimensionen:"
+
+#: ../dialogs/FindInPouDialog.py:69
 msgid "Direction"
-msgstr ""
-
-#: ../dialogs/BrowseLocationsDialog.py:78
+msgstr "Richtung"
+
+#: ../dialogs/BrowseLocationsDialog.py:102
 msgid "Direction:"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:52
+msgstr "Richtung:"
+
+#: ../editors/DataTypeEditor.py:60
 msgid "Directly"
-msgstr ""
-
-#: ../ProjectController.py:1512
+msgstr "Direkt"
+
+#: ../ProjectController.py:1855
 msgid "Disconnect"
 msgstr "Verbindung trennen"
 
-#: ../ProjectController.py:1514
+#: ../ProjectController.py:1856
 msgid "Disconnect from PLC"
 msgstr "Verbindung zu SPS trennen"
 
-#: ../editors/Viewer.py:496
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr "Getrennt"
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
 msgid "Divergence"
-msgstr ""
+msgstr "Verzweigung"
 
 #: ../plcopen/iec_std.csv:36
 msgid "Division"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:370
+msgstr "Division"
+
+#: ../editors/FileManagementPanel.py:156
 #, python-format
 msgid "Do you really want to delete the file '%s'?"
-msgstr ""
-
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
+msgstr "Möchten Sie die Datei '%s' wirklich löschen?"
+
+#: ../controls/VariablePanel.py:65
 msgid "Documentation"
-msgstr ""
-
-#: ../PLCOpenEditor.py:351
+msgstr "Dokumentation"
+
+#: ../PLCOpenEditor.py:312
 msgid "Done"
-msgstr ""
-
-#: ../plcopen/structures.py:227
-msgid ""
-"Down-counter\n"
-"The down-counter can be used to signal when a count has reached zero, on counting down from a preset value."
-msgstr ""
-
-#: ../dialogs/ActionBlockDialog.py:37
+msgstr "Fertig"
+
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Duration"
-msgstr ""
-
-#: ../canfestival/canfestival.py:118
-#, fuzzy
+msgstr "Zeitangabe"
+
+#: ../canfestival/canfestival.py:174
 msgid "EDS files (*.eds)|*.eds|All files|*.*"
-msgstr "SVG files (*.svg)|*.svg|Alle Dateien|*.*"
-
-#: ../editors/Viewer.py:510
-#, fuzzy
+msgstr "EDS Dateien (*.eds)|*.eds|Alle Dateien|*.*"
+
+#: ../editors/Viewer.py:668
 msgid "Edit Block"
-msgstr "bearbeite Netzwerk"
-
-#: ../dialogs/LDElementDialog.py:41
-#, fuzzy
+msgstr "Funktionsblock bearbeiten"
+
+#: ../dialogs/LDElementDialog.py:58
 msgid "Edit Coil Values"
-msgstr "bearbeite C-Datei"
-
-#: ../dialogs/LDElementDialog.py:38
-#, fuzzy
+msgstr "Spule bearbeiten"
+
+#: ../dialogs/LDElementDialog.py:56
 msgid "Edit Contact Values"
-msgstr "bearbeite C-Datei"
-
-#: ../dialogs/DurationEditorDialog.py:59
+msgstr "Kontaktwerte bearbeiten"
+
+#: ../dialogs/DurationEditorDialog.py:62
 msgid "Edit Duration"
-msgstr ""
-
-#: ../dialogs/SFCStepDialog.py:35
-#, fuzzy
+msgstr "Zeitangabe ändern"
+
+#: ../dialogs/SFCStepDialog.py:53
 msgid "Edit Step"
-msgstr "bearbeite C-Datei"
-
-#: ../wxglade_hmi/wxglade_hmi.py:12
+msgstr "Schritt bearbeiten"
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
 msgid "Edit a WxWidgets GUI with WXGlade"
-msgstr "bearbeite eine wxWidgets GUI mit wxGlade"
-
-#: ../dialogs/ActionBlockDialog.py:122
+msgstr "Eine wxWidgets GUI mit wxGlade bearbeiten"
+
+#: ../dialogs/ActionBlockDialog.py:127
 msgid "Edit action block properties"
-msgstr ""
-
-#: ../dialogs/ArrayTypeDialog.py:45
+msgstr "Aktionsblockeigenschaften bearbeiten"
+
+#: ../dialogs/ArrayTypeDialog.py:47
 msgid "Edit array type properties"
-msgstr ""
-
-#: ../editors/Viewer.py:2112
-#: ../editors/Viewer.py:2114
-#: ../editors/Viewer.py:2630
-#: ../editors/Viewer.py:2632
+msgstr "Array-Typeigenschaften bearbeiten"
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
 msgid "Edit comment"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:284
-#, fuzzy
+msgstr "Kommentar bearbeiten"
+
+#: ../editors/FileManagementPanel.py:69
 msgid "Edit file"
-msgstr "bearbeite C-Datei"
-
-#: ../controls/CustomEditableListBox.py:39
-#, fuzzy
+msgstr "Datei bearbeiten"
+
+#: ../controls/CustomEditableListBox.py:42
 msgid "Edit item"
-msgstr "bearbeite C-Datei"
-
-#: ../editors/Viewer.py:2594
+msgstr "Objekt bearbeiten"
+
+#: ../editors/Viewer.py:3059
 msgid "Edit jump target"
-msgstr ""
-
-#: ../ProjectController.py:1526
+msgstr "Sprungziel bearbeiten"
+
+#: ../ProjectController.py:1873
 msgid "Edit raw IEC code added to code generated by PLCGenerator"
-msgstr "Bearbeite hinzugefügten Roh-IEC Code, der vom PLCGenerator generiert wurde"
-
-#: ../editors/SFCViewer.py:725
+msgstr ""
+"Bearbeite hinzugefügten Roh-IEC Code, der vom PLCGenerator generiert wurde"
+
+#: ../editors/SFCViewer.py:815
 msgid "Edit step name"
-msgstr ""
-
-#: ../dialogs/SFCTransitionDialog.py:38
+msgstr "Schrittname bearbeiten"
+
+#: ../dialogs/SFCTransitionDialog.py:53
 msgid "Edit transition"
-msgstr ""
-
-#: ../IDEFrame.py:580
+msgstr "Transitionsbedingung bearbeiten"
+
+#: ../IDEFrame.py:632
 msgid "Editor ToolBar"
-msgstr ""
-
-#: ../ProjectController.py:1013
+msgstr "Werkzeugleiste bearbeiten"
+
+#: ../ProjectController.py:1294
 msgid "Editor selection"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:341
+msgstr "Editor-Auswahl"
+
+#: ../editors/DataTypeEditor.py:360
 msgid "Elements :"
-msgstr ""
-
-#: ../IDEFrame.py:343
-#, fuzzy
-msgid "Enable Undo/Redo"
-msgstr "Aktiviert"
-
-#: ../Beremiz_service.py:380
+msgstr "Komponente:"
+
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr "Leer"
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr "Leere Dimension ist nicht erlaubt."
+
+#: ../Beremiz_service.py:341
 msgid "Enter a name "
 msgstr "Geben Sie einen Namen ein"
 
-#: ../Beremiz_service.py:365
+#: ../Beremiz_service.py:326
 msgid "Enter a port number "
 msgstr "Geben Sie eine Port-Nummer ein"
 
-#: ../Beremiz_service.py:355
+#: ../Beremiz_service.py:317
 msgid "Enter the IP of the interface to bind"
 msgstr "Geben Sie die IP-Adresse des anzubindenden Interfaces ein"
 
-#: ../editors/DataTypeEditor.py:52
+#: ../editors/DataTypeEditor.py:60
 msgid "Enumerated"
-msgstr ""
+msgstr "Aufzählung"
 
 #: ../plcopen/iec_std.csv:77
 msgid "Equal to"
-msgstr ""
-
-#: ../Beremiz_service.py:270
-#: ../Beremiz_service.py:394
-#: ../controls/VariablePanel.py:330
-#: ../controls/VariablePanel.py:678
-#: ../controls/DebugVariablePanel.py:164
-#: ../IDEFrame.py:1083
-#: ../IDEFrame.py:1672
-#: ../IDEFrame.py:1709
-#: ../IDEFrame.py:1714
-#: ../IDEFrame.py:1728
-#: ../IDEFrame.py:1733
-#: ../IDEFrame.py:2422
-#: ../Beremiz.py:1083
-#: ../PLCOpenEditor.py:358
-#: ../PLCOpenEditor.py:363
-#: ../PLCOpenEditor.py:531
-#: ../PLCOpenEditor.py:541
-#: ../editors/TextViewer.py:376
-#: ../editors/DataTypeEditor.py:543
-#: ../editors/DataTypeEditor.py:548
-#: ../editors/DataTypeEditor.py:572
-#: ../editors/DataTypeEditor.py:577
-#: ../editors/DataTypeEditor.py:587
-#: ../editors/DataTypeEditor.py:719
-#: ../editors/DataTypeEditor.py:726
-#: ../editors/Viewer.py:366
-#: ../editors/LDViewer.py:663
-#: ../editors/LDViewer.py:879
-#: ../editors/LDViewer.py:883
-#: ../editors/FileManagementPanel.py:210
-#: ../ProjectController.py:221
-#: ../dialogs/PouNameDialog.py:53
-#: ../dialogs/PouTransitionDialog.py:107
-#: ../dialogs/BrowseLocationsDialog.py:175
-#: ../dialogs/ProjectDialog.py:71
-#: ../dialogs/SFCStepNameDialog.py:59
-#: ../dialogs/ConnectionDialog.py:152
-#: ../dialogs/FBDVariableDialog.py:201
-#: ../dialogs/PouActionDialog.py:104
-#: ../dialogs/BrowseValuesLibraryDialog.py:83
-#: ../dialogs/PouDialog.py:132
-#: ../dialogs/SFCTransitionDialog.py:147
-#: ../dialogs/DurationEditorDialog.py:121
-#: ../dialogs/DurationEditorDialog.py:163
-#: ../dialogs/SearchInProjectDialog.py:157
-#: ../dialogs/SFCStepDialog.py:130
-#: ../dialogs/ArrayTypeDialog.py:97
-#: ../dialogs/ArrayTypeDialog.py:103
-#: ../dialogs/FBDBlockDialog.py:164
-#: ../dialogs/ForceVariableDialog.py:169
+msgstr "Gleich"
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
 msgid "Error"
 msgstr "Fehler"
 
-#: ../ProjectController.py:587
-msgid "Error : At least one configuration and one resource must be declared in PLC !\n"
-msgstr "Fehler : Mindestens eine Konfiguration und eine Ressource müssen in der SPS deklariert sein!\n"
-
-#: ../ProjectController.py:579
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+"Fehler : Mindestens eine Konfiguration und eine Ressource müssen in der SPS "
+"deklariert sein!\n"
+
+#: ../ProjectController.py:803
 #, python-format
 msgid "Error : IEC to C compiler returned %d\n"
 msgstr "Fehler : IEC nach C Compiler gab folgendes zurück: %d\n"
 
-#: ../ProjectController.py:520
+#: ../ProjectController.py:731
 #, python-format
 msgid ""
 "Error in ST/IL/SFC code generator :\n"
 "%s\n"
 msgstr ""
-"Fehler in ST/IL/SFC Code-Generator :\n"
+"Fehler in ST/AWL/AS Code-Generator :\n"
 "%s\n"
 
-#: ../ConfigTreeNode.py:182
+#: ../ConfigTreeNode.py:219
 #, python-format
 msgid "Error while saving \"%s\"\n"
 msgstr "Fehler während der Speicherung von \"%s\"\n"
 
-#: ../canfestival/canfestival.py:122
+#: ../canfestival/canfestival.py:179
 msgid "Error: Export slave failed\n"
-msgstr ""
-
-#: ../canfestival/canfestival.py:270
+msgstr "Fehler: Slave Export fehlgeschlagen\n"
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:388
 msgid "Error: No Master generated\n"
 msgstr "Fehler: Kein Master angelegt\n"
 
-#: ../canfestival/canfestival.py:265
+#: ../canfestival/canfestival.py:383
 msgid "Error: No PLC built\n"
 msgstr "Fehler: Kein SPS built\n"
 
-#: ../ProjectController.py:1378
+#: ../ProjectController.py:1708
 #, python-format
 msgid "Exception while connecting %s!\n"
 msgstr "Fehler beim verbinden von %s!\n"
 
-#: ../dialogs/FBDBlockDialog.py:95
+#: ../dialogs/FBDBlockDialog.py:123
 msgid "Execution Control:"
-msgstr ""
-
-#: ../dialogs/FBDVariableDialog.py:76
-#: ../dialogs/FBDBlockDialog.py:87
+msgstr "Ausführungssteuerung:"
+
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
 msgid "Execution Order:"
-msgstr ""
-
-#: ../features.py:10
+msgstr "Ausführungsreihenfolge:"
+
+#: ../features.py:36
 msgid "Experimental web based HMI"
-msgstr ""
+msgstr "Experimentelle web-basierte HMI"
 
 #: ../plcopen/iec_std.csv:38
 msgid "Exponent"
-msgstr ""
+msgstr "Exponent"
 
 #: ../plcopen/iec_std.csv:26
 msgid "Exponentiation"
-msgstr ""
-
-#: ../canfestival/canfestival.py:128
+msgstr "Exponentialfunktion des Operanden"
+
+#: ../canfestival/canfestival.py:186
 msgid "Export CanOpen slave to EDS file"
-msgstr ""
-
-#: ../editors/GraphicViewer.py:144
+msgstr "CanOpen-Slave in EDS-Datei exportieren"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
 msgid "Export graph values to clipboard"
-msgstr ""
-
-#: ../canfestival/canfestival.py:127
+msgstr "Graphenwerte in Zwischenablage exportieren"
+
+#: ../canfestival/canfestival.py:185
 msgid "Export slave"
-msgstr ""
-
-#: ../dialogs/FBDVariableDialog.py:69
-#, fuzzy
+msgstr "Slave exportieren"
+
+#: ../dialogs/FBDVariableDialog.py:94
 msgid "Expression:"
-msgstr "CExtension"
-
-#: ../controls/VariablePanel.py:77
+msgstr "Ausdruck:"
+
+#: ../controls/VariablePanel.py:90
 msgid "External"
-msgstr ""
-
-#: ../ProjectController.py:591
+msgstr "External"
+
+#: ../ProjectController.py:826
 msgid "Extracting Located Variables...\n"
 msgstr "Extrahiere gefundene Variablen...\n"
 
-#: ../controls/ProjectPropertiesPanel.py:143
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "FBD"
-msgstr ""
-
-#: ../ProjectController.py:1445
+msgstr "FUP"
+
+#: ../ProjectController.py:1773
 msgid "Failed : Must build before transfer.\n"
 msgstr "Fehler : Sie müssen kompillieren vor dem Transfer.\n"
 
-#: ../editors/Viewer.py:405
-#: ../dialogs/LDElementDialog.py:84
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
 msgid "Falling Edge"
-msgstr ""
-
-#: ../plcopen/structures.py:217
-msgid ""
-"Falling edge detector\n"
-"The output produces a single pulse when a falling edge is detected."
-msgstr ""
-
-#: ../ProjectController.py:900
+msgstr "Fallende Flanke"
+
+#: ../ProjectController.py:1098
 msgid "Fatal : cannot get builder.\n"
 msgstr "schwerer Fehler : Kann den Builder nicht finden.\n"
 
-#: ../dialogs/DurationEditorDialog.py:160
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr "Lade %s"
+
+#: ../dialogs/DurationEditorDialog.py:167
 #, python-format
 msgid "Field %s hasn't a valid value!"
-msgstr ""
-
-#: ../dialogs/DurationEditorDialog.py:162
+msgstr "Das Feld %s enthält keinen gültigen Wert!"
+
+#: ../dialogs/DurationEditorDialog.py:169
 #, python-format
 msgid "Fields %s haven't a valid value!"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:209
-#, fuzzy, python-format
+msgstr "Die Felder %s enthalten keine gültigen Werte!"
+
+#: ../controls/FolderTree.py:221
+#, python-format
 msgid "File '%s' already exists!"
-msgstr "Ein Zweigname \"%s\" existiert bereits -> \"%s\"\n"
-
-#: ../IDEFrame.py:353
-#: ../dialogs/FindInPouDialog.py:30
-#: ../dialogs/FindInPouDialog.py:99
+msgstr "Datei '%s' existiert bereits!"
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
 msgid "Find"
-msgstr ""
-
-#: ../IDEFrame.py:355
+msgstr "Suchen"
+
+#: ../IDEFrame.py:379
 msgid "Find Next"
-msgstr ""
-
-#: ../IDEFrame.py:357
+msgstr "Weiter suchen"
+
+#: ../IDEFrame.py:381
 msgid "Find Previous"
-msgstr ""
+msgstr "Rückwärts suchen"
 
 #: ../plcopen/iec_std.csv:90
 msgid "Find position"
-msgstr ""
-
-#: ../dialogs/FindInPouDialog.py:51
+msgstr "Position suchen"
+
+#: ../dialogs/FindInPouDialog.py:58
 msgid "Find:"
-msgstr ""
-
-#: ../connectors/PYRO/__init__.py:125
-msgid "Force runtime reload\n"
-msgstr "Erzwinge neues laden der Runtime\n"
-
-#: ../controls/DebugVariablePanel.py:295
-#: ../editors/Viewer.py:1353
+msgstr "Suchen:"
+
+#: ../editors/Viewer.py:1633
 msgid "Force value"
-msgstr ""
-
-#: ../dialogs/ForceVariableDialog.py:152
+msgstr "Wert forcen"
+
+#: ../dialogs/ForceVariableDialog.py:176
 msgid "Forcing Variable Value"
-msgstr ""
-
-#: ../dialogs/PouTransitionDialog.py:97
-#: ../dialogs/ProjectDialog.py:70
-#: ../dialogs/PouActionDialog.py:94
-#: ../dialogs/PouDialog.py:114
-#: ../dialogs/SFCTransitionDialog.py:147
+msgstr "Variable forcen"
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
 #, python-format
 msgid "Form isn't complete. %s must be filled!"
-msgstr ""
-
-#: ../dialogs/ConnectionDialog.py:142
-#: ../dialogs/FBDBlockDialog.py:154
+msgstr "Formular unvollständig. %s muss ausgefüllt werden!"
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
 msgid "Form isn't complete. Name must be filled!"
-msgstr ""
-
-#: ../dialogs/SearchInProjectDialog.py:145
-msgid "Form isn't complete. Pattern to search must be filled!"
-msgstr ""
-
-#: ../dialogs/FBDBlockDialog.py:152
+msgstr "Formular unvollständig. Der Name muss ausgefüllt werden!"
+
+#: ../dialogs/FBDBlockDialog.py:235
 msgid "Form isn't complete. Valid block type must be selected!"
-msgstr ""
-
-#: ../dialogs/FindInPouDialog.py:67
+msgstr "Formular unvollständig. Bausteintyp muss ausgewählt werden!"
+
+#: ../dialogs/FindInPouDialog.py:75
 msgid "Forward"
-msgstr ""
-
-#: ../dialogs/SearchInProjectDialog.py:44
-#, fuzzy
+msgstr "Vorwärts"
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
 msgid "Function"
-msgstr "Funktion : "
-
-#: ../IDEFrame.py:329
-#, fuzzy
+msgstr "Funktion"
+
+#: ../IDEFrame.py:354
 msgid "Function &Block"
-msgstr "Funktion : "
-
-#: ../IDEFrame.py:1969
-#: ../dialogs/SearchInProjectDialog.py:45
-#, fuzzy
+msgstr "Funktions&block"
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
 msgid "Function Block"
-msgstr "Funktion : "
-
-#: ../controls/VariablePanel.py:741
+msgstr "Funktionsblock"
+
+#: ../controls/VariablePanel.py:868
 msgid "Function Block Types"
-msgstr ""
-
-#: ../PLCControler.py:94
-#, fuzzy
+msgstr "Funktionsblocktypen"
+
+#: ../plcopen/types_enums.py:75
 msgid "Function Blocks"
-msgstr "Funktion : "
-
-#: ../editors/Viewer.py:236
+msgstr "Funktionsblöcke"
+
+#: ../editors/Viewer.py:290
 msgid "Function Blocks can't be used in Functions!"
-msgstr ""
-
-#: ../editors/Viewer.py:238
-msgid "Function Blocks can't be used in Transitions!"
-msgstr ""
-
-#: ../PLCControler.py:2055
+msgstr "Funktionsblock kann nicht in Funktion verwendet werden!"
+
+#: ../PLCControler.py:1907
 #, python-format
 msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
-msgstr ""
-
-#: ../PLCControler.py:94
-#, fuzzy
+msgstr "Funktionsblock \"%s\" kann nicht in eine Funktion eingefügt werden!!!"
+
+#: ../plcopen/types_enums.py:75
 msgid "Functions"
-msgstr "Funktion : "
-
-#: ../PLCOpenEditor.py:138
+msgstr "Funktionen"
+
+#: ../PLCOpenEditor.py:88
 msgid "Generate Program"
-msgstr ""
-
-#: ../ProjectController.py:510
+msgstr "Programm generieren"
+
+#: ../ProjectController.py:722
 msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
-msgstr "Generiere SoftPLC IEC-61131 ST/IL/SFC Code...\n"
-
-#: ../controls/VariablePanel.py:78
+msgstr "Generiere SoftPLC IEC-61131 ST/AWL/AS Code...\n"
+
+#: ../controls/VariablePanel.py:91
 msgid "Global"
-msgstr ""
-
-#: ../editors/GraphicViewer.py:131
+msgstr "Global"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
 msgid "Go to current value"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:173
+msgstr "Zum aktuellen Wert wechseln"
+
+#: ../controls/ProjectPropertiesPanel.py:189
 msgid "Graphics"
-msgstr ""
+msgstr "Grafiken"
 
 #: ../plcopen/iec_std.csv:75
 msgid "Greater than"
-msgstr ""
+msgstr "Größer als"
 
 #: ../plcopen/iec_std.csv:76
 msgid "Greater than or equal to"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:134
+msgstr "Größer oder gleich"
+
+#: ../controls/ProjectPropertiesPanel.py:149
 msgid "Grid Resolution:"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:120
+msgstr "Gitterauflösung:"
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr "HTTP interface port :"
+
+#: ../controls/ProjectPropertiesPanel.py:135
 msgid "Height:"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:303
+msgstr "Höhe:"
+
+#: ../editors/FileManagementPanel.py:89
 msgid "Home Directory:"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:150
+msgstr "Homeverzeichnis:"
+
+#: ../controls/ProjectPropertiesPanel.py:165
 msgid "Horizontal:"
-msgstr ""
-
-#: ../dialogs/DurationEditorDialog.py:44
+msgstr "Horizontal:"
+
+#: ../dialogs/DurationEditorDialog.py:47
 msgid "Hours:"
-msgstr ""
-
-#: ../plcopen/structures.py:279
-msgid ""
-"Hysteresis\n"
-"The hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2."
-msgstr ""
-
-#: ../ProjectController.py:827
-msgid "IEC-61131-3 code generation failed !\n"
-msgstr "IEC-61131-3 Code Generierung gescheitert !\n"
-
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+msgstr "Stunden:"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
 msgid "IL"
-msgstr ""
-
-#: ../Beremiz_service.py:356
-#: ../Beremiz_service.py:357
+msgstr "AWL"
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr "IP"
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
 msgid "IP is not valid!"
 msgstr "IP ist nicht gültig!"
 
-#: ../svgui/svgui.py:17
-#: ../svgui/svgui.py:18
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
 msgid "Import SVG"
 msgstr "Importiere SVG"
 
-#: ../controls/VariablePanel.py:76
-#: ../dialogs/FBDVariableDialog.py:34
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
 msgid "InOut"
-msgstr ""
-
-#: ../controls/VariablePanel.py:263
-#, python-format
-msgid "Incompatible data types between \"%s\" and \"%s\""
-msgstr ""
-
-#: ../controls/VariablePanel.py:274
-#, python-format
-msgid "Incompatible size of data between \"%s\" and \"%s\""
-msgstr ""
-
-#: ../controls/VariablePanel.py:270
+msgstr "Ein- und Ausgang"
+
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr "Inaktiv"
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr "Inkompatible Datentypen zwischen \"{a1}\" und \"{a2}\""
+
+#: ../controls/VariablePanel.py:306
 #, python-format
 msgid "Incompatible size of data between \"%s\" and \"BOOL\""
-msgstr ""
-
-#: ../dialogs/ActionBlockDialog.py:37
+msgstr "Inkompatible Datengröße zwischen \"%s\" und \"BOOL\""
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr "Inkompatible Datengröße zwischen \"{a1}\" und \"{a2}\""
+
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Indicator"
-msgstr ""
-
-#: ../editors/Viewer.py:492
+msgstr "Indikator"
+
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr "Anfangswert"
+
+#: ../editors/Viewer.py:650
 msgid "Initial Step"
-msgstr ""
-
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
-#: ../editors/DataTypeEditor.py:48
+msgstr "Anfangsschritt"
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
 msgid "Initial Value"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:178
-#: ../editors/DataTypeEditor.py:209
-#: ../editors/DataTypeEditor.py:265
-#: ../editors/DataTypeEditor.py:303
+msgstr "Anfangswert"
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
 msgid "Initial Value:"
-msgstr ""
-
-#: ../svgui/svgui.py:21
+msgstr "Anfangswert:"
+
+#: ../svgui/svgui.py:56
 msgid "Inkscape"
 msgstr "Inkscape"
 
-#: ../dialogs/ActionBlockDialog.py:41
-#: ../dialogs/SFCTransitionDialog.py:66
-#: ../dialogs/SFCTransitionDialog.py:137
-#, fuzzy
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
-msgstr "Zeile :"
-
-#: ../controls/VariablePanel.py:76
-#: ../dialogs/BrowseLocationsDialog.py:36
-#: ../dialogs/FBDVariableDialog.py:33
-#: ../dialogs/SFCStepDialog.py:61
+msgstr "Inline"
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Input"
-msgstr ""
-
-#: ../dialogs/FBDBlockDialog.py:78
+msgstr "Eingang"
+
+#: ../dialogs/FBDBlockDialog.py:99
 msgid "Inputs:"
-msgstr ""
+msgstr "Eingänge:"
 
 #: ../plcopen/iec_std.csv:87
 msgid "Insertion (into)"
-msgstr ""
-
-#: ../plcopen/plcopen.py:1833
+msgstr "Einfügen String in ein anderes String an die entsprechende Position"
+
+#: ../plcopen/plcopen.py:1948
 #, python-format
 msgid "Instance with id %d doesn't exist!"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:247
+msgstr "Eine Instanz mit der ID%d existiert nicht!"
+
+#: ../editors/ResourceEditor.py:279
 msgid "Instances:"
-msgstr ""
-
-#: ../plcopen/structures.py:259
-msgid ""
-"Integral\n"
-"The integral function block integrates the value of input XIN over time."
-msgstr ""
-
-#: ../controls/VariablePanel.py:75
+msgstr "Instanzen:"
+
+#: ../controls/VariablePanel.py:88
 msgid "Interface"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:71
+msgstr "Schnittstelle"
+
+#: ../editors/ResourceEditor.py:81
 msgid "Interrupt"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:67
+msgstr "Ereignisgesteuert"
+
+#: ../editors/ResourceEditor.py:76
 msgid "Interval"
-msgstr ""
-
-#: ../PLCControler.py:2032
-#: ../PLCControler.py:2070
+msgstr "Intervall"
+
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+
+#: ../PLCControler.py:1895
 msgid "Invalid plcopen element(s)!!!"
-msgstr ""
-
-#: ../canfestival/config_utils.py:376
-#: ../canfestival/config_utils.py:637
-#, python-format
-msgid "Invalid type \"%s\"-> %d != %d  for location\"%s\""
-msgstr "Ungültiger Typ \"%s\"-> %d != %d  für Ort\"%s\""
-
-#: ../dialogs/ForceVariableDialog.py:167
-#, python-format
-msgid "Invalid value \"%s\" for \"%s\" variable!"
-msgstr ""
-
-#: ../controls/DebugVariablePanel.py:153
-#: ../controls/DebugVariablePanel.py:156
+msgstr "Ungültige plcopen-Element(en)!!!"
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr "Ungültiger Datentyp \"{a1}\" -> {a2}! = {a3} für die Adresse \"{a4}\""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr "Ungültiger Datentyp \"{a1}\" -> {a2}! = {a3} für die Adresse \"{a4}\""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
 #, python-format
 msgid "Invalid value \"%s\" for debug variable"
-msgstr ""
-
-#: ../controls/VariablePanel.py:244
-#: ../controls/VariablePanel.py:247
+msgstr "Ungültiger Wert \"%s\" für Debug-Variable"
+
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
 #, python-format
 msgid "Invalid value \"%s\" for variable grid element"
-msgstr ""
-
-#: ../editors/Viewer.py:221
-#: ../editors/Viewer.py:224
+msgstr "Ungültiger Wert \"%s\" "
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
 #, python-format
 msgid "Invalid value \"%s\" for viewer block"
-msgstr ""
-
-#: ../dialogs/DurationEditorDialog.py:121
+msgstr "Ungültiger Wert \"%s\""
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr "Ungültiger Wert \"{a1}\" für Variable \"{a2}\"!"
+
+#: ../dialogs/DurationEditorDialog.py:124
 msgid ""
 "Invalid value!\n"
 "You must fill a numeric value."
 msgstr ""
-
-#: ../editors/Viewer.py:497
+"Ungültiger Wert!\n"
+"Bitte geben eine Zahl ein."
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr ""
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
 msgid "Jump"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:143
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+msgstr "Sprung"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "LD"
-msgstr ""
-
-#: ../editors/LDViewer.py:215
-#: ../editors/LDViewer.py:231
+msgstr "KOP"
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
 #, python-format
 msgid "Ladder element with id %d is on more than one rung."
-msgstr ""
-
-#: ../dialogs/PouTransitionDialog.py:86
-#: ../dialogs/PouActionDialog.py:83
-#: ../dialogs/PouDialog.py:102
+msgstr "KOP-Element mit id %d ist auf mehr als einem Netzwerk."
+
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
 msgid "Language"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:186
+msgstr "Sprache"
+
+#: ../controls/ProjectPropertiesPanel.py:206
 msgid "Language (optional):"
-msgstr ""
-
-#: ../dialogs/PouTransitionDialog.py:60
-#: ../dialogs/PouActionDialog.py:56
-#: ../dialogs/PouDialog.py:71
+msgstr "Sprache (optional):"
+
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
 msgid "Language:"
-msgstr ""
-
-#: ../ProjectController.py:1451
+msgstr "Sprache:"
+
+#: ../ProjectController.py:1779
 msgid "Latest build already matches current target. Transfering anyway...\n"
 msgstr "Letzter Build entspricht bereits dem Ziel. Übertrage trotzdem...\n"
 
-#: ../Beremiz_service.py:324
+#: ../Beremiz_service.py:281
 msgid "Launch WX GUI inspector"
 msgstr "Starte WX GUI Inspector"
 
-#: ../Beremiz_service.py:323
+#: ../Beremiz_service.py:280
 msgid "Launch a live Python shell"
 msgstr "Starte eine live-Python shell"
 
-#: ../editors/Viewer.py:428
+#: ../editors/Viewer.py:580
 msgid "Left"
-msgstr ""
-
-#: ../dialogs/LDPowerRailDialog.py:55
+msgstr "Links"
+
+#: ../dialogs/LDPowerRailDialog.py:64
 msgid "Left PowerRail"
-msgstr ""
+msgstr "Linke Stromleitung"
 
 #: ../plcopen/iec_std.csv:81
 msgid "Length of string"
-msgstr ""
+msgstr "Länge der Zeichenkette"
 
 #: ../plcopen/iec_std.csv:78
 msgid "Less than"
-msgstr ""
+msgstr "Kleiner als"
 
 #: ../plcopen/iec_std.csv:79
 msgid "Less than or equal to"
-msgstr ""
-
-#: ../IDEFrame.py:600
+msgstr "Kleiner oder gleich"
+
+#: ../IDEFrame.py:652
 msgid "Library"
-msgstr ""
+msgstr "Bibliotheke"
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr "Lizenz"
 
 #: ../plcopen/iec_std.csv:73
 msgid "Limitation"
-msgstr ""
-
-#: ../targets/toolchain_gcc.py:142
+msgstr "Limitierung"
+
+#: ../targets/toolchain_gcc.py:209
 msgid "Linking :\n"
 msgstr "Linking :\n"
 
-#: ../controls/VariablePanel.py:77
-#: ../dialogs/DiscoveryDialog.py:110
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
 msgid "Local"
 msgstr "Lokal"
 
-#: ../ProjectController.py:1353
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr "Lokale Einträge"
+
+#: ../ProjectController.py:1685
 msgid "Local service discovery failed!\n"
-msgstr ""
-
-#: ../controls/VariablePanel.py:58
-#, fuzzy
+msgstr "Lokale Service discovery fehlgeschlagen!\n"
+
+#: ../controls/VariablePanel.py:62
 msgid "Location"
-msgstr "URI_location"
-
-#: ../dialogs/BrowseLocationsDialog.py:61
-#, fuzzy
+msgstr "IEC-Adresse"
+
+#: ../dialogs/BrowseLocationsDialog.py:79
 msgid "Locations available:"
-msgstr "Service verfügbar:"
-
-#: ../Beremiz.py:393
-msgid "Log Console"
-msgstr "Log Konsole"
+msgstr "Verfügbare IEC-Adressen:"
 
 #: ../plcopen/iec_std.csv:25
 msgid "Logarithm to base 10"
-msgstr ""
-
-#: ../connectors/PYRO/__init__.py:55
+msgstr "Logarithmus zur Basis 10"
+
+#: ../connectors/PYRO/__init__.py:102
 #, python-format
 msgid "MDNS resolution failure for '%s'\n"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:37
-#: ../canfestival/NetworkEditor.py:67
+msgstr "MDNS-Auflösungsfehler für '%s'\n"
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
 msgid "Map Variable"
-msgstr ""
-
-#: ../features.py:6
+msgstr "Map Variable"
+
+#: ../features.py:31
 msgid "Map located variables over CANopen"
-msgstr ""
-
-#: ../canfestival/NetworkEditor.py:89
-#, fuzzy
+msgstr "Variablen über CANopen mappen"
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:113
 msgid "Master"
-msgstr "Zeige Master"
-
-#: ../ConfigTreeNode.py:480
-#, fuzzy, python-format
-msgid "Max count (%d) reached for this confnode of type %s "
-msgstr "Maximale Zahl (%d) erreicht für dieses PlugIn des Typs %s "
+msgstr "Master"
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr "Maximale Anzahl ({a1}) ist erreicht für diesen confnode des Typs {a2}"
 
 #: ../plcopen/iec_std.csv:71
 msgid "Maximum"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:232
+msgstr "Maximum"
+
+#: ../editors/DataTypeEditor.py:246
 msgid "Maximum:"
-msgstr ""
-
-#: ../dialogs/BrowseLocationsDialog.py:38
+msgstr "Maximum:"
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Memory"
-msgstr ""
-
-#: ../IDEFrame.py:568
+msgstr "Speicher"
+
+#: ../IDEFrame.py:617
 msgid "Menu ToolBar"
-msgstr ""
-
-#: ../dialogs/DurationEditorDialog.py:48
+msgstr "Menüleiste"
+
+#: ../dialogs/DurationEditorDialog.py:51
 msgid "Microseconds:"
-msgstr ""
-
-#: ../editors/Viewer.py:433
+msgstr "Mikrosekunden:"
+
+#: ../editors/Viewer.py:585
 msgid "Middle"
-msgstr ""
-
-#: ../dialogs/DurationEditorDialog.py:47
+msgstr "Mitte"
+
+#: ../dialogs/DurationEditorDialog.py:50
 msgid "Milliseconds:"
-msgstr ""
+msgstr "Millisekunden:"
 
 #: ../plcopen/iec_std.csv:72
 msgid "Minimum"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:219
+msgstr "Minimum"
+
+#: ../editors/DataTypeEditor.py:233
 msgid "Minimum:"
-msgstr ""
-
-#: ../dialogs/DurationEditorDialog.py:45
+msgstr "Minimum:"
+
+#: ../dialogs/DurationEditorDialog.py:48
 msgid "Minutes:"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:210
+msgstr "Minuten:"
+
+#: ../controls/ProjectPropertiesPanel.py:231
 msgid "Miscellaneous"
-msgstr ""
-
-#: ../dialogs/LDElementDialog.py:59
+msgstr "Sonstiges"
+
+#: ../features.py:32
+msgid "Modbus support"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:65
 msgid "Modifier:"
-msgstr ""
-
-#: ../PLCGenerator.py:703
-#: ../PLCGenerator.py:936
-#, python-format
-msgid "More than one connector found corresponding to \"%s\" continuation in \"%s\" POU"
-msgstr ""
-
-#: ../dialogs/ActionBlockDialog.py:141
+msgstr "Modifikator:"
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr "Mehr als ein Anschluss gefunden zu Fortsetzung \"{a1}\" im Baustein \"{a2}\""
+
+#: ../dialogs/ActionBlockDialog.py:146
 msgid "Move action down"
-msgstr ""
-
-#: ../dialogs/ActionBlockDialog.py:140
+msgstr "Aktion nach unten schieben"
+
+#: ../dialogs/ActionBlockDialog.py:145
 msgid "Move action up"
-msgstr ""
-
-#: ../controls/DebugVariablePanel.py:185
-msgid "Move debug variable down"
-msgstr ""
-
-#: ../controls/DebugVariablePanel.py:184
-msgid "Move debug variable up"
-msgstr ""
-
-#: ../controls/CustomEditableListBox.py:43
+msgstr "Aktion nach oben schieben"
+
+#: ../controls/CustomEditableListBox.py:46
 msgid "Move down"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:348
+msgstr "Verschieben nach unten"
+
+#: ../editors/DataTypeEditor.py:367
 msgid "Move element down"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:347
+msgstr "Komponent nach unten schieben"
+
+#: ../editors/DataTypeEditor.py:366
 msgid "Move element up"
-msgstr ""
+msgstr "Komponent nach oben schieben"
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr "Insanz nach unten schieben"
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr "Instanz nach oben schieben"
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr "Verschieben Task nach unten"
 
 #: ../editors/ResourceEditor.py:254
-msgid "Move instance down"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:253
-msgid "Move instance up"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:225
-msgid "Move task down"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:224
 msgid "Move task up"
-msgstr ""
-
-#: ../IDEFrame.py:75
-#: ../IDEFrame.py:90
-#: ../IDEFrame.py:120
-#: ../IDEFrame.py:161
+msgstr "Verschieben Task nach oben"
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
 msgid "Move the view"
-msgstr ""
-
-#: ../controls/CustomEditableListBox.py:42
+msgstr "Ansicht verschieben"
+
+#: ../controls/CustomEditableListBox.py:45
 msgid "Move up"
-msgstr ""
-
-#: ../controls/VariablePanel.py:381
+msgstr "Verschieben nach oben"
+
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
 msgid "Move variable down"
-msgstr ""
-
-#: ../controls/VariablePanel.py:380
+msgstr "Verschieben Variable nach unten"
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
 msgid "Move variable up"
-msgstr ""
+msgstr "Verschieben Variable nach oben"
 
 #: ../plcopen/iec_std.csv:74
 msgid "Multiplexer (select 1 of N)"
-msgstr ""
+msgstr "Multiplexer (wähle 1 von N)"
 
 #: ../plcopen/iec_std.csv:34
-#, fuzzy
 msgid "Multiplication"
-msgstr "schließe Applikation"
-
-#: ../editors/FileManagementPanel.py:301
-#, fuzzy
+msgstr "Multiplikation"
+
+#: ../editors/FileManagementPanel.py:87
 msgid "My Computer:"
-msgstr "Compiler"
-
-#: ../controls/VariablePanel.py:58
+msgstr "Mein Rechner:"
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr "NAME"
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
 #: ../controls/VariablePanel.py:59
-#: ../editors/DataTypeEditor.py:48
-#: ../editors/ResourceEditor.py:67
-#: ../editors/ResourceEditor.py:76
 msgid "Name"
 msgstr "Name"
 
-#: ../Beremiz_service.py:381
+#: ../Beremiz_service.py:342
 msgid "Name must not be null!"
 msgstr "Name darf nicht NULL sein!"
 
-#: ../dialogs/ConnectionDialog.py:65
-#: ../dialogs/FBDVariableDialog.py:89
-#: ../dialogs/LDElementDialog.py:88
-#: ../dialogs/SFCStepDialog.py:51
-#: ../dialogs/FBDBlockDialog.py:70
-#, fuzzy
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
 msgid "Name:"
-msgstr "Name"
+msgstr "Name:"
 
 #: ../plcopen/iec_std.csv:24
 msgid "Natural logarithm"
-msgstr ""
-
-#: ../editors/Viewer.py:403
-#: ../dialogs/LDElementDialog.py:67
+msgstr "Natürlicher Logarithmus"
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
 msgid "Negated"
-msgstr ""
-
-#: ../Beremiz.py:307
-#: ../Beremiz.py:342
-#: ../PLCOpenEditor.py:125
-#: ../PLCOpenEditor.py:167
+msgstr "Negiert"
+
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr "Nevow Web-Dienst fehlgeschlagen."
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr "Nevow/Athena-Import gescheitert :"
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
 msgid "New"
-msgstr ""
-
-#: ../controls/CustomEditableListBox.py:40
+msgstr "Neu"
+
+#: ../controls/CustomEditableListBox.py:43
 msgid "New item"
-msgstr ""
-
-#: ../editors/Viewer.py:402
+msgstr "Neuer Eintrag"
+
+#: ../editors/Viewer.py:553
 msgid "No Modifier"
-msgstr ""
-
-#: ../PLCControler.py:2929
-msgid "No PLC project found"
-msgstr ""
-
-#: ../ProjectController.py:1478
+msgstr "Kein Modifikator"
+
+#: ../ProjectController.py:1808
 msgid "No PLC to transfer (did build succeed ?)\n"
 msgstr "Keine SPS zu übertragen (war das Kompillieren erfolgreich ?)\n"
 
-#: ../PLCGenerator.py:1321
+#: ../PLCGenerator.py:1678
 #, python-format
 msgid "No body defined in \"%s\" POU"
-msgstr ""
-
-#: ../PLCGenerator.py:722
-#: ../PLCGenerator.py:945
-#, python-format
-msgid "No connector found corresponding to \"%s\" continuation in \"%s\" POU"
-msgstr ""
-
-#: ../PLCOpenEditor.py:370
+msgstr "Baustein \"%s\" ist leer"
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr "Kein Anschluss gefunden zu Fortsetzung \"{a1}\" im Baustein \"{a2}\""
+
+#: ../PLCOpenEditor.py:331
 msgid ""
 "No documentation available.\n"
 "Coming soon."
 msgstr ""
-
-#: ../PLCGenerator.py:744
+"Keine Dokumentation.\n"
+"Coming soon."
+
+#: ../PLCGenerator.py:841
 #, python-format
 msgid "No informations found for \"%s\" block"
-msgstr ""
-
-#: ../plcopen/structures.py:167
-msgid "No output variable found"
-msgstr ""
-
-#: ../Beremiz_service.py:394
-msgid "No running PLC"
-msgstr "Keine laufende SPS"
-
-#: ../controls/SearchResultPanel.py:169
-#, fuzzy
+msgstr "Keine Informationen für Block \"%s\" sind gefunden"
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+"Keine Ausgabe {a1} Variable gefunden im Block {a2} im Baustein {a3}. "
+"Verbindung muss gebrochen werden"
+
+#: ../controls/SearchResultPanel.py:175
 msgid "No search results available."
-msgstr "Service verfügbar:"
-
-#: ../svgui/svgui.py:98
+msgstr "Keine Suchergebnisse."
+
+#: ../svgui/svgui.py:142
 #, python-format
 msgid "No such SVG file: %s\n"
 msgstr "Kein SVG-File namens: %s\n"
 
-#: ../canfestival/config_utils.py:632
-#, python-format
-msgid "No such index/subindex (%x,%x) (variable %s)"
-msgstr "Kein solcher index/subindex (%x,%x) (variable %s)"
-
-#: ../canfestival/config_utils.py:361
-#, python-format
-msgid "No such index/subindex (%x,%x) in ID : %d (variable %s)"
-msgstr "Kein solcher index/subindex (%x,%x) in ID : %d (variable %s)"
-
-#: ../dialogs/BrowseValuesLibraryDialog.py:83
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr "Kein Index/Subindex ({a1},{a2}) - (Variable {a3})"
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr "Kein Index/Subindex ({a1},{a2}) in ID : {a3} (Variable {a4})"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
 msgid "No valid value selected!"
-msgstr ""
-
-#: ../PLCGenerator.py:1319
+msgstr "Kein gültiger Wert ausgewählt!"
+
+#: ../PLCGenerator.py:1676
 #, python-format
 msgid "No variable defined in \"%s\" POU"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:49
-#: ../canfestival/NetworkEditor.py:79
-msgid "Node infos"
-msgstr ""
-
-#: ../canfestival/config_utils.py:354
-#, python-format
-msgid "Non existing node ID : %d (variable %s)"
-msgstr "Nicht existierende Zweig-ID : %d (variable %s)"
-
-#: ../controls/VariablePanel.py:69
+msgstr "Keine Variable ist im Baustein \"%s\" definiert."
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr "Nicht existierende Node ID : {a1} (Variable {a2})"
+
+#: ../controls/VariablePanel.py:79
 msgid "Non-Retain"
-msgstr ""
-
-#: ../dialogs/LDElementDialog.py:62
+msgstr "Non-Retain"
+
+#: ../dialogs/LDElementDialog.py:78
 msgid "Normal"
-msgstr ""
-
-#: ../canfestival/config_utils.py:383
-#, python-format
-msgid "Not PDO mappable variable : '%s' (ID:%d,Idx:%x,sIdx:%x))"
-msgstr "Keine PDO Mappbare Variable : '%s' (ID:%d,Idx:%x,sIdx:%x))"
+msgstr "Normal"
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+"Variable '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4})) unterstützt PDO-Mapping nicht"
 
 #: ../plcopen/iec_std.csv:80
 msgid "Not equal to"
-msgstr ""
-
-#: ../dialogs/SFCDivergenceDialog.py:80
+msgstr "Ungleich"
+
+#: ../dialogs/SFCDivergenceDialog.py:91
 msgid "Number of sequences:"
-msgstr ""
+msgstr "Anzahl der Verzweigungen:"
 
 #: ../plcopen/iec_std.csv:22
 msgid "Numerical"
-msgstr ""
-
-#: ../plcopen/structures.py:247
-msgid ""
-"Off-delay timer\n"
-"The off-delay timer can be used to delay setting an output false, for fixed period after input goes false."
-msgstr ""
-
-#: ../plcopen/structures.py:242
-msgid ""
-"On-delay timer\n"
-"The on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true."
-msgstr ""
-
-#: ../dialogs/SearchInProjectDialog.py:93
+msgstr "Numerisch"
+
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr "Bei Änderung"
+
+#: ../dialogs/SearchInProjectDialog.py:88
 msgid "Only Elements"
-msgstr ""
-
-#: ../Beremiz.py:309
-#: ../Beremiz.py:343
-#: ../PLCOpenEditor.py:127
-#: ../PLCOpenEditor.py:168
+msgstr "Nur Elemente"
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
 msgid "Open"
-msgstr ""
-
-#: ../svgui/svgui.py:107
+msgstr "Öffnen"
+
+#: ../svgui/svgui.py:151
 msgid "Open Inkscape"
 msgstr "öffne Inkscape"
 
-#: ../ProjectController.py:1530
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+"Open-Source-Framework für die Automatisierung, implementiert IEC-61131 "
+"Entwicklungsumgebung mit ständig wachsender Reihe von Erweiterungen und "
+"flexibler SPS-Runtime."
+
+#: ../ProjectController.py:1879
 msgid "Open a file explorer to manage project files"
-msgstr ""
-
-#: ../wxglade_hmi/wxglade_hmi.py:109
+msgstr "Datei-Browser zum Verwalten der Projektdateien öffnen"
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
 msgid "Open wxGlade"
-msgstr "öffne wxGlade"
-
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
+msgstr "WxGlade öffnen"
+
+#: ../controls/VariablePanel.py:64
 msgid "Option"
-msgstr ""
-
-#: ../dialogs/FindInPouDialog.py:76
+msgstr "Option"
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
 msgid "Options"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:97
+msgstr "Optionen"
+
+#: ../controls/ProjectPropertiesPanel.py:109
 msgid "Organization (optional):"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:47
-#: ../canfestival/NetworkEditor.py:77
+msgstr "Organisation (optional):"
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
 msgid "Other Profile"
-msgstr ""
-
-#: ../controls/VariablePanel.py:76
-#: ../dialogs/BrowseLocationsDialog.py:37
-#: ../dialogs/FBDVariableDialog.py:35
-#: ../dialogs/SFCStepDialog.py:65
+msgstr "Anderes Profil"
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Output"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:36
-#: ../canfestival/NetworkEditor.py:66
+msgstr "Ausgang"
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
 msgid "PDO Receive"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:35
-#: ../canfestival/NetworkEditor.py:65
+msgstr "PDO Empfangen"
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
 msgid "PDO Transmit"
-msgstr ""
-
-#: ../plcopen/structures.py:269
-msgid ""
-"PID\n"
-"The PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control."
-msgstr ""
-
-#: ../targets/toolchain_gcc.py:107
+msgstr "PDO Senden"
+
+#: ../targets/toolchain_gcc.py:174
 msgid "PLC :\n"
 msgstr "SPS :\n"
 
-#: ../ProjectController.py:1096
-#: ../ProjectController.py:1398
-#, python-format
-msgid "PLC is %s\n"
-msgstr "SPS ist %s\n"
-
-#: ../PLCOpenEditor.py:313
-#: ../PLCOpenEditor.py:391
-#, fuzzy
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr "SPS-Protokoll"
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr "SPS-Code-Erzeugung fehlgeschlagen !\n"
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr "SPS ist leer oder bereits gestartet."
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr "SPS ist nicht gestartet."
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+"SPS-Syntaxfehler in Zeile {a1}:\n"
+"{a2}"
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
 msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
-msgstr "SVG files (*.svg)|*.svg|Alle Dateien|*.*"
-
-#: ../PLCOpenEditor.py:175
-#: ../PLCOpenEditor.py:231
-#, fuzzy
+msgstr "PLCOpen Dateien (*.xml)|*.xml|Alle Dateien|*.*"
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
 msgid "PLCOpenEditor"
-msgstr "Öffne CFileEditor"
-
-#: ../dialogs/PouDialog.py:98
-#, fuzzy
+msgstr "PLCOpenEditor"
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+"PLCOpenEditor ist entwickelt als Teil des Projekts Beremiz.\n"
+"\n"
+"Beremiz ist "
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr "PORT"
+
+#: ../dialogs/PouDialog.py:109
 msgid "POU Name"
-msgstr "Name"
-
-#: ../dialogs/PouDialog.py:56
-#, fuzzy
+msgstr "Bausteinname"
+
+#: ../dialogs/PouDialog.py:66
 msgid "POU Name:"
-msgstr "Name"
-
-#: ../dialogs/PouDialog.py:100
+msgstr "Bausteinname:"
+
+#: ../dialogs/PouDialog.py:111
 msgid "POU Type"
-msgstr ""
-
-#: ../dialogs/PouDialog.py:63
+msgstr "Bausteintyp"
+
+#: ../dialogs/PouDialog.py:73
 msgid "POU Type:"
-msgstr ""
-
-#: ../Beremiz.py:322
-#: ../PLCOpenEditor.py:141
+msgstr "Bausteintyp:"
+
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr "PYRO Verbindung zu URI : %s\n"
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr "PYRO mit Zertifikaten aus '%s'\n"
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
 msgid "Page Setup"
 msgstr "Seitenformat"
 
-#: ../controls/ProjectPropertiesPanel.py:110
+#: ../controls/ProjectPropertiesPanel.py:124
 msgid "Page Size (optional):"
-msgstr ""
-
-#: ../PLCOpenEditor.py:476
+msgstr "Seitengröße (optional):"
+
+#: ../IDEFrame.py:2640
 #, python-format
 msgid "Page: %d"
-msgstr ""
-
-#: ../controls/PouInstanceVariablesPanel.py:41
-#, fuzzy
+msgstr "Seite: %d"
+
+#: ../controls/PouInstanceVariablesPanel.py:134
 msgid "Parent instance"
-msgstr "CanFestivalInstanz"
-
-#: ../IDEFrame.py:350
-#: ../IDEFrame.py:402
-#: ../editors/Viewer.py:537
+msgstr "Elterninstanz"
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
 msgid "Paste"
-msgstr ""
-
-#: ../IDEFrame.py:1900
+msgstr "Einfügen"
+
+#: ../IDEFrame.py:1899
 msgid "Paste POU"
-msgstr ""
-
-#: ../dialogs/SearchInProjectDialog.py:64
+msgstr "Baustein einfügen"
+
+#: ../dialogs/SearchInProjectDialog.py:60
 msgid "Pattern to search:"
-msgstr ""
-
-#: ../dialogs/LDPowerRailDialog.py:64
+msgstr "Zu suchendes Muster:"
+
+#: ../dialogs/LDPowerRailDialog.py:75
 msgid "Pin number:"
-msgstr ""
-
-#: ../editors/Viewer.py:2289
-#: ../editors/Viewer.py:2594
-#: ../editors/SFCViewer.py:696
+msgstr "Anschlussnummer:"
+
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
 msgid "Please choose a target"
-msgstr ""
-
-#: ../editors/Viewer.py:2112
-#: ../editors/Viewer.py:2114
-#: ../editors/Viewer.py:2630
-#: ../editors/Viewer.py:2632
+msgstr "Bitte wählen Sie ein Ziel"
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr "Bitte geben Sie einen Blocknamen ein"
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
 msgid "Please enter comment text"
-msgstr ""
-
-#: ../editors/SFCViewer.py:359
-#: ../editors/SFCViewer.py:381
-#: ../editors/SFCViewer.py:725
-#, fuzzy
+msgstr "Bitte geben Sie einen Kommentartext ein"
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
 msgid "Please enter step name"
-msgstr "Bitte geben sie einen Namen für das PlugIn ein:"
-
-#: ../dialogs/ForceVariableDialog.py:153
-#, fuzzy, python-format
+msgstr "Bitte geben Sie einen Schrittnamen ein"
+
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr "Bitte geben Sie Text ein"
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
 msgid "Please enter value for a \"%s\" variable:"
-msgstr "Bitte geben sie einen Namen für das PlugIn ein:"
-
-#: ../Beremiz_service.py:366
+msgstr "Bitte geben Sie einen Wert für die Variable \"%s\" ein:"
+
+#: ../Beremiz_service.py:327
 msgid "Port number must be 0 <= port <= 65535!"
 msgstr "Port Nummer darf folgenden Wertbereich haben: 0 <= port <= 65535!"
 
-#: ../Beremiz_service.py:366
+#: ../Beremiz_service.py:327
 msgid "Port number must be an integer!"
 msgstr "Port Nummer muß eine natürliche Zahl sein (Integer)!"
 
-#: ../editors/GraphicViewer.py:105
-msgid "Position:"
-msgstr ""
-
-#: ../editors/Viewer.py:476
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
 msgid "Power Rail"
-msgstr ""
-
-#: ../dialogs/LDPowerRailDialog.py:36
-#, fuzzy
+msgstr "Stromleitung"
+
+#: ../dialogs/LDPowerRailDialog.py:52
 msgid "Power Rail Properties"
-msgstr "Eigenschaften"
-
-#: ../Beremiz.py:324
-#: ../PLCOpenEditor.py:143
+msgstr "Stromleitungeigenschaften"
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
 msgid "Preview"
 msgstr "Vorschau"
 
-#: ../dialogs/SFCDivergenceDialog.py:93
-#: ../dialogs/LDPowerRailDialog.py:78
-#: ../dialogs/ConnectionDialog.py:78
-#: ../dialogs/FBDVariableDialog.py:97
-#: ../dialogs/SFCTransitionDialog.py:96
-#: ../dialogs/LDElementDialog.py:101
-#: ../dialogs/SFCStepDialog.py:79
-#: ../dialogs/FBDBlockDialog.py:103
-#, fuzzy
+#: ../dialogs/BlockPreviewDialog.py:59
 msgid "Preview:"
-msgstr "Vorschau"
-
-#: ../Beremiz.py:326
-#: ../Beremiz.py:346
-#: ../PLCOpenEditor.py:145
-#: ../PLCOpenEditor.py:171
+msgstr "Vorschau:"
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
 msgid "Print"
 msgstr "Drucken"
 
-#: ../IDEFrame.py:1155
-#, fuzzy
+#: ../IDEFrame.py:1110
 msgid "Print preview"
-msgstr "Vorschau"
-
-#: ../editors/ResourceEditor.py:67
+msgstr "Druckvorschau"
+
+#: ../editors/ResourceEditor.py:76
 msgid "Priority"
-msgstr ""
-
-#: ../dialogs/SFCTransitionDialog.py:83
+msgstr "Priorität"
+
+#: ../dialogs/SFCTransitionDialog.py:91
 msgid "Priority:"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:80
+msgstr "Priorität:"
+
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr "Problem mit SPS-Start : Fehler %d"
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr "Produktname"
+
+#: ../controls/ProjectPropertiesPanel.py:90
 msgid "Product Name (required):"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:82
+msgstr "Produktname (erforderlich):"
+
+#: ../controls/ProjectPropertiesPanel.py:92
 msgid "Product Release (optional):"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:81
+msgstr "Produkt-Release (optional):"
+
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr "Produktversion"
+
+#: ../controls/ProjectPropertiesPanel.py:91
 msgid "Product Version (required):"
-msgstr ""
-
-#: ../IDEFrame.py:1972
-#: ../dialogs/SearchInProjectDialog.py:46
+msgstr "Produktversion (erforderlich):"
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
 msgid "Program"
-msgstr ""
-
-#: ../PLCOpenEditor.py:360
+msgstr "Programm"
+
+#: ../PLCOpenEditor.py:321
 msgid "Program was successfully generated!"
-msgstr ""
-
-#: ../PLCControler.py:95
+msgstr "Programm wurde erfolgreich generiert!"
+
+#: ../plcopen/types_enums.py:76
 msgid "Programs"
-msgstr ""
-
-#: ../editors/Viewer.py:230
+msgstr "Programme"
+
+#: ../editors/Viewer.py:285
 msgid "Programs can't be used by other POUs!"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:84
-#: ../IDEFrame.py:553
-#, fuzzy
+msgstr "Programme können nicht von anderen Bausteinen verwendet werden!"
+
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
 msgid "Project"
-msgstr "Projekt schließen"
-
-#: ../controls/SearchResultPanel.py:173
+msgstr "Projekt"
+
+#: ../controls/SearchResultPanel.py:180
 #, python-format
 msgid "Project '%s':"
-msgstr ""
-
-#: ../ProjectController.py:1529
+msgstr "Projekt '%s':"
+
+#: ../ProjectController.py:1878
 msgid "Project Files"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:78
-#, fuzzy
+msgstr "Projektdateien"
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr "Projektname"
+
+#: ../controls/ProjectPropertiesPanel.py:88
 msgid "Project Name (required):"
-msgstr "Projekt nicht angelegt"
-
-#: ../controls/ProjectPropertiesPanel.py:79
+msgstr "Projektname (erforderlich):"
+
+#: ../controls/ProjectPropertiesPanel.py:89
 msgid "Project Version (optional):"
-msgstr ""
-
-#: ../PLCControler.py:2916
+msgstr "Projektversion (optional):"
+
+#: ../PLCControler.py:2717
 msgid ""
 "Project file syntax error:\n"
 "\n"
 msgstr ""
-
-#: ../dialogs/ProjectDialog.py:32
-#, fuzzy
+"Syntax-Fehler in Projektdatei:\n"
+"\n"
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
 msgid "Project properties"
-msgstr "Eigenschaften"
-
-#: ../ConfigTreeNode.py:506
-#, fuzzy, python-format
-msgid "Project tree layout do not match confnode.xml %s!=%s "
-msgstr "Projektbaum Layout entspricht nicht plugin.xml %s!=%s "
-
-#: ../PLCControler.py:96
+msgstr "Projekteigenschaften"
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr "Projektbaum stimmt nicht mit confnode.xml {a1}! ={a2} überein"
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr "Andere Anschlüße umbenennen"
+
+#: ../plcopen/types_enums.py:77
 msgid "Properties"
 msgstr "Eigenschaften"
 
-#: ../plcopen/structures.py:237
-msgid ""
-"Pulse timer\n"
-"The pulse timer can be used to generate output pulses of a given time duration."
-msgstr ""
-
-#: ../features.py:8
-#, fuzzy
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr "Service im lokalen Netzwerk veröffentlichen"
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr "Pyroausnahme: %s\n"
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr "Pyro port :"
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr "Python code"
+
+#: ../features.py:34
 msgid "Python file"
-msgstr "PythonEditor"
-
-#: ../dialogs/ActionBlockDialog.py:37
+msgstr "Python Datei"
+
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Qualifier"
-msgstr ""
-
-#: ../Beremiz_service.py:328
-#: ../Beremiz.py:329
-#: ../PLCOpenEditor.py:151
+msgstr "Qualifier"
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
 msgid "Quit"
 msgstr "Beenden"
 
-#: ../plcopen/structures.py:202
-msgid ""
-"RS bistable\n"
-"The RS bistable is a latch where the Reset dominates."
-msgstr ""
-
-#: ../plcopen/structures.py:274
-msgid ""
-"Ramp\n"
-"The RAMP function block is modelled on example given in the standard."
-msgstr ""
-
-#: ../editors/GraphicViewer.py:89
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
 msgid "Range:"
-msgstr ""
-
-#: ../ProjectController.py:1525
+msgstr "Bereich:"
+
+#: ../ProjectController.py:1872
 msgid "Raw IEC code"
 msgstr "Raw IEC code"
 
-#: ../plcopen/structures.py:254
-msgid ""
-"Real time clock\n"
-"The real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on."
-msgstr ""
-
-#: ../Beremiz.py:1039
-#, fuzzy, python-format
+#: ../BeremizIDE.py:1083
+#, python-format
 msgid "Really delete node '%s'?"
-msgstr "Plugin wirklich löschen ?"
-
-#: ../IDEFrame.py:340
-#: ../IDEFrame.py:398
+msgstr "Knoten '%s' wirklich löschen?"
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
 msgid "Redo"
-msgstr ""
-
-#: ../dialogs/SFCTransitionDialog.py:57
-#: ../dialogs/SFCTransitionDialog.py:135
+msgstr "Wiederherstellen"
+
+#: ../dialogs/SFCTransitionDialog.py:76
 msgid "Reference"
-msgstr ""
-
-#: ../IDEFrame.py:408
-#: ../dialogs/DiscoveryDialog.py:105
+msgstr "Referenz"
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
 msgid "Refresh"
 msgstr "Refresh"
 
-#: ../dialogs/SearchInProjectDialog.py:73
+#: ../dialogs/SearchInProjectDialog.py:70
 msgid "Regular expression"
-msgstr ""
-
-#: ../dialogs/FindInPouDialog.py:91
+msgstr "Regulärer Ausdruck"
+
+#: ../dialogs/FindInPouDialog.py:99
 msgid "Regular expressions"
-msgstr ""
-
-#: ../controls/DebugVariablePanel.py:299
-#: ../editors/Viewer.py:1356
+msgstr "Reguläre Ausdrücke"
+
+#: ../editors/Viewer.py:1636
 msgid "Release value"
-msgstr ""
+msgstr "Forcen aufheben"
 
 #: ../plcopen/iec_std.csv:37
 msgid "Remainder (modulo)"
-msgstr ""
-
-#: ../Beremiz.py:1040
+msgstr "Rest (modulo)"
+
+#: ../BeremizIDE.py:1084
 #, python-format
 msgid "Remove %s node"
-msgstr ""
-
-#: ../dialogs/ActionBlockDialog.py:139
-#, fuzzy
+msgstr "Knoten %s löschen"
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr "Datentyp löschen"
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr "Baustein löschen"
+
+#: ../dialogs/ActionBlockDialog.py:144
 msgid "Remove action"
-msgstr "Entferne Plugin"
-
-#: ../controls/DebugVariablePanel.py:183
-msgid "Remove debug variable"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:346
-#, fuzzy
+msgstr "Aktion löschen"
+
+#: ../editors/DataTypeEditor.py:365
 msgid "Remove element"
-msgstr "Entferne Plugin"
-
-#: ../editors/FileManagementPanel.py:281
+msgstr "Komponent löschen"
+
+#: ../editors/FileManagementPanel.py:66
 msgid "Remove file from left folder"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:252
-#, fuzzy
+msgstr "Entfernen Datei aus dem linken Ordner"
+
+#: ../editors/ResourceEditor.py:284
 msgid "Remove instance"
-msgstr "Entferne Plugin"
-
-#: ../canfestival/NetworkEditor.py:87
-#, fuzzy
+msgstr "Instanz löschen"
+
+#: ../canfestival/NetworkEditor.py:111
 msgid "Remove slave"
-msgstr "Entferne Plugin"
-
-#: ../editors/ResourceEditor.py:223
+msgstr "Slave löschen"
+
+#: ../editors/ResourceEditor.py:253
 msgid "Remove task"
-msgstr ""
-
-#: ../controls/VariablePanel.py:379
-#, fuzzy
+msgstr "Task löschen"
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
 msgid "Remove variable"
-msgstr "Service verfügbar:"
-
-#: ../IDEFrame.py:1976
+msgstr "Variable löschen"
+
+#: ../IDEFrame.py:1979
 msgid "Rename"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:399
+msgstr "Umbenennen"
+
+#: ../editors/FileManagementPanel.py:187
 msgid "Replace File"
-msgstr ""
+msgstr "Datei ersetzen"
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr "Kabel durch Verbindungen ersetzen"
 
 #: ../plcopen/iec_std.csv:89
 msgid "Replacement (within)"
-msgstr ""
-
-#: ../dialogs/LDElementDialog.py:76
+msgstr "Ersetzung (innerhalb)"
+
+#: ../dialogs/LDElementDialog.py:79
 msgid "Reset"
-msgstr ""
-
-#: ../editors/Viewer.py:521
+msgstr "Reset"
+
+#: ../editors/Viewer.py:681
 msgid "Reset Execution Order"
-msgstr ""
-
-#: ../IDEFrame.py:423
+msgstr "Ausführungsreihenfolge zurücksetzen"
+
+#: ../IDEFrame.py:453
 msgid "Reset Perspective"
-msgstr ""
-
-#: ../controls/SearchResultPanel.py:105
+msgstr "Perspektive zurücksetzen"
+
+#: ../controls/SearchResultPanel.py:103
 msgid "Reset search result"
-msgstr ""
-
-#: ../editors/GraphicViewer.py:137
-msgid "Reset zoom and offset"
-msgstr ""
-
-#: ../PLCControler.py:96
+msgstr "Suchergebniss säubern"
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
 msgid "Resources"
-msgstr ""
-
-#: ../controls/VariablePanel.py:67
+msgstr "Ressourcen"
+
+#: ../controls/VariablePanel.py:77
 msgid "Retain"
-msgstr ""
-
-#: ../controls/VariablePanel.py:352
+msgstr "Retain"
+
+#: ../controls/VariablePanel.py:455
 msgid "Return Type:"
-msgstr ""
-
-#: ../editors/Viewer.py:430
+msgstr "Rückgabetyp:"
+
+#: ../editors/Viewer.py:582
 msgid "Right"
-msgstr ""
-
-#: ../dialogs/LDPowerRailDialog.py:60
+msgstr "Rechts"
+
+#: ../dialogs/LDPowerRailDialog.py:65
 msgid "Right PowerRail"
-msgstr ""
-
-#: ../editors/Viewer.py:404
-#: ../dialogs/LDElementDialog.py:80
+msgstr "Rechte Stromleitung"
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
 msgid "Rising Edge"
-msgstr ""
-
-#: ../plcopen/structures.py:212
-msgid ""
-"Rising edge detector\n"
-"The output produces a single pulse when a rising edge is detected."
-msgstr ""
+msgstr "Steigende Flanke"
 
 #: ../plcopen/iec_std.csv:65
 msgid "Rotate left"
-msgstr ""
+msgstr "Bitweise Linksrotation"
 
 #: ../plcopen/iec_std.csv:64
 msgid "Rotate right"
-msgstr ""
+msgstr "Bitweise Rechtsrotation eines Operanden"
 
 #: ../plcopen/iec_std.csv:17
 msgid "Rounding up/down"
-msgstr ""
-
-#: ../ProjectController.py:1493
+msgstr "Auf-/Abrunden"
+
+#: ../ProjectController.py:1828
 msgid "Run"
 msgstr "Starte"
 
-#: ../ProjectController.py:841
-#: ../ProjectController.py:850
-#, fuzzy
-msgid "Runtime extensions C code generation failed !\n"
-msgstr "PlugIns Codeerstellung fehlgeschlagen !\n"
-
-#: ../canfestival/SlaveEditor.py:34
-#: ../canfestival/NetworkEditor.py:64
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr "C-Code-Erzeugung für Runtime IO-Erweiterungen fehlgeschlagen !\n"
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr "C-Code-Erzeugung für Runtime Bibliothek fehlgeschlagen !\n"
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
 msgid "SDO Client"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:33
-#: ../canfestival/NetworkEditor.py:63
+msgstr "SDO Client"
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
 msgid "SDO Server"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:143
-#: ../dialogs/PouDialog.py:36
+msgstr "SDO Server"
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "SFC"
-msgstr ""
-
-#: ../plcopen/structures.py:197
-msgid ""
-"SR bistable\n"
-"The SR bistable is a latch where the Set dominates."
-msgstr ""
-
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+msgstr "AS"
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr ""
+"AS-Sprung in der Baustein \"{a1}\" bezieht sich auf nicht vorhandene AS-"
+"Schritt \"{a2}\""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr "AS Transition im Baustein \"%s\" muss angeschlossen sein."
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
 msgid "ST"
-msgstr ""
-
-#: ../PLCOpenEditor.py:347
-#, fuzzy
+msgstr "ST"
+
+#: ../PLCOpenEditor.py:308
 msgid "ST files (*.st)|*.st|All files|*.*"
-msgstr "SVG files (*.svg)|*.svg|Alle Dateien|*.*"
-
-#: ../svgui/svgui.py:92
+msgstr "ST Dateien (*.st)|*.st|Alle Dateien|*.*"
+
+#: ../svgui/svgui.py:136
 msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "SVG files (*.svg)|*.svg|Alle Dateien|*.*"
-
-#: ../features.py:10
+msgstr "SVG Dateien (*.svg)|*.svg|Alle Dateien|*.*"
+
+#: ../features.py:36
 msgid "SVGUI"
-msgstr ""
-
-#: ../Beremiz.py:313
-#: ../Beremiz.py:344
-#: ../PLCOpenEditor.py:134
-#: ../PLCOpenEditor.py:169
+msgstr "SVGUI"
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
 msgid "Save"
-msgstr ""
-
-#: ../Beremiz.py:345
-#: ../PLCOpenEditor.py:136
-#: ../PLCOpenEditor.py:170
+msgstr "Speichern"
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
 msgid "Save As..."
-msgstr ""
-
-#: ../Beremiz.py:315
+msgstr "Speichern unter..."
+
+#: ../BeremizIDE.py:249
 msgid "Save as"
-msgstr ""
-
-#: ../dialogs/SearchInProjectDialog.py:76
+msgstr "Speichern unter"
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr "Speicherpfad ist der gleiche, wie der Pfad von dem Projekt!\n"
+
+#: ../dialogs/SearchInProjectDialog.py:73
 msgid "Scope"
-msgstr ""
-
-#: ../IDEFrame.py:592
-#: ../dialogs/SearchInProjectDialog.py:105
+msgstr "Geltungsbereich"
+
+#: ../IDEFrame.py:644
 msgid "Search"
-msgstr ""
-
-#: ../IDEFrame.py:360
-#: ../IDEFrame.py:404
-#: ../dialogs/SearchInProjectDialog.py:52
-#, fuzzy
+msgstr "Suchen"
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
 msgid "Search in Project"
-msgstr "Projekt schließen"
-
-#: ../dialogs/DurationEditorDialog.py:46
+msgstr "Im Projekt suchen "
+
+#: ../dialogs/DurationEditorDialog.py:49
 msgid "Seconds:"
-msgstr ""
-
-#: ../IDEFrame.py:366
+msgstr "Sekunden:"
+
+#: ../IDEFrame.py:390
 msgid "Select All"
-msgstr ""
-
-#: ../controls/VariablePanel.py:277
-#: ../editors/TextViewer.py:330
-#: ../editors/Viewer.py:277
-#, fuzzy
+msgstr "Alles auswählen"
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
 msgid "Select a variable class:"
-msgstr "Service verfügbar:"
-
-#: ../ProjectController.py:1013
+msgstr "Wählen Sie eine Variablenklasse:"
+
+#: ../ProjectController.py:1293
 msgid "Select an editor:"
-msgstr ""
-
-#: ../controls/PouInstanceVariablesPanel.py:197
+msgstr "Wählen Sie einen Editor:"
+
+#: ../controls/PouInstanceVariablesPanel.py:292
 msgid "Select an instance"
-msgstr ""
-
-#: ../IDEFrame.py:576
+msgstr "Wählen Sie eine Instanz"
+
+#: ../IDEFrame.py:628
 msgid "Select an object"
-msgstr ""
+msgstr "Wählen Sie ein Objekt"
+
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr ""
+"Das ausgewählte Verzeichnis enthält bereits ein Projekt. Überschreiben?\n"
 
 #: ../plcopen/iec_std.csv:70
 msgid "Selection"
-msgstr ""
-
-#: ../dialogs/SFCDivergenceDialog.py:62
+msgstr "Auswahl"
+
+#: ../dialogs/SFCDivergenceDialog.py:66
 msgid "Selection Convergence"
-msgstr ""
-
-#: ../dialogs/SFCDivergenceDialog.py:55
+msgstr "Alternativeende"
+
+#: ../dialogs/SFCDivergenceDialog.py:65
 msgid "Selection Divergence"
-msgstr ""
-
-#: ../plcopen/structures.py:207
-msgid ""
-"Semaphore\n"
-"The semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources."
-msgstr ""
-
-#: ../dialogs/DiscoveryDialog.py:84
+msgstr "Alternativanfang"
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr "Service Discovery"
+
+#: ../dialogs/DiscoveryDialog.py:104
 msgid "Services available:"
 msgstr "Service verfügbar:"
 
-#: ../dialogs/LDElementDialog.py:72
+#: ../dialogs/LDElementDialog.py:79
 msgid "Set"
-msgstr ""
+msgstr "Menge"
 
 #: ../plcopen/iec_std.csv:62
 msgid "Shift left"
-msgstr ""
+msgstr "Bitweises Links-Shift"
 
 #: ../plcopen/iec_std.csv:63
 msgid "Shift right"
-msgstr ""
-
-#: ../ProjectController.py:1519
+msgstr "Bitweises Rechts-Shift eines Operanden"
+
+#: ../ProjectController.py:1863
 msgid "Show IEC code generated by PLCGenerator"
 msgstr "Zeige IEC Code, der vom PLCGenerator erzeugt wurde"
 
-#: ../canfestival/canfestival.py:288
+#: ../canfestival/canfestival.py:407
 msgid "Show Master"
 msgstr "Zeige Master"
 
-#: ../canfestival/canfestival.py:289
+#: ../canfestival/canfestival.py:408
 msgid "Show Master generated by config_utils"
 msgstr "Zeige Master, der von den config_utils generiert wurde."
 
-#: ../ProjectController.py:1517
+#: ../ProjectController.py:1862
 msgid "Show code"
 msgstr "Zeige Code"
 
-#: ../dialogs/SFCDivergenceDialog.py:74
+#: ../dialogs/SFCDivergenceDialog.py:68
 msgid "Simultaneous Convergence"
-msgstr ""
-
-#: ../dialogs/SFCDivergenceDialog.py:68
+msgstr "Parallelende"
+
+#: ../dialogs/SFCDivergenceDialog.py:67
 msgid "Simultaneous Divergence"
-msgstr ""
+msgstr "Parallelanfang"
 
 #: ../plcopen/iec_std.csv:27
 msgid "Sine"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:67
+msgstr "Sinus"
+
+#: ../editors/ResourceEditor.py:76
 msgid "Single"
-msgstr ""
+msgstr "Ereignis"
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr "Quellecode hat sich nicht verändert, Build ist nicht nötig.\n"
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+"Ereignis für die ereignisgesteuerte Task '{a1}' in der Ressource '{a2}. "
+"{a3}' muss definiert werden."
 
 #: ../plcopen/iec_std.csv:23
 msgid "Square root (base 2)"
-msgstr ""
-
-#: ../plcopen/structures.py:193
+msgstr "Quadratwurzel (Basis 2)"
+
+#: ../plcopen/definitions.py:50
 msgid "Standard function blocks"
-msgstr ""
-
-#: ../Beremiz_service.py:319
-#: ../ProjectController.py:1495
+msgstr "Standardfunktionsblock"
+
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
 msgid "Start PLC"
 msgstr "Starte SPS"
 
-#: ../ProjectController.py:819
+#: ../ProjectController.py:1074
 #, python-format
 msgid "Start build in %s\n"
 msgstr "Zeige build in %s\n"
 
-#: ../ProjectController.py:1314
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr "Gestartet"
+
+#: ../ProjectController.py:1633
 msgid "Starting PLC\n"
 msgstr "starte SPS\n"
 
-#: ../Beremiz.py:403
+#: ../BeremizIDE.py:393
 msgid "Status ToolBar"
-msgstr ""
-
-#: ../editors/Viewer.py:493
+msgstr "Statusleiste"
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
 msgid "Step"
-msgstr ""
-
-#: ../ProjectController.py:1498
+msgstr "Schritt"
+
+#: ../ProjectController.py:1835
 msgid "Stop"
 msgstr "Stop"
 
-#: ../Beremiz_service.py:320
+#: ../Beremiz_service.py:272
 msgid "Stop PLC"
 msgstr "Stop SPS"
 
-#: ../ProjectController.py:1500
+#: ../ProjectController.py:1836
 msgid "Stop Running PLC"
 msgstr "Halte laufende SPS an"
 
-#: ../ProjectController.py:1292
-#, fuzzy
-msgid "Stopping debugger...\n"
-msgstr "Halte Debugger an\n"
-
-#: ../editors/DataTypeEditor.py:52
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr "Gestoppt"
+
+#: ../editors/DataTypeEditor.py:60
 msgid "Structure"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:52
+msgstr "Struktur"
+
+#: ../editors/DataTypeEditor.py:60
 msgid "Subrange"
-msgstr ""
+msgstr "Unterbereichstyp"
 
 #: ../plcopen/iec_std.csv:35
 msgid "Subtraction"
-msgstr ""
-
-#: ../ProjectController.py:915
+msgstr "Subtraktion"
+
+#: ../ProjectController.py:1113
 msgid "Successfully built.\n"
-msgstr ""
-
-#: ../dialogs/SearchInProjectDialog.py:154
+msgstr "Erfolgreicher Build.\n"
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr "Perspektive wechseln"
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
 msgid "Syntax error in regular expression of pattern to search!"
-msgstr ""
+msgstr "Syntaxfehler im regulären Ausdruck des zu suchenden Musters!"
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr "TYPE"
 
 #: ../plcopen/iec_std.csv:29
 msgid "Tangent"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:76
+msgstr "Tangente"
+
+#: ../editors/ResourceEditor.py:97
 msgid "Task"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:218
+msgstr "Task"
+
+#: ../editors/ResourceEditor.py:248
 msgid "Tasks:"
-msgstr ""
-
-#: ../controls/VariablePanel.py:78
+msgstr "Tasks:"
+
+#: ../controls/VariablePanel.py:91
 msgid "Temp"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:398
+msgstr "Temp"
+
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+"Der beste Ort, um Fragen über Beremiz / PLCOpenEditor\n"
+"zu stellen, ist die Mailingliste des Projekts:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"Dies ist der Haupt-Support-Kanal der Community.\n"
+"Um dort Fragen zu stellen, ist es erforderlich,\n"
+"die Mailingliste abonniert zu haben.\n"
+"\n"
+"Hier können Sie die Liste abonnieren:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+
+#: ../editors/FileManagementPanel.py:186
 #, python-format
 msgid ""
 "The file '%s' already exist.\n"
 "Do you want to replace it?"
 msgstr ""
-
-#: ../editors/LDViewer.py:879
+"Die Datei '%s' existiert bereits.\n"
+"Möchten Sie es ersetzen?"
+
+#: ../editors/LDViewer.py:893
 msgid "The group of block must be coherent!"
-msgstr ""
-
-#: ../IDEFrame.py:1091
-#: ../Beremiz.py:555
+msgstr "Die Gruppe von Blöcken muss konsistent sein!"
+
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
 msgid "There are changes, do you want to save?"
 msgstr "Es wurden Änderungen gemacht, wollen Sie speichern?"
 
-#: ../IDEFrame.py:1709
-#: ../IDEFrame.py:1728
-#, python-format
-msgid "There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?"
-msgstr ""
-
-#: ../IDEFrame.py:1178
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+"Baustein mit dem Namen \"%s\" existiert bereits. Das könnte eine Kollision "
+"sein. Möchten Sie fortfahren?"
+
+#: ../IDEFrame.py:1133
 msgid ""
 "There was a problem printing.\n"
 "Perhaps your current printer is not set correctly?"
 msgstr ""
-
-#: ../editors/LDViewer.py:888
+"Es gab ein Problem beim Drucken.\n"
+"Vielleicht ist der Drucker nicht richtig eingestellt."
+
+#: ../editors/LDViewer.py:902
 msgid "This option isn't available yet!"
-msgstr ""
-
-#: ../editors/GraphicViewer.py:278
-msgid "Tick"
-msgstr ""
+msgstr "Diese Option is noch nicht verfügbar!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr "Takt: %d"
 
 #: ../plcopen/iec_std.csv:40
 msgid "Time"
-msgstr ""
-
-#: ../plcopen/iec_std.csv:40
-#: ../plcopen/iec_std.csv:41
+msgstr "Zeit"
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
 msgid "Time addition"
-msgstr ""
+msgstr "Zeitaddition"
 
 #: ../plcopen/iec_std.csv:86
 msgid "Time concatenation"
-msgstr ""
-
-#: ../plcopen/iec_std.csv:60
-#: ../plcopen/iec_std.csv:61
+msgstr "Zeitkonkatenation"
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
 msgid "Time division"
-msgstr ""
-
-#: ../plcopen/iec_std.csv:46
-#: ../plcopen/iec_std.csv:47
-#, fuzzy
+msgstr "Zeitdivision"
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
 msgid "Time multiplication"
-msgstr "schließe Applikation"
-
-#: ../plcopen/iec_std.csv:48
-#: ../plcopen/iec_std.csv:49
+msgstr "Zeitmultiplikation"
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
 msgid "Time subtraction"
-msgstr ""
-
-#: ../plcopen/iec_std.csv:42
-#: ../plcopen/iec_std.csv:43
+msgstr "Zeitsubstraktion"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
 msgid "Time-of-day addition"
-msgstr ""
-
-#: ../plcopen/iec_std.csv:52
-#: ../plcopen/iec_std.csv:53
-#: ../plcopen/iec_std.csv:54
-#: ../plcopen/iec_std.csv:55
+msgstr "Tageszeitaddition"
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
 msgid "Time-of-day subtraction"
-msgstr ""
-
-#: ../editors/Viewer.py:432
+msgstr "Tageszeitsubstraktion"
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr "Wert umschalten"
+
+#: ../editors/Viewer.py:584
 msgid "Top"
-msgstr ""
-
-#: ../ProjectController.py:1507
+msgstr "Oben"
+
+#: ../ProjectController.py:1848
 msgid "Transfer"
-msgstr "Übertrage"
-
-#: ../ProjectController.py:1509
+msgstr "Übertragen"
+
+#: ../ProjectController.py:1849
 msgid "Transfer PLC"
-msgstr "Übertrage SPS"
-
-#: ../ProjectController.py:1474
+msgstr "SPS übertragen"
+
+#: ../ProjectController.py:1802
 msgid "Transfer completed successfully.\n"
 msgstr "Übertragung erfolgreich beendet.\n"
 
-#: ../ProjectController.py:1476
+#: ../ProjectController.py:1805
 msgid "Transfer failed\n"
 msgstr "Übertragung gescheitert\n"
 
-#: ../editors/Viewer.py:494
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
 msgid "Transition"
-msgstr ""
-
-#: ../PLCGenerator.py:1212
-#, python-format
-msgid "Transition \"%s\" body must contain an output variable or coil referring to its name"
-msgstr ""
-
-#: ../dialogs/PouTransitionDialog.py:84
+msgstr "Transition"
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+"Transition \"%s\" muss eine Ausgangsvariable oder Spule enthalten, die sich "
+"auf seinen Namen bezieht"
+
+#: ../dialogs/PouTransitionDialog.py:91
 msgid "Transition Name"
-msgstr ""
-
-#: ../dialogs/PouTransitionDialog.py:53
+msgstr "Transitionsbedingungsname"
+
+#: ../dialogs/PouTransitionDialog.py:60
 msgid "Transition Name:"
-msgstr ""
-
-#: ../PLCGenerator.py:1301
-#, python-format
-msgid "Transition with content \"%s\" not connected to a next step in \"%s\" POU"
-msgstr ""
-
-#: ../PLCGenerator.py:1292
-#, python-format
-msgid "Transition with content \"%s\" not connected to a previous step in \"%s\" POU"
-msgstr ""
-
-#: ../plcopen/plcopen.py:1442
+msgstr "Transitionsbedingungsname:"
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr ""
+"Transition mit Inhalt \"{a1}\" im Baustein \"{a2}\" ist nicht mit dem "
+"nächsten Schritt verbunden"
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr ""
+"Transition mit Inhalt \"{a1}\" im Baustein \"{a2}\" ist nicht mit dem "
+"vorherigen Schritt verbunden"
+
+#: ../plcopen/plcopen.py:1526
 #, python-format
 msgid "Transition with name %s doesn't exist!"
-msgstr ""
-
-#: ../PLCControler.py:95
+msgstr "Eine Transition mit dem Namen %s existiert nicht!"
+
+#: ../plcopen/types_enums.py:76
 msgid "Transitions"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:67
+msgstr "Transitionen"
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr "Übersetzt von"
+
+#: ../editors/ResourceEditor.py:76
 msgid "Triggering"
-msgstr ""
-
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
-#: ../editors/DataTypeEditor.py:48
-#: ../editors/ResourceEditor.py:76
-#: ../dialogs/ActionBlockDialog.py:37
+msgstr "Taskttyp"
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr "Twisted is nicht verfügbar."
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
 msgid "Type"
-msgstr ""
-
-#: ../canfestival/config_utils.py:335
-#: ../canfestival/config_utils.py:617
+msgstr "Typ"
+
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr "Datentyp und abgeleitete Datentypen"
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
 #, python-format
 msgid "Type conflict for location \"%s\""
 msgstr "Typenkonflikt für Ort \"%s\""
 
 #: ../plcopen/iec_std.csv:16
 msgid "Type conversion"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:155
+msgstr "Typumwandlung"
+
+#: ../editors/DataTypeEditor.py:170
 msgid "Type infos:"
-msgstr ""
-
-#: ../dialogs/SFCDivergenceDialog.py:51
-#: ../dialogs/LDPowerRailDialog.py:51
-#: ../dialogs/ConnectionDialog.py:52
-#: ../dialogs/SFCTransitionDialog.py:53
-#: ../dialogs/FBDBlockDialog.py:48
+msgstr "Typinfo:"
+
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr "Nur Datentyp"
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
 msgid "Type:"
-msgstr ""
-
-#: ../canfestival/config_utils.py:455
-#: ../canfestival/config_utils.py:469
+msgstr "Typ:"
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
 #, python-format
 msgid "Unable to define PDO mapping for node %02x"
 msgstr "Unmöglich, PDO-Mapping für %02x zu definieren"
 
-#: ../targets/Xenomai/__init__.py:14
-#, fuzzy, python-format
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
 msgid "Unable to get Xenomai's %s \n"
-msgstr "Unmöglich, Xonomai's CFLAGS zu auszulesen\n"
-
-#: ../PLCGenerator.py:865
-#: ../PLCGenerator.py:924
-#, python-format
-msgid "Undefined block type \"%s\" in \"%s\" POU"
-msgstr ""
-
-#: ../PLCGenerator.py:240
+msgstr " %s-Ermittlung für Xenomai fehlgeschlagen\n"
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr "Undefinierter Bausteintyp \"{a1}\" im Baustein \"{a2}\""
+
+#: ../PLCGenerator.py:261
 #, python-format
 msgid "Undefined pou type \"%s\""
-msgstr ""
-
-#: ../IDEFrame.py:338
-#: ../IDEFrame.py:397
+msgstr "Undefinierter Bausteintyp \"%s\""
+
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
 msgid "Undo"
-msgstr ""
-
-#: ../ProjectController.py:254
+msgstr "Rückgängig"
+
+#: ../ProjectController.py:442
 msgid "Unknown"
-msgstr ""
-
-#: ../editors/Viewer.py:336
-#, fuzzy, python-format
+msgstr "Unbekannt"
+
+#: ../editors/Viewer.py:437
+#, python-format
 msgid "Unknown variable \"%s\" for this POU!"
-msgstr "Debug : Unbekannte Variable %s\n"
-
-#: ../ProjectController.py:251
-#: ../ProjectController.py:252
+msgstr "Unbekannte Variable \"%s\" für diesen Baustein!"
+
+#: ../ProjectController.py:439 ../ProjectController.py:440
 msgid "Unnamed"
-msgstr ""
-
-#: ../PLCControler.py:305
+msgstr "Unbenannt"
+
+#: ../PLCControler.py:263
 #, python-format
 msgid "Unnamed%d"
-msgstr ""
-
-#: ../controls/VariablePanel.py:272
+msgstr "Unbenannt%d"
+
+#: ../controls/VariablePanel.py:308
 #, python-format
 msgid "Unrecognized data size \"%s\""
-msgstr ""
-
-#: ../plcopen/structures.py:222
-msgid ""
-"Up-counter\n"
-"The up-counter can be used to signal when a count has reached a maximum value."
-msgstr ""
-
-#: ../plcopen/structures.py:232
-msgid ""
-"Up-down counter\n"
-"The up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other."
-msgstr ""
-
-#: ../controls/VariablePanel.py:709
-#: ../editors/DataTypeEditor.py:623
+msgstr "Nicht erkannte Datengröße \"%s\""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
 msgid "User Data Types"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:38
-#: ../canfestival/NetworkEditor.py:68
+msgstr "Benutzerdefinierte Datentypen"
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
 msgid "User Type"
-msgstr ""
-
-#: ../PLCControler.py:94
+msgstr "Benutzertyp"
+
+#: ../plcopen/types_enums.py:75
 msgid "User-defined POUs"
-msgstr ""
-
-#: ../controls/DebugVariablePanel.py:40
-#: ../dialogs/ActionBlockDialog.py:37
+msgstr "Benutzerbausteine"
+
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Value"
-msgstr ""
-
-#: ../editors/GraphicViewer.py:278
-msgid "Values"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:252
+msgstr "Wert"
+
+#: ../editors/DataTypeEditor.py:267
 msgid "Values:"
-msgstr ""
-
-#: ../controls/DebugVariablePanel.py:40
-#: ../editors/Viewer.py:466
-#: ../dialogs/ActionBlockDialog.py:41
+msgstr "Werte:"
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
 msgid "Variable"
-msgstr ""
-
-#: ../dialogs/FBDVariableDialog.py:47
-#, fuzzy
+msgstr "Variable"
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr "Variable Drop"
+
+#: ../dialogs/FBDVariableDialog.py:68
 msgid "Variable Properties"
-msgstr "Eigenschaften"
-
-#: ../controls/VariablePanel.py:277
-#: ../editors/TextViewer.py:330
-#: ../editors/Viewer.py:277
+msgstr "Variableneigenschaften"
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
 msgid "Variable class"
-msgstr ""
-
-#: ../editors/TextViewer.py:374
-#: ../editors/Viewer.py:338
+msgstr "Variablenklasse"
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
 msgid "Variable don't belong to this POU!"
-msgstr ""
-
-#: ../controls/VariablePanel.py:77
+msgstr "Variable gehört nicht zu dieser POU!"
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr "Variable:"
+
+#: ../controls/VariablePanel.py:90
 msgid "Variables"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:151
+msgstr "Variablen"
+
+#: ../controls/ProjectPropertiesPanel.py:166
 msgid "Vertical:"
-msgstr ""
-
-#: ../wxglade_hmi/wxglade_hmi.py:11
+msgstr "Vertikal:"
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr ""
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr ""
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr ""
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr ""
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr "WAMP-Cliet-Start fehlgeschlagen."
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr ""
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr "WAMP Verbindung zu URL : %s\n"
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr "WAMP Verbindungs-timeout"
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr "WAMP Verbindung zu '%s' gescheitert.\n"
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr "WAMP-Import fehlgeschlagen :"
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr ""
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
 msgid "WXGLADE GUI"
 msgstr "WXGLADE GUI"
 
-#: ../ProjectController.py:1276
-msgid "Waiting debugger to recover...\n"
-msgstr "Warte auf Selbstheilung des Debuggers...\n"
-
-#: ../editors/LDViewer.py:888
-#: ../dialogs/PouDialog.py:126
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
 msgid "Warning"
-msgstr ""
-
-#: ../ProjectController.py:515
+msgstr "Warnung"
+
+#: ../ProjectController.py:726
 msgid "Warnings in ST/IL/SFC code generator :\n"
 msgstr "Warnungen im ST/IL/SFC Code Generator :\n"
 
-#: ../dialogs/SearchInProjectDialog.py:85
-#, fuzzy
+#: ../dialogs/SearchInProjectDialog.py:82
 msgid "Whole Project"
-msgstr "Projekt schließen"
-
-#: ../controls/ProjectPropertiesPanel.py:119
+msgstr "Ganze Projekt"
+
+#: ../controls/ProjectPropertiesPanel.py:134
 msgid "Width:"
-msgstr ""
-
-#: ../dialogs/FindInPouDialog.py:86
+msgstr "Breite:"
+
+#: ../dialogs/FindInPouDialog.py:94
 msgid "Wrap search"
-msgstr ""
-
-#: ../features.py:9
+msgstr "Nach dem Ende zum Anfang"
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr "Geschrieben von"
+
+#: ../features.py:35
 msgid "WxGlade GUI"
-msgstr ""
-
-#: ../svgui/svgui.py:106
+msgstr "WxGlade GUI"
+
+#: ../svgui/svgui.py:150
 msgid ""
 "You don't have write permissions.\n"
 "Open Inkscape anyway ?"
@@ -3558,7 +3630,7 @@
 "Sie haben keine Schreibberechtigung.\n"
 "soll Inkscape trotzdem geöffnet werden ?"
 
-#: ../wxglade_hmi/wxglade_hmi.py:108
+#: ../wxglade_hmi/wxglade_hmi.py:160
 msgid ""
 "You don't have write permissions.\n"
 "Open wxGlade anyway ?"
@@ -3566,7 +3638,7 @@
 "Sie haben keine Schreibberechtigung.\n"
 "Soll wxGlade dennoch geöffnet werden ?"
 
-#: ../ProjectController.py:220
+#: ../ProjectController.py:390
 msgid ""
 "You must have permission to work on the project\n"
 "Work on a project copy ?"
@@ -3574,98 +3646,124 @@
 "Sie müssen Berechtigungen besitzen um mit diesem Projekt arbeiten zu können\n"
 "Wollen Sie dieses Projekt stattdessen kopieren ?"
 
-#: ../editors/LDViewer.py:883
-msgid "You must select the block or group of blocks around which a branch should be added!"
-msgstr ""
-
-#: ../editors/LDViewer.py:663
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+"Sie müssen den Block oder die Gruppe von Blöcken auswählen, um die ein Zweig"
+" hinzugefügt werden soll!"
+
+#: ../editors/LDViewer.py:677
 msgid "You must select the wire where a contact should be added!"
 msgstr ""
-
-#: ../dialogs/PouNameDialog.py:45
-#: ../dialogs/SFCStepNameDialog.py:47
-#: ../dialogs/SFCStepDialog.py:118
+"Bitte wählen Sie den Draht aus, wo ein Kontakt hinzugefügt werden soll!"
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
 msgid "You must type a name!"
-msgstr ""
-
-#: ../dialogs/ForceVariableDialog.py:165
+msgstr "Sie müssen einen Namen eingeben!"
+
+#: ../dialogs/ForceVariableDialog.py:209
 msgid "You must type a value!"
-msgstr ""
-
-#: ../IDEFrame.py:414
+msgstr "Sie müssen einen Wert eingeben!"
+
+#: ../IDEFrame.py:440
 msgid "Zoom"
-msgstr ""
-
-#: ../editors/GraphicViewer.py:97
-msgid "Zoom:"
-msgstr ""
-
-#: ../PLCOpenEditor.py:356
+msgstr "Zoom"
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr "Tage"
+
+#: ../PLCOpenEditor.py:317
 #, python-format
 msgid "error: %s\n"
-msgstr ""
-
-#: ../util/ProcessLogger.py:161
-#, python-format
-msgid "exited with status %s (pid %s)\n"
-msgstr "Beendet mit Status %s(pid %s)\n"
-
-#: ../PLCOpenEditor.py:508
-#: ../PLCOpenEditor.py:510
-msgid "file : "
-msgstr "Datei : "
-
-#: ../dialogs/PouDialog.py:31
-#, fuzzy
+msgstr "Fehler: %s\n"
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr "Beendet mit Status {a1} (pid {a2})\n"
+
+#: ../dialogs/PouDialog.py:36
 msgid "function"
-msgstr "Funktion : "
-
-#: ../PLCOpenEditor.py:511
-msgid "function : "
-msgstr "Funktion : "
-
-#: ../dialogs/PouDialog.py:31
-#, fuzzy
+msgstr "Funktion"
+
+#: ../dialogs/PouDialog.py:36
 msgid "functionBlock"
-msgstr "Funktion : "
-
-#: ../PLCOpenEditor.py:511
-msgid "line : "
-msgstr "Zeile :"
-
-#: ../dialogs/PouDialog.py:31
+msgstr "Funktionsblock"
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr "Stunden"
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr "matiec ist nicht gefunden\n"
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr "Millisekunden"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr "Minuten"
+
+#: ../dialogs/PouDialog.py:36
 msgid "program"
-msgstr ""
+msgstr "Programm"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr "Sekunden"
 
 #: ../plcopen/iec_std.csv:84
 msgid "string from the middle"
-msgstr ""
+msgstr "Zeichen aus der Mitte"
 
 #: ../plcopen/iec_std.csv:82
 msgid "string left of"
-msgstr ""
+msgstr "Zeichen links von"
 
 #: ../plcopen/iec_std.csv:83
 msgid "string right of"
-msgstr ""
-
-#: ../PLCOpenEditor.py:354
+msgstr "Zeichen rechts von"
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr "Updateinformation ist nicht verfügbar."
+
+#: ../PLCOpenEditor.py:315
 #, python-format
 msgid "warning: %s\n"
-msgstr ""
+msgstr "Warnung: %s\n"
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr "{a1} \"{a2}\" kann nicht eingefügt werden als {a3}."
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+"XML-Datei {a1} folgt nicht XSD-Schema an der Zeile {a2}:\n"
+"{a3}"
 
 #: Extra XSD strings
 msgid "CanFestivalSlaveNode"
 msgstr "CanFestivalSlaveNode"
 
 msgid "CAN_Device"
-msgstr "CAN_Gerät"
+msgstr "CAN Gerät"
 
 msgid "CAN_Baudrate"
-msgstr "CAN_Baudrate"
+msgstr "CAN Baudrate"
 
 msgid "NodeId"
-msgstr "ZweigId"
+msgstr " Node-ID"
 
 msgid "Sync_Align"
 msgstr "Sync_Align"
@@ -3683,20 +3781,104 @@
 msgstr "CanFestivalInstanz"
 
 msgid "CAN_Driver"
-msgstr "CAN_Treiber"
-
-msgid "Debug_mode"
-msgstr "Debug_Modus"
-
-msgid "CExtension"
-msgstr "CExtension"
+msgstr "CAN Treiber"
+
+msgid "Generic"
+msgstr "Generic"
+
+msgid "Command"
+msgstr "Befehlzeile"
+
+msgid "Xenomai"
+msgstr "Xenomai"
+
+msgid "XenoConfig"
+msgstr "XenoConfig"
+
+msgid "Compiler"
+msgstr "Compiler"
 
 msgid "CFLAGS"
 msgstr "CFLAGS"
 
+msgid "Linker"
+msgstr "Linker"
+
 msgid "LDFLAGS"
 msgstr "LDFLAGS"
 
+msgid "Linux"
+msgstr "Linux"
+
+msgid "Win32"
+msgstr "Win32"
+
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr ""
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
 msgid "BaseParams"
 msgstr "BaseParams"
 
@@ -3706,24 +3888,6 @@
 msgid "Enabled"
 msgstr "Aktiviert"
 
-msgid "Linux"
-msgstr "Linux"
-
-msgid "Compiler"
-msgstr "Compiler"
-
-msgid "Linker"
-msgstr "Linker"
-
-msgid "Win32"
-msgstr "Win32"
-
-msgid "Xenomai"
-msgstr "Xenomai"
-
-msgid "XenoConfig"
-msgstr "XenoConfig"
-
 msgid "BeremizRoot"
 msgstr "BeremizRoot"
 
@@ -3731,132 +3895,242 @@
 msgstr "ZielTyp"
 
 msgid "Libraries"
-msgstr ""
+msgstr "Bibliotheken"
 
 msgid "URI_location"
 msgstr "URI_location"
 
-#, fuzzy
 msgid "Disable_Extensions"
-msgstr "CExtension"
-
-#~ msgid "A child with IEC channel %d already exist -> %d\n"
-#~ msgstr "Ein Zweig mit IEC-Kanal %d existiert bereits -> %d\n"
-
-#~ msgid "Add a sub plugin"
-#~ msgstr "Unter-Plugin hinzufügen"
-
-#~ msgid "Append "
-#~ msgstr "Hinzufügen"
-
-#~ msgid "Beremiz\tF1"
-#~ msgstr "Beremiz\tF1"
-
-#~ msgid "Can't find module for target %s!\n"
-#~ msgstr "Kann Modul für folgendes Ziel nicht finden: %s!\n"
-
-#~ msgid "Cannot compare latest build to target. Please build.\n"
-#~ msgstr ""
-#~ "Kann den letzten Build nicht mit dem Ziel vergleichen. Bitte neu "
-#~ "builden.\n"
-
-#~ msgid "Debug Thread couldn't be killed"
-#~ msgstr "Debug Thread konnte nicht beendet werden"
-
-#~ msgid "Debug data do not match requested variable count %d != %d\n"
-#~ msgstr ""
-#~ "Debug Daten entsprechen nicht der angeforderten Variablen-Nummer %d != "
-#~ "%d\n"
-
-#~ msgid "Edit CanOpen Network with NetworkEdit"
-#~ msgstr "bearbeite CanOpen-Netzwerk mit NetworkEdit"
-
-#~ msgid "Enable/Disable this plugin"
-#~ msgstr "Aktiviere/Deaktiviere dieses PlugIn"
-
-#~ msgid "Generating plugins C code\n"
-#~ msgstr "Generiere Plugin C Code\n"
-
-#~ msgid "Latest build does not match with target, please transfer.\n"
-#~ msgstr "Letzter Build entspricht nicht dem Ziel, bitte Übertragen.\n"
-
-#~ msgid "Latest build matches target, no transfer needed.\n"
-#~ msgstr "Letzter Build entspricht dem Ziel, kein Transfer benötigt.\n"
-
-#~ msgid "New\tCTRL+N"
-#~ msgstr "Neu\tCTRL+N"
-
-#~ msgid "Open\tCTRL+O"
-#~ msgstr "Öffnen\tCTRL+O"
-
-#~ msgid "Open NetworkEdit"
-#~ msgstr "öffne NetworkEdit"
-
-#~ msgid "Open ObjDictEdit"
-#~ msgstr "öffne ObjDictEdit"
-
-#~ msgid "Plugin : "
-#~ msgstr "Plugin : "
-
-#~ msgid "Quit\tCTRL+Q"
-#~ msgstr "Beenden\tCTRL+Q"
-
-#~ msgid "Redo\tCTRL+Y"
-#~ msgstr "Wiederholen\tCTRL+Y"
-
-#~ msgid "Refresh\tCTRL+R"
-#~ msgstr "Refresh\tCTRL+R"
-
-#~ msgid "Save\tCTRL+S"
-#~ msgstr "Speichern\tCTRL+S"
-
-#~ msgid "Save as\tCTRL+SHIFT+S"
-#~ msgstr "Speichern als\tCTRL+SHIFT+S"
-
-#~ msgid "Simulate"
-#~ msgstr "Simuliere"
-
-#~ msgid "Simulate PLC"
-#~ msgstr "Simuliere SPS"
-
-#~ msgid "Topology"
-#~ msgstr "Topologie"
-
-#~ msgid "Unable to get Xenomai's LDFLAGS\n"
-#~ msgstr "Unmöglich, Xenomai's LDFLAGS auszulesen\n"
-
-#~ msgid "Undo\tCTRL+Z"
-#~ msgstr "Undo\tCTRL+Z"
-
-#~ msgid "Wrong URI, please check it !\n"
-#~ msgstr "Falsche URI, bitte überprüfen !\n"
-
-#~ msgid ""
-#~ "You don't have write permissions.\n"
-#~ "Open CFileEditor anyway ?"
-#~ msgstr ""
-#~ "Sie haben keine Schreibberechtigung.\n"
-#~ "Soll CFileEditor trotzdem geöffnet werden?"
-
-#~ msgid ""
-#~ "You don't have write permissions.\n"
-#~ "Open NetworkEdit anyway ?"
-#~ msgstr ""
-#~ "Sie haben keine Leseberechtigung.\n"
-#~ "Soll Open NetworkEdit trotzdem geöffnet werden ?"
-
-#~ msgid ""
-#~ "You don't have write permissions.\n"
-#~ "Open ObjDictEdit anyway ?"
-#~ msgstr ""
-#~ "Sie haben keine Leseberechtigung.\n"
-#~ "Soll ObjDictEdit trotzdem geöffnet werden ?"
-
-#~ msgid "Enable_Plugins"
-#~ msgstr "Enable_Plugins"
-
-#~ msgid "Rtai"
-#~ msgstr "Rtai"
-
-#~ msgid "rtai_config"
-#~ msgstr "rtai_config"
+msgstr "Disable_Extensions"
+
+msgid "%(codefile_name)s"
+msgstr "%(codefile_name)s"
+
+msgid "variables"
+msgstr "Variablen"
+
+msgid "variable"
+msgstr "Variable"
+
+msgid "name"
+msgstr "Name"
+
+msgid "type"
+msgstr "Typ"
+
+msgid "class"
+msgstr "class"
+
+msgid "initial"
+msgstr "initial"
+
+msgid "desc"
+msgstr "desc"
+
+msgid "onchange"
+msgstr "onchange"
+
+msgid "opts"
+msgstr "opts"
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr "0 - aktuelle Zeit, 1 - stellen die Zeit von PDT ein"
+
+msgid "Preset datetime"
+msgstr "Zeiteinstellung"
+
+msgid "Copy of IN"
+msgstr "Kopie von IN"
+
+msgid "Datetime, current or relative to PDT"
+msgstr "Zeit, aktuell oder relativ zu PDT"
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+"Die Echtzeituhr hat viele Einsatzmöglichkeiten inklusive Zeitstempel, setzen"
+" Datum und Tageszeiten in den Reports, in Alarmmeldungen und so weiter."
+
+msgid "1 = integrate, 0 = hold"
+msgstr "1 = integrieren, 0 = halten"
+
+msgid "Overriding reset"
+msgstr "Reset"
+
+msgid "Input variable"
+msgstr "Eingansvariable"
+
+msgid "Initial value"
+msgstr "Anfangswert"
+
+msgid "Sampling period"
+msgstr "Sampling-Periode"
+
+msgid "NOT R1"
+msgstr "NOT R1"
+
+msgid "Integrated output"
+msgstr "Integrierter Ausgangswert"
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr "Der Baustein integriert den Wert des Eingangs XIN über die Zeit."
+
+msgid "0 = reset"
+msgstr "0 = reset"
+
+msgid "Input to be differentiated"
+msgstr "Eingabe, die differenziert wird"
+
+msgid "Differentiated output"
+msgstr "Differenzierter Ausgangswert"
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+"Der Ableitungsfunktionsblock erzeugt einen Ausgang XOUT proportional zur "
+"Änderungsrate des Eingangs XIN."
+
+msgid "0 - manual , 1 - automatic"
+msgstr "0 - manuell, 1 - automatisch"
+
+msgid "Process variable"
+msgstr "Prozessvariable"
+
+msgid "Set point"
+msgstr "Sollwert"
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr "Manuelle Ausgabeanpassung"
+
+msgid "Proportionality constant"
+msgstr "Proportionalitätskoeffizient"
+
+msgid "Reset time"
+msgstr "Zeit zurücksetzen"
+
+msgid "Derivative time constant"
+msgstr "Vorhaltzeit, Verstärkungsfaktor des D-Anteils"
+
+msgid "PV - SP"
+msgstr "PV - SP"
+
+msgid "FB for integral term"
+msgstr "Integral, I-Regler"
+
+msgid "FB for derivative term"
+msgstr "Differenzierer"
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+"PID (Proportional, Integral, Derivative) Baustein stellt der klassische PID-"
+"Regler zur Verfügung."
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr "0 - Ausgang ist X0, 1 - Rampe von X0 nach X1 oder zurück generieren"
+
+msgid "Ramp duration"
+msgstr "Rampenzeit"
+
+msgid "BUSY = 1 during ramping period"
+msgstr "BUSY = 1 während der Rampenzeit"
+
+msgid "Elapsed time of ramp"
+msgstr "Verstrichene Zeit der Rampe"
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr ""
+"Der RAMP-Baustein ist nach dem in der Norm angegebenen Beispiel modelliert."
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+"Der Hysteresebaustein liefert einen booleschen Ausgang XOUT, der durch die "
+"Differenz von zwei Gleitkommaeingängen (REAL) XIN1 und XIN2 gesteuert wird."
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr "SR ist ein bistabiler Trigger, wo das Set dominiert."
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr "RS ist ein bistabiler Trigger, wo das Reset dominiert."
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+"Das Semaphor bietet einen Mechanismus, um Software-Elementen gegenseitig "
+"ausschließlichen Zugriff auf bestimmte Ressourcen zu ermöglichen."
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+"Die Ausgabe erzeugt einen einzigen Impuls, wenn eine steigende Flanke "
+"erkannt wird."
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+"Die Ausgabe erzeugt einen einzigen Impuls, wenn eine fallende Flanke erkannt"
+" wird."
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+"Der Aufwärtszähler kann verwendet werden, um zu signalisieren, wenn der "
+"Zähler den maximalen Wert erreicht hat."
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+"Der Abwärtszähler kann verwendet werden, um zu signalisieren, wenn der "
+"Zähler Null erreicht hat."
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+"Der Auf- und Abwärtszähler verfügt über zwei Eingänge CU und CD. Es kann "
+"verwendet werden, um an einem Eingang nach oben  und an dem anderen nach "
+"unten zu zählen."
+
+msgid "first input parameter"
+msgstr "Erster Eingangsparameter"
+
+msgid "second input parameter"
+msgstr "Zweiter Eingangsparameter"
+
+msgid "first output parameter"
+msgstr "Erster Ausgabeparameter"
+
+msgid "second output parameter"
+msgstr "Zweiter Ausgabeparameter"
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr "Interner Zustand: 0-Reset, 1-Zählen, 2-Set"
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+"Der Pulsegeber kann verwendet werden, um Impulse einer vorgegebenen "
+"Zeitdauer zu erzeugen."
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+"Der An-Verzögerungszeitgeber kann verwendet werden, um Einschalten des "
+"Ausgangs auf eine feste Periode nach Einschalten des Eingangs zu verzögern."
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
+"Der Aus-Verzögerungszeitgeber kann verwendet werden, um Ausschalten des "
+"Ausgangs auf eine feste Periode nach Ausschalten des Eingangs zu verzögern."
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/Beremiz_es_ES.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4157 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Yegor Yefremov <yegorslists@googlemail.com>, 2018\n"
+"Language-Team: Spanish (Spain) (https://www.transifex.com/beremiz/teams/75746/es_ES/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: es_ES\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
+msgid ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+msgstr ""
+"\n"
+"Ha ocurrido un error desconocido (bug). El informe de error fue guardado en:\n"
+"(%s)\n"
+"\n"
+"Por favor, si es tan amable, envíe el archivo de error a:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"Debe reiniciar el programa.\n"
+"\n"
+"Rastreo:\n"
+
+#: ../controls/VariablePanel.py:90
+msgid "   External"
+msgstr "Externa"
+
+#: ../controls/VariablePanel.py:89
+msgid "   InOut"
+msgstr "EntradaSalida"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Input"
+msgstr "Entrada"
+
+#: ../controls/VariablePanel.py:90
+msgid "   Local"
+msgstr "   Local"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Output"
+msgstr "Salida"
+
+#: ../controls/VariablePanel.py:91
+msgid "   Temp"
+msgstr "Temporal"
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
+#, python-format
+msgid " and %s"
+msgstr "y %s"
+
+#: ../ProjectController.py:1182
+msgid " generation failed !\n"
+msgstr "¡Generación fallida!\n"
+
+#: ../plcopen/plcopen.py:1029
+#, python-format
+msgid "\"%s\" Data Type doesn't exist !!!"
+msgstr "¡El Tipo de dato \"%s\" no existe!"
+
+#: ../plcopen/plcopen.py:1047
+#, python-format
+msgid "\"%s\" POU already exists !!!"
+msgstr "¡El POU \"%s\" ya existe!"
+
+#: ../plcopen/plcopen.py:1068
+#, python-format
+msgid "\"%s\" POU doesn't exist !!!"
+msgstr "¡El POU \"%s\" no existe!"
+
+#: ../editors/Viewer.py:288
+#, python-format
+msgid "\"%s\" can't use itself!"
+msgstr "¡\"%s\" no puede usarse a sí mismo!"
+
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
+#, python-format
+msgid "\"%s\" config already exists!"
+msgstr "¡La configuración \"%s\" ya existe!"
+
+#: ../plcopen/plcopen.py:531
+#, python-format
+msgid "\"%s\" configuration already exists !!!"
+msgstr "¡La configuración \"%s\" ya existe!"
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr "¡La configuración %s no existe!"
+
+#: ../IDEFrame.py:1638
+#, python-format
+msgid "\"%s\" data type already exists!"
+msgstr "¡El tipo de dato \"%s\" ya existe!"
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
+#, python-format
+msgid "\"%s\" element for this pou already exists!"
+msgstr "¡Ya existe un elemento \"%s\" para este POU!"
+
+#: ../BeremizIDE.py:928
+#, python-format
+msgid "\"%s\" folder is not a valid Beremiz project\n"
+msgstr "La carpeta \"%s\" no contiene un proyecto Beremiz válido\n"
+
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
+#, python-format
+msgid "\"%s\" is a keyword. It can't be used!"
+msgstr "\"%s\" es una palabra reservada. ¡No puede ser usada!"
+
+#: ../plcopen/plcopen.py:2836
+#, python-format
+msgid "\"%s\" is an invalid value!"
+msgstr "¡\"%s\" es un valor inválido!"
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
+msgid "\"%s\" is not a valid folder!"
+msgstr "¡\"%s\" no es una carpeta válida!"
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
+#, python-format
+msgid "\"%s\" is not a valid identifier!"
+msgstr "¡\"%s\" no es un identificador válido!"
+
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr "\"%s\" es usado por uno o más POUs. ¿Deseas continuar?"
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
+#, python-format
+msgid "\"%s\" pou already exists!"
+msgstr "\"%s\" POU ya existe!"
+
+#: ../dialogs/SFCStepNameDialog.py:62
+#, python-format
+msgid "\"%s\" step already exists!"
+msgstr "¡El paso \"%s\" ya existe!"
+
+#: ../editors/DataTypeEditor.py:566
+#, python-format
+msgid "\"%s\" value already defined!"
+msgstr "\"%s\" valor ya definido\""
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
+#, python-format
+msgid "\"%s\" value isn't a valid array dimension!"
+msgstr "¡\"%s\" no es una dimensión válida para el arreglo!"
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
+#, python-format
+msgid ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+msgstr ""
+"\"%s\" no es una dimensión válida para el array!\n"
+"El valor de la derecha debe ser mayor que el de la izquierda."
+
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr ""
+"\"{a1}\" llamada a la función en \"{a2}\" POU: No hay ninguna entrada "
+"conectada"
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr "¡\"{a1}\" ya está siendo usada por \"{a2}\"!"
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr "\"{a1}\" el recurso ya existe en la configuración \"{a2}\" !!!"
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr "\"{a1}\" el recurso no existe en la configuración \"{a2}\" !!!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr "%03gms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr "%dd"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr "%dh"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr "%dm"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr "%dms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr "%ds"
+
+#: ../PLCControler.py:1114
+#, python-format
+msgid "%s Data Types"
+msgstr "%s Tipos de Datos"
+
+#: ../PLCControler.py:1097
+#, python-format
+msgid "%s POUs"
+msgstr "%s POUs"
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
+#, python-format
+msgid "%s Profile"
+msgstr "Perfil %s"
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
+#, python-format
+msgid "%s body don't have instances!"
+msgstr "%s El cuerpo no tiene instancias!"
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
+#, python-format
+msgid "%s body don't have text!"
+msgstr "%s El cuerpo no posee texto!"
+
+#: ../IDEFrame.py:388
+msgid "&Add Element"
+msgstr "&Añadir Elemento"
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr "&Cerrar"
+
+#: ../IDEFrame.py:361
+msgid "&Configuration"
+msgstr "&Configuración"
+
+#: ../IDEFrame.py:350
+msgid "&Data Type"
+msgstr "&Tipo de Dato"
+
+#: ../IDEFrame.py:392
+msgid "&Delete"
+msgstr "&Eliminar"
+
+#: ../IDEFrame.py:342
+msgid "&Display"
+msgstr "&Mostrar"
+
+#: ../IDEFrame.py:341
+msgid "&Edit"
+msgstr "&Editar"
+
+#: ../IDEFrame.py:340
+msgid "&File"
+msgstr "&Archivo"
+
+#: ../IDEFrame.py:352
+msgid "&Function"
+msgstr "&Función"
+
+#: ../IDEFrame.py:343
+msgid "&Help"
+msgstr "&Ayuda"
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr "&Licencia"
+
+#: ../IDEFrame.py:356
+msgid "&Program"
+msgstr "&Programa"
+
+#: ../PLCOpenEditor.py:98
+msgid "&Properties"
+msgstr "&Propiedades"
+
+#: ../BeremizIDE.py:244
+msgid "&Recent Projects"
+msgstr "&Proyectos Recientes"
+
+#: ../IDEFrame.py:358
+msgid "&Resource"
+msgstr "&Recursos"
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr "'{a1}' - {a2} coincidencia en el proyecto"
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr "'{a1}' - {a2} coincidencias en el proyecto"
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr "'{a1}' ubicado en {a2}\n"
+
+#: ../controls/SearchResultPanel.py:298
+#, python-format
+msgid "(%d matches)"
+msgstr "(%d coincidencias)"
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
+#, python-format
+msgid ", %s"
+msgstr ", %s"
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr "- Seleccione el tipo de URI -"
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr "1d"
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr "1h"
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr "1m"
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr "1s"
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+"Un POU tiene un elemento llamado \"%s\". Esto puede causar conflicto. ¿Desea"
+" Continuar?"
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
+#, python-format
+msgid "A POU named \"%s\" already exists!"
+msgstr "¡Ya existe un POU llamado \"%s\"!"
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr "Hijo llamado \"{a1}\" ya existe -> \"{a2}\"\n"
+
+#: ../dialogs/BrowseLocationsDialog.py:229
+msgid "A location must be selected!"
+msgstr "¡Debe seleccionar una ubicación!"
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr "¡Ya existe una tarea con ese nombre!"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
+#, python-format
+msgid "A variable with \"%s\" as name already exists in this pou!"
+msgstr "¡Ya existe una variable llamada \"%s\" en este POU!"
+
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr "¡Ya existe una variable llamada \"%s\"!"
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
+msgid "About"
+msgstr "Acerca de"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Absolute number"
+msgstr "Valor absoluto"
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
+msgid "Action"
+msgstr "Acción"
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
+msgid "Action Block"
+msgstr "Bloque de acción"
+
+#: ../dialogs/PouActionDialog.py:89
+msgid "Action Name"
+msgstr "Nombre de acción"
+
+#: ../dialogs/PouActionDialog.py:56
+msgid "Action Name:"
+msgstr "Nombre de acción:"
+
+#: ../plcopen/plcopen.py:1567
+#, python-format
+msgid "Action with name %s doesn't exist!"
+msgstr "¡No existe una Acción llamada %s!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Actions"
+msgstr "Acciones"
+
+#: ../dialogs/ActionBlockDialog.py:139
+msgid "Actions:"
+msgstr "Acciones:"
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr "Activo"
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
+msgid "Add"
+msgstr "Añadir"
+
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
+msgid "Add Action"
+msgstr "Añadir Acción"
+
+#: ../features.py:33
+msgid "Add C code accessing located variables synchronously"
+msgstr "Agregue código C accediendo a las variables ubicadas sincrónicamente"
+
+#: ../IDEFrame.py:1907
+msgid "Add Configuration"
+msgstr "Añadir Configuración"
+
+#: ../IDEFrame.py:1887
+msgid "Add DataType"
+msgstr "Añadir Tipo de Dato"
+
+#: ../editors/Viewer.py:609
+msgid "Add Divergence Branch"
+msgstr "Añadir Ramificación"
+
+#: ../dialogs/DiscoveryDialog.py:121
+msgid "Add IP"
+msgstr "Añadir IP"
+
+#: ../IDEFrame.py:1895
+msgid "Add POU"
+msgstr "Añadir POU"
+
+#: ../features.py:34
+msgid "Add Python code executed asynchronously"
+msgstr "Añadir Código Python ejecutado de forma asíncrona"
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
+msgid "Add Resource"
+msgstr "Añadir un Recurso"
+
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
+msgid "Add Transition"
+msgstr "Añadir Transición"
+
+#: ../editors/Viewer.py:596
+msgid "Add Wire Segment"
+msgstr "Añadir Segmento de Cable"
+
+#: ../editors/SFCViewer.py:447
+msgid "Add a new initial step"
+msgstr "Añadir un nuevo Paso Inicial"
+
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
+msgid "Add a new jump"
+msgstr "Añadir un nuevo Salto"
+
+#: ../editors/SFCViewer.py:469
+msgid "Add a new step"
+msgstr "Añadir un nuevo Paso"
+
+#: ../features.py:35
+msgid "Add a simple WxGlade based GUI."
+msgstr "Añadir una Interfaz de usuario simple basada en WxGlade"
+
+#: ../dialogs/ActionBlockDialog.py:143
+msgid "Add action"
+msgstr "Añadir Acción"
+
+#: ../editors/DataTypeEditor.py:364
+msgid "Add element"
+msgstr "Añadir Elemento"
+
+#: ../editors/ResourceEditor.py:283
+msgid "Add instance"
+msgstr "Añadir Instancia"
+
+#: ../canfestival/NetworkEditor.py:110
+msgid "Add slave"
+msgstr "Añadir Esclavo"
+
+#: ../editors/ResourceEditor.py:252
+msgid "Add task"
+msgstr "Añadir Tarea"
+
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
+msgid "Add variable"
+msgstr "Añadir una Variable"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Addition"
+msgstr "Suma"
+
+#: ../plcopen/definitions.py:51
+msgid "Additional function blocks"
+msgstr "Bloques adicionales"
+
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr "Ajustar el tamaño del bloque"
+
+#: ../editors/Viewer.py:1720
+msgid "Alignment"
+msgstr "Alineación"
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
+msgid "All"
+msgstr "Todo"
+
+#: ../editors/FileManagementPanel.py:37
+msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+msgstr "Todos los archivos (*.*)|*.*|Archivos CSV (*.csv)|*.csv"
+
+#: ../ProjectController.py:1670
+msgid "Already connected. Please disconnect\n"
+msgstr "Ya está conectado. Por favor desconecte\n"
+
+#: ../editors/DataTypeEditor.py:607
+#, python-format
+msgid "An element named \"%s\" already exists in this structure!"
+msgstr "¡Ya existe un elemento con el nombre \"%s\" en esta estructura! "
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr "¡Ya existe una instancia con este nombre!"
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr ""
+"Aplicar el cambio de nombre a todos los que siguen con el mismo nombre"
+
+#: ../plcopen/iec_std.csv:31
+msgid "Arc cosine"
+msgstr "Arcocoseno"
+
+#: ../plcopen/iec_std.csv:30
+msgid "Arc sine"
+msgstr "Arcoseno"
+
+#: ../plcopen/iec_std.csv:32
+msgid "Arc tangent"
+msgstr "Arcotangente"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Arithmetic"
+msgstr "Aritméticos"
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
+msgid "Array"
+msgstr "Arreglo"
+
+#: ../plcopen/iec_std.csv:39
+msgid "Assignment"
+msgstr "Asignación"
+
+#: ../dialogs/FBDVariableDialog.py:226
+msgid "At least a variable or an expression must be selected!"
+msgstr "¡Debe seleccionar al menos una variable o expresión!"
+
+#: ../controls/ProjectPropertiesPanel.py:111
+msgid "Author"
+msgstr "Autor"
+
+#: ../controls/ProjectPropertiesPanel.py:108
+msgid "Author Name (optional):"
+msgstr "Nombre del autor (opcional):"
+
+#: ../dialogs/FindInPouDialog.py:80
+msgid "Backward"
+msgstr "Hacia atrás"
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
+#, python-format
+msgid "Bad location size : %s"
+msgstr "Tamaño de la ubicación incorrecto: %s"
+
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
+msgid "Base Type:"
+msgstr "Tipo base:"
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
+msgid "Base Types"
+msgstr "Tipos base"
+
+#: ../BeremizIDE.py:483
+msgid "Beremiz"
+msgstr "Beremiz"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Binary selection (1 of 2)"
+msgstr "Selección binaria (1 de 2)"
+
+#: ../plcopen/iec_std.csv:62
+msgid "Bit-shift"
+msgstr "Intercambio de bits"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise"
+msgstr "A nivel de bits"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise AND"
+msgstr "Y a nivel de bits"
+
+#: ../plcopen/iec_std.csv:67
+msgid "Bitwise OR"
+msgstr "O a nivel de bits"
+
+#: ../plcopen/iec_std.csv:68
+msgid "Bitwise XOR"
+msgstr "O exclusivo a nivel de bits"
+
+#: ../plcopen/iec_std.csv:69
+msgid "Bitwise inverting"
+msgstr "Inversión a nivel de bits"
+
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
+msgid "Block"
+msgstr "Bloque"
+
+#: ../dialogs/FBDBlockDialog.py:63
+msgid "Block Properties"
+msgstr "Propiedades del Bloque"
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr "Nombre del bloque"
+
+#: ../editors/Viewer.py:586
+msgid "Bottom"
+msgstr "Fondo"
+
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr "Roto"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
+msgid "Browse %s values library"
+msgstr "Navegar en la biblioteca de valores %s"
+
+#: ../dialogs/BrowseLocationsDialog.py:72
+msgid "Browse Locations"
+msgstr "Buscar ubicación"
+
+#: ../ProjectController.py:1815
+msgid "Build"
+msgstr "Construir"
+
+#: ../ProjectController.py:1335
+msgid "Build directory already clean\n"
+msgstr "El directorio de contrucción ya esta vacío\n"
+
+#: ../ProjectController.py:1816
+msgid "Build project into build folder"
+msgstr "Construir el proyecto en el directorio de contrución"
+
+#: ../ProjectController.py:1108
+msgid "C Build crashed !\n"
+msgstr "¡La construccion en lenguaje C falló!\n"
+
+#: ../ProjectController.py:1105
+msgid "C Build failed.\n"
+msgstr "La construccion en lenguaje C falló.\n"
+
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr "Código C"
+
+#: ../ProjectController.py:1186
+msgid "C code generated successfully.\n"
+msgstr "El código C fué generado con éxito.\n"
+
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr "Falló la compilación C.\n"
+
+#: ../targets/toolchain_gcc.py:199
+#, python-format
+msgid "C compilation of %s failed.\n"
+msgstr "Falló la compilación C de %s.\n"
+
+#: ../features.py:33
+msgid "C extension"
+msgstr "Extensión lenguaje C"
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr "C&reditos"
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr "Red CANOpen"
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr "Esclavo CANOpen"
+
+#: ../features.py:31
+msgid "CANopen support"
+msgstr "Soporte CANOpen"
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
+msgid "Can only generate execution order on FBD networks!"
+msgstr "¡Solo puede generar orden de ejecución en redes FBD!"
+
+#: ../controls/VariablePanel.py:291
+msgid "Can only give a location to local or global variables"
+msgstr "Solo puede dar una ubicación a variables locales globales "
+
+#: ../PLCOpenEditor.py:318
+#, python-format
+msgid "Can't generate program to file %s!"
+msgstr "¡No se puede generar el programa para el archivo %s! "
+
+#: ../controls/VariablePanel.py:289
+msgid "Can't give a location to a function block instance"
+msgstr "¡No se puede dar una ubicación a una instacia de bloque de funciones!"
+
+#: ../PLCOpenEditor.py:363
+#, python-format
+msgid "Can't save project to file %s!"
+msgstr "¡No se puede salvar el proyecto en el archivo %s!"
+
+#: ../controls/VariablePanel.py:339
+msgid "Can't set an initial value to a function block instance"
+msgstr ""
+"No se puede asignar un valor inicial a una instancia de bloque de funcion"
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr "No se puede crear el hijo {a1} de tipo {a2}"
+
+#: ../ConfigTreeNode.py:454
+#, python-format
+msgid "Cannot find lower free IEC channel than %d\n"
+msgstr "No se puede encontrar un canal IEC libre menor a %d\n"
+
+#: ../connectors/PYRO/__init__.py:139
+msgid "Cannot get PLC status - connection failed.\n"
+msgstr "Falla de conexión - No puedo obtener el estado del PLC\n"
+
+#: ../ProjectController.py:967
+msgid "Cannot open/parse VARIABLES.csv!\n"
+msgstr "¡No puedo abrir o analizar VARIABLES.csv!\n"
+
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+"No se puede asignar el offset de bits para la variable no booleana '{a1}' "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+"¡No se puede transferir mientras el PLC se esta ejecutando! ¿Desea detenerlo"
+" ahora?"
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
+msgid "Case sensitive"
+msgstr "Distingue entre mayúsculas y minúsculas"
+
+#: ../editors/Viewer.py:581
+msgid "Center"
+msgstr "Centrar"
+
+#: ../Beremiz_service.py:276
+msgid "Change IP of interface to bind"
+msgstr "Cambiar la IP de la interfaz para enlazar"
+
+#: ../Beremiz_service.py:275
+msgid "Change Name"
+msgstr "Cambiar Nombre"
+
+#: ../IDEFrame.py:1977
+msgid "Change POU Type To"
+msgstr "Cambiar el tipo de POU a"
+
+#: ../Beremiz_service.py:277
+msgid "Change Port Number"
+msgstr "Cambiar el Número de Puerto"
+
+#: ../Beremiz_service.py:278
+msgid "Change working directory"
+msgstr "Cambiar el directorio de trabajo"
+
+#: ../plcopen/iec_std.csv:81
+msgid "Character string"
+msgstr "Cadena de caracteres"
+
+#: ../svgui/svgui.py:136
+msgid "Choose a SVG file"
+msgstr "Elegir un archivo SVG"
+
+#: ../ProjectController.py:561
+msgid "Choose a directory to save project"
+msgstr "Elija un directorio para salvar el projecto"
+
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
+msgid "Choose a file"
+msgstr "Elija un archivo"
+
+#: ../BeremizIDE.py:900
+msgid "Choose a project"
+msgstr "Elija un archivo"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
+msgid "Choose a value for %s:"
+msgstr "Elija un valor para %s:"
+
+#: ../Beremiz_service.py:333
+msgid "Choose a working directory "
+msgstr "Elija un directorio de trabajo"
+
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr "Elija un directorio vacío para el nuevo proyecto"
+
+#: ../ProjectController.py:468
+msgid "Chosen folder doesn't contain a program. It's not a valid project!"
+msgstr ""
+"El directorio seleccionado no contiene un programa. ¡No es un proyecto "
+"válido!"
+
+#: ../ProjectController.py:435
+msgid "Chosen folder isn't empty. You can't use it for a new project!"
+msgstr ""
+"El directorio seleccionado no esta vacío. ¡No puede ser usado para un "
+"proyecto nuevo!"
+
+#: ../controls/VariablePanel.py:60
+msgid "Class"
+msgstr "Clase"
+
+#: ../controls/VariablePanel.py:472
+msgid "Class Filter:"
+msgstr "Filtro de clase:"
+
+#: ../dialogs/FBDVariableDialog.py:74
+msgid "Class:"
+msgstr "Clase:"
+
+#: ../ProjectController.py:1821
+msgid "Clean"
+msgstr "Limpiar"
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr "Limpiar el registro de mensajes"
+
+#: ../ProjectController.py:1822
+msgid "Clean project build folder"
+msgstr "Limpiar la carpeta de construcción del proyecto"
+
+#: ../ProjectController.py:1332
+msgid "Cleaning the build directory\n"
+msgstr "Limpiando el directorio de construcción\n"
+
+#: ../IDEFrame.py:437
+msgid "Clear Errors"
+msgstr "Borrar errores"
+
+#: ../editors/Viewer.py:680
+msgid "Clear Execution Order"
+msgstr "Borrar el Orden de Ejecusión"
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr "Cerrar"
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
+msgid "Close Application"
+msgstr "Cerrar Aplicación"
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
+msgid "Close Project"
+msgstr "Cerrar Proyecto"
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
+msgid "Close Tab"
+msgstr "Cerrar Pestaña"
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
+msgid "Coil"
+msgstr "Bobina"
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
+msgid "Comment"
+msgstr "Comentario"
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr "Soporte de la comunidad"
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr "Nombre de empresa"
+
+#: ../controls/ProjectPropertiesPanel.py:106
+msgid "Company Name (required):"
+msgstr "Nombre de empresa (requerido):"
+
+#: ../controls/ProjectPropertiesPanel.py:107
+msgid "Company URL (optional):"
+msgstr "Página web (opcional):"
+
+#: ../plcopen/iec_std.csv:75
+msgid "Comparison"
+msgstr "Comparación"
+
+#: ../ProjectController.py:756
+msgid "Compiling IEC Program into C code...\n"
+msgstr "Compilando el programa IEC en código C...\n"
+
+#: ../plcopen/iec_std.csv:85
+msgid "Concatenation"
+msgstr "Concatenación"
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr "Config"
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr "Variables de Configuración"
+
+#: ../dialogs/SearchInProjectDialog.py:43
+msgid "Configuration"
+msgstr "Configuración"
+
+#: ../plcopen/types_enums.py:77
+msgid "Configurations"
+msgstr "Configuraciones"
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr "Confirme en cambio de nombre de la variable"
+
+#: ../ProjectController.py:1842
+msgid "Connect"
+msgstr "Conectar"
+
+#: ../ProjectController.py:1843
+msgid "Connect to the target PLC"
+msgstr "Conectar el PLC de destino"
+
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr "Conectado a la URI: %s"
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
+msgid "Connection"
+msgstr "Conexión"
+
+#: ../dialogs/ConnectionDialog.py:55
+msgid "Connection Properties"
+msgstr "Propiedades de la conexión"
+
+#: ../ProjectController.py:1691
+msgid "Connection canceled!\n"
+msgstr "¡Conexión cancelada!\n"
+
+#: ../ProjectController.py:1714
+#, python-format
+msgid "Connection failed to %s!\n"
+msgstr "¡La conexión con %s falló!\n"
+
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr "¡Conexión perdida!\n"
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
+msgid "Connection to '%s' failed.\n"
+msgstr "¡La conexión con '%s' falló!\n"
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
+msgid "Connector"
+msgstr "Conector"
+
+#: ../dialogs/SFCStepDialog.py:68
+msgid "Connectors:"
+msgstr "Conectores:"
+
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr "Consola"
+
+#: ../controls/VariablePanel.py:75
+msgid "Constant"
+msgstr "Constante"
+
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
+msgid "Contact"
+msgstr "Contacto"
+
+#: ../controls/ProjectPropertiesPanel.py:217
+msgid "Content Description (optional):"
+msgstr "Descripción del contenido (opcional):"
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
+msgid "Continuation"
+msgstr "Continuación"
+
+#: ../plcopen/iec_std.csv:18
+msgid "Conversion from BCD"
+msgstr "Conversión desde BCD"
+
+#: ../plcopen/iec_std.csv:19
+msgid "Conversion to BCD"
+msgstr "Conversión a BCD"
+
+#: ../plcopen/iec_std.csv:21
+msgid "Conversion to date"
+msgstr "Conversión a fecha"
+
+#: ../plcopen/iec_std.csv:20
+msgid "Conversion to time-of-day"
+msgstr "Conversión a hora-del-día"
+
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
+msgid "Copy"
+msgstr "Copiar"
+
+#: ../IDEFrame.py:1964
+msgid "Copy POU"
+msgstr "Copiar POU"
+
+#: ../editors/FileManagementPanel.py:68
+msgid "Copy file from left folder to right"
+msgstr "Copiar el archivo de la carpeta de la izquierda a la derecha"
+
+#: ../editors/FileManagementPanel.py:67
+msgid "Copy file from right folder to left"
+msgstr "Copiar el archivo de la carpeta de la derecha a la izquierda "
+
+#: ../plcopen/iec_std.csv:28
+msgid "Cosine"
+msgstr "Coseno"
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+"No se pudo añadir el hijo \"{a1}\", tipo {a2}:\n"
+"{a3}\n"
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr "No se pudo importar el archivo viejo %s."
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"No se pudieron cargar los siguientes parámetros base del confnode {a1}:\n"
+"{a2}"
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"No se pudieron cargar los siguientes parámetros del confnode {a1}:\n"
+"{a2}"
+
+#: ../PLCControler.py:552
+msgid "Couldn't paste non-POU object."
+msgstr "No puede pegar un objeto distinto a un POU "
+
+#: ../ProjectController.py:1636
+msgid "Couldn't start PLC !\n"
+msgstr "¡No se pudo iniciar el PLC!\n"
+
+#: ../ProjectController.py:1644
+msgid "Couldn't stop PLC !\n"
+msgstr "¡No se pudo detener el PLC!\n"
+
+#: ../svgui/svgui.py:57
+msgid "Create HMI"
+msgstr "Crear un HMI"
+
+#: ../dialogs/PouDialog.py:54
+msgid "Create a new POU"
+msgstr "Crear un nuevo POU"
+
+#: ../dialogs/PouActionDialog.py:45
+msgid "Create a new action"
+msgstr "Crear una nueva Acción"
+
+#: ../IDEFrame.py:166
+msgid "Create a new action block"
+msgstr "Crear un nuevo Bloque de Acción"
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
+msgid "Create a new block"
+msgstr "Crear un nuevo Bloque"
+
+#: ../IDEFrame.py:139
+msgid "Create a new branch"
+msgstr "Crear una nueva rama"
+
+#: ../IDEFrame.py:133
+msgid "Create a new coil"
+msgstr "Crear una nueva bobina"
+
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
+msgid "Create a new comment"
+msgstr "Crear un nuevo comentario"
+
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
+msgid "Create a new connection"
+msgstr "Crear una nueva conexión"
+
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
+msgid "Create a new contact"
+msgstr "Crear un nuevo contacto"
+
+#: ../IDEFrame.py:169
+msgid "Create a new divergence"
+msgstr "Crear una nueva divergencia"
+
+#: ../dialogs/SFCDivergenceDialog.py:54
+msgid "Create a new divergence or convergence"
+msgstr "Crear una nueva divergencia o convergencia"
+
+#: ../IDEFrame.py:157
+msgid "Create a new initial step"
+msgstr "Crear un nuevo Paso inicial"
+
+#: ../IDEFrame.py:172
+msgid "Create a new jump"
+msgstr "Crear un nuevo salto"
+
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
+msgid "Create a new power rail"
+msgstr "Crear un nuevo carril de potencia"
+
+#: ../IDEFrame.py:130
+msgid "Create a new rung"
+msgstr "Crear un nuevo escalón"
+
+#: ../IDEFrame.py:160
+msgid "Create a new step"
+msgstr "Crear un nuevo paso"
+
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
+msgid "Create a new transition"
+msgstr "Crear una nueva transición"
+
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
+msgid "Create a new variable"
+msgstr "Crear una nueva variable"
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr "Créditos"
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr "Directorio de trabajo actual:"
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
+msgid "Cut"
+msgstr "Cortar"
+
+#: ../editors/ResourceEditor.py:81
+msgid "Cyclic"
+msgstr "Cíclico"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:60
+msgid "DEPRECATED"
+msgstr "OBSOLETO"
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
+msgid "DS-301 Profile"
+msgstr "Perfil DS-301"
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
+msgid "DS-302 Profile"
+msgstr "Perfil DS-302"
+
+#: ../dialogs/SearchInProjectDialog.py:39
+msgid "Data Type"
+msgstr "Tipo de dato"
+
+#: ../plcopen/types_enums.py:76
+msgid "Data Types"
+msgstr "Tipos de datos"
+
+#: ../plcopen/iec_std.csv:16
+msgid "Data type conversion"
+msgstr "Cambio de tipo de datos"
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
+msgid "Date addition"
+msgstr "Suma de fechas"
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
+msgid "Date and time subtraction"
+msgstr "Resta de Fecha y Hora"
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
+msgid "Date subtraction"
+msgstr "Resta de Fechas"
+
+#: ../dialogs/DurationEditorDialog.py:46
+msgid "Days:"
+msgstr "Días:"
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr ""
+"La depuración no coincide con el PLC: Detenga / transfiera / inicie para "
+"volver a habilitar\n"
+
+#: ../controls/PouInstanceVariablesPanel.py:144
+msgid "Debug instance"
+msgstr "Instancia de depuración"
+
+#: ../editors/Viewer.py:490
+#, python-format
+msgid "Debug: %s"
+msgstr "Depuración: %s"
+
+#: ../ProjectController.py:1471
+#, python-format
+msgid "Debug: Unknown variable '%s'\n"
+msgstr "Depuración: La variable '%s' es desconocida\n"
+
+#: ../ProjectController.py:1469
+#, python-format
+msgid "Debug: Unsupported type to debug '%s'\n"
+msgstr "Depuración: El tipo '%s' no es soportado por el depurador\n"
+
+#: ../IDEFrame.py:660
+msgid "Debugger"
+msgstr "Depurador"
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr "Depurador listo\n"
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
+msgid "Delete"
+msgstr "Borrar"
+
+#: ../editors/Viewer.py:610
+msgid "Delete Divergence Branch"
+msgstr "Borrar Rama de Divergencia"
+
+#: ../editors/FileManagementPanel.py:157
+msgid "Delete File"
+msgstr "Borrar Archivo"
+
+#: ../editors/Viewer.py:597
+msgid "Delete Wire Segment"
+msgstr "Borrar Segmento de Cableado"
+
+#: ../controls/CustomEditableListBox.py:44
+msgid "Delete item"
+msgstr "Borrar Elemento"
+
+#: ../plcopen/iec_std.csv:88
+msgid "Deletion (within)"
+msgstr "Borrar (interno)"
+
+#: ../editors/DataTypeEditor.py:161
+msgid "Derivation Type:"
+msgstr "Tipo de Derivación:"
+
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr "Descripción"
+
+#: ../controls/VariablePanel.py:463
+msgid "Description:"
+msgstr "Descripción:"
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
+msgid "Dimensions:"
+msgstr "Dimensiones:"
+
+#: ../dialogs/FindInPouDialog.py:69
+msgid "Direction"
+msgstr "Dirección"
+
+#: ../dialogs/BrowseLocationsDialog.py:102
+msgid "Direction:"
+msgstr "Dirección:"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Directly"
+msgstr "Directamente"
+
+#: ../ProjectController.py:1855
+msgid "Disconnect"
+msgstr "Desconectar"
+
+#: ../ProjectController.py:1856
+msgid "Disconnect from PLC"
+msgstr "Desconectar del PLC"
+
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr "Desconectado"
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
+msgid "Divergence"
+msgstr "Divergencia"
+
+#: ../plcopen/iec_std.csv:36
+msgid "Division"
+msgstr "División"
+
+#: ../editors/FileManagementPanel.py:156
+#, python-format
+msgid "Do you really want to delete the file '%s'?"
+msgstr "¿Realmente desea borrar el archivo '%s'?"
+
+#: ../controls/VariablePanel.py:65
+msgid "Documentation"
+msgstr "Documentación"
+
+#: ../PLCOpenEditor.py:312
+msgid "Done"
+msgstr "Listo"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Duration"
+msgstr "Duración"
+
+#: ../canfestival/canfestival.py:174
+msgid "EDS files (*.eds)|*.eds|All files|*.*"
+msgstr "Archivos EDS (*.eds)|*.eds|Todos los archivos|*.*"
+
+#: ../editors/Viewer.py:668
+msgid "Edit Block"
+msgstr "Editar Bloque"
+
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr "Editar Bobina"
+
+#: ../dialogs/LDElementDialog.py:56
+msgid "Edit Contact Values"
+msgstr "Editar Contacto"
+
+#: ../dialogs/DurationEditorDialog.py:62
+msgid "Edit Duration"
+msgstr "Editar Duración"
+
+#: ../dialogs/SFCStepDialog.py:53
+msgid "Edit Step"
+msgstr "Editar Paso"
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
+msgid "Edit a WxWidgets GUI with WXGlade"
+msgstr "Editar un WxWidgets GUI con WXGlade"
+
+#: ../dialogs/ActionBlockDialog.py:127
+msgid "Edit action block properties"
+msgstr "Editar Bloque de Acción"
+
+#: ../dialogs/ArrayTypeDialog.py:47
+msgid "Edit array type properties"
+msgstr "Editar Matriz"
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
+msgid "Edit comment"
+msgstr "Editar Comentario"
+
+#: ../editors/FileManagementPanel.py:69
+msgid "Edit file"
+msgstr "Editar archivo"
+
+#: ../controls/CustomEditableListBox.py:42
+msgid "Edit item"
+msgstr "Editar item"
+
+#: ../editors/Viewer.py:3059
+msgid "Edit jump target"
+msgstr "Editar Destino del Salto"
+
+#: ../ProjectController.py:1873
+msgid "Edit raw IEC code added to code generated by PLCGenerator"
+msgstr "Editar el código IEC añadido al codigo generado por PLCGenerator "
+
+#: ../editors/SFCViewer.py:815
+msgid "Edit step name"
+msgstr "Editar el nombre del paso"
+
+#: ../dialogs/SFCTransitionDialog.py:53
+msgid "Edit transition"
+msgstr "Editar transición"
+
+#: ../IDEFrame.py:632
+msgid "Editor ToolBar"
+msgstr "Barra de Herramienta Editor"
+
+#: ../ProjectController.py:1294
+msgid "Editor selection"
+msgstr "Selección del Editor"
+
+#: ../editors/DataTypeEditor.py:360
+msgid "Elements :"
+msgstr "Elementos:"
+
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr "Vacío"
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr "Las dimensiones no pueden estar vacías."
+
+#: ../Beremiz_service.py:341
+msgid "Enter a name "
+msgstr "Ingrese un nombre"
+
+#: ../Beremiz_service.py:326
+msgid "Enter a port number "
+msgstr "Ingrese un número de puerto"
+
+#: ../Beremiz_service.py:317
+msgid "Enter the IP of the interface to bind"
+msgstr "Escriba la dirección IP de la interfaz a enlazar"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Enumerated"
+msgstr "Enumerado"
+
+#: ../plcopen/iec_std.csv:77
+msgid "Equal to"
+msgstr "Igual a"
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
+msgid "Error"
+msgstr "Error"
+
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+"Error: ¡Debe declarar en el PLC, al menos una configuración y un recurso!\n"
+
+#: ../ProjectController.py:803
+#, python-format
+msgid "Error : IEC to C compiler returned %d\n"
+msgstr "Error: El compilador de IEC a C retorno %d\n"
+
+#: ../ProjectController.py:731
+#, python-format
+msgid ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+msgstr ""
+"Error en el generador de código ST/IL/SFC:\n"
+"%s\n"
+
+#: ../ConfigTreeNode.py:219
+#, python-format
+msgid "Error while saving \"%s\"\n"
+msgstr "Error al guardar \"%s\"\n"
+
+#: ../canfestival/canfestival.py:179
+msgid "Error: Export slave failed\n"
+msgstr "Error: Error al exportar el esclavo\n"
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+"Error: Error: Los servidores Modbus/IP %{a1}.x y %{a2}.x usan el mismo "
+"numero de puerto {a3}.\n"
+
+#: ../canfestival/canfestival.py:388
+msgid "Error: No Master generated\n"
+msgstr "Error: No se genera el Maestro\n"
+
+#: ../canfestival/canfestival.py:383
+msgid "Error: No PLC built\n"
+msgstr "Error: No se construyó el PLC\n"
+
+#: ../ProjectController.py:1708
+#, python-format
+msgid "Exception while connecting %s!\n"
+msgstr "¡Ocurrió una excepción conectando %s!\n"
+
+#: ../dialogs/FBDBlockDialog.py:123
+msgid "Execution Control:"
+msgstr "Control de ejecusión:"
+
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
+msgid "Execution Order:"
+msgstr "Orden de Ejecusión:"
+
+#: ../features.py:36
+msgid "Experimental web based HMI"
+msgstr "HMI experimental basada en web"
+
+#: ../plcopen/iec_std.csv:38
+msgid "Exponent"
+msgstr "Exponente"
+
+#: ../plcopen/iec_std.csv:26
+msgid "Exponentiation"
+msgstr "Exponenciación"
+
+#: ../canfestival/canfestival.py:186
+msgid "Export CanOpen slave to EDS file"
+msgstr "Exportar el esclavo CanOpen a un archivo EDS"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
+msgid "Export graph values to clipboard"
+msgstr "Exportar los valores del gráfico al portapapeles"
+
+#: ../canfestival/canfestival.py:185
+msgid "Export slave"
+msgstr "Exportar esclavo"
+
+#: ../dialogs/FBDVariableDialog.py:94
+msgid "Expression:"
+msgstr "Expresión:"
+
+#: ../controls/VariablePanel.py:90
+msgid "External"
+msgstr "Externa"
+
+#: ../ProjectController.py:826
+msgid "Extracting Located Variables...\n"
+msgstr "Extrayendo variables locales...\n"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "FBD"
+msgstr "FBD"
+
+#: ../ProjectController.py:1773
+msgid "Failed : Must build before transfer.\n"
+msgstr "Error: Debe construir el proyecto antes de la trasferencia.\n"
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
+msgid "Falling Edge"
+msgstr "Flanco descendente"
+
+#: ../ProjectController.py:1098
+msgid "Fatal : cannot get builder.\n"
+msgstr "Error: No se puede obtener el constructor.\n"
+
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr "Buscando %s"
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
+msgid "Field %s hasn't a valid value!"
+msgstr "¡El valor en el campo %s no es válido!"
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
+msgid "Fields %s haven't a valid value!"
+msgstr "¡Los valores en los campos %s no son válidos!"
+
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr "¡El archivo '%s' ya existe!"
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
+msgid "Find"
+msgstr "Buscar"
+
+#: ../IDEFrame.py:379
+msgid "Find Next"
+msgstr "Buscar el siguiente"
+
+#: ../IDEFrame.py:381
+msgid "Find Previous"
+msgstr "Buscar el anterior"
+
+#: ../plcopen/iec_std.csv:90
+msgid "Find position"
+msgstr "Buscar una posición"
+
+#: ../dialogs/FindInPouDialog.py:58
+msgid "Find:"
+msgstr "Buscar:"
+
+#: ../editors/Viewer.py:1633
+msgid "Force value"
+msgstr "Forzar el valor"
+
+#: ../dialogs/ForceVariableDialog.py:176
+msgid "Forcing Variable Value"
+msgstr "Forzar el valor de la variable"
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
+#, python-format
+msgid "Form isn't complete. %s must be filled!"
+msgstr "El formulario no esta completo. ¡Debe llenar %s!"
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
+msgid "Form isn't complete. Name must be filled!"
+msgstr "¡El formulario no esta completo. Debe especificar un nombre!"
+
+#: ../dialogs/FBDBlockDialog.py:235
+msgid "Form isn't complete. Valid block type must be selected!"
+msgstr ""
+"¡El formulario no esta completo. Debe selecccionar un tipo de bloque válido!"
+
+#: ../dialogs/FindInPouDialog.py:75
+msgid "Forward"
+msgstr "Adelante"
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
+msgid "Function"
+msgstr "Función"
+
+#: ../IDEFrame.py:354
+msgid "Function &Block"
+msgstr "&Bloque de Función"
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
+msgid "Function Block"
+msgstr "Bloque de Función"
+
+#: ../controls/VariablePanel.py:868
+msgid "Function Block Types"
+msgstr "Tipos de Bloque de Función"
+
+#: ../plcopen/types_enums.py:75
+msgid "Function Blocks"
+msgstr "Bloques de Función"
+
+#: ../editors/Viewer.py:290
+msgid "Function Blocks can't be used in Functions!"
+msgstr "¡Los Bloques de Función no se pueden usar en las Funciones!"
+
+#: ../PLCControler.py:1907
+#, python-format
+msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+msgstr "¡El Bloque de Función \"%s\" no se pueden pegar en una Función!"
+
+#: ../plcopen/types_enums.py:75
+msgid "Functions"
+msgstr "Funciones"
+
+#: ../PLCOpenEditor.py:88
+msgid "Generate Program"
+msgstr "Generar Programa"
+
+#: ../ProjectController.py:722
+msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+msgstr "Generando el código ST/IL/SFC IEC-61131  para el SoftPLC...\n"
+
+#: ../controls/VariablePanel.py:91
+msgid "Global"
+msgstr "Global"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
+msgid "Go to current value"
+msgstr "Ir al valor actual"
+
+#: ../controls/ProjectPropertiesPanel.py:189
+msgid "Graphics"
+msgstr "Gráficos"
+
+#: ../plcopen/iec_std.csv:75
+msgid "Greater than"
+msgstr "Mayor que"
+
+#: ../plcopen/iec_std.csv:76
+msgid "Greater than or equal to"
+msgstr "Mayor o igual a"
+
+#: ../controls/ProjectPropertiesPanel.py:149
+msgid "Grid Resolution:"
+msgstr "Resolución de la maya:"
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr "Puerto de interfaz HTTP:"
+
+#: ../controls/ProjectPropertiesPanel.py:135
+msgid "Height:"
+msgstr "Altura:"
+
+#: ../editors/FileManagementPanel.py:89
+msgid "Home Directory:"
+msgstr "DIrectorio de inicio:"
+
+#: ../controls/ProjectPropertiesPanel.py:165
+msgid "Horizontal:"
+msgstr "Horizontal:"
+
+#: ../dialogs/DurationEditorDialog.py:47
+msgid "Hours:"
+msgstr "Horas:"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "IL"
+msgstr "IL"
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr "IP"
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
+msgid "IP is not valid!"
+msgstr "¡La dirección IP no es válida!"
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
+msgid "Import SVG"
+msgstr "Importar SVG"
+
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
+msgid "InOut"
+msgstr "EntradaSalida"
+
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+"La variable de tipo InOut {a1} en el bloque {a2} del POU {a3} debe estar "
+"conectada."
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr "inactivo"
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr "Tipo de dato incompatible entre \"{a1}\" y \"{a2}\""
+
+#: ../controls/VariablePanel.py:306
+#, python-format
+msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+msgstr "Tamaño de dato incompatible entre \"%s\" y \"BOOL\""
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr "Tamaño de dato incompatible entre \"{a1}\" y \"{a2}\""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Indicator"
+msgstr "Indicador"
+
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr "Inicial"
+
+#: ../editors/Viewer.py:650
+msgid "Initial Step"
+msgstr "Paso Inicial"
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
+msgid "Initial Value"
+msgstr "Valor Inicial"
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
+msgid "Initial Value:"
+msgstr "Valor Inicial:"
+
+#: ../svgui/svgui.py:56
+msgid "Inkscape"
+msgstr "InkScape"
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
+msgid "Inline"
+msgstr "En línea"
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Input"
+msgstr "Entrada"
+
+#: ../dialogs/FBDBlockDialog.py:99
+msgid "Inputs:"
+msgstr "Entradas"
+
+#: ../plcopen/iec_std.csv:87
+msgid "Insertion (into)"
+msgstr "Insertar (cadena)"
+
+#: ../plcopen/plcopen.py:1948
+#, python-format
+msgid "Instance with id %d doesn't exist!"
+msgstr "¡No existe una instancia con ID %d!"
+
+#: ../editors/ResourceEditor.py:279
+msgid "Instances:"
+msgstr "Instancias:"
+
+#: ../controls/VariablePanel.py:88
+msgid "Interface"
+msgstr "Interface"
+
+#: ../editors/ResourceEditor.py:81
+msgid "Interrupt"
+msgstr "Interrumpir"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Interval"
+msgstr "Intervalo"
+
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr "¡La URL no es correcta! Por favor, ingrese una dirección  URL válida."
+
+#: ../PLCControler.py:1895
+msgid "Invalid plcopen element(s)!!!"
+msgstr "Elemento(s) plcopen inválido(s)!"
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr "El tipo \"{a1}\" es inválido para la ubicación \"{a4}\"  -> {a2} != {a3} "
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr "El tipo \"{a1}\" es inválido para la ubicación \"{a4}\" -> {a2} != {a3} "
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
+#, python-format
+msgid "Invalid value \"%s\" for debug variable"
+msgstr "El valor \"%s\" no es válido para la variable de depuración"
+
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
+msgid "Invalid value \"%s\" for variable grid element"
+msgstr "El tipo \"%s\" no es valido para el elemento variable"
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
+#, python-format
+msgid "Invalid value \"%s\" for viewer block"
+msgstr "El tipo \"%s\" no es válido para el bloque de visualización"
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr "¡El valor \"{a1}\" es inválido para la variable \"{a2}\"!"
+
+#: ../dialogs/DurationEditorDialog.py:124
+msgid ""
+"Invalid value!\n"
+"You must fill a numeric value."
+msgstr ""
+"¡Valor inválido!\n"
+"Debe ingresar un valor numérico."
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr "¿La conexión es segura?"
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
+msgid "Jump"
+msgstr "Salto"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "LD"
+msgstr "LD"
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
+#, python-format
+msgid "Ladder element with id %d is on more than one rung."
+msgstr ""
+"El elemento de escalera con el identificador %d se encuentra en mas de un "
+"peldaño."
+
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
+msgid "Language"
+msgstr "Lenguaje"
+
+#: ../controls/ProjectPropertiesPanel.py:206
+msgid "Language (optional):"
+msgstr "Lenguaje (opcional):"
+
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
+msgid "Language:"
+msgstr "Lenguaje:"
+
+#: ../ProjectController.py:1779
+msgid "Latest build already matches current target. Transfering anyway...\n"
+msgstr ""
+"La última versión coincide con la versión descargada. Transfiriendo de todos"
+" modos...\n"
+
+#: ../Beremiz_service.py:281
+msgid "Launch WX GUI inspector"
+msgstr "Inicial el inspector WX GUI"
+
+#: ../Beremiz_service.py:280
+msgid "Launch a live Python shell"
+msgstr "Iniciar un shell Python en vivo"
+
+#: ../editors/Viewer.py:580
+msgid "Left"
+msgstr "Izquierda"
+
+#: ../dialogs/LDPowerRailDialog.py:64
+msgid "Left PowerRail"
+msgstr "Línea de energía Izquierda"
+
+#: ../plcopen/iec_std.csv:81
+msgid "Length of string"
+msgstr "Largo de la cadena"
+
+#: ../plcopen/iec_std.csv:78
+msgid "Less than"
+msgstr "Menor que"
+
+#: ../plcopen/iec_std.csv:79
+msgid "Less than or equal to"
+msgstr "Menor o igual a"
+
+#: ../IDEFrame.py:652
+msgid "Library"
+msgstr "Librería"
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr "Licencia"
+
+#: ../plcopen/iec_std.csv:73
+msgid "Limitation"
+msgstr "Límite"
+
+#: ../targets/toolchain_gcc.py:209
+msgid "Linking :\n"
+msgstr "Enlace:\n"
+
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
+msgid "Local"
+msgstr "Local"
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr "Entradas locales"
+
+#: ../ProjectController.py:1685
+msgid "Local service discovery failed!\n"
+msgstr "¡La busqueda de servicios locales falló!\n"
+
+#: ../controls/VariablePanel.py:62
+msgid "Location"
+msgstr "Ubicación"
+
+#: ../dialogs/BrowseLocationsDialog.py:79
+msgid "Locations available:"
+msgstr "Ubicaciones disponibles:"
+
+#: ../plcopen/iec_std.csv:25
+msgid "Logarithm to base 10"
+msgstr "Logaritmo en base 10"
+
+#: ../connectors/PYRO/__init__.py:102
+#, python-format
+msgid "MDNS resolution failure for '%s'\n"
+msgstr "Fallo de resolución MDNS para '%s\"\n"
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
+msgid "Map Variable"
+msgstr "Asignar Variable"
+
+#: ../features.py:31
+msgid "Map located variables over CANopen"
+msgstr "Asignar la variable ubicada sobre CANOpen"
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr "Variable mapeadas sobre Modbus "
+
+#: ../canfestival/NetworkEditor.py:113
+msgid "Master"
+msgstr "Maestro"
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr "Se alcanzó la cuenta máxima ({a1}) para el confnode de tipo {a2} "
+
+#: ../plcopen/iec_std.csv:71
+msgid "Maximum"
+msgstr "Máximo"
+
+#: ../editors/DataTypeEditor.py:246
+msgid "Maximum:"
+msgstr "Máximo:"
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Memory"
+msgstr "Memoria"
+
+#: ../IDEFrame.py:617
+msgid "Menu ToolBar"
+msgstr "Menú de la barra de herramientas"
+
+#: ../dialogs/DurationEditorDialog.py:51
+msgid "Microseconds:"
+msgstr "Microsegundos:"
+
+#: ../editors/Viewer.py:585
+msgid "Middle"
+msgstr "Medio"
+
+#: ../dialogs/DurationEditorDialog.py:50
+msgid "Milliseconds:"
+msgstr "Milisegundos:"
+
+#: ../plcopen/iec_std.csv:72
+msgid "Minimum"
+msgstr "Mínimo"
+
+#: ../editors/DataTypeEditor.py:233
+msgid "Minimum:"
+msgstr "Mínimo:"
+
+#: ../dialogs/DurationEditorDialog.py:48
+msgid "Minutes:"
+msgstr "Minutos:"
+
+#: ../controls/ProjectPropertiesPanel.py:231
+msgid "Miscellaneous"
+msgstr " Misceláneo"
+
+#: ../features.py:32
+msgid "Modbus support"
+msgstr "Soporte Mdbus"
+
+#: ../dialogs/LDElementDialog.py:65
+msgid "Modifier:"
+msgstr "Modificador:"
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+"Se encontró más de un conector correspondiente a la continuación \"{a1}\" en"
+" la POU \"{a2}\""
+
+#: ../dialogs/ActionBlockDialog.py:146
+msgid "Move action down"
+msgstr "Mover la acción hacia abajo"
+
+#: ../dialogs/ActionBlockDialog.py:145
+msgid "Move action up"
+msgstr "Mover la acción hacia arriba"
+
+#: ../controls/CustomEditableListBox.py:46
+msgid "Move down"
+msgstr "Mover hacia abajo"
+
+#: ../editors/DataTypeEditor.py:367
+msgid "Move element down"
+msgstr "Mover el elemento hacia abajo"
+
+#: ../editors/DataTypeEditor.py:366
+msgid "Move element up"
+msgstr "Mover el elemento hacia arriba"
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr "Mover la instancia hacia abajo"
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr "Mover la instacia hacia arriba"
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr "Mover la tarea hacia abajo"
+
+#: ../editors/ResourceEditor.py:254
+msgid "Move task up"
+msgstr "Mover la tarea hacia arriba"
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
+msgid "Move the view"
+msgstr "Mover la vista"
+
+#: ../controls/CustomEditableListBox.py:45
+msgid "Move up"
+msgstr "Mover hacia arriba"
+
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
+msgid "Move variable down"
+msgstr "Mover la variable hacia abajo"
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
+msgid "Move variable up"
+msgstr "Mover la variable hacia arriba"
+
+#: ../plcopen/iec_std.csv:74
+msgid "Multiplexer (select 1 of N)"
+msgstr "Multiplexor (seleccionar 1 de N)"
+
+#: ../plcopen/iec_std.csv:34
+msgid "Multiplication"
+msgstr "Multiplicación"
+
+#: ../editors/FileManagementPanel.py:87
+msgid "My Computer:"
+msgstr "Mi computador:"
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr "NOMBRE"
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
+#: ../controls/VariablePanel.py:59
+msgid "Name"
+msgstr "Nombre"
+
+#: ../Beremiz_service.py:342
+msgid "Name must not be null!"
+msgstr "¡El nombre no debe ser nulo!"
+
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
+msgid "Name:"
+msgstr "Nombre:"
+
+#: ../plcopen/iec_std.csv:24
+msgid "Natural logarithm"
+msgstr "Logaritmo Natural"
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
+msgid "Negated"
+msgstr "Negado"
+
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr "El servicio Web Nevow falló."
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr "La importación Nevow/Athena falló:"
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
+msgid "New"
+msgstr "Nuevo"
+
+#: ../controls/CustomEditableListBox.py:43
+msgid "New item"
+msgstr "Nuevo elemento"
+
+#: ../editors/Viewer.py:553
+msgid "No Modifier"
+msgstr "Sin modificador"
+
+#: ../ProjectController.py:1808
+msgid "No PLC to transfer (did build succeed ?)\n"
+msgstr "No hay PLC para transferir (¿La construcción tuvo éxito?)\n"
+
+#: ../PLCGenerator.py:1678
+#, python-format
+msgid "No body defined in \"%s\" POU"
+msgstr "No hay ningún cuerpo definido en el POU \"%s\""
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr ""
+"No se encontró un conector correspondiente a la continuación \"{a1}\" en la "
+"POU \"{a2}\""
+
+#: ../PLCOpenEditor.py:331
+msgid ""
+"No documentation available.\n"
+"Coming soon."
+msgstr ""
+"No hay documentación disponible.\n"
+"Próximamente."
+
+#: ../PLCGenerator.py:841
+#, python-format
+msgid "No informations found for \"%s\" block"
+msgstr "No se encontró información para el bloque \"%s\""
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+"No se encontró una salida de salida {a1} en el bloque {a2} del POU {a3}. La "
+"conexión debe estar rota"
+
+#: ../controls/SearchResultPanel.py:175
+msgid "No search results available."
+msgstr "No hay resultados de búsqueda disponibles."
+
+#: ../svgui/svgui.py:142
+#, python-format
+msgid "No such SVG file: %s\n"
+msgstr "No existe el archivo SVG: %s\n"
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr "No existe el indice/subindice ({a1},{a2}) (variable {a3})"
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr ""
+"No existe el indice/subindice ({a1},{a2}) en elID: {a3} (variable {a4})"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+msgid "No valid value selected!"
+msgstr "¡No se ha seleccionado un valor válido!"
+
+#: ../PLCGenerator.py:1676
+#, python-format
+msgid "No variable defined in \"%s\" POU"
+msgstr "No se ha definido ninguna variable en el POU \"%s\""
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr "ID de nodo no existente: {a1} (variable {a2})"
+
+#: ../controls/VariablePanel.py:79
+msgid "Non-Retain"
+msgstr "No-Retener"
+
+#: ../dialogs/LDElementDialog.py:78
+msgid "Normal"
+msgstr "Normal"
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+"Variable no asignable de PDO: '{a1}' (ID: {a2}, Idx: {a3}, sIdx: {a4}))"
+
+#: ../plcopen/iec_std.csv:80
+msgid "Not equal to"
+msgstr "Diferente de"
+
+#: ../dialogs/SFCDivergenceDialog.py:91
+msgid "Number of sequences:"
+msgstr "Número de secuencias:"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Numerical"
+msgstr "Numéricos"
+
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr "OnChange"
+
+#: ../dialogs/SearchInProjectDialog.py:88
+msgid "Only Elements"
+msgstr "Solo Elementos"
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
+msgid "Open"
+msgstr "Abrir"
+
+#: ../svgui/svgui.py:151
+msgid "Open Inkscape"
+msgstr "Abrir Inkscape"
+
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+"Sistema para Automatización de código abierto que implementa un  un PLC "
+"flexible y un entorno de desarrollo con todos los elementos de la IEC 61131 "
+"y un conjunto de extensiones en constante crecimiento."
+
+#: ../ProjectController.py:1879
+msgid "Open a file explorer to manage project files"
+msgstr ""
+"Abra un explorador de archivos para administrar los archivos del proyecto"
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
+msgid "Open wxGlade"
+msgstr "Abrir wxGlade"
+
+#: ../controls/VariablePanel.py:64
+msgid "Option"
+msgstr "Opción"
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
+msgid "Options"
+msgstr "Opciones"
+
+#: ../controls/ProjectPropertiesPanel.py:109
+msgid "Organization (optional):"
+msgstr "Organización (opcional):"
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
+msgid "Other Profile"
+msgstr "Otro pérfil"
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Output"
+msgstr "Salida"
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
+msgid "PDO Receive"
+msgstr "Recepción PDO"
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
+msgid "PDO Transmit"
+msgstr "Transmisión PDO"
+
+#: ../targets/toolchain_gcc.py:174
+msgid "PLC :\n"
+msgstr "PLC:\n"
+
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr "Registro del PLC"
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr "¡Falló la generación del código del PLC!\n"
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr "El PLC está vacío o ya fue iniciado."
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr "El PLC no esta iniciado."
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+"Error de sintaxis del PLC en la línea {a1}:\n"
+"{a2}"
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
+msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
+msgstr "Archivos PLCOpen (*.xml)|*.xml|Todos los archivos|*.*"
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
+msgid "PLCOpenEditor"
+msgstr "PLCOpenEditor"
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+"PLCOpenEditor es parte del Proyecto Beremiz.\n"
+"\n"
+"Beremiz es un"
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr "PUERTO"
+
+#: ../dialogs/PouDialog.py:109
+msgid "POU Name"
+msgstr "Nombre de POU"
+
+#: ../dialogs/PouDialog.py:66
+msgid "POU Name:"
+msgstr "Nombre de POU:"
+
+#: ../dialogs/PouDialog.py:111
+msgid "POU Type"
+msgstr "Tipo de POU"
+
+#: ../dialogs/PouDialog.py:73
+msgid "POU Type:"
+msgstr "Tipo de POU:"
+
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr "PYRO se conecta a la URI : %s\n"
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr "PYRO esta usando los certificados en '%s'\n"
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
+msgid "Page Setup"
+msgstr "Configuración de página"
+
+#: ../controls/ProjectPropertiesPanel.py:124
+msgid "Page Size (optional):"
+msgstr "Tamaño de página (opcional):"
+
+#: ../IDEFrame.py:2640
+#, python-format
+msgid "Page: %d"
+msgstr "Página: %d"
+
+#: ../controls/PouInstanceVariablesPanel.py:134
+msgid "Parent instance"
+msgstr "Instancia padre"
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
+msgid "Paste"
+msgstr "Pegar"
+
+#: ../IDEFrame.py:1899
+msgid "Paste POU"
+msgstr "Pegar POU"
+
+#: ../dialogs/SearchInProjectDialog.py:60
+msgid "Pattern to search:"
+msgstr "Patrón de búsqueda:"
+
+#: ../dialogs/LDPowerRailDialog.py:75
+msgid "Pin number:"
+msgstr "Número de PIN:"
+
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
+msgid "Please choose a target"
+msgstr "Por favor elija un destino"
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr "Por favor ingrese un nombre de bloque"
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
+msgid "Please enter comment text"
+msgstr "Por favor ingrese un comentario"
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
+msgid "Please enter step name"
+msgstr "Por favor ingrese el nombre del paso"
+
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr "Por favor ingrese el texto"
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
+msgid "Please enter value for a \"%s\" variable:"
+msgstr "Por favor ingrese un valor para una variable tipo \"%s\":"
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be 0 <= port <= 65535!"
+msgstr "¡El número del puerto debe estar entre 0 y 65535!"
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be an integer!"
+msgstr "¡El número del puerto debe ser un entero!"
+
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
+msgid "Power Rail"
+msgstr "Línea de energía"
+
+#: ../dialogs/LDPowerRailDialog.py:52
+msgid "Power Rail Properties"
+msgstr "Propiedades de la Línea de energía"
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
+msgid "Preview"
+msgstr "Vista previa"
+
+#: ../dialogs/BlockPreviewDialog.py:59
+msgid "Preview:"
+msgstr "Vista previa:"
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
+msgid "Print"
+msgstr "Imprimir"
+
+#: ../IDEFrame.py:1110
+msgid "Print preview"
+msgstr "Vista previa de impresión"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Priority"
+msgstr "Prioridad"
+
+#: ../dialogs/SFCTransitionDialog.py:91
+msgid "Priority:"
+msgstr "Prioridad:"
+
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr "Problema al iniciar el PLC:  error %d"
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr "Nombre del Producto"
+
+#: ../controls/ProjectPropertiesPanel.py:90
+msgid "Product Name (required):"
+msgstr "Nombre del Producto (requerido):"
+
+#: ../controls/ProjectPropertiesPanel.py:92
+msgid "Product Release (optional):"
+msgstr "Lanzamiento del Producto (opcional):"
+
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr "Versión del Producto"
+
+#: ../controls/ProjectPropertiesPanel.py:91
+msgid "Product Version (required):"
+msgstr "Versión del Producto (requerido):"
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
+msgid "Program"
+msgstr "Programa"
+
+#: ../PLCOpenEditor.py:321
+msgid "Program was successfully generated!"
+msgstr "¡El programa fue generado con éxito!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Programs"
+msgstr "Programas"
+
+#: ../editors/Viewer.py:285
+msgid "Programs can't be used by other POUs!"
+msgstr "¡Los programas no pueden ser usados por otros POUs!"
+
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
+msgid "Project"
+msgstr "Proyecto"
+
+#: ../controls/SearchResultPanel.py:180
+#, python-format
+msgid "Project '%s':"
+msgstr "Proyecto '%s':"
+
+#: ../ProjectController.py:1878
+msgid "Project Files"
+msgstr "Archivos del Proyecto"
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr "Nombre del Proyecto"
+
+#: ../controls/ProjectPropertiesPanel.py:88
+msgid "Project Name (required):"
+msgstr "Nombre del Proyecto (requerido):"
+
+#: ../controls/ProjectPropertiesPanel.py:89
+msgid "Project Version (optional):"
+msgstr "Versión del Proyecto (opcional):"
+
+#: ../PLCControler.py:2717
+msgid ""
+"Project file syntax error:\n"
+"\n"
+msgstr ""
+"Error de sintaxis en el archivo del proyecto:\n"
+"\n"
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
+msgid "Project properties"
+msgstr "Propiedades del Proyecto"
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr "El arbol de proyecto no concuerda con confnode.xml {a1}!={a2}"
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr "Propagar Nombre"
+
+#: ../plcopen/types_enums.py:77
+msgid "Properties"
+msgstr "Propiedades"
+
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr "Publicando el servicio en la red local"
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr "Excepción de PYRO: %s\n"
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr "Puerto del objeto Pyro:"
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr "Código Python"
+
+#: ../features.py:34
+msgid "Python file"
+msgstr "Archivo Python"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Qualifier"
+msgstr "Indice"
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
+msgid "Quit"
+msgstr "Salir"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
+msgid "Range:"
+msgstr "Rango:"
+
+#: ../ProjectController.py:1872
+msgid "Raw IEC code"
+msgstr "Código IEC puro"
+
+#: ../BeremizIDE.py:1083
+#, python-format
+msgid "Really delete node '%s'?"
+msgstr "¿Realmente desea borrar el nodo '%s'?"
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr "Dominio:"
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
+msgid "Redo"
+msgstr "Rehacer"
+
+#: ../dialogs/SFCTransitionDialog.py:76
+msgid "Reference"
+msgstr "Referencia"
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
+msgid "Refresh"
+msgstr "Refrescar"
+
+#: ../dialogs/SearchInProjectDialog.py:70
+msgid "Regular expression"
+msgstr "Expresión regular"
+
+#: ../dialogs/FindInPouDialog.py:99
+msgid "Regular expressions"
+msgstr "Expresiones regulares"
+
+#: ../editors/Viewer.py:1636
+msgid "Release value"
+msgstr "Valor de publicación"
+
+#: ../plcopen/iec_std.csv:37
+msgid "Remainder (modulo)"
+msgstr "Resto (módulo)"
+
+#: ../BeremizIDE.py:1084
+#, python-format
+msgid "Remove %s node"
+msgstr "Eliminar el nodo %s"
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr "Eliminar el Tipo de Dato"
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr "Eliminar POU"
+
+#: ../dialogs/ActionBlockDialog.py:144
+msgid "Remove action"
+msgstr "Eliminar Acción"
+
+#: ../editors/DataTypeEditor.py:365
+msgid "Remove element"
+msgstr "Eliminar Elemento"
+
+#: ../editors/FileManagementPanel.py:66
+msgid "Remove file from left folder"
+msgstr "Eliminar una archivo de la carpeta a la izquierda"
+
+#: ../editors/ResourceEditor.py:284
+msgid "Remove instance"
+msgstr "Eliminar una instancia"
+
+#: ../canfestival/NetworkEditor.py:111
+msgid "Remove slave"
+msgstr "Eliminar esclavo"
+
+#: ../editors/ResourceEditor.py:253
+msgid "Remove task"
+msgstr "Eliminar Tarea"
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
+msgid "Remove variable"
+msgstr "Eliminar Variable"
+
+#: ../IDEFrame.py:1979
+msgid "Rename"
+msgstr "Renombrar"
+
+#: ../editors/FileManagementPanel.py:187
+msgid "Replace File"
+msgstr "Reemplazar Archivo"
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr "Reemplazar Cable por Conexiones"
+
+#: ../plcopen/iec_std.csv:89
+msgid "Replacement (within)"
+msgstr "Reemplazo (interno)"
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Reset"
+msgstr "Reiniciar"
+
+#: ../editors/Viewer.py:681
+msgid "Reset Execution Order"
+msgstr "Reiniciar el Orden de Ejecusión"
+
+#: ../IDEFrame.py:453
+msgid "Reset Perspective"
+msgstr "Restablecer perspectiva"
+
+#: ../controls/SearchResultPanel.py:103
+msgid "Reset search result"
+msgstr "Reiniciar los resultados de la busqueda"
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
+msgid "Resources"
+msgstr "Recursos"
+
+#: ../controls/VariablePanel.py:77
+msgid "Retain"
+msgstr "Retener"
+
+#: ../controls/VariablePanel.py:455
+msgid "Return Type:"
+msgstr "Tipo de retorno:"
+
+#: ../editors/Viewer.py:582
+msgid "Right"
+msgstr "Derecha"
+
+#: ../dialogs/LDPowerRailDialog.py:65
+msgid "Right PowerRail"
+msgstr "Línea de energía Derecha"
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
+msgid "Rising Edge"
+msgstr "Flanco ascendente"
+
+#: ../plcopen/iec_std.csv:65
+msgid "Rotate left"
+msgstr "Girar a la izquierda"
+
+#: ../plcopen/iec_std.csv:64
+msgid "Rotate right"
+msgstr "Girar a la derecha"
+
+#: ../plcopen/iec_std.csv:17
+msgid "Rounding up/down"
+msgstr "Redondeo arriba / abajo"
+
+#: ../ProjectController.py:1828
+msgid "Run"
+msgstr "Ejecutar"
+
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr ""
+" ¡Falló la generación del código C de la librería de extensión en runtime!\n"
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr ""
+" ¡Falló la generación del código C de la librería de extensión de E/S en "
+"runtime!\n"
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
+msgid "SDO Client"
+msgstr "Cliente SDO"
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
+msgid "SDO Server"
+msgstr "Servidor SDO"
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "SFC"
+msgstr "SFC"
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr "El salto SFC en el POU \"{a1}\" se refiere un paso SFC inexistente \"{a2}\""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr "La transición SFC en el POU \"%s\" debe estar conectada."
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "ST"
+msgstr "ST"
+
+#: ../PLCOpenEditor.py:308
+msgid "ST files (*.st)|*.st|All files|*.*"
+msgstr "Archivos ST (*.st)|*.st|Todos los archivos|*.*"
+
+#: ../svgui/svgui.py:136
+msgid "SVG files (*.svg)|*.svg|All files|*.*"
+msgstr "Archivos SVG (*.svg)|*.svg|Todos los archivos|*.*"
+
+#: ../features.py:36
+msgid "SVGUI"
+msgstr "SVGUI"
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
+msgid "Save"
+msgstr "Guardar"
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
+msgid "Save As..."
+msgstr "Salvar como..."
+
+#: ../BeremizIDE.py:249
+msgid "Save as"
+msgstr "Salvar como"
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr "¡La ruta indicada es la ruta de otro proyecto!\n"
+
+#: ../dialogs/SearchInProjectDialog.py:73
+msgid "Scope"
+msgstr "Alcance"
+
+#: ../IDEFrame.py:644
+msgid "Search"
+msgstr "Buscar"
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
+msgid "Search in Project"
+msgstr "Buscar en el Proyecto"
+
+#: ../dialogs/DurationEditorDialog.py:49
+msgid "Seconds:"
+msgstr "Segundos:"
+
+#: ../IDEFrame.py:390
+msgid "Select All"
+msgstr "Seleccionar todo"
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
+msgid "Select a variable class:"
+msgstr "Seleccione una clase de variable:"
+
+#: ../ProjectController.py:1293
+msgid "Select an editor:"
+msgstr "Seleccionar un editor:"
+
+#: ../controls/PouInstanceVariablesPanel.py:292
+msgid "Select an instance"
+msgstr "Seleccionar una Instancia"
+
+#: ../IDEFrame.py:628
+msgid "Select an object"
+msgstr "Selecionar un objeto"
+
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr ""
+"El directorio seleccionado ya contiene otro proyecto. ¿Desea "
+"sobreescribirlo?\n"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Selection"
+msgstr "Selección"
+
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr "Convergencia de selección"
+
+#: ../dialogs/SFCDivergenceDialog.py:65
+msgid "Selection Divergence"
+msgstr "Divergencia de selección"
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr "Descubrimiento de servicios"
+
+#: ../dialogs/DiscoveryDialog.py:104
+msgid "Services available:"
+msgstr "Servicios disponibles:"
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Set"
+msgstr "Set"
+
+#: ../plcopen/iec_std.csv:62
+msgid "Shift left"
+msgstr "Desplazamiento a la izquierda"
+
+#: ../plcopen/iec_std.csv:63
+msgid "Shift right"
+msgstr "Desplazamiento a la derecha"
+
+#: ../ProjectController.py:1863
+msgid "Show IEC code generated by PLCGenerator"
+msgstr "Mostrar el código IEC generado por PLCGenerator "
+
+#: ../canfestival/canfestival.py:407
+msgid "Show Master"
+msgstr "Mostrar el Maestro"
+
+#: ../canfestival/canfestival.py:408
+msgid "Show Master generated by config_utils"
+msgstr "Mostrar el Maestro generado por config_utils"
+
+#: ../ProjectController.py:1862
+msgid "Show code"
+msgstr "Mostrar código"
+
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr "Divergencia simultanea"
+
+#: ../dialogs/SFCDivergenceDialog.py:67
+msgid "Simultaneous Divergence"
+msgstr "Convergencia simultanea"
+
+#: ../plcopen/iec_std.csv:27
+msgid "Sine"
+msgstr "Seno"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Single"
+msgstr "Sencilla"
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr "La fuente no cambió. No se ejecuta la construcción.\n"
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+"Se debe definir la señal de origen para la tarea única '{a1}' en el recurso "
+"'{a2}.{a3}'"
+
+#: ../plcopen/iec_std.csv:23
+msgid "Square root (base 2)"
+msgstr "Raíz cuadrada (base 2)"
+
+#: ../plcopen/definitions.py:50
+msgid "Standard function blocks"
+msgstr "Bloques de función estandar"
+
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
+msgid "Start PLC"
+msgstr "Iniciar PLC"
+
+#: ../ProjectController.py:1074
+#, python-format
+msgid "Start build in %s\n"
+msgstr "Iniciar la construcción en %s\n"
+
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr "Iniciado"
+
+#: ../ProjectController.py:1633
+msgid "Starting PLC\n"
+msgstr "Iniciando el  PLC\n"
+
+#: ../BeremizIDE.py:393
+msgid "Status ToolBar"
+msgstr "Barra de Estados"
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
+msgid "Step"
+msgstr "Paso"
+
+#: ../ProjectController.py:1835
+msgid "Stop"
+msgstr "Detener"
+
+#: ../Beremiz_service.py:272
+msgid "Stop PLC"
+msgstr "Detener el PLC"
+
+#: ../ProjectController.py:1836
+msgid "Stop Running PLC"
+msgstr "Detener el PLC en ejecusión"
+
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr "Detenido"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Structure"
+msgstr "Estructura"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Subrange"
+msgstr "Subrango"
+
+#: ../plcopen/iec_std.csv:35
+msgid "Subtraction"
+msgstr "Substracción"
+
+#: ../ProjectController.py:1113
+msgid "Successfully built.\n"
+msgstr "Construido con éxito.\n"
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr "Cambiar la perspectiva"
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
+msgid "Syntax error in regular expression of pattern to search!"
+msgstr "¡Error de sintaxis en la expresión del patrón de busqueda!"
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr "TIPO"
+
+#: ../plcopen/iec_std.csv:29
+msgid "Tangent"
+msgstr "Tangente"
+
+#: ../editors/ResourceEditor.py:97
+msgid "Task"
+msgstr "Tarea"
+
+#: ../editors/ResourceEditor.py:248
+msgid "Tasks:"
+msgstr "Tareas:"
+
+#: ../controls/VariablePanel.py:91
+msgid "Temp"
+msgstr "Temporal"
+
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+"El mejor lugar para preguntar sobre Beremiz/PLCOpenEditor es a través de la lista de correos: \n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"Este es el canal principal de soporte de la comunidad.\n"
+"Para escribir en ella se requiere estar subscrito a la lista de correos.\n"
+"\n"
+"Puedes hacerlo en la siguiente dirección:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+
+#: ../editors/FileManagementPanel.py:186
+#, python-format
+msgid ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+msgstr ""
+"El archivo '%s' ya existe.\n"
+"¿Desea reemplazarlo?"
+
+#: ../editors/LDViewer.py:893
+msgid "The group of block must be coherent!"
+msgstr "¡El grupo de bloques debe ser coherente!"
+
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
+msgid "There are changes, do you want to save?"
+msgstr "Han habido cambios,  ¿Desea salvar los cambios realizados?"
+
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+"Ya existe un POU llamado \"%s\". Esto puede causar conflictos. ¿Desea "
+"continuar?"
+
+#: ../IDEFrame.py:1133
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+"Hubo un problema en la impresión.\n"
+"¿Tal vez la impresora actual no esta configurada correctamente? "
+
+#: ../editors/LDViewer.py:902
+msgid "This option isn't available yet!"
+msgstr "¡Esta opción no esta disponible aún!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr "Tick: %d"
+
+#: ../plcopen/iec_std.csv:40
+msgid "Time"
+msgstr "Tiempo"
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
+msgid "Time addition"
+msgstr "Suma de Tiempo"
+
+#: ../plcopen/iec_std.csv:86
+msgid "Time concatenation"
+msgstr "Concatenación de Tiempo"
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
+msgid "Time division"
+msgstr "División de Tiempo"
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
+msgid "Time multiplication"
+msgstr "Multiplicación de Tiempo"
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
+msgid "Time subtraction"
+msgstr "Resta de Tiempo"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
+msgid "Time-of-day addition"
+msgstr "Suma de Time-of-day"
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
+msgid "Time-of-day subtraction"
+msgstr "Resta de Time-of-day"
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr "Alternar Valor"
+
+#: ../editors/Viewer.py:584
+msgid "Top"
+msgstr "Arriba"
+
+#: ../ProjectController.py:1848
+msgid "Transfer"
+msgstr "Transferir"
+
+#: ../ProjectController.py:1849
+msgid "Transfer PLC"
+msgstr "Transferir PLC"
+
+#: ../ProjectController.py:1802
+msgid "Transfer completed successfully.\n"
+msgstr "Transferencia completada con éxito.\n"
+
+#: ../ProjectController.py:1805
+msgid "Transfer failed\n"
+msgstr "Transferencia fallida\n"
+
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
+msgid "Transition"
+msgstr "Transición "
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+"El cuerpo de transición \"%s\" debe contener una variable de salida o bobina"
+" que haga referencia a su nombre"
+
+#: ../dialogs/PouTransitionDialog.py:91
+msgid "Transition Name"
+msgstr "Nombre de transición "
+
+#: ../dialogs/PouTransitionDialog.py:60
+msgid "Transition Name:"
+msgstr "Nombre de transición:"
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr ""
+"La transición con contenido \"{a1}\" no esta conectada al siguiente paso en "
+"la POU \"{a2}\""
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr ""
+"La transición con contenido \"{a1}\" no esta conectada al paso previo en la "
+"POU \"{a2}\""
+
+#: ../plcopen/plcopen.py:1526
+#, python-format
+msgid "Transition with name %s doesn't exist!"
+msgstr "¡La transición con el nombre %s no existe!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Transitions"
+msgstr "Transiciones"
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr "Traducido por"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Triggering"
+msgstr "Tipo de tarea"
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr "El servicio web twisted no esta disponible."
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
+msgid "Type"
+msgstr "Tipo"
+
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr "Tipo y derivados"
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
+#, python-format
+msgid "Type conflict for location \"%s\""
+msgstr "Conflicto de tipos para la ubicación \"%s\""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Type conversion"
+msgstr "Conversión de Tipos"
+
+#: ../editors/DataTypeEditor.py:170
+msgid "Type infos:"
+msgstr "Información del tipo:"
+
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr "Mismo tipo"
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
+msgid "Type:"
+msgstr "Tipo:"
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr "Dirección URI del Host:"
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr "Puerto URI del Host:"
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr "Tipo de dirección URI:"
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
+#, python-format
+msgid "Unable to define PDO mapping for node %02x"
+msgstr "No se puede definir la asignación de PDO para el nodo %02x"
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
+msgid "Unable to get Xenomai's %s \n"
+msgstr "No se puede obtener el %s de Xenomai\n"
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr "El tipo de bloque \"{a1}\" no esta definido en el POU \"{a2}\" "
+
+#: ../PLCGenerator.py:261
+#, python-format
+msgid "Undefined pou type \"%s\""
+msgstr "El Tipo de POU \"%s\" no esta definido "
+
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
+msgid "Undo"
+msgstr "Deshacer"
+
+#: ../ProjectController.py:442
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: ../editors/Viewer.py:437
+#, python-format
+msgid "Unknown variable \"%s\" for this POU!"
+msgstr "¡La variable \"%s\" no existe en este POU!"
+
+#: ../ProjectController.py:439 ../ProjectController.py:440
+msgid "Unnamed"
+msgstr "Sin nombre"
+
+#: ../PLCControler.py:263
+#, python-format
+msgid "Unnamed%d"
+msgstr "Desconocido%d"
+
+#: ../controls/VariablePanel.py:308
+#, python-format
+msgid "Unrecognized data size \"%s\""
+msgstr "No se reconoce el tamaño de datos \"%s\""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
+msgid "User Data Types"
+msgstr "Tipo de datos de usuario"
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
+msgid "User Type"
+msgstr "Tipo de Usuario"
+
+#: ../plcopen/types_enums.py:75
+msgid "User-defined POUs"
+msgstr "POUs definidos por el usuario"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Value"
+msgstr "Valor"
+
+#: ../editors/DataTypeEditor.py:267
+msgid "Values:"
+msgstr "Valores:"
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
+msgid "Variable"
+msgstr "Variable"
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr "Soltar Variable"
+
+#: ../dialogs/FBDVariableDialog.py:68
+msgid "Variable Properties"
+msgstr "Propiedades de la Variable"
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
+msgid "Variable class"
+msgstr "Clase de Variable"
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
+msgid "Variable don't belong to this POU!"
+msgstr "¡La variable no pertenece a este POU!"
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr "Variable:"
+
+#: ../controls/VariablePanel.py:90
+msgid "Variables"
+msgstr "Variables"
+
+#: ../controls/ProjectPropertiesPanel.py:166
+msgid "Vertical:"
+msgstr "Vertical:"
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr "Falló la conexión al cliente WAMP (%s) ..Reintentando ."
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr "Se ha perdido la conexión al cliente WAMP (%s) ..Reintentando ..."
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr "WAMP ID:"
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr "Conectando al Cliente WAMP:"
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr "¡No se ha establecido la conexión al cliente WAMP!"
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr "El inicio del cliente WAMP falló."
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr "La configuración WAMP es incompleta"
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr "La configuración WAMP no se encuentra"
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr "Conexión WAMP a la URL: %s\n"
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr "Tiempo de espera para la conexión WAMP agotado"
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr "La conexión WAMP a '%s' falló.\n"
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr "La importación WAMP falló"
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr "Error en la carga WAMP"
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr "Termino la sesión WAMP"
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
+msgid "WXGLADE GUI"
+msgstr "WXGLADE GUI"
+
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr "Error de carga del clave WAMP:"
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
+msgid "Warning"
+msgstr "Advertencia"
+
+#: ../ProjectController.py:726
+msgid "Warnings in ST/IL/SFC code generator :\n"
+msgstr "Alertas en el generador de código ST/IL/SFC:\n"
+
+#: ../dialogs/SearchInProjectDialog.py:82
+msgid "Whole Project"
+msgstr "Todo el Proyecto"
+
+#: ../controls/ProjectPropertiesPanel.py:134
+msgid "Width:"
+msgstr "Ancho:"
+
+#: ../dialogs/FindInPouDialog.py:94
+msgid "Wrap search"
+msgstr "Búsqueda desde el inicio"
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr "Escrito por"
+
+#: ../features.py:35
+msgid "WxGlade GUI"
+msgstr "WxGlade GUI"
+
+#: ../svgui/svgui.py:150
+msgid ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+msgstr ""
+"No tiene permisos de escritura.\n"
+"¿Desea abrir Inkscape de todos modos?"
+
+#: ../wxglade_hmi/wxglade_hmi.py:160
+msgid ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+msgstr ""
+"No tiene permisos de escritura.\n"
+"¿Desea abrir wxGlade de todos modos?"
+
+#: ../ProjectController.py:390
+msgid ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+msgstr ""
+"Debe tener permiso para trabajar en el proyecto\n"
+"¿Desea trabajar en un copia del proyecto?"
+
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+"¡Debe seleccionar el bloque o grupo de bloques en torno al cual se debe "
+"añadir la rama!"
+
+#: ../editors/LDViewer.py:677
+msgid "You must select the wire where a contact should be added!"
+msgstr "¡debe seleccionar el cable donde se añadirá el contacto!"
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
+msgid "You must type a name!"
+msgstr "¡Debe escribir un nombre!"
+
+#: ../dialogs/ForceVariableDialog.py:209
+msgid "You must type a value!"
+msgstr "¡Debe escribir un valor!"
+
+#: ../IDEFrame.py:440
+msgid "Zoom"
+msgstr "Escala"
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr "días"
+
+#: ../PLCOpenEditor.py:317
+#, python-format
+msgid "error: %s\n"
+msgstr "error: %s\n"
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr "Terminado con estatus {a1} (pid {a2})\n"
+
+#: ../dialogs/PouDialog.py:36
+msgid "function"
+msgstr "función"
+
+#: ../dialogs/PouDialog.py:36
+msgid "functionBlock"
+msgstr "functionBlock"
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr "horas"
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr "No se encuentra una instalación de matiec\n"
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr "milisegundos"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr "minutos"
+
+#: ../dialogs/PouDialog.py:36
+msgid "program"
+msgstr "programa"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr "segundos"
+
+#: ../plcopen/iec_std.csv:84
+msgid "string from the middle"
+msgstr "cadena desde el medio"
+
+#: ../plcopen/iec_std.csv:82
+msgid "string left of"
+msgstr "cadena a la izquierda de"
+
+#: ../plcopen/iec_std.csv:83
+msgid "string right of"
+msgstr "cadena a la derecha de"
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr "Información de actualización no disponible."
+
+#: ../PLCOpenEditor.py:315
+#, python-format
+msgid "warning: %s\n"
+msgstr "Alerta: %s\n"
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr "{a1} \"{a2}\" no se puede pegar como un  {a3}."
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+"{a1} El archivo XML no sigue el esquema XSD en la línea {a2}:\n"
+"{a3}"
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr "CanFestivalSlaveNode"
+
+msgid "CAN_Device"
+msgstr "CAN_Device"
+
+msgid "CAN_Baudrate"
+msgstr "CAN_Baudrate"
+
+msgid "NodeId"
+msgstr "NodeId"
+
+msgid "Sync_Align"
+msgstr "Sync_Align"
+
+msgid "Sync_Align_Ratio"
+msgstr "Sync_Align_Ratio"
+
+msgid "CanFestivalNode"
+msgstr "CanFestivalNode"
+
+msgid "Sync_TPDOs"
+msgstr "Sync_TPDOs"
+
+msgid "CanFestivalInstance"
+msgstr "CanFestivalInstance"
+
+msgid "CAN_Driver"
+msgstr "CAN_Driver"
+
+msgid "Generic"
+msgstr "Genérico "
+
+msgid "Command"
+msgstr "Comando"
+
+msgid "Xenomai"
+msgstr "Xenomai"
+
+msgid "XenoConfig"
+msgstr "XenoConfig"
+
+msgid "Compiler"
+msgstr "Compilador"
+
+msgid "CFLAGS"
+msgstr "CFLAGS"
+
+msgid "Linker"
+msgstr "Enlazador"
+
+msgid "LDFLAGS"
+msgstr "LDFLAGS"
+
+msgid "Linux"
+msgstr "Linux"
+
+msgid "Win32"
+msgstr "Win32"
+
+msgid "ModbusRequest"
+msgstr "SolicitudModbus"
+
+msgid "SlaveID"
+msgstr "Identificador del esclavo"
+
+msgid "Nr_of_Channels"
+msgstr "Numero_canales"
+
+msgid "Start_Address"
+msgstr "Direccion_Inicio"
+
+msgid "Timeout_in_ms"
+msgstr "Timeout_en_ms"
+
+msgid "MemoryArea"
+msgstr "AreaMemoria"
+
+msgid "MemoryAreaType"
+msgstr "TipoAreaMemoria"
+
+msgid "ModbusTCPclient"
+msgstr "ClienteTCPModbus"
+
+msgid "Remote_IP_Address"
+msgstr "Direccón_IP_Remota"
+
+msgid "Remote_Port_Number"
+msgstr "Puerto_Remoto"
+
+msgid "Invocation_Rate_in_ms"
+msgstr "Invocation_Rate_in_ms"
+
+msgid "ModbusServerNode"
+msgstr "NodoServidorModbus"
+
+msgid "Local_IP_Address"
+msgstr "Direccion_IP_Local"
+
+msgid "Local_Port_Number"
+msgstr "Numero_Puerto_Local"
+
+msgid "ModbusRTUclient"
+msgstr "ClienteModbusRTU"
+
+msgid "Serial_Port"
+msgstr "Puerto_Serial"
+
+msgid "Baud_Rate"
+msgstr "Velocidad"
+
+msgid "Parity"
+msgstr "Paridad"
+
+msgid "Stop_Bits"
+msgstr "Bits_Parada"
+
+msgid "ModbusRTUslave"
+msgstr "EsclavoModbusRTU"
+
+msgid "ModbusRoot"
+msgstr "RaizModbus"
+
+msgid "MaxRemoteTCPclients"
+msgstr "MaxRemoteTCPclients"
+
+msgid "BaseParams"
+msgstr "BaseParams"
+
+msgid "IEC_Channel"
+msgstr "IEC_Channel"
+
+msgid "Enabled"
+msgstr "Habilitado"
+
+msgid "BeremizRoot"
+msgstr "BeremizRoot"
+
+msgid "TargetType"
+msgstr "TargetType"
+
+msgid "Libraries"
+msgstr "Librerías"
+
+msgid "URI_location"
+msgstr "Ubicacion_URL"
+
+msgid "Disable_Extensions"
+msgstr "Deshabilitar_extensiones"
+
+msgid "%(codefile_name)s"
+msgstr "%(codefile_name)s"
+
+msgid "variables"
+msgstr "variables"
+
+msgid "variable"
+msgstr "variable"
+
+msgid "name"
+msgstr "nombre"
+
+msgid "type"
+msgstr "tipo"
+
+msgid "class"
+msgstr "clase"
+
+msgid "initial"
+msgstr "inicial"
+
+msgid "desc"
+msgstr "desc"
+
+msgid "onchange"
+msgstr "En cambio"
+
+msgid "opts"
+msgstr "opts"
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr "0 - tiempo actual, 1 - cargar tiempo desde PDT "
+
+msgid "Preset datetime"
+msgstr "Tiempo predeterminado"
+
+msgid "Copy of IN"
+msgstr "Copia de IN"
+
+msgid "Datetime, current or relative to PDT"
+msgstr "Fecha y hora, actual o relativa al PDT"
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+"El reloj de tiempo real tiene muchos usos, incluyendo marca de tiempo y la "
+"configuracion de fecha y hora en reportes de lotes,  mensajes de alarma, "
+"etc.. "
+
+msgid "1 = integrate, 0 = hold"
+msgstr "1 = integrar, 0 = mantener"
+
+msgid "Overriding reset"
+msgstr "Anulación de reset"
+
+msgid "Input variable"
+msgstr "Variable de entrada"
+
+msgid "Initial value"
+msgstr "Valor inicial"
+
+msgid "Sampling period"
+msgstr "Período de muestreo"
+
+msgid "NOT R1"
+msgstr "NOT R1"
+
+msgid "Integrated output"
+msgstr "Salida integrada"
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr ""
+"El bloque de función integral, integra el valor de la entrada XIN en el "
+"tiempo."
+
+msgid "0 = reset"
+msgstr "0 = reset"
+
+msgid "Input to be differentiated"
+msgstr "Entrada a ser diferenciada"
+
+msgid "Differentiated output"
+msgstr "Salida diferenciada"
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+"El bloque derivativo produce una salida XOUT proporcional a la velocidad de "
+"cambio de la entrada XIN."
+
+msgid "0 - manual , 1 - automatic"
+msgstr "0 - manual, 1 - automático"
+
+msgid "Process variable"
+msgstr "Variable de proceso"
+
+msgid "Set point"
+msgstr "Punto de ajuste"
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr ""
+"Ajuste de salida manual - Típicamente desde la estación de transferencia"
+
+msgid "Proportionality constant"
+msgstr "Constante proporcional"
+
+msgid "Reset time"
+msgstr "Tiempo de reset"
+
+msgid "Derivative time constant"
+msgstr "Constante de tiempo derivativo"
+
+msgid "PV - SP"
+msgstr "PV-SP"
+
+msgid "FB for integral term"
+msgstr "FB para el término integral"
+
+msgid "FB for derivative term"
+msgstr "FB para el término derivativo"
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+"El bloque PID (Propocional, Integral, Derivativo) provee el clásico "
+"controlador de tres términos para el control de lazo cerrado. "
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr "0 - seguir X0, 1 - rampa a/seguir X1"
+
+msgid "Ramp duration"
+msgstr "Duración de rampa"
+
+msgid "BUSY = 1 during ramping period"
+msgstr "BUSY=1 durante el período de rampa."
+
+msgid "Elapsed time of ramp"
+msgstr "Tiempo transcurrido de la rampa"
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr "El bloque RAMPA se modela del ejemplo dado en el estandard."
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+"El bloque de histéresis proporciona una salida booleana de histéresis "
+"impulsada por la diferencia de dos entradas de coma flotante (REAL) XIN1 y "
+"XIN2."
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr "El biestable SR es un enclavamiento donde la entrada SET es dominante"
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr ""
+"El biestable RS es un enclavamiento donde la entrada RESET es dominante"
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+"El semáforo provee un mecanismo para permitir a elementos de software el "
+"acceso mutuamente exclusivo de un recurso especifico. "
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+"La salida produce un pulso único cuando se detecta en la entrada un flanco "
+"ascendente."
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+"La salida produce un pulso único cuando se detecta en la entrada un flanco "
+"descendente."
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+"El contador ascendente puede ser usado para indicar cuando una cuenta ha "
+"alcanzado su valor máximo predeternimado."
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+"El contador descendente puede ser usado para indicar cuando una cuenta "
+"regresiva iniciada desde un valor predeterminado ha alcanzado el cero."
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+"El contador arriba-abajo tiene dos entradas, CU y CD. Puede ser usado tanto "
+"para contar hacia arriba con la entrada CU, como para contar hacia abajo con"
+" la entrada CD."
+
+msgid "first input parameter"
+msgstr "primer parámetro de entrada"
+
+msgid "second input parameter"
+msgstr "segundo parámetro de entrada"
+
+msgid "first output parameter"
+msgstr "primer parámetro de salida"
+
+msgid "second output parameter"
+msgstr "segundo parámetro de salida"
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr "estado interno: 0-reset, 1-contando, 2-set"
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+"El temporizador de pulso puede ser usado para generar un pulso de salida con"
+" una duración determinada."
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+"El temporizador con retraso para activar puede ser usado para activar una "
+"salida, un tiempo fijo después de la activación de una entrada."
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
+"El temporizador con retraso para desactivar puede ser usado para desactivar "
+"una salida, un tiempo fijo después de la desactivación de una entrada."
--- a/i18n/Beremiz_fr_FR.po	Sat Jun 02 11:56:01 2018 +0100
+++ b/i18n/Beremiz_fr_FR.po	Mon Jan 07 13:50:39 2019 +0100
@@ -1,44 +1,24 @@
 # SOME DESCRIPTIVE TITLE.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the Beremiz package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-03-26 22:55+0100\n"
-"PO-Revision-Date: 2013-03-26 23:08+0100\n"
-"Last-Translator: Laurent BESSARD <laurent.bessard@gmail.com>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Fabien M <mail@fabienm.eu>, 2017\n"
+"Language-Team: French (France) (https://www.transifex.com/beremiz/teams/75746/fr_FR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-
-#: ../PLCOpenEditor.py:405
-msgid ""
-"\n"
-"An error has occurred.\n"
-"\n"
-"Click OK to save an error report.\n"
-"\n"
-"Please be kind enough to send this file to:\n"
-"edouard.tisserant@gmail.com\n"
-"\n"
-"Error:\n"
-msgstr ""
-"\n"
-"Une erreur est apparue.\n"
-"\n"
-"Appuyer sur 'Valider' pour enregistrer un rapport d'erreur.\n"
-"\n"
-"Envoyez ce fichier à l'adresse :\n"
-"edouard.tisserant@gmail.com\n"
-"\n"
-"Erreur:\n"
-
-#: ../Beremiz.py:1119
+"Language: fr_FR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../util/ExceptionHandler.py:58
 #, python-format
 msgid ""
 "\n"
@@ -48,223 +28,172 @@
 "Please be kind enough to send this file to:\n"
 "beremiz-devel@lists.sourceforge.net\n"
 "\n"
-"You should now restart Beremiz.\n"
+"You should now restart program.\n"
 "\n"
 "Traceback:\n"
 msgstr ""
 "\n"
-"Une erreur inconnue (bug) est apparu. Le rapport d'erreur a été sauvé dans :\n"
+"Une exception non gérée (bug) est survenue. Le bug est inscrit dans :\n"
 "(%s)\n"
 "\n"
-"Envoyez ce fichier à l'adresse :\n"
+"S'il vous plaît, soyez sympa et envoyez ce fichier à :\n"
 "beremiz-devel@lists.sourceforge.net\n"
 "\n"
-"Vous devriez redémarrer Beremiz.\n"
-"\n"
-"Trace d'exécution:\n"
-
-#: ../controls/VariablePanel.py:77
+"Vous devriez redémarrer le programme.\n"
+"Trace:\n"
+
+#: ../controls/VariablePanel.py:90
 msgid "   External"
 msgstr "  Externe"
 
-#: ../controls/VariablePanel.py:76
+#: ../controls/VariablePanel.py:89
 msgid "   InOut"
 msgstr "  Entrée-Sortie"
 
-#: ../controls/VariablePanel.py:76
+#: ../controls/VariablePanel.py:89
 msgid "   Input"
 msgstr "  Entrée"
 
-#: ../controls/VariablePanel.py:77
+#: ../controls/VariablePanel.py:90
 msgid "   Local"
 msgstr "  Locale"
 
-#: ../controls/VariablePanel.py:76
+#: ../controls/VariablePanel.py:89
 msgid "   Output"
 msgstr "  Sortie"
 
-#: ../controls/VariablePanel.py:78
+#: ../controls/VariablePanel.py:91
 msgid "   Temp"
 msgstr "  Temporaire"
 
-#: ../PLCOpenEditor.py:415
-msgid " : "
-msgstr " : "
-
-#: ../dialogs/PouTransitionDialog.py:94
-#: ../dialogs/PouActionDialog.py:91
-#: ../dialogs/PouDialog.py:111
-#: ../dialogs/SFCTransitionDialog.py:144
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
 #, python-format
 msgid " and %s"
 msgstr " et %s"
 
-#: ../ProjectController.py:917
+#: ../ProjectController.py:1182
 msgid " generation failed !\n"
-msgstr "la construction a échouée !\n"
-
-#: ../plcopen/plcopen.py:1051
+msgstr "la génération a échouée !\n"
+
+#: ../plcopen/plcopen.py:1029
 #, python-format
 msgid "\"%s\" Data Type doesn't exist !!!"
 msgstr "Le type de donnée \"%s\" n'existe pas !!!"
 
-#: ../plcopen/plcopen.py:1069
+#: ../plcopen/plcopen.py:1047
 #, python-format
 msgid "\"%s\" POU already exists !!!"
 msgstr "Le POU \"%s\" existe déjà !!!"
 
-#: ../plcopen/plcopen.py:1090
+#: ../plcopen/plcopen.py:1068
 #, python-format
 msgid "\"%s\" POU doesn't exist !!!"
 msgstr "Le POU \"%s\" n'existe pas !!!"
 
-#: ../editors/Viewer.py:234
+#: ../editors/Viewer.py:288
 #, python-format
 msgid "\"%s\" can't use itself!"
 msgstr "\"%s\" ne peut pas s'utiliser lui-même !"
 
-#: ../IDEFrame.py:1587
-#: ../IDEFrame.py:1606
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
 #, python-format
 msgid "\"%s\" config already exists!"
 msgstr "La configuration \"%s\" existe déjà !"
 
-#: ../plcopen/plcopen.py:315
+#: ../plcopen/plcopen.py:531
 #, python-format
 msgid "\"%s\" configuration already exists !!!"
 msgstr "La configuration \"%s\" existe déjà !!!"
 
-#: ../IDEFrame.py:1541
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr "La configuration \"%s\" n'existe pas !!!"
+
+#: ../IDEFrame.py:1638
 #, python-format
 msgid "\"%s\" data type already exists!"
 msgstr "Le type de données \"%s\" existe déjà !"
 
-#: ../PLCControler.py:2165
-#: ../PLCControler.py:2169
-#, python-format
-msgid "\"%s\" element can't be pasted here!!!"
-msgstr "L'élément \"%s\" ne peut être collé ici !!!"
-
-#: ../editors/TextViewer.py:298
-#: ../editors/TextViewer.py:318
-#: ../editors/Viewer.py:250
-#: ../dialogs/PouTransitionDialog.py:105
-#: ../dialogs/ConnectionDialog.py:157
-#: ../dialogs/PouActionDialog.py:102
-#: ../dialogs/FBDBlockDialog.py:162
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
 #, python-format
 msgid "\"%s\" element for this pou already exists!"
 msgstr "Un élément \"%s\" existe déjà dans ce POU !"
 
-#: ../Beremiz.py:921
+#: ../BeremizIDE.py:928
 #, python-format
 msgid "\"%s\" folder is not a valid Beremiz project\n"
 msgstr "Le dossier \"%s\" ne contient pas de projet Beremiz valide\n"
 
-#: ../plcopen/structures.py:105
-#, python-format
-msgid "\"%s\" function cancelled in \"%s\" POU: No input connected"
-msgstr "L'appel à la fonction \"%s\" dans le POU \"%s\" a été abandonné : aucune entrée connectée"
-
-#: ../controls/VariablePanel.py:659
-#: ../IDEFrame.py:1532
-#: ../editors/DataTypeEditor.py:554
-#: ../editors/DataTypeEditor.py:583
-#: ../dialogs/PouNameDialog.py:49
-#: ../dialogs/PouTransitionDialog.py:101
-#: ../dialogs/SFCStepNameDialog.py:51
-#: ../dialogs/ConnectionDialog.py:153
-#: ../dialogs/FBDVariableDialog.py:199
-#: ../dialogs/PouActionDialog.py:98
-#: ../dialogs/PouDialog.py:118
-#: ../dialogs/SFCStepDialog.py:122
-#: ../dialogs/FBDBlockDialog.py:158
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
 #, python-format
 msgid "\"%s\" is a keyword. It can't be used!"
 msgstr "\"%s\" est un mot réservé. Il ne peut être utilisé !"
 
-#: ../editors/Viewer.py:238
-#, python-format
-msgid "\"%s\" is already used by \"%s\"!"
-msgstr "\"%s\" est déjà utilisé par \"%s\" !"
-
 #: ../plcopen/plcopen.py:2836
 #, python-format
 msgid "\"%s\" is an invalid value!"
 msgstr "\"%s\" n'est pas une valeur valide !"
 
-#: ../PLCOpenEditor.py:341
-#: ../PLCOpenEditor.py:378
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
 #, python-format
 msgid "\"%s\" is not a valid folder!"
 msgstr "\"%s\" n'est pas un répertoire valide !"
 
-#: ../controls/VariablePanel.py:657
-#: ../IDEFrame.py:1530
-#: ../editors/DataTypeEditor.py:578
-#: ../dialogs/PouNameDialog.py:47
-#: ../dialogs/PouTransitionDialog.py:99
-#: ../dialogs/SFCStepNameDialog.py:49
-#: ../dialogs/ConnectionDialog.py:151
-#: ../dialogs/PouActionDialog.py:96
-#: ../dialogs/PouDialog.py:116
-#: ../dialogs/SFCStepDialog.py:120
-#: ../dialogs/FBDBlockDialog.py:156
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
 #, python-format
 msgid "\"%s\" is not a valid identifier!"
 msgstr "\"%s\" n'est pas un identifiant valide !"
 
-#: ../IDEFrame.py:221
-#: ../IDEFrame.py:2313
-#: ../IDEFrame.py:2332
-#, python-format
-msgid "\"%s\" is used by one or more POUs. It can't be removed!"
-msgstr "Le POU \"%s\" est utilisé par un ou plusieurs POUs. Il ne peut être supprimé !"
-
-#: ../controls/VariablePanel.py:313
-#: ../IDEFrame.py:1550
-#: ../editors/TextViewer.py:296
-#: ../editors/TextViewer.py:316
-#: ../editors/TextViewer.py:353
-#: ../editors/Viewer.py:248
-#: ../editors/Viewer.py:293
-#: ../editors/Viewer.py:311
-#: ../dialogs/ConnectionDialog.py:155
-#: ../dialogs/PouDialog.py:120
-#: ../dialogs/FBDBlockDialog.py:160
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr ""
+"\"%s\" est utilisé par un POU ou plus. Souhaitez vous continuer malgré tout "
+"?"
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
 #, python-format
 msgid "\"%s\" pou already exists!"
 msgstr "Le POU \"%s\" existe déjà !"
 
-#: ../plcopen/plcopen.py:346
-#, python-format
-msgid "\"%s\" resource already exists in \"%s\" configuration !!!"
-msgstr "La ressource \"%s\" existe déjà dans la configuration \"%s\" !!!"
-
-#: ../plcopen/plcopen.py:362
-#, python-format
-msgid "\"%s\" resource doesn't exist in \"%s\" configuration !!!"
-msgstr "La ressource \"%s\" n'existe pas dans la configuration \"%s\" !!!"
-
-#: ../dialogs/SFCStepNameDialog.py:57
-#: ../dialogs/SFCStepDialog.py:128
+#: ../dialogs/SFCStepNameDialog.py:62
 #, python-format
 msgid "\"%s\" step already exists!"
 msgstr "L'étape \"%s\" existe déjà !"
 
-#: ../editors/DataTypeEditor.py:549
+#: ../editors/DataTypeEditor.py:566
 #, python-format
 msgid "\"%s\" value already defined!"
 msgstr "La valeur \"%s\" est déjà définie !"
 
-#: ../editors/DataTypeEditor.py:744
-#: ../dialogs/ArrayTypeDialog.py:97
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
 #, python-format
 msgid "\"%s\" value isn't a valid array dimension!"
 msgstr "\"%s\" n'est pas une dimension de tableau valide !"
 
-#: ../editors/DataTypeEditor.py:751
-#: ../dialogs/ArrayTypeDialog.py:103
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
 #, python-format
 msgid ""
 "\"%s\" value isn't a valid array dimension!\n"
@@ -273,323 +202,363 @@
 "\"%s\" n'est pas une dimension de tableau valide !\n"
 "La valeur de droite doit être supérieur à celle de gauche."
 
-#: ../PLCControler.py:847
-#, python-format
-msgid "%s \"%s\" can't be pasted as a %s."
-msgstr "Le %s \"%s\" ne peut être collé en tant que %s."
-
-#: ../PLCControler.py:1476
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr "Fonction \"{a1}\" annulée dans  \"{a2}\" POU: Pas d'entrée connectée"
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr "\"{a1}\" est déjà utilisé par \"{a2}\"!"
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr "La ressource \"{a1}\" existe déjà dans la configuration \"{a2}\" !"
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr "La ressource \"${a1}\" n'existe pas dans la configuration \"{a2}\" !"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr "%03gms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr "%dj"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr "%dh"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr "%dm"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr "%dms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr "%ds"
+
+#: ../PLCControler.py:1114
 #, python-format
 msgid "%s Data Types"
 msgstr "Types de données de %s"
 
-#: ../editors/GraphicViewer.py:278
-#, python-format
-msgid "%s Graphics"
-msgstr "Graphique %s"
-
-#: ../PLCControler.py:1471
+#: ../PLCControler.py:1097
 #, python-format
 msgid "%s POUs"
 msgstr "POUs de %s"
 
-#: ../canfestival/SlaveEditor.py:46
-#: ../canfestival/NetworkEditor.py:67
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
 #, python-format
 msgid "%s Profile"
 msgstr "Profil %s"
 
-#: ../plcopen/plcopen.py:1790
-#: ../plcopen/plcopen.py:1800
-#: ../plcopen/plcopen.py:1810
-#: ../plcopen/plcopen.py:1820
-#: ../plcopen/plcopen.py:1829
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
 #, python-format
 msgid "%s body don't have instances!"
 msgstr "Le code d'un %s n'a pas d'instances !"
 
-#: ../plcopen/plcopen.py:1852
-#: ../plcopen/plcopen.py:1859
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
 #, python-format
 msgid "%s body don't have text!"
 msgstr "Le code d'un %s n'a pas de texte !"
 
-#: ../IDEFrame.py:369
+#: ../IDEFrame.py:388
 msgid "&Add Element"
 msgstr "&Ajouter un élément"
 
-#: ../IDEFrame.py:339
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr "&Close"
+
+#: ../IDEFrame.py:361
 msgid "&Configuration"
 msgstr "&Configuration"
 
-#: ../IDEFrame.py:330
+#: ../IDEFrame.py:350
 msgid "&Data Type"
 msgstr "&Type de donnée"
 
-#: ../IDEFrame.py:373
+#: ../IDEFrame.py:392
 msgid "&Delete"
 msgstr "&Supprimer"
 
-#: ../IDEFrame.py:322
+#: ../IDEFrame.py:342
 msgid "&Display"
 msgstr "&Affichage"
 
-#: ../IDEFrame.py:321
+#: ../IDEFrame.py:341
 msgid "&Edit"
 msgstr "&Editer"
 
-#: ../IDEFrame.py:320
+#: ../IDEFrame.py:340
 msgid "&File"
 msgstr "&Fichier"
 
-#: ../IDEFrame.py:332
+#: ../IDEFrame.py:352
 msgid "&Function"
 msgstr "&Fonction"
 
-#: ../IDEFrame.py:323
+#: ../IDEFrame.py:343
 msgid "&Help"
 msgstr "&Aide"
 
-#: ../IDEFrame.py:336
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr "&License"
+
+#: ../IDEFrame.py:356
 msgid "&Program"
 msgstr "&Programme"
 
-#: ../PLCOpenEditor.py:129
+#: ../PLCOpenEditor.py:98
 msgid "&Properties"
 msgstr "&Propriétés"
 
-#: ../Beremiz.py:312
+#: ../BeremizIDE.py:244
 msgid "&Recent Projects"
 msgstr "Projets &récent"
 
-#: ../Beremiz.py:354
+#: ../IDEFrame.py:358
 msgid "&Resource"
 msgstr "&Ressource"
 
-#: ../controls/SearchResultPanel.py:252
-#, python-format
-msgid "'%s' - %d match in project"
-msgstr "'%s' - %d correspondance dans le projet"
-
-#: ../controls/SearchResultPanel.py:254
-#, python-format
-msgid "'%s' - %d matches in project"
-msgstr "'%s' - %d correspondances dans le projet"
-
-#: ../connectors/PYRO/__init__.py:51
-#, python-format
-msgid "'%s' is located at %s\n"
-msgstr "'%s' is disponible à l'adresse %s\n"
-
-#: ../controls/SearchResultPanel.py:304
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr "'{a1}' - {a2} concordent dans le projet"
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr "'{a1}' - {a2} concordent dans le projet"
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr "'{a1}' est situé dans {a2}\n"
+
+#: ../controls/SearchResultPanel.py:298
 #, python-format
 msgid "(%d matches)"
 msgstr "(%d correspondances)"
 
-#: ../PLCOpenEditor.py:393
-#: ../PLCOpenEditor.py:395
-#: ../PLCOpenEditor.py:396
-msgid ",   "
-msgstr ",   "
-
-#: ../dialogs/PouTransitionDialog.py:96
-#: ../dialogs/PouActionDialog.py:93
-#: ../dialogs/PouDialog.py:113
-#: ../dialogs/SFCTransitionDialog.py:146
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
 #, python-format
 msgid ", %s"
 msgstr ", %s"
 
-#: ../PLCOpenEditor.py:391
-msgid ". "
-msgstr ". "
-
-#: ../ProjectController.py:1294
-msgid "... debugger recovered\n"
-msgstr "... déboggueur operationel\n"
-
-#: ../IDEFrame.py:1553
-#: ../IDEFrame.py:1595
-#: ../IDEFrame.py:1614
-#: ../dialogs/PouDialog.py:122
-#, python-format
-msgid "A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?"
-msgstr "Un POU a un élément nommé \"%s\". Cela peut générer des conflits. Voulez-vous continuer ?"
-
-#: ../controls/VariablePanel.py:661
-#: ../IDEFrame.py:1565
-#: ../IDEFrame.py:1576
-#: ../dialogs/PouNameDialog.py:51
-#: ../dialogs/PouTransitionDialog.py:103
-#: ../dialogs/SFCStepNameDialog.py:53
-#: ../dialogs/PouActionDialog.py:100
-#: ../dialogs/SFCStepDialog.py:124
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr "- Sélectionnez le type d'URI -"
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr "1j"
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr "1h"
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr "1m"
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr "1s"
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+"Un POU a un élément nommé \"%s\". Cela peut générer des conflits. Voulez-"
+"vous continuer ?"
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
 #, python-format
 msgid "A POU named \"%s\" already exists!"
 msgstr "Un POU nommé \"%s\" existe déjà !"
 
-#: ../ConfigTreeNode.py:388
-#, python-format
-msgid "A child named \"%s\" already exist -> \"%s\"\n"
-msgstr "Un noeud enfant nommé \"%s\" existe déjà -> \"%s\"\n"
-
-#: ../dialogs/BrowseLocationsDialog.py:212
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr "Un enfant nommé  \"{a1}\" existe déjà ->  \"{a2}\"\n"
+
+#: ../dialogs/BrowseLocationsDialog.py:229
 msgid "A location must be selected!"
 msgstr "Une adresse doit être sélectionné !"
 
-#: ../controls/VariablePanel.py:663
-#: ../IDEFrame.py:1567
-#: ../IDEFrame.py:1578
-#: ../dialogs/SFCStepNameDialog.py:55
-#: ../dialogs/SFCStepDialog.py:126
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr "Une tâche du même nom existe déjà"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
 #, python-format
 msgid "A variable with \"%s\" as name already exists in this pou!"
 msgstr "Une variable nommée \"%s\" existe déjà dans ce POU !"
 
-#: ../Beremiz.py:364
-#: ../PLCOpenEditor.py:162
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr "Une variable avec le nom \"%s\" existe déjà !"
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
 msgid "About"
 msgstr "A propos"
 
-#: ../Beremiz.py:957
-msgid "About Beremiz"
-msgstr "A propos de Beremiz"
-
-#: ../PLCOpenEditor.py:355
-msgid "About PLCOpenEditor"
-msgstr "A propos de PLCOpenEditor"
-
 #: ../plcopen/iec_std.csv:22
 msgid "Absolute number"
 msgstr "Nombre absolu"
 
-#: ../dialogs/ActionBlockDialog.py:41
-#: ../dialogs/SFCStepDialog.py:69
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
 msgid "Action"
 msgstr "Action"
 
-#: ../editors/Viewer.py:494
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
 msgid "Action Block"
 msgstr "Ajouter un bloc fonctionnel"
 
-#: ../dialogs/PouActionDialog.py:81
+#: ../dialogs/PouActionDialog.py:89
 msgid "Action Name"
 msgstr "Nom de l'action"
 
-#: ../dialogs/PouActionDialog.py:49
+#: ../dialogs/PouActionDialog.py:56
 msgid "Action Name:"
 msgstr "Nom de l'action :"
 
-#: ../plcopen/plcopen.py:1490
+#: ../plcopen/plcopen.py:1567
 #, python-format
 msgid "Action with name %s doesn't exist!"
 msgstr "L'action nommée %s n'existe pas !"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:76
 msgid "Actions"
 msgstr "Actions"
 
-#: ../dialogs/ActionBlockDialog.py:134
+#: ../dialogs/ActionBlockDialog.py:139
 msgid "Actions:"
 msgstr "Actions :"
 
-#: ../editors/Viewer.py:999
+#: ../editors/Viewer.py:473
 msgid "Active"
 msgstr "Actif"
 
-#: ../canfestival/SlaveEditor.py:57
-#: ../canfestival/NetworkEditor.py:78
-#: ../Beremiz.py:987
-#: ../editors/Viewer.py:527
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
 msgid "Add"
 msgstr "Ajouter"
 
-#: ../IDEFrame.py:1801
-#: ../IDEFrame.py:1832
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
 msgid "Add Action"
 msgstr "Ajouter une action"
 
-#: ../features.py:8
+#: ../features.py:33
 msgid "Add C code accessing located variables synchronously"
-msgstr "Ajoute un code C ayant accès à des variables localisées de façon synchrone"
-
-#: ../IDEFrame.py:1784
+msgstr ""
+"Ajoute un code C ayant accès à des variables localisées de façon synchrone"
+
+#: ../IDEFrame.py:1907
 msgid "Add Configuration"
 msgstr "Ajouter une configuration"
 
-#: ../IDEFrame.py:1764
+#: ../IDEFrame.py:1887
 msgid "Add DataType"
 msgstr "Ajouter un type de donnée"
 
-#: ../editors/Viewer.py:452
+#: ../editors/Viewer.py:609
 msgid "Add Divergence Branch"
 msgstr "Ajouter une branche à la divergence"
 
-#: ../dialogs/DiscoveryDialog.py:115
+#: ../dialogs/DiscoveryDialog.py:121
 msgid "Add IP"
 msgstr "Ajouter IP"
 
-#: ../IDEFrame.py:1772
+#: ../IDEFrame.py:1895
 msgid "Add POU"
 msgstr "Ajouter un POU"
 
-#: ../features.py:9
+#: ../features.py:34
 msgid "Add Python code executed asynchronously"
 msgstr "Ajoute un code Python executé de façon asynchone"
 
-#: ../IDEFrame.py:1812
-#: ../IDEFrame.py:1858
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
 msgid "Add Resource"
 msgstr "Ajouter une resource"
 
-#: ../IDEFrame.py:1790
-#: ../IDEFrame.py:1829
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
 msgid "Add Transition"
 msgstr "Ajouter une transition"
 
-#: ../editors/Viewer.py:441
+#: ../editors/Viewer.py:596
 msgid "Add Wire Segment"
 msgstr "Ajouter un segment au fil"
 
-#: ../editors/SFCViewer.py:359
+#: ../editors/SFCViewer.py:447
 msgid "Add a new initial step"
 msgstr "Ajouter une nouvelle étape initiale"
 
-#: ../editors/Viewer.py:2363
-#: ../editors/SFCViewer.py:696
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
 msgid "Add a new jump"
 msgstr "Ajouter un nouveau renvoi"
 
-#: ../editors/SFCViewer.py:381
+#: ../editors/SFCViewer.py:469
 msgid "Add a new step"
 msgstr "Ajouter une nouvelle étape"
 
-#: ../features.py:10
+#: ../features.py:35
 msgid "Add a simple WxGlade based GUI."
 msgstr "Ajoute une interface simple utilisant WxGlade"
 
-#: ../dialogs/ActionBlockDialog.py:138
+#: ../dialogs/ActionBlockDialog.py:143
 msgid "Add action"
 msgstr "Ajouter une action"
 
-#: ../editors/DataTypeEditor.py:351
+#: ../editors/DataTypeEditor.py:364
 msgid "Add element"
 msgstr "Ajouter un élément"
 
-#: ../editors/ResourceEditor.py:259
+#: ../editors/ResourceEditor.py:283
 msgid "Add instance"
 msgstr "Ajouter une instance"
 
-#: ../canfestival/NetworkEditor.py:80
+#: ../canfestival/NetworkEditor.py:110
 msgid "Add slave"
 msgstr "Ajouter un esclave"
 
-#: ../editors/ResourceEditor.py:230
+#: ../editors/ResourceEditor.py:252
 msgid "Add task"
 msgstr "Ajouter une tâche"
 
-#: ../controls/VariablePanel.py:380
-#: ../c_ext/CFileEditor.py:517
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
 msgid "Add variable"
 msgstr "Ajouter une variable"
 
@@ -597,42 +566,48 @@
 msgid "Addition"
 msgstr "Addition"
 
-#: ../plcopen/structures.py:249
+#: ../plcopen/definitions.py:51
 msgid "Additional function blocks"
 msgstr "Blocs fonctionnels additionnels"
 
-#: ../editors/Viewer.py:510
+#: ../editors/Viewer.py:669
 msgid "Adjust Block Size"
 msgstr "Ajuster la taille des blocs"
 
-#: ../editors/Viewer.py:1458
+#: ../editors/Viewer.py:1720
 msgid "Alignment"
 msgstr "Alignement"
 
-#: ../controls/VariablePanel.py:75
-#: ../dialogs/BrowseLocationsDialog.py:34
-#: ../dialogs/BrowseLocationsDialog.py:43
-#: ../dialogs/BrowseLocationsDialog.py:136
-#: ../dialogs/BrowseLocationsDialog.py:139
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
 msgid "All"
 msgstr "Tout"
 
-#: ../editors/FileManagementPanel.py:35
+#: ../editors/FileManagementPanel.py:37
 msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
 msgstr "Tous les fichiers|*.*|Fichiers CSV (*.csv)|*.csv"
 
-#: ../ProjectController.py:1373
+#: ../ProjectController.py:1670
 msgid "Already connected. Please disconnect\n"
 msgstr "Déjà connecté. Veuillez déconnecter\n"
 
-#: ../editors/DataTypeEditor.py:593
+#: ../editors/DataTypeEditor.py:607
 #, python-format
 msgid "An element named \"%s\" already exists in this structure!"
 msgstr "Un élément nommé \"%s\" existe déjà dans la structure !"
 
-#: ../dialogs/ConnectionDialog.py:98
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr "Une instance avec le même nom existe déjà !"
+
+#: ../dialogs/ConnectionDialog.py:103
 msgid "Apply name modification to all continuations with the same name"
-msgstr "Appliquer la modification de nom à toutes les prolongements portant ce même nom"
+msgstr ""
+"Appliquer la modification de nom à toutes les prolongements portant ce même "
+"nom"
 
 #: ../plcopen/iec_std.csv:31
 msgid "Arc cosine"
@@ -650,9 +625,8 @@
 msgid "Arithmetic"
 msgstr "Arithmétique"
 
-#: ../controls/VariablePanel.py:732
-#: ../editors/DataTypeEditor.py:54
-#: ../editors/DataTypeEditor.py:634
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
 msgid "Array"
 msgstr "Tableau"
 
@@ -660,49 +634,37 @@
 msgid "Assignment"
 msgstr "Assignation"
 
-#: ../dialogs/FBDVariableDialog.py:197
+#: ../dialogs/FBDVariableDialog.py:226
 msgid "At least a variable or an expression must be selected!"
 msgstr "Au moins une variable ou une expression doit être sélectionné !"
 
-#: ../controls/ProjectPropertiesPanel.py:99
+#: ../controls/ProjectPropertiesPanel.py:111
 msgid "Author"
 msgstr "Auteur"
 
-#: ../controls/ProjectPropertiesPanel.py:96
+#: ../controls/ProjectPropertiesPanel.py:108
 msgid "Author Name (optional):"
 msgstr "Nom de l'auteur (optionel) :"
 
-#: ../dialogs/FindInPouDialog.py:72
+#: ../dialogs/FindInPouDialog.py:80
 msgid "Backward"
 msgstr "Vers le haut"
 
-#: ../util/Zeroconf.py:599
-msgid "Bad domain name (circular) at "
-msgstr "Mauvais nom de domaine (circulaire) à l'adresse"
-
-#: ../util/Zeroconf.py:602
-msgid "Bad domain name at "
-msgstr "Mauvais nom de domaine à l'adresse"
-
-#: ../canfestival/config_utils.py:341
-#: ../canfestival/config_utils.py:623
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
 #, python-format
 msgid "Bad location size : %s"
 msgstr "Mauvaise taille d'adresse : %s"
 
-#: ../editors/DataTypeEditor.py:174
-#: ../editors/DataTypeEditor.py:204
-#: ../editors/DataTypeEditor.py:296
-#: ../dialogs/ArrayTypeDialog.py:55
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
 msgid "Base Type:"
 msgstr "Type de base :"
 
-#: ../controls/VariablePanel.py:702
-#: ../editors/DataTypeEditor.py:624
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
 msgid "Base Types"
 msgstr "Types de base"
 
-#: ../Beremiz.py:511
+#: ../BeremizIDE.py:483
 msgid "Beremiz"
 msgstr "Beremiz"
 
@@ -734,154 +696,179 @@
 msgid "Bitwise inverting"
 msgstr "Inversion bit à bit"
 
-#: ../editors/Viewer.py:464
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
 msgid "Block"
 msgstr "Block"
 
-#: ../dialogs/FBDBlockDialog.py:38
+#: ../dialogs/FBDBlockDialog.py:63
 msgid "Block Properties"
 msgstr "Propriétés du bloc"
 
-#: ../editors/Viewer.py:433
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr "Nom du bloc"
+
+#: ../editors/Viewer.py:586
 msgid "Bottom"
 msgstr "Bas"
 
-#: ../dialogs/BrowseValuesLibraryDialog.py:37
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr "Cassé"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
 #, python-format
 msgid "Browse %s values library"
 msgstr "Explorer la liste des valeurs du paramètre '%s'"
 
-#: ../dialogs/BrowseLocationsDialog.py:61
+#: ../dialogs/BrowseLocationsDialog.py:72
 msgid "Browse Locations"
 msgstr "Naviger dans les adresses"
 
-#: ../ProjectController.py:1519
+#: ../ProjectController.py:1815
 msgid "Build"
 msgstr "Compiler"
 
-#: ../ProjectController.py:1079
+#: ../ProjectController.py:1335
 msgid "Build directory already clean\n"
 msgstr "Le répertoire de compilation est déjà nettoyé\n"
 
-#: ../ProjectController.py:1520
+#: ../ProjectController.py:1816
 msgid "Build project into build folder"
 msgstr "Compiler le projet dans le répertoire ce compilation"
 
-#: ../ProjectController.py:937
+#: ../ProjectController.py:1108
 msgid "C Build crashed !\n"
 msgstr "La compilation du C a mal fonctionné !\n"
 
-#: ../ProjectController.py:934
+#: ../ProjectController.py:1105
 msgid "C Build failed.\n"
 msgstr "La compilation du C a échouée !\n"
 
-#: ../c_ext/CFileEditor.py:731
+#: ../c_ext/CFileEditor.py:66
 msgid "C code"
 msgstr "Code C"
 
-#: ../ProjectController.py:922
+#: ../ProjectController.py:1186
 msgid "C code generated successfully.\n"
 msgstr "Code C généré avec succès.\n"
 
-#: ../targets/toolchain_gcc.py:132
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr "La compilation a échouée\n"
+
+#: ../targets/toolchain_gcc.py:199
 #, python-format
 msgid "C compilation of %s failed.\n"
 msgstr "La compilation C de %s a échouée.\n"
 
-#: ../features.py:8
+#: ../features.py:33
 msgid "C extension"
 msgstr "Extension C"
 
-#: ../canfestival/NetworkEditor.py:29
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr "C&redits"
+
+#: ../canfestival/NetworkEditor.py:58
 msgid "CANOpen network"
 msgstr "Réseau CANOpen"
 
-#: ../canfestival/SlaveEditor.py:21
+#: ../canfestival/SlaveEditor.py:48
 msgid "CANOpen slave"
 msgstr "Esclave CANOpen"
 
-#: ../features.py:7
+#: ../features.py:31
 msgid "CANopen support"
 msgstr "Support CANopen"
 
-#: ../plcopen/plcopen.py:1732
-#: ../plcopen/plcopen.py:1746
-#: ../plcopen/plcopen.py:1767
-#: ../plcopen/plcopen.py:1783
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
 msgid "Can only generate execution order on FBD networks!"
 msgstr "L'ordre d'exécution ne peut être généré que dans les FBD !"
 
-#: ../controls/VariablePanel.py:256
+#: ../controls/VariablePanel.py:291
 msgid "Can only give a location to local or global variables"
-msgstr "Une adresse ne peut être affecté qu'à des variables locales ou globales"
-
-#: ../PLCOpenEditor.py:336
+msgstr ""
+"Une adresse ne peut être affecté qu'à des variables locales ou globales"
+
+#: ../PLCOpenEditor.py:318
 #, python-format
 msgid "Can't generate program to file %s!"
 msgstr "Le programme n'a pu être généré dans le fichier \"%s\" !"
 
-#: ../controls/VariablePanel.py:254
+#: ../controls/VariablePanel.py:289
 msgid "Can't give a location to a function block instance"
 msgstr "Une adresse ne peut être affectée à une instance de Function Block"
 
-#: ../PLCOpenEditor.py:376
+#: ../PLCOpenEditor.py:363
 #, python-format
 msgid "Can't save project to file %s!"
 msgstr "Le projet n'a pu être sauvé dans le fichier \"%s\" !"
 
-#: ../controls/VariablePanel.py:300
+#: ../controls/VariablePanel.py:339
 msgid "Can't set an initial value to a function block instance"
-msgstr "Une valeur initiale ne peut être affectée une instance de Function Block"
-
-#: ../ConfigTreeNode.py:490
-#, python-format
-msgid "Cannot create child %s of type %s "
-msgstr "Impossible d'ajouter un élément \"%s\" de type \"%s\""
-
-#: ../ConfigTreeNode.py:417
+msgstr ""
+"Une valeur initiale ne peut être affectée une instance de Function Block"
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr "Impossible de créer l'enfant {a1} de type {a2}"
+
+#: ../ConfigTreeNode.py:454
 #, python-format
 msgid "Cannot find lower free IEC channel than %d\n"
 msgstr "Impossible de trouver un numéro IEC inférieur à %d libre\n"
 
-#: ../connectors/PYRO/__init__.py:92
+#: ../connectors/PYRO/__init__.py:139
 msgid "Cannot get PLC status - connection failed.\n"
 msgstr "Impossible d'obtenir le statut de l'automate - la connexion a échoué.\n"
 
-#: ../ProjectController.py:737
+#: ../ProjectController.py:967
 msgid "Cannot open/parse VARIABLES.csv!\n"
 msgstr "Impossible d'ouvrir ou d'analyser le fichier VARIABLES.csv !\n"
 
-#: ../canfestival/config_utils.py:371
-#, python-format
-msgid "Cannot set bit offset for non bool '%s' variable (ID:%d,Idx:%x,sIdx:%x))"
-msgstr "Impossible de définir un numéro de bit sur la variable '%s' non booléenne (ID:%d,Idx:%x,sIdx:%x)"
-
-#: ../dialogs/FindInPouDialog.py:81
-#: ../dialogs/SearchInProjectDialog.py:67
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+"Impossible de configurer l'offset du bit de la variable non booléenne '{a1}'"
+"  (ID:{a2},Idx:{a3},sIdx:{a4}))"
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+"Impossible de transférer lorsque l'API est en cours d'exécution. Arrêter "
+"maintenant?"
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
 msgid "Case sensitive"
 msgstr "Respecter la casse"
 
-#: ../editors/Viewer.py:428
+#: ../editors/Viewer.py:581
 msgid "Center"
 msgstr "Centre"
 
-#: ../Beremiz_service.py:326
+#: ../Beremiz_service.py:276
 msgid "Change IP of interface to bind"
 msgstr "Changer l'adresse IP de l'interface à lier"
 
-#: ../Beremiz_service.py:325
+#: ../Beremiz_service.py:275
 msgid "Change Name"
 msgstr "Changer le nom"
 
-#: ../IDEFrame.py:1850
+#: ../IDEFrame.py:1977
 msgid "Change POU Type To"
 msgstr "Changer le type du POU pour"
 
-#: ../Beremiz_service.py:327
+#: ../Beremiz_service.py:277
 msgid "Change Port Number"
 msgstr "Changer le numéro de port"
 
-#: ../Beremiz_service.py:328
+#: ../Beremiz_service.py:278
 msgid "Change working directory"
 msgstr "Changer le dossier de travail"
 
@@ -889,111 +876,122 @@
 msgid "Character string"
 msgstr "Chaîne de caractères"
 
-#: ../svgui/svgui.py:92
+#: ../svgui/svgui.py:136
 msgid "Choose a SVG file"
 msgstr "Choisissez un fichier SVG"
 
-#: ../ProjectController.py:364
+#: ../ProjectController.py:561
 msgid "Choose a directory to save project"
 msgstr "Choisissez un dossier où enregistrer le projet"
 
-#: ../canfestival/canfestival.py:136
-#: ../PLCOpenEditor.py:294
-#: ../PLCOpenEditor.py:326
-#: ../PLCOpenEditor.py:370
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
 msgid "Choose a file"
 msgstr "Choisissez un fichier"
 
-#: ../Beremiz.py:858
-#: ../Beremiz.py:893
+#: ../BeremizIDE.py:900
 msgid "Choose a project"
 msgstr "Choisissez un projet"
 
-#: ../dialogs/BrowseValuesLibraryDialog.py:42
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
 #, python-format
 msgid "Choose a value for %s:"
 msgstr "Choisissez une valeur pour le paramètre %s :"
 
-#: ../Beremiz_service.py:378
+#: ../Beremiz_service.py:333
 msgid "Choose a working directory "
 msgstr "Choisissez un dossier de travail"
 
-#: ../ProjectController.py:288
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr "Choisissez un dossier où créer le projet"
+
+#: ../ProjectController.py:468
 msgid "Chosen folder doesn't contain a program. It's not a valid project!"
-msgstr "Le répertoire ne contient pas de programme. Ce n'est pas un projet valide !"
-
-#: ../ProjectController.py:255
+msgstr ""
+"Le répertoire ne contient pas de programme. Ce n'est pas un projet valide !"
+
+#: ../ProjectController.py:435
 msgid "Chosen folder isn't empty. You can't use it for a new project!"
-msgstr "Le répertoire n'est pas vide. Vous ne pouvez pas l'utiliser pour créer un nouveau projet !"
-
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
+msgstr ""
+"Le répertoire n'est pas vide. Vous ne pouvez pas l'utiliser pour créer un "
+"nouveau projet !"
+
+#: ../controls/VariablePanel.py:60
 msgid "Class"
 msgstr "Classe"
 
-#: ../controls/VariablePanel.py:371
+#: ../controls/VariablePanel.py:472
 msgid "Class Filter:"
 msgstr "Filtre de classe :"
 
-#: ../dialogs/FBDVariableDialog.py:62
+#: ../dialogs/FBDVariableDialog.py:74
 msgid "Class:"
 msgstr "Classe :"
 
-#: ../ProjectController.py:1523
+#: ../ProjectController.py:1821
 msgid "Clean"
 msgstr "Nettoyer"
 
-#: ../ProjectController.py:1525
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr "Nettoyer les messages de log"
+
+#: ../ProjectController.py:1822
 msgid "Clean project build folder"
 msgstr "Nettoyer le répertoire de compilation"
 
-#: ../ProjectController.py:1076
+#: ../ProjectController.py:1332
 msgid "Cleaning the build directory\n"
 msgstr "Répertoire de compilation en cours de nettoyage\n"
 
-#: ../IDEFrame.py:416
+#: ../IDEFrame.py:437
 msgid "Clear Errors"
 msgstr "Effacer les erreurs"
 
-#: ../editors/Viewer.py:520
+#: ../editors/Viewer.py:680
 msgid "Clear Execution Order"
 msgstr "Effacer l'ordre d'exécution"
 
-#: ../editors/GraphicViewer.py:125
-msgid "Clear the graph values"
-msgstr "Vider les valeurs du graphique"
-
-#: ../Beremiz.py:633
-#: ../PLCOpenEditor.py:202
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr "Fermer"
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
 msgid "Close Application"
 msgstr "Fermer l'application"
 
-#: ../IDEFrame.py:972
-#: ../Beremiz.py:321
-#: ../Beremiz.py:587
-#: ../PLCOpenEditor.py:112
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
 msgid "Close Project"
 msgstr "Fermer le projet"
 
-#: ../Beremiz.py:319
-#: ../PLCOpenEditor.py:110
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
 msgid "Close Tab"
 msgstr "Fermer l'onglet"
 
-#: ../editors/Viewer.py:480
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
 msgid "Coil"
 msgstr "Relai"
 
-#: ../editors/Viewer.py:500
-#: ../editors/LDViewer.py:506
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
 msgid "Comment"
 msgstr "Commentaire"
 
-#: ../controls/ProjectPropertiesPanel.py:94
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr "Soutien de la communauté"
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr "Nom de l'entreprise"
+
+#: ../controls/ProjectPropertiesPanel.py:106
 msgid "Company Name (required):"
 msgstr "Nom de l'entreprise (obligatoire) :"
 
-#: ../controls/ProjectPropertiesPanel.py:95
+#: ../controls/ProjectPropertiesPanel.py:107
 msgid "Company URL (optional):"
 msgstr "URL de l'entreprise (optionel) :"
 
@@ -1001,7 +999,7 @@
 msgid "Comparison"
 msgstr "Comparaison"
 
-#: ../ProjectController.py:552
+#: ../ProjectController.py:756
 msgid "Compiling IEC Program into C code...\n"
 msgstr "Compilation du program en IEC vers du code C en cours...\n"
 
@@ -1009,90 +1007,93 @@
 msgid "Concatenation"
 msgstr "Concaténation"
 
-#: ../editors/ConfTreeNodeEditor.py:249
+#: ../editors/ConfTreeNodeEditor.py:241
 msgid "Config"
 msgstr "Configuration"
 
-#: ../editors/ProjectNodeEditor.py:13
+#: ../editors/ProjectNodeEditor.py:39
 msgid "Config variables"
 msgstr "Variables de configuration"
 
-#: ../dialogs/SearchInProjectDialog.py:47
+#: ../dialogs/SearchInProjectDialog.py:43
 msgid "Configuration"
 msgstr "Configuration"
 
-#: ../PLCControler.py:96
+#: ../plcopen/types_enums.py:77
 msgid "Configurations"
 msgstr "Configurations"
 
-#: ../ProjectController.py:1538
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr "Confirmer ou changer de nom de variable"
+
+#: ../ProjectController.py:1842
 msgid "Connect"
 msgstr "Connecter"
 
-#: ../ProjectController.py:1539
+#: ../ProjectController.py:1843
 msgid "Connect to the target PLC"
 msgstr "Connecter à l'automate cible"
 
-#: ../ProjectController.py:1125
+#: ../ProjectController.py:1391
 #, python-format
 msgid "Connected to URI: %s"
 msgstr "Connecté à l'URI : %s"
 
-#: ../connectors/PYRO/__init__.py:40
-#, python-format
-msgid "Connecting to URI : %s\n"
-msgstr "Connection à l'URI %s en cours...\n"
-
-#: ../editors/Viewer.py:466
-#: ../dialogs/SFCTransitionDialog.py:76
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
 msgid "Connection"
 msgstr "Connexion"
 
-#: ../dialogs/ConnectionDialog.py:37
+#: ../dialogs/ConnectionDialog.py:55
 msgid "Connection Properties"
 msgstr "Propriétés de la connexion"
 
-#: ../ProjectController.py:1397
+#: ../ProjectController.py:1691
 msgid "Connection canceled!\n"
 msgstr "La connection a été abandonnée !\n"
 
-#: ../ProjectController.py:1422
+#: ../ProjectController.py:1714
 #, python-format
 msgid "Connection failed to %s!\n"
 msgstr "La connection à \"%s\" a échouée !\n"
 
-#: ../connectors/PYRO/__init__.py:63
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr "Connexion perdu\n"
+
+#: ../connectors/PYRO/__init__.py:110
 #, python-format
 msgid "Connection to '%s' failed.\n"
 msgstr "La connexion à l'adresse '%s' a échouée.\n"
 
-#: ../editors/Viewer.py:1426
-#: ../dialogs/ConnectionDialog.py:56
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
 msgid "Connector"
 msgstr "Connecteur"
 
-#: ../dialogs/SFCStepDialog.py:58
+#: ../dialogs/SFCStepDialog.py:68
 msgid "Connectors:"
 msgstr "Connecteurs :"
 
-#: ../Beremiz.py:420
+#: ../BeremizIDE.py:378
 msgid "Console"
 msgstr "Console"
 
-#: ../controls/VariablePanel.py:65
+#: ../controls/VariablePanel.py:75
 msgid "Constant"
 msgstr "Constante"
 
-#: ../editors/Viewer.py:476
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
 msgid "Contact"
 msgstr "Contact"
 
-#: ../controls/ProjectPropertiesPanel.py:197
+#: ../controls/ProjectPropertiesPanel.py:217
 msgid "Content Description (optional):"
 msgstr "Description du contenu (optionel) :"
 
-#: ../editors/Viewer.py:1427
-#: ../dialogs/ConnectionDialog.py:61
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
 msgid "Continuation"
 msgstr "Prolongement"
 
@@ -1112,21 +1113,20 @@
 msgid "Conversion to time-of-day"
 msgstr "Conversion en heure de la journée"
 
-#: ../IDEFrame.py:353
-#: ../IDEFrame.py:406
-#: ../editors/Viewer.py:536
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
 msgid "Copy"
 msgstr "Copier"
 
-#: ../IDEFrame.py:1837
+#: ../IDEFrame.py:1964
 msgid "Copy POU"
 msgstr "Copier ce POU"
 
-#: ../editors/FileManagementPanel.py:65
+#: ../editors/FileManagementPanel.py:68
 msgid "Copy file from left folder to right"
 msgstr "Copier un fichier du dossier de gauche vers celui de droite"
 
-#: ../editors/FileManagementPanel.py:64
+#: ../editors/FileManagementPanel.py:67
 msgid "Copy file from right folder to left"
 msgstr "Copier un fichier du dossier de droite vers celui de gauche"
 
@@ -1134,174 +1134,163 @@
 msgid "Cosine"
 msgstr "Cosinus"
 
-#: ../ConfigTreeNode.py:602
-#, python-format
-msgid ""
-"Could not add child \"%s\", type %s :\n"
-"%s\n"
-msgstr ""
-"Impossible d'ajouter le noeud enfant \"%s\",  de type %s :\n"
-"%s\n"
-
-#: ../ConfigTreeNode.py:579
-#, python-format
-msgid ""
-"Couldn't load confnode base parameters %s :\n"
-" %s"
-msgstr ""
-"Impossible de charger les paramètres de base du plugin %s :\n"
-" %s"
-
-#: ../ConfigTreeNode.py:590
-#, python-format
-msgid ""
-"Couldn't load confnode parameters %s :\n"
-" %s"
-msgstr ""
-"Impossible de charger les paramètres du plugin %s :\n"
-" %s"
-
-#: ../PLCControler.py:819
-#: ../PLCControler.py:856
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+"Impossible d'ajouter l'enfant \"{a1}\", de type {a2}:\n"
+"{a3}\n"
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr "Impossible d'importer l'ancien fichier %s"
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Impossible de charger les parametres de base confnode {a1}:\n"
+"{a2}"
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Impossible de charger les parametres confnode {a1}:\n"
+"{a2}"
+
+#: ../PLCControler.py:552
 msgid "Couldn't paste non-POU object."
 msgstr "Impossible de coller autre chose qu'un POU."
 
-#: ../ProjectController.py:1344
+#: ../ProjectController.py:1636
 msgid "Couldn't start PLC !\n"
 msgstr "Impossible de démarrer l'automate !\n"
 
-#: ../ProjectController.py:1352
+#: ../ProjectController.py:1644
 msgid "Couldn't stop PLC !\n"
 msgstr "Impossible d'arrêter l'automate !\n"
 
-#: ../ProjectController.py:1321
-msgid "Couldn't stop debugger.\n"
-msgstr "Impossible d'arrêter le débogage de l'automate !\n"
-
-#: ../svgui/svgui.py:22
+#: ../svgui/svgui.py:57
 msgid "Create HMI"
 msgstr "Créer une IHM"
 
-#: ../dialogs/PouDialog.py:43
+#: ../dialogs/PouDialog.py:54
 msgid "Create a new POU"
 msgstr "Créer un nouveau POU"
 
-#: ../dialogs/PouActionDialog.py:38
+#: ../dialogs/PouActionDialog.py:45
 msgid "Create a new action"
 msgstr "Créer une nouvelle action"
 
-#: ../IDEFrame.py:142
+#: ../IDEFrame.py:166
 msgid "Create a new action block"
 msgstr "Créer un nouveau bloc d'actions"
 
-#: ../IDEFrame.py:91
-#: ../IDEFrame.py:121
-#: ../IDEFrame.py:154
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
 msgid "Create a new block"
 msgstr "Créer un nouveau bloc"
 
-#: ../IDEFrame.py:115
+#: ../IDEFrame.py:139
 msgid "Create a new branch"
 msgstr "Créer une nouvelle branche"
 
-#: ../IDEFrame.py:109
+#: ../IDEFrame.py:133
 msgid "Create a new coil"
 msgstr "Créer un nouveau relai"
 
-#: ../IDEFrame.py:85
-#: ../IDEFrame.py:100
-#: ../IDEFrame.py:130
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
 msgid "Create a new comment"
 msgstr "Créer un nouveau copmmentaire"
 
-#: ../IDEFrame.py:94
-#: ../IDEFrame.py:124
-#: ../IDEFrame.py:157
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
 msgid "Create a new connection"
 msgstr "Créer une nouvelle connexion"
 
-#: ../IDEFrame.py:112
-#: ../IDEFrame.py:163
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
 msgid "Create a new contact"
 msgstr "Créer un nouveau contact"
 
-#: ../IDEFrame.py:145
+#: ../IDEFrame.py:169
 msgid "Create a new divergence"
 msgstr "Créer une nouvelle divergence"
 
-#: ../dialogs/SFCDivergenceDialog.py:36
+#: ../dialogs/SFCDivergenceDialog.py:54
 msgid "Create a new divergence or convergence"
 msgstr "Créer une nouvelle divergence ou convergence"
 
-#: ../IDEFrame.py:133
+#: ../IDEFrame.py:157
 msgid "Create a new initial step"
 msgstr "Créer une nouvelle étape initiale"
 
-#: ../IDEFrame.py:148
+#: ../IDEFrame.py:172
 msgid "Create a new jump"
 msgstr "Créer un nouveau renvoi"
 
-#: ../IDEFrame.py:103
-#: ../IDEFrame.py:160
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
 msgid "Create a new power rail"
 msgstr "Créer une nouvelle barre d'alimentation"
 
-#: ../IDEFrame.py:106
+#: ../IDEFrame.py:130
 msgid "Create a new rung"
 msgstr "Créer un nouvel échelon"
 
-#: ../IDEFrame.py:136
+#: ../IDEFrame.py:160
 msgid "Create a new step"
 msgstr "Créer une nouvelle étape"
 
-#: ../IDEFrame.py:139
-#: ../dialogs/PouTransitionDialog.py:42
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
 msgid "Create a new transition"
 msgstr "Créer une nouvelle transition"
 
-#: ../IDEFrame.py:88
-#: ../IDEFrame.py:118
-#: ../IDEFrame.py:151
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
 msgid "Create a new variable"
 msgstr "Créer une nouvelle variable"
 
-#: ../IDEFrame.py:351
-#: ../IDEFrame.py:405
-#: ../editors/Viewer.py:535
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr "Credits"
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr "Répertoire de travail actuel :"
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
 msgid "Cut"
 msgstr "Couper"
 
-#: ../editors/ResourceEditor.py:72
+#: ../editors/ResourceEditor.py:81
 msgid "Cyclic"
 msgstr "Périodique"
 
-#: ../plcopen/iec_std.csv:42
-#: ../plcopen/iec_std.csv:44
-#: ../plcopen/iec_std.csv:46
-#: ../plcopen/iec_std.csv:50
-#: ../plcopen/iec_std.csv:52
-#: ../plcopen/iec_std.csv:54
-#: ../plcopen/iec_std.csv:56
-#: ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
 #: ../plcopen/iec_std.csv:60
 msgid "DEPRECATED"
 msgstr "OBSOLETE"
 
-#: ../canfestival/SlaveEditor.py:53
-#: ../canfestival/NetworkEditor.py:74
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
 msgid "DS-301 Profile"
 msgstr "Profil DS-301"
 
-#: ../canfestival/SlaveEditor.py:54
-#: ../canfestival/NetworkEditor.py:75
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
 msgid "DS-302 Profile"
 msgstr "Profil DS-302"
 
-#: ../dialogs/SearchInProjectDialog.py:43
+#: ../dialogs/SearchInProjectDialog.py:39
 msgid "Data Type"
 msgstr "Type de donnée"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:76
 msgid "Data Types"
 msgstr "Types de données"
 
@@ -1309,86 +1298,73 @@
 msgid "Data type conversion"
 msgstr "Conversion entre types de donnée"
 
-#: ../plcopen/iec_std.csv:44
-#: ../plcopen/iec_std.csv:45
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
 msgid "Date addition"
 msgstr "Addition de dates"
 
-#: ../plcopen/iec_std.csv:56
-#: ../plcopen/iec_std.csv:57
-#: ../plcopen/iec_std.csv:58
-#: ../plcopen/iec_std.csv:59
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
 msgid "Date and time subtraction"
 msgstr "Soustraction entre horodatage"
 
-#: ../plcopen/iec_std.csv:50
-#: ../plcopen/iec_std.csv:51
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
 msgid "Date subtraction"
 msgstr "Soustraction de date"
 
-#: ../dialogs/DurationEditorDialog.py:43
+#: ../dialogs/DurationEditorDialog.py:46
 msgid "Days:"
 msgstr "Jours :"
 
-#: ../ProjectController.py:1444
+#: ../ProjectController.py:1729
 msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
-msgstr "Les informations de débogage ne correspond pas l'automate connecté  - Arrêter/transférez/démarrer pour pouvoir débogguer.\n"
-
-#: ../controls/PouInstanceVariablesPanel.py:59
+msgstr ""
+"Les informations de débogage ne correspond pas l'automate connecté  - "
+"Arrêter/transférez/démarrer pour pouvoir débogguer.\n"
+
+#: ../controls/PouInstanceVariablesPanel.py:144
 msgid "Debug instance"
 msgstr "Déboguer l'instance"
 
-#: ../editors/Viewer.py:1016
-#: ../editors/Viewer.py:3326
+#: ../editors/Viewer.py:490
 #, python-format
 msgid "Debug: %s"
 msgstr "Débogage : %s"
 
-#: ../ProjectController.py:1153
+#: ../ProjectController.py:1471
 #, python-format
 msgid "Debug: Unknown variable '%s'\n"
 msgstr "Débogage : Variable '%s' inconnue\n"
 
-#: ../ProjectController.py:1151
+#: ../ProjectController.py:1469
 #, python-format
 msgid "Debug: Unsupported type to debug '%s'\n"
 msgstr "Débogage : Type non supporté dans le débogage '%'\n"
 
-#: ../IDEFrame.py:612
+#: ../IDEFrame.py:660
 msgid "Debugger"
 msgstr "Déboggueur"
 
-#: ../ProjectController.py:1311
-msgid "Debugger disabled\n"
-msgstr "Débogueur désactivé\n"
-
-#: ../ProjectController.py:1441
+#: ../ProjectController.py:1726
 msgid "Debugger ready\n"
 msgstr "Débogueur \n"
 
-#: ../ProjectController.py:1323
-msgid "Debugger stopped.\n"
-msgstr "Débogueur désactivé\n"
-
-#: ../IDEFrame.py:1866
-#: ../Beremiz.py:991
-#: ../editors/Viewer.py:511
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
 msgid "Delete"
 msgstr "Supprimer"
 
-#: ../editors/Viewer.py:453
+#: ../editors/Viewer.py:610
 msgid "Delete Divergence Branch"
 msgstr "Supprimer une branche de divergence"
 
-#: ../editors/FileManagementPanel.py:153
+#: ../editors/FileManagementPanel.py:157
 msgid "Delete File"
 msgstr "Supprimer un fichier"
 
-#: ../editors/Viewer.py:442
+#: ../editors/Viewer.py:597
 msgid "Delete Wire Segment"
 msgstr "Supprimer un segment de fil"
 
-#: ../controls/CustomEditableListBox.py:41
+#: ../controls/CustomEditableListBox.py:44
 msgid "Delete item"
 msgstr "Supprimer un élément"
 
@@ -1396,48 +1372,47 @@
 msgid "Deletion (within)"
 msgstr "Suppression (au milieu)"
 
-#: ../editors/DataTypeEditor.py:152
+#: ../editors/DataTypeEditor.py:161
 msgid "Derivation Type:"
 msgstr "Type de dérivation :"
 
-#: ../plcopen/structures.py:263
-msgid ""
-"Derivative\n"
-"The derivative function block produces an output XOUT proportional to the rate of change of the input XIN."
-msgstr ""
-"Dérivée\n"
-"Le Function Block derivative produit une sortie XOUT proportionnelle au rapport de changement de l'entrée XIN."
-
-#: ../controls/VariablePanel.py:362
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr "Description"
+
+#: ../controls/VariablePanel.py:463
 msgid "Description:"
 msgstr "Description :"
 
-#: ../editors/DataTypeEditor.py:320
-#: ../dialogs/ArrayTypeDialog.py:61
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
 msgid "Dimensions:"
 msgstr "Dimensions :"
 
-#: ../dialogs/FindInPouDialog.py:61
+#: ../dialogs/FindInPouDialog.py:69
 msgid "Direction"
 msgstr "Direction"
 
-#: ../dialogs/BrowseLocationsDialog.py:86
+#: ../dialogs/BrowseLocationsDialog.py:102
 msgid "Direction:"
 msgstr "Direction :"
 
-#: ../editors/DataTypeEditor.py:54
+#: ../editors/DataTypeEditor.py:60
 msgid "Directly"
 msgstr "Direct"
 
-#: ../ProjectController.py:1547
+#: ../ProjectController.py:1855
 msgid "Disconnect"
 msgstr "Déconnecter"
 
-#: ../ProjectController.py:1549
+#: ../ProjectController.py:1856
 msgid "Disconnect from PLC"
 msgstr "Déconnecter l'automate"
 
-#: ../editors/Viewer.py:495
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr "Déconnecté"
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
 msgid "Divergence"
 msgstr "Divergence"
 
@@ -1445,128 +1420,120 @@
 msgid "Division"
 msgstr "Division"
 
-#: ../editors/FileManagementPanel.py:152
+#: ../editors/FileManagementPanel.py:156
 #, python-format
 msgid "Do you really want to delete the file '%s'?"
 msgstr "Êtes-vous sûr de vouloir supprimer le fichier '%s' ?"
 
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
+#: ../controls/VariablePanel.py:65
 msgid "Documentation"
 msgstr "Documentation"
 
-#: ../PLCOpenEditor.py:330
+#: ../PLCOpenEditor.py:312
 msgid "Done"
 msgstr "Terminé"
 
-#: ../plcopen/structures.py:226
-msgid ""
-"Down-counter\n"
-"The down-counter can be used to signal when a count has reached zero, on counting down from a preset value."
-msgstr ""
-"Compteur décrémental\n"
-"Le compteur décrémental peut être utilisé pour signaler lorsque le compteur atteint zéro en partant d'une valeur prédéfinie."
-
-#: ../dialogs/ActionBlockDialog.py:37
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Duration"
 msgstr "Durée"
 
-#: ../canfestival/canfestival.py:139
+#: ../canfestival/canfestival.py:174
 msgid "EDS files (*.eds)|*.eds|All files|*.*"
 msgstr "Fichiers EDS (*.eds)|*.eds|Tous les fichiers|*.*"
 
-#: ../editors/Viewer.py:509
+#: ../editors/Viewer.py:668
 msgid "Edit Block"
 msgstr "Editer le block"
 
-#: ../dialogs/LDElementDialog.py:41
+#: ../dialogs/LDElementDialog.py:58
 msgid "Edit Coil Values"
 msgstr "Editer les valeurs du relai"
 
-#: ../dialogs/LDElementDialog.py:38
+#: ../dialogs/LDElementDialog.py:56
 msgid "Edit Contact Values"
 msgstr "Editer les valeurs du contact"
 
-#: ../dialogs/DurationEditorDialog.py:59
+#: ../dialogs/DurationEditorDialog.py:62
 msgid "Edit Duration"
 msgstr "Editer une durée"
 
-#: ../dialogs/SFCStepDialog.py:35
+#: ../dialogs/SFCStepDialog.py:53
 msgid "Edit Step"
 msgstr "Editer l'étape"
 
-#: ../wxglade_hmi/wxglade_hmi.py:12
+#: ../wxglade_hmi/wxglade_hmi.py:45
 msgid "Edit a WxWidgets GUI with WXGlade"
 msgstr "Editer une IHM WxWidgets à l'aide de WXGlade"
 
-#: ../dialogs/ActionBlockDialog.py:122
+#: ../dialogs/ActionBlockDialog.py:127
 msgid "Edit action block properties"
 msgstr "Editer les propriétés du block d'actions"
 
-#: ../dialogs/ArrayTypeDialog.py:45
+#: ../dialogs/ArrayTypeDialog.py:47
 msgid "Edit array type properties"
 msgstr "Editer les propriétés d'un type de données tableau"
 
-#: ../editors/Viewer.py:2186
-#: ../editors/Viewer.py:2188
-#: ../editors/Viewer.py:2706
-#: ../editors/Viewer.py:2708
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
 msgid "Edit comment"
 msgstr "Editer le commentaire"
 
-#: ../editors/FileManagementPanel.py:66
+#: ../editors/FileManagementPanel.py:69
 msgid "Edit file"
 msgstr "Editer un fichier"
 
-#: ../controls/CustomEditableListBox.py:39
+#: ../controls/CustomEditableListBox.py:42
 msgid "Edit item"
 msgstr "Editer l'élément"
 
-#: ../editors/Viewer.py:2670
+#: ../editors/Viewer.py:3059
 msgid "Edit jump target"
 msgstr "Editer la cible du renvoi"
 
-#: ../ProjectController.py:1561
+#: ../ProjectController.py:1873
 msgid "Edit raw IEC code added to code generated by PLCGenerator"
 msgstr "Editer le code IEC ajouté au code généré par PLCGenerator"
 
-#: ../editors/SFCViewer.py:725
+#: ../editors/SFCViewer.py:815
 msgid "Edit step name"
 msgstr "Editer le nom de l'étape"
 
-#: ../dialogs/SFCTransitionDialog.py:38
+#: ../dialogs/SFCTransitionDialog.py:53
 msgid "Edit transition"
 msgstr "Editer la transition"
 
-#: ../IDEFrame.py:584
+#: ../IDEFrame.py:632
 msgid "Editor ToolBar"
 msgstr "Barre d'outils d'édition"
 
-#: ../ProjectController.py:1039
+#: ../ProjectController.py:1294
 msgid "Editor selection"
 msgstr "Selection d'un éditeur"
 
-#: ../editors/DataTypeEditor.py:347
+#: ../editors/DataTypeEditor.py:360
 msgid "Elements :"
 msgstr "Eléments :"
 
-#: ../IDEFrame.py:348
-msgid "Enable Undo/Redo"
-msgstr "Activer Défaire/Refaire"
-
-#: ../Beremiz_service.py:385
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr "Vide"
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr "Dimension ne peut être vide."
+
+#: ../Beremiz_service.py:341
 msgid "Enter a name "
 msgstr "Saisissez un nom"
 
-#: ../Beremiz_service.py:370
+#: ../Beremiz_service.py:326
 msgid "Enter a port number "
 msgstr "Saisissez un numéro de port"
 
-#: ../Beremiz_service.py:360
+#: ../Beremiz_service.py:317
 msgid "Enter the IP of the interface to bind"
 msgstr "Saisissez l'adresse IP de l'interface à lier"
 
-#: ../editors/DataTypeEditor.py:54
+#: ../editors/DataTypeEditor.py:60
 msgid "Enumerated"
 msgstr "Enumération"
 
@@ -1574,67 +1541,49 @@
 msgid "Equal to"
 msgstr "Egal à"
 
-#: ../Beremiz_service.py:271
-#: ../controls/VariablePanel.py:332
-#: ../controls/VariablePanel.py:681
-#: ../controls/DebugVariablePanel.py:379
-#: ../IDEFrame.py:966
-#: ../IDEFrame.py:1553
-#: ../IDEFrame.py:1590
-#: ../IDEFrame.py:1595
-#: ../IDEFrame.py:1609
-#: ../IDEFrame.py:1614
-#: ../IDEFrame.py:2290
-#: ../Beremiz.py:1131
-#: ../PLCOpenEditor.py:337
-#: ../PLCOpenEditor.py:342
-#: ../PLCOpenEditor.py:416
-#: ../PLCOpenEditor.py:426
-#: ../editors/TextViewer.py:369
-#: ../editors/DataTypeEditor.py:549
-#: ../editors/DataTypeEditor.py:554
-#: ../editors/DataTypeEditor.py:578
-#: ../editors/DataTypeEditor.py:583
-#: ../editors/DataTypeEditor.py:593
-#: ../editors/DataTypeEditor.py:744
-#: ../editors/DataTypeEditor.py:751
-#: ../editors/Viewer.py:365
-#: ../editors/LDViewer.py:666
-#: ../editors/LDViewer.py:882
-#: ../editors/LDViewer.py:886
-#: ../ProjectController.py:225
-#: ../dialogs/PouNameDialog.py:53
-#: ../dialogs/PouTransitionDialog.py:107
-#: ../dialogs/BrowseLocationsDialog.py:212
-#: ../dialogs/ProjectDialog.py:71
-#: ../dialogs/SFCStepNameDialog.py:59
-#: ../dialogs/ConnectionDialog.py:159
-#: ../dialogs/FBDVariableDialog.py:201
-#: ../dialogs/PouActionDialog.py:104
-#: ../dialogs/BrowseValuesLibraryDialog.py:83
-#: ../dialogs/PouDialog.py:132
-#: ../dialogs/SFCTransitionDialog.py:147
-#: ../dialogs/DurationEditorDialog.py:121
-#: ../dialogs/DurationEditorDialog.py:163
-#: ../dialogs/SearchInProjectDialog.py:157
-#: ../dialogs/SFCStepDialog.py:130
-#: ../dialogs/ArrayTypeDialog.py:97
-#: ../dialogs/ArrayTypeDialog.py:103
-#: ../dialogs/FBDBlockDialog.py:164
-#: ../dialogs/ForceVariableDialog.py:179
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
 msgid "Error"
 msgstr "Erreur"
 
-#: ../ProjectController.py:601
-msgid "Error : At least one configuration and one resource must be declared in PLC !\n"
-msgstr "Erreur : Au moins une configuration ou une ressource doit être déclarée dans l'automate !\n"
-
-#: ../ProjectController.py:593
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+"Erreur : Au moins une configuration ou une ressource doit être déclarée dans"
+" l'automate !\n"
+
+#: ../ProjectController.py:803
 #, python-format
 msgid "Error : IEC to C compiler returned %d\n"
 msgstr "Erreur : Le compilateur d'IEC en C a retourné %d\n"
 
-#: ../ProjectController.py:534
+#: ../ProjectController.py:731
 #, python-format
 msgid ""
 "Error in ST/IL/SFC code generator :\n"
@@ -1643,38 +1592,46 @@
 "Erreur dans le générateur de code ST/IL/SFC :\n"
 "%s\n"
 
-#: ../ConfigTreeNode.py:183
+#: ../ConfigTreeNode.py:219
 #, python-format
 msgid "Error while saving \"%s\"\n"
 msgstr "Erreur lors de l'enregistrement de \"%s\"\n"
 
-#: ../canfestival/canfestival.py:144
+#: ../canfestival/canfestival.py:179
 msgid "Error: Export slave failed\n"
 msgstr "Erreur : L'export de l'esclave a échoué\n"
 
-#: ../canfestival/canfestival.py:345
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+"Erreur: Les serveurs Modbus/IP %{a1}.x et %{a2}.x utilisent le même numéro "
+"de port {a3}.\n"
+
+#: ../canfestival/canfestival.py:388
 msgid "Error: No Master generated\n"
 msgstr "Erreur : Aucun maître généré\n"
 
-#: ../canfestival/canfestival.py:340
+#: ../canfestival/canfestival.py:383
 msgid "Error: No PLC built\n"
 msgstr "Erreur : Aucun automate compilé\n"
 
-#: ../ProjectController.py:1416
+#: ../ProjectController.py:1708
 #, python-format
 msgid "Exception while connecting %s!\n"
 msgstr "Une exception est apparu au cours de la connexion %s !\n"
 
-#: ../dialogs/FBDBlockDialog.py:95
+#: ../dialogs/FBDBlockDialog.py:123
 msgid "Execution Control:"
 msgstr "Contrôle d'exécution :"
 
-#: ../dialogs/FBDVariableDialog.py:76
-#: ../dialogs/FBDBlockDialog.py:87
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
 msgid "Execution Order:"
 msgstr "Ordre d'exécution :"
 
-#: ../features.py:11
+#: ../features.py:36
 msgid "Experimental web based HMI"
 msgstr "IHM expérimentale utilisant les technologies web"
 
@@ -1686,80 +1643,77 @@
 msgid "Exponentiation"
 msgstr "Exponentiel"
 
-#: ../canfestival/canfestival.py:150
+#: ../canfestival/canfestival.py:186
 msgid "Export CanOpen slave to EDS file"
 msgstr "Exporter un esclave CANopen sous la forme d'un fichier EDS"
 
-#: ../controls/DebugVariablePanel.py:1472
-#: ../editors/GraphicViewer.py:144
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
 msgid "Export graph values to clipboard"
 msgstr "Exporter les valeurs du graphique vers le presse-papier"
 
-#: ../canfestival/canfestival.py:149
+#: ../canfestival/canfestival.py:185
 msgid "Export slave"
 msgstr "Exporter un esclave"
 
-#: ../dialogs/FBDVariableDialog.py:69
+#: ../dialogs/FBDVariableDialog.py:94
 msgid "Expression:"
 msgstr "Expression :"
 
-#: ../controls/VariablePanel.py:77
+#: ../controls/VariablePanel.py:90
 msgid "External"
 msgstr "Externe"
 
-#: ../ProjectController.py:605
+#: ../ProjectController.py:826
 msgid "Extracting Located Variables...\n"
 msgstr "Extraction des variables adressées en cours...\n"
 
-#: ../controls/ProjectPropertiesPanel.py:143
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "FBD"
 msgstr "FBD"
 
-#: ../ProjectController.py:1480
+#: ../ProjectController.py:1773
 msgid "Failed : Must build before transfer.\n"
 msgstr "Echec : Le projet doit être compilé avant d'être transféré.\n"
 
-#: ../editors/Viewer.py:404
-#: ../dialogs/LDElementDialog.py:84
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
 msgid "Falling Edge"
 msgstr "Front descendant"
 
-#: ../plcopen/structures.py:216
-msgid ""
-"Falling edge detector\n"
-"The output produces a single pulse when a falling edge is detected."
-msgstr ""
-"Détecteur de front descendant\n"
-"La sortie produit une impulsion unique lorsqu'un front descendant est détecté."
-
-#: ../ProjectController.py:927
+#: ../ProjectController.py:1098
 msgid "Fatal : cannot get builder.\n"
 msgstr "Erreur fatale : impossible de trouver un compilateur.\n"
 
-#: ../dialogs/DurationEditorDialog.py:160
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr "Recherche %s"
+
+#: ../dialogs/DurationEditorDialog.py:167
 #, python-format
 msgid "Field %s hasn't a valid value!"
 msgstr "Le champ %s n'a pas une valeur valide !"
 
-#: ../dialogs/DurationEditorDialog.py:162
+#: ../dialogs/DurationEditorDialog.py:169
 #, python-format
 msgid "Fields %s haven't a valid value!"
 msgstr "Les champs %s n'ont pas une valeur valide !"
 
-#: ../IDEFrame.py:358
-#: ../dialogs/FindInPouDialog.py:30
-#: ../dialogs/FindInPouDialog.py:99
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr "Le fichier '%s' existe déjà !"
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
 msgid "Find"
 msgstr "Rechercher"
 
-#: ../IDEFrame.py:360
+#: ../IDEFrame.py:379
 msgid "Find Next"
 msgstr "Recherche suivante"
 
-#: ../IDEFrame.py:362
+#: ../IDEFrame.py:381
 msgid "Find Previous"
 msgstr "Recherche précédente"
 
@@ -1767,101 +1721,90 @@
 msgid "Find position"
 msgstr "Trouver la position"
 
-#: ../dialogs/FindInPouDialog.py:51
+#: ../dialogs/FindInPouDialog.py:58
 msgid "Find:"
 msgstr "Rechercher :"
 
-#: ../connectors/PYRO/__init__.py:125
-msgid "Force runtime reload\n"
-msgstr "Redémarrage du runtime forcé\n"
-
-#: ../controls/DebugVariablePanel.py:1934
-#: ../editors/Viewer.py:1385
+#: ../editors/Viewer.py:1633
 msgid "Force value"
 msgstr "Forcer la valeur"
 
-#: ../dialogs/ForceVariableDialog.py:162
+#: ../dialogs/ForceVariableDialog.py:176
 msgid "Forcing Variable Value"
 msgstr "Forcer la valeur de la variable"
 
-#: ../dialogs/PouTransitionDialog.py:97
-#: ../dialogs/ProjectDialog.py:70
-#: ../dialogs/PouActionDialog.py:94
-#: ../dialogs/PouDialog.py:114
-#: ../dialogs/SFCTransitionDialog.py:147
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
 #, python-format
 msgid "Form isn't complete. %s must be filled!"
 msgstr "Le formulaire est incomplet. %s doit être complété !"
 
-#: ../dialogs/ConnectionDialog.py:149
-#: ../dialogs/FBDBlockDialog.py:154
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
 msgid "Form isn't complete. Name must be filled!"
 msgstr "Le formulaire est incomplet. Le nom doit être complété !"
 
-#: ../dialogs/SearchInProjectDialog.py:145
-msgid "Form isn't complete. Pattern to search must be filled!"
-msgstr "Le formulaire est incomplet. Le modèle à chercher doit être complété !"
-
-#: ../dialogs/FBDBlockDialog.py:152
+#: ../dialogs/FBDBlockDialog.py:235
 msgid "Form isn't complete. Valid block type must be selected!"
-msgstr "Le formulaire est incomplet. Un type de bloc valide doit être sélectionné !"
-
-#: ../dialogs/FindInPouDialog.py:67
+msgstr ""
+"Le formulaire est incomplet. Un type de bloc valide doit être sélectionné !"
+
+#: ../dialogs/FindInPouDialog.py:75
 msgid "Forward"
 msgstr "Vers le bas"
 
-#: ../dialogs/SearchInProjectDialog.py:44
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
 msgid "Function"
 msgstr "Fonction"
 
-#: ../IDEFrame.py:334
+#: ../IDEFrame.py:354
 msgid "Function &Block"
 msgstr "&Bloc Fonctionnel"
 
-#: ../IDEFrame.py:1845
-#: ../dialogs/SearchInProjectDialog.py:45
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
 msgid "Function Block"
 msgstr "Bloc fonctionnel"
 
-#: ../controls/VariablePanel.py:744
+#: ../controls/VariablePanel.py:868
 msgid "Function Block Types"
 msgstr "Types de blocs fonctionnels"
 
-#: ../PLCControler.py:94
+#: ../plcopen/types_enums.py:75
 msgid "Function Blocks"
 msgstr "Blocs fonctionnels"
 
-#: ../editors/Viewer.py:236
+#: ../editors/Viewer.py:290
 msgid "Function Blocks can't be used in Functions!"
 msgstr "Les blocs fonctionnels ne peuvent être utilisés dans des functions !"
 
-#: ../PLCControler.py:2180
+#: ../PLCControler.py:1907
 #, python-format
 msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
 msgstr "Le bloc fonctionnel \"%s\" ne peuvent être collés dans une function !"
 
-#: ../PLCControler.py:94
+#: ../plcopen/types_enums.py:75
 msgid "Functions"
 msgstr "Fonctions"
 
-#: ../PLCOpenEditor.py:119
+#: ../PLCOpenEditor.py:88
 msgid "Generate Program"
 msgstr "Générer le program"
 
-#: ../ProjectController.py:524
+#: ../ProjectController.py:722
 msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
 msgstr "Création du code ST/IL/SFC de l'automate IEC-61131 en cours...\n"
 
-#: ../controls/VariablePanel.py:78
+#: ../controls/VariablePanel.py:91
 msgid "Global"
 msgstr "Globale"
 
-#: ../controls/DebugVariablePanel.py:1471
-#: ../editors/GraphicViewer.py:131
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
 msgid "Go to current value"
 msgstr "Aller à la valeur actuelle"
 
-#: ../controls/ProjectPropertiesPanel.py:173
+#: ../controls/ProjectPropertiesPanel.py:189
 msgid "Graphics"
 msgstr "Graphiques"
 
@@ -1873,119 +1816,116 @@
 msgid "Greater than or equal to"
 msgstr "Supérieur ou égal à"
 
-#: ../controls/ProjectPropertiesPanel.py:134
+#: ../controls/ProjectPropertiesPanel.py:149
 msgid "Grid Resolution:"
 msgstr "Résolution de la grille :"
 
-#: ../controls/ProjectPropertiesPanel.py:120
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr "Port d'interface HTTP:"
+
+#: ../controls/ProjectPropertiesPanel.py:135
 msgid "Height:"
 msgstr "Hauteur :"
 
-#: ../editors/FileManagementPanel.py:85
+#: ../editors/FileManagementPanel.py:89
 msgid "Home Directory:"
 msgstr "Répertoire utilisateur :"
 
-#: ../controls/ProjectPropertiesPanel.py:150
+#: ../controls/ProjectPropertiesPanel.py:165
 msgid "Horizontal:"
 msgstr "Horizontal :"
 
-#: ../dialogs/DurationEditorDialog.py:44
+#: ../dialogs/DurationEditorDialog.py:47
 msgid "Hours:"
 msgstr "Heures :"
 
-#: ../plcopen/structures.py:278
-msgid ""
-"Hysteresis\n"
-"The hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2."
-msgstr ""
-"Hystérésis\n"
-"Le bloc functionnel hystérésis fourni un booléen en sortie suivant une courbe d'hystérésis entre les deux entrées réelles (REAL) XIN1 et XIN2."
-
-#: ../ProjectController.py:851
-msgid "IEC-61131-3 code generation failed !\n"
-msgstr "La création du code IEC-61131-3 a échouée !\n"
-
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
 msgid "IL"
 msgstr "IL"
 
-#: ../Beremiz_service.py:361
-#: ../Beremiz_service.py:362
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr "IP"
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
 msgid "IP is not valid!"
 msgstr "l'IP est invalide !"
 
-#: ../svgui/svgui.py:17
-#: ../svgui/svgui.py:18
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
 msgid "Import SVG"
 msgstr "Importer un SVG"
 
-#: ../controls/VariablePanel.py:76
-#: ../editors/Viewer.py:1412
-#: ../dialogs/FBDVariableDialog.py:34
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
 msgid "InOut"
 msgstr "Entrée-Sortie"
 
-#: ../editors/Viewer.py:999
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+"La variable InOut {a1} dans le bloc {a2} dans le POU {a3} doit être "
+"connectée."
+
+#: ../editors/Viewer.py:473
 msgid "Inactive"
 msgstr "Inactif"
 
-#: ../controls/VariablePanel.py:265
-#, python-format
-msgid "Incompatible data types between \"%s\" and \"%s\""
-msgstr "Types de donnée imcompatible entre \"%s\" et \"%s\""
-
-#: ../controls/VariablePanel.py:274
-#, python-format
-msgid "Incompatible size of data between \"%s\" and \"%s\""
-msgstr "Taille de donnée incompatible entre \"%s\" et \"%s\""
-
-#: ../controls/VariablePanel.py:270
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr "Type de données incompatible entre \"{a1}\" et \"{a2}\""
+
+#: ../controls/VariablePanel.py:306
 #, python-format
 msgid "Incompatible size of data between \"%s\" and \"BOOL\""
 msgstr "Taille de donnée incompatible entre \"%s\" et \"BOOL\""
 
-#: ../dialogs/ActionBlockDialog.py:37
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr "Taille de données incompatible entre \"{a1}\" et \"{a2}\""
+
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Indicator"
 msgstr "Indicateur"
 
-#: ../editors/Viewer.py:491
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr "Initiale"
+
+#: ../editors/Viewer.py:650
 msgid "Initial Step"
 msgstr "Étape initiale"
 
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
-#: ../editors/DataTypeEditor.py:50
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
 msgid "Initial Value"
 msgstr "Valeur initiale"
 
-#: ../editors/DataTypeEditor.py:184
-#: ../editors/DataTypeEditor.py:215
-#: ../editors/DataTypeEditor.py:271
-#: ../editors/DataTypeEditor.py:309
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
 msgid "Initial Value:"
 msgstr "Valeur initiale :"
 
-#: ../svgui/svgui.py:21
+#: ../svgui/svgui.py:56
 msgid "Inkscape"
 msgstr "Inkscape"
 
-#: ../dialogs/ActionBlockDialog.py:41
-#: ../dialogs/SFCTransitionDialog.py:66
-#: ../dialogs/SFCTransitionDialog.py:137
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "Inline"
 
-#: ../controls/VariablePanel.py:76
-#: ../editors/Viewer.py:1410
-#: ../dialogs/BrowseLocationsDialog.py:35
-#: ../dialogs/FBDVariableDialog.py:33
-#: ../dialogs/SFCStepDialog.py:61
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Input"
 msgstr "Entrée"
 
-#: ../dialogs/FBDBlockDialog.py:78
+#: ../dialogs/FBDBlockDialog.py:99
 msgid "Inputs:"
 msgstr "Entrées :"
 
@@ -1993,70 +1933,72 @@
 msgid "Insertion (into)"
 msgstr "Insertion (au milieu)"
 
-#: ../plcopen/plcopen.py:1843
+#: ../plcopen/plcopen.py:1948
 #, python-format
 msgid "Instance with id %d doesn't exist!"
 msgstr "L'instance dont l'id est %d n'existe pas !"
 
-#: ../editors/ResourceEditor.py:255
+#: ../editors/ResourceEditor.py:279
 msgid "Instances:"
 msgstr "Instances :"
 
-#: ../plcopen/structures.py:258
-msgid ""
-"Integral\n"
-"The integral function block integrates the value of input XIN over time."
-msgstr ""
-"Intégrale\n"
-"Le bloc fonctionnel INTEGRAL intègre les valeurs de l'entrée XIN en fonction du temps."
-
-#: ../controls/VariablePanel.py:75
+#: ../controls/VariablePanel.py:88
 msgid "Interface"
 msgstr "Interface"
 
-#: ../editors/ResourceEditor.py:72
+#: ../editors/ResourceEditor.py:81
 msgid "Interrupt"
 msgstr "Interruption"
 
-#: ../editors/ResourceEditor.py:68
+#: ../editors/ResourceEditor.py:76
 msgid "Interval"
 msgstr "Interval"
 
-#: ../PLCControler.py:2157
-#: ../PLCControler.py:2195
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+"URL invalide!\n"
+"Veuillez entrer une adresse URL correcte"
+
+#: ../PLCControler.py:1895
 msgid "Invalid plcopen element(s)!!!"
 msgstr "Les éléments plcopen ne sont pas valides !!! "
 
-#: ../canfestival/config_utils.py:376
-#: ../canfestival/config_utils.py:637
-#, python-format
-msgid "Invalid type \"%s\"-> %d != %d  for location\"%s\""
-msgstr "Type invalide \"%s\"-> %d != %d pour cette adresse \"%s\""
-
-#: ../dialogs/ForceVariableDialog.py:177
-#, python-format
-msgid "Invalid value \"%s\" for \"%s\" variable!"
-msgstr "Valeur \"%s\" invalide pour une variable de type \"%s\" !"
-
-#: ../controls/DebugVariablePanel.py:319
-#: ../controls/DebugVariablePanel.py:322
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr "Type invalide \"{a1}\"-> {a2} != {a3} pour \"{a4}\""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr "Type invalide \"{a1}\"-> {a2} != {a3} pour \"{a4}\""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
 #, python-format
 msgid "Invalid value \"%s\" for debug variable"
 msgstr "Chemin de variable à déboguer \"%s\" invalide"
 
-#: ../controls/VariablePanel.py:244
-#: ../controls/VariablePanel.py:247
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
 #, python-format
 msgid "Invalid value \"%s\" for variable grid element"
 msgstr "Valeur \"%s\" invalide pour un élément de la grille de variables"
 
-#: ../editors/Viewer.py:221
-#: ../editors/Viewer.py:224
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
 #, python-format
 msgid "Invalid value \"%s\" for viewer block"
 msgstr "Valeur \"%s\" invalide pour un élément graphique"
 
-#: ../dialogs/DurationEditorDialog.py:121
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr "Valeur invalide \"{a1}\" pour la variable \"{a2}\""
+
+#: ../dialogs/DurationEditorDialog.py:124
 msgid ""
 "Invalid value!\n"
 "You must fill a numeric value."
@@ -2064,56 +2006,55 @@
 "Valeur invalide !\n"
 "Vous devez rentrer une valeur numérique."
 
-#: ../editors/Viewer.py:496
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr ""
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
 msgid "Jump"
 msgstr "Renvoi"
 
-#: ../controls/ProjectPropertiesPanel.py:143
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "LD"
 msgstr "LD"
 
-#: ../editors/LDViewer.py:215
-#: ../editors/LDViewer.py:231
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
 #, python-format
 msgid "Ladder element with id %d is on more than one rung."
 msgstr "L'élément de LD dont l'id est %d apparait dans plusieurs échelons. "
 
-#: ../dialogs/PouTransitionDialog.py:86
-#: ../dialogs/PouActionDialog.py:83
-#: ../dialogs/PouDialog.py:102
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
 msgid "Language"
 msgstr "Langue"
 
-#: ../controls/ProjectPropertiesPanel.py:186
+#: ../controls/ProjectPropertiesPanel.py:206
 msgid "Language (optional):"
 msgstr "Langue (optionnel) :"
 
-#: ../dialogs/PouTransitionDialog.py:60
-#: ../dialogs/PouActionDialog.py:56
-#: ../dialogs/PouDialog.py:71
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
 msgid "Language:"
 msgstr "Langue :"
 
-#: ../ProjectController.py:1486
+#: ../ProjectController.py:1779
 msgid "Latest build already matches current target. Transfering anyway...\n"
 msgstr "La dernière compilation correspond à la cible actuelle...\n"
 
-#: ../Beremiz_service.py:331
+#: ../Beremiz_service.py:281
 msgid "Launch WX GUI inspector"
 msgstr "Lancer un inspecteur d'IHM WX"
 
-#: ../Beremiz_service.py:330
+#: ../Beremiz_service.py:280
 msgid "Launch a live Python shell"
 msgstr "Lancer une console Python"
 
-#: ../editors/Viewer.py:427
+#: ../editors/Viewer.py:580
 msgid "Left"
 msgstr "Gauche"
 
-#: ../dialogs/LDPowerRailDialog.py:55
+#: ../dialogs/LDPowerRailDialog.py:64
 msgid "Left PowerRail"
 msgstr "Barre d'alimentation à gauche"
 
@@ -2129,36 +2070,39 @@
 msgid "Less than or equal to"
 msgstr "Inférieur ou égal à"
 
-#: ../IDEFrame.py:604
+#: ../IDEFrame.py:652
 msgid "Library"
 msgstr "Librairie"
 
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr "Licence"
+
 #: ../plcopen/iec_std.csv:73
 msgid "Limitation"
 msgstr "Limitation"
 
-#: ../targets/toolchain_gcc.py:142
+#: ../targets/toolchain_gcc.py:209
 msgid "Linking :\n"
 msgstr "Linkage :\n"
 
-#: ../controls/VariablePanel.py:77
-#: ../dialogs/DiscoveryDialog.py:110
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
 msgid "Local"
 msgstr "Locale"
 
-#: ../canfestival/canfestival.py:322
+#: ../canfestival/canfestival.py:359
 msgid "Local entries"
 msgstr "Entrées locales"
 
-#: ../ProjectController.py:1391
+#: ../ProjectController.py:1685
 msgid "Local service discovery failed!\n"
 msgstr "Echec de la sélection d'un service!\n"
 
-#: ../controls/VariablePanel.py:58
+#: ../controls/VariablePanel.py:62
 msgid "Location"
 msgstr "Adresse"
 
-#: ../dialogs/BrowseLocationsDialog.py:68
+#: ../dialogs/BrowseLocationsDialog.py:79
 msgid "Locations available:"
 msgstr "Adresses disponibles :"
 
@@ -2166,54 +2110,60 @@
 msgid "Logarithm to base 10"
 msgstr "Logarithme de base 10"
 
-#: ../connectors/PYRO/__init__.py:55
+#: ../connectors/PYRO/__init__.py:102
 #, python-format
 msgid "MDNS resolution failure for '%s'\n"
 msgstr "Echec de la résolution MDNS pour '%s'\n"
 
-#: ../canfestival/SlaveEditor.py:41
-#: ../canfestival/NetworkEditor.py:62
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
 msgid "Map Variable"
 msgstr "Variable mappable"
 
-#: ../features.py:7
+#: ../features.py:31
 msgid "Map located variables over CANopen"
 msgstr "Mappe des variables localisées sur un bus CANopen"
 
-#: ../canfestival/NetworkEditor.py:83
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:113
 msgid "Master"
 msgstr "Maître"
 
-#: ../ConfigTreeNode.py:500
-#, python-format
-msgid "Max count (%d) reached for this confnode of type %s "
-msgstr "Nombre limite(%d) atteint pour les plugin de type %s"
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr ""
+"Valeur maximal du compteur atteinte ({a1}) pour ce confnode de type {a2}"
 
 #: ../plcopen/iec_std.csv:71
 msgid "Maximum"
 msgstr "Maximum"
 
-#: ../editors/DataTypeEditor.py:238
+#: ../editors/DataTypeEditor.py:246
 msgid "Maximum:"
 msgstr "Maximum :"
 
-#: ../dialogs/BrowseLocationsDialog.py:37
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Memory"
 msgstr "Mémoire"
 
-#: ../IDEFrame.py:572
+#: ../IDEFrame.py:617
 msgid "Menu ToolBar"
 msgstr "Barre d'outils du menu principal"
 
-#: ../dialogs/DurationEditorDialog.py:48
+#: ../dialogs/DurationEditorDialog.py:51
 msgid "Microseconds:"
 msgstr "Microsecondes :"
 
-#: ../editors/Viewer.py:432
+#: ../editors/Viewer.py:585
 msgid "Middle"
 msgstr "Milieu"
 
-#: ../dialogs/DurationEditorDialog.py:47
+#: ../dialogs/DurationEditorDialog.py:50
 msgid "Milliseconds:"
 msgstr "Millisecondes :"
 
@@ -2221,90 +2171,84 @@
 msgid "Minimum"
 msgstr "Minimum"
 
-#: ../editors/DataTypeEditor.py:225
+#: ../editors/DataTypeEditor.py:233
 msgid "Minimum:"
 msgstr "Minimum :"
 
-#: ../dialogs/DurationEditorDialog.py:45
+#: ../dialogs/DurationEditorDialog.py:48
 msgid "Minutes:"
 msgstr "Minutes :"
 
-#: ../controls/ProjectPropertiesPanel.py:210
+#: ../controls/ProjectPropertiesPanel.py:231
 msgid "Miscellaneous"
 msgstr "Divers"
 
-#: ../dialogs/LDElementDialog.py:59
+#: ../features.py:32
+msgid "Modbus support"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:65
 msgid "Modifier:"
 msgstr "Modificateur :"
 
-#: ../PLCGenerator.py:732
-#: ../PLCGenerator.py:975
-#, python-format
-msgid "More than one connector found corresponding to \"%s\" continuation in \"%s\" POU"
-msgstr "Plusieurs connecteurs trouvés pour le prolongement \"%s\" dans le POU \"%s\""
-
-#: ../dialogs/ActionBlockDialog.py:141
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+"Plus d'un connecteur correspondant à \"{a1}\" trouvé dans la continuité de "
+"\"{a2}\" POU"
+
+#: ../dialogs/ActionBlockDialog.py:146
 msgid "Move action down"
 msgstr "Déplacer une action vers le bas"
 
-#: ../dialogs/ActionBlockDialog.py:140
+#: ../dialogs/ActionBlockDialog.py:145
 msgid "Move action up"
 msgstr "Déplacer une action vers le haut"
 
-#: ../controls/DebugVariablePanel.py:1532
-msgid "Move debug variable down"
-msgstr "Déplacer une variable à déboguer vers le bas"
-
-#: ../controls/DebugVariablePanel.py:1531
-msgid "Move debug variable up"
-msgstr "Déplacer une variable à déboguer vers le haut"
-
-#: ../controls/CustomEditableListBox.py:43
+#: ../controls/CustomEditableListBox.py:46
 msgid "Move down"
 msgstr "Déplacer vers le haut"
 
-#: ../editors/DataTypeEditor.py:354
+#: ../editors/DataTypeEditor.py:367
 msgid "Move element down"
 msgstr "Déplcer un élément vers le bas"
 
-#: ../editors/DataTypeEditor.py:353
+#: ../editors/DataTypeEditor.py:366
 msgid "Move element up"
 msgstr "Déplacer un élément vers le haut"
 
-#: ../editors/ResourceEditor.py:262
+#: ../editors/ResourceEditor.py:286
 msgid "Move instance down"
 msgstr "Déplacer une instance vers le bas"
 
-#: ../editors/ResourceEditor.py:261
+#: ../editors/ResourceEditor.py:285
 msgid "Move instance up"
 msgstr "Déplacer une instance vers le haut"
 
-#: ../editors/ResourceEditor.py:233
+#: ../editors/ResourceEditor.py:255
 msgid "Move task down"
 msgstr "Déplcer une tâche vers le bas"
 
-#: ../editors/ResourceEditor.py:232
+#: ../editors/ResourceEditor.py:254
 msgid "Move task up"
 msgstr "Déplacer une tâche vers le haut"
 
-#: ../IDEFrame.py:82
-#: ../IDEFrame.py:97
-#: ../IDEFrame.py:127
-#: ../IDEFrame.py:168
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
 msgid "Move the view"
 msgstr "Déplacer la vue"
 
-#: ../controls/CustomEditableListBox.py:42
+#: ../controls/CustomEditableListBox.py:45
 msgid "Move up"
 msgstr "Déplacer vers le bas"
 
-#: ../controls/VariablePanel.py:383
-#: ../c_ext/CFileEditor.py:520
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
 msgid "Move variable down"
 msgstr "Déplacer une variable vers le bas"
 
-#: ../controls/VariablePanel.py:382
-#: ../c_ext/CFileEditor.py:519
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
 msgid "Move variable up"
 msgstr "Déplacer une variable vers le haut"
 
@@ -2316,27 +2260,26 @@
 msgid "Multiplication"
 msgstr "Multiplication"
 
-#: ../editors/FileManagementPanel.py:83
+#: ../editors/FileManagementPanel.py:87
 msgid "My Computer:"
 msgstr "Poste de travail :"
 
-#: ../controls/VariablePanel.py:58
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr "NOM"
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
 #: ../controls/VariablePanel.py:59
-#: ../editors/DataTypeEditor.py:50
-#: ../editors/ResourceEditor.py:68
-#: ../editors/ResourceEditor.py:77
 msgid "Name"
 msgstr "Nom"
 
-#: ../Beremiz_service.py:386
+#: ../Beremiz_service.py:342
 msgid "Name must not be null!"
 msgstr "Le nom ne doit pas être vide !"
 
-#: ../dialogs/ConnectionDialog.py:65
-#: ../dialogs/FBDVariableDialog.py:89
-#: ../dialogs/LDElementDialog.py:88
-#: ../dialogs/SFCStepDialog.py:51
-#: ../dialogs/FBDBlockDialog.py:70
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
 msgid "Name:"
 msgstr "Nom :"
 
@@ -2344,46 +2287,46 @@
 msgid "Natural logarithm"
 msgstr "Logarithme népérien"
 
-#: ../editors/Viewer.py:402
-#: ../dialogs/LDElementDialog.py:67
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
 msgid "Negated"
 msgstr "Inversé"
 
-#: ../Beremiz.py:309
-#: ../Beremiz.py:344
-#: ../PLCOpenEditor.py:106
-#: ../PLCOpenEditor.py:148
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr "Service Web Nevow échoué."
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr "Import Nevow/Athena échoué:"
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
 msgid "New"
 msgstr "Nouveau"
 
-#: ../controls/CustomEditableListBox.py:40
+#: ../controls/CustomEditableListBox.py:43
 msgid "New item"
 msgstr "Nouvel élément"
 
-#: ../editors/Viewer.py:401
+#: ../editors/Viewer.py:553
 msgid "No Modifier"
 msgstr "Pas de modificateur"
 
-#: ../PLCControler.py:3054
-msgid "No PLC project found"
-msgstr "Pas de projet d'automate trouvé"
-
-#: ../ProjectController.py:1513
+#: ../ProjectController.py:1808
 msgid "No PLC to transfer (did build succeed ?)\n"
 msgstr "Aucun automate à transférer (la compilation a-t-elle réussi ?)\n"
 
-#: ../PLCGenerator.py:1360
+#: ../PLCGenerator.py:1678
 #, python-format
 msgid "No body defined in \"%s\" POU"
 msgstr "Pas de code défini dans le POU \"%s\""
 
-#: ../PLCGenerator.py:751
-#: ../PLCGenerator.py:984
-#, python-format
-msgid "No connector found corresponding to \"%s\" continuation in \"%s\" POU"
-msgstr "Pas de connecteur trouvé pour le prolongement \"%s\" dans le POU \"%s\""
-
-#: ../PLCOpenEditor.py:349
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr "Pas de connecteur correspondant à \"{a1}\" dans la continuité de \"{a2}\" POU"
+
+#: ../PLCOpenEditor.py:331
 msgid ""
 "No documentation available.\n"
 "Coming soon."
@@ -2391,66 +2334,72 @@
 "Pas de documentation.\n"
 "Bientôt disponible."
 
-#: ../PLCGenerator.py:773
+#: ../PLCGenerator.py:841
 #, python-format
 msgid "No informations found for \"%s\" block"
 msgstr "Aucune information trouvée pour le block \"%s\""
 
-#: ../plcopen/structures.py:166
-msgid "No output variable found"
-msgstr "Pas de variable de sortie trouvée."
-
-#: ../controls/SearchResultPanel.py:169
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+"Pas de variable de sortie {a1} trouvée dans le bloc {a2} dans POU {a3}. La "
+"connection doit-être cassée"
+
+#: ../controls/SearchResultPanel.py:175
 msgid "No search results available."
 msgstr "Pas de résultat de recherche disponible."
 
-#: ../svgui/svgui.py:98
+#: ../svgui/svgui.py:142
 #, python-format
 msgid "No such SVG file: %s\n"
 msgstr "Fichier SVG inconnu : %s\n"
 
-#: ../canfestival/config_utils.py:632
-#, python-format
-msgid "No such index/subindex (%x,%x) (variable %s)"
-msgstr "indice et sous-indice inconnu (%x,%x) (variable %s)"
-
-#: ../canfestival/config_utils.py:361
-#, python-format
-msgid "No such index/subindex (%x,%x) in ID : %d (variable %s)"
-msgstr "indice et sous-indice inconnu (%x,%x) pour l'ID : %d (variable %s)"
-
-#: ../dialogs/BrowseValuesLibraryDialog.py:83
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr "Pas de tel index/sous-index ({a1},{a2}) (variable {a3})"
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr ""
+"Pas de tel index/sous-index  ({a1},{a2}) avec l'ID : {a3} (variable {a4})"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
 msgid "No valid value selected!"
 msgstr "Aucune valeur valide sélectionnée !"
 
-#: ../PLCGenerator.py:1358
+#: ../PLCGenerator.py:1676
 #, python-format
 msgid "No variable defined in \"%s\" POU"
 msgstr "Pas de varaibles définies dans le POU \"%s\""
 
-#: ../canfestival/config_utils.py:354
-#, python-format
-msgid "Non existing node ID : %d (variable %s)"
-msgstr "Le node ID n'existe pas : %d (variable %s)"
-
-#: ../controls/VariablePanel.py:69
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr "Node ID inexistant : {a1} (variable {a2})"
+
+#: ../controls/VariablePanel.py:79
 msgid "Non-Retain"
 msgstr "Non-Persistante"
 
-#: ../dialogs/LDElementDialog.py:62
+#: ../dialogs/LDElementDialog.py:78
 msgid "Normal"
 msgstr "Normal"
 
-#: ../canfestival/config_utils.py:383
-#, python-format
-msgid "Not PDO mappable variable : '%s' (ID:%d,Idx:%x,sIdx:%x))"
-msgstr "Variable non mappable dans un PDO : '%s' (ID:%d,Idx:%x,sIdx:%x))"
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr "Variable non mappable PDO :  '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
 
 #: ../plcopen/iec_std.csv:80
 msgid "Not equal to"
 msgstr "Non égal à"
 
-#: ../dialogs/SFCDivergenceDialog.py:80
+#: ../dialogs/SFCDivergenceDialog.py:91
 msgid "Number of sequences:"
 msgstr "Nombre de branches :"
 
@@ -2458,295 +2407,317 @@
 msgid "Numerical"
 msgstr "Numérique"
 
-#: ../plcopen/structures.py:246
-msgid ""
-"Off-delay timer\n"
-"The off-delay timer can be used to delay setting an output false, for fixed period after input goes false."
-msgstr ""
-"Temporisation avec retard à l'extinction\n"
-"La temporisation avec retard à l'extinction peut être utilisé pour retarder le passage de la sortie à l'état faux, d'une période fixe après le passage de l'entrée à l'état faux"
-
-#: ../plcopen/structures.py:241
-msgid ""
-"On-delay timer\n"
-"The on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true."
-msgstr ""
-"Temporisation avec retard à l'allumage\n"
-"La temporisation avec retard à l'allumage peut être utilisé pour retarder le passage de la sortie à l'état vrai, d'une période fixe après le passage de l'entrée à l'état vrai"
-
-#: ../dialogs/SearchInProjectDialog.py:93
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr "OnChange"
+
+#: ../dialogs/SearchInProjectDialog.py:88
 msgid "Only Elements"
 msgstr "Uniquement les éléments"
 
-#: ../Beremiz.py:311
-#: ../Beremiz.py:345
-#: ../PLCOpenEditor.py:108
-#: ../PLCOpenEditor.py:149
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
 msgid "Open"
 msgstr "Ouvrir"
 
-#: ../svgui/svgui.py:107
+#: ../svgui/svgui.py:151
 msgid "Open Inkscape"
 msgstr "Ouverture de Inkscape"
 
-#: ../ProjectController.py:1565
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+"Cadriciel Open Source pour l'automatisme, IDE implémenté en IEC 61131 avec "
+"un lot d'extensions constament croissant et un executable PLC flexible."
+
+#: ../ProjectController.py:1879
 msgid "Open a file explorer to manage project files"
 msgstr "Ouvrir un explorateur de fichier pour gérer les fichiers de projet"
 
-#: ../wxglade_hmi/wxglade_hmi.py:109
+#: ../wxglade_hmi/wxglade_hmi.py:161
 msgid "Open wxGlade"
 msgstr "Ouverture de wxGlade"
 
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
+#: ../controls/VariablePanel.py:64
 msgid "Option"
 msgstr "Option"
 
-#: ../dialogs/FindInPouDialog.py:76
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
 msgid "Options"
 msgstr "Options"
 
-#: ../controls/ProjectPropertiesPanel.py:97
+#: ../controls/ProjectPropertiesPanel.py:109
 msgid "Organization (optional):"
 msgstr "Groupe (optionnel) :"
 
-#: ../canfestival/SlaveEditor.py:51
-#: ../canfestival/NetworkEditor.py:72
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
 msgid "Other Profile"
 msgstr "Autre profil"
 
-#: ../controls/VariablePanel.py:76
-#: ../editors/Viewer.py:1411
-#: ../dialogs/BrowseLocationsDialog.py:36
-#: ../dialogs/FBDVariableDialog.py:35
-#: ../dialogs/SFCStepDialog.py:65
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Output"
 msgstr "Sortie"
 
-#: ../canfestival/SlaveEditor.py:40
-#: ../canfestival/NetworkEditor.py:61
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
 msgid "PDO Receive"
 msgstr "PDO reçu"
 
-#: ../canfestival/SlaveEditor.py:39
-#: ../canfestival/NetworkEditor.py:60
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
 msgid "PDO Transmit"
 msgstr "PDO transmis"
 
-#: ../plcopen/structures.py:268
-msgid ""
-"PID\n"
-"The PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control."
-msgstr ""
-"PID\n"
-"Le bloc fonctionnel PID (Proportionnel, Intégrale, Dérivée) fournit un controller de boucle fermé classique à trois paramètres."
-
-#: ../targets/toolchain_gcc.py:107
+#: ../targets/toolchain_gcc.py:174
 msgid "PLC :\n"
 msgstr "Automate :\n"
 
-#: ../Beremiz.py:425
+#: ../BeremizIDE.py:383
 msgid "PLC Log"
 msgstr "Log de l'automate"
 
-#: ../PLCOpenEditor.py:294
-#: ../PLCOpenEditor.py:370
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr "Génération du code PLC échouée !\n"
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr "Le PLC est vide ou déjà lancé."
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr "PLC non démarré"
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+"Erreur de syntaxe PLC à la ligne {a1}:\n"
+"{a2}"
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
 msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
 msgstr "Fichiers PLCOpen (*.xml)|*.xml|Tous les fichiers|*.*"
 
-#: ../PLCOpenEditor.py:156
-#: ../PLCOpenEditor.py:212
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
 msgid "PLCOpenEditor"
 msgstr "PLCOpenEditor"
 
-#: ../dialogs/PouDialog.py:98
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+"PLCOpenEditor fait partie du projet Beremiz.\n"
+"\n"
+"Beremiz est un "
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr "PORT"
+
+#: ../dialogs/PouDialog.py:109
 msgid "POU Name"
 msgstr "Nom du POU"
 
-#: ../dialogs/PouDialog.py:56
+#: ../dialogs/PouDialog.py:66
 msgid "POU Name:"
 msgstr "Nom du POU :"
 
-#: ../dialogs/PouDialog.py:100
+#: ../dialogs/PouDialog.py:111
 msgid "POU Type"
 msgstr "Type du POU"
 
-#: ../dialogs/PouDialog.py:63
+#: ../dialogs/PouDialog.py:73
 msgid "POU Type:"
 msgstr "Type du POU :"
 
-#: ../Beremiz.py:324
-#: ../PLCOpenEditor.py:122
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr "Connexion de PYRO à l'URI:%s\n"
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr "PYRO utilise les certificats dans '%s'\n"
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
 msgid "Page Setup"
 msgstr "Mise en page..."
 
-#: ../controls/ProjectPropertiesPanel.py:110
+#: ../controls/ProjectPropertiesPanel.py:124
 msgid "Page Size (optional):"
 msgstr "Taille de la page (optionnel) :"
 
-#: ../IDEFrame.py:2492
+#: ../IDEFrame.py:2640
 #, python-format
 msgid "Page: %d"
 msgstr "Page: %d"
 
-#: ../controls/PouInstanceVariablesPanel.py:48
+#: ../controls/PouInstanceVariablesPanel.py:134
 msgid "Parent instance"
 msgstr "Instance parent"
 
-#: ../IDEFrame.py:355
-#: ../IDEFrame.py:407
-#: ../editors/Viewer.py:537
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
 msgid "Paste"
 msgstr "Coller"
 
-#: ../IDEFrame.py:1776
+#: ../IDEFrame.py:1899
 msgid "Paste POU"
 msgstr "Coller un POU"
 
-#: ../dialogs/SearchInProjectDialog.py:64
+#: ../dialogs/SearchInProjectDialog.py:60
 msgid "Pattern to search:"
 msgstr "Modèle à rechercher :"
 
-#: ../dialogs/LDPowerRailDialog.py:64
+#: ../dialogs/LDPowerRailDialog.py:75
 msgid "Pin number:"
 msgstr "Nombre de pattes :"
 
-#: ../editors/Viewer.py:2363
-#: ../editors/Viewer.py:2670
-#: ../editors/SFCViewer.py:696
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
 msgid "Please choose a target"
 msgstr "Choisissez une cible"
 
-#: ../editors/Viewer.py:2186
-#: ../editors/Viewer.py:2188
-#: ../editors/Viewer.py:2706
-#: ../editors/Viewer.py:2708
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr "Entrer un nom de bloc s'il vous plaît"
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
 msgid "Please enter comment text"
 msgstr "Saisissez le texte du commentaire"
 
-#: ../editors/SFCViewer.py:359
-#: ../editors/SFCViewer.py:381
-#: ../editors/SFCViewer.py:725
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
 msgid "Please enter step name"
 msgstr "Saisissez le nom de l'étape"
 
-#: ../dialogs/ForceVariableDialog.py:163
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr "Saisissez le texte"
+
+#: ../dialogs/ForceVariableDialog.py:177
 #, python-format
 msgid "Please enter value for a \"%s\" variable:"
 msgstr "Veuillez entrer la valeur pour une variable de type \"%s\" :"
 
-#: ../Beremiz_service.py:371
+#: ../Beremiz_service.py:327
 msgid "Port number must be 0 <= port <= 65535!"
 msgstr "Le numéro de port doit être compris entre 0 et 65535 !"
 
-#: ../Beremiz_service.py:371
+#: ../Beremiz_service.py:327
 msgid "Port number must be an integer!"
 msgstr "Le numéro de port doit être un entier !"
 
-#: ../editors/GraphicViewer.py:105
-msgid "Position:"
-msgstr "Position :"
-
-#: ../editors/Viewer.py:475
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
 msgid "Power Rail"
 msgstr "Barre d'alimentation"
 
-#: ../dialogs/LDPowerRailDialog.py:36
+#: ../dialogs/LDPowerRailDialog.py:52
 msgid "Power Rail Properties"
 msgstr "Propriétés de la barre d'alimentation"
 
-#: ../Beremiz.py:326
-#: ../PLCOpenEditor.py:124
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
 msgid "Preview"
 msgstr "Aperçu avant impression"
 
-#: ../dialogs/SFCDivergenceDialog.py:93
-#: ../dialogs/LDPowerRailDialog.py:78
-#: ../dialogs/ConnectionDialog.py:78
-#: ../dialogs/FBDVariableDialog.py:97
-#: ../dialogs/SFCTransitionDialog.py:96
-#: ../dialogs/LDElementDialog.py:101
-#: ../dialogs/SFCStepDialog.py:79
-#: ../dialogs/FBDBlockDialog.py:103
+#: ../dialogs/BlockPreviewDialog.py:59
 msgid "Preview:"
 msgstr "Aperçu :"
 
-#: ../Beremiz.py:328
-#: ../Beremiz.py:348
-#: ../PLCOpenEditor.py:126
-#: ../PLCOpenEditor.py:152
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
 msgid "Print"
 msgstr "Imprimer"
 
-#: ../IDEFrame.py:1038
+#: ../IDEFrame.py:1110
 msgid "Print preview"
 msgstr "Aperçu avant impression"
 
-#: ../editors/ResourceEditor.py:68
+#: ../editors/ResourceEditor.py:76
 msgid "Priority"
 msgstr "Priorité"
 
-#: ../dialogs/SFCTransitionDialog.py:83
+#: ../dialogs/SFCTransitionDialog.py:91
 msgid "Priority:"
 msgstr "Priorité :"
 
-#: ../runtime/PLCObject.py:318
+#: ../runtime/PLCObject.py:518
 #, python-format
 msgid "Problem starting PLC : error %d"
 msgstr "Problème au démarrage du PLC : erreur %d"
 
-#: ../controls/ProjectPropertiesPanel.py:80
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr "Nom de produit"
+
+#: ../controls/ProjectPropertiesPanel.py:90
 msgid "Product Name (required):"
 msgstr "Nom du produit (obligatoire) :"
 
-#: ../controls/ProjectPropertiesPanel.py:82
+#: ../controls/ProjectPropertiesPanel.py:92
 msgid "Product Release (optional):"
 msgstr "Publication du produit (optionnel) :"
 
-#: ../controls/ProjectPropertiesPanel.py:81
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr "Version du produit"
+
+#: ../controls/ProjectPropertiesPanel.py:91
 msgid "Product Version (required):"
 msgstr "Version du produit (obligatoire) :"
 
-#: ../IDEFrame.py:1848
-#: ../dialogs/SearchInProjectDialog.py:46
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
 msgid "Program"
 msgstr "Programme"
 
-#: ../PLCOpenEditor.py:339
+#: ../PLCOpenEditor.py:321
 msgid "Program was successfully generated!"
 msgstr "Le programme a été généré avec succès !"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:76
 msgid "Programs"
 msgstr "Programmes"
 
-#: ../editors/Viewer.py:230
+#: ../editors/Viewer.py:285
 msgid "Programs can't be used by other POUs!"
 msgstr "Les programmes ne peuvent être utilisés par les autres POUs !"
 
-#: ../controls/ProjectPropertiesPanel.py:84
-#: ../IDEFrame.py:557
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
 msgid "Project"
 msgstr "Projet"
 
-#: ../controls/SearchResultPanel.py:173
+#: ../controls/SearchResultPanel.py:180
 #, python-format
 msgid "Project '%s':"
 msgstr "Projet  '%s' :"
 
-#: ../ProjectController.py:1564
+#: ../ProjectController.py:1878
 msgid "Project Files"
 msgstr "Fichiers de projet"
 
-#: ../controls/ProjectPropertiesPanel.py:78
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr "Nom du projet"
+
+#: ../controls/ProjectPropertiesPanel.py:88
 msgid "Project Name (required):"
 msgstr "Nom du projet (obligatoire) :"
 
-#: ../controls/ProjectPropertiesPanel.py:79
+#: ../controls/ProjectPropertiesPanel.py:89
 msgid "Project Version (optional):"
 msgstr "Version du projet (optionnel) :"
 
-#: ../PLCControler.py:3041
+#: ../PLCControler.py:2717
 msgid ""
 "Project file syntax error:\n"
 "\n"
@@ -2754,113 +2725,92 @@
 "Erreur de syntaxe dans le fichier du projet :\n"
 "\n"
 
-#: ../editors/ProjectNodeEditor.py:14
-#: ../dialogs/ProjectDialog.py:32
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
 msgid "Project properties"
 msgstr "Propriétés du projet"
 
-#: ../ConfigTreeNode.py:526
-#, python-format
-msgid "Project tree layout do not match confnode.xml %s!=%s "
-msgstr "L'organisation du projet ne correspond pas à plugin.xml %s!=%s"
-
-#: ../dialogs/ConnectionDialog.py:96
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr ""
+"La disposition de l'arborescence du projet ne correspond pas à confnode.xml "
+"{a1}!={a2} "
+
+#: ../dialogs/ConnectionDialog.py:101
 msgid "Propagate Name"
 msgstr "Propager le nom"
 
-#: ../PLCControler.py:96
+#: ../plcopen/types_enums.py:77
 msgid "Properties"
 msgstr "Propriétés"
 
-#: ../plcopen/structures.py:236
-msgid ""
-"Pulse timer\n"
-"The pulse timer can be used to generate output pulses of a given time duration."
-msgstr ""
-"Temporisation à impulsion\n"
-"La temporisation à impulsion peut être utilisée pour générer sur la sortie des impulsions d'une durée déterminée."
-
-#: ../py_ext/PythonEditor.py:61
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr "Publication du service sur le réseau local"
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr "Exception Pyro: %s\n"
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr "Pyro port :"
+
+#: ../py_ext/PythonEditor.py:84
 msgid "Python code"
 msgstr "Code Python"
 
-#: ../features.py:9
+#: ../features.py:34
 msgid "Python file"
 msgstr "Fichier Python"
 
-#: ../dialogs/ActionBlockDialog.py:37
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Qualifier"
 msgstr "Qualificatif"
 
-#: ../Beremiz_service.py:333
-#: ../Beremiz.py:331
-#: ../PLCOpenEditor.py:132
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
 msgid "Quit"
 msgstr "Quitter"
 
-#: ../plcopen/structures.py:201
-msgid ""
-"RS bistable\n"
-"The RS bistable is a latch where the Reset dominates."
-msgstr ""
-"Bascule RS\n"
-"La bascule RS est une bascule où le Reset est dominant."
-
-#: ../plcopen/structures.py:273
-msgid ""
-"Ramp\n"
-"The RAMP function block is modelled on example given in the standard."
-msgstr ""
-"Rampe\n"
-"Le bloc fonctionnel RAMP est basé sur l'exemple du standard."
-
-#: ../controls/DebugVariablePanel.py:1462
-#: ../editors/GraphicViewer.py:89
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
 msgid "Range:"
 msgstr "Echelle :"
 
-#: ../ProjectController.py:1560
+#: ../ProjectController.py:1872
 msgid "Raw IEC code"
 msgstr "Ajout code IEC"
 
-#: ../plcopen/structures.py:253
-msgid ""
-"Real time clock\n"
-"The real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on."
-msgstr ""
-"Horloge temps réel\n"
-"L'horloge temps réel est utilisée dans de nombreux cas tels que l'horodatage, la définition des dates et heures dans des rapports de commandes, dans des messages d'alarme et bien d'autres."
-
-#: ../Beremiz.py:1072
+#: ../BeremizIDE.py:1083
 #, python-format
 msgid "Really delete node '%s'?"
 msgstr "Êtes-vous sûr de vouloir supprimer le noeud '%s' ?"
 
-#: ../IDEFrame.py:345
-#: ../IDEFrame.py:403
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
 msgid "Redo"
 msgstr "Refaire"
 
-#: ../dialogs/SFCTransitionDialog.py:57
-#: ../dialogs/SFCTransitionDialog.py:135
+#: ../dialogs/SFCTransitionDialog.py:76
 msgid "Reference"
 msgstr "Référence"
 
-#: ../IDEFrame.py:413
-#: ../dialogs/DiscoveryDialog.py:105
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
 msgid "Refresh"
 msgstr "Actualiser"
 
-#: ../dialogs/SearchInProjectDialog.py:73
+#: ../dialogs/SearchInProjectDialog.py:70
 msgid "Regular expression"
 msgstr "Expression régulière"
 
-#: ../dialogs/FindInPouDialog.py:91
+#: ../dialogs/FindInPouDialog.py:99
 msgid "Regular expressions"
 msgstr "Expressions régulières"
 
-#: ../controls/DebugVariablePanel.py:1938
-#: ../editors/Viewer.py:1388
+#: ../editors/Viewer.py:1636
 msgid "Release value"
 msgstr "Relacher la valeur"
 
@@ -2868,109 +2818,103 @@
 msgid "Remainder (modulo)"
 msgstr "Modulo"
 
-#: ../Beremiz.py:1073
+#: ../BeremizIDE.py:1084
 #, python-format
 msgid "Remove %s node"
 msgstr "Enlever un noeud %s"
 
-#: ../dialogs/ActionBlockDialog.py:139
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr "Supprimer le Datatype"
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr "Supprimer le Pou"
+
+#: ../dialogs/ActionBlockDialog.py:144
 msgid "Remove action"
 msgstr "Supprimer une action"
 
-#: ../controls/DebugVariablePanel.py:1530
-msgid "Remove debug variable"
-msgstr "Supprimer une variable à déboguer"
-
-#: ../editors/DataTypeEditor.py:352
+#: ../editors/DataTypeEditor.py:365
 msgid "Remove element"
 msgstr "Supprimer un élément"
 
-#: ../editors/FileManagementPanel.py:63
+#: ../editors/FileManagementPanel.py:66
 msgid "Remove file from left folder"
 msgstr "Supprimer un fichier du dossier de gauche"
 
-#: ../editors/ResourceEditor.py:260
+#: ../editors/ResourceEditor.py:284
 msgid "Remove instance"
 msgstr "Supprimer une instance"
 
-#: ../canfestival/NetworkEditor.py:81
+#: ../canfestival/NetworkEditor.py:111
 msgid "Remove slave"
 msgstr "Enlever l'esclave"
 
-#: ../editors/ResourceEditor.py:231
+#: ../editors/ResourceEditor.py:253
 msgid "Remove task"
 msgstr "Supprimer la tâche"
 
-#: ../controls/VariablePanel.py:381
-#: ../c_ext/CFileEditor.py:518
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
 msgid "Remove variable"
 msgstr "Supprimer une variable"
 
-#: ../IDEFrame.py:1852
+#: ../IDEFrame.py:1979
 msgid "Rename"
 msgstr "Renommer"
 
-#: ../editors/FileManagementPanel.py:181
+#: ../editors/FileManagementPanel.py:187
 msgid "Replace File"
 msgstr "Remplacer un fichier"
 
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr "Remplacer le fil par les connexions"
+
 #: ../plcopen/iec_std.csv:89
 msgid "Replacement (within)"
 msgstr "Remplacement (au milieu)"
 
-#: ../dialogs/LDElementDialog.py:76
+#: ../dialogs/LDElementDialog.py:79
 msgid "Reset"
 msgstr "Mise à zéro"
 
-#: ../editors/Viewer.py:521
+#: ../editors/Viewer.py:681
 msgid "Reset Execution Order"
 msgstr "Réinitialiser l'order d'exécution"
 
-#: ../IDEFrame.py:428
+#: ../IDEFrame.py:453
 msgid "Reset Perspective"
 msgstr "Réinitialiser l'interface"
 
-#: ../controls/SearchResultPanel.py:105
+#: ../controls/SearchResultPanel.py:103
 msgid "Reset search result"
 msgstr "Réinitialiser le résultat de la recherche"
 
-#: ../editors/GraphicViewer.py:137
-msgid "Reset zoom and offset"
-msgstr "Réinitialisation du zoom et de l'offset"
-
-#: ../PLCControler.py:96
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
 msgid "Resources"
 msgstr "Ressources"
 
-#: ../controls/VariablePanel.py:67
+#: ../controls/VariablePanel.py:77
 msgid "Retain"
 msgstr "Persistante"
 
-#: ../controls/VariablePanel.py:354
+#: ../controls/VariablePanel.py:455
 msgid "Return Type:"
 msgstr "Type de retour :"
 
-#: ../editors/Viewer.py:429
+#: ../editors/Viewer.py:582
 msgid "Right"
 msgstr "Droite"
 
-#: ../dialogs/LDPowerRailDialog.py:60
+#: ../dialogs/LDPowerRailDialog.py:65
 msgid "Right PowerRail"
 msgstr "Barre d'alimentation à droite"
 
-#: ../editors/Viewer.py:403
-#: ../dialogs/LDElementDialog.py:80
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
 msgid "Rising Edge"
 msgstr "Front montant"
 
-#: ../plcopen/structures.py:211
-msgid ""
-"Rising edge detector\n"
-"The output produces a single pulse when a rising edge is detected."
-msgstr ""
-"Détecteur de front montant\n"
-"La sortie produit une impulsion unique lorsqu'un front montant est détecté."
-
 #: ../plcopen/iec_std.csv:65
 msgid "Rotate left"
 msgstr "Rotation à gauche"
@@ -2983,140 +2927,141 @@
 msgid "Rounding up/down"
 msgstr "Arrondi"
 
-#: ../ProjectController.py:1528
+#: ../ProjectController.py:1828
 msgid "Run"
 msgstr "Exécuter"
 
-#: ../ProjectController.py:865
-#: ../ProjectController.py:874
-msgid "Runtime extensions C code generation failed !\n"
-msgstr "La génération du code des plugins a échoué !\n"
-
-#: ../canfestival/SlaveEditor.py:38
-#: ../canfestival/NetworkEditor.py:59
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr ""
+"La génération du code C pour les extensions d'entrées-sorties a échoué!\n"
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr "La génération du code C pour les extensions de librairie a échoué!\n"
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
 msgid "SDO Client"
 msgstr "Client SDO"
 
-#: ../canfestival/SlaveEditor.py:37
-#: ../canfestival/NetworkEditor.py:58
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
 msgid "SDO Server"
 msgstr "Serveur SDO"
 
-#: ../controls/ProjectPropertiesPanel.py:143
-#: ../dialogs/PouDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "SFC"
 msgstr "SFC"
 
-#: ../plcopen/structures.py:196
-msgid ""
-"SR bistable\n"
-"The SR bistable is a latch where the Set dominates."
-msgstr ""
-"Bascule SR\n"
-"La bascule SR est une bascule où le Set est dominant."
-
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr ""
+"Le saut SFC dans le POU \"{a1}\" fait référence à l'étape SFC inexistante "
+"\"{a2}\""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr "La transition SFC dans le POU \"%s\" doit être connectée."
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
 msgid "ST"
 msgstr "ST"
 
-#: ../PLCOpenEditor.py:326
+#: ../PLCOpenEditor.py:308
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "Fichiers ST (*.st)|*.st|Tous les fichiers|*.*"
 
-#: ../svgui/svgui.py:92
+#: ../svgui/svgui.py:136
 msgid "SVG files (*.svg)|*.svg|All files|*.*"
 msgstr "Fichiers SVG (*.svg)|*.svg|Tous les fichiers|*.*"
 
-#: ../features.py:11
+#: ../features.py:36
 msgid "SVGUI"
 msgstr "SVGUI"
 
-#: ../Beremiz.py:315
-#: ../Beremiz.py:346
-#: ../PLCOpenEditor.py:115
-#: ../PLCOpenEditor.py:150
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
 msgid "Save"
 msgstr "Enregistrer"
 
-#: ../Beremiz.py:347
-#: ../PLCOpenEditor.py:117
-#: ../PLCOpenEditor.py:151
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
 msgid "Save As..."
 msgstr "Enregistrer sous..."
 
-#: ../Beremiz.py:317
+#: ../BeremizIDE.py:249
 msgid "Save as"
 msgstr "Enregistrer sous..."
 
-#: ../dialogs/SearchInProjectDialog.py:76
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr "Le chemin d'enregistrement est le même que le chemin du projet!\n"
+
+#: ../dialogs/SearchInProjectDialog.py:73
 msgid "Scope"
 msgstr "Contexte"
 
-#: ../IDEFrame.py:596
-#: ../dialogs/SearchInProjectDialog.py:105
+#: ../IDEFrame.py:644
 msgid "Search"
 msgstr "Rechercher"
 
-#: ../IDEFrame.py:365
-#: ../IDEFrame.py:409
-#: ../dialogs/SearchInProjectDialog.py:52
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
 msgid "Search in Project"
 msgstr "Rechercher dans le projet"
 
-#: ../dialogs/DurationEditorDialog.py:46
+#: ../dialogs/DurationEditorDialog.py:49
 msgid "Seconds:"
 msgstr "Secondes :"
 
-#: ../IDEFrame.py:371
+#: ../IDEFrame.py:390
 msgid "Select All"
 msgstr "Tout sélectionner"
 
-#: ../controls/LocationCellEditor.py:97
-#: ../controls/VariablePanel.py:277
-#: ../editors/TextViewer.py:323
-#: ../editors/Viewer.py:275
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
 msgid "Select a variable class:"
 msgstr "Sélectionner une direction pour la variable :"
 
-#: ../ProjectController.py:1039
+#: ../ProjectController.py:1293
 msgid "Select an editor:"
 msgstr "Sélectionner un éditeur :"
 
-#: ../controls/PouInstanceVariablesPanel.py:209
+#: ../controls/PouInstanceVariablesPanel.py:292
 msgid "Select an instance"
 msgstr "Sélectionnez une instance"
 
-#: ../IDEFrame.py:580
+#: ../IDEFrame.py:628
 msgid "Select an object"
 msgstr "Sélectionner un objet"
 
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr "Le répertoire sélectionné contient déjà un autre projet. Écraser?\n"
+
 #: ../plcopen/iec_std.csv:70
 msgid "Selection"
 msgstr "Sélection"
 
-#: ../dialogs/SFCDivergenceDialog.py:62
+#: ../dialogs/SFCDivergenceDialog.py:66
 msgid "Selection Convergence"
 msgstr "Convergence simple"
 
-#: ../dialogs/SFCDivergenceDialog.py:55
+#: ../dialogs/SFCDivergenceDialog.py:65
 msgid "Selection Divergence"
 msgstr "Divergence simple"
 
-#: ../plcopen/structures.py:206
-msgid ""
-"Semaphore\n"
-"The semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources."
-msgstr ""
-"Sémaphore\n"
-"La sémaphore fournit un mécanisme permettant à des éléments du programme d'accéder de façon exclusive à certaines resources."
-
-#: ../dialogs/DiscoveryDialog.py:84
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr "Recherche de service"
+
+#: ../dialogs/DiscoveryDialog.py:104
 msgid "Services available:"
 msgstr "Services disponibles:"
 
-#: ../dialogs/LDElementDialog.py:72
+#: ../dialogs/LDElementDialog.py:79
 msgid "Set"
 msgstr "Mise à 1"
 
@@ -3128,27 +3073,27 @@
 msgid "Shift right"
 msgstr "Décalage à droite"
 
-#: ../ProjectController.py:1554
+#: ../ProjectController.py:1863
 msgid "Show IEC code generated by PLCGenerator"
 msgstr "Afficher le code IEC généré par PLCGenerator"
 
-#: ../canfestival/canfestival.py:363
+#: ../canfestival/canfestival.py:407
 msgid "Show Master"
 msgstr "Afficher le maître"
 
-#: ../canfestival/canfestival.py:364
+#: ../canfestival/canfestival.py:408
 msgid "Show Master generated by config_utils"
 msgstr "Afficher le maître généré par config_utils"
 
-#: ../ProjectController.py:1552
+#: ../ProjectController.py:1862
 msgid "Show code"
 msgstr "Afficher le code"
 
-#: ../dialogs/SFCDivergenceDialog.py:74
+#: ../dialogs/SFCDivergenceDialog.py:68
 msgid "Simultaneous Convergence"
 msgstr "Convergence double"
 
-#: ../dialogs/SFCDivergenceDialog.py:68
+#: ../dialogs/SFCDivergenceDialog.py:67
 msgid "Simultaneous Divergence"
 msgstr "Divergence double"
 
@@ -3156,61 +3101,77 @@
 msgid "Sine"
 msgstr "Sinus"
 
-#: ../editors/ResourceEditor.py:68
+#: ../editors/ResourceEditor.py:76
 msgid "Single"
 msgstr "Evènement"
 
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr "La source n'a pas changé, pas de compilation.\n"
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+"Le signal source doit être défini pour la tâche évènement '{a1}' dans la "
+"ressource '{a2}. {A3}'."
+
 #: ../plcopen/iec_std.csv:23
 msgid "Square root (base 2)"
 msgstr "Racine carré (base 2)"
 
-#: ../plcopen/structures.py:192
+#: ../plcopen/definitions.py:50
 msgid "Standard function blocks"
 msgstr "Blocs fonctionnels standards"
 
-#: ../Beremiz_service.py:321
-#: ../ProjectController.py:1530
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
 msgid "Start PLC"
 msgstr "Démarrer l'automate"
 
-#: ../ProjectController.py:843
+#: ../ProjectController.py:1074
 #, python-format
 msgid "Start build in %s\n"
 msgstr "Début de la compilation dans %s\n"
 
-#: ../ProjectController.py:1341
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr "Démarré"
+
+#: ../ProjectController.py:1633
 msgid "Starting PLC\n"
 msgstr "Démarrer l'automate\n"
 
-#: ../Beremiz.py:435
+#: ../BeremizIDE.py:393
 msgid "Status ToolBar"
 msgstr "Barre d'outils de statut"
 
-#: ../editors/Viewer.py:492
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
 msgid "Step"
 msgstr "Étape"
 
-#: ../ProjectController.py:1533
+#: ../ProjectController.py:1835
 msgid "Stop"
 msgstr "Arrêter"
 
-#: ../Beremiz_service.py:322
+#: ../Beremiz_service.py:272
 msgid "Stop PLC"
 msgstr "Arrêter l'automate"
 
-#: ../ProjectController.py:1535
+#: ../ProjectController.py:1836
 msgid "Stop Running PLC"
 msgstr "Arrêter l'automate en cours d'exécution"
 
-#: ../ProjectController.py:1318
-msgid "Stopping debugger...\n"
-msgstr "Arrêt du débogage en cours\n"
-
-#: ../editors/DataTypeEditor.py:54
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr "Arrêté"
+
+#: ../editors/DataTypeEditor.py:60
 msgid "Structure"
 msgstr "Structure"
 
-#: ../editors/DataTypeEditor.py:54
+#: ../editors/DataTypeEditor.py:60
 msgid "Subrange"
 msgstr "Sous-ensemble"
 
@@ -3218,31 +3179,60 @@
 msgid "Subtraction"
 msgstr "Soustraction"
 
-#: ../ProjectController.py:942
+#: ../ProjectController.py:1113
 msgid "Successfully built.\n"
 msgstr "Compilé avec succès.\n"
 
-#: ../dialogs/SearchInProjectDialog.py:154
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr "Changer de perspective"
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
 msgid "Syntax error in regular expression of pattern to search!"
-msgstr "Erreur de syntaxe dans l'expression régulière du modèle à rechercher !"
+msgstr ""
+"Erreur de syntaxe dans l'expression régulière du modèle à rechercher !"
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr "TYPE"
 
 #: ../plcopen/iec_std.csv:29
 msgid "Tangent"
 msgstr "Tangente"
 
-#: ../editors/ResourceEditor.py:77
+#: ../editors/ResourceEditor.py:97
 msgid "Task"
 msgstr "Tâche"
 
-#: ../editors/ResourceEditor.py:226
+#: ../editors/ResourceEditor.py:248
 msgid "Tasks:"
 msgstr "Tâches :"
 
-#: ../controls/VariablePanel.py:78
+#: ../controls/VariablePanel.py:91
 msgid "Temp"
 msgstr "Temporaire"
 
-#: ../editors/FileManagementPanel.py:180
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+"Le meilleur endroit pour poser des questions sur Beremiz / PLCOpenEditor\n"
+"est la liste de diffusion du projet: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"C'est le principal canal de soutien communautaire.\n"
+"Pour poster, il est nécessaire d'être abonné à la liste de diffusion.\n"
+"\n"
+"Vous pouvez vous abonner à la liste ici:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+
+#: ../editors/FileManagementPanel.py:186
 #, python-format
 msgid ""
 "The file '%s' already exist.\n"
@@ -3251,22 +3241,24 @@
 "Le fichier '%s' existe déjà.\n"
 "Voulez-vous le remplacer ?"
 
-#: ../editors/LDViewer.py:882
+#: ../editors/LDViewer.py:893
 msgid "The group of block must be coherent!"
 msgstr "Le groupe de blocs doit être cohérent !"
 
-#: ../IDEFrame.py:974
-#: ../Beremiz.py:590
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
 msgid "There are changes, do you want to save?"
 msgstr "Le projet a été modifié. Voulez-vous l'enregistrer ?"
 
-#: ../IDEFrame.py:1590
-#: ../IDEFrame.py:1609
-#, python-format
-msgid "There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?"
-msgstr "Un POU a pour nom \"%s\". Cela peut générer des conflits. Voulez-vous continuer ?"
-
-#: ../IDEFrame.py:1061
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+"Un POU a pour nom \"%s\". Cela peut générer des conflits. Voulez-vous "
+"continuer ?"
+
+#: ../IDEFrame.py:1133
 msgid ""
 "There was a problem printing.\n"
 "Perhaps your current printer is not set correctly?"
@@ -3274,20 +3266,20 @@
 "Un problème est apparu lors de l'impression.\n"
 "Peut-être que votre imprimante n'est pas correctement configurée ?"
 
-#: ../editors/LDViewer.py:891
+#: ../editors/LDViewer.py:902
 msgid "This option isn't available yet!"
 msgstr "Cette option n'a pas encore disponible"
 
-#: ../editors/GraphicViewer.py:278
-msgid "Tick"
-msgstr "Tick"
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr "Tick: %d"
 
 #: ../plcopen/iec_std.csv:40
 msgid "Time"
 msgstr "Temps"
 
-#: ../plcopen/iec_std.csv:40
-#: ../plcopen/iec_std.csv:41
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
 msgid "Time addition"
 msgstr "Addition de durée"
 
@@ -3295,107 +3287,121 @@
 msgid "Time concatenation"
 msgstr "Concaténation de date et de durée"
 
-#: ../plcopen/iec_std.csv:60
-#: ../plcopen/iec_std.csv:61
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
 msgid "Time division"
 msgstr "Division de durée"
 
-#: ../plcopen/iec_std.csv:46
-#: ../plcopen/iec_std.csv:47
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
 msgid "Time multiplication"
 msgstr "Multiplication de durée"
 
-#: ../plcopen/iec_std.csv:48
-#: ../plcopen/iec_std.csv:49
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
 msgid "Time subtraction"
 msgstr "Soustraction de durée"
 
-#: ../plcopen/iec_std.csv:42
-#: ../plcopen/iec_std.csv:43
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
 msgid "Time-of-day addition"
 msgstr "Addition d'horodatage"
 
-#: ../plcopen/iec_std.csv:52
-#: ../plcopen/iec_std.csv:53
-#: ../plcopen/iec_std.csv:54
-#: ../plcopen/iec_std.csv:55
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
 msgid "Time-of-day subtraction"
 msgstr "Soustraction d'horodatage"
 
-#: ../editors/Viewer.py:431
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr "Basculer la valeur"
+
+#: ../editors/Viewer.py:584
 msgid "Top"
 msgstr "Haut"
 
-#: ../ProjectController.py:1542
+#: ../ProjectController.py:1848
 msgid "Transfer"
 msgstr "Transférer"
 
-#: ../ProjectController.py:1544
+#: ../ProjectController.py:1849
 msgid "Transfer PLC"
 msgstr "Transférer l'automate"
 
-#: ../ProjectController.py:1509
+#: ../ProjectController.py:1802
 msgid "Transfer completed successfully.\n"
 msgstr "Transfert effectué avec succès.\n"
 
-#: ../ProjectController.py:1511
+#: ../ProjectController.py:1805
 msgid "Transfer failed\n"
 msgstr "Le transfert a échoué\n"
 
-#: ../editors/Viewer.py:493
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
 msgid "Transition"
 msgstr "Transition"
 
-#: ../PLCGenerator.py:1252
-#, python-format
-msgid "Transition \"%s\" body must contain an output variable or coil referring to its name"
-msgstr "Le code de la transition \"%s\"  doit contenir une variable de sortie ou un relai dont la référence est son nom"
-
-#: ../dialogs/PouTransitionDialog.py:84
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+"Le code de la transition \"%s\"  doit contenir une variable de sortie ou un "
+"relai dont la référence est son nom"
+
+#: ../dialogs/PouTransitionDialog.py:91
 msgid "Transition Name"
 msgstr "Nom de la transition"
 
-#: ../dialogs/PouTransitionDialog.py:53
+#: ../dialogs/PouTransitionDialog.py:60
 msgid "Transition Name:"
 msgstr "Nom de la transition :"
 
-#: ../PLCGenerator.py:1340
-#, python-format
-msgid "Transition with content \"%s\" not connected to a next step in \"%s\" POU"
-msgstr "La transition contenant \"%s\" n'est pas connectée à une étape en sortie dans le POU \"%s\" !"
-
-#: ../PLCGenerator.py:1331
-#, python-format
-msgid "Transition with content \"%s\" not connected to a previous step in \"%s\" POU"
-msgstr "La transition contenant \"%s\" n'est pas connectée à une étape en entrée dans le POU \"%s\" !"
-
-#: ../plcopen/plcopen.py:1447
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr ""
+"La transition avec le contenu \"{a1}\" n'est pas connectée à une étape "
+"suivante dans le POU \"{a2}\""
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr ""
+"La transition avec le contenu \"{a1}\" n'est pas connectée à une étape "
+"précédente dans le POU \"{a2}\""
+
+#: ../plcopen/plcopen.py:1526
 #, python-format
 msgid "Transition with name %s doesn't exist!"
 msgstr "La transition nommée %s n'existe pas !"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:76
 msgid "Transitions"
 msgstr "Transitions"
 
-#: ../editors/ResourceEditor.py:68
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr "Traduit par"
+
+#: ../editors/ResourceEditor.py:76
 msgid "Triggering"
 msgstr "Activation"
 
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
-#: ../editors/DataTypeEditor.py:50
-#: ../editors/ResourceEditor.py:77
-#: ../dialogs/ActionBlockDialog.py:37
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr "Twisted indisponible."
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
 msgid "Type"
 msgstr "Type"
 
-#: ../dialogs/BrowseLocationsDialog.py:44
+#: ../dialogs/BrowseLocationsDialog.py:54
 msgid "Type and derivated"
 msgstr "Type et ses dérivés"
 
-#: ../canfestival/config_utils.py:335
-#: ../canfestival/config_utils.py:617
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
 #, python-format
 msgid "Type conflict for location \"%s\""
 msgstr "Conflit entre types pour l'adresse \"%s\""
@@ -3404,181 +3410,233 @@
 msgid "Type conversion"
 msgstr "Conversion de type"
 
-#: ../editors/DataTypeEditor.py:161
+#: ../editors/DataTypeEditor.py:170
 msgid "Type infos:"
 msgstr "Propriétés du type :"
 
-#: ../dialogs/BrowseLocationsDialog.py:45
+#: ../dialogs/BrowseLocationsDialog.py:55
 msgid "Type strict"
 msgstr "Type uniquement"
 
-#: ../dialogs/SFCDivergenceDialog.py:51
-#: ../dialogs/LDPowerRailDialog.py:51
-#: ../dialogs/BrowseLocationsDialog.py:95
-#: ../dialogs/ConnectionDialog.py:52
-#: ../dialogs/SFCTransitionDialog.py:53
-#: ../dialogs/FBDBlockDialog.py:48
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
 msgid "Type:"
 msgstr "Type :"
 
-#: ../canfestival/config_utils.py:455
-#: ../canfestival/config_utils.py:469
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
 #, python-format
 msgid "Unable to define PDO mapping for node %02x"
 msgstr "Impossible de définir le mappage des PDO pour le noeud %02x"
 
-#: ../targets/Xenomai/__init__.py:14
+#: ../targets/Xenomai/__init__.py:43
 #, python-format
 msgid "Unable to get Xenomai's %s \n"
 msgstr "Unable to get Xenomai's %s \n"
 
-#: ../PLCGenerator.py:904
-#: ../PLCGenerator.py:963
-#, python-format
-msgid "Undefined block type \"%s\" in \"%s\" POU"
-msgstr "Type de block \"%s\" indéfini dans le POU \"%s\""
-
-#: ../PLCGenerator.py:252
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr "Type de bloc indéfini \"{a1}\" dans le module \"{a2}\""
+
+#: ../PLCGenerator.py:261
 #, python-format
 msgid "Undefined pou type \"%s\""
 msgstr "Type de POU \"%s\" indéterminé !"
 
-#: ../IDEFrame.py:343
-#: ../IDEFrame.py:402
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
 msgid "Undo"
 msgstr "Défaire"
 
-#: ../ProjectController.py:262
+#: ../ProjectController.py:442
 msgid "Unknown"
 msgstr "Inconnu"
 
-#: ../editors/Viewer.py:335
+#: ../editors/Viewer.py:437
 #, python-format
 msgid "Unknown variable \"%s\" for this POU!"
 msgstr "Variable \"%s\" inconnue dans ce POU !"
 
-#: ../ProjectController.py:259
-#: ../ProjectController.py:260
+#: ../ProjectController.py:439 ../ProjectController.py:440
 msgid "Unnamed"
 msgstr "SansNom"
 
-#: ../PLCControler.py:305
+#: ../PLCControler.py:263
 #, python-format
 msgid "Unnamed%d"
 msgstr "Sansnom%d"
 
-#: ../controls/VariablePanel.py:272
+#: ../controls/VariablePanel.py:308
 #, python-format
 msgid "Unrecognized data size \"%s\""
 msgstr "Taille de donnée \"%s\" non identifié !"
 
-#: ../plcopen/structures.py:221
-msgid ""
-"Up-counter\n"
-"The up-counter can be used to signal when a count has reached a maximum value."
-msgstr ""
-"Compteur incrémental\n"
-"Le compteur incrémental peut être utilisé pour signaler lorsque le compteur a atteint la valeur maximale."
-
-#: ../plcopen/structures.py:231
-msgid ""
-"Up-down counter\n"
-"The up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other."
-msgstr ""
-"Compteur bidirectionnel\n"
-"Le compteur bidirectionnel a deux entrées CU et CD. Il peut être utilisé pour compter de façon incrémentale ou décrémentale sur l'une ou l'autre des entrées."
-
-#: ../controls/VariablePanel.py:712
-#: ../editors/DataTypeEditor.py:631
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
 msgid "User Data Types"
 msgstr "Types de donnée du projet"
 
-#: ../canfestival/SlaveEditor.py:42
-#: ../canfestival/NetworkEditor.py:63
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
 msgid "User Type"
 msgstr "Type utilisateur"
 
-#: ../PLCControler.py:94
+#: ../plcopen/types_enums.py:75
 msgid "User-defined POUs"
 msgstr "POUs du projet"
 
-#: ../controls/DebugVariablePanel.py:58
-#: ../dialogs/ActionBlockDialog.py:37
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Value"
 msgstr "Valeur"
 
-#: ../editors/GraphicViewer.py:278
-msgid "Values"
-msgstr "Valeurs"
-
-#: ../editors/DataTypeEditor.py:258
+#: ../editors/DataTypeEditor.py:267
 msgid "Values:"
 msgstr "Valeurs"
 
-#: ../controls/DebugVariablePanel.py:58
-#: ../editors/Viewer.py:465
-#: ../dialogs/ActionBlockDialog.py:41
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
 msgid "Variable"
 msgstr "Variable"
 
-#: ../dialogs/FBDVariableDialog.py:47
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr "Dépôt de variable"
+
+#: ../dialogs/FBDVariableDialog.py:68
 msgid "Variable Properties"
 msgstr "Propriétés de la variable"
 
-#: ../controls/LocationCellEditor.py:97
-#: ../controls/VariablePanel.py:277
-#: ../editors/TextViewer.py:323
-#: ../editors/Viewer.py:275
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
 msgid "Variable class"
 msgstr "Direction de la variable"
 
-#: ../editors/TextViewer.py:367
-#: ../editors/Viewer.py:337
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
 msgid "Variable don't belong to this POU!"
 msgstr "La variable n'appartient pas à ce POU !"
 
-#: ../controls/VariablePanel.py:77
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr "Variable:"
+
+#: ../controls/VariablePanel.py:90
 msgid "Variables"
 msgstr "Variables"
 
-#: ../controls/ProjectPropertiesPanel.py:151
+#: ../controls/ProjectPropertiesPanel.py:166
 msgid "Vertical:"
 msgstr "Vertical :"
 
-#: ../wxglade_hmi/wxglade_hmi.py:11
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr ""
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr ""
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr ""
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr ""
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr "Le démarrage du client WAMP a échoué."
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr ""
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr "WAMP se connectant à l'URL: %s\n"
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr "Délai de connexion WAMP dépassé"
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr "La connexion WAMP à '%s' a échoué.\n"
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr "L'importation de WAMP a échoué:"
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr ""
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
 msgid "WXGLADE GUI"
 msgstr "IHM WXGlade"
 
-#: ../ProjectController.py:1302
-msgid "Waiting debugger to recover...\n"
-msgstr "En attente de la mise en route du déboggueur...\n"
-
-#: ../editors/LDViewer.py:891
-#: ../dialogs/PouDialog.py:126
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
 msgid "Warning"
 msgstr "Attention"
 
-#: ../ProjectController.py:529
+#: ../ProjectController.py:726
 msgid "Warnings in ST/IL/SFC code generator :\n"
 msgstr "Mises en garde du generateur de code ST/IL/SFC :\n"
 
-#: ../dialogs/SearchInProjectDialog.py:85
+#: ../dialogs/SearchInProjectDialog.py:82
 msgid "Whole Project"
 msgstr "Tout le projet"
 
-#: ../controls/ProjectPropertiesPanel.py:119
+#: ../controls/ProjectPropertiesPanel.py:134
 msgid "Width:"
 msgstr "Longueur :"
 
-#: ../dialogs/FindInPouDialog.py:86
+#: ../dialogs/FindInPouDialog.py:94
 msgid "Wrap search"
 msgstr "Boucler"
 
-#: ../features.py:10
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr "Écrit par"
+
+#: ../features.py:35
 msgid "WxGlade GUI"
 msgstr "Interface WxGlade"
 
-#: ../svgui/svgui.py:106
+#: ../svgui/svgui.py:150
 msgid ""
 "You don't have write permissions.\n"
 "Open Inkscape anyway ?"
@@ -3586,7 +3644,7 @@
 "Vous n'avez pas les permissions d'écriture.\n"
 "Ouvrir Inkscape tout de même ?"
 
-#: ../wxglade_hmi/wxglade_hmi.py:108
+#: ../wxglade_hmi/wxglade_hmi.py:160
 msgid ""
 "You don't have write permissions.\n"
 "Open wxGlade anyway ?"
@@ -3594,7 +3652,7 @@
 "Vous n'avez pas les permissions d'écriture.\n"
 "Ouvrir wxGlade tout de même ?"
 
-#: ../ProjectController.py:224
+#: ../ProjectController.py:390
 msgid ""
 "You must have permission to work on the project\n"
 "Work on a project copy ?"
@@ -3602,67 +3660,77 @@
 "Vous n'avez pas la permission de travailler sur le projet.\n"
 "Travailler sur une copie du projet ?"
 
-#: ../editors/LDViewer.py:886
-msgid "You must select the block or group of blocks around which a branch should be added!"
-msgstr "Vous devez sélectionné le bloc ou le group autour duquel un ebranche doit être ajoutée !"
-
-#: ../editors/LDViewer.py:666
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+"Vous devez sélectionné le bloc ou le group autour duquel un ebranche doit "
+"être ajoutée !"
+
+#: ../editors/LDViewer.py:677
 msgid "You must select the wire where a contact should be added!"
-msgstr "Vous devez sélectionner le fil sur lequel le contact doit être ajouté !"
-
-#: ../dialogs/PouNameDialog.py:45
-#: ../dialogs/SFCStepNameDialog.py:47
-#: ../dialogs/SFCStepDialog.py:118
+msgstr ""
+"Vous devez sélectionner le fil sur lequel le contact doit être ajouté !"
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
 msgid "You must type a name!"
 msgstr "Vous devez saisir un nom !"
 
-#: ../dialogs/ForceVariableDialog.py:175
+#: ../dialogs/ForceVariableDialog.py:209
 msgid "You must type a value!"
 msgstr "Vous devez saisir une valeur !"
 
-#: ../IDEFrame.py:419
+#: ../IDEFrame.py:440
 msgid "Zoom"
 msgstr "Zoom"
 
-#: ../editors/GraphicViewer.py:97
-msgid "Zoom:"
-msgstr "Zoom :"
-
-#: ../PLCOpenEditor.py:335
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr "jours"
+
+#: ../PLCOpenEditor.py:317
 #, python-format
 msgid "error: %s\n"
 msgstr "erreur: %s\n"
 
-#: ../util/ProcessLogger.py:161
-#, python-format
-msgid "exited with status %s (pid %s)\n"
-msgstr "a quitté avec le status %s (pid %s)\n"
-
-#: ../PLCOpenEditor.py:393
-#: ../PLCOpenEditor.py:395
-msgid "file : "
-msgstr "fichier :"
-
-#: ../dialogs/PouDialog.py:31
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr "quitté avec le statut {a1} (pid {a2})\n"
+
+#: ../dialogs/PouDialog.py:36
 msgid "function"
 msgstr "fonction"
 
-#: ../PLCOpenEditor.py:396
-msgid "function : "
-msgstr "fonction :"
-
-#: ../dialogs/PouDialog.py:31
+#: ../dialogs/PouDialog.py:36
 msgid "functionBlock"
 msgstr "Bloc fonctionnel"
 
-#: ../PLCOpenEditor.py:396
-msgid "line : "
-msgstr "ligne :"
-
-#: ../dialogs/PouDialog.py:31
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr "heures"
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr "L'installation de matiec n'est pas trouvée\n"
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr "millisecondes"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr "minutes"
+
+#: ../dialogs/PouDialog.py:36
 msgid "program"
 msgstr "programme"
 
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr "secondes"
+
 #: ../plcopen/iec_std.csv:84
 msgid "string from the middle"
 msgstr "Caractères du milieu"
@@ -3675,11 +3743,29 @@
 msgid "string right of"
 msgstr "Caractères à droite de"
 
-#: ../PLCOpenEditor.py:333
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr "Information de mise à jour non disponible."
+
+#: ../PLCOpenEditor.py:315
 #, python-format
 msgid "warning: %s\n"
 msgstr "attention: %s\n"
 
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr "{a1} \"{a2}\" ne peut pas être collé comme {a3}."
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+"Le fichier XML {a1} ne suit pas le schéma XSD à la ligne {a2}:\n"
+"{a3}"
+
 #: Extra XSD strings
 msgid "CanFestivalSlaveNode"
 msgstr "Noeud esclave CanFestival"
@@ -3711,15 +3797,102 @@
 msgid "CAN_Driver"
 msgstr "Driver CAN"
 
-msgid "CExtension"
-msgstr "Extension C"
+msgid "Generic"
+msgstr "Générique"
+
+msgid "Command"
+msgstr "Commande"
+
+msgid "Xenomai"
+msgstr "Xenomai"
+
+msgid "XenoConfig"
+msgstr "Config Xenomai"
+
+msgid "Compiler"
+msgstr "Compileur"
 
 msgid "CFLAGS"
 msgstr "CFLAGS"
 
+msgid "Linker"
+msgstr "Linkeur"
+
 msgid "LDFLAGS"
 msgstr "LDFLAGS"
 
+msgid "Linux"
+msgstr "Linux"
+
+msgid "Win32"
+msgstr "Win32"
+
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr ""
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
 msgid "BaseParams"
 msgstr "Paramètres de base"
 
@@ -3729,24 +3902,6 @@
 msgid "Enabled"
 msgstr "Actif"
 
-msgid "Linux"
-msgstr "Linux"
-
-msgid "Compiler"
-msgstr "Compileur"
-
-msgid "Linker"
-msgstr "Linkeur"
-
-msgid "Win32"
-msgstr "Win32"
-
-msgid "Xenomai"
-msgstr "Xenomai"
-
-msgid "XenoConfig"
-msgstr "Config Xenomai"
-
 msgid "BeremizRoot"
 msgstr "Racine de Beremiz"
 
@@ -3762,201 +3917,236 @@
 msgid "Disable_Extensions"
 msgstr "Disable_Extensions"
 
-#~ msgid "Debug connect matching running PLC\n"
-#~ msgstr "L'automate connecté correspond au project ouvert.\n"
-
-#~ msgid "File '%s' already exists!"
-#~ msgstr "Le fichier '%s' existe déjà !"
-
-#~ msgid "Function Blocks can't be used in Transitions!"
-#~ msgstr ""
-#~ "Les blocs fonctionnels ne peuvent être utilisés dans des transitions"
-
-#~ msgid "No running PLC"
-#~ msgstr "Aucun automate en cours d'exécution"
-
-#~ msgid "Node infos"
-#~ msgstr "Propriétés du noeud"
-
-#~ msgid "PLC is %s\n"
-#~ msgstr "L'automate est dans l'état %s\n"
-
-#~ msgid "Debug_mode"
-#~ msgstr "Mode de débogage"
-
-#, fuzzy
-#~ msgid "Close Project\tCTRL+SHIFT+W"
-#~ msgstr ""
-#~ "#-#-#-#-#  Beremiz_fr_FR.po (PACKAGE VERSION)  #-#-#-#-#\n"
-#~ "Fermer le project\tCTRL+SHIFT+W\n"
-#~ "#-#-#-#-#  PLCOpenEditor_fr_FR.po (PACKAGE VERSION)  #-#-#-#-#\n"
-#~ "Fermer le projet\tCTRL+SHIFT+W"
-
-#~ msgid "New\tCTRL+N"
-#~ msgstr "Nouveau\tCTRL+N"
-
-#~ msgid "Open\tCTRL+O"
-#~ msgstr "Ouvrir\tCTRL+O"
-
-#, fuzzy
-#~ msgid "Preview\tCTRL+SHIFT+P"
-#~ msgstr ""
-#~ "#-#-#-#-#  Beremiz_fr_FR.po (PACKAGE VERSION)  #-#-#-#-#\n"
-#~ "Preview\tCTRL+SHIFT+P\n"
-#~ "#-#-#-#-#  PLCOpenEditor_fr_FR.po (PACKAGE VERSION)  #-#-#-#-#\n"
-#~ "Aperçu avant impression\tCTRL+SHIFT+S"
-
-#, fuzzy
-#~ msgid "Print\tCTRL+P"
-#~ msgstr ""
-#~ "#-#-#-#-#  Beremiz_fr_FR.po (PACKAGE VERSION)  #-#-#-#-#\n"
-#~ "Imprimer\tCTRL+P\n"
-#~ "#-#-#-#-#  PLCOpenEditor_fr_FR.po (PACKAGE VERSION)  #-#-#-#-#\n"
-#~ "Imprimer...\tCTRL+Q"
-
-#~ msgid "Quit\tCTRL+Q"
-#~ msgstr "Quitter\tCTRL+Q"
-
-#~ msgid "Save\tCTRL+S"
-#~ msgstr "Enregistrer\tCTRL+S"
-
-#~ msgid "Save as\tCTRL+SHIFT+S"
-#~ msgstr "Enregistrer sous...\tCTRL+SHIFT+S"
-
-#~ msgid "Copy\tCTRL+C"
-#~ msgstr "Copier\tCtrl+C"
-
-#~ msgid "Cut\tCTRL+X"
-#~ msgstr "Couper\tCTRL+X"
-
-#~ msgid "Find\tCTRL+F"
-#~ msgstr "Rechercher...\tCTRL+Z"
-
-#~ msgid "PLCOpenEditor\tF1"
-#~ msgstr "PLCOpenEditor\tF1"
-
-#~ msgid "Paste\tCTRL+V"
-#~ msgstr "Coller\tCTRL+V"
-
-#~ msgid "Redo\tCTRL+Y"
-#~ msgstr "Refaire\tCTRL+Y"
-
-#~ msgid "Refresh\tCTRL+R"
-#~ msgstr "Actualiser\tCTRL+R"
-
-#~ msgid "Save As...\tCTRL+SHIFT+S"
-#~ msgstr "Enregistrer sous...\tCTRL+SHIFT+S"
-
-#~ msgid "Search in Project\tCTRL+SHIFT+F"
-#~ msgstr "Rechercher dans le projet\tCTRL+SHIFT+F"
-
-#~ msgid "Undo\tCTRL+Z"
-#~ msgstr "Défaire\tCTRL+Z"
-
-#~ msgid "Add a sub confnode"
-#~ msgstr "Add a sub confnode"
-
-#~ msgid "Append "
-#~ msgstr "Ajouter "
-
-#~ msgid "Delete this confnode"
-#~ msgstr "Supprimer ce plugin"
-
-#~ msgid "Edit CanOpen Network with NetworkEdit"
-#~ msgstr "Editer le réseau CANOpen à l'aide de NetworkEdit"
-
-#~ msgid "Edit Python File"
-#~ msgstr "Editer le fichier Python"
-
-#~ msgid "Edit network"
-#~ msgstr "Editer le réseau"
-
-#~ msgid "Enable/Disable this confnode"
-#~ msgstr "Activer/Désactiver le plugin"
-
-#~ msgid "Please enter a name for confnode:"
-#~ msgstr "Saisissez un nom pour le plugin :"
-
-#~ msgid "Project not created"
-#~ msgstr "Le projet n'a pu être créé"
-
-#~ msgid "Topology"
-#~ msgstr "Topologie"
-
-#~ msgid "Wrong URI, please check it !\n"
-#~ msgstr "URI inconnue, veuillez vérifier l'adresse !\n"
-
-#~ msgid "Add a new data type"
-#~ msgstr "Ajouter un nouveau type de données"
-
-#~ msgid "Add new configuration"
-#~ msgstr "Ajouter une nouvelle configuration"
-
-#~ msgid "Add new resource"
-#~ msgstr "Ajouter une nouvelle resource"
-
-#~ msgid "Block Types"
-#~ msgstr "Types de blocs"
-
-#~ msgid "Delete Task"
-#~ msgstr "Supprimer une tâche"
-
-#~ msgid "Graphic Panel"
-#~ msgstr "Graphique"
-
-#~ msgid "Instances"
-#~ msgstr "Instances"
-
-#~ msgid "Invalid value \"%s\" for location"
-#~ msgstr "Adresse \"%s\" invalide "
-
-#~ msgid "Please enter configuration name"
-#~ msgstr "Saisissez le nom de la configuration"
-
-#~ msgid "Please enter data type name"
-#~ msgstr "Saisissez le nom du type de donnée"
-
-#~ msgid "Please enter resource name"
-#~ msgstr "Saisissez le nom de la ressource"
-
-#~ msgid "Please enter text"
-#~ msgstr "Saisissez le texte"
-
-#~ msgid "Plugins"
-#~ msgstr "Plugins"
-
-#~ msgid "Create a new POU from"
-#~ msgstr "Créer un nouveau POU à partir de"
-
-#~ msgid "Please enter POU name"
-#~ msgstr "Saisissez le nom du POU"
-
-#~ msgid "Scaling:"
-#~ msgstr "Echelle :"
-
-#~ msgid "X Scale:"
-#~ msgstr "Echelle X :"
-
-#~ msgid "Y Scale:"
-#~ msgstr "Echelle Y :"
-
-#~ msgid "No"
-#~ msgstr "Non"
-
-#~ msgid "Yes"
-#~ msgstr "Oui"
-
-#, fuzzy
-#~ msgid "A pou with \"%s\" as name exists!"
-#~ msgstr "Un POU nommé \"%s\" existe déjà !"
-
-#~ msgid "Close\tCTRL+Q"
-#~ msgstr "Fermer\tCTRL+Q"
-
-#~ msgid ""
-#~ "A variable is defined with \"%s\" as name. It can generate a conflict. Do "
-#~ "you wish to continue?"
-#~ msgstr "Une variable"
-
-#~ msgid "Create A New POU From"
-#~ msgstr "Créer un nouveau POU à partir de"
+msgid "%(codefile_name)s"
+msgstr "%(codefile_name)s"
+
+msgid "variables"
+msgstr "variables"
+
+msgid "variable"
+msgstr "variable"
+
+msgid "name"
+msgstr "nom"
+
+msgid "type"
+msgstr "type"
+
+msgid "class"
+msgstr "classe"
+
+msgid "initial"
+msgstr "initiale"
+
+msgid "desc"
+msgstr "desc"
+
+msgid "onchange"
+msgstr "onchange"
+
+msgid "opts"
+msgstr "opts"
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr "0 - heure actuelle, 1 - utilise le temps donné dans PDT"
+
+msgid "Preset datetime"
+msgstr "Date et heure prédéfinies"
+
+msgid "Copy of IN"
+msgstr "Copie de IN"
+
+msgid "Datetime, current or relative to PDT"
+msgstr "Date et heure, actuel ou relatif à PDT"
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+"L'horloge temps réel a de nombreuses utilisations, y compris l'horodatage, "
+"définir les dates et heures dans les rapports de production, dans les "
+"messages d'alarme, etc."
+
+msgid "1 = integrate, 0 = hold"
+msgstr "1 = intégrer, 0 = retenir"
+
+msgid "Overriding reset"
+msgstr "Réinitialisation"
+
+msgid "Input variable"
+msgstr "Variable d'entrée"
+
+msgid "Initial value"
+msgstr "Valeur initiale"
+
+msgid "Sampling period"
+msgstr "Période d'échantillonnage"
+
+msgid "NOT R1"
+msgstr "NOT R1"
+
+msgid "Integrated output"
+msgstr "Sortie intégrale"
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr ""
+"Le bloc fonction intégral intègre la valeur de l'entrée XIN dans le temps."
+
+msgid "0 = reset"
+msgstr "0 = reset"
+
+msgid "Input to be differentiated"
+msgstr "Entrée à dériver"
+
+msgid "Differentiated output"
+msgstr "Sortie dérivée"
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+"Le bloc fonction dérivé produit une sortie XOUT proportionnelle à la "
+"variation dans le temps de l'entrée XIN."
+
+msgid "0 - manual , 1 - automatic"
+msgstr "0 - manuel, 1 - automatique"
+
+msgid "Process variable"
+msgstr "Variable de processus"
+
+msgid "Set point"
+msgstr "Point de consigne"
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr ""
+"Réglage manuel de la sortie - Généralement à partir de la station de "
+"transfert"
+
+msgid "Proportionality constant"
+msgstr "Constante de proportionnalité"
+
+msgid "Reset time"
+msgstr "Temps de reset"
+
+msgid "Derivative time constant"
+msgstr "Constante de temps dérivée"
+
+msgid "PV - SP"
+msgstr "PV - SP"
+
+msgid "FB for integral term"
+msgstr "FB pour terme intégral"
+
+msgid "FB for derivative term"
+msgstr "FB pour terme dérivé"
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+"Le bloc fonctionnel PID (Proportionnel, Intégral, Dérivé) fournit le "
+"contrôleur classique à trois termes pour le contrôle en boucle fermée."
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr "0 - suivre X0, 1 - rampe vers/suivre X1"
+
+msgid "Ramp duration"
+msgstr "Durée de la rampe"
+
+msgid "BUSY = 1 during ramping period"
+msgstr "BUSY = 1 durant la rampe"
+
+msgid "Elapsed time of ramp"
+msgstr "Temps écoulé de la rampe"
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr "Le bloc fonction RAMP est basée sur l'exemple donné dans la norme."
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+"Le bloc fonction hystérésis fournit une sortie booléenne à hystérésis "
+"pilotée par la différence de deux entrées à virgule flottante (REAL) XIN1 et"
+" XIN2."
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr "La bistable SR est une bascule où l'état Set est dominant."
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr "La bistable RS est une bascule où l'état Reset est dominant."
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+"Le sémaphore fournit un mécanisme permettant aux éléments logiciels "
+"d'accéder mutuellement à certaines ressources."
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+"La sortie produit une impulsion unique lorsqu'un front montant est détecté."
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+"La sortie produit une impulsion unique lorsqu'un front descendant est "
+"détecté."
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+"Le compteur peut être utilisé pour signaler qu'un compte a atteint une "
+"valeur maximale."
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+"Le décompteur peut être utilisé pour signaler qu'un compte a atteint zéro, "
+"lors du décompte d'une valeur prédéfinie."
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+"Le compteur-décompteur a deux entrées CU et CD. Il peut être utilisé pour "
+"compter à la fois sur une entrée et sur l'autre sur l'autre."
+
+msgid "first input parameter"
+msgstr "Premier paramètre d'entrée"
+
+msgid "second input parameter"
+msgstr "Second paramètre d'entrée"
+
+msgid "first output parameter"
+msgstr "Premier paramètre de sortie"
+
+msgid "second output parameter"
+msgstr "Second paramètre de sortie"
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr "état interne: 0-reset, 1-counting, 2-set"
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+"La temporisation d'impulsions peut être utilisée pour générer des impulsions"
+" de sortie d'une durée donnée."
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+"La temporisation à retard peut être utilisée pour retarder un front montant "
+"d'une durée donnée."
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
+"La temporisation de retard peut être utilisée pour retarder un front "
+"descendant d'une durée donnée."
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/Beremiz_hr.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4017 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Language-Team: Croatian (https://www.transifex.com/beremiz/teams/75746/hr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hr\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
+msgid ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "   External"
+msgstr ""
+
+#: ../controls/VariablePanel.py:89
+msgid "   InOut"
+msgstr ""
+
+#: ../controls/VariablePanel.py:89
+msgid "   Input"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "   Local"
+msgstr ""
+
+#: ../controls/VariablePanel.py:89
+msgid "   Output"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "   Temp"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
+#, python-format
+msgid " and %s"
+msgstr ""
+
+#: ../ProjectController.py:1182
+msgid " generation failed !\n"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1029
+#, python-format
+msgid "\"%s\" Data Type doesn't exist !!!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1047
+#, python-format
+msgid "\"%s\" POU already exists !!!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1068
+#, python-format
+msgid "\"%s\" POU doesn't exist !!!"
+msgstr ""
+
+#: ../editors/Viewer.py:288
+#, python-format
+msgid "\"%s\" can't use itself!"
+msgstr ""
+
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
+#, python-format
+msgid "\"%s\" config already exists!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:531
+#, python-format
+msgid "\"%s\" configuration already exists !!!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr ""
+
+#: ../IDEFrame.py:1638
+#, python-format
+msgid "\"%s\" data type already exists!"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
+#, python-format
+msgid "\"%s\" element for this pou already exists!"
+msgstr ""
+
+#: ../BeremizIDE.py:928
+#, python-format
+msgid "\"%s\" folder is not a valid Beremiz project\n"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
+#, python-format
+msgid "\"%s\" is a keyword. It can't be used!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:2836
+#, python-format
+msgid "\"%s\" is an invalid value!"
+msgstr ""
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
+msgid "\"%s\" is not a valid folder!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
+#, python-format
+msgid "\"%s\" is not a valid identifier!"
+msgstr ""
+
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr ""
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
+#, python-format
+msgid "\"%s\" pou already exists!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:62
+#, python-format
+msgid "\"%s\" step already exists!"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:566
+#, python-format
+msgid "\"%s\" value already defined!"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
+#, python-format
+msgid "\"%s\" value isn't a valid array dimension!"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
+#, python-format
+msgid ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+msgstr ""
+
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr ""
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr ""
+
+#: ../PLCControler.py:1114
+#, python-format
+msgid "%s Data Types"
+msgstr ""
+
+#: ../PLCControler.py:1097
+#, python-format
+msgid "%s POUs"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
+#, python-format
+msgid "%s Profile"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
+#, python-format
+msgid "%s body don't have instances!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
+#, python-format
+msgid "%s body don't have text!"
+msgstr ""
+
+#: ../IDEFrame.py:388
+msgid "&Add Element"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr ""
+
+#: ../IDEFrame.py:361
+msgid "&Configuration"
+msgstr ""
+
+#: ../IDEFrame.py:350
+msgid "&Data Type"
+msgstr ""
+
+#: ../IDEFrame.py:392
+msgid "&Delete"
+msgstr ""
+
+#: ../IDEFrame.py:342
+msgid "&Display"
+msgstr ""
+
+#: ../IDEFrame.py:341
+msgid "&Edit"
+msgstr ""
+
+#: ../IDEFrame.py:340
+msgid "&File"
+msgstr ""
+
+#: ../IDEFrame.py:352
+msgid "&Function"
+msgstr ""
+
+#: ../IDEFrame.py:343
+msgid "&Help"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr ""
+
+#: ../IDEFrame.py:356
+msgid "&Program"
+msgstr ""
+
+#: ../PLCOpenEditor.py:98
+msgid "&Properties"
+msgstr ""
+
+#: ../BeremizIDE.py:244
+msgid "&Recent Projects"
+msgstr ""
+
+#: ../IDEFrame.py:358
+msgid "&Resource"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:298
+#, python-format
+msgid "(%d matches)"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
+#, python-format
+msgid ", %s"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr ""
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr ""
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr ""
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr ""
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
+#, python-format
+msgid "A POU named \"%s\" already exists!"
+msgstr ""
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:229
+msgid "A location must be selected!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
+#, python-format
+msgid "A variable with \"%s\" as name already exists in this pou!"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr ""
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
+msgid "About"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:22
+msgid "Absolute number"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
+msgid "Action"
+msgstr ""
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
+msgid "Action Block"
+msgstr ""
+
+#: ../dialogs/PouActionDialog.py:89
+msgid "Action Name"
+msgstr ""
+
+#: ../dialogs/PouActionDialog.py:56
+msgid "Action Name:"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1567
+#, python-format
+msgid "Action with name %s doesn't exist!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Actions"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:139
+msgid "Actions:"
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
+msgid "Add"
+msgstr ""
+
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
+msgid "Add Action"
+msgstr ""
+
+#: ../features.py:33
+msgid "Add C code accessing located variables synchronously"
+msgstr ""
+
+#: ../IDEFrame.py:1907
+msgid "Add Configuration"
+msgstr ""
+
+#: ../IDEFrame.py:1887
+msgid "Add DataType"
+msgstr ""
+
+#: ../editors/Viewer.py:609
+msgid "Add Divergence Branch"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:121
+msgid "Add IP"
+msgstr ""
+
+#: ../IDEFrame.py:1895
+msgid "Add POU"
+msgstr ""
+
+#: ../features.py:34
+msgid "Add Python code executed asynchronously"
+msgstr ""
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
+msgid "Add Resource"
+msgstr ""
+
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
+msgid "Add Transition"
+msgstr ""
+
+#: ../editors/Viewer.py:596
+msgid "Add Wire Segment"
+msgstr ""
+
+#: ../editors/SFCViewer.py:447
+msgid "Add a new initial step"
+msgstr ""
+
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
+msgid "Add a new jump"
+msgstr ""
+
+#: ../editors/SFCViewer.py:469
+msgid "Add a new step"
+msgstr ""
+
+#: ../features.py:35
+msgid "Add a simple WxGlade based GUI."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:143
+msgid "Add action"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:364
+msgid "Add element"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:283
+msgid "Add instance"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:110
+msgid "Add slave"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:252
+msgid "Add task"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
+msgid "Add variable"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:33
+msgid "Addition"
+msgstr ""
+
+#: ../plcopen/definitions.py:51
+msgid "Additional function blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr ""
+
+#: ../editors/Viewer.py:1720
+msgid "Alignment"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
+msgid "All"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:37
+msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+msgstr ""
+
+#: ../ProjectController.py:1670
+msgid "Already connected. Please disconnect\n"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:607
+#, python-format
+msgid "An element named \"%s\" already exists in this structure!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:31
+msgid "Arc cosine"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:30
+msgid "Arc sine"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:32
+msgid "Arc tangent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:33
+msgid "Arithmetic"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
+msgid "Array"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:39
+msgid "Assignment"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:226
+msgid "At least a variable or an expression must be selected!"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:111
+msgid "Author"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:108
+msgid "Author Name (optional):"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:80
+msgid "Backward"
+msgstr ""
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
+#, python-format
+msgid "Bad location size : %s"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
+msgid "Base Type:"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
+msgid "Base Types"
+msgstr ""
+
+#: ../BeremizIDE.py:483
+msgid "Beremiz"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:70
+msgid "Binary selection (1 of 2)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Bit-shift"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise AND"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:67
+msgid "Bitwise OR"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:68
+msgid "Bitwise XOR"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:69
+msgid "Bitwise inverting"
+msgstr ""
+
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
+msgid "Block"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:63
+msgid "Block Properties"
+msgstr ""
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr ""
+
+#: ../editors/Viewer.py:586
+msgid "Bottom"
+msgstr ""
+
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
+msgid "Browse %s values library"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:72
+msgid "Browse Locations"
+msgstr ""
+
+#: ../ProjectController.py:1815
+msgid "Build"
+msgstr ""
+
+#: ../ProjectController.py:1335
+msgid "Build directory already clean\n"
+msgstr ""
+
+#: ../ProjectController.py:1816
+msgid "Build project into build folder"
+msgstr ""
+
+#: ../ProjectController.py:1108
+msgid "C Build crashed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1105
+msgid "C Build failed.\n"
+msgstr ""
+
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr ""
+
+#: ../ProjectController.py:1186
+msgid "C code generated successfully.\n"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:199
+#, python-format
+msgid "C compilation of %s failed.\n"
+msgstr ""
+
+#: ../features.py:33
+msgid "C extension"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr ""
+
+#: ../features.py:31
+msgid "CANopen support"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
+msgid "Can only generate execution order on FBD networks!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:291
+msgid "Can only give a location to local or global variables"
+msgstr ""
+
+#: ../PLCOpenEditor.py:318
+#, python-format
+msgid "Can't generate program to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:289
+msgid "Can't give a location to a function block instance"
+msgstr ""
+
+#: ../PLCOpenEditor.py:363
+#, python-format
+msgid "Can't save project to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:339
+msgid "Can't set an initial value to a function block instance"
+msgstr ""
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr ""
+
+#: ../ConfigTreeNode.py:454
+#, python-format
+msgid "Cannot find lower free IEC channel than %d\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:139
+msgid "Cannot get PLC status - connection failed.\n"
+msgstr ""
+
+#: ../ProjectController.py:967
+msgid "Cannot open/parse VARIABLES.csv!\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
+msgid "Case sensitive"
+msgstr ""
+
+#: ../editors/Viewer.py:581
+msgid "Center"
+msgstr ""
+
+#: ../Beremiz_service.py:276
+msgid "Change IP of interface to bind"
+msgstr ""
+
+#: ../Beremiz_service.py:275
+msgid "Change Name"
+msgstr ""
+
+#: ../IDEFrame.py:1977
+msgid "Change POU Type To"
+msgstr ""
+
+#: ../Beremiz_service.py:277
+msgid "Change Port Number"
+msgstr ""
+
+#: ../Beremiz_service.py:278
+msgid "Change working directory"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Character string"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "Choose a SVG file"
+msgstr ""
+
+#: ../ProjectController.py:561
+msgid "Choose a directory to save project"
+msgstr ""
+
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
+msgid "Choose a file"
+msgstr ""
+
+#: ../BeremizIDE.py:900
+msgid "Choose a project"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
+msgid "Choose a value for %s:"
+msgstr ""
+
+#: ../Beremiz_service.py:333
+msgid "Choose a working directory "
+msgstr ""
+
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr ""
+
+#: ../ProjectController.py:468
+msgid "Chosen folder doesn't contain a program. It's not a valid project!"
+msgstr ""
+
+#: ../ProjectController.py:435
+msgid "Chosen folder isn't empty. You can't use it for a new project!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:60
+msgid "Class"
+msgstr ""
+
+#: ../controls/VariablePanel.py:472
+msgid "Class Filter:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:74
+msgid "Class:"
+msgstr ""
+
+#: ../ProjectController.py:1821
+msgid "Clean"
+msgstr ""
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr ""
+
+#: ../ProjectController.py:1822
+msgid "Clean project build folder"
+msgstr ""
+
+#: ../ProjectController.py:1332
+msgid "Cleaning the build directory\n"
+msgstr ""
+
+#: ../IDEFrame.py:437
+msgid "Clear Errors"
+msgstr ""
+
+#: ../editors/Viewer.py:680
+msgid "Clear Execution Order"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr ""
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
+msgid "Close Application"
+msgstr ""
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
+msgid "Close Project"
+msgstr ""
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
+msgid "Close Tab"
+msgstr ""
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
+msgid "Coil"
+msgstr ""
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
+msgid "Comment"
+msgstr ""
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:106
+msgid "Company Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:107
+msgid "Company URL (optional):"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Comparison"
+msgstr ""
+
+#: ../ProjectController.py:756
+msgid "Compiling IEC Program into C code...\n"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:85
+msgid "Concatenation"
+msgstr ""
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr ""
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:43
+msgid "Configuration"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Configurations"
+msgstr ""
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr ""
+
+#: ../ProjectController.py:1842
+msgid "Connect"
+msgstr ""
+
+#: ../ProjectController.py:1843
+msgid "Connect to the target PLC"
+msgstr ""
+
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
+msgid "Connection"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:55
+msgid "Connection Properties"
+msgstr ""
+
+#: ../ProjectController.py:1691
+msgid "Connection canceled!\n"
+msgstr ""
+
+#: ../ProjectController.py:1714
+#, python-format
+msgid "Connection failed to %s!\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
+msgid "Connection to '%s' failed.\n"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
+msgid "Connector"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:68
+msgid "Connectors:"
+msgstr ""
+
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr ""
+
+#: ../controls/VariablePanel.py:75
+msgid "Constant"
+msgstr ""
+
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
+msgid "Contact"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:217
+msgid "Content Description (optional):"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
+msgid "Continuation"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:18
+msgid "Conversion from BCD"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:19
+msgid "Conversion to BCD"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:21
+msgid "Conversion to date"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:20
+msgid "Conversion to time-of-day"
+msgstr ""
+
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
+msgid "Copy"
+msgstr ""
+
+#: ../IDEFrame.py:1964
+msgid "Copy POU"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:68
+msgid "Copy file from left folder to right"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:67
+msgid "Copy file from right folder to left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:28
+msgid "Cosine"
+msgstr ""
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr ""
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../PLCControler.py:552
+msgid "Couldn't paste non-POU object."
+msgstr ""
+
+#: ../ProjectController.py:1636
+msgid "Couldn't start PLC !\n"
+msgstr ""
+
+#: ../ProjectController.py:1644
+msgid "Couldn't stop PLC !\n"
+msgstr ""
+
+#: ../svgui/svgui.py:57
+msgid "Create HMI"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:54
+msgid "Create a new POU"
+msgstr ""
+
+#: ../dialogs/PouActionDialog.py:45
+msgid "Create a new action"
+msgstr ""
+
+#: ../IDEFrame.py:166
+msgid "Create a new action block"
+msgstr ""
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
+msgid "Create a new block"
+msgstr ""
+
+#: ../IDEFrame.py:139
+msgid "Create a new branch"
+msgstr ""
+
+#: ../IDEFrame.py:133
+msgid "Create a new coil"
+msgstr ""
+
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
+msgid "Create a new comment"
+msgstr ""
+
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
+msgid "Create a new connection"
+msgstr ""
+
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
+msgid "Create a new contact"
+msgstr ""
+
+#: ../IDEFrame.py:169
+msgid "Create a new divergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:54
+msgid "Create a new divergence or convergence"
+msgstr ""
+
+#: ../IDEFrame.py:157
+msgid "Create a new initial step"
+msgstr ""
+
+#: ../IDEFrame.py:172
+msgid "Create a new jump"
+msgstr ""
+
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
+msgid "Create a new power rail"
+msgstr ""
+
+#: ../IDEFrame.py:130
+msgid "Create a new rung"
+msgstr ""
+
+#: ../IDEFrame.py:160
+msgid "Create a new step"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
+msgid "Create a new transition"
+msgstr ""
+
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
+msgid "Create a new variable"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr ""
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr ""
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
+msgid "Cut"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Cyclic"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:60
+msgid "DEPRECATED"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
+msgid "DS-301 Profile"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
+msgid "DS-302 Profile"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:39
+msgid "Data Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Data Types"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Data type conversion"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
+msgid "Date addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
+msgid "Date and time subtraction"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
+msgid "Date subtraction"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:46
+msgid "Days:"
+msgstr ""
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:144
+msgid "Debug instance"
+msgstr ""
+
+#: ../editors/Viewer.py:490
+#, python-format
+msgid "Debug: %s"
+msgstr ""
+
+#: ../ProjectController.py:1471
+#, python-format
+msgid "Debug: Unknown variable '%s'\n"
+msgstr ""
+
+#: ../ProjectController.py:1469
+#, python-format
+msgid "Debug: Unsupported type to debug '%s'\n"
+msgstr ""
+
+#: ../IDEFrame.py:660
+msgid "Debugger"
+msgstr ""
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr ""
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
+msgid "Delete"
+msgstr ""
+
+#: ../editors/Viewer.py:610
+msgid "Delete Divergence Branch"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:157
+msgid "Delete File"
+msgstr ""
+
+#: ../editors/Viewer.py:597
+msgid "Delete Wire Segment"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:44
+msgid "Delete item"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:88
+msgid "Deletion (within)"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:161
+msgid "Derivation Type:"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr ""
+
+#: ../controls/VariablePanel.py:463
+msgid "Description:"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
+msgid "Dimensions:"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:69
+msgid "Direction"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:102
+msgid "Direction:"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Directly"
+msgstr ""
+
+#: ../ProjectController.py:1855
+msgid "Disconnect"
+msgstr ""
+
+#: ../ProjectController.py:1856
+msgid "Disconnect from PLC"
+msgstr ""
+
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr ""
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
+msgid "Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:36
+msgid "Division"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:156
+#, python-format
+msgid "Do you really want to delete the file '%s'?"
+msgstr ""
+
+#: ../controls/VariablePanel.py:65
+msgid "Documentation"
+msgstr ""
+
+#: ../PLCOpenEditor.py:312
+msgid "Done"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Duration"
+msgstr ""
+
+#: ../canfestival/canfestival.py:174
+msgid "EDS files (*.eds)|*.eds|All files|*.*"
+msgstr ""
+
+#: ../editors/Viewer.py:668
+msgid "Edit Block"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:56
+msgid "Edit Contact Values"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:62
+msgid "Edit Duration"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:53
+msgid "Edit Step"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
+msgid "Edit a WxWidgets GUI with WXGlade"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:127
+msgid "Edit action block properties"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:47
+msgid "Edit array type properties"
+msgstr ""
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
+msgid "Edit comment"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:69
+msgid "Edit file"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:42
+msgid "Edit item"
+msgstr ""
+
+#: ../editors/Viewer.py:3059
+msgid "Edit jump target"
+msgstr ""
+
+#: ../ProjectController.py:1873
+msgid "Edit raw IEC code added to code generated by PLCGenerator"
+msgstr ""
+
+#: ../editors/SFCViewer.py:815
+msgid "Edit step name"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:53
+msgid "Edit transition"
+msgstr ""
+
+#: ../IDEFrame.py:632
+msgid "Editor ToolBar"
+msgstr ""
+
+#: ../ProjectController.py:1294
+msgid "Editor selection"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:360
+msgid "Elements :"
+msgstr ""
+
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr ""
+
+#: ../Beremiz_service.py:341
+msgid "Enter a name "
+msgstr ""
+
+#: ../Beremiz_service.py:326
+msgid "Enter a port number "
+msgstr ""
+
+#: ../Beremiz_service.py:317
+msgid "Enter the IP of the interface to bind"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Enumerated"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:77
+msgid "Equal to"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
+msgid "Error"
+msgstr ""
+
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+
+#: ../ProjectController.py:803
+#, python-format
+msgid "Error : IEC to C compiler returned %d\n"
+msgstr ""
+
+#: ../ProjectController.py:731
+#, python-format
+msgid ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+msgstr ""
+
+#: ../ConfigTreeNode.py:219
+#, python-format
+msgid "Error while saving \"%s\"\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:179
+msgid "Error: Export slave failed\n"
+msgstr ""
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:388
+msgid "Error: No Master generated\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:383
+msgid "Error: No PLC built\n"
+msgstr ""
+
+#: ../ProjectController.py:1708
+#, python-format
+msgid "Exception while connecting %s!\n"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:123
+msgid "Execution Control:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
+msgid "Execution Order:"
+msgstr ""
+
+#: ../features.py:36
+msgid "Experimental web based HMI"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:38
+msgid "Exponent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:26
+msgid "Exponentiation"
+msgstr ""
+
+#: ../canfestival/canfestival.py:186
+msgid "Export CanOpen slave to EDS file"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
+msgid "Export graph values to clipboard"
+msgstr ""
+
+#: ../canfestival/canfestival.py:185
+msgid "Export slave"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:94
+msgid "Expression:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "External"
+msgstr ""
+
+#: ../ProjectController.py:826
+msgid "Extracting Located Variables...\n"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "FBD"
+msgstr ""
+
+#: ../ProjectController.py:1773
+msgid "Failed : Must build before transfer.\n"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
+msgid "Falling Edge"
+msgstr ""
+
+#: ../ProjectController.py:1098
+msgid "Fatal : cannot get builder.\n"
+msgstr ""
+
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
+msgid "Field %s hasn't a valid value!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
+msgid "Fields %s haven't a valid value!"
+msgstr ""
+
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
+msgid "Find"
+msgstr ""
+
+#: ../IDEFrame.py:379
+msgid "Find Next"
+msgstr ""
+
+#: ../IDEFrame.py:381
+msgid "Find Previous"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:90
+msgid "Find position"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:58
+msgid "Find:"
+msgstr ""
+
+#: ../editors/Viewer.py:1633
+msgid "Force value"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:176
+msgid "Forcing Variable Value"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
+#, python-format
+msgid "Form isn't complete. %s must be filled!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
+msgid "Form isn't complete. Name must be filled!"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:235
+msgid "Form isn't complete. Valid block type must be selected!"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:75
+msgid "Forward"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
+msgid "Function"
+msgstr ""
+
+#: ../IDEFrame.py:354
+msgid "Function &Block"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
+msgid "Function Block"
+msgstr ""
+
+#: ../controls/VariablePanel.py:868
+msgid "Function Block Types"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Function Blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:290
+msgid "Function Blocks can't be used in Functions!"
+msgstr ""
+
+#: ../PLCControler.py:1907
+#, python-format
+msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Functions"
+msgstr ""
+
+#: ../PLCOpenEditor.py:88
+msgid "Generate Program"
+msgstr ""
+
+#: ../ProjectController.py:722
+msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Global"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
+msgid "Go to current value"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:189
+msgid "Graphics"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Greater than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:76
+msgid "Greater than or equal to"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:149
+msgid "Grid Resolution:"
+msgstr ""
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:135
+msgid "Height:"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:89
+msgid "Home Directory:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:165
+msgid "Horizontal:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:47
+msgid "Hours:"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "IL"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr ""
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
+msgid "IP is not valid!"
+msgstr ""
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
+msgid "Import SVG"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
+msgid "InOut"
+msgstr ""
+
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr ""
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:306
+#, python-format
+msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Indicator"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr ""
+
+#: ../editors/Viewer.py:650
+msgid "Initial Step"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
+msgid "Initial Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
+msgid "Initial Value:"
+msgstr ""
+
+#: ../svgui/svgui.py:56
+msgid "Inkscape"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
+msgid "Inline"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Input"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:99
+msgid "Inputs:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:87
+msgid "Insertion (into)"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1948
+#, python-format
+msgid "Instance with id %d doesn't exist!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:279
+msgid "Instances:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:88
+msgid "Interface"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Interrupt"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Interval"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+
+#: ../PLCControler.py:1895
+msgid "Invalid plcopen element(s)!!!"
+msgstr ""
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr ""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
+#, python-format
+msgid "Invalid value \"%s\" for debug variable"
+msgstr ""
+
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
+msgid "Invalid value \"%s\" for variable grid element"
+msgstr ""
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
+#, python-format
+msgid "Invalid value \"%s\" for viewer block"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:124
+msgid ""
+"Invalid value!\n"
+"You must fill a numeric value."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr ""
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
+msgid "Jump"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "LD"
+msgstr ""
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
+#, python-format
+msgid "Ladder element with id %d is on more than one rung."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
+msgid "Language"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:206
+msgid "Language (optional):"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
+msgid "Language:"
+msgstr ""
+
+#: ../ProjectController.py:1779
+msgid "Latest build already matches current target. Transfering anyway...\n"
+msgstr ""
+
+#: ../Beremiz_service.py:281
+msgid "Launch WX GUI inspector"
+msgstr ""
+
+#: ../Beremiz_service.py:280
+msgid "Launch a live Python shell"
+msgstr ""
+
+#: ../editors/Viewer.py:580
+msgid "Left"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:64
+msgid "Left PowerRail"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Length of string"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:78
+msgid "Less than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:79
+msgid "Less than or equal to"
+msgstr ""
+
+#: ../IDEFrame.py:652
+msgid "Library"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:73
+msgid "Limitation"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:209
+msgid "Linking :\n"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
+msgid "Local"
+msgstr ""
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr ""
+
+#: ../ProjectController.py:1685
+msgid "Local service discovery failed!\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:62
+msgid "Location"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:79
+msgid "Locations available:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:25
+msgid "Logarithm to base 10"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:102
+#, python-format
+msgid "MDNS resolution failure for '%s'\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
+msgid "Map Variable"
+msgstr ""
+
+#: ../features.py:31
+msgid "Map located variables over CANopen"
+msgstr ""
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:113
+msgid "Master"
+msgstr ""
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr ""
+
+#: ../plcopen/iec_std.csv:71
+msgid "Maximum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:246
+msgid "Maximum:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Memory"
+msgstr ""
+
+#: ../IDEFrame.py:617
+msgid "Menu ToolBar"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:51
+msgid "Microseconds:"
+msgstr ""
+
+#: ../editors/Viewer.py:585
+msgid "Middle"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:50
+msgid "Milliseconds:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:72
+msgid "Minimum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:233
+msgid "Minimum:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:48
+msgid "Minutes:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:231
+msgid "Miscellaneous"
+msgstr ""
+
+#: ../features.py:32
+msgid "Modbus support"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:65
+msgid "Modifier:"
+msgstr ""
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:146
+msgid "Move action down"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:145
+msgid "Move action up"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:46
+msgid "Move down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:367
+msgid "Move element down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:366
+msgid "Move element up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:254
+msgid "Move task up"
+msgstr ""
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
+msgid "Move the view"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:45
+msgid "Move up"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
+msgid "Move variable down"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
+msgid "Move variable up"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:74
+msgid "Multiplexer (select 1 of N)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:34
+msgid "Multiplication"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:87
+msgid "My Computer:"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
+#: ../controls/VariablePanel.py:59
+msgid "Name"
+msgstr ""
+
+#: ../Beremiz_service.py:342
+msgid "Name must not be null!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
+msgid "Name:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:24
+msgid "Natural logarithm"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
+msgid "Negated"
+msgstr ""
+
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr ""
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
+msgid "New"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:43
+msgid "New item"
+msgstr ""
+
+#: ../editors/Viewer.py:553
+msgid "No Modifier"
+msgstr ""
+
+#: ../ProjectController.py:1808
+msgid "No PLC to transfer (did build succeed ?)\n"
+msgstr ""
+
+#: ../PLCGenerator.py:1678
+#, python-format
+msgid "No body defined in \"%s\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCOpenEditor.py:331
+msgid ""
+"No documentation available.\n"
+"Coming soon."
+msgstr ""
+
+#: ../PLCGenerator.py:841
+#, python-format
+msgid "No informations found for \"%s\" block"
+msgstr ""
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:175
+msgid "No search results available."
+msgstr ""
+
+#: ../svgui/svgui.py:142
+#, python-format
+msgid "No such SVG file: %s\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr ""
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+msgid "No valid value selected!"
+msgstr ""
+
+#: ../PLCGenerator.py:1676
+#, python-format
+msgid "No variable defined in \"%s\" POU"
+msgstr ""
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr ""
+
+#: ../controls/VariablePanel.py:79
+msgid "Non-Retain"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78
+msgid "Normal"
+msgstr ""
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:80
+msgid "Not equal to"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:91
+msgid "Number of sequences:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:22
+msgid "Numerical"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:88
+msgid "Only Elements"
+msgstr ""
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
+msgid "Open"
+msgstr ""
+
+#: ../svgui/svgui.py:151
+msgid "Open Inkscape"
+msgstr ""
+
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+
+#: ../ProjectController.py:1879
+msgid "Open a file explorer to manage project files"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
+msgid "Open wxGlade"
+msgstr ""
+
+#: ../controls/VariablePanel.py:64
+msgid "Option"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
+msgid "Options"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:109
+msgid "Organization (optional):"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
+msgid "Other Profile"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Output"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
+msgid "PDO Receive"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
+msgid "PDO Transmit"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:174
+msgid "PLC :\n"
+msgstr ""
+
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr ""
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr ""
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr ""
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr ""
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
+msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
+msgstr ""
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
+msgid "PLCOpenEditor"
+msgstr ""
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:109
+msgid "POU Name"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:66
+msgid "POU Name:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:111
+msgid "POU Type"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:73
+msgid "POU Type:"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr ""
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
+msgid "Page Setup"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:124
+msgid "Page Size (optional):"
+msgstr ""
+
+#: ../IDEFrame.py:2640
+#, python-format
+msgid "Page: %d"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:134
+msgid "Parent instance"
+msgstr ""
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
+msgid "Paste"
+msgstr ""
+
+#: ../IDEFrame.py:1899
+msgid "Paste POU"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:60
+msgid "Pattern to search:"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:75
+msgid "Pin number:"
+msgstr ""
+
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
+msgid "Please choose a target"
+msgstr ""
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr ""
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
+msgid "Please enter comment text"
+msgstr ""
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
+msgid "Please enter step name"
+msgstr ""
+
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
+msgid "Please enter value for a \"%s\" variable:"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be 0 <= port <= 65535!"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be an integer!"
+msgstr ""
+
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
+msgid "Power Rail"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:52
+msgid "Power Rail Properties"
+msgstr ""
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
+msgid "Preview"
+msgstr ""
+
+#: ../dialogs/BlockPreviewDialog.py:59
+msgid "Preview:"
+msgstr ""
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
+msgid "Print"
+msgstr ""
+
+#: ../IDEFrame.py:1110
+msgid "Print preview"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Priority"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:91
+msgid "Priority:"
+msgstr ""
+
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:90
+msgid "Product Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:92
+msgid "Product Release (optional):"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:91
+msgid "Product Version (required):"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
+msgid "Program"
+msgstr ""
+
+#: ../PLCOpenEditor.py:321
+msgid "Program was successfully generated!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Programs"
+msgstr ""
+
+#: ../editors/Viewer.py:285
+msgid "Programs can't be used by other POUs!"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
+msgid "Project"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:180
+#, python-format
+msgid "Project '%s':"
+msgstr ""
+
+#: ../ProjectController.py:1878
+msgid "Project Files"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:88
+msgid "Project Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:89
+msgid "Project Version (optional):"
+msgstr ""
+
+#: ../PLCControler.py:2717
+msgid ""
+"Project file syntax error:\n"
+"\n"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
+msgid "Project properties"
+msgstr ""
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Properties"
+msgstr ""
+
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr ""
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr ""
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr ""
+
+#: ../features.py:34
+msgid "Python file"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Qualifier"
+msgstr ""
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
+msgid "Quit"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
+msgid "Range:"
+msgstr ""
+
+#: ../ProjectController.py:1872
+msgid "Raw IEC code"
+msgstr ""
+
+#: ../BeremizIDE.py:1083
+#, python-format
+msgid "Really delete node '%s'?"
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
+msgid "Redo"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:76
+msgid "Reference"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
+msgid "Refresh"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:70
+msgid "Regular expression"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:99
+msgid "Regular expressions"
+msgstr ""
+
+#: ../editors/Viewer.py:1636
+msgid "Release value"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:37
+msgid "Remainder (modulo)"
+msgstr ""
+
+#: ../BeremizIDE.py:1084
+#, python-format
+msgid "Remove %s node"
+msgstr ""
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr ""
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:144
+msgid "Remove action"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:365
+msgid "Remove element"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:66
+msgid "Remove file from left folder"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:284
+msgid "Remove instance"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:111
+msgid "Remove slave"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:253
+msgid "Remove task"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
+msgid "Remove variable"
+msgstr ""
+
+#: ../IDEFrame.py:1979
+msgid "Rename"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:187
+msgid "Replace File"
+msgstr ""
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:89
+msgid "Replacement (within)"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Reset"
+msgstr ""
+
+#: ../editors/Viewer.py:681
+msgid "Reset Execution Order"
+msgstr ""
+
+#: ../IDEFrame.py:453
+msgid "Reset Perspective"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:103
+msgid "Reset search result"
+msgstr ""
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
+msgid "Resources"
+msgstr ""
+
+#: ../controls/VariablePanel.py:77
+msgid "Retain"
+msgstr ""
+
+#: ../controls/VariablePanel.py:455
+msgid "Return Type:"
+msgstr ""
+
+#: ../editors/Viewer.py:582
+msgid "Right"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:65
+msgid "Right PowerRail"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
+msgid "Rising Edge"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:65
+msgid "Rotate left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:64
+msgid "Rotate right"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:17
+msgid "Rounding up/down"
+msgstr ""
+
+#: ../ProjectController.py:1828
+msgid "Run"
+msgstr ""
+
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
+msgid "SDO Client"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
+msgid "SDO Server"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "SFC"
+msgstr ""
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr ""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "ST"
+msgstr ""
+
+#: ../PLCOpenEditor.py:308
+msgid "ST files (*.st)|*.st|All files|*.*"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "SVG files (*.svg)|*.svg|All files|*.*"
+msgstr ""
+
+#: ../features.py:36
+msgid "SVGUI"
+msgstr ""
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
+msgid "Save"
+msgstr ""
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
+msgid "Save As..."
+msgstr ""
+
+#: ../BeremizIDE.py:249
+msgid "Save as"
+msgstr ""
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:73
+msgid "Scope"
+msgstr ""
+
+#: ../IDEFrame.py:644
+msgid "Search"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
+msgid "Search in Project"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:49
+msgid "Seconds:"
+msgstr ""
+
+#: ../IDEFrame.py:390
+msgid "Select All"
+msgstr ""
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
+msgid "Select a variable class:"
+msgstr ""
+
+#: ../ProjectController.py:1293
+msgid "Select an editor:"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:292
+msgid "Select an instance"
+msgstr ""
+
+#: ../IDEFrame.py:628
+msgid "Select an object"
+msgstr ""
+
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:70
+msgid "Selection"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:65
+msgid "Selection Divergence"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:104
+msgid "Services available:"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Set"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Shift left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:63
+msgid "Shift right"
+msgstr ""
+
+#: ../ProjectController.py:1863
+msgid "Show IEC code generated by PLCGenerator"
+msgstr ""
+
+#: ../canfestival/canfestival.py:407
+msgid "Show Master"
+msgstr ""
+
+#: ../canfestival/canfestival.py:408
+msgid "Show Master generated by config_utils"
+msgstr ""
+
+#: ../ProjectController.py:1862
+msgid "Show code"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:67
+msgid "Simultaneous Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:27
+msgid "Sine"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Single"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr ""
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+
+#: ../plcopen/iec_std.csv:23
+msgid "Square root (base 2)"
+msgstr ""
+
+#: ../plcopen/definitions.py:50
+msgid "Standard function blocks"
+msgstr ""
+
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
+msgid "Start PLC"
+msgstr ""
+
+#: ../ProjectController.py:1074
+#, python-format
+msgid "Start build in %s\n"
+msgstr ""
+
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr ""
+
+#: ../ProjectController.py:1633
+msgid "Starting PLC\n"
+msgstr ""
+
+#: ../BeremizIDE.py:393
+msgid "Status ToolBar"
+msgstr ""
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
+msgid "Step"
+msgstr ""
+
+#: ../ProjectController.py:1835
+msgid "Stop"
+msgstr ""
+
+#: ../Beremiz_service.py:272
+msgid "Stop PLC"
+msgstr ""
+
+#: ../ProjectController.py:1836
+msgid "Stop Running PLC"
+msgstr ""
+
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Structure"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Subrange"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:35
+msgid "Subtraction"
+msgstr ""
+
+#: ../ProjectController.py:1113
+msgid "Successfully built.\n"
+msgstr ""
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
+msgid "Syntax error in regular expression of pattern to search!"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:29
+msgid "Tangent"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:97
+msgid "Task"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:248
+msgid "Tasks:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Temp"
+msgstr ""
+
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:186
+#, python-format
+msgid ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+msgstr ""
+
+#: ../editors/LDViewer.py:893
+msgid "The group of block must be coherent!"
+msgstr ""
+
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
+msgid "There are changes, do you want to save?"
+msgstr ""
+
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+
+#: ../IDEFrame.py:1133
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+
+#: ../editors/LDViewer.py:902
+msgid "This option isn't available yet!"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40
+msgid "Time"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
+msgid "Time addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:86
+msgid "Time concatenation"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
+msgid "Time division"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
+msgid "Time multiplication"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
+msgid "Time subtraction"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
+msgid "Time-of-day addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
+msgid "Time-of-day subtraction"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr ""
+
+#: ../editors/Viewer.py:584
+msgid "Top"
+msgstr ""
+
+#: ../ProjectController.py:1848
+msgid "Transfer"
+msgstr ""
+
+#: ../ProjectController.py:1849
+msgid "Transfer PLC"
+msgstr ""
+
+#: ../ProjectController.py:1802
+msgid "Transfer completed successfully.\n"
+msgstr ""
+
+#: ../ProjectController.py:1805
+msgid "Transfer failed\n"
+msgstr ""
+
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
+msgid "Transition"
+msgstr ""
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:91
+msgid "Transition Name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:60
+msgid "Transition Name:"
+msgstr ""
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1526
+#, python-format
+msgid "Transition with name %s doesn't exist!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Transitions"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Triggering"
+msgstr ""
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
+msgid "Type"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr ""
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
+#, python-format
+msgid "Type conflict for location \"%s\""
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Type conversion"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:170
+msgid "Type infos:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
+msgid "Type:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
+#, python-format
+msgid "Unable to define PDO mapping for node %02x"
+msgstr ""
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
+msgid "Unable to get Xenomai's %s \n"
+msgstr ""
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:261
+#, python-format
+msgid "Undefined pou type \"%s\""
+msgstr ""
+
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
+msgid "Undo"
+msgstr ""
+
+#: ../ProjectController.py:442
+msgid "Unknown"
+msgstr ""
+
+#: ../editors/Viewer.py:437
+#, python-format
+msgid "Unknown variable \"%s\" for this POU!"
+msgstr ""
+
+#: ../ProjectController.py:439 ../ProjectController.py:440
+msgid "Unnamed"
+msgstr ""
+
+#: ../PLCControler.py:263
+#, python-format
+msgid "Unnamed%d"
+msgstr ""
+
+#: ../controls/VariablePanel.py:308
+#, python-format
+msgid "Unrecognized data size \"%s\""
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
+msgid "User Data Types"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
+msgid "User Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "User-defined POUs"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:267
+msgid "Values:"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
+msgid "Variable"
+msgstr ""
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:68
+msgid "Variable Properties"
+msgstr ""
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
+msgid "Variable class"
+msgstr ""
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
+msgid "Variable don't belong to this POU!"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "Variables"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:166
+msgid "Vertical:"
+msgstr ""
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr ""
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr ""
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr ""
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr ""
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr ""
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr ""
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr ""
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr ""
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
+msgid "WXGLADE GUI"
+msgstr ""
+
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
+msgid "Warning"
+msgstr ""
+
+#: ../ProjectController.py:726
+msgid "Warnings in ST/IL/SFC code generator :\n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:82
+msgid "Whole Project"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:134
+msgid "Width:"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:94
+msgid "Wrap search"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr ""
+
+#: ../features.py:35
+msgid "WxGlade GUI"
+msgstr ""
+
+#: ../svgui/svgui.py:150
+msgid ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:160
+msgid ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+msgstr ""
+
+#: ../ProjectController.py:390
+msgid ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+msgstr ""
+
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+
+#: ../editors/LDViewer.py:677
+msgid "You must select the wire where a contact should be added!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
+msgid "You must type a name!"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:209
+msgid "You must type a value!"
+msgstr ""
+
+#: ../IDEFrame.py:440
+msgid "Zoom"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr ""
+
+#: ../PLCOpenEditor.py:317
+#, python-format
+msgid "error: %s\n"
+msgstr ""
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "function"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "functionBlock"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr ""
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "program"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:84
+msgid "string from the middle"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:82
+msgid "string left of"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:83
+msgid "string right of"
+msgstr ""
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr ""
+
+#: ../PLCOpenEditor.py:315
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr ""
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr ""
+
+msgid "CAN_Device"
+msgstr ""
+
+msgid "CAN_Baudrate"
+msgstr ""
+
+msgid "NodeId"
+msgstr ""
+
+msgid "Sync_Align"
+msgstr ""
+
+msgid "Sync_Align_Ratio"
+msgstr ""
+
+msgid "CanFestivalNode"
+msgstr ""
+
+msgid "Sync_TPDOs"
+msgstr ""
+
+msgid "CanFestivalInstance"
+msgstr ""
+
+msgid "CAN_Driver"
+msgstr ""
+
+msgid "Generic"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Xenomai"
+msgstr ""
+
+msgid "XenoConfig"
+msgstr ""
+
+msgid "Compiler"
+msgstr ""
+
+msgid "CFLAGS"
+msgstr ""
+
+msgid "Linker"
+msgstr ""
+
+msgid "LDFLAGS"
+msgstr ""
+
+msgid "Linux"
+msgstr ""
+
+msgid "Win32"
+msgstr ""
+
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr ""
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
+msgid "BaseParams"
+msgstr ""
+
+msgid "IEC_Channel"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "BeremizRoot"
+msgstr ""
+
+msgid "TargetType"
+msgstr ""
+
+msgid "Libraries"
+msgstr ""
+
+msgid "URI_location"
+msgstr ""
+
+msgid "Disable_Extensions"
+msgstr ""
+
+msgid "%(codefile_name)s"
+msgstr ""
+
+msgid "variables"
+msgstr ""
+
+msgid "variable"
+msgstr ""
+
+msgid "name"
+msgstr ""
+
+msgid "type"
+msgstr ""
+
+msgid "class"
+msgstr ""
+
+msgid "initial"
+msgstr ""
+
+msgid "desc"
+msgstr ""
+
+msgid "onchange"
+msgstr ""
+
+msgid "opts"
+msgstr ""
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr ""
+
+msgid "Preset datetime"
+msgstr ""
+
+msgid "Copy of IN"
+msgstr ""
+
+msgid "Datetime, current or relative to PDT"
+msgstr ""
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+
+msgid "1 = integrate, 0 = hold"
+msgstr ""
+
+msgid "Overriding reset"
+msgstr ""
+
+msgid "Input variable"
+msgstr ""
+
+msgid "Initial value"
+msgstr ""
+
+msgid "Sampling period"
+msgstr ""
+
+msgid "NOT R1"
+msgstr ""
+
+msgid "Integrated output"
+msgstr ""
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr ""
+
+msgid "0 = reset"
+msgstr ""
+
+msgid "Input to be differentiated"
+msgstr ""
+
+msgid "Differentiated output"
+msgstr ""
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+
+msgid "0 - manual , 1 - automatic"
+msgstr ""
+
+msgid "Process variable"
+msgstr ""
+
+msgid "Set point"
+msgstr ""
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr ""
+
+msgid "Proportionality constant"
+msgstr ""
+
+msgid "Reset time"
+msgstr ""
+
+msgid "Derivative time constant"
+msgstr ""
+
+msgid "PV - SP"
+msgstr ""
+
+msgid "FB for integral term"
+msgstr ""
+
+msgid "FB for derivative term"
+msgstr ""
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr ""
+
+msgid "Ramp duration"
+msgstr ""
+
+msgid "BUSY = 1 during ramping period"
+msgstr ""
+
+msgid "Elapsed time of ramp"
+msgstr ""
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr ""
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr ""
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr ""
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+
+msgid "first input parameter"
+msgstr ""
+
+msgid "second input parameter"
+msgstr ""
+
+msgid "first output parameter"
+msgstr ""
+
+msgid "second output parameter"
+msgstr ""
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr ""
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/Beremiz_hu_HU.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4067 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Krisztián Veress <krive001@gmail.com>, 2018\n"
+"Language-Team: Hungarian (Hungary) (https://www.transifex.com/beremiz/teams/75746/hu_HU/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: hu_HU\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
+msgid ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+msgstr ""
+"\n"
+"Egy kezeletlen kivétel (bug) történt. Hibajelentés elmentve ide:\n"
+"(%s)\n"
+"\n"
+"Kérem legyen szíves ezt a fájlt elküldeni erre a címre:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"A programot újra kell indítania.\n"
+"\n"
+"Nyomonkövetés:\n"
+
+#: ../controls/VariablePanel.py:90
+msgid "   External"
+msgstr "Külső"
+
+#: ../controls/VariablePanel.py:89
+msgid "   InOut"
+msgstr "Be/Ki"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Input"
+msgstr "Bemenet"
+
+#: ../controls/VariablePanel.py:90
+msgid "   Local"
+msgstr "Helyi"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Output"
+msgstr "Kimenet"
+
+#: ../controls/VariablePanel.py:91
+msgid "   Temp"
+msgstr "Ideiglenes"
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
+#, python-format
+msgid " and %s"
+msgstr " és %s"
+
+#: ../ProjectController.py:1182
+msgid " generation failed !\n"
+msgstr "létrehozás hibás !\n"
+
+#: ../plcopen/plcopen.py:1029
+#, python-format
+msgid "\"%s\" Data Type doesn't exist !!!"
+msgstr "\"%s\" Adat típus nem létezik !!!"
+
+#: ../plcopen/plcopen.py:1047
+#, python-format
+msgid "\"%s\" POU already exists !!!"
+msgstr "\"%s\" POU már létezik !!!"
+
+#: ../plcopen/plcopen.py:1068
+#, python-format
+msgid "\"%s\" POU doesn't exist !!!"
+msgstr "\"%s\" POU nem létezik !!!"
+
+#: ../editors/Viewer.py:288
+#, python-format
+msgid "\"%s\" can't use itself!"
+msgstr "\"%s\" sajátmaga nem használható!"
+
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
+#, python-format
+msgid "\"%s\" config already exists!"
+msgstr "\"%s\" konfiguráció már létezik!"
+
+#: ../plcopen/plcopen.py:531
+#, python-format
+msgid "\"%s\" configuration already exists !!!"
+msgstr "\"%s\" konfiguráció már létezik !!!"
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr ""
+
+#: ../IDEFrame.py:1638
+#, python-format
+msgid "\"%s\" data type already exists!"
+msgstr "\"%s\" adat típus már létezik!"
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
+#, python-format
+msgid "\"%s\" element for this pou already exists!"
+msgstr "A(z) \"%s\" elem ehhez a POU-hoz már létezik!"
+
+#: ../BeremizIDE.py:928
+#, python-format
+msgid "\"%s\" folder is not a valid Beremiz project\n"
+msgstr "A(z) \"%s\" könyvtár egy nem érvényes Beremiz projekt\n"
+
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
+#, python-format
+msgid "\"%s\" is a keyword. It can't be used!"
+msgstr "A(z) \"%s\" egy kulcsszó. Nem használható!"
+
+#: ../plcopen/plcopen.py:2836
+#, python-format
+msgid "\"%s\" is an invalid value!"
+msgstr "A(z) \"%s\" egy nem érvényes érték!"
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
+msgid "\"%s\" is not a valid folder!"
+msgstr "A(z) \"%s\" egy nem érvényes könyvtár!"
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
+#, python-format
+msgid "\"%s\" is not a valid identifier!"
+msgstr "A(z) \"%s\" egy nem érvényes azonosító!"
+
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr ""
+"A(z) \"%s\" már használatban van egy vagy több POU-ban. Biztos folytatni "
+"akarja?"
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
+#, python-format
+msgid "\"%s\" pou already exists!"
+msgstr "\"%s\" POU már létezik!"
+
+#: ../dialogs/SFCStepNameDialog.py:62
+#, python-format
+msgid "\"%s\" step already exists!"
+msgstr "\"%s\" lépés már létezik!"
+
+#: ../editors/DataTypeEditor.py:566
+#, python-format
+msgid "\"%s\" value already defined!"
+msgstr "\"%s\" érték már definiálva van!"
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
+#, python-format
+msgid "\"%s\" value isn't a valid array dimension!"
+msgstr "\"%s\" érték nem valós tömb dimenzió!"
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
+#, python-format
+msgid ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+msgstr ""
+"\"%s\" érték nem valós tömb dimenzió!\n"
+"A jobb oldali érték nagyobb kell legyen mint a bal oldali."
+
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr ""
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr "%03gms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr "%dd"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr "%dh"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr "%dm"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr "%dms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr "%ds"
+
+#: ../PLCControler.py:1114
+#, python-format
+msgid "%s Data Types"
+msgstr "%s Adat Típusok"
+
+#: ../PLCControler.py:1097
+#, python-format
+msgid "%s POUs"
+msgstr "%s POU-k"
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
+#, python-format
+msgid "%s Profile"
+msgstr "%s Profil"
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
+#, python-format
+msgid "%s body don't have instances!"
+msgstr "%s testnek nincsenek példányai!"
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
+#, python-format
+msgid "%s body don't have text!"
+msgstr "%s testben nincs szöveg!"
+
+#: ../IDEFrame.py:388
+msgid "&Add Element"
+msgstr "&Elem Hozzáadása"
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr "&Bezárás"
+
+#: ../IDEFrame.py:361
+msgid "&Configuration"
+msgstr "&Konfiguráció"
+
+#: ../IDEFrame.py:350
+msgid "&Data Type"
+msgstr "&Adat Típus"
+
+#: ../IDEFrame.py:392
+msgid "&Delete"
+msgstr "&Törlés"
+
+#: ../IDEFrame.py:342
+msgid "&Display"
+msgstr "&Nézet"
+
+#: ../IDEFrame.py:341
+msgid "&Edit"
+msgstr "&Szerkesztés"
+
+#: ../IDEFrame.py:340
+msgid "&File"
+msgstr "&Fájl"
+
+#: ../IDEFrame.py:352
+msgid "&Function"
+msgstr "&Funkció"
+
+#: ../IDEFrame.py:343
+msgid "&Help"
+msgstr "&Segítség"
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr "&Licensz"
+
+#: ../IDEFrame.py:356
+msgid "&Program"
+msgstr "&Program"
+
+#: ../PLCOpenEditor.py:98
+msgid "&Properties"
+msgstr "&Tulajdonságok"
+
+#: ../BeremizIDE.py:244
+msgid "&Recent Projects"
+msgstr "&Legutóbbi Projektek"
+
+#: ../IDEFrame.py:358
+msgid "&Resource"
+msgstr "&Erőforrás"
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr "'{a1}' - {a2} egyezés a projektben"
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr "'{a1}' - {a2} egyezések a projektben"
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:298
+#, python-format
+msgid "(%d matches)"
+msgstr "(%d találat)"
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
+#, python-format
+msgid ", %s"
+msgstr ", %s"
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr ""
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr "1n"
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr "1ó"
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr "1p"
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr "1mp"
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
+#, python-format
+msgid "A POU named \"%s\" already exists!"
+msgstr "A \"%s\" nevű POU már létezik!"
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:229
+msgid "A location must be selected!"
+msgstr "Egy helyet ki kell választani!"
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr "Egy feladat ezzel a névvel már létezik!"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
+#, python-format
+msgid "A variable with \"%s\" as name already exists in this pou!"
+msgstr "Egy változó a \"%s\" névvel már létezik ebben a POU-ban!"
+
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr "Egy változó a \"%s\" névvel már létezik!"
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
+msgid "About"
+msgstr "Névjegy"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Absolute number"
+msgstr "Abszolut érték"
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
+msgid "Action"
+msgstr "Művelet"
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
+msgid "Action Block"
+msgstr "Művelet Blokk"
+
+#: ../dialogs/PouActionDialog.py:89
+msgid "Action Name"
+msgstr "Művelet Név"
+
+#: ../dialogs/PouActionDialog.py:56
+msgid "Action Name:"
+msgstr "Művelet Név:"
+
+#: ../plcopen/plcopen.py:1567
+#, python-format
+msgid "Action with name %s doesn't exist!"
+msgstr "Művelet név %s nem létezik!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Actions"
+msgstr "Műveletek"
+
+#: ../dialogs/ActionBlockDialog.py:139
+msgid "Actions:"
+msgstr "Műveletek:"
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr "Aktív"
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
+msgid "Add"
+msgstr "Hozzáadás"
+
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
+msgid "Add Action"
+msgstr "Művelet hozzáadás"
+
+#: ../features.py:33
+msgid "Add C code accessing located variables synchronously"
+msgstr ""
+"A beazonosított változók szinkronizált eléréséhez tartózó C forráskód "
+"hozzáadása"
+
+#: ../IDEFrame.py:1907
+msgid "Add Configuration"
+msgstr "Konfiguráció Hozzáadás"
+
+#: ../IDEFrame.py:1887
+msgid "Add DataType"
+msgstr "Adattípus Hozzáadás"
+
+#: ../editors/Viewer.py:609
+msgid "Add Divergence Branch"
+msgstr "Elágazás Hozzáadás"
+
+#: ../dialogs/DiscoveryDialog.py:121
+msgid "Add IP"
+msgstr "IP Hozzáadás"
+
+#: ../IDEFrame.py:1895
+msgid "Add POU"
+msgstr "POU Hozzáadás"
+
+#: ../features.py:34
+msgid "Add Python code executed asynchronously"
+msgstr "Aszinkron futású Python kód Hozzáadás"
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
+msgid "Add Resource"
+msgstr "Erőforrás hozzáadás"
+
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
+msgid "Add Transition"
+msgstr "Átváltás Hozzáadás"
+
+#: ../editors/Viewer.py:596
+msgid "Add Wire Segment"
+msgstr "Vezeték Szakasz Hozzáadás"
+
+#: ../editors/SFCViewer.py:447
+msgid "Add a new initial step"
+msgstr "Új Kezdeti Lépés Hozzáadás"
+
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
+msgid "Add a new jump"
+msgstr "Új elugrás hozzáadás"
+
+#: ../editors/SFCViewer.py:469
+msgid "Add a new step"
+msgstr "Új lépés hozzáadás"
+
+#: ../features.py:35
+msgid "Add a simple WxGlade based GUI."
+msgstr "Egyszerű WxGlade alapú GUI hozzáadás"
+
+#: ../dialogs/ActionBlockDialog.py:143
+msgid "Add action"
+msgstr "Művelet hozzáadás"
+
+#: ../editors/DataTypeEditor.py:364
+msgid "Add element"
+msgstr "Elem hozzáadás"
+
+#: ../editors/ResourceEditor.py:283
+msgid "Add instance"
+msgstr "Új példány hozzáadás"
+
+#: ../canfestival/NetworkEditor.py:110
+msgid "Add slave"
+msgstr "Szolga hozzáadás"
+
+#: ../editors/ResourceEditor.py:252
+msgid "Add task"
+msgstr "Feladat hozzáadás"
+
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
+msgid "Add variable"
+msgstr "Változó hozzáadás"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Addition"
+msgstr "Összeadás"
+
+#: ../plcopen/definitions.py:51
+msgid "Additional function blocks"
+msgstr "További funkció blokkok"
+
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr "Blokk méret beállítás"
+
+#: ../editors/Viewer.py:1720
+msgid "Alignment"
+msgstr "Elrendezés"
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
+msgid "All"
+msgstr "Minden"
+
+#: ../editors/FileManagementPanel.py:37
+msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+msgstr "Minden fájl (*.*)|*.*|CSV files (*.csv)|*.csv"
+
+#: ../ProjectController.py:1670
+msgid "Already connected. Please disconnect\n"
+msgstr "Már csatalakoztatva van. Kérem szétcsatlakoztatni.\n"
+
+#: ../editors/DataTypeEditor.py:607
+#, python-format
+msgid "An element named \"%s\" already exists in this structure!"
+msgstr "Ez az elem név már létezik ebben a struktúrában: \"%s\""
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr "Ilyen nevű példány már létezik!"
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr "A névváltoztatás elfogadása az összes ilyen névre."
+
+#: ../plcopen/iec_std.csv:31
+msgid "Arc cosine"
+msgstr "Arc cosine"
+
+#: ../plcopen/iec_std.csv:30
+msgid "Arc sine"
+msgstr "Arc sine"
+
+#: ../plcopen/iec_std.csv:32
+msgid "Arc tangent"
+msgstr "Arc tangent"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Arithmetic"
+msgstr "Aritmetika"
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
+msgid "Array"
+msgstr "Tömb"
+
+#: ../plcopen/iec_std.csv:39
+msgid "Assignment"
+msgstr "Hozzárendelés"
+
+#: ../dialogs/FBDVariableDialog.py:226
+msgid "At least a variable or an expression must be selected!"
+msgstr "Legalább egy változót vagy kifejezést ki kell választani!"
+
+#: ../controls/ProjectPropertiesPanel.py:111
+msgid "Author"
+msgstr "Szerző"
+
+#: ../controls/ProjectPropertiesPanel.py:108
+msgid "Author Name (optional):"
+msgstr "Szerző Neve (opcionális):"
+
+#: ../dialogs/FindInPouDialog.py:80
+msgid "Backward"
+msgstr "Viszafele"
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
+#, python-format
+msgid "Bad location size : %s"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
+msgid "Base Type:"
+msgstr "Alaptípus:"
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
+msgid "Base Types"
+msgstr "Alaptípusok"
+
+#: ../BeremizIDE.py:483
+msgid "Beremiz"
+msgstr "Beremiz"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Binary selection (1 of 2)"
+msgstr "Bináris kiválasztás (1 / 2)"
+
+#: ../plcopen/iec_std.csv:62
+msgid "Bit-shift"
+msgstr "Bit eltolás"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise"
+msgstr "Bitenként"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise AND"
+msgstr "Bitenkénti ÉS"
+
+#: ../plcopen/iec_std.csv:67
+msgid "Bitwise OR"
+msgstr "Bitenkénti VAGY"
+
+#: ../plcopen/iec_std.csv:68
+msgid "Bitwise XOR"
+msgstr "Bitenkénti XOR"
+
+#: ../plcopen/iec_std.csv:69
+msgid "Bitwise inverting"
+msgstr "Bitenkénti invertálás"
+
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
+msgid "Block"
+msgstr "Blokk"
+
+#: ../dialogs/FBDBlockDialog.py:63
+msgid "Block Properties"
+msgstr "Blokk Tulajdonságok"
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr "Blokk neve"
+
+#: ../editors/Viewer.py:586
+msgid "Bottom"
+msgstr "Alja"
+
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
+msgid "Browse %s values library"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:72
+msgid "Browse Locations"
+msgstr ""
+
+#: ../ProjectController.py:1815
+msgid "Build"
+msgstr ""
+
+#: ../ProjectController.py:1335
+msgid "Build directory already clean\n"
+msgstr ""
+
+#: ../ProjectController.py:1816
+msgid "Build project into build folder"
+msgstr ""
+
+#: ../ProjectController.py:1108
+msgid "C Build crashed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1105
+msgid "C Build failed.\n"
+msgstr ""
+
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr "C kód"
+
+#: ../ProjectController.py:1186
+msgid "C code generated successfully.\n"
+msgstr "C kód sikeresen elkészűlt. \n"
+
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr "C kód készítése sikertelen.\n"
+
+#: ../targets/toolchain_gcc.py:199
+#, python-format
+msgid "C compilation of %s failed.\n"
+msgstr "C fordítás a %s aikertelen.\n"
+
+#: ../features.py:33
+msgid "C extension"
+msgstr "C kiterjesztés"
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr "K$reditek"
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr "CANOpen hálózat"
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr "CANOpen szolga"
+
+#: ../features.py:31
+msgid "CANopen support"
+msgstr "CANOpen támogatás"
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
+msgid "Can only generate execution order on FBD networks!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:291
+msgid "Can only give a location to local or global variables"
+msgstr ""
+
+#: ../PLCOpenEditor.py:318
+#, python-format
+msgid "Can't generate program to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:289
+msgid "Can't give a location to a function block instance"
+msgstr ""
+
+#: ../PLCOpenEditor.py:363
+#, python-format
+msgid "Can't save project to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:339
+msgid "Can't set an initial value to a function block instance"
+msgstr ""
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr ""
+
+#: ../ConfigTreeNode.py:454
+#, python-format
+msgid "Cannot find lower free IEC channel than %d\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:139
+msgid "Cannot get PLC status - connection failed.\n"
+msgstr ""
+
+#: ../ProjectController.py:967
+msgid "Cannot open/parse VARIABLES.csv!\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
+msgid "Case sensitive"
+msgstr ""
+
+#: ../editors/Viewer.py:581
+msgid "Center"
+msgstr "Közép"
+
+#: ../Beremiz_service.py:276
+msgid "Change IP of interface to bind"
+msgstr "IP cím megváltoztatása a hozzákötött interfészen"
+
+#: ../Beremiz_service.py:275
+msgid "Change Name"
+msgstr "Név megváltoztatása"
+
+#: ../IDEFrame.py:1977
+msgid "Change POU Type To"
+msgstr "POU típus megváltoztatása"
+
+#: ../Beremiz_service.py:277
+msgid "Change Port Number"
+msgstr "Port szám megváltoztatása"
+
+#: ../Beremiz_service.py:278
+msgid "Change working directory"
+msgstr "Munkakönyvtár megváltoztatása"
+
+#: ../plcopen/iec_std.csv:81
+msgid "Character string"
+msgstr "Karakter sztring"
+
+#: ../svgui/svgui.py:136
+msgid "Choose a SVG file"
+msgstr "Válasszon SVG fájlt"
+
+#: ../ProjectController.py:561
+msgid "Choose a directory to save project"
+msgstr "Válasszon mappát a projekt mentéshez"
+
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
+msgid "Choose a file"
+msgstr "Válasszon fájlt"
+
+#: ../BeremizIDE.py:900
+msgid "Choose a project"
+msgstr "Válasszon projektet"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
+msgid "Choose a value for %s:"
+msgstr "Válasszon értéket a %s-nek:"
+
+#: ../Beremiz_service.py:333
+msgid "Choose a working directory "
+msgstr "Válasszon munkakönyvtárat"
+
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr ""
+
+#: ../ProjectController.py:468
+msgid "Chosen folder doesn't contain a program. It's not a valid project!"
+msgstr "A kiválasztott mappa nem tartalmaz érvényes projektet!"
+
+#: ../ProjectController.py:435
+msgid "Chosen folder isn't empty. You can't use it for a new project!"
+msgstr "A kiválasztott mappa nem üres. Nem használható új projekthez."
+
+#: ../controls/VariablePanel.py:60
+msgid "Class"
+msgstr "Osztály"
+
+#: ../controls/VariablePanel.py:472
+msgid "Class Filter:"
+msgstr "Osztály szűrő:"
+
+#: ../dialogs/FBDVariableDialog.py:74
+msgid "Class:"
+msgstr "Osztály:"
+
+#: ../ProjectController.py:1821
+msgid "Clean"
+msgstr "Takarítás"
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr "Log üzenetek kitakarítása"
+
+#: ../ProjectController.py:1822
+msgid "Clean project build folder"
+msgstr "Project fordítás mappa takarítása"
+
+#: ../ProjectController.py:1332
+msgid "Cleaning the build directory\n"
+msgstr "Fordítási mappa kitakarítása\n"
+
+#: ../IDEFrame.py:437
+msgid "Clear Errors"
+msgstr "Hibák törlése"
+
+#: ../editors/Viewer.py:680
+msgid "Clear Execution Order"
+msgstr "Végrehajtási Sorrend Törlése"
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr "Bezárás"
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
+msgid "Close Application"
+msgstr "Alkalmazás Bezárás"
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
+msgid "Close Project"
+msgstr "Projekt Bezárás"
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
+msgid "Close Tab"
+msgstr "Fül Bezárás"
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
+msgid "Coil"
+msgstr "Tekercs"
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
+msgid "Comment"
+msgstr "Megjegyzés"
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr "Közösségi támogatás"
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr "Vállalat Neve"
+
+#: ../controls/ProjectPropertiesPanel.py:106
+msgid "Company Name (required):"
+msgstr "Vállalat Neve (kötelező):"
+
+#: ../controls/ProjectPropertiesPanel.py:107
+msgid "Company URL (optional):"
+msgstr "Vállalat Weboldal (opcionális):"
+
+#: ../plcopen/iec_std.csv:75
+msgid "Comparison"
+msgstr "Összehasonlítás"
+
+#: ../ProjectController.py:756
+msgid "Compiling IEC Program into C code...\n"
+msgstr "IEC Program fordítása C kódra...\n"
+
+#: ../plcopen/iec_std.csv:85
+msgid "Concatenation"
+msgstr "Összefűzés"
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr "Konfiguráció"
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr "Változók konfigurálása"
+
+#: ../dialogs/SearchInProjectDialog.py:43
+msgid "Configuration"
+msgstr "Konfiguráció"
+
+#: ../plcopen/types_enums.py:77
+msgid "Configurations"
+msgstr "Konfigurációk"
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr "Erősítse meg vagy változtassa meg a változó nevét"
+
+#: ../ProjectController.py:1842
+msgid "Connect"
+msgstr "Kapcsolódás"
+
+#: ../ProjectController.py:1843
+msgid "Connect to the target PLC"
+msgstr "Kapcsolódás a cél PLC-hez"
+
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr "Az URI: %s csatlakoztatva"
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
+msgid "Connection"
+msgstr "Kapcsolat"
+
+#: ../dialogs/ConnectionDialog.py:55
+msgid "Connection Properties"
+msgstr "Kapcsolat Tulajdonságok"
+
+#: ../ProjectController.py:1691
+msgid "Connection canceled!\n"
+msgstr "Kapcsolódás megszakítva!\n"
+
+#: ../ProjectController.py:1714
+#, python-format
+msgid "Connection failed to %s!\n"
+msgstr "Kapcsolódás a %s-hez nem sikerült!\n"
+
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr "Kapcsolat elvesztve!\n"
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
+msgid "Connection to '%s' failed.\n"
+msgstr "Kapcsolódás a '%s'-hez nem sikerült.\n"
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
+msgid "Connector"
+msgstr "Csatlakozó"
+
+#: ../dialogs/SFCStepDialog.py:68
+msgid "Connectors:"
+msgstr "Csatlakozók:"
+
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr "Konzol"
+
+#: ../controls/VariablePanel.py:75
+msgid "Constant"
+msgstr "Konstans"
+
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
+msgid "Contact"
+msgstr "Kapcsolat"
+
+#: ../controls/ProjectPropertiesPanel.py:217
+msgid "Content Description (optional):"
+msgstr "Tartalom leírása (opcionális)"
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
+msgid "Continuation"
+msgstr "Folytatás"
+
+#: ../plcopen/iec_std.csv:18
+msgid "Conversion from BCD"
+msgstr "Konvertálás BCD-ből"
+
+#: ../plcopen/iec_std.csv:19
+msgid "Conversion to BCD"
+msgstr "Konvertálás BCD-be"
+
+#: ../plcopen/iec_std.csv:21
+msgid "Conversion to date"
+msgstr "Konvertálás dátummá"
+
+#: ../plcopen/iec_std.csv:20
+msgid "Conversion to time-of-day"
+msgstr "Konvertálás napszakká (TOD)"
+
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
+msgid "Copy"
+msgstr "Másolás"
+
+#: ../IDEFrame.py:1964
+msgid "Copy POU"
+msgstr "POU másolás"
+
+#: ../editors/FileManagementPanel.py:68
+msgid "Copy file from left folder to right"
+msgstr "Másolás bal oldali mappából jobbra"
+
+#: ../editors/FileManagementPanel.py:67
+msgid "Copy file from right folder to left"
+msgstr "Másolás jobb oldali mappából balra"
+
+#: ../plcopen/iec_std.csv:28
+msgid "Cosine"
+msgstr "Koszinusz"
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr "Régi %s fájlt nem lehet beimportálni."
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../PLCControler.py:552
+msgid "Couldn't paste non-POU object."
+msgstr "Nem POU típusú objektum beillesztése nem lehetséges."
+
+#: ../ProjectController.py:1636
+msgid "Couldn't start PLC !\n"
+msgstr "PLC nem indult el!\n"
+
+#: ../ProjectController.py:1644
+msgid "Couldn't stop PLC !\n"
+msgstr "PLC nem állt le!\n"
+
+#: ../svgui/svgui.py:57
+msgid "Create HMI"
+msgstr "HMI létrehozása"
+
+#: ../dialogs/PouDialog.py:54
+msgid "Create a new POU"
+msgstr "Új Program Szervezési Egység (POU) létrehozása"
+
+#: ../dialogs/PouActionDialog.py:45
+msgid "Create a new action"
+msgstr "Új művelet létrehozása"
+
+#: ../IDEFrame.py:166
+msgid "Create a new action block"
+msgstr "Új művelek blokk létrehozása"
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
+msgid "Create a new block"
+msgstr "Új blokk létrehozása"
+
+#: ../IDEFrame.py:139
+msgid "Create a new branch"
+msgstr "Új ág létrehozása"
+
+#: ../IDEFrame.py:133
+msgid "Create a new coil"
+msgstr "Új tekercs létrehozása"
+
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
+msgid "Create a new comment"
+msgstr "Új megjegyzés létrehozása"
+
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
+msgid "Create a new connection"
+msgstr "Új kapcsolat léterhozása"
+
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
+msgid "Create a new contact"
+msgstr "Új kötés létrehozása"
+
+#: ../IDEFrame.py:169
+msgid "Create a new divergence"
+msgstr "Új leágazás létrehozása"
+
+#: ../dialogs/SFCDivergenceDialog.py:54
+msgid "Create a new divergence or convergence"
+msgstr "Új leágazás vagy összefutás léterhozása"
+
+#: ../IDEFrame.py:157
+msgid "Create a new initial step"
+msgstr "Új kezdeti lépés létrehozása"
+
+#: ../IDEFrame.py:172
+msgid "Create a new jump"
+msgstr "Új ugrás létrehozása"
+
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
+msgid "Create a new power rail"
+msgstr "Új áramsin létrehozása"
+
+#: ../IDEFrame.py:130
+msgid "Create a new rung"
+msgstr "Új rung létrehozása"
+
+#: ../IDEFrame.py:160
+msgid "Create a new step"
+msgstr "Új lépés létrehozása"
+
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
+msgid "Create a new transition"
+msgstr "Új átmenet létrehozása"
+
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
+msgid "Create a new variable"
+msgstr "Új változó létrehozása"
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr "Köszönet"
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr "Aktuális munka könyvtár:"
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
+msgid "Cut"
+msgstr "Kivágás"
+
+#: ../editors/ResourceEditor.py:81
+msgid "Cyclic"
+msgstr "Ciklikus"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:60
+msgid "DEPRECATED"
+msgstr "ELAVULT"
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
+msgid "DS-301 Profile"
+msgstr "DS-301 Profil"
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
+msgid "DS-302 Profile"
+msgstr "DS-302 Profil"
+
+#: ../dialogs/SearchInProjectDialog.py:39
+msgid "Data Type"
+msgstr "Adattípus"
+
+#: ../plcopen/types_enums.py:76
+msgid "Data Types"
+msgstr "Adattípusok"
+
+#: ../plcopen/iec_std.csv:16
+msgid "Data type conversion"
+msgstr "Adattípus konverzió"
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
+msgid "Date addition"
+msgstr "Dátom hozzáadás"
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
+msgid "Date and time subtraction"
+msgstr "Dátum és idő kivonás"
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
+msgid "Date subtraction"
+msgstr "Dátum kivonás"
+
+#: ../dialogs/DurationEditorDialog.py:46
+msgid "Days:"
+msgstr "Napok:"
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr ""
+"Hibakeresés nem egyezik a PLC-vel - megállítás / letöltés / újraindítás "
+"szükséges, hogy engedélyezve legyen.\n"
+
+#: ../controls/PouInstanceVariablesPanel.py:144
+msgid "Debug instance"
+msgstr "Példány hibakeresése"
+
+#: ../editors/Viewer.py:490
+#, python-format
+msgid "Debug: %s"
+msgstr "Hibakeresés: %s"
+
+#: ../ProjectController.py:1471
+#, python-format
+msgid "Debug: Unknown variable '%s'\n"
+msgstr "Hibakeresés: Ismeretlen változó '%s'\n"
+
+#: ../ProjectController.py:1469
+#, python-format
+msgid "Debug: Unsupported type to debug '%s'\n"
+msgstr "Hibakeresés: Nem támogatott típus '%s'\n"
+
+#: ../IDEFrame.py:660
+msgid "Debugger"
+msgstr "Hibakereső"
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr "Hibakereső kész\n"
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
+msgid "Delete"
+msgstr "Törlés"
+
+#: ../editors/Viewer.py:610
+msgid "Delete Divergence Branch"
+msgstr "Elágazás törlése"
+
+#: ../editors/FileManagementPanel.py:157
+msgid "Delete File"
+msgstr "File törlése"
+
+#: ../editors/Viewer.py:597
+msgid "Delete Wire Segment"
+msgstr "Vezeték szakasz törlése"
+
+#: ../controls/CustomEditableListBox.py:44
+msgid "Delete item"
+msgstr "Elem törlése"
+
+#: ../plcopen/iec_std.csv:88
+msgid "Deletion (within)"
+msgstr "Törlés (ebben)"
+
+#: ../editors/DataTypeEditor.py:161
+msgid "Derivation Type:"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr "Leírás"
+
+#: ../controls/VariablePanel.py:463
+msgid "Description:"
+msgstr "Leírás:"
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
+msgid "Dimensions:"
+msgstr "Méretek:"
+
+#: ../dialogs/FindInPouDialog.py:69
+msgid "Direction"
+msgstr "Irány"
+
+#: ../dialogs/BrowseLocationsDialog.py:102
+msgid "Direction:"
+msgstr "Irány:"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Directly"
+msgstr "Közvetlenül"
+
+#: ../ProjectController.py:1855
+msgid "Disconnect"
+msgstr "Szétkapcsolás"
+
+#: ../ProjectController.py:1856
+msgid "Disconnect from PLC"
+msgstr "Szétkapcsolás PLC-ről"
+
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr "Szétkapcsolva"
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
+msgid "Divergence"
+msgstr "Elágazás"
+
+#: ../plcopen/iec_std.csv:36
+msgid "Division"
+msgstr "Osztás"
+
+#: ../editors/FileManagementPanel.py:156
+#, python-format
+msgid "Do you really want to delete the file '%s'?"
+msgstr "Biztos, hogy törölni akarja a '%s' fájlt?"
+
+#: ../controls/VariablePanel.py:65
+msgid "Documentation"
+msgstr "Dokumentáció"
+
+#: ../PLCOpenEditor.py:312
+msgid "Done"
+msgstr "Kész"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Duration"
+msgstr "Időtartam"
+
+#: ../canfestival/canfestival.py:174
+msgid "EDS files (*.eds)|*.eds|All files|*.*"
+msgstr "EDS fájlok (*.eds)|*.eds|Minden fájl|*.*"
+
+#: ../editors/Viewer.py:668
+msgid "Edit Block"
+msgstr "Blokk Szerkesztése"
+
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr "Tekercs Értékének Szerkesztése"
+
+#: ../dialogs/LDElementDialog.py:56
+msgid "Edit Contact Values"
+msgstr "Kötés Értékének Szerkesztése"
+
+#: ../dialogs/DurationEditorDialog.py:62
+msgid "Edit Duration"
+msgstr "Időtartam Szerkesztése"
+
+#: ../dialogs/SFCStepDialog.py:53
+msgid "Edit Step"
+msgstr "Lépés Szerkesztése"
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
+msgid "Edit a WxWidgets GUI with WXGlade"
+msgstr "WxWidgets GUI szerkesztése WXGlade segítségével"
+
+#: ../dialogs/ActionBlockDialog.py:127
+msgid "Edit action block properties"
+msgstr "Művelet blokk tulajdonságok szerkesztése"
+
+#: ../dialogs/ArrayTypeDialog.py:47
+msgid "Edit array type properties"
+msgstr "Tömb tulajdonságok szerkesztése"
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
+msgid "Edit comment"
+msgstr "Megjegyzés szerkesztése"
+
+#: ../editors/FileManagementPanel.py:69
+msgid "Edit file"
+msgstr "Fájl szerkesztése"
+
+#: ../controls/CustomEditableListBox.py:42
+msgid "Edit item"
+msgstr "Elem szerkesztése"
+
+#: ../editors/Viewer.py:3059
+msgid "Edit jump target"
+msgstr "Elugrás céljának szerkesztése"
+
+#: ../ProjectController.py:1873
+msgid "Edit raw IEC code added to code generated by PLCGenerator"
+msgstr "PLCGenerator által létrehozott nyers IEC kód szerkesztése"
+
+#: ../editors/SFCViewer.py:815
+msgid "Edit step name"
+msgstr "Lépés név szerkesztése"
+
+#: ../dialogs/SFCTransitionDialog.py:53
+msgid "Edit transition"
+msgstr "Váltás szerkesztése"
+
+#: ../IDEFrame.py:632
+msgid "Editor ToolBar"
+msgstr "Szerkesztő Eszköztár"
+
+#: ../ProjectController.py:1294
+msgid "Editor selection"
+msgstr "Szerkesztő kiválasztás"
+
+#: ../editors/DataTypeEditor.py:360
+msgid "Elements :"
+msgstr "Elemek :"
+
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr "Üres"
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr ""
+
+#: ../Beremiz_service.py:341
+msgid "Enter a name "
+msgstr "Adjon meg egy nevet"
+
+#: ../Beremiz_service.py:326
+msgid "Enter a port number "
+msgstr "Adjon meg egy port számot"
+
+#: ../Beremiz_service.py:317
+msgid "Enter the IP of the interface to bind"
+msgstr "Adja az kötéshez használt interfész IP címét"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Enumerated"
+msgstr "Felsorolva"
+
+#: ../plcopen/iec_std.csv:77
+msgid "Equal to"
+msgstr "Egyenlő"
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
+msgid "Error"
+msgstr "Hiba"
+
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+"Hiba: Legalább egy konfiguráció és egy erőforrást deklarálni kell a PLC-"
+"ben!\n"
+
+#: ../ProjectController.py:803
+#, python-format
+msgid "Error : IEC to C compiler returned %d\n"
+msgstr "Hiba: IEC-ről C-re fordítás hiba %d\n"
+
+#: ../ProjectController.py:731
+#, python-format
+msgid ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+msgstr ""
+"Hiba az ST/IL/SFC kód generátorban:\n"
+"%s\n"
+
+#: ../ConfigTreeNode.py:219
+#, python-format
+msgid "Error while saving \"%s\"\n"
+msgstr "Hiba a \"%s\" mentése közben\n"
+
+#: ../canfestival/canfestival.py:179
+msgid "Error: Export slave failed\n"
+msgstr "Hiba: Szolga exportálás nem sikerült\n"
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:388
+msgid "Error: No Master generated\n"
+msgstr "Hiba: Nincs Master létrehozva\n"
+
+#: ../canfestival/canfestival.py:383
+msgid "Error: No PLC built\n"
+msgstr "Hiba: Nincs lefordított PLC\n"
+
+#: ../ProjectController.py:1708
+#, python-format
+msgid "Exception while connecting %s!\n"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:123
+msgid "Execution Control:"
+msgstr "Végrehajtás vezérlés:"
+
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
+msgid "Execution Order:"
+msgstr "Végrehajtási Sorrend:"
+
+#: ../features.py:36
+msgid "Experimental web based HMI"
+msgstr "Kísérleti web alapú HMI"
+
+#: ../plcopen/iec_std.csv:38
+msgid "Exponent"
+msgstr "Kitevő"
+
+#: ../plcopen/iec_std.csv:26
+msgid "Exponentiation"
+msgstr "Hatvány"
+
+#: ../canfestival/canfestival.py:186
+msgid "Export CanOpen slave to EDS file"
+msgstr "CanOpen slave exportálása EDS fájlba"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
+msgid "Export graph values to clipboard"
+msgstr "Grafikus értékek vágólapra másolása"
+
+#: ../canfestival/canfestival.py:185
+msgid "Export slave"
+msgstr "Szolga exportálása"
+
+#: ../dialogs/FBDVariableDialog.py:94
+msgid "Expression:"
+msgstr "Kifejezés:"
+
+#: ../controls/VariablePanel.py:90
+msgid "External"
+msgstr "Külső"
+
+#: ../ProjectController.py:826
+msgid "Extracting Located Variables...\n"
+msgstr "A megtalált változók kinyerése...\n"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "FBD"
+msgstr "FBD"
+
+#: ../ProjectController.py:1773
+msgid "Failed : Must build before transfer.\n"
+msgstr "Sikertelen: Le kell fordítani az átküldés előtt.\n"
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
+msgid "Falling Edge"
+msgstr "Lefutóél"
+
+#: ../ProjectController.py:1098
+msgid "Fatal : cannot get builder.\n"
+msgstr "Hiba: fordító nem található.\n"
+
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr "%s Letöltése"
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
+msgid "Field %s hasn't a valid value!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
+msgid "Fields %s haven't a valid value!"
+msgstr ""
+
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
+msgid "Find"
+msgstr "Keresés"
+
+#: ../IDEFrame.py:379
+msgid "Find Next"
+msgstr "Következő keresése"
+
+#: ../IDEFrame.py:381
+msgid "Find Previous"
+msgstr "Előző keresése"
+
+#: ../plcopen/iec_std.csv:90
+msgid "Find position"
+msgstr "Pozíció keresése"
+
+#: ../dialogs/FindInPouDialog.py:58
+msgid "Find:"
+msgstr "Keresés:"
+
+#: ../editors/Viewer.py:1633
+msgid "Force value"
+msgstr "Kényszerített érték"
+
+#: ../dialogs/ForceVariableDialog.py:176
+msgid "Forcing Variable Value"
+msgstr "Változó érték kényszerítése"
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
+#, python-format
+msgid "Form isn't complete. %s must be filled!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
+msgid "Form isn't complete. Name must be filled!"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:235
+msgid "Form isn't complete. Valid block type must be selected!"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:75
+msgid "Forward"
+msgstr "Előre"
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
+msgid "Function"
+msgstr "Funkció"
+
+#: ../IDEFrame.py:354
+msgid "Function &Block"
+msgstr "Funkcióblokk"
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
+msgid "Function Block"
+msgstr "Funkcióblokk"
+
+#: ../controls/VariablePanel.py:868
+msgid "Function Block Types"
+msgstr "Funkcióblokk Típusok"
+
+#: ../plcopen/types_enums.py:75
+msgid "Function Blocks"
+msgstr "Funkcióblokkok"
+
+#: ../editors/Viewer.py:290
+msgid "Function Blocks can't be used in Functions!"
+msgstr "Funkcióblokkok nem használhatók a függvényekben!"
+
+#: ../PLCControler.py:1907
+#, python-format
+msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+msgstr "Funkcióblokk \"%s\" nem illeszthető be a függvénybe!!!"
+
+#: ../plcopen/types_enums.py:75
+msgid "Functions"
+msgstr "Függvények"
+
+#: ../PLCOpenEditor.py:88
+msgid "Generate Program"
+msgstr "Program Létrehozás"
+
+#: ../ProjectController.py:722
+msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+msgstr "SoftPLC IEC-61131 ST/IL/SFC kód létrehozása...\n"
+
+#: ../controls/VariablePanel.py:91
+msgid "Global"
+msgstr "Globális"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
+msgid "Go to current value"
+msgstr "Menj az aktuális értékhez"
+
+#: ../controls/ProjectPropertiesPanel.py:189
+msgid "Graphics"
+msgstr "Grafika"
+
+#: ../plcopen/iec_std.csv:75
+msgid "Greater than"
+msgstr "Nagyobb"
+
+#: ../plcopen/iec_std.csv:76
+msgid "Greater than or equal to"
+msgstr "Nagyobb vagy egyenlő"
+
+#: ../controls/ProjectPropertiesPanel.py:149
+msgid "Grid Resolution:"
+msgstr "Rács Felbontás:"
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr "HTTP interfész port:"
+
+#: ../controls/ProjectPropertiesPanel.py:135
+msgid "Height:"
+msgstr "Magasság:"
+
+#: ../editors/FileManagementPanel.py:89
+msgid "Home Directory:"
+msgstr "Saját Könyvtár:"
+
+#: ../controls/ProjectPropertiesPanel.py:165
+msgid "Horizontal:"
+msgstr "Vízszintes:"
+
+#: ../dialogs/DurationEditorDialog.py:47
+msgid "Hours:"
+msgstr "Órák:"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "IL"
+msgstr "IL"
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr "IP"
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
+msgid "IP is not valid!"
+msgstr "IP cím nem valós!"
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
+msgid "Import SVG"
+msgstr "SVG importálás"
+
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
+msgid "InOut"
+msgstr "BeKi"
+
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr "Inaktív"
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr "\"{a1}\" és \"{a2}\" nem kompatibilis adattípusok."
+
+#: ../controls/VariablePanel.py:306
+#, python-format
+msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+msgstr "\"%s\" és \"BOOL\" nem kompatibilis adatméretűek."
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr "\"{a1}\" és \"{a2}\" nem kompatibilis méretűek"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Indicator"
+msgstr "Kijelző"
+
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr "Kezdeti"
+
+#: ../editors/Viewer.py:650
+msgid "Initial Step"
+msgstr "Kezdeti lépés"
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
+msgid "Initial Value"
+msgstr "Kezdőérték"
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
+msgid "Initial Value:"
+msgstr "Kezdőérték:"
+
+#: ../svgui/svgui.py:56
+msgid "Inkscape"
+msgstr "Inkscape"
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
+msgid "Inline"
+msgstr "Inline"
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Input"
+msgstr "Bemenet"
+
+#: ../dialogs/FBDBlockDialog.py:99
+msgid "Inputs:"
+msgstr "Bemenetek:"
+
+#: ../plcopen/iec_std.csv:87
+msgid "Insertion (into)"
+msgstr "Beszúrás (ide)"
+
+#: ../plcopen/plcopen.py:1948
+#, python-format
+msgid "Instance with id %d doesn't exist!"
+msgstr "Az %d azonosító nem létezik!"
+
+#: ../editors/ResourceEditor.py:279
+msgid "Instances:"
+msgstr "Példányok:"
+
+#: ../controls/VariablePanel.py:88
+msgid "Interface"
+msgstr "Interfész"
+
+#: ../editors/ResourceEditor.py:81
+msgid "Interrupt"
+msgstr "Megszakítás"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Interval"
+msgstr "Intervallum"
+
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+
+#: ../PLCControler.py:1895
+msgid "Invalid plcopen element(s)!!!"
+msgstr "Érvénytelen plcopen elem(ek)!!!"
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr ""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
+#, python-format
+msgid "Invalid value \"%s\" for debug variable"
+msgstr ""
+
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
+msgid "Invalid value \"%s\" for variable grid element"
+msgstr ""
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
+#, python-format
+msgid "Invalid value \"%s\" for viewer block"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:124
+msgid ""
+"Invalid value!\n"
+"You must fill a numeric value."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr ""
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
+msgid "Jump"
+msgstr "Ugrás"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "LD"
+msgstr "LD"
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
+#, python-format
+msgid "Ladder element with id %d is on more than one rung."
+msgstr "A %d azonosítójú létra elem több rung-ban van használva."
+
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
+msgid "Language"
+msgstr "Nyelv"
+
+#: ../controls/ProjectPropertiesPanel.py:206
+msgid "Language (optional):"
+msgstr "Nyelv (opcionális):"
+
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
+msgid "Language:"
+msgstr "Nyelv:"
+
+#: ../ProjectController.py:1779
+msgid "Latest build already matches current target. Transfering anyway...\n"
+msgstr ""
+"A legutolsó fordítás már megegyezik az aktuális céllal. Mindenképpen "
+"átküldésre kerül...\n"
+
+#: ../Beremiz_service.py:281
+msgid "Launch WX GUI inspector"
+msgstr "WX GUI elemző indítása"
+
+#: ../Beremiz_service.py:280
+msgid "Launch a live Python shell"
+msgstr "Élő Python shell indítása"
+
+#: ../editors/Viewer.py:580
+msgid "Left"
+msgstr "Bal"
+
+#: ../dialogs/LDPowerRailDialog.py:64
+msgid "Left PowerRail"
+msgstr "Bal ÁramSin"
+
+#: ../plcopen/iec_std.csv:81
+msgid "Length of string"
+msgstr "String hossza"
+
+#: ../plcopen/iec_std.csv:78
+msgid "Less than"
+msgstr "Kisebb"
+
+#: ../plcopen/iec_std.csv:79
+msgid "Less than or equal to"
+msgstr "Kisebb vagy egyenlő"
+
+#: ../IDEFrame.py:652
+msgid "Library"
+msgstr "Könyvtár"
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr "Licensz"
+
+#: ../plcopen/iec_std.csv:73
+msgid "Limitation"
+msgstr "Határolás"
+
+#: ../targets/toolchain_gcc.py:209
+msgid "Linking :\n"
+msgstr "Összefűzés:\n"
+
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
+msgid "Local"
+msgstr "Helyi"
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr "Helyi bejegyzések"
+
+#: ../ProjectController.py:1685
+msgid "Local service discovery failed!\n"
+msgstr "Helyi szolgáltatás felderítése nem sikerült!\n"
+
+#: ../controls/VariablePanel.py:62
+msgid "Location"
+msgstr "Hely"
+
+#: ../dialogs/BrowseLocationsDialog.py:79
+msgid "Locations available:"
+msgstr "Elérhető helyek:"
+
+#: ../plcopen/iec_std.csv:25
+msgid "Logarithm to base 10"
+msgstr "10-es alapú logaritmus"
+
+#: ../connectors/PYRO/__init__.py:102
+#, python-format
+msgid "MDNS resolution failure for '%s'\n"
+msgstr "MDNS feloldás nem sikerült a '%s'-ra\n"
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
+msgid "Map Variable"
+msgstr "Változó Hozzárendelés"
+
+#: ../features.py:31
+msgid "Map located variables over CANopen"
+msgstr "CANopen buszon feldezett változók hozzárendelése"
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:113
+msgid "Master"
+msgstr "Fő"
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr ""
+
+#: ../plcopen/iec_std.csv:71
+msgid "Maximum"
+msgstr "Maximum"
+
+#: ../editors/DataTypeEditor.py:246
+msgid "Maximum:"
+msgstr "Maximum:"
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Memory"
+msgstr "Memória"
+
+#: ../IDEFrame.py:617
+msgid "Menu ToolBar"
+msgstr "Menü Eszköztár"
+
+#: ../dialogs/DurationEditorDialog.py:51
+msgid "Microseconds:"
+msgstr "Mikroszekundum:"
+
+#: ../editors/Viewer.py:585
+msgid "Middle"
+msgstr "Középső"
+
+#: ../dialogs/DurationEditorDialog.py:50
+msgid "Milliseconds:"
+msgstr "Ezredmásodperc"
+
+#: ../plcopen/iec_std.csv:72
+msgid "Minimum"
+msgstr "Minimum"
+
+#: ../editors/DataTypeEditor.py:233
+msgid "Minimum:"
+msgstr "Minimum:"
+
+#: ../dialogs/DurationEditorDialog.py:48
+msgid "Minutes:"
+msgstr "Perc:"
+
+#: ../controls/ProjectPropertiesPanel.py:231
+msgid "Miscellaneous"
+msgstr "Egyéb"
+
+#: ../features.py:32
+msgid "Modbus support"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:65
+msgid "Modifier:"
+msgstr "Módosító:"
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:146
+msgid "Move action down"
+msgstr "Tevékenység mozgatás le"
+
+#: ../dialogs/ActionBlockDialog.py:145
+msgid "Move action up"
+msgstr "Tevékenység mozgatás fel"
+
+#: ../controls/CustomEditableListBox.py:46
+msgid "Move down"
+msgstr "Mozgatás le"
+
+#: ../editors/DataTypeEditor.py:367
+msgid "Move element down"
+msgstr "Mozgatás fel"
+
+#: ../editors/DataTypeEditor.py:366
+msgid "Move element up"
+msgstr "Elem mozgatás fel"
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr "Elem mozgatás le"
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr "Példány mozgatás fel"
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr "Feladat mozgatás le"
+
+#: ../editors/ResourceEditor.py:254
+msgid "Move task up"
+msgstr "Feladat mozgatás fel"
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
+msgid "Move the view"
+msgstr "Nézet mozgatása"
+
+#: ../controls/CustomEditableListBox.py:45
+msgid "Move up"
+msgstr "Mozgatás fel"
+
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
+msgid "Move variable down"
+msgstr "Váltózó mozgatás le"
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
+msgid "Move variable up"
+msgstr "Változó mozgatás fel"
+
+#: ../plcopen/iec_std.csv:74
+msgid "Multiplexer (select 1 of N)"
+msgstr "Multiplexer (1 az N-hez kiválasztás)"
+
+#: ../plcopen/iec_std.csv:34
+msgid "Multiplication"
+msgstr "Szorzás"
+
+#: ../editors/FileManagementPanel.py:87
+msgid "My Computer:"
+msgstr "Sajátgép:"
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr "NÉV"
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
+#: ../controls/VariablePanel.py:59
+msgid "Name"
+msgstr "Név"
+
+#: ../Beremiz_service.py:342
+msgid "Name must not be null!"
+msgstr "Név nem lehet üres!"
+
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
+msgid "Name:"
+msgstr "Név:"
+
+#: ../plcopen/iec_std.csv:24
+msgid "Natural logarithm"
+msgstr "Természetes alapú logaritmus"
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
+msgid "Negated"
+msgstr "Negált"
+
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr ""
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
+msgid "New"
+msgstr "Új"
+
+#: ../controls/CustomEditableListBox.py:43
+msgid "New item"
+msgstr "Új elem"
+
+#: ../editors/Viewer.py:553
+msgid "No Modifier"
+msgstr "Nincs módosító"
+
+#: ../ProjectController.py:1808
+msgid "No PLC to transfer (did build succeed ?)\n"
+msgstr "Nincs letöltendő PLC (sikeres volt a fordítás?)\n"
+
+#: ../PLCGenerator.py:1678
+#, python-format
+msgid "No body defined in \"%s\" POU"
+msgstr "POU \"%s\"-ban nincs semmi definiálva."
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCOpenEditor.py:331
+msgid ""
+"No documentation available.\n"
+"Coming soon."
+msgstr ""
+"Dokumentáció nem elérhető\n"
+"Hamarosan érkezik."
+
+#: ../PLCGenerator.py:841
+#, python-format
+msgid "No informations found for \"%s\" block"
+msgstr ""
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:175
+msgid "No search results available."
+msgstr "Nincs elérhető keresési eredmény."
+
+#: ../svgui/svgui.py:142
+#, python-format
+msgid "No such SVG file: %s\n"
+msgstr "Nincs ilyen SVG fájl: %s\n"
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr ""
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+msgid "No valid value selected!"
+msgstr ""
+
+#: ../PLCGenerator.py:1676
+#, python-format
+msgid "No variable defined in \"%s\" POU"
+msgstr ""
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr ""
+
+#: ../controls/VariablePanel.py:79
+msgid "Non-Retain"
+msgstr "Nem megőrzött"
+
+#: ../dialogs/LDElementDialog.py:78
+msgid "Normal"
+msgstr "Normál"
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:80
+msgid "Not equal to"
+msgstr "Nem egyenlő"
+
+#: ../dialogs/SFCDivergenceDialog.py:91
+msgid "Number of sequences:"
+msgstr "Szekvenciák száma:"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Numerical"
+msgstr "Numerikus"
+
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr "Változás esetén"
+
+#: ../dialogs/SearchInProjectDialog.py:88
+msgid "Only Elements"
+msgstr "Csak elemek"
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
+msgid "Open"
+msgstr "Megnyit"
+
+#: ../svgui/svgui.py:151
+msgid "Open Inkscape"
+msgstr "Inkscape Megnyitás"
+
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+"Nyílt forráskódú automatizálási keretrendszer , IEC 61131 fejlesztő "
+"környezet megvalósítva folyamatosan növekvő számű bővítményekkel, és "
+"rugalmas futásidejű PLC-vel."
+
+#: ../ProjectController.py:1879
+msgid "Open a file explorer to manage project files"
+msgstr "Fájlkezelő megnyitása a projektek kezeléséhez"
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
+msgid "Open wxGlade"
+msgstr "wxGlade Megnyitása"
+
+#: ../controls/VariablePanel.py:64
+msgid "Option"
+msgstr "Beállítás"
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
+msgid "Options"
+msgstr "Beállítások"
+
+#: ../controls/ProjectPropertiesPanel.py:109
+msgid "Organization (optional):"
+msgstr "Szervezet (opcionális)"
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
+msgid "Other Profile"
+msgstr "Másik Profil"
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Output"
+msgstr "Kimenet"
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
+msgid "PDO Receive"
+msgstr "PDO Fogadás"
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
+msgid "PDO Transmit"
+msgstr "PDO Küldés"
+
+#: ../targets/toolchain_gcc.py:174
+msgid "PLC :\n"
+msgstr "PLC :\n"
+
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr "PLC Log"
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr "PLC kód létrehozás nem sikerült!\n"
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr "A PLC üres vagy már el van indítva."
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr "PLC nincs elindítva."
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+"PLC szintaktikai hiba az {a1} sorban:\n"
+"{a2}"
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
+msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
+msgstr "PLCOpen fájlok (*.xml)|*.xml|Minden fájl|*.*"
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
+msgid "PLCOpenEditor"
+msgstr "PLCOpenEditor"
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+"A PLCOpenEditor része a Beremiz projektnek.\n"
+"\n"
+"A beremiz egy ..."
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr "PORT"
+
+#: ../dialogs/PouDialog.py:109
+msgid "POU Name"
+msgstr "POU Név"
+
+#: ../dialogs/PouDialog.py:66
+msgid "POU Name:"
+msgstr "POU Név:"
+
+#: ../dialogs/PouDialog.py:111
+msgid "POU Type"
+msgstr "POU Típus"
+
+#: ../dialogs/PouDialog.py:73
+msgid "POU Type:"
+msgstr "POU Típus:"
+
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr ""
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
+msgid "Page Setup"
+msgstr "Oldalbeállítás"
+
+#: ../controls/ProjectPropertiesPanel.py:124
+msgid "Page Size (optional):"
+msgstr "Oldalméret (opcionális):"
+
+#: ../IDEFrame.py:2640
+#, python-format
+msgid "Page: %d"
+msgstr "Oldal: %d"
+
+#: ../controls/PouInstanceVariablesPanel.py:134
+msgid "Parent instance"
+msgstr "Szülő példány"
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
+msgid "Paste"
+msgstr "Beillesztés"
+
+#: ../IDEFrame.py:1899
+msgid "Paste POU"
+msgstr "POU beillesztés"
+
+#: ../dialogs/SearchInProjectDialog.py:60
+msgid "Pattern to search:"
+msgstr "Keresési minta:"
+
+#: ../dialogs/LDPowerRailDialog.py:75
+msgid "Pin number:"
+msgstr "Tüske száma:"
+
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
+msgid "Please choose a target"
+msgstr "Kérem válasszon célt"
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr "Kérem adja meg a blokk nevét"
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
+msgid "Please enter comment text"
+msgstr "Kérem adja meg a megjegyzés szövegét"
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
+msgid "Please enter step name"
+msgstr "Kérem adja meg a lépés nevét"
+
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr "Kérem adja meg a szöveget"
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
+msgid "Please enter value for a \"%s\" variable:"
+msgstr "Kérem adjon értéket a '%s' változónak:"
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be 0 <= port <= 65535!"
+msgstr "Port száma 0 és 65535 közé kell essen."
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be an integer!"
+msgstr "Port száma egész szám kell legyen!"
+
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
+msgid "Power Rail"
+msgstr "Áramsin"
+
+#: ../dialogs/LDPowerRailDialog.py:52
+msgid "Power Rail Properties"
+msgstr "Áramsin Tulajdonságok"
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
+msgid "Preview"
+msgstr "Előnézet"
+
+#: ../dialogs/BlockPreviewDialog.py:59
+msgid "Preview:"
+msgstr "Előnézet:"
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
+msgid "Print"
+msgstr "Nyomtatás"
+
+#: ../IDEFrame.py:1110
+msgid "Print preview"
+msgstr "Nyomtatási kép"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Priority"
+msgstr "Prioritás"
+
+#: ../dialogs/SFCTransitionDialog.py:91
+msgid "Priority:"
+msgstr "Prioritás:"
+
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr "PLC indítási hiba: hiba %d"
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr "Terméknév"
+
+#: ../controls/ProjectPropertiesPanel.py:90
+msgid "Product Name (required):"
+msgstr "Terméknév (kötelező):"
+
+#: ../controls/ProjectPropertiesPanel.py:92
+msgid "Product Release (optional):"
+msgstr "Termék kiadás (opcionális):"
+
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr "Termék Verzió"
+
+#: ../controls/ProjectPropertiesPanel.py:91
+msgid "Product Version (required):"
+msgstr "Termék Verzió (kötelező):"
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
+msgid "Program"
+msgstr "Program"
+
+#: ../PLCOpenEditor.py:321
+msgid "Program was successfully generated!"
+msgstr "Program sikeresen létrehozva!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Programs"
+msgstr "Programok"
+
+#: ../editors/Viewer.py:285
+msgid "Programs can't be used by other POUs!"
+msgstr "A program nem használható más POU-k által!"
+
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
+msgid "Project"
+msgstr "Projekt"
+
+#: ../controls/SearchResultPanel.py:180
+#, python-format
+msgid "Project '%s':"
+msgstr "Projekt '%s':"
+
+#: ../ProjectController.py:1878
+msgid "Project Files"
+msgstr "Projekt Fájlok"
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr "Projektnév"
+
+#: ../controls/ProjectPropertiesPanel.py:88
+msgid "Project Name (required):"
+msgstr "Projektnév (kötelező):"
+
+#: ../controls/ProjectPropertiesPanel.py:89
+msgid "Project Version (optional):"
+msgstr "Projekt Verzió (opcionális):"
+
+#: ../PLCControler.py:2717
+msgid ""
+"Project file syntax error:\n"
+"\n"
+msgstr ""
+"Projekt fájl szintaktikai hiba:\n"
+"\n"
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
+msgid "Project properties"
+msgstr "Projekt tulajdonságok"
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr "Projekt fa elrendezése nem egyezik meg a confnode.xml -el {a1}!={a2}"
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr "Terjesztési Név"
+
+#: ../plcopen/types_enums.py:77
+msgid "Properties"
+msgstr "Tulajdonságok"
+
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr "Kiadási szolgáltatás a helyi hálózaton"
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr ""
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr ""
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr "Python kód"
+
+#: ../features.py:34
+msgid "Python file"
+msgstr "Píthon fájl"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Qualifier"
+msgstr ""
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
+msgid "Quit"
+msgstr "Kilépés"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
+msgid "Range:"
+msgstr "Tartomány:"
+
+#: ../ProjectController.py:1872
+msgid "Raw IEC code"
+msgstr "Nyers IEC kód"
+
+#: ../BeremizIDE.py:1083
+#, python-format
+msgid "Really delete node '%s'?"
+msgstr "Valóban törli a '%s'  csomópontot?"
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
+msgid "Redo"
+msgstr "Újra"
+
+#: ../dialogs/SFCTransitionDialog.py:76
+msgid "Reference"
+msgstr "Referencia"
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
+msgid "Refresh"
+msgstr "Frissítés"
+
+#: ../dialogs/SearchInProjectDialog.py:70
+msgid "Regular expression"
+msgstr "Reguláris kifejezés"
+
+#: ../dialogs/FindInPouDialog.py:99
+msgid "Regular expressions"
+msgstr "Reguláris kifejezések"
+
+#: ../editors/Viewer.py:1636
+msgid "Release value"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:37
+msgid "Remainder (modulo)"
+msgstr "Maradék (modulo)"
+
+#: ../BeremizIDE.py:1084
+#, python-format
+msgid "Remove %s node"
+msgstr "Node %s eltávolítása"
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr "Adattípus eltávolítása"
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr "POU eltávolítása"
+
+#: ../dialogs/ActionBlockDialog.py:144
+msgid "Remove action"
+msgstr "Művelel eltávolítása"
+
+#: ../editors/DataTypeEditor.py:365
+msgid "Remove element"
+msgstr "Elem eltávolítása"
+
+#: ../editors/FileManagementPanel.py:66
+msgid "Remove file from left folder"
+msgstr "Bal oldali mappából a fájl eltávolítása"
+
+#: ../editors/ResourceEditor.py:284
+msgid "Remove instance"
+msgstr "Példány eltávolítása"
+
+#: ../canfestival/NetworkEditor.py:111
+msgid "Remove slave"
+msgstr "Szolga eltávolítása"
+
+#: ../editors/ResourceEditor.py:253
+msgid "Remove task"
+msgstr "Feladat eltávolítása"
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
+msgid "Remove variable"
+msgstr "Változó eltávolítása"
+
+#: ../IDEFrame.py:1979
+msgid "Rename"
+msgstr "Átnevezés"
+
+#: ../editors/FileManagementPanel.py:187
+msgid "Replace File"
+msgstr "Fájl lecserélése"
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:89
+msgid "Replacement (within)"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Reset"
+msgstr "Reset"
+
+#: ../editors/Viewer.py:681
+msgid "Reset Execution Order"
+msgstr "Végrehajtási sorrend törlése"
+
+#: ../IDEFrame.py:453
+msgid "Reset Perspective"
+msgstr "Perspektíva törlése"
+
+#: ../controls/SearchResultPanel.py:103
+msgid "Reset search result"
+msgstr "Keresési eredmény törlése"
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
+msgid "Resources"
+msgstr "Erőforrások"
+
+#: ../controls/VariablePanel.py:77
+msgid "Retain"
+msgstr "Megőriz"
+
+#: ../controls/VariablePanel.py:455
+msgid "Return Type:"
+msgstr "Visszatérési Típus:"
+
+#: ../editors/Viewer.py:582
+msgid "Right"
+msgstr "Jobb"
+
+#: ../dialogs/LDPowerRailDialog.py:65
+msgid "Right PowerRail"
+msgstr "Jobb Áramsin"
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
+msgid "Rising Edge"
+msgstr "Felfutóél"
+
+#: ../plcopen/iec_std.csv:65
+msgid "Rotate left"
+msgstr "Forgatás balra"
+
+#: ../plcopen/iec_std.csv:64
+msgid "Rotate right"
+msgstr "Forgatás jobbra"
+
+#: ../plcopen/iec_std.csv:17
+msgid "Rounding up/down"
+msgstr "Kerekítés fel/le"
+
+#: ../ProjectController.py:1828
+msgid "Run"
+msgstr "Fut"
+
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr "Futás idejú IO bővítmények C kódjának létrehozása nem sikerült!\n"
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr "Futás idejű könyvtárak C forráskódjának generálása nem sikerült!\n"
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
+msgid "SDO Client"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
+msgid "SDO Server"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "SFC"
+msgstr "SFC"
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr ""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "ST"
+msgstr "ST"
+
+#: ../PLCOpenEditor.py:308
+msgid "ST files (*.st)|*.st|All files|*.*"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "SVG files (*.svg)|*.svg|All files|*.*"
+msgstr ""
+
+#: ../features.py:36
+msgid "SVGUI"
+msgstr ""
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
+msgid "Save"
+msgstr "Mentés"
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
+msgid "Save As..."
+msgstr "Mentés másként..."
+
+#: ../BeremizIDE.py:249
+msgid "Save as"
+msgstr "Mentés mint"
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr "Mentési elérési út ugyanaz mint a projekt elérési újta!\n"
+
+#: ../dialogs/SearchInProjectDialog.py:73
+msgid "Scope"
+msgstr ""
+
+#: ../IDEFrame.py:644
+msgid "Search"
+msgstr "Keresés"
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
+msgid "Search in Project"
+msgstr "Keresés a Projektben"
+
+#: ../dialogs/DurationEditorDialog.py:49
+msgid "Seconds:"
+msgstr "Másodpercek:"
+
+#: ../IDEFrame.py:390
+msgid "Select All"
+msgstr "Mindet kiválaszt"
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
+msgid "Select a variable class:"
+msgstr "Változó osztály kiválasztás:"
+
+#: ../ProjectController.py:1293
+msgid "Select an editor:"
+msgstr "Szerkesztő kiválasztás:"
+
+#: ../controls/PouInstanceVariablesPanel.py:292
+msgid "Select an instance"
+msgstr "Példány kiválasztás"
+
+#: ../IDEFrame.py:628
+msgid "Select an object"
+msgstr "Objektum kiválasztás"
+
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr ""
+"A kiválasztott könyvtálr már tartalmaz egy másik projektet. Felülírjam?\n"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Selection"
+msgstr "Kiválasztás"
+
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:65
+msgid "Selection Divergence"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr "Szolgáltatás Felfedezés"
+
+#: ../dialogs/DiscoveryDialog.py:104
+msgid "Services available:"
+msgstr "Elérhető szolgáltatások:"
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Set"
+msgstr "Beállítás"
+
+#: ../plcopen/iec_std.csv:62
+msgid "Shift left"
+msgstr "Balra léptetés"
+
+#: ../plcopen/iec_std.csv:63
+msgid "Shift right"
+msgstr "Jobbra léptetés"
+
+#: ../ProjectController.py:1863
+msgid "Show IEC code generated by PLCGenerator"
+msgstr "PLCGenerator által létrehozott IEC kód mutatása"
+
+#: ../canfestival/canfestival.py:407
+msgid "Show Master"
+msgstr "Master mutatása"
+
+#: ../canfestival/canfestival.py:408
+msgid "Show Master generated by config_utils"
+msgstr "Mutassa a config_utils által létrehozott Master-t"
+
+#: ../ProjectController.py:1862
+msgid "Show code"
+msgstr "Kód mutatása"
+
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:67
+msgid "Simultaneous Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:27
+msgid "Sine"
+msgstr "Szinusz"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Single"
+msgstr "Egyes"
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr "Forrás nem változott, nincs újrafordítás.\n"
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+
+#: ../plcopen/iec_std.csv:23
+msgid "Square root (base 2)"
+msgstr ""
+
+#: ../plcopen/definitions.py:50
+msgid "Standard function blocks"
+msgstr ""
+
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
+msgid "Start PLC"
+msgstr "PLC indítása"
+
+#: ../ProjectController.py:1074
+#, python-format
+msgid "Start build in %s\n"
+msgstr "Fordítás indítása a %s-ban\n"
+
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr "Elindult"
+
+#: ../ProjectController.py:1633
+msgid "Starting PLC\n"
+msgstr "PLC elindul\n"
+
+#: ../BeremizIDE.py:393
+msgid "Status ToolBar"
+msgstr "Státusz Eszköztár"
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
+msgid "Step"
+msgstr "Lépés"
+
+#: ../ProjectController.py:1835
+msgid "Stop"
+msgstr "Állj"
+
+#: ../Beremiz_service.py:272
+msgid "Stop PLC"
+msgstr "PLC Állj"
+
+#: ../ProjectController.py:1836
+msgid "Stop Running PLC"
+msgstr "Futó PLC megállítása"
+
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr "Megállt"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Structure"
+msgstr "Struktúra"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Subrange"
+msgstr "Altartomány"
+
+#: ../plcopen/iec_std.csv:35
+msgid "Subtraction"
+msgstr "Kivonás"
+
+#: ../ProjectController.py:1113
+msgid "Successfully built.\n"
+msgstr "Sikeres fordítás.\n"
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr "Perspektíva váltás"
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
+msgid "Syntax error in regular expression of pattern to search!"
+msgstr "Szintaktikai hiba a keresési reguláris kifejezés mintában."
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr "TÍPUS"
+
+#: ../plcopen/iec_std.csv:29
+msgid "Tangent"
+msgstr "Tangens"
+
+#: ../editors/ResourceEditor.py:97
+msgid "Task"
+msgstr "Feladat"
+
+#: ../editors/ResourceEditor.py:248
+msgid "Tasks:"
+msgstr "Feladatok:"
+
+#: ../controls/VariablePanel.py:91
+msgid "Temp"
+msgstr "Ideiglenes"
+
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+"A legjobb hely a kérdések feltevésére a Beremiz/PLCOpenEditor kapcsán\n"
+"a projekt levelezési listája: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"Ez a fő támogatási csatorna.\n"
+"Az üzenet küldéshez szükséges a regisztráció a levelező listára.\n"
+"\n"
+"Itt lehet regisztrálni:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+
+#: ../editors/FileManagementPanel.py:186
+#, python-format
+msgid ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+msgstr ""
+
+#: ../editors/LDViewer.py:893
+msgid "The group of block must be coherent!"
+msgstr ""
+
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
+msgid "There are changes, do you want to save?"
+msgstr "Változások történtek, menteni akarja?"
+
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+
+#: ../IDEFrame.py:1133
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+
+#: ../editors/LDViewer.py:902
+msgid "This option isn't available yet!"
+msgstr "Ez az opció még nem létezik!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr "Ütem: %d"
+
+#: ../plcopen/iec_std.csv:40
+msgid "Time"
+msgstr "Idő"
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
+msgid "Time addition"
+msgstr "Idő összeadás"
+
+#: ../plcopen/iec_std.csv:86
+msgid "Time concatenation"
+msgstr "Idő összefűzés"
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
+msgid "Time division"
+msgstr "Idő osztás"
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
+msgid "Time multiplication"
+msgstr "Idő szorzás"
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
+msgid "Time subtraction"
+msgstr "Idő kivonás"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
+msgid "Time-of-day addition"
+msgstr "Napszak TOD összeadás"
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
+msgid "Time-of-day subtraction"
+msgstr "Napszak TOD kivonás"
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr "Érték átbillentés"
+
+#: ../editors/Viewer.py:584
+msgid "Top"
+msgstr "Felső"
+
+#: ../ProjectController.py:1848
+msgid "Transfer"
+msgstr "Átvitel"
+
+#: ../ProjectController.py:1849
+msgid "Transfer PLC"
+msgstr "PLC átvitel"
+
+#: ../ProjectController.py:1802
+msgid "Transfer completed successfully.\n"
+msgstr "Átvitel sikeresen befejezve.\n"
+
+#: ../ProjectController.py:1805
+msgid "Transfer failed\n"
+msgstr "Átvitel nem sikerült\n"
+
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
+msgid "Transition"
+msgstr "Átváltás"
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:91
+msgid "Transition Name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:60
+msgid "Transition Name:"
+msgstr ""
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1526
+#, python-format
+msgid "Transition with name %s doesn't exist!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Transitions"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Triggering"
+msgstr "Triggerelés"
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
+msgid "Type"
+msgstr "Típus"
+
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr ""
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
+#, python-format
+msgid "Type conflict for location \"%s\""
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Type conversion"
+msgstr "Típus konvertálás"
+
+#: ../editors/DataTypeEditor.py:170
+msgid "Type infos:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
+msgid "Type:"
+msgstr "Típus:"
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
+#, python-format
+msgid "Unable to define PDO mapping for node %02x"
+msgstr ""
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
+msgid "Unable to get Xenomai's %s \n"
+msgstr ""
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:261
+#, python-format
+msgid "Undefined pou type \"%s\""
+msgstr ""
+
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
+msgid "Undo"
+msgstr "Vissza"
+
+#: ../ProjectController.py:442
+msgid "Unknown"
+msgstr "Ismeretlen"
+
+#: ../editors/Viewer.py:437
+#, python-format
+msgid "Unknown variable \"%s\" for this POU!"
+msgstr ""
+
+#: ../ProjectController.py:439 ../ProjectController.py:440
+msgid "Unnamed"
+msgstr "Névtelen"
+
+#: ../PLCControler.py:263
+#, python-format
+msgid "Unnamed%d"
+msgstr "Névtelen %d"
+
+#: ../controls/VariablePanel.py:308
+#, python-format
+msgid "Unrecognized data size \"%s\""
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
+msgid "User Data Types"
+msgstr "Felhasználói Adat Típus"
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
+msgid "User Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "User-defined POUs"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Value"
+msgstr "Érték"
+
+#: ../editors/DataTypeEditor.py:267
+msgid "Values:"
+msgstr "Értékek:"
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
+msgid "Variable"
+msgstr "Változó"
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:68
+msgid "Variable Properties"
+msgstr "Változó Tulajdonságok"
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
+msgid "Variable class"
+msgstr "Változó osztály"
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
+msgid "Variable don't belong to this POU!"
+msgstr "Változó nem ehhez a POU-hoz tartozik!"
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr "Változó:"
+
+#: ../controls/VariablePanel.py:90
+msgid "Variables"
+msgstr "Változók"
+
+#: ../controls/ProjectPropertiesPanel.py:166
+msgid "Vertical:"
+msgstr "Függőleges"
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr ""
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr ""
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr ""
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr ""
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr ""
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr ""
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr ""
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr ""
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
+msgid "WXGLADE GUI"
+msgstr "WXGLADE GUI"
+
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
+msgid "Warning"
+msgstr "Figyelmeztetés"
+
+#: ../ProjectController.py:726
+msgid "Warnings in ST/IL/SFC code generator :\n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:82
+msgid "Whole Project"
+msgstr "Teljes Projekt"
+
+#: ../controls/ProjectPropertiesPanel.py:134
+msgid "Width:"
+msgstr "Szélesség:"
+
+#: ../dialogs/FindInPouDialog.py:94
+msgid "Wrap search"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr "Írta"
+
+#: ../features.py:35
+msgid "WxGlade GUI"
+msgstr ""
+
+#: ../svgui/svgui.py:150
+msgid ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:160
+msgid ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+msgstr ""
+
+#: ../ProjectController.py:390
+msgid ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+msgstr ""
+
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+
+#: ../editors/LDViewer.py:677
+msgid "You must select the wire where a contact should be added!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
+msgid "You must type a name!"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:209
+msgid "You must type a value!"
+msgstr ""
+
+#: ../IDEFrame.py:440
+msgid "Zoom"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr ""
+
+#: ../PLCOpenEditor.py:317
+#, python-format
+msgid "error: %s\n"
+msgstr ""
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "function"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "functionBlock"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr ""
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "program"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:84
+msgid "string from the middle"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:82
+msgid "string left of"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:83
+msgid "string right of"
+msgstr ""
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr ""
+
+#: ../PLCOpenEditor.py:315
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr ""
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr ""
+
+msgid "CAN_Device"
+msgstr ""
+
+msgid "CAN_Baudrate"
+msgstr ""
+
+msgid "NodeId"
+msgstr ""
+
+msgid "Sync_Align"
+msgstr ""
+
+msgid "Sync_Align_Ratio"
+msgstr ""
+
+msgid "CanFestivalNode"
+msgstr ""
+
+msgid "Sync_TPDOs"
+msgstr ""
+
+msgid "CanFestivalInstance"
+msgstr ""
+
+msgid "CAN_Driver"
+msgstr ""
+
+msgid "Generic"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Xenomai"
+msgstr ""
+
+msgid "XenoConfig"
+msgstr ""
+
+msgid "Compiler"
+msgstr ""
+
+msgid "CFLAGS"
+msgstr ""
+
+msgid "Linker"
+msgstr ""
+
+msgid "LDFLAGS"
+msgstr ""
+
+msgid "Linux"
+msgstr "Linux"
+
+msgid "Win32"
+msgstr "Win32"
+
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr ""
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
+msgid "BaseParams"
+msgstr ""
+
+msgid "IEC_Channel"
+msgstr "IEC_Csatorna"
+
+msgid "Enabled"
+msgstr "Engedélyezve"
+
+msgid "BeremizRoot"
+msgstr "BeremizGyökér"
+
+msgid "TargetType"
+msgstr "CélTípus"
+
+msgid "Libraries"
+msgstr "Könyvtárak"
+
+msgid "URI_location"
+msgstr "URI  helye"
+
+msgid "Disable_Extensions"
+msgstr "Bővítmények Tiltása"
+
+msgid "%(codefile_name)s"
+msgstr "%(codefile_name)s"
+
+msgid "variables"
+msgstr "változók"
+
+msgid "variable"
+msgstr "változó"
+
+msgid "name"
+msgstr "név"
+
+msgid "type"
+msgstr "típus"
+
+msgid "class"
+msgstr "osztály"
+
+msgid "initial"
+msgstr "kezdő"
+
+msgid "desc"
+msgstr "leírás"
+
+msgid "onchange"
+msgstr "változáskor"
+
+msgid "opts"
+msgstr ""
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr ""
+
+msgid "Preset datetime"
+msgstr ""
+
+msgid "Copy of IN"
+msgstr ""
+
+msgid "Datetime, current or relative to PDT"
+msgstr ""
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+
+msgid "1 = integrate, 0 = hold"
+msgstr ""
+
+msgid "Overriding reset"
+msgstr ""
+
+msgid "Input variable"
+msgstr ""
+
+msgid "Initial value"
+msgstr ""
+
+msgid "Sampling period"
+msgstr ""
+
+msgid "NOT R1"
+msgstr ""
+
+msgid "Integrated output"
+msgstr ""
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr ""
+
+msgid "0 = reset"
+msgstr ""
+
+msgid "Input to be differentiated"
+msgstr ""
+
+msgid "Differentiated output"
+msgstr ""
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+
+msgid "0 - manual , 1 - automatic"
+msgstr "0 - kézi , 1 - automata"
+
+msgid "Process variable"
+msgstr "Folyamat változó"
+
+msgid "Set point"
+msgstr "Alapjel"
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr ""
+
+msgid "Proportionality constant"
+msgstr "Arányos tag állandó"
+
+msgid "Reset time"
+msgstr "Reset idő"
+
+msgid "Derivative time constant"
+msgstr "Differenciáló tag állandó"
+
+msgid "PV - SP"
+msgstr "PV - SP"
+
+msgid "FB for integral term"
+msgstr "FB az integráló taghoz"
+
+msgid "FB for derivative term"
+msgstr "FB a differenciáló taghoz"
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+"The PID (arányos, integráló, differenciáló) funkció blokk megvalósítja a "
+"klasszikus 3 tagó zárt hurkú szabályzót."
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr ""
+
+msgid "Ramp duration"
+msgstr "Rámpázás ideje"
+
+msgid "BUSY = 1 during ramping period"
+msgstr "BUSY = 1 a rámpázási periódus közben"
+
+msgid "Elapsed time of ramp"
+msgstr "Rámpázásból eltelt idő"
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr ""
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr ""
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr ""
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+
+msgid "first input parameter"
+msgstr "első bemeneti paraméter"
+
+msgid "second input parameter"
+msgstr "második bemeneti paraméter"
+
+msgid "first output parameter"
+msgstr "első kimeneti paraméter"
+
+msgid "second output parameter"
+msgstr "második kimeneti paraméter"
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr "belső állapot: 0-törlés, 1-számlálás, 2-beállítás"
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+"Különböző hosszúságú kimeneti impulzusok előállítására az impulzus időzítő "
+"használható."
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/Beremiz_it_IT.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4047 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Andrey Skvortsov <andrej.skvortzov@gmail.com>, 2018\n"
+"Language-Team: Italian (Italy) (https://www.transifex.com/beremiz/teams/75746/it_IT/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: it_IT\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
+msgid ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "   External"
+msgstr "   External"
+
+#: ../controls/VariablePanel.py:89
+msgid "   InOut"
+msgstr "   InOut"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Input"
+msgstr "   Input"
+
+#: ../controls/VariablePanel.py:90
+msgid "   Local"
+msgstr "   Local"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Output"
+msgstr "   Output"
+
+#: ../controls/VariablePanel.py:91
+msgid "   Temp"
+msgstr "   Temp"
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
+#, python-format
+msgid " and %s"
+msgstr " e %s"
+
+#: ../ProjectController.py:1182
+msgid " generation failed !\n"
+msgstr " generazione fallita!\n"
+
+#: ../plcopen/plcopen.py:1029
+#, python-format
+msgid "\"%s\" Data Type doesn't exist !!!"
+msgstr "Il tipo di dato \"%s\" non esiste !!!"
+
+#: ../plcopen/plcopen.py:1047
+#, python-format
+msgid "\"%s\" POU already exists !!!"
+msgstr "La POU \"%s\" esiste già !!!"
+
+#: ../plcopen/plcopen.py:1068
+#, python-format
+msgid "\"%s\" POU doesn't exist !!!"
+msgstr "La POU \"%s\" non esiste !!!"
+
+#: ../editors/Viewer.py:288
+#, python-format
+msgid "\"%s\" can't use itself!"
+msgstr "\"%s\" non può utilizzare se stesso!"
+
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
+#, python-format
+msgid "\"%s\" config already exists!"
+msgstr "La config \"%s\" esiste già!"
+
+#: ../plcopen/plcopen.py:531
+#, python-format
+msgid "\"%s\" configuration already exists !!!"
+msgstr "La configurazione \"%s\" esiste già !!!"
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr ""
+
+#: ../IDEFrame.py:1638
+#, python-format
+msgid "\"%s\" data type already exists!"
+msgstr "Il tipo di dato \"%s\" esiste già!"
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
+#, python-format
+msgid "\"%s\" element for this pou already exists!"
+msgstr "L'elemento \"%s\" per questa pou esiste già!"
+
+#: ../BeremizIDE.py:928
+#, python-format
+msgid "\"%s\" folder is not a valid Beremiz project\n"
+msgstr "La cartella \"%s\" non è un valido progetto Beremiz\n"
+
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
+#, python-format
+msgid "\"%s\" is a keyword. It can't be used!"
+msgstr "\"%s\" è una parola chiave. Non può essere usata!"
+
+#: ../plcopen/plcopen.py:2836
+#, python-format
+msgid "\"%s\" is an invalid value!"
+msgstr "\"%s\" è un valore non valido!"
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
+msgid "\"%s\" is not a valid folder!"
+msgstr "\"%s\" non è una cartella valida!"
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
+#, python-format
+msgid "\"%s\" is not a valid identifier!"
+msgstr "\"%s\" non è un identificatore valido!"
+
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr "%s\" è utilizzato da una o più POU. Vuoi continuare?"
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
+#, python-format
+msgid "\"%s\" pou already exists!"
+msgstr "Il POU \"%s\" esiste già!"
+
+#: ../dialogs/SFCStepNameDialog.py:62
+#, python-format
+msgid "\"%s\" step already exists!"
+msgstr "Il passo \"%s\" esiste già!"
+
+#: ../editors/DataTypeEditor.py:566
+#, python-format
+msgid "\"%s\" value already defined!"
+msgstr "Il valore \"%s\" è già definito!"
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
+#, python-format
+msgid "\"%s\" value isn't a valid array dimension!"
+msgstr "Il valore \"%s\" non è una dimensione valida per un array!"
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
+#, python-format
+msgid ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+msgstr ""
+"Il valore \"%s\" non rappresenta una dimensione valida per un array!\n"
+"Il valore di destra deve essere maggiore del valore di sinistra."
+
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr "Funzione \"{a1}\" cancellata nel POU \"{a2}\": Nessun input connesso"
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr "\"{a1}\" è già utilizzato da \"{a2}\"!"
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr "La risorsa \"{a1}\" esiste già nella configurazione di \"{a2}\" !!!"
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr "La risorsa \"{a1}\" non esiste nella configurazione di \"{a2}\" !!!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr "%03g ms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr "%d d"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr "%d h"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr "%d m"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr "%d ms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr "%d s"
+
+#: ../PLCControler.py:1114
+#, python-format
+msgid "%s Data Types"
+msgstr "%s Data Types"
+
+#: ../PLCControler.py:1097
+#, python-format
+msgid "%s POUs"
+msgstr "%s POUs"
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
+#, python-format
+msgid "%s Profile"
+msgstr "%s Profilo"
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
+#, python-format
+msgid "%s body don't have instances!"
+msgstr "Il corpo di %s non contiene istanze!"
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
+#, python-format
+msgid "%s body don't have text!"
+msgstr "Il corpo di %s non contiene testo!"
+
+#: ../IDEFrame.py:388
+msgid "&Add Element"
+msgstr "&Aggiungi Elemento"
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr "&Chiudi"
+
+#: ../IDEFrame.py:361
+msgid "&Configuration"
+msgstr "&Configurazione"
+
+#: ../IDEFrame.py:350
+msgid "&Data Type"
+msgstr "&Data Type"
+
+#: ../IDEFrame.py:392
+msgid "&Delete"
+msgstr "&Cancella"
+
+#: ../IDEFrame.py:342
+msgid "&Display"
+msgstr "&Visualizzazione"
+
+#: ../IDEFrame.py:341
+msgid "&Edit"
+msgstr "&Modifica"
+
+#: ../IDEFrame.py:340
+msgid "&File"
+msgstr "&File"
+
+#: ../IDEFrame.py:352
+msgid "&Function"
+msgstr "&Funzione"
+
+#: ../IDEFrame.py:343
+msgid "&Help"
+msgstr "&Help"
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr "&Licenza"
+
+#: ../IDEFrame.py:356
+msgid "&Program"
+msgstr "&Programma"
+
+#: ../PLCOpenEditor.py:98
+msgid "&Properties"
+msgstr "&Proprietà"
+
+#: ../BeremizIDE.py:244
+msgid "&Recent Projects"
+msgstr "Progetti &recenti"
+
+#: ../IDEFrame.py:358
+msgid "&Resource"
+msgstr "&Risorse"
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr "{a1}' - {a2} corrispondenza nel progetto"
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr "'{a1}' - {a2} corrisponde nel progetto"
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr "'{a1}' si trova in {a2}\n"
+
+#: ../controls/SearchResultPanel.py:298
+#, python-format
+msgid "(%d matches)"
+msgstr "(%d corrisponde)"
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
+#, python-format
+msgid ", %s"
+msgstr ", %s"
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr ""
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr "1d"
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr "1h"
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr "1m"
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr "1s"
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+"Una POU contiene un elemento con nome \"%s\". Questo può causare un "
+"conflitto.Vuoi continuare?"
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
+#, python-format
+msgid "A POU named \"%s\" already exists!"
+msgstr "Esiste già una POU con nome \"%s\"!"
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr "Esiste già un figlio con nome \"{a1}\" -> \"{a2}\"\n"
+
+#: ../dialogs/BrowseLocationsDialog.py:229
+msgid "A location must be selected!"
+msgstr "Deve essere selezionata una locazione!"
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr "Esiste già un task con lo stesso nome!"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
+#, python-format
+msgid "A variable with \"%s\" as name already exists in this pou!"
+msgstr "Una variabile con \"1%s\" come nome è già esistente in questo POU!"
+
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr "Esiste già una variabile con il nome \"%s\"!"
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
+msgid "About"
+msgstr "Informazioni"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Absolute number"
+msgstr "Numero assoluto"
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
+msgid "Action"
+msgstr "Azione"
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
+msgid "Action Block"
+msgstr "Blocco azione"
+
+#: ../dialogs/PouActionDialog.py:89
+msgid "Action Name"
+msgstr "Nome dell'azione"
+
+#: ../dialogs/PouActionDialog.py:56
+msgid "Action Name:"
+msgstr "Nome dell'azione:"
+
+#: ../plcopen/plcopen.py:1567
+#, python-format
+msgid "Action with name %s doesn't exist!"
+msgstr "L'azione con il nome %s non esiste!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Actions"
+msgstr "Azioni"
+
+#: ../dialogs/ActionBlockDialog.py:139
+msgid "Actions:"
+msgstr "Azioni:"
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr "Attivo"
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
+msgid "Add"
+msgstr "Aggiungi"
+
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
+msgid "Add Action"
+msgstr "Aggiungi Azione"
+
+#: ../features.py:33
+msgid "Add C code accessing located variables synchronously"
+msgstr ""
+"Aggiungi codice C con accesso in modo sincrono alle variabili localizzate."
+
+#: ../IDEFrame.py:1907
+msgid "Add Configuration"
+msgstr "Aggiungi Configurazione"
+
+#: ../IDEFrame.py:1887
+msgid "Add DataType"
+msgstr "Aggiungi DataType"
+
+#: ../editors/Viewer.py:609
+msgid "Add Divergence Branch"
+msgstr "Aggiuni un ramo divergente"
+
+#: ../dialogs/DiscoveryDialog.py:121
+msgid "Add IP"
+msgstr "Aggiungi IP"
+
+#: ../IDEFrame.py:1895
+msgid "Add POU"
+msgstr "Aggiungi POU"
+
+#: ../features.py:34
+msgid "Add Python code executed asynchronously"
+msgstr "Aggiungi codice Python eseguito asincronomamente"
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
+msgid "Add Resource"
+msgstr "Aggiungi Risorsa"
+
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
+msgid "Add Transition"
+msgstr "Aggiungi Transazione"
+
+#: ../editors/Viewer.py:596
+msgid "Add Wire Segment"
+msgstr "Aggiungi un segmento di cavo"
+
+#: ../editors/SFCViewer.py:447
+msgid "Add a new initial step"
+msgstr "Aggiungi un nuovo salto iniziale"
+
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
+msgid "Add a new jump"
+msgstr "Aggiungi un nuovo salto"
+
+#: ../editors/SFCViewer.py:469
+msgid "Add a new step"
+msgstr "Aggiungi un nuovo passo"
+
+#: ../features.py:35
+msgid "Add a simple WxGlade based GUI."
+msgstr "Aggiungi una semplice GUI basata su WxGlade."
+
+#: ../dialogs/ActionBlockDialog.py:143
+msgid "Add action"
+msgstr "Aggiungi azione"
+
+#: ../editors/DataTypeEditor.py:364
+msgid "Add element"
+msgstr "Aggiungi elemento"
+
+#: ../editors/ResourceEditor.py:283
+msgid "Add instance"
+msgstr "Aggiungi instanza"
+
+#: ../canfestival/NetworkEditor.py:110
+msgid "Add slave"
+msgstr "Aggiungi slave"
+
+#: ../editors/ResourceEditor.py:252
+msgid "Add task"
+msgstr "Aggiungi task"
+
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
+msgid "Add variable"
+msgstr "Aggiungere variabile"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Addition"
+msgstr "Somma"
+
+#: ../plcopen/definitions.py:51
+msgid "Additional function blocks"
+msgstr "Blocchi funzione aggiuntivi"
+
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr "Modificare la dimensione del blocco"
+
+#: ../editors/Viewer.py:1720
+msgid "Alignment"
+msgstr "Allineamento"
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
+msgid "All"
+msgstr "Tutti"
+
+#: ../editors/FileManagementPanel.py:37
+msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+msgstr "Tutti i file (*.*)|*.*|CSV file (*.csv)|*.csv"
+
+#: ../ProjectController.py:1670
+msgid "Already connected. Please disconnect\n"
+msgstr "Già connesso. Per favore disconnettere\n"
+
+#: ../editors/DataTypeEditor.py:607
+#, python-format
+msgid "An element named \"%s\" already exists in this structure!"
+msgstr "Un elemento con nome \"%s\" esiste già in questa struttura!"
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr "Un instanza con lo stesso nome esiste già!"
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr "Applicare la modifica del nome a tutte le istanze con lo stesso nome"
+
+#: ../plcopen/iec_std.csv:31
+msgid "Arc cosine"
+msgstr "Arcocoseno"
+
+#: ../plcopen/iec_std.csv:30
+msgid "Arc sine"
+msgstr "Arcoseno"
+
+#: ../plcopen/iec_std.csv:32
+msgid "Arc tangent"
+msgstr "Arcotangente"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Arithmetic"
+msgstr "Aritmetica"
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
+msgid "Array"
+msgstr "Array"
+
+#: ../plcopen/iec_std.csv:39
+msgid "Assignment"
+msgstr "Assegnazione"
+
+#: ../dialogs/FBDVariableDialog.py:226
+msgid "At least a variable or an expression must be selected!"
+msgstr "Deve essere selezionata almeno una variabile o un'espressione!"
+
+#: ../controls/ProjectPropertiesPanel.py:111
+msgid "Author"
+msgstr "Autore"
+
+#: ../controls/ProjectPropertiesPanel.py:108
+msgid "Author Name (optional):"
+msgstr "Nome autore (opzionale):"
+
+#: ../dialogs/FindInPouDialog.py:80
+msgid "Backward"
+msgstr "Indietro"
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
+#, python-format
+msgid "Bad location size : %s"
+msgstr "Dimensione della locazione sbagliata; %s"
+
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
+msgid "Base Type:"
+msgstr "Tipo base:"
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
+msgid "Base Types"
+msgstr "Tipi base"
+
+#: ../BeremizIDE.py:483
+msgid "Beremiz"
+msgstr "Beremiz"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Binary selection (1 of 2)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Bit-shift"
+msgstr "Bit-shift"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise"
+msgstr "Bit a bit"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise AND"
+msgstr "AND bit a bit"
+
+#: ../plcopen/iec_std.csv:67
+msgid "Bitwise OR"
+msgstr "OR bit a bit"
+
+#: ../plcopen/iec_std.csv:68
+msgid "Bitwise XOR"
+msgstr "XOR bit a bit"
+
+#: ../plcopen/iec_std.csv:69
+msgid "Bitwise inverting"
+msgstr "Inversione bit a bit"
+
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
+msgid "Block"
+msgstr "Blocco"
+
+#: ../dialogs/FBDBlockDialog.py:63
+msgid "Block Properties"
+msgstr "Proprietà blocco"
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr "Nome blocco"
+
+#: ../editors/Viewer.py:586
+msgid "Bottom"
+msgstr "Sotto"
+
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr "Rotto"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
+msgid "Browse %s values library"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:72
+msgid "Browse Locations"
+msgstr ""
+
+#: ../ProjectController.py:1815
+msgid "Build"
+msgstr "Compila"
+
+#: ../ProjectController.py:1335
+msgid "Build directory already clean\n"
+msgstr "Cartella di compilazione già vuota\n"
+
+#: ../ProjectController.py:1816
+msgid "Build project into build folder"
+msgstr "Compila il progetto nella cartella di compilazione"
+
+#: ../ProjectController.py:1108
+msgid "C Build crashed !\n"
+msgstr "La compilazione C si è bloccata inaspettatamente !\n"
+
+#: ../ProjectController.py:1105
+msgid "C Build failed.\n"
+msgstr "Compilazione C fallita.\n"
+
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr "Codice C"
+
+#: ../ProjectController.py:1186
+msgid "C code generated successfully.\n"
+msgstr "Codice C generato con successo.\n"
+
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr "Compilazione C fallita.\n"
+
+#: ../targets/toolchain_gcc.py:199
+#, python-format
+msgid "C compilation of %s failed.\n"
+msgstr "La compilazione C di %s è fallita,\n"
+
+#: ../features.py:33
+msgid "C extension"
+msgstr "Estensione C"
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr "Ringraziamenti"
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr "Rete CANOpen"
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr "Slave CANOpen"
+
+#: ../features.py:31
+msgid "CANopen support"
+msgstr "Supporto CANopen"
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
+msgid "Can only generate execution order on FBD networks!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:291
+msgid "Can only give a location to local or global variables"
+msgstr ""
+
+#: ../PLCOpenEditor.py:318
+#, python-format
+msgid "Can't generate program to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:289
+msgid "Can't give a location to a function block instance"
+msgstr ""
+
+#: ../PLCOpenEditor.py:363
+#, python-format
+msgid "Can't save project to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:339
+msgid "Can't set an initial value to a function block instance"
+msgstr ""
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr ""
+
+#: ../ConfigTreeNode.py:454
+#, python-format
+msgid "Cannot find lower free IEC channel than %d\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:139
+msgid "Cannot get PLC status - connection failed.\n"
+msgstr ""
+
+#: ../ProjectController.py:967
+msgid "Cannot open/parse VARIABLES.csv!\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
+msgid "Case sensitive"
+msgstr ""
+
+#: ../editors/Viewer.py:581
+msgid "Center"
+msgstr ""
+
+#: ../Beremiz_service.py:276
+msgid "Change IP of interface to bind"
+msgstr ""
+
+#: ../Beremiz_service.py:275
+msgid "Change Name"
+msgstr "Cambiare Nome"
+
+#: ../IDEFrame.py:1977
+msgid "Change POU Type To"
+msgstr ""
+
+#: ../Beremiz_service.py:277
+msgid "Change Port Number"
+msgstr ""
+
+#: ../Beremiz_service.py:278
+msgid "Change working directory"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Character string"
+msgstr "Stringa di caratteri"
+
+#: ../svgui/svgui.py:136
+msgid "Choose a SVG file"
+msgstr "Scegliere un file SVG"
+
+#: ../ProjectController.py:561
+msgid "Choose a directory to save project"
+msgstr "Scegliere una cartella per salvare il progetto"
+
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
+msgid "Choose a file"
+msgstr "Scegliere n file"
+
+#: ../BeremizIDE.py:900
+msgid "Choose a project"
+msgstr "Scegliere un progetto"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
+msgid "Choose a value for %s:"
+msgstr "Scegliere un valore per %s:"
+
+#: ../Beremiz_service.py:333
+msgid "Choose a working directory "
+msgstr "Selezionare una cartella di lavoro "
+
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr ""
+
+#: ../ProjectController.py:468
+msgid "Chosen folder doesn't contain a program. It's not a valid project!"
+msgstr ""
+
+#: ../ProjectController.py:435
+msgid "Chosen folder isn't empty. You can't use it for a new project!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:60
+msgid "Class"
+msgstr "Classe"
+
+#: ../controls/VariablePanel.py:472
+msgid "Class Filter:"
+msgstr "Filtro Classi:"
+
+#: ../dialogs/FBDVariableDialog.py:74
+msgid "Class:"
+msgstr "Classe:"
+
+#: ../ProjectController.py:1821
+msgid "Clean"
+msgstr "Pulisci"
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr "Cancella i messaggi di log"
+
+#: ../ProjectController.py:1822
+msgid "Clean project build folder"
+msgstr "Pulisci la cartella di compilazione del progetto"
+
+#: ../ProjectController.py:1332
+msgid "Cleaning the build directory\n"
+msgstr "Cancellando la cartella di compilazione\n"
+
+#: ../IDEFrame.py:437
+msgid "Clear Errors"
+msgstr "Cancella gli Errori"
+
+#: ../editors/Viewer.py:680
+msgid "Clear Execution Order"
+msgstr "Pulisci l'Ordine di Esecuzione"
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr "Chiusi"
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
+msgid "Close Application"
+msgstr "Chiudi Applicazione"
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
+msgid "Close Project"
+msgstr "Chiudi Progetto"
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
+msgid "Close Tab"
+msgstr "Chiudi Tab"
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
+msgid "Coil"
+msgstr "Bobina"
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
+msgid "Comment"
+msgstr "Commento"
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr "Supporto della community"
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr "Nome dell'azienda"
+
+#: ../controls/ProjectPropertiesPanel.py:106
+msgid "Company Name (required):"
+msgstr "Nome dell'azienda (necessario):"
+
+#: ../controls/ProjectPropertiesPanel.py:107
+msgid "Company URL (optional):"
+msgstr "Indirizzo web dell'azienda (opzionale):"
+
+#: ../plcopen/iec_std.csv:75
+msgid "Comparison"
+msgstr "Comparazione"
+
+#: ../ProjectController.py:756
+msgid "Compiling IEC Program into C code...\n"
+msgstr "Compilando il IEC Programma IEC in codice C...\n"
+
+#: ../plcopen/iec_std.csv:85
+msgid "Concatenation"
+msgstr "Concatenazione"
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr "Configurazione"
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr "Configurazione varialibi"
+
+#: ../dialogs/SearchInProjectDialog.py:43
+msgid "Configuration"
+msgstr "Configurazione"
+
+#: ../plcopen/types_enums.py:77
+msgid "Configurations"
+msgstr "Configurazioni"
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr "Conferma o cambia il nome della variabile"
+
+#: ../ProjectController.py:1842
+msgid "Connect"
+msgstr "Connetti"
+
+#: ../ProjectController.py:1843
+msgid "Connect to the target PLC"
+msgstr "Connetti al PLC target"
+
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr "Connetti all URI: %s"
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
+msgid "Connection"
+msgstr "Connessione"
+
+#: ../dialogs/ConnectionDialog.py:55
+msgid "Connection Properties"
+msgstr "Proprietà della Connessione"
+
+#: ../ProjectController.py:1691
+msgid "Connection canceled!\n"
+msgstr "Connessione cancellata!\n"
+
+#: ../ProjectController.py:1714
+#, python-format
+msgid "Connection failed to %s!\n"
+msgstr "Connessione a %s fallita!\n"
+
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr "Connessione persa!\n"
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
+msgid "Connection to '%s' failed.\n"
+msgstr "Connessione a '%s' fallita.\n"
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
+msgid "Connector"
+msgstr "Connettore"
+
+#: ../dialogs/SFCStepDialog.py:68
+msgid "Connectors:"
+msgstr "Connettori:"
+
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr "Console"
+
+#: ../controls/VariablePanel.py:75
+msgid "Constant"
+msgstr "Costante"
+
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
+msgid "Contact"
+msgstr "Contatto"
+
+#: ../controls/ProjectPropertiesPanel.py:217
+msgid "Content Description (optional):"
+msgstr "Descrizione del contenuto (opzionale):"
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
+msgid "Continuation"
+msgstr "Continuazione"
+
+#: ../plcopen/iec_std.csv:18
+msgid "Conversion from BCD"
+msgstr "Conversione da BCD"
+
+#: ../plcopen/iec_std.csv:19
+msgid "Conversion to BCD"
+msgstr "Conversione a BCD"
+
+#: ../plcopen/iec_std.csv:21
+msgid "Conversion to date"
+msgstr "Conversione a data"
+
+#: ../plcopen/iec_std.csv:20
+msgid "Conversion to time-of-day"
+msgstr "Conversione a 'ora del giorno'"
+
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
+msgid "Copy"
+msgstr "Copia"
+
+#: ../IDEFrame.py:1964
+msgid "Copy POU"
+msgstr "Copia POU"
+
+#: ../editors/FileManagementPanel.py:68
+msgid "Copy file from left folder to right"
+msgstr "Copia il file dalla cartella di sinistra a quella di destra"
+
+#: ../editors/FileManagementPanel.py:67
+msgid "Copy file from right folder to left"
+msgstr "Copia il file dalla cartella di destra a quella di sinistra"
+
+#: ../plcopen/iec_std.csv:28
+msgid "Cosine"
+msgstr "Coseno"
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+"Non è possibile aggiungere un figlio \"{a1}\",tipo {a2}:\n"
+"{a3}\n"
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr "Impossibile importare il vecchio file %s."
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Impossibile caricare i parametri confnode di base {a1} :\n"
+" {a2}"
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Impossibile caricare i parametri confnode {a1} :\n"
+" {a2}"
+
+#: ../PLCControler.py:552
+msgid "Couldn't paste non-POU object."
+msgstr "Impossibile incollare un oggetto non-POU."
+
+#: ../ProjectController.py:1636
+msgid "Couldn't start PLC !\n"
+msgstr "Impossibile avviare il PLC !\n"
+
+#: ../ProjectController.py:1644
+msgid "Couldn't stop PLC !\n"
+msgstr "Impossibile arrestare il PLC !\n"
+
+#: ../svgui/svgui.py:57
+msgid "Create HMI"
+msgstr "Creare HMI"
+
+#: ../dialogs/PouDialog.py:54
+msgid "Create a new POU"
+msgstr "Creare un nuovo POU"
+
+#: ../dialogs/PouActionDialog.py:45
+msgid "Create a new action"
+msgstr "Creare una nuova azione"
+
+#: ../IDEFrame.py:166
+msgid "Create a new action block"
+msgstr "Creare un nuovo blocco azione"
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
+msgid "Create a new block"
+msgstr "Creare un nuovo blocco"
+
+#: ../IDEFrame.py:139
+msgid "Create a new branch"
+msgstr "Creare una nuova diramazione"
+
+#: ../IDEFrame.py:133
+msgid "Create a new coil"
+msgstr "Creare una nuovo relè"
+
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
+msgid "Create a new comment"
+msgstr "Creare un nuovo commento"
+
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
+msgid "Create a new connection"
+msgstr "Creare una nuova connessione"
+
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
+msgid "Create a new contact"
+msgstr "Creare un nuovo contatto"
+
+#: ../IDEFrame.py:169
+msgid "Create a new divergence"
+msgstr "Creare una nuova divergenza"
+
+#: ../dialogs/SFCDivergenceDialog.py:54
+msgid "Create a new divergence or convergence"
+msgstr "Creare una nuova divergenza o convergenza"
+
+#: ../IDEFrame.py:157
+msgid "Create a new initial step"
+msgstr "Creare un nuovo passo iniziale"
+
+#: ../IDEFrame.py:172
+msgid "Create a new jump"
+msgstr "Creare un nuovo salto"
+
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
+msgid "Create a new power rail"
+msgstr "Creare una nuova barra di alimentazione"
+
+#: ../IDEFrame.py:130
+msgid "Create a new rung"
+msgstr "Crea un nuovo anello"
+
+#: ../IDEFrame.py:160
+msgid "Create a new step"
+msgstr "Creare un nuovo passo"
+
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
+msgid "Create a new transition"
+msgstr "Creare una nuova transizione"
+
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
+msgid "Create a new variable"
+msgstr "Creare una nuova variabile"
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr "Ringraziamenti"
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr "Cartella di lavoro corrente :"
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
+msgid "Cut"
+msgstr "Taglia"
+
+#: ../editors/ResourceEditor.py:81
+msgid "Cyclic"
+msgstr "Ciclico"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:60
+msgid "DEPRECATED"
+msgstr "DEPRECATO"
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
+msgid "DS-301 Profile"
+msgstr "Profilo DS-301"
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
+msgid "DS-302 Profile"
+msgstr "Profilo DS-302"
+
+#: ../dialogs/SearchInProjectDialog.py:39
+msgid "Data Type"
+msgstr "Tipo di dato"
+
+#: ../plcopen/types_enums.py:76
+msgid "Data Types"
+msgstr "Tipi di dato"
+
+#: ../plcopen/iec_std.csv:16
+msgid "Data type conversion"
+msgstr "Conversione tipi di dato"
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
+msgid "Date addition"
+msgstr "Addizione della data"
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
+msgid "Date and time subtraction"
+msgstr "Sottrazione tra data e tempo"
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
+msgid "Date subtraction"
+msgstr "Sottrazzione della data"
+
+#: ../dialogs/DurationEditorDialog.py:46
+msgid "Days:"
+msgstr "Giorni:"
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr ""
+"Il debug non corrisponde al PLC arresta/trasferisci/avvia per riabilitare\n"
+
+#: ../controls/PouInstanceVariablesPanel.py:144
+msgid "Debug instance"
+msgstr "Istanza di Debug"
+
+#: ../editors/Viewer.py:490
+#, python-format
+msgid "Debug: %s"
+msgstr "Debug: %s"
+
+#: ../ProjectController.py:1471
+#, python-format
+msgid "Debug: Unknown variable '%s'\n"
+msgstr "Debug: Variabile sconosciuta '%s'\n"
+
+#: ../ProjectController.py:1469
+#, python-format
+msgid "Debug: Unsupported type to debug '%s'\n"
+msgstr "Debug: Tipo non supportato per il debug '%s'\n"
+
+#: ../IDEFrame.py:660
+msgid "Debugger"
+msgstr "Debugger"
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr "Debugger pronto\n"
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
+msgid "Delete"
+msgstr "Eliminare"
+
+#: ../editors/Viewer.py:610
+msgid "Delete Divergence Branch"
+msgstr "Eliminare la ramificazione divergente"
+
+#: ../editors/FileManagementPanel.py:157
+msgid "Delete File"
+msgstr "Eliminare File"
+
+#: ../editors/Viewer.py:597
+msgid "Delete Wire Segment"
+msgstr "Eliminare un segmento di filo"
+
+#: ../controls/CustomEditableListBox.py:44
+msgid "Delete item"
+msgstr "Eliminare elemento"
+
+#: ../plcopen/iec_std.csv:88
+msgid "Deletion (within)"
+msgstr "Eliminazione (nei limiti)"
+
+#: ../editors/DataTypeEditor.py:161
+msgid "Derivation Type:"
+msgstr "Tipo di derivazione:"
+
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr "Descrizione"
+
+#: ../controls/VariablePanel.py:463
+msgid "Description:"
+msgstr "Descrizione:"
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
+msgid "Dimensions:"
+msgstr "Dimensioni:"
+
+#: ../dialogs/FindInPouDialog.py:69
+msgid "Direction"
+msgstr "Direzione"
+
+#: ../dialogs/BrowseLocationsDialog.py:102
+msgid "Direction:"
+msgstr "Direzione:"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Directly"
+msgstr "Direttamente"
+
+#: ../ProjectController.py:1855
+msgid "Disconnect"
+msgstr "Disconnetti"
+
+#: ../ProjectController.py:1856
+msgid "Disconnect from PLC"
+msgstr "Disconnetti dal PLC"
+
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr "Disconnesso"
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
+msgid "Divergence"
+msgstr "Divergenza"
+
+#: ../plcopen/iec_std.csv:36
+msgid "Division"
+msgstr "Divisione"
+
+#: ../editors/FileManagementPanel.py:156
+#, python-format
+msgid "Do you really want to delete the file '%s'?"
+msgstr "Vuoi veramente rimuovere il file '%s'?"
+
+#: ../controls/VariablePanel.py:65
+msgid "Documentation"
+msgstr "Documentazione"
+
+#: ../PLCOpenEditor.py:312
+msgid "Done"
+msgstr "Fatto"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Duration"
+msgstr "Durata"
+
+#: ../canfestival/canfestival.py:174
+msgid "EDS files (*.eds)|*.eds|All files|*.*"
+msgstr "EDS files (*.eds)|*.eds|All files|*.*"
+
+#: ../editors/Viewer.py:668
+msgid "Edit Block"
+msgstr "Edita il Blocco"
+
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr "Edita i valori del relè"
+
+#: ../dialogs/LDElementDialog.py:56
+msgid "Edit Contact Values"
+msgstr "Edita i valori del contatto"
+
+#: ../dialogs/DurationEditorDialog.py:62
+msgid "Edit Duration"
+msgstr "Edita la durata"
+
+#: ../dialogs/SFCStepDialog.py:53
+msgid "Edit Step"
+msgstr "Edita il passo"
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
+msgid "Edit a WxWidgets GUI with WXGlade"
+msgstr "Edita una GUI WxWidgets con WXGlade"
+
+#: ../dialogs/ActionBlockDialog.py:127
+msgid "Edit action block properties"
+msgstr "Edita le proprietà del blocco azione"
+
+#: ../dialogs/ArrayTypeDialog.py:47
+msgid "Edit array type properties"
+msgstr "Edita le proprietà del tipo array"
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
+msgid "Edit comment"
+msgstr "Edita commento"
+
+#: ../editors/FileManagementPanel.py:69
+msgid "Edit file"
+msgstr "Edita file"
+
+#: ../controls/CustomEditableListBox.py:42
+msgid "Edit item"
+msgstr "Edita elemento"
+
+#: ../editors/Viewer.py:3059
+msgid "Edit jump target"
+msgstr "Edita la destinazione del salto"
+
+#: ../ProjectController.py:1873
+msgid "Edit raw IEC code added to code generated by PLCGenerator"
+msgstr ""
+"Edita il codice IEC grezzo aggiunto al codice generato da PLCGenerator"
+
+#: ../editors/SFCViewer.py:815
+msgid "Edit step name"
+msgstr "Edita il nome del passo"
+
+#: ../dialogs/SFCTransitionDialog.py:53
+msgid "Edit transition"
+msgstr "Edita transizione"
+
+#: ../IDEFrame.py:632
+msgid "Editor ToolBar"
+msgstr "Editor ToolBar"
+
+#: ../ProjectController.py:1294
+msgid "Editor selection"
+msgstr "Selezione dell'editor"
+
+#: ../editors/DataTypeEditor.py:360
+msgid "Elements :"
+msgstr "Elementi :"
+
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr "Vuoto"
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr ""
+
+#: ../Beremiz_service.py:341
+msgid "Enter a name "
+msgstr "Inserisci un nome "
+
+#: ../Beremiz_service.py:326
+msgid "Enter a port number "
+msgstr "Inserisci il numero di una porta "
+
+#: ../Beremiz_service.py:317
+msgid "Enter the IP of the interface to bind"
+msgstr "Inserisci l'IP dell'interfaccia da collegare"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Enumerated"
+msgstr "Enum"
+
+#: ../plcopen/iec_std.csv:77
+msgid "Equal to"
+msgstr "Uguale a"
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
+msgid "Error"
+msgstr "Errore"
+
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+"Errore : Almeno una configurazione ed una risorsa devono essere dichiarate "
+"nel PLC!\n"
+
+#: ../ProjectController.py:803
+#, python-format
+msgid "Error : IEC to C compiler returned %d\n"
+msgstr "Errore : il compilatore da IEC a C ha ritornato il codice %d\n"
+
+#: ../ProjectController.py:731
+#, python-format
+msgid ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+msgstr ""
+
+#: ../ConfigTreeNode.py:219
+#, python-format
+msgid "Error while saving \"%s\"\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:179
+msgid "Error: Export slave failed\n"
+msgstr ""
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:388
+msgid "Error: No Master generated\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:383
+msgid "Error: No PLC built\n"
+msgstr ""
+
+#: ../ProjectController.py:1708
+#, python-format
+msgid "Exception while connecting %s!\n"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:123
+msgid "Execution Control:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
+msgid "Execution Order:"
+msgstr ""
+
+#: ../features.py:36
+msgid "Experimental web based HMI"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:38
+msgid "Exponent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:26
+msgid "Exponentiation"
+msgstr ""
+
+#: ../canfestival/canfestival.py:186
+msgid "Export CanOpen slave to EDS file"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
+msgid "Export graph values to clipboard"
+msgstr ""
+
+#: ../canfestival/canfestival.py:185
+msgid "Export slave"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:94
+msgid "Expression:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "External"
+msgstr ""
+
+#: ../ProjectController.py:826
+msgid "Extracting Located Variables...\n"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "FBD"
+msgstr ""
+
+#: ../ProjectController.py:1773
+msgid "Failed : Must build before transfer.\n"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
+msgid "Falling Edge"
+msgstr ""
+
+#: ../ProjectController.py:1098
+msgid "Fatal : cannot get builder.\n"
+msgstr ""
+
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
+msgid "Field %s hasn't a valid value!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
+msgid "Fields %s haven't a valid value!"
+msgstr ""
+
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
+msgid "Find"
+msgstr ""
+
+#: ../IDEFrame.py:379
+msgid "Find Next"
+msgstr ""
+
+#: ../IDEFrame.py:381
+msgid "Find Previous"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:90
+msgid "Find position"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:58
+msgid "Find:"
+msgstr ""
+
+#: ../editors/Viewer.py:1633
+msgid "Force value"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:176
+msgid "Forcing Variable Value"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
+#, python-format
+msgid "Form isn't complete. %s must be filled!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
+msgid "Form isn't complete. Name must be filled!"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:235
+msgid "Form isn't complete. Valid block type must be selected!"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:75
+msgid "Forward"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
+msgid "Function"
+msgstr ""
+
+#: ../IDEFrame.py:354
+msgid "Function &Block"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
+msgid "Function Block"
+msgstr ""
+
+#: ../controls/VariablePanel.py:868
+msgid "Function Block Types"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Function Blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:290
+msgid "Function Blocks can't be used in Functions!"
+msgstr ""
+
+#: ../PLCControler.py:1907
+#, python-format
+msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Functions"
+msgstr ""
+
+#: ../PLCOpenEditor.py:88
+msgid "Generate Program"
+msgstr ""
+
+#: ../ProjectController.py:722
+msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Global"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
+msgid "Go to current value"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:189
+msgid "Graphics"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Greater than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:76
+msgid "Greater than or equal to"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:149
+msgid "Grid Resolution:"
+msgstr ""
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:135
+msgid "Height:"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:89
+msgid "Home Directory:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:165
+msgid "Horizontal:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:47
+msgid "Hours:"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "IL"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr ""
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
+msgid "IP is not valid!"
+msgstr ""
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
+msgid "Import SVG"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
+msgid "InOut"
+msgstr ""
+
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr ""
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:306
+#, python-format
+msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Indicator"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr ""
+
+#: ../editors/Viewer.py:650
+msgid "Initial Step"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
+msgid "Initial Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
+msgid "Initial Value:"
+msgstr ""
+
+#: ../svgui/svgui.py:56
+msgid "Inkscape"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
+msgid "Inline"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Input"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:99
+msgid "Inputs:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:87
+msgid "Insertion (into)"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1948
+#, python-format
+msgid "Instance with id %d doesn't exist!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:279
+msgid "Instances:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:88
+msgid "Interface"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Interrupt"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Interval"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+
+#: ../PLCControler.py:1895
+msgid "Invalid plcopen element(s)!!!"
+msgstr ""
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr ""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
+#, python-format
+msgid "Invalid value \"%s\" for debug variable"
+msgstr ""
+
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
+msgid "Invalid value \"%s\" for variable grid element"
+msgstr ""
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
+#, python-format
+msgid "Invalid value \"%s\" for viewer block"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:124
+msgid ""
+"Invalid value!\n"
+"You must fill a numeric value."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr ""
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
+msgid "Jump"
+msgstr "Salto"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "LD"
+msgstr "LD"
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
+#, python-format
+msgid "Ladder element with id %d is on more than one rung."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
+msgid "Language"
+msgstr "Lingua"
+
+#: ../controls/ProjectPropertiesPanel.py:206
+msgid "Language (optional):"
+msgstr "Lingua (opzionale):"
+
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
+msgid "Language:"
+msgstr "Lingua:"
+
+#: ../ProjectController.py:1779
+msgid "Latest build already matches current target. Transfering anyway...\n"
+msgstr ""
+
+#: ../Beremiz_service.py:281
+msgid "Launch WX GUI inspector"
+msgstr ""
+
+#: ../Beremiz_service.py:280
+msgid "Launch a live Python shell"
+msgstr ""
+
+#: ../editors/Viewer.py:580
+msgid "Left"
+msgstr "Sinistra"
+
+#: ../dialogs/LDPowerRailDialog.py:64
+msgid "Left PowerRail"
+msgstr "Barra di potenza di sinistra"
+
+#: ../plcopen/iec_std.csv:81
+msgid "Length of string"
+msgstr "Lunghezza della stringa"
+
+#: ../plcopen/iec_std.csv:78
+msgid "Less than"
+msgstr "Inferiore a"
+
+#: ../plcopen/iec_std.csv:79
+msgid "Less than or equal to"
+msgstr "Inferiore o uguale a"
+
+#: ../IDEFrame.py:652
+msgid "Library"
+msgstr "Libreria"
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr "Licenza"
+
+#: ../plcopen/iec_std.csv:73
+msgid "Limitation"
+msgstr "Limitazione"
+
+#: ../targets/toolchain_gcc.py:209
+msgid "Linking :\n"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
+msgid "Local"
+msgstr "Locale"
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr "Valori locali"
+
+#: ../ProjectController.py:1685
+msgid "Local service discovery failed!\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:62
+msgid "Location"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:79
+msgid "Locations available:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:25
+msgid "Logarithm to base 10"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:102
+#, python-format
+msgid "MDNS resolution failure for '%s'\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
+msgid "Map Variable"
+msgstr ""
+
+#: ../features.py:31
+msgid "Map located variables over CANopen"
+msgstr ""
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:113
+msgid "Master"
+msgstr "Master"
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr ""
+
+#: ../plcopen/iec_std.csv:71
+msgid "Maximum"
+msgstr "Massimo"
+
+#: ../editors/DataTypeEditor.py:246
+msgid "Maximum:"
+msgstr "Massimo:"
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Memory"
+msgstr "Memoria"
+
+#: ../IDEFrame.py:617
+msgid "Menu ToolBar"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:51
+msgid "Microseconds:"
+msgstr "Microsecondi:"
+
+#: ../editors/Viewer.py:585
+msgid "Middle"
+msgstr "Centro"
+
+#: ../dialogs/DurationEditorDialog.py:50
+msgid "Milliseconds:"
+msgstr "Millisecondi:"
+
+#: ../plcopen/iec_std.csv:72
+msgid "Minimum"
+msgstr "Minimo"
+
+#: ../editors/DataTypeEditor.py:233
+msgid "Minimum:"
+msgstr "Minimo:"
+
+#: ../dialogs/DurationEditorDialog.py:48
+msgid "Minutes:"
+msgstr "Minuti:"
+
+#: ../controls/ProjectPropertiesPanel.py:231
+msgid "Miscellaneous"
+msgstr "Miscellanea"
+
+#: ../features.py:32
+msgid "Modbus support"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:65
+msgid "Modifier:"
+msgstr "Modificatore:"
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:146
+msgid "Move action down"
+msgstr "Azione muovi verso il basso"
+
+#: ../dialogs/ActionBlockDialog.py:145
+msgid "Move action up"
+msgstr "Azione muovi verso l'alto"
+
+#: ../controls/CustomEditableListBox.py:46
+msgid "Move down"
+msgstr "Muovi verso il basso"
+
+#: ../editors/DataTypeEditor.py:367
+msgid "Move element down"
+msgstr "Muovi elemento verso il basso"
+
+#: ../editors/DataTypeEditor.py:366
+msgid "Move element up"
+msgstr "Muovi elemento verso l'alto"
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr "Muovi l'istanza versio il basso"
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr "Muovi l'istanza verso l'alto"
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr "Muovi il task verso il basso"
+
+#: ../editors/ResourceEditor.py:254
+msgid "Move task up"
+msgstr "Muovi il task verso l'alto"
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
+msgid "Move the view"
+msgstr "Muovi la vista"
+
+#: ../controls/CustomEditableListBox.py:45
+msgid "Move up"
+msgstr "Muovi vero l'alto"
+
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
+msgid "Move variable down"
+msgstr "Muovi la variabile verso il basso"
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
+msgid "Move variable up"
+msgstr "Muovi la variabile verso l'alto"
+
+#: ../plcopen/iec_std.csv:74
+msgid "Multiplexer (select 1 of N)"
+msgstr "Moltiplicatore (seleziona 1 of N)"
+
+#: ../plcopen/iec_std.csv:34
+msgid "Multiplication"
+msgstr "Moltiplicazione"
+
+#: ../editors/FileManagementPanel.py:87
+msgid "My Computer:"
+msgstr "Il mio Computer:"
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr "NOME"
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
+#: ../controls/VariablePanel.py:59
+msgid "Name"
+msgstr "Nome"
+
+#: ../Beremiz_service.py:342
+msgid "Name must not be null!"
+msgstr "Il nome non deve essere vuoto!"
+
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
+msgid "Name:"
+msgstr "Nome:"
+
+#: ../plcopen/iec_std.csv:24
+msgid "Natural logarithm"
+msgstr "Logaritmo naturale"
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
+msgid "Negated"
+msgstr "Negato"
+
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr ""
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
+msgid "New"
+msgstr "Nuovo"
+
+#: ../controls/CustomEditableListBox.py:43
+msgid "New item"
+msgstr "Nuovo elemento"
+
+#: ../editors/Viewer.py:553
+msgid "No Modifier"
+msgstr "No modificatore"
+
+#: ../ProjectController.py:1808
+msgid "No PLC to transfer (did build succeed ?)\n"
+msgstr ""
+
+#: ../PLCGenerator.py:1678
+#, python-format
+msgid "No body defined in \"%s\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCOpenEditor.py:331
+msgid ""
+"No documentation available.\n"
+"Coming soon."
+msgstr ""
+
+#: ../PLCGenerator.py:841
+#, python-format
+msgid "No informations found for \"%s\" block"
+msgstr ""
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:175
+msgid "No search results available."
+msgstr ""
+
+#: ../svgui/svgui.py:142
+#, python-format
+msgid "No such SVG file: %s\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr ""
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+msgid "No valid value selected!"
+msgstr ""
+
+#: ../PLCGenerator.py:1676
+#, python-format
+msgid "No variable defined in \"%s\" POU"
+msgstr ""
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr ""
+
+#: ../controls/VariablePanel.py:79
+msgid "Non-Retain"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78
+msgid "Normal"
+msgstr "Normale"
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:80
+msgid "Not equal to"
+msgstr "Non uguale a"
+
+#: ../dialogs/SFCDivergenceDialog.py:91
+msgid "Number of sequences:"
+msgstr "Numero di sequenze:"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Numerical"
+msgstr "Numerico"
+
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:88
+msgid "Only Elements"
+msgstr "Solo elementi"
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
+msgid "Open"
+msgstr "Apri"
+
+#: ../svgui/svgui.py:151
+msgid "Open Inkscape"
+msgstr "Apri Inkscape"
+
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+
+#: ../ProjectController.py:1879
+msgid "Open a file explorer to manage project files"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
+msgid "Open wxGlade"
+msgstr "Apri wxGlade"
+
+#: ../controls/VariablePanel.py:64
+msgid "Option"
+msgstr "Opzione"
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
+msgid "Options"
+msgstr "Opzioni"
+
+#: ../controls/ProjectPropertiesPanel.py:109
+msgid "Organization (optional):"
+msgstr "Organizzazione (opzionale):"
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
+msgid "Other Profile"
+msgstr "Altro profilo"
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Output"
+msgstr "Output"
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
+msgid "PDO Receive"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
+msgid "PDO Transmit"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:174
+msgid "PLC :\n"
+msgstr "PLC :\n"
+
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr "PLC Log"
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr "Generazione del codice PLC fallita !\n"
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr "PLC vuoto o già avviato."
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr "PLC non avviato."
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
+msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
+msgstr ""
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
+msgid "PLCOpenEditor"
+msgstr "PLCOpenEditor"
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr "PORTA"
+
+#: ../dialogs/PouDialog.py:109
+msgid "POU Name"
+msgstr "Nome POU"
+
+#: ../dialogs/PouDialog.py:66
+msgid "POU Name:"
+msgstr "Nome POU:"
+
+#: ../dialogs/PouDialog.py:111
+msgid "POU Type"
+msgstr "Tipo POU"
+
+#: ../dialogs/PouDialog.py:73
+msgid "POU Type:"
+msgstr "Tipo POU:"
+
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr ""
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
+msgid "Page Setup"
+msgstr "Impostazioni pagina"
+
+#: ../controls/ProjectPropertiesPanel.py:124
+msgid "Page Size (optional):"
+msgstr "Dimensione pagina ()opzionale:"
+
+#: ../IDEFrame.py:2640
+#, python-format
+msgid "Page: %d"
+msgstr "Pagina: %d"
+
+#: ../controls/PouInstanceVariablesPanel.py:134
+msgid "Parent instance"
+msgstr "Istanza padre"
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
+msgid "Paste"
+msgstr "Incolla"
+
+#: ../IDEFrame.py:1899
+msgid "Paste POU"
+msgstr "Incolla POU"
+
+#: ../dialogs/SearchInProjectDialog.py:60
+msgid "Pattern to search:"
+msgstr "Pattern da cercare:"
+
+#: ../dialogs/LDPowerRailDialog.py:75
+msgid "Pin number:"
+msgstr "Numero di pin:"
+
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
+msgid "Please choose a target"
+msgstr "Per favore indicare un target"
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr ""
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
+msgid "Please enter comment text"
+msgstr ""
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
+msgid "Please enter step name"
+msgstr ""
+
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
+msgid "Please enter value for a \"%s\" variable:"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be 0 <= port <= 65535!"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be an integer!"
+msgstr ""
+
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
+msgid "Power Rail"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:52
+msgid "Power Rail Properties"
+msgstr ""
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
+msgid "Preview"
+msgstr ""
+
+#: ../dialogs/BlockPreviewDialog.py:59
+msgid "Preview:"
+msgstr ""
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
+msgid "Print"
+msgstr "Stampa"
+
+#: ../IDEFrame.py:1110
+msgid "Print preview"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Priority"
+msgstr "Priorità"
+
+#: ../dialogs/SFCTransitionDialog.py:91
+msgid "Priority:"
+msgstr "Priorità:"
+
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr "Problema durante l'avvio del PLC : errore %d"
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr "Nome prodotto"
+
+#: ../controls/ProjectPropertiesPanel.py:90
+msgid "Product Name (required):"
+msgstr "Nome prodotto (necessario):"
+
+#: ../controls/ProjectPropertiesPanel.py:92
+msgid "Product Release (optional):"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:91
+msgid "Product Version (required):"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
+msgid "Program"
+msgstr "Programma"
+
+#: ../PLCOpenEditor.py:321
+msgid "Program was successfully generated!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Programs"
+msgstr "Programmi"
+
+#: ../editors/Viewer.py:285
+msgid "Programs can't be used by other POUs!"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
+msgid "Project"
+msgstr "Progetto"
+
+#: ../controls/SearchResultPanel.py:180
+#, python-format
+msgid "Project '%s':"
+msgstr ""
+
+#: ../ProjectController.py:1878
+msgid "Project Files"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:88
+msgid "Project Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:89
+msgid "Project Version (optional):"
+msgstr ""
+
+#: ../PLCControler.py:2717
+msgid ""
+"Project file syntax error:\n"
+"\n"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
+msgid "Project properties"
+msgstr ""
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Properties"
+msgstr ""
+
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr ""
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr ""
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr ""
+
+#: ../features.py:34
+msgid "Python file"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Qualifier"
+msgstr ""
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
+msgid "Quit"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
+msgid "Range:"
+msgstr ""
+
+#: ../ProjectController.py:1872
+msgid "Raw IEC code"
+msgstr ""
+
+#: ../BeremizIDE.py:1083
+#, python-format
+msgid "Really delete node '%s'?"
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
+msgid "Redo"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:76
+msgid "Reference"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
+msgid "Refresh"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:70
+msgid "Regular expression"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:99
+msgid "Regular expressions"
+msgstr ""
+
+#: ../editors/Viewer.py:1636
+msgid "Release value"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:37
+msgid "Remainder (modulo)"
+msgstr ""
+
+#: ../BeremizIDE.py:1084
+#, python-format
+msgid "Remove %s node"
+msgstr ""
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr ""
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:144
+msgid "Remove action"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:365
+msgid "Remove element"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:66
+msgid "Remove file from left folder"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:284
+msgid "Remove instance"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:111
+msgid "Remove slave"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:253
+msgid "Remove task"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
+msgid "Remove variable"
+msgstr ""
+
+#: ../IDEFrame.py:1979
+msgid "Rename"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:187
+msgid "Replace File"
+msgstr ""
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:89
+msgid "Replacement (within)"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Reset"
+msgstr ""
+
+#: ../editors/Viewer.py:681
+msgid "Reset Execution Order"
+msgstr ""
+
+#: ../IDEFrame.py:453
+msgid "Reset Perspective"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:103
+msgid "Reset search result"
+msgstr ""
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
+msgid "Resources"
+msgstr ""
+
+#: ../controls/VariablePanel.py:77
+msgid "Retain"
+msgstr ""
+
+#: ../controls/VariablePanel.py:455
+msgid "Return Type:"
+msgstr ""
+
+#: ../editors/Viewer.py:582
+msgid "Right"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:65
+msgid "Right PowerRail"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
+msgid "Rising Edge"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:65
+msgid "Rotate left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:64
+msgid "Rotate right"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:17
+msgid "Rounding up/down"
+msgstr ""
+
+#: ../ProjectController.py:1828
+msgid "Run"
+msgstr ""
+
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
+msgid "SDO Client"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
+msgid "SDO Server"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "SFC"
+msgstr ""
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr ""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr "La transizione SFC nel POU \"%s\" deve essere connessa."
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "ST"
+msgstr "ST"
+
+#: ../PLCOpenEditor.py:308
+msgid "ST files (*.st)|*.st|All files|*.*"
+msgstr "ST files (*.st)|*.st|All files|*.*"
+
+#: ../svgui/svgui.py:136
+msgid "SVG files (*.svg)|*.svg|All files|*.*"
+msgstr "SVG files (*.svg)|*.svg|All files|*.*"
+
+#: ../features.py:36
+msgid "SVGUI"
+msgstr "SVGUI"
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
+msgid "Save"
+msgstr "Salva"
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
+msgid "Save As..."
+msgstr "Salva come"
+
+#: ../BeremizIDE.py:249
+msgid "Save as"
+msgstr "Salva come"
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr "Il percorso scelto per il salvataggio è lo stesso di un progetto! \n"
+
+#: ../dialogs/SearchInProjectDialog.py:73
+msgid "Scope"
+msgstr "Cerca in"
+
+#: ../IDEFrame.py:644
+msgid "Search"
+msgstr "Cerca"
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
+msgid "Search in Project"
+msgstr "Cerca nel Progetto"
+
+#: ../dialogs/DurationEditorDialog.py:49
+msgid "Seconds:"
+msgstr "Secondi:"
+
+#: ../IDEFrame.py:390
+msgid "Select All"
+msgstr "Seleziona tutto"
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
+msgid "Select a variable class:"
+msgstr "Seleziona una classe per la variabile:"
+
+#: ../ProjectController.py:1293
+msgid "Select an editor:"
+msgstr "Seleziona un editor:"
+
+#: ../controls/PouInstanceVariablesPanel.py:292
+msgid "Select an instance"
+msgstr "Seleziona un'istanza"
+
+#: ../IDEFrame.py:628
+msgid "Select an object"
+msgstr "Seleziona un oggetto"
+
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr ""
+"La cartella selezionata contiene già un altro progetto. Sovrascrivere? \n"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Selection"
+msgstr "Selezione"
+
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr "Selezione Convergenza"
+
+#: ../dialogs/SFCDivergenceDialog.py:65
+msgid "Selection Divergence"
+msgstr "Selezione Divergenza"
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr "Scoperta Servizi"
+
+#: ../dialogs/DiscoveryDialog.py:104
+msgid "Services available:"
+msgstr "Servici disponibili:"
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Set"
+msgstr "Imposta"
+
+#: ../plcopen/iec_std.csv:62
+msgid "Shift left"
+msgstr "Trasla a sinistra"
+
+#: ../plcopen/iec_std.csv:63
+msgid "Shift right"
+msgstr "Trasla a destra"
+
+#: ../ProjectController.py:1863
+msgid "Show IEC code generated by PLCGenerator"
+msgstr "Mostra il codice IEC generato da PLCGenerator"
+
+#: ../canfestival/canfestival.py:407
+msgid "Show Master"
+msgstr "Mostra il Master"
+
+#: ../canfestival/canfestival.py:408
+msgid "Show Master generated by config_utils"
+msgstr "Mostra il Master generato da config_utils"
+
+#: ../ProjectController.py:1862
+msgid "Show code"
+msgstr "Mostra il codice"
+
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:67
+msgid "Simultaneous Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:27
+msgid "Sine"
+msgstr "Seno"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Single"
+msgstr "Singolo"
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr "I file sorgente non sono cambiati, compilazione non necessaria.\n"
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+
+#: ../plcopen/iec_std.csv:23
+msgid "Square root (base 2)"
+msgstr "Radice quadrata (base 2)"
+
+#: ../plcopen/definitions.py:50
+msgid "Standard function blocks"
+msgstr "Blocchi funzione standard"
+
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
+msgid "Start PLC"
+msgstr "Avvia il PLC"
+
+#: ../ProjectController.py:1074
+#, python-format
+msgid "Start build in %s\n"
+msgstr "Avvia la compilazione in %s\n"
+
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr "Avviato"
+
+#: ../ProjectController.py:1633
+msgid "Starting PLC\n"
+msgstr "Avviando il PLC\n"
+
+#: ../BeremizIDE.py:393
+msgid "Status ToolBar"
+msgstr "Barra di Stato"
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
+msgid "Step"
+msgstr "Passo"
+
+#: ../ProjectController.py:1835
+msgid "Stop"
+msgstr "Arresto"
+
+#: ../Beremiz_service.py:272
+msgid "Stop PLC"
+msgstr "Arresto PLC"
+
+#: ../ProjectController.py:1836
+msgid "Stop Running PLC"
+msgstr "Arresto del PLC in esecuzione"
+
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr "Arrestato"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Structure"
+msgstr "Struttura"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Subrange"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:35
+msgid "Subtraction"
+msgstr "Sottrazione"
+
+#: ../ProjectController.py:1113
+msgid "Successfully built.\n"
+msgstr "Compilato con successo.\n"
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr "Cambia layout grafico"
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
+msgid "Syntax error in regular expression of pattern to search!"
+msgstr "Errore di sintassi nella 'regular expression' usata per la ricerca!"
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr "TIPO"
+
+#: ../plcopen/iec_std.csv:29
+msgid "Tangent"
+msgstr "Tangente"
+
+#: ../editors/ResourceEditor.py:97
+msgid "Task"
+msgstr "Task"
+
+#: ../editors/ResourceEditor.py:248
+msgid "Tasks:"
+msgstr "Tasks:"
+
+#: ../controls/VariablePanel.py:91
+msgid "Temp"
+msgstr "Temp"
+
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:186
+#, python-format
+msgid ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+msgstr ""
+"Il file '%s' esiste già.\n"
+"Vuoi sovrascriverlo?"
+
+#: ../editors/LDViewer.py:893
+msgid "The group of block must be coherent!"
+msgstr "Il gruppo di blocchi deve essere coerente!"
+
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
+msgid "There are changes, do you want to save?"
+msgstr "Ci sono dei cambiamenti, vuoi salvare?"
+
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+
+#: ../IDEFrame.py:1133
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+
+#: ../editors/LDViewer.py:902
+msgid "This option isn't available yet!"
+msgstr "Questa opzione non è ancora disponibile"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr "Tick: %d"
+
+#: ../plcopen/iec_std.csv:40
+msgid "Time"
+msgstr "Tempo"
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
+msgid "Time addition"
+msgstr "Addizione del tempo"
+
+#: ../plcopen/iec_std.csv:86
+msgid "Time concatenation"
+msgstr "Concatenazion del tempo"
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
+msgid "Time division"
+msgstr "Divisione del tempo"
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
+msgid "Time multiplication"
+msgstr "Moltiplicazione del tempo"
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
+msgid "Time subtraction"
+msgstr "Sottrazione del tempo"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
+msgid "Time-of-day addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
+msgid "Time-of-day subtraction"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr ""
+
+#: ../editors/Viewer.py:584
+msgid "Top"
+msgstr ""
+
+#: ../ProjectController.py:1848
+msgid "Transfer"
+msgstr "Trasferimento"
+
+#: ../ProjectController.py:1849
+msgid "Transfer PLC"
+msgstr "Trasferimento PLC"
+
+#: ../ProjectController.py:1802
+msgid "Transfer completed successfully.\n"
+msgstr "Trasferimento completato con successo.\n"
+
+#: ../ProjectController.py:1805
+msgid "Transfer failed\n"
+msgstr "Trasferimento fallito\n"
+
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
+msgid "Transition"
+msgstr "Transizione"
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:91
+msgid "Transition Name"
+msgstr "Nome della transizione"
+
+#: ../dialogs/PouTransitionDialog.py:60
+msgid "Transition Name:"
+msgstr "Nome della transizione:"
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1526
+#, python-format
+msgid "Transition with name %s doesn't exist!"
+msgstr "La transizione con il nome %s non esiste!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Transitions"
+msgstr "Transizioni"
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr "Tradotto da"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Triggering"
+msgstr ""
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
+msgid "Type"
+msgstr "Yipo"
+
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr "Tipo e derivati"
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
+#, python-format
+msgid "Type conflict for location \"%s\""
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Type conversion"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:170
+msgid "Type infos:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
+msgid "Type:"
+msgstr "Tipo:"
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
+#, python-format
+msgid "Unable to define PDO mapping for node %02x"
+msgstr "Impossibile definire il PDO mapping per il nodo %02x"
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
+msgid "Unable to get Xenomai's %s \n"
+msgstr ""
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:261
+#, python-format
+msgid "Undefined pou type \"%s\""
+msgstr "Tipo di POU \"%s\" non definito"
+
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
+msgid "Undo"
+msgstr "Annulla"
+
+#: ../ProjectController.py:442
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#: ../editors/Viewer.py:437
+#, python-format
+msgid "Unknown variable \"%s\" for this POU!"
+msgstr "Variabile \"%s\" sconosciuta per questo POU!"
+
+#: ../ProjectController.py:439 ../ProjectController.py:440
+msgid "Unnamed"
+msgstr "Senza_nome"
+
+#: ../PLCControler.py:263
+#, python-format
+msgid "Unnamed%d"
+msgstr "Senza_nome%d"
+
+#: ../controls/VariablePanel.py:308
+#, python-format
+msgid "Unrecognized data size \"%s\""
+msgstr "Dimensione del dato non riconosciuta: \"%s\""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
+msgid "User Data Types"
+msgstr "Tipi definiti dall'utente"
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
+msgid "User Type"
+msgstr "Tipo Utente"
+
+#: ../plcopen/types_enums.py:75
+msgid "User-defined POUs"
+msgstr "POU definiti dall'Utente"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Value"
+msgstr "Valore"
+
+#: ../editors/DataTypeEditor.py:267
+msgid "Values:"
+msgstr "Valori:"
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
+msgid "Variable"
+msgstr "Variabile"
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:68
+msgid "Variable Properties"
+msgstr "Proprietà della variabile"
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
+msgid "Variable class"
+msgstr "Classe della variabile"
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
+msgid "Variable don't belong to this POU!"
+msgstr "La variabile non appartiene a questo POU!"
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr "Variabile:"
+
+#: ../controls/VariablePanel.py:90
+msgid "Variables"
+msgstr "Variabili"
+
+#: ../controls/ProjectPropertiesPanel.py:166
+msgid "Vertical:"
+msgstr "Verticale:"
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr ""
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr ""
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr ""
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr ""
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr ""
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr "WAMP connessione timeout"
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr "WAMP connessione a  '1%s' fallita.\n"
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr "WAMP importazione fallita:"
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr ""
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
+msgid "WXGLADE GUI"
+msgstr "WXGLADE GUI"
+
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
+msgid "Warning"
+msgstr "Warning"
+
+#: ../ProjectController.py:726
+msgid "Warnings in ST/IL/SFC code generator :\n"
+msgstr "Warnings nel ST/IL/SFC generatore di codice:\n"
+
+#: ../dialogs/SearchInProjectDialog.py:82
+msgid "Whole Project"
+msgstr "Intero Progetto"
+
+#: ../controls/ProjectPropertiesPanel.py:134
+msgid "Width:"
+msgstr "Largezza:"
+
+#: ../dialogs/FindInPouDialog.py:94
+msgid "Wrap search"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr "Scritto da"
+
+#: ../features.py:35
+msgid "WxGlade GUI"
+msgstr "WxGlade GUI"
+
+#: ../svgui/svgui.py:150
+msgid ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+msgstr ""
+"Non il permesso di scrittura.\n"
+"Aprire Inkscape comunque?"
+
+#: ../wxglade_hmi/wxglade_hmi.py:160
+msgid ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+msgstr ""
+"Non hai il permesso di scrittura.\n"
+"Aprire wxGlade comunque?"
+
+#: ../ProjectController.py:390
+msgid ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+msgstr ""
+"Devi avere il permesso di lavorare al progetto\n"
+"Vuoi lavorare con una copia del progetto ?"
+
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+"Devi selezionare il blocco o il gruppo di blocchi attorno al quale il ramo "
+"deve essere aggiunto."
+
+#: ../editors/LDViewer.py:677
+msgid "You must select the wire where a contact should be added!"
+msgstr "Devi selezionare un filo dove un contatto puo' essere aggiunto!"
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
+msgid "You must type a name!"
+msgstr "Devi digitare un nome!"
+
+#: ../dialogs/ForceVariableDialog.py:209
+msgid "You must type a value!"
+msgstr "Devi digitare un valore!"
+
+#: ../IDEFrame.py:440
+msgid "Zoom"
+msgstr "Zoom"
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr "giorni"
+
+#: ../PLCOpenEditor.py:317
+#, python-format
+msgid "error: %s\n"
+msgstr "errore: %s\n"
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr "uscito con stato {a1} (pid {a2})\n"
+
+#: ../dialogs/PouDialog.py:36
+msgid "function"
+msgstr "funzione"
+
+#: ../dialogs/PouDialog.py:36
+msgid "functionBlock"
+msgstr "blocco funzione"
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr "ore"
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr "millisecondi"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr "minuti"
+
+#: ../dialogs/PouDialog.py:36
+msgid "program"
+msgstr "programma"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr "secondi"
+
+#: ../plcopen/iec_std.csv:84
+msgid "string from the middle"
+msgstr "stringa dal centro"
+
+#: ../plcopen/iec_std.csv:82
+msgid "string left of"
+msgstr "stringa a sinistra di"
+
+#: ../plcopen/iec_std.csv:83
+msgid "string right of"
+msgstr "stringa a destra di"
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr "aggiornamento info non disponibile."
+
+#: ../PLCOpenEditor.py:315
+#, python-format
+msgid "warning: %s\n"
+msgstr "warning: %s\n"
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr "{a1} \"{a2}\" non può essere copiato come {a3}."
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+"Il file XML {a1} non rispetta lo schema XSD alla linea %{a2}:\n"
+"{a3}"
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr "CanFestivalSlaveNode"
+
+msgid "CAN_Device"
+msgstr "CAN_Device"
+
+msgid "CAN_Baudrate"
+msgstr "CAN_Baudrate"
+
+msgid "NodeId"
+msgstr "NodeId"
+
+msgid "Sync_Align"
+msgstr "Sync_Align"
+
+msgid "Sync_Align_Ratio"
+msgstr "Sync_Align_Ratio"
+
+msgid "CanFestivalNode"
+msgstr "CanFestivalNode"
+
+msgid "Sync_TPDOs"
+msgstr "Sync_TPDOs"
+
+msgid "CanFestivalInstance"
+msgstr "CanFestivalInstance"
+
+msgid "CAN_Driver"
+msgstr "CAN_Driver"
+
+msgid "Generic"
+msgstr "Generico"
+
+msgid "Command"
+msgstr "Comando"
+
+msgid "Xenomai"
+msgstr "Xenomai"
+
+msgid "XenoConfig"
+msgstr "XenoConfig"
+
+msgid "Compiler"
+msgstr "Compilatore"
+
+msgid "CFLAGS"
+msgstr "CFLAGS"
+
+msgid "Linker"
+msgstr "Linker"
+
+msgid "LDFLAGS"
+msgstr "LDFLAGS"
+
+msgid "Linux"
+msgstr "Linux"
+
+msgid "Win32"
+msgstr "Win32"
+
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr ""
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
+msgid "BaseParams"
+msgstr "ParametriBase"
+
+msgid "IEC_Channel"
+msgstr "IEC_Channel"
+
+msgid "Enabled"
+msgstr "Abilitato"
+
+msgid "BeremizRoot"
+msgstr "BeremizRoot"
+
+msgid "TargetType"
+msgstr "TargetType"
+
+msgid "Libraries"
+msgstr "Librerie"
+
+msgid "URI_location"
+msgstr "URI_location"
+
+msgid "Disable_Extensions"
+msgstr "Disabilita_Estensioni"
+
+msgid "%(codefile_name)s"
+msgstr "%(codefile_name)s"
+
+msgid "variables"
+msgstr "variabili"
+
+msgid "variable"
+msgstr "variabile"
+
+msgid "name"
+msgstr "nome"
+
+msgid "type"
+msgstr "tipo"
+
+msgid "class"
+msgstr "classe"
+
+msgid "initial"
+msgstr "iniziale"
+
+msgid "desc"
+msgstr "descrizione"
+
+msgid "onchange"
+msgstr "su_fronte"
+
+msgid "opts"
+msgstr ""
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr ""
+
+msgid "Preset datetime"
+msgstr ""
+
+msgid "Copy of IN"
+msgstr ""
+
+msgid "Datetime, current or relative to PDT"
+msgstr ""
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+
+msgid "1 = integrate, 0 = hold"
+msgstr ""
+
+msgid "Overriding reset"
+msgstr ""
+
+msgid "Input variable"
+msgstr ""
+
+msgid "Initial value"
+msgstr ""
+
+msgid "Sampling period"
+msgstr ""
+
+msgid "NOT R1"
+msgstr ""
+
+msgid "Integrated output"
+msgstr ""
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr ""
+
+msgid "0 = reset"
+msgstr ""
+
+msgid "Input to be differentiated"
+msgstr ""
+
+msgid "Differentiated output"
+msgstr ""
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+
+msgid "0 - manual , 1 - automatic"
+msgstr ""
+
+msgid "Process variable"
+msgstr ""
+
+msgid "Set point"
+msgstr ""
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr ""
+
+msgid "Proportionality constant"
+msgstr ""
+
+msgid "Reset time"
+msgstr ""
+
+msgid "Derivative time constant"
+msgstr ""
+
+msgid "PV - SP"
+msgstr ""
+
+msgid "FB for integral term"
+msgstr ""
+
+msgid "FB for derivative term"
+msgstr ""
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr ""
+
+msgid "Ramp duration"
+msgstr ""
+
+msgid "BUSY = 1 during ramping period"
+msgstr ""
+
+msgid "Elapsed time of ramp"
+msgstr ""
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr ""
+"Il function block RAMP e' modellato sul esempio fornito nello standard."
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr ""
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr ""
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+
+msgid "first input parameter"
+msgstr ""
+
+msgid "second input parameter"
+msgstr ""
+
+msgid "first output parameter"
+msgstr ""
+
+msgid "second output parameter"
+msgstr ""
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr ""
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
--- a/i18n/Beremiz_ko_KR.po	Sat Jun 02 11:56:01 2018 +0100
+++ b/i18n/Beremiz_ko_KR.po	Mon Jan 07 13:50:39 2019 +0100
@@ -1,49 +1,24 @@
 # SOME DESCRIPTIVE TITLE.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the Beremiz package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
+# 
+#, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: Beremiz_Korean_Version\n"
+"Project-Id-Version: Beremiz\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-09-07 01:17+0200\n"
-"PO-Revision-Date: 2012-09-07 01:38+0100\n"
-"Last-Translator: Laurent BESSARD <laurent.bessard@gmail.com>\n"
-"Language-Team: LinuxIT <lij3105@gmail.com>\n"
-"Language: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: IKHWAN KIM <duo821228@gmail.com>, 2017\n"
+"Language-Team: Korean (Korea) (https://www.transifex.com/beremiz/teams/75746/ko_KR/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Korean\n"
-"X-Poedit-Country: KOREA, REPUBLIC OF\n"
-"X-Poedit-SourceCharset: utf-8\n"
-"X-Poedit-Language: Korean\n"
-"X-Poedit-Country: KOREA, REPUBLIC OF\n"
-"X-Poedit-SourceCharset: utf-8\n"
-
-#: ../PLCOpenEditor.py:520
-msgid ""
-"\n"
-"An error has occurred.\n"
-"\n"
-"Click OK to save an error report.\n"
-"\n"
-"Please be kind enough to send this file to:\n"
-"edouard.tisserant@gmail.com\n"
-"\n"
-"Error:\n"
-msgstr ""
-"\n"
-"알 수 없는 에러가 발생했습니다.\n"
-"\n"
-"OK 버튼을 눌러 에러 리포트를 저장하세요.\n"
-"\n"
-"edouard.tisserant@gmail.com 주소로 에러 리포트를 첨부하여 보내주세요\n"
-"\n"
-"에러:\n"
-
-#: ../Beremiz.py:1071
+"Language: ko_KR\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../util/ExceptionHandler.py:58
 #, python-format
 msgid ""
 "\n"
@@ -53,223 +28,171 @@
 "Please be kind enough to send this file to:\n"
 "beremiz-devel@lists.sourceforge.net\n"
 "\n"
-"You should now restart Beremiz.\n"
+"You should now restart program.\n"
 "\n"
 "Traceback:\n"
 msgstr ""
 "\n"
-"원인을 알 수 없는 에러가 발생하였습니다. 버그 리포트 저장 위치 :\n"
+"제어할 수 없는 예외상황 (버그)이 발생하였습니다. 버그 리포트는 다음과 같이 저장됩니다:\n"
 "(%s)\n"
 "\n"
-"버그 리포트 파일을 beremiz-devel@lists.sourceforge.net으로\n"
-"전송해주시면 감사하겠습니다.\n"
+"해당 파일을 다음과 같은 주소로 보내주시면 감사하겠습니다:\n"
+"beremiz-devel@lists.sourceforge.net\n"
 "\n"
-"베레미즈를 다시 시작해주세요.\n"
+"프로그램을 재시작해야 합니다. \n"
 "\n"
-"에러 위치:\n"
-
-#: ../controls/VariablePanel.py:77
+"Traceback:\n"
+
+#: ../controls/VariablePanel.py:90
 msgid "   External"
 msgstr "   외부"
 
-#: ../controls/VariablePanel.py:76
+#: ../controls/VariablePanel.py:89
 msgid "   InOut"
 msgstr "   입출력"
 
-#: ../controls/VariablePanel.py:76
+#: ../controls/VariablePanel.py:89
 msgid "   Input"
 msgstr "   입력"
 
-#: ../controls/VariablePanel.py:77
+#: ../controls/VariablePanel.py:90
 msgid "   Local"
 msgstr "   로컬"
 
-#: ../controls/VariablePanel.py:76
+#: ../controls/VariablePanel.py:89
 msgid "   Output"
 msgstr "   출력"
 
-#: ../controls/VariablePanel.py:78
+#: ../controls/VariablePanel.py:91
 msgid "   Temp"
 msgstr "   임시"
 
-#: ../PLCOpenEditor.py:530
-msgid " : "
-msgstr " :"
-
-#: ../dialogs/PouTransitionDialog.py:94
-#: ../dialogs/PouActionDialog.py:91
-#: ../dialogs/PouDialog.py:111
-#: ../dialogs/SFCTransitionDialog.py:144
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
 #, python-format
 msgid " and %s"
 msgstr " , %s"
 
-#: ../ProjectController.py:890
+#: ../ProjectController.py:1182
 msgid " generation failed !\n"
 msgstr "생성 실패!\n"
 
-#: ../plcopen/plcopen.py:1051
+#: ../plcopen/plcopen.py:1029
 #, python-format
 msgid "\"%s\" Data Type doesn't exist !!!"
 msgstr "\"%s\" 존재하지 않는 데이터 타입!!!"
 
-#: ../plcopen/plcopen.py:1069
+#: ../plcopen/plcopen.py:1047
 #, python-format
 msgid "\"%s\" POU already exists !!!"
 msgstr "\"%s\" POU가 이미 존재합니다!!!"
 
-#: ../plcopen/plcopen.py:1090
+#: ../plcopen/plcopen.py:1068
 #, python-format
 msgid "\"%s\" POU doesn't exist !!!"
 msgstr "\"%s\" POU가 존재하지 않습니다!!!"
 
-#: ../editors/Viewer.py:234
+#: ../editors/Viewer.py:288
 #, python-format
 msgid "\"%s\" can't use itself!"
 msgstr "\"%s\": 자신을 사용 할 수 없습니다!"
 
-#: ../IDEFrame.py:1706
-#: ../IDEFrame.py:1725
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
 #, python-format
 msgid "\"%s\" config already exists!"
 msgstr "\"%s\" 설정(config)이 이미 존재합니다!"
 
-#: ../plcopen/plcopen.py:315
+#: ../plcopen/plcopen.py:531
 #, python-format
 msgid "\"%s\" configuration already exists !!!"
 msgstr "\"%s\" 설정(configuration)이 이미 존재합니다!"
 
-#: ../IDEFrame.py:1660
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr "\"%s\" 설정이 존재하지 않습니다!!!"
+
+#: ../IDEFrame.py:1638
 #, python-format
 msgid "\"%s\" data type already exists!"
-msgstr "\"%s\" 데이터 타입이 이미존재합니다!"
-
-#: ../PLCControler.py:2040
-#: ../PLCControler.py:2044
-#, python-format
-msgid "\"%s\" element can't be pasted here!!!"
-msgstr "\"%s\" 항목을 이곳에 붙여넣기 할 수 없습니다!!!"
-
-#: ../editors/TextViewer.py:305
-#: ../editors/TextViewer.py:325
-#: ../editors/Viewer.py:252
-#: ../dialogs/PouTransitionDialog.py:105
-#: ../dialogs/ConnectionDialog.py:150
-#: ../dialogs/PouActionDialog.py:102
-#: ../dialogs/FBDBlockDialog.py:162
+msgstr "\"%s\" 데이터 타입이 이미 존재합니다!"
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
 #, python-format
 msgid "\"%s\" element for this pou already exists!"
 msgstr "이 POU에 \"%s\" 항목이 이미 존재합니다!"
 
-#: ../Beremiz.py:894
+#: ../BeremizIDE.py:928
 #, python-format
 msgid "\"%s\" folder is not a valid Beremiz project\n"
 msgstr "\"%s\" 베레미즈 프로젝트 폴더가 아닙니다\n"
 
-#: ../plcopen/structures.py:106
-#, python-format
-msgid "\"%s\" function cancelled in \"%s\" POU: No input connected"
-msgstr "\"%s\" 펑션이 취소 되었습니다 \"%s\" POU: 연결된 입력 없음"
-
-#: ../controls/VariablePanel.py:656
-#: ../IDEFrame.py:1651
-#: ../editors/DataTypeEditor.py:548
-#: ../editors/DataTypeEditor.py:577
-#: ../dialogs/PouNameDialog.py:49
-#: ../dialogs/PouTransitionDialog.py:101
-#: ../dialogs/SFCStepNameDialog.py:51
-#: ../dialogs/ConnectionDialog.py:146
-#: ../dialogs/FBDVariableDialog.py:199
-#: ../dialogs/PouActionDialog.py:98
-#: ../dialogs/PouDialog.py:118
-#: ../dialogs/SFCStepDialog.py:122
-#: ../dialogs/FBDBlockDialog.py:158
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
 #, python-format
 msgid "\"%s\" is a keyword. It can't be used!"
 msgstr "\"%s\" 는 키워드 입니다. 사용 할 수 없습니다!"
 
-#: ../editors/Viewer.py:240
-#, python-format
-msgid "\"%s\" is already used by \"%s\"!"
-msgstr "\"%s\" 는 \"%s\" 에서 이미 사용중입니다!"
-
-#: ../plcopen/plcopen.py:2786
+#: ../plcopen/plcopen.py:2836
 #, python-format
 msgid "\"%s\" is an invalid value!"
 msgstr "\"%s\" 유효하지 않은 값입니다!"
 
-#: ../PLCOpenEditor.py:362
-#: ../PLCOpenEditor.py:399
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
 #, python-format
 msgid "\"%s\" is not a valid folder!"
 msgstr "\"%s\" 유효하지 않은 폴더입니다!"
 
-#: ../controls/VariablePanel.py:654
-#: ../IDEFrame.py:1649
-#: ../editors/DataTypeEditor.py:572
-#: ../dialogs/PouNameDialog.py:47
-#: ../dialogs/PouTransitionDialog.py:99
-#: ../dialogs/SFCStepNameDialog.py:49
-#: ../dialogs/ConnectionDialog.py:144
-#: ../dialogs/PouActionDialog.py:96
-#: ../dialogs/PouDialog.py:116
-#: ../dialogs/SFCStepDialog.py:120
-#: ../dialogs/FBDBlockDialog.py:156
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
 #, python-format
 msgid "\"%s\" is not a valid identifier!"
 msgstr "\"%s\"는 유효하지 않은 식별자입니다!"
 
-#: ../IDEFrame.py:214
-#: ../IDEFrame.py:2445
-#: ../IDEFrame.py:2464
-#, python-format
-msgid "\"%s\" is used by one or more POUs. It can't be removed!"
-msgstr "\"%s\" 는 현재 하나 이상의 POU에서 사용중입니다. 제거할 수 없습니다!"
-
-#: ../controls/VariablePanel.py:311
-#: ../IDEFrame.py:1669
-#: ../editors/TextViewer.py:303
-#: ../editors/TextViewer.py:323
-#: ../editors/TextViewer.py:360
-#: ../editors/Viewer.py:250
-#: ../editors/Viewer.py:295
-#: ../editors/Viewer.py:312
-#: ../dialogs/ConnectionDialog.py:148
-#: ../dialogs/PouDialog.py:120
-#: ../dialogs/FBDBlockDialog.py:160
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr "\"%s\"는 하나 이상의 POU에 의해 사용되고 있습니다. 계속하시겠습니까? "
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
 #, python-format
 msgid "\"%s\" pou already exists!"
 msgstr "\"%s\" POU는 이미 존재합니다!"
 
-#: ../plcopen/plcopen.py:346
-#, python-format
-msgid "\"%s\" resource already exists in \"%s\" configuration !!!"
-msgstr "\"%s\" 리소스는 \"%s\" 설정(configuration)에 이미 존재합니다 !!!"
-
-#: ../plcopen/plcopen.py:362
-#, python-format
-msgid "\"%s\" resource doesn't exist in \"%s\" configuration !!!"
-msgstr "\"%s\" 리소스를 \"%s\" 설정(configuration)에서 찾을 수 없습니다 !!!"
-
-#: ../dialogs/SFCStepNameDialog.py:57
-#: ../dialogs/SFCStepDialog.py:128
+#: ../dialogs/SFCStepNameDialog.py:62
 #, python-format
 msgid "\"%s\" step already exists!"
 msgstr "\"%s\" 스텝이 이미 생성되었습니다!"
 
-#: ../editors/DataTypeEditor.py:543
+#: ../editors/DataTypeEditor.py:566
 #, python-format
 msgid "\"%s\" value already defined!"
 msgstr "\"%s\" 이미 정의된 값이 있습니다!"
 
-#: ../editors/DataTypeEditor.py:719
-#: ../dialogs/ArrayTypeDialog.py:97
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
 #, python-format
 msgid "\"%s\" value isn't a valid array dimension!"
 msgstr "\"%s\" 값은 올바른 배열 차원이 아닙니다!"
 
-#: ../editors/DataTypeEditor.py:726
-#: ../dialogs/ArrayTypeDialog.py:103
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
 #, python-format
 msgid ""
 "\"%s\" value isn't a valid array dimension!\n"
@@ -278,369 +201,408 @@
 "\"%s\" 올바른 데이터를 입력하세요!\n"
 "우측의 데이터는 좌측보다 커야 합니다."
 
-#: ../PLCControler.py:793
-#, python-format
-msgid "%s \"%s\" can't be pasted as a %s."
-msgstr "%s \"%s\" 붙여넣기 할 수 없는 형식 :  %s."
-
-#: ../PLCControler.py:1422
-#, fuzzy, python-format
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr "\"{a2}\" POU 에서 \"{a1}\" 함수가 취소되었습니다: 입력이 연결되지 않았습니다. "
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr "\"{a1}\" 은 \"{a2}\" 에 의해 사용되고 있습니다. "
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr "\"{a1}\" 리소스는 \"{a2}\" 설정에 이미 존재합니다."
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr "\"{a1}\" 리소스는 \"{a2}\" 설정에 존재하지 않습니다!!!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr "%03gms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr "%dd"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr "%dh"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr "%dm"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr "%dms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr "%ds"
+
+#: ../PLCControler.py:1114
+#, python-format
 msgid "%s Data Types"
-msgstr "데이터 타입(Data Types)"
-
-#: ../editors/GraphicViewer.py:278
-#, python-format
-msgid "%s Graphics"
-msgstr "%s 그래픽"
-
-#: ../PLCControler.py:1417
-#, fuzzy, python-format
+msgstr "%s 데이터 타입"
+
+#: ../PLCControler.py:1097
+#, python-format
 msgid "%s POUs"
-msgstr "POU 붙여넣기"
-
-#: ../canfestival/SlaveEditor.py:42
-#: ../canfestival/NetworkEditor.py:72
+msgstr "%s POU들"
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
 #, python-format
 msgid "%s Profile"
 msgstr "%s 프로필"
 
-#: ../plcopen/plcopen.py:1780
-#: ../plcopen/plcopen.py:1790
-#: ../plcopen/plcopen.py:1800
-#: ../plcopen/plcopen.py:1810
-#: ../plcopen/plcopen.py:1819
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
 #, python-format
 msgid "%s body don't have instances!"
 msgstr "%s 인스턴스를 찾을 수 없습니다!"
 
-#: ../plcopen/plcopen.py:1842
-#: ../plcopen/plcopen.py:1849
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
 #, python-format
 msgid "%s body don't have text!"
 msgstr "%s 텍스트를 찾을 수 없습니다!"
 
-#: ../IDEFrame.py:364
+#: ../IDEFrame.py:388
 msgid "&Add Element"
 msgstr "&구성원 추가"
 
-#: ../IDEFrame.py:334
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr "&종료"
+
+#: ../IDEFrame.py:361
 msgid "&Configuration"
 msgstr "&설정(Configuration)"
 
-#: ../IDEFrame.py:325
+#: ../IDEFrame.py:350
 msgid "&Data Type"
 msgstr "&데이터 타입"
 
-#: ../IDEFrame.py:368
+#: ../IDEFrame.py:392
 msgid "&Delete"
 msgstr "&삭제"
 
-#: ../IDEFrame.py:317
+#: ../IDEFrame.py:342
 msgid "&Display"
 msgstr "&보기"
 
-#: ../IDEFrame.py:316
-#, fuzzy
+#: ../IDEFrame.py:341
 msgid "&Edit"
-msgstr "수정"
-
-#: ../IDEFrame.py:315
+msgstr "&편집"
+
+#: ../IDEFrame.py:340
 msgid "&File"
 msgstr "&파일"
 
-#: ../IDEFrame.py:327
+#: ../IDEFrame.py:352
 msgid "&Function"
 msgstr "&함수"
 
-#: ../IDEFrame.py:318
+#: ../IDEFrame.py:343
 msgid "&Help"
 msgstr "&도움말"
 
-#: ../IDEFrame.py:331
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr "&라이센스"
+
+#: ../IDEFrame.py:356
 msgid "&Program"
 msgstr "&프로그램"
 
-#: ../PLCOpenEditor.py:148
-#, fuzzy
+#: ../PLCOpenEditor.py:98
 msgid "&Properties"
-msgstr ""
-"#-#-#-#-#  Beremiz_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"&속성\n"
-"#-#-#-#-#  PLCOpenEditor_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"&프로젝트 속성"
-
-#: ../Beremiz.py:310
+msgstr "&속성"
+
+#: ../BeremizIDE.py:244
 msgid "&Recent Projects"
 msgstr "&최근 프로젝트"
 
-#: ../Beremiz.py:352
+#: ../IDEFrame.py:358
 msgid "&Resource"
-msgstr ""
-
-#: ../controls/SearchResultPanel.py:237
-#, python-format
-msgid "'%s' - %d match in project"
-msgstr "'%s' - %d 개의 검색된 결과"
-
-#: ../controls/SearchResultPanel.py:239
-#, python-format
-msgid "'%s' - %d matches in project"
-msgstr "'%s' - %d 개의 검색된 결과들"
-
-#: ../connectors/PYRO/__init__.py:51
-#, python-format
-msgid "'%s' is located at %s\n"
-msgstr ""
-
-#: ../controls/SearchResultPanel.py:289
+msgstr "&리소스"
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr "'{a1}' - 프로젝트내에서 {a2} 건이 매치됩니다. "
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr "'{a1}' - 프로젝트 내에서 {a2} 건이 매치됩니다."
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr "'{a1}' 은 {a2} 위치에 있습니다.\n"
+
+#: ../controls/SearchResultPanel.py:298
 #, python-format
 msgid "(%d matches)"
-msgstr ""
-
-#: ../PLCOpenEditor.py:508
-#: ../PLCOpenEditor.py:510
-#: ../PLCOpenEditor.py:511
-msgid ",   "
-msgstr ",   "
-
-#: ../dialogs/PouTransitionDialog.py:96
-#: ../dialogs/PouActionDialog.py:93
-#: ../dialogs/PouDialog.py:113
-#: ../dialogs/SFCTransitionDialog.py:146
+msgstr "(%d 건이 매치됨)"
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
 #, python-format
 msgid ", %s"
 msgstr ", %s"
 
-#: ../PLCOpenEditor.py:506
-msgid ". "
-msgstr ". "
-
-#: ../ProjectController.py:1268
-msgid "... debugger recovered\n"
-msgstr "... 디버거 복구\n"
-
-#: ../IDEFrame.py:1672
-#: ../IDEFrame.py:1714
-#: ../IDEFrame.py:1733
-#: ../dialogs/PouDialog.py:122
-#, python-format
-msgid "A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?"
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr "- URI 종류를 선택하세요 - "
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr "1d"
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr "1h"
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr "1m"
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr "1s"
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
 msgstr "POU 구성원의 이름 \"%s\"은 오류를 발생시킬 수 있습니다. 계속 하시겠습니까?"
 
-#: ../controls/VariablePanel.py:658
-#: ../IDEFrame.py:1684
-#: ../IDEFrame.py:1695
-#: ../dialogs/PouNameDialog.py:51
-#: ../dialogs/PouTransitionDialog.py:103
-#: ../dialogs/SFCStepNameDialog.py:53
-#: ../dialogs/PouActionDialog.py:100
-#: ../dialogs/SFCStepDialog.py:124
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
 #, python-format
 msgid "A POU named \"%s\" already exists!"
 msgstr "이미 생성된 POU 이름입니다 : \"%s\""
 
-#: ../ConfigTreeNode.py:371
-#, fuzzy, python-format
-msgid "A child named \"%s\" already exist -> \"%s\"\n"
-msgstr "입력 하신 \"%s\" 이 중복 되는 이름입니다. -> \"%s\"\n"
-
-#: ../dialogs/BrowseLocationsDialog.py:175
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr "\"{a1}\" 이름을 가진 child가 이미 존재합니다 ->\"{a2}\"\n"
+
+#: ../dialogs/BrowseLocationsDialog.py:229
 msgid "A location must be selected!"
 msgstr "위치를 지정해야 합니다!"
 
-#: ../controls/VariablePanel.py:660
-#: ../IDEFrame.py:1686
-#: ../IDEFrame.py:1697
-#: ../dialogs/SFCStepNameDialog.py:55
-#: ../dialogs/SFCStepDialog.py:126
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr "같은 이름을 가진 태스크가 존재합니다!"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
 #, python-format
 msgid "A variable with \"%s\" as name already exists in this pou!"
 msgstr "변수 \"%s\"는 이미 POU에 정의 되어 있습니다!"
 
-#: ../Beremiz.py:362
-#: ../PLCOpenEditor.py:181
-#, fuzzy
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr "이름이 \"%s\"인 변수는 이미 존재합니다!"
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
 msgid "About"
-msgstr ""
-"#-#-#-#-#  Beremiz_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"베레미즈는...\n"
-"#-#-#-#-#  PLCOpenEditor_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"베레미즈란"
-
-#: ../Beremiz.py:931
-msgid "About Beremiz"
-msgstr "베레미즈"
-
-#: ../PLCOpenEditor.py:376
-msgid "About PLCOpenEditor"
-msgstr "PLC 오픈에디터..."
+msgstr "대하여"
 
 #: ../plcopen/iec_std.csv:22
 msgid "Absolute number"
 msgstr "절대값 연산"
 
-#: ../dialogs/ActionBlockDialog.py:41
-#: ../dialogs/SFCStepDialog.py:69
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
 msgid "Action"
 msgstr "액션(Action)"
 
-#: ../editors/Viewer.py:495
-#, fuzzy
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
 msgid "Action Block"
-msgstr "함수 블럭(Function Block)"
-
-#: ../dialogs/PouActionDialog.py:81
+msgstr "액션 블록"
+
+#: ../dialogs/PouActionDialog.py:89
 msgid "Action Name"
 msgstr "액션 명"
 
-#: ../dialogs/PouActionDialog.py:49
+#: ../dialogs/PouActionDialog.py:56
 msgid "Action Name:"
 msgstr "액션 명:"
 
-#: ../plcopen/plcopen.py:1480
+#: ../plcopen/plcopen.py:1567
 #, python-format
 msgid "Action with name %s doesn't exist!"
 msgstr "액션 명 %s는 이미 존재합니다!"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:76
 msgid "Actions"
 msgstr "액션(Actions)"
 
-#: ../dialogs/ActionBlockDialog.py:134
+#: ../dialogs/ActionBlockDialog.py:139
 msgid "Actions:"
 msgstr "액션(Actions):"
 
-#: ../canfestival/SlaveEditor.py:54
-#: ../canfestival/NetworkEditor.py:84
-#: ../editors/Viewer.py:527
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr "활성화"
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
 msgid "Add"
 msgstr "추가"
 
-#: ../IDEFrame.py:1925
-#: ../IDEFrame.py:1956
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
 msgid "Add Action"
 msgstr "액션 추가"
 
-#: ../features.py:7
+#: ../features.py:33
 msgid "Add C code accessing located variables synchronously"
 msgstr "동기적으로 위치한 변수를 액세스하는 C 코드를 추가합니다"
 
-#: ../IDEFrame.py:1908
+#: ../IDEFrame.py:1907
 msgid "Add Configuration"
 msgstr "설정(Configuration) 추가"
 
-#: ../IDEFrame.py:1888
+#: ../IDEFrame.py:1887
 msgid "Add DataType"
 msgstr "데이터 타입 추가"
 
-#: ../editors/Viewer.py:453
+#: ../editors/Viewer.py:609
 msgid "Add Divergence Branch"
 msgstr "Branch 추가"
 
-#: ../dialogs/DiscoveryDialog.py:115
+#: ../dialogs/DiscoveryDialog.py:121
 msgid "Add IP"
-msgstr ""
-
-#: ../IDEFrame.py:1896
+msgstr "IP 추가"
+
+#: ../IDEFrame.py:1895
 msgid "Add POU"
 msgstr "POU 추가"
 
-#: ../features.py:8
+#: ../features.py:34
 msgid "Add Python code executed asynchronously"
 msgstr "비동기적으로 실행되는 파이썬 코드를 추가합니다"
 
-#: ../IDEFrame.py:1936
-#: ../IDEFrame.py:1982
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
 msgid "Add Resource"
 msgstr "리소스 추가"
 
-#: ../IDEFrame.py:1914
-#: ../IDEFrame.py:1953
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
 msgid "Add Transition"
 msgstr "트랜지션(Transition) 추가"
 
-#: ../editors/Viewer.py:442
+#: ../editors/Viewer.py:596
 msgid "Add Wire Segment"
 msgstr "와이어 세그먼트(Wire Segment) 추가"
 
-#: ../editors/SFCViewer.py:359
+#: ../editors/SFCViewer.py:447
 msgid "Add a new initial step"
 msgstr "새로운 초기 스텝 추가"
 
-#: ../editors/Viewer.py:2289
-#: ../editors/SFCViewer.py:696
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
 msgid "Add a new jump"
 msgstr "새로운 점프 추가"
 
-#: ../editors/SFCViewer.py:381
+#: ../editors/SFCViewer.py:469
 msgid "Add a new step"
 msgstr "새로운 스텝 추가"
 
-#: ../features.py:9
+#: ../features.py:35
 msgid "Add a simple WxGlade based GUI."
 msgstr "간단 WxGlade GUI를 추가합니다"
 
-#: ../dialogs/ActionBlockDialog.py:138
-#, fuzzy
+#: ../dialogs/ActionBlockDialog.py:143
 msgid "Add action"
 msgstr "액션 추가"
 
-#: ../editors/DataTypeEditor.py:345
-#, fuzzy
+#: ../editors/DataTypeEditor.py:364
 msgid "Add element"
-msgstr "구성원(Element) 추가"
-
-#: ../editors/ResourceEditor.py:251
-#, fuzzy
+msgstr "구성원 추가"
+
+#: ../editors/ResourceEditor.py:283
 msgid "Add instance"
 msgstr "인스턴스 추가"
 
-#: ../canfestival/NetworkEditor.py:86
+#: ../canfestival/NetworkEditor.py:110
 msgid "Add slave"
 msgstr "슬레이브 추가"
 
-#: ../editors/ResourceEditor.py:222
-#, fuzzy
+#: ../editors/ResourceEditor.py:252
 msgid "Add task"
 msgstr "태스크 추가"
 
-#: ../controls/VariablePanel.py:378
-#, fuzzy
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
 msgid "Add variable"
-msgstr "변수"
+msgstr "변수 추가"
 
 #: ../plcopen/iec_std.csv:33
 msgid "Addition"
 msgstr "추가"
 
-#: ../plcopen/structures.py:250
+#: ../plcopen/definitions.py:51
 msgid "Additional function blocks"
 msgstr "추가적 함수 블록"
 
-#: ../editors/Viewer.py:1395
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr "블록 크기 조절"
+
+#: ../editors/Viewer.py:1720
 msgid "Alignment"
 msgstr "정렬"
 
-#: ../controls/VariablePanel.py:75
-#: ../dialogs/BrowseLocationsDialog.py:35
-#: ../dialogs/BrowseLocationsDialog.py:116
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
 msgid "All"
 msgstr "모두"
 
-#: ../editors/FileManagementPanel.py:35
-#, fuzzy
+#: ../editors/FileManagementPanel.py:37
 msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
-msgstr "SVG 파일 (*.svg)|*svg|모든 파일|*.*"
-
-#: ../ProjectController.py:1335
+msgstr "모든 파일들 (*.*)|*.*|CSV files (*.csv)|*.csv"
+
+#: ../ProjectController.py:1670
 msgid "Already connected. Please disconnect\n"
-msgstr "이미 접속중입니다. 연결을 해제 하세요\n"
-
-#: ../editors/DataTypeEditor.py:587
+msgstr "이미 접속되어 있습니다. 연결을 해제하세요\n"
+
+#: ../editors/DataTypeEditor.py:607
 #, python-format
 msgid "An element named \"%s\" already exists in this structure!"
 msgstr "항목 \"%s\" 는 이미 구조체 안에 존재 합니다!"
 
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr "같은 이름을 갖는 인스턴스가 존재합니다!"
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr "같은 이름을 가지는 모든 연결자에 대해 이름 변경을 적용하세요."
+
 #: ../plcopen/iec_std.csv:31
 msgid "Arc cosine"
 msgstr "Arc cosine"
@@ -657,8 +619,8 @@
 msgid "Arithmetic"
 msgstr "산술 연산"
 
-#: ../controls/VariablePanel.py:729
-#: ../editors/DataTypeEditor.py:52
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
 msgid "Array"
 msgstr "배열"
 
@@ -666,49 +628,37 @@
 msgid "Assignment"
 msgstr "할당"
 
-#: ../dialogs/FBDVariableDialog.py:197
+#: ../dialogs/FBDVariableDialog.py:226
 msgid "At least a variable or an expression must be selected!"
 msgstr "변수 또는 표현식이 필요합니다!"
 
-#: ../controls/ProjectPropertiesPanel.py:99
+#: ../controls/ProjectPropertiesPanel.py:111
 msgid "Author"
 msgstr "작성자"
 
-#: ../controls/ProjectPropertiesPanel.py:96
+#: ../controls/ProjectPropertiesPanel.py:108
 msgid "Author Name (optional):"
 msgstr "작성자 이름(옵션):"
 
-#: ../dialogs/FindInPouDialog.py:72
+#: ../dialogs/FindInPouDialog.py:80
 msgid "Backward"
-msgstr ""
-
-#: ../util/Zeroconf.py:599
-msgid "Bad domain name (circular) at "
-msgstr "도메인 이름이 올바르지 않습니다(circular 네임):"
-
-#: ../util/Zeroconf.py:602
-msgid "Bad domain name at "
-msgstr "도메인 이름이 올바르지 않습니다:"
-
-#: ../canfestival/config_utils.py:341
-#: ../canfestival/config_utils.py:623
+msgstr "뒤로"
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
 #, python-format
 msgid "Bad location size : %s"
 msgstr "잘못된 로케이션 사이즈: %s"
 
-#: ../editors/DataTypeEditor.py:168
-#: ../editors/DataTypeEditor.py:198
-#: ../editors/DataTypeEditor.py:290
-#: ../dialogs/ArrayTypeDialog.py:55
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
 msgid "Base Type:"
 msgstr "기본 타입:"
 
-#: ../controls/VariablePanel.py:699
-#: ../editors/DataTypeEditor.py:617
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
 msgid "Base Types"
 msgstr "기본 타입"
 
-#: ../Beremiz.py:486
+#: ../BeremizIDE.py:483
 msgid "Beremiz"
 msgstr "베레미즈"
 
@@ -740,144 +690,174 @@
 msgid "Bitwise inverting"
 msgstr "비트 연산 반전 (Invert)"
 
-#: ../editors/Viewer.py:465
-#, fuzzy
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
 msgid "Block"
-msgstr "블럭 수정"
-
-#: ../dialogs/FBDBlockDialog.py:38
+msgstr "블록"
+
+#: ../dialogs/FBDBlockDialog.py:63
 msgid "Block Properties"
 msgstr "블럭 속성"
 
-#: ../editors/Viewer.py:434
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr "블록 이름"
+
+#: ../editors/Viewer.py:586
 msgid "Bottom"
 msgstr "하단"
 
-#: ../dialogs/BrowseValuesLibraryDialog.py:37
-#, fuzzy, python-format
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr "깨짐"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
 msgid "Browse %s values library"
-msgstr "%s 라이브러리 탐색"
-
-#: ../dialogs/BrowseLocationsDialog.py:55
+msgstr "라이브러리에서 %s 값을 탐색"
+
+#: ../dialogs/BrowseLocationsDialog.py:72
 msgid "Browse Locations"
 msgstr "위치 탐색"
 
-#: ../ProjectController.py:1484
+#: ../ProjectController.py:1815
 msgid "Build"
 msgstr "빌드"
 
-#: ../ProjectController.py:1051
+#: ../ProjectController.py:1335
 msgid "Build directory already clean\n"
 msgstr "빌드 디렉토리가 이미 비어 있습니다\n"
 
-#: ../ProjectController.py:1485
+#: ../ProjectController.py:1816
 msgid "Build project into build folder"
-msgstr "현재 작성된 프로젝트를 빌드 폴더에 생성합니다"
-
-#: ../ProjectController.py:910
+msgstr "현재 프로젝트를 빌드합니다"
+
+#: ../ProjectController.py:1108
 msgid "C Build crashed !\n"
 msgstr "C 파일 빌드 과정에 문제가 있습니다!\n"
 
-#: ../ProjectController.py:907
+#: ../ProjectController.py:1105
 msgid "C Build failed.\n"
 msgstr "C 파일 빌드에 실패 했습니다\n"
 
-#: ../ProjectController.py:895
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr "C 코드"
+
+#: ../ProjectController.py:1186
 msgid "C code generated successfully.\n"
 msgstr "C 코드가 성공적으로 생성되었습니다\n"
 
-#: ../targets/toolchain_gcc.py:132
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr "C 컴파일 작업이 실패했습니다.\n"
+
+#: ../targets/toolchain_gcc.py:199
 #, python-format
 msgid "C compilation of %s failed.\n"
 msgstr "%s 의 C 컴파일 작업이 실패 했습니다\n"
 
-#: ../features.py:7
+#: ../features.py:33
 msgid "C extension"
 msgstr "C 확장"
 
-#: ../features.py:6
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr "크레딧"
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr "CANOpen 네트워크"
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr "CANOpen 슬레이브"
+
+#: ../features.py:31
 msgid "CANopen support"
 msgstr "CANopen 지원"
 
-#: ../plcopen/plcopen.py:1722
-#: ../plcopen/plcopen.py:1736
-#: ../plcopen/plcopen.py:1757
-#: ../plcopen/plcopen.py:1773
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
 msgid "Can only generate execution order on FBD networks!"
 msgstr "FBD 네트워크 상태에서만 실행 순서를 생성할 수 있습니다!"
 
-#: ../controls/VariablePanel.py:256
+#: ../controls/VariablePanel.py:291
 msgid "Can only give a location to local or global variables"
 msgstr "로컬 또는 전역 변수만 위치 지정 가능합니다"
 
-#: ../PLCOpenEditor.py:357
+#: ../PLCOpenEditor.py:318
 #, python-format
 msgid "Can't generate program to file %s!"
 msgstr "프로그램을 %s 파일로 생성할 수 없습니다!"
 
-#: ../controls/VariablePanel.py:254
+#: ../controls/VariablePanel.py:289
 msgid "Can't give a location to a function block instance"
 msgstr "함수 블럭 인스턴스에는 위치를 지정할 수 없습니다"
 
-#: ../PLCOpenEditor.py:397
+#: ../PLCOpenEditor.py:363
 #, python-format
 msgid "Can't save project to file %s!"
 msgstr "프로젝트를 %s로 저장할 수 없습니다!"
 
-#: ../controls/VariablePanel.py:298
-#, fuzzy
+#: ../controls/VariablePanel.py:339
 msgid "Can't set an initial value to a function block instance"
-msgstr "함수 블럭 인스턴스에는 위치를 지정할 수 없습니다"
-
-#: ../ConfigTreeNode.py:470
-#, python-format
-msgid "Cannot create child %s of type %s "
-msgstr "%s로 (%s 타입) 차일드를 생성 할 수 없습니다"
-
-#: ../ConfigTreeNode.py:400
+msgstr "함수 블록 인스턴스에 대해 초기값을 설정할 수 없습니다. "
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr "{a2} 타입의 차일드 {a1}을 생성할 수 없습니다."
+
+#: ../ConfigTreeNode.py:454
 #, python-format
 msgid "Cannot find lower free IEC channel than %d\n"
 msgstr "%d보다 낮은 번호의 가용 IEC 채널을 검색하는데 실패했습니다\n"
 
-#: ../connectors/PYRO/__init__.py:92
+#: ../connectors/PYRO/__init__.py:139
 msgid "Cannot get PLC status - connection failed.\n"
 msgstr "현재 PLC 상태를 알 수 없습니다 - 접속 실패.\n"
 
-#: ../ProjectController.py:715
+#: ../ProjectController.py:967
 msgid "Cannot open/parse VARIABLES.csv!\n"
 msgstr "VARIABLES.csv 파일을 열거나 파싱할 수 없습니다!\n"
 
-#: ../canfestival/config_utils.py:371
-#, python-format
-msgid "Cannot set bit offset for non bool '%s' variable (ID:%d,Idx:%x,sIdx:%x))"
-msgstr "'%s' 변수의 비트 옵셋 설정 실패 (ID:%d,ldx:%x,sldx:%x))"
-
-#: ../dialogs/FindInPouDialog.py:81
-#: ../dialogs/SearchInProjectDialog.py:67
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+"Bool 타입이 아닌 '{a1}' 변수의 비트 오프셋을 설정할 수 없습니다. (ID:{a2},Idx:{a3},sIdx:{a4}))  "
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr "PLC가 동작중 일 때 전송 할 수 없습니다. 지금 중단하시겠습니까?"
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
 msgid "Case sensitive"
 msgstr "대소문자 구별"
 
-#: ../editors/Viewer.py:429
+#: ../editors/Viewer.py:581
 msgid "Center"
 msgstr "중앙"
 
-#: ../Beremiz_service.py:322
+#: ../Beremiz_service.py:276
 msgid "Change IP of interface to bind"
 msgstr "바인드 인터페이스 IP 변경"
 
-#: ../Beremiz_service.py:321
+#: ../Beremiz_service.py:275
 msgid "Change Name"
 msgstr "이름 변경"
 
-#: ../IDEFrame.py:1974
+#: ../IDEFrame.py:1977
 msgid "Change POU Type To"
 msgstr "POU 타입 변경"
 
-#: ../Beremiz_service.py:325
+#: ../Beremiz_service.py:277
 msgid "Change Port Number"
 msgstr "포트 번호 변경"
 
-#: ../Beremiz_service.py:327
+#: ../Beremiz_service.py:278
 msgid "Change working directory"
 msgstr "작업 디렉토리 변경"
 
@@ -885,113 +865,119 @@
 msgid "Character string"
 msgstr "문자열"
 
-#: ../svgui/svgui.py:92
+#: ../svgui/svgui.py:136
 msgid "Choose a SVG file"
 msgstr "SVG 파일 선택"
 
-#: ../ProjectController.py:353
+#: ../ProjectController.py:561
 msgid "Choose a directory to save project"
 msgstr "프로젝트 저장 디렉토리 선택"
 
-#: ../canfestival/canfestival.py:118
-#: ../PLCOpenEditor.py:313
-#: ../PLCOpenEditor.py:347
-#: ../PLCOpenEditor.py:391
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
 msgid "Choose a file"
 msgstr "파일 선택"
 
-#: ../Beremiz.py:831
-#: ../Beremiz.py:866
+#: ../BeremizIDE.py:900
 msgid "Choose a project"
 msgstr "프로젝트 선택"
 
-#: ../dialogs/BrowseValuesLibraryDialog.py:42
-#, fuzzy, python-format
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
 msgid "Choose a value for %s:"
-msgstr "%s 선택:"
-
-#: ../Beremiz_service.py:373
+msgstr "%s 을 위한 값을 선택하세요:"
+
+#: ../Beremiz_service.py:333
 msgid "Choose a working directory "
 msgstr "작업 디렉토리 선택"
 
-#: ../ProjectController.py:281
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr "새로운 프로젝트를 위한 비어있는 디렉토리를 선택하세요"
+
+#: ../ProjectController.py:468
 msgid "Chosen folder doesn't contain a program. It's not a valid project!"
 msgstr "베레미즈 프로젝트 폴더를 선택해 주세요. 선택하신 폴더는 프로젝트 폴더가 아닙니다!"
 
-#: ../ProjectController.py:247
+#: ../ProjectController.py:435
 msgid "Chosen folder isn't empty. You can't use it for a new project!"
 msgstr "선택된 폴더는 비어있지 않습니다. 새 프로젝트 폴더로 사용 할 수 없습니다!"
 
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
+#: ../controls/VariablePanel.py:60
 msgid "Class"
 msgstr "클래스"
 
-#: ../controls/VariablePanel.py:369
+#: ../controls/VariablePanel.py:472
 msgid "Class Filter:"
 msgstr "클래스 필터:"
 
-#: ../dialogs/FBDVariableDialog.py:62
+#: ../dialogs/FBDVariableDialog.py:74
 msgid "Class:"
 msgstr "클래스:"
 
-#: ../ProjectController.py:1488
+#: ../ProjectController.py:1821
 msgid "Clean"
 msgstr "클린"
 
-#: ../ProjectController.py:1490
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr "로그 메세지 정리"
+
+#: ../ProjectController.py:1822
 msgid "Clean project build folder"
 msgstr "프로젝트 빌드 폴더를 비웁니다"
 
-#: ../ProjectController.py:1048
+#: ../ProjectController.py:1332
 msgid "Cleaning the build directory\n"
 msgstr "빌드 디렉토리를 비우는 중\n"
 
-#: ../IDEFrame.py:411
-#, fuzzy
+#: ../IDEFrame.py:437
 msgid "Clear Errors"
-msgstr "에러 화면 클리어\tCTRL+K"
-
-#: ../editors/Viewer.py:520
+msgstr "에러 정리"
+
+#: ../editors/Viewer.py:680
 msgid "Clear Execution Order"
 msgstr "실행 순서 클리어"
 
-#: ../editors/GraphicViewer.py:125
-msgid "Clear the graph values"
-msgstr ""
-
-#: ../Beremiz.py:598
-#: ../PLCOpenEditor.py:221
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr "닫기"
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
 msgid "Close Application"
 msgstr "어플리케이션 닫기"
 
-#: ../IDEFrame.py:1089
-#: ../Beremiz.py:319
-#: ../Beremiz.py:552
-#: ../PLCOpenEditor.py:131
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
 msgid "Close Project"
 msgstr "프로젝트 닫기"
 
-#: ../Beremiz.py:317
-#: ../PLCOpenEditor.py:129
-#, fuzzy
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
 msgid "Close Tab"
-msgstr "탭 닫기\tCTRL+W"
-
-#: ../editors/Viewer.py:481
+msgstr "탭 닫기"
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
 msgid "Coil"
-msgstr ""
-
-#: ../editors/Viewer.py:501
-#: ../editors/LDViewer.py:503
+msgstr "코일"
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
 msgid "Comment"
 msgstr "코멘트"
 
-#: ../controls/ProjectPropertiesPanel.py:94
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr "커뮤니티 지원"
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr "회사명"
+
+#: ../controls/ProjectPropertiesPanel.py:106
 msgid "Company Name (required):"
 msgstr "회사명(필수):"
 
-#: ../controls/ProjectPropertiesPanel.py:95
+#: ../controls/ProjectPropertiesPanel.py:107
 msgid "Company URL (optional):"
 msgstr "회사 URL(옵션):"
 
@@ -999,7 +985,7 @@
 msgid "Comparison"
 msgstr "비교연산"
 
-#: ../ProjectController.py:538
+#: ../ProjectController.py:756
 msgid "Compiling IEC Program into C code...\n"
 msgstr "IEC 프로그램을 C코드로 컴파일링 중...\n"
 
@@ -1007,74 +993,95 @@
 msgid "Concatenation"
 msgstr "문자열 연결(concatenation)"
 
-#: ../dialogs/SearchInProjectDialog.py:47
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr "프로젝트 설정"
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr "설정 변수들"
+
+#: ../dialogs/SearchInProjectDialog.py:43
 msgid "Configuration"
 msgstr "설정(Configuration)"
 
-#: ../PLCControler.py:96
+#: ../plcopen/types_enums.py:77
 msgid "Configurations"
 msgstr "구성(Configurations)"
 
-#: ../ProjectController.py:1503
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr "승인 또는 변수 이름을 변경하세요"
+
+#: ../ProjectController.py:1842
 msgid "Connect"
 msgstr "연결하기"
 
-#: ../ProjectController.py:1504
+#: ../ProjectController.py:1843
 msgid "Connect to the target PLC"
 msgstr "타겟 PLC와 연결"
 
-#: ../connectors/PYRO/__init__.py:40
-#, python-format
-msgid "Connecting to URI : %s\n"
-msgstr "URI 주소로 연결중 : %s\n"
-
-#: ../editors/Viewer.py:467
-#: ../dialogs/SFCTransitionDialog.py:76
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr "URI: %s 에 연결되었습니다. "
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
 msgid "Connection"
 msgstr "연결"
 
-#: ../dialogs/ConnectionDialog.py:37
+#: ../dialogs/ConnectionDialog.py:55
 msgid "Connection Properties"
 msgstr "연결 속성"
 
-#: ../ProjectController.py:1359
+#: ../ProjectController.py:1691
 msgid "Connection canceled!\n"
 msgstr "연결 취소!\n"
 
-#: ../ProjectController.py:1384
+#: ../ProjectController.py:1714
 #, python-format
 msgid "Connection failed to %s!\n"
 msgstr "%s 연결에 실패 하였습니다!\n"
 
-#: ../connectors/PYRO/__init__.py:63
-#, fuzzy, python-format
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr "연결이 끊어졌습니다!\n"
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
 msgid "Connection to '%s' failed.\n"
-msgstr "%s 의 C 컴파일 작업이 실패 했습니다\n"
-
-#: ../dialogs/ConnectionDialog.py:56
+msgstr "'%s'와의 연결이 실패하였습니다.\n"
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
 msgid "Connector"
 msgstr "연결자(Connector)"
 
-#: ../dialogs/SFCStepDialog.py:58
+#: ../dialogs/SFCStepDialog.py:68
 msgid "Connectors:"
 msgstr "연결자(Connectors):"
 
-#: ../controls/VariablePanel.py:65
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr "콘솔"
+
+#: ../controls/VariablePanel.py:75
 msgid "Constant"
 msgstr "상수"
 
-#: ../editors/Viewer.py:477
-#, fuzzy
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
 msgid "Contact"
 msgstr "지속 커넥터"
 
-#: ../controls/ProjectPropertiesPanel.py:197
+#: ../controls/ProjectPropertiesPanel.py:217
 msgid "Content Description (optional):"
 msgstr "컨텐츠 설명(옵션):"
 
-#: ../dialogs/ConnectionDialog.py:61
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
 msgid "Continuation"
-msgstr "지속 커넥터"
+msgstr "지속 연결자"
 
 #: ../plcopen/iec_std.csv:18
 msgid "Conversion from BCD"
@@ -1092,196 +1099,184 @@
 msgid "Conversion to time-of-day"
 msgstr "시간으로 변환"
 
-#: ../IDEFrame.py:348
-#: ../IDEFrame.py:401
-#: ../editors/Viewer.py:536
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
 msgid "Copy"
 msgstr "복사하기"
 
-#: ../IDEFrame.py:1961
+#: ../IDEFrame.py:1964
 msgid "Copy POU"
 msgstr "POU 복사"
 
-#: ../editors/FileManagementPanel.py:283
+#: ../editors/FileManagementPanel.py:68
 msgid "Copy file from left folder to right"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:282
+msgstr "좌측폴더에서 우측폴더로 파일을 복사"
+
+#: ../editors/FileManagementPanel.py:67
 msgid "Copy file from right folder to left"
-msgstr ""
+msgstr "우측폴더에서 좌측폴더로 파일을 복사"
 
 #: ../plcopen/iec_std.csv:28
 msgid "Cosine"
 msgstr "Cosine"
 
-#: ../ConfigTreeNode.py:582
-#, python-format
-msgid ""
-"Could not add child \"%s\", type %s :\n"
-"%s\n"
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
 msgstr ""
-"\"%s\" child 추가 할 수 없습니다, type %s:\n"
-"%s\n"
-
-#: ../ConfigTreeNode.py:559
-#, python-format
-msgid ""
-"Couldn't load confnode base parameters %s :\n"
-" %s"
+"차일드 \"{a1}\" 를 추가할 수 없습니다, 타입 {a2} :\n"
+"{a3}\n"
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr "예전 파일 %s을 불러올 수 없습니다."
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
 msgstr ""
-"플러그인 베이스 파라메터를 불러 올 수 없습니다 %s:\n"
-"%s"
-
-#: ../ConfigTreeNode.py:570
-#, python-format
-msgid ""
-"Couldn't load confnode parameters %s :\n"
-" %s"
+"confnode 기본 파라메터들을 불러올 수 없었습니다 {a1}:\n"
+"{a2}"
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
 msgstr ""
-"플러그인 파라메터를 불러 올 수 없습니다 %s:\n"
-"%s"
-
-#: ../PLCControler.py:765
-#: ../PLCControler.py:802
+"confnode 파라메터들을 불러올 수 없었습니다 {a1}:\n"
+"{a2}"
+
+#: ../PLCControler.py:552
 msgid "Couldn't paste non-POU object."
 msgstr "POU 오브젝트만 붙여넣기 가능합니다"
 
-#: ../ProjectController.py:1317
+#: ../ProjectController.py:1636
 msgid "Couldn't start PLC !\n"
 msgstr "PLC 를 시작 할 수 없습니다!\n"
 
-#: ../ProjectController.py:1325
+#: ../ProjectController.py:1644
 msgid "Couldn't stop PLC !\n"
 msgstr "PLC 를 정지 할 수 없습니다!\n"
 
-#: ../ProjectController.py:1295
-msgid "Couldn't stop debugger.\n"
-msgstr "디버거를 정지 할 수 없습니다.\n"
-
-#: ../svgui/svgui.py:22
+#: ../svgui/svgui.py:57
 msgid "Create HMI"
 msgstr "HMI 생성"
 
-#: ../dialogs/PouDialog.py:43
+#: ../dialogs/PouDialog.py:54
 msgid "Create a new POU"
 msgstr "새로운 POU 생성"
 
-#: ../dialogs/PouActionDialog.py:38
+#: ../dialogs/PouActionDialog.py:45
 msgid "Create a new action"
 msgstr "새로운 액션 생성"
 
-#: ../IDEFrame.py:135
+#: ../IDEFrame.py:166
 msgid "Create a new action block"
 msgstr "새로운 액션 블럭 생성"
 
-#: ../IDEFrame.py:84
-#: ../IDEFrame.py:114
-#: ../IDEFrame.py:147
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
 msgid "Create a new block"
 msgstr "새로운 블럭 생성"
 
-#: ../IDEFrame.py:108
+#: ../IDEFrame.py:139
 msgid "Create a new branch"
 msgstr "새로운 분기(Branch) 생성"
 
-#: ../IDEFrame.py:102
+#: ../IDEFrame.py:133
 msgid "Create a new coil"
 msgstr "새로운 코일 생성"
 
-#: ../IDEFrame.py:78
-#: ../IDEFrame.py:93
-#: ../IDEFrame.py:123
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
 msgid "Create a new comment"
 msgstr "새로운 코멘트 생성"
 
-#: ../IDEFrame.py:87
-#: ../IDEFrame.py:117
-#: ../IDEFrame.py:150
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
 msgid "Create a new connection"
 msgstr "새로운 연결 생성"
 
-#: ../IDEFrame.py:105
-#: ../IDEFrame.py:156
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
 msgid "Create a new contact"
 msgstr "새로운 접점 생성"
 
-#: ../IDEFrame.py:138
+#: ../IDEFrame.py:169
 msgid "Create a new divergence"
 msgstr "새로운 분기(divergence) 생성"
 
-#: ../dialogs/SFCDivergenceDialog.py:36
+#: ../dialogs/SFCDivergenceDialog.py:54
 msgid "Create a new divergence or convergence"
 msgstr "새로운 분기(divergence) 또는 합류(convergence) 생성"
 
-#: ../IDEFrame.py:126
+#: ../IDEFrame.py:157
 msgid "Create a new initial step"
 msgstr "새로운 이니셜 스텝 생성"
 
-#: ../IDEFrame.py:141
+#: ../IDEFrame.py:172
 msgid "Create a new jump"
 msgstr "새로운 점프 생성"
 
-#: ../IDEFrame.py:96
-#: ../IDEFrame.py:153
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
 msgid "Create a new power rail"
 msgstr "새로운 전원 레일 생성"
 
-#: ../IDEFrame.py:99
+#: ../IDEFrame.py:130
 msgid "Create a new rung"
 msgstr "새로운 Rung 생성"
 
-#: ../IDEFrame.py:129
+#: ../IDEFrame.py:160
 msgid "Create a new step"
 msgstr "새로운 스텝 생성"
 
-#: ../IDEFrame.py:132
-#: ../dialogs/PouTransitionDialog.py:42
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
 msgid "Create a new transition"
 msgstr "새로운 트랜지션 생성"
 
-#: ../IDEFrame.py:81
-#: ../IDEFrame.py:111
-#: ../IDEFrame.py:144
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
 msgid "Create a new variable"
 msgstr "새로운 변수 생성"
 
-#: ../IDEFrame.py:346
-#: ../IDEFrame.py:400
-#: ../editors/Viewer.py:535
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr "크레딧"
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr "현재 작업 디렉토리:"
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
 msgid "Cut"
 msgstr "잘라내기"
 
-#: ../editors/ResourceEditor.py:71
+#: ../editors/ResourceEditor.py:81
 msgid "Cyclic"
 msgstr "주기적"
 
-#: ../plcopen/iec_std.csv:42
-#: ../plcopen/iec_std.csv:44
-#: ../plcopen/iec_std.csv:46
-#: ../plcopen/iec_std.csv:50
-#: ../plcopen/iec_std.csv:52
-#: ../plcopen/iec_std.csv:54
-#: ../plcopen/iec_std.csv:56
-#: ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
 #: ../plcopen/iec_std.csv:60
 msgid "DEPRECATED"
 msgstr "사용중지됨"
 
-#: ../canfestival/SlaveEditor.py:50
-#: ../canfestival/NetworkEditor.py:80
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
 msgid "DS-301 Profile"
 msgstr "DS-301 프로필"
 
-#: ../canfestival/SlaveEditor.py:51
-#: ../canfestival/NetworkEditor.py:81
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
 msgid "DS-302 Profile"
 msgstr "DS-302 프로필"
 
-#: ../dialogs/SearchInProjectDialog.py:43
+#: ../dialogs/SearchInProjectDialog.py:39
 msgid "Data Type"
 msgstr "데이터 타입(Data Type)"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:76
 msgid "Data Types"
 msgstr "데이터 타입(Data Types)"
 
@@ -1289,86 +1284,71 @@
 msgid "Data type conversion"
 msgstr "데이터 타입 변환"
 
-#: ../plcopen/iec_std.csv:44
-#: ../plcopen/iec_std.csv:45
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
 msgid "Date addition"
 msgstr "날짜 추가"
 
-#: ../plcopen/iec_std.csv:56
-#: ../plcopen/iec_std.csv:57
-#: ../plcopen/iec_std.csv:58
-#: ../plcopen/iec_std.csv:59
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
 msgid "Date and time subtraction"
 msgstr "날짜, 시간 뺄셈"
 
-#: ../plcopen/iec_std.csv:50
-#: ../plcopen/iec_std.csv:51
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
 msgid "Date subtraction"
 msgstr "날짜 뺄셈"
 
-#: ../dialogs/DurationEditorDialog.py:43
+#: ../dialogs/DurationEditorDialog.py:46
 msgid "Days:"
-msgstr ""
-
-#: ../ProjectController.py:1405
-msgid "Debug connect matching running PLC\n"
-msgstr "디버그 작동중인 PLC와 매칭 되었습니다\n"
-
-#: ../ProjectController.py:1408
-msgid "Debug do not match PLC - stop/transfert/start to re-enable\n"
-msgstr "PLC와 디버거가 연결되지 않았습니다 - 정지/전송/시작을 다시 시도하세요\n"
-
-#: ../controls/PouInstanceVariablesPanel.py:52
-#, fuzzy
+msgstr "일:"
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr "디버그 정보가 PLC와 일치하지 않습니다 - 활성화를 위해 정지/전송/시작 버튼을 누르세요\n"
+
+#: ../controls/PouInstanceVariablesPanel.py:144
 msgid "Debug instance"
-msgstr "인스턴스 삭제"
-
-#: ../editors/Viewer.py:3222
+msgstr "디버그 인스턴스"
+
+#: ../editors/Viewer.py:490
 #, python-format
 msgid "Debug: %s"
 msgstr "디버그: %s"
 
-#: ../ProjectController.py:1122
-#, fuzzy, python-format
+#: ../ProjectController.py:1471
+#, python-format
 msgid "Debug: Unknown variable '%s'\n"
-msgstr "디버그 : 알 수 없는 변수 %s\n"
-
-#: ../ProjectController.py:1120
-#, fuzzy, python-format
+msgstr "Debug: 알 수 없는 변수 '%s'\n"
+
+#: ../ProjectController.py:1469
+#, python-format
 msgid "Debug: Unsupported type to debug '%s'\n"
-msgstr "디버그 : 지원하지 않는 타입 %s\n"
-
-#: ../IDEFrame.py:608
+msgstr "Debug: 지원되지 않는 자료형 '%s'\n"
+
+#: ../IDEFrame.py:660
 msgid "Debugger"
 msgstr "디버거"
 
-#: ../ProjectController.py:1285
-msgid "Debugger disabled\n"
-msgstr "디버거 사용 불가\n"
-
-#: ../ProjectController.py:1297
-msgid "Debugger stopped.\n"
-msgstr "디버거 정지.\n"
-
-#: ../IDEFrame.py:1990
-#: ../Beremiz.py:958
-#: ../editors/Viewer.py:511
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr "디버거가 준비되었습니다. \n"
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
 msgid "Delete"
 msgstr "삭제"
 
-#: ../editors/Viewer.py:454
+#: ../editors/Viewer.py:610
 msgid "Delete Divergence Branch"
 msgstr "파생된 Branch 삭제 (Divergence Branch)"
 
-#: ../editors/FileManagementPanel.py:371
+#: ../editors/FileManagementPanel.py:157
 msgid "Delete File"
-msgstr ""
-
-#: ../editors/Viewer.py:443
+msgstr "파일 삭제"
+
+#: ../editors/Viewer.py:597
 msgid "Delete Wire Segment"
 msgstr "와이어 세그먼트 삭제"
 
-#: ../controls/CustomEditableListBox.py:41
+#: ../controls/CustomEditableListBox.py:44
 msgid "Delete item"
 msgstr "항목 삭제"
 
@@ -1376,184 +1356,168 @@
 msgid "Deletion (within)"
 msgstr "내부 삭제"
 
-#: ../editors/DataTypeEditor.py:146
+#: ../editors/DataTypeEditor.py:161
 msgid "Derivation Type:"
 msgstr "미분 타입"
 
-#: ../plcopen/structures.py:264
-msgid ""
-"Derivative\n"
-"The derivative function block produces an output XOUT proportional to the rate of change of the input XIN."
-msgstr ""
-"미분\n"
-"미분 함수 블럭은 입력 XIN의 변화의 속도에 비례하여 출력 XOUT을 생성합니다"
-
-#: ../controls/VariablePanel.py:360
-#, fuzzy
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr "상세설명"
+
+#: ../controls/VariablePanel.py:463
 msgid "Description:"
-msgstr "방향:"
-
-#: ../editors/DataTypeEditor.py:314
-#: ../dialogs/ArrayTypeDialog.py:61
+msgstr "상세설명:"
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
 msgid "Dimensions:"
 msgstr "넓이:"
 
-#: ../dialogs/FindInPouDialog.py:61
-#, fuzzy
+#: ../dialogs/FindInPouDialog.py:69
 msgid "Direction"
-msgstr "방향:"
-
-#: ../dialogs/BrowseLocationsDialog.py:78
+msgstr "방향"
+
+#: ../dialogs/BrowseLocationsDialog.py:102
 msgid "Direction:"
 msgstr "방향:"
 
-#: ../editors/DataTypeEditor.py:52
+#: ../editors/DataTypeEditor.py:60
 msgid "Directly"
 msgstr "직접"
 
-#: ../ProjectController.py:1512
+#: ../ProjectController.py:1855
 msgid "Disconnect"
 msgstr "연결 해제"
 
-#: ../ProjectController.py:1514
+#: ../ProjectController.py:1856
 msgid "Disconnect from PLC"
 msgstr "PLC 연결 해제"
 
-#: ../editors/Viewer.py:496
-#, fuzzy
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr "연결 해제"
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
 msgid "Divergence"
-msgstr "벡터 발산(Divergence) 선택"
+msgstr "발산"
 
 #: ../plcopen/iec_std.csv:36
 msgid "Division"
 msgstr "분할"
 
-#: ../editors/FileManagementPanel.py:370
+#: ../editors/FileManagementPanel.py:156
 #, python-format
 msgid "Do you really want to delete the file '%s'?"
-msgstr ""
-
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
+msgstr "정말 '%s' 파일을 삭제해도 될까요? "
+
+#: ../controls/VariablePanel.py:65
 msgid "Documentation"
 msgstr "도움문서"
 
-#: ../PLCOpenEditor.py:351
+#: ../PLCOpenEditor.py:312
 msgid "Done"
 msgstr "완료"
 
-#: ../plcopen/structures.py:227
-msgid ""
-"Down-counter\n"
-"The down-counter can be used to signal when a count has reached zero, on counting down from a preset value."
-msgstr ""
-"감산 카운터\n"
-"감산 카운터는 사용자가 설정한 값으로부터 감소하여 0이 될 때 신호를 발생시킵니다."
-
-#: ../dialogs/ActionBlockDialog.py:37
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Duration"
 msgstr "지속시간"
 
-#: ../canfestival/canfestival.py:118
-#, fuzzy
+#: ../canfestival/canfestival.py:174
 msgid "EDS files (*.eds)|*.eds|All files|*.*"
-msgstr "SVG 파일 (*.svg)|*svg|모든 파일|*.*"
-
-#: ../editors/Viewer.py:510
+msgstr "EDS 파일들 (*.eds)|*.eds|All files|*.*"
+
+#: ../editors/Viewer.py:668
 msgid "Edit Block"
 msgstr "블럭 수정"
 
-#: ../dialogs/LDElementDialog.py:41
+#: ../dialogs/LDElementDialog.py:58
 msgid "Edit Coil Values"
 msgstr "코일 데이터 수정"
 
-#: ../dialogs/LDElementDialog.py:38
+#: ../dialogs/LDElementDialog.py:56
 msgid "Edit Contact Values"
 msgstr "접접 데이터 수정"
 
-#: ../dialogs/DurationEditorDialog.py:59
-#, fuzzy
+#: ../dialogs/DurationEditorDialog.py:62
 msgid "Edit Duration"
-msgstr "트랜지션 수정"
-
-#: ../dialogs/SFCStepDialog.py:35
+msgstr "지속시간 수정"
+
+#: ../dialogs/SFCStepDialog.py:53
 msgid "Edit Step"
 msgstr "스텝 수정"
 
-#: ../wxglade_hmi/wxglade_hmi.py:12
+#: ../wxglade_hmi/wxglade_hmi.py:45
 msgid "Edit a WxWidgets GUI with WXGlade"
 msgstr "WXGlade를 이용하여 GUI 수정"
 
-#: ../dialogs/ActionBlockDialog.py:122
+#: ../dialogs/ActionBlockDialog.py:127
 msgid "Edit action block properties"
 msgstr "액션 블럭 속성 수정"
 
-#: ../dialogs/ArrayTypeDialog.py:45
-#, fuzzy
+#: ../dialogs/ArrayTypeDialog.py:47
 msgid "Edit array type properties"
-msgstr "액션 블럭 속성 수정"
-
-#: ../editors/Viewer.py:2112
-#: ../editors/Viewer.py:2114
-#: ../editors/Viewer.py:2630
-#: ../editors/Viewer.py:2632
+msgstr "배열 타입 속성 수정"
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
 msgid "Edit comment"
 msgstr "코멘트 수정"
 
-#: ../editors/FileManagementPanel.py:284
-#, fuzzy
+#: ../editors/FileManagementPanel.py:69
 msgid "Edit file"
-msgstr "C 파일 수정"
-
-#: ../controls/CustomEditableListBox.py:39
+msgstr "파일 편집"
+
+#: ../controls/CustomEditableListBox.py:42
 msgid "Edit item"
 msgstr "항목 수정"
 
-#: ../editors/Viewer.py:2594
+#: ../editors/Viewer.py:3059
 msgid "Edit jump target"
 msgstr "점프 타겟 수정"
 
-#: ../ProjectController.py:1526
+#: ../ProjectController.py:1873
 msgid "Edit raw IEC code added to code generated by PLCGenerator"
 msgstr "PLCGenerator로 생성된 IEC 코드 수정"
 
-#: ../editors/SFCViewer.py:725
+#: ../editors/SFCViewer.py:815
 msgid "Edit step name"
 msgstr "스텝 이름 수정"
 
-#: ../dialogs/SFCTransitionDialog.py:38
+#: ../dialogs/SFCTransitionDialog.py:53
 msgid "Edit transition"
 msgstr "트랜지션 수정"
 
-#: ../IDEFrame.py:580
+#: ../IDEFrame.py:632
 msgid "Editor ToolBar"
-msgstr ""
-
-#: ../ProjectController.py:1013
+msgstr "툴바 에디터"
+
+#: ../ProjectController.py:1294
 msgid "Editor selection"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:341
+msgstr "에디터 선택"
+
+#: ../editors/DataTypeEditor.py:360
 msgid "Elements :"
 msgstr "구성원:"
 
-#: ../IDEFrame.py:343
-msgid "Enable Undo/Redo"
-msgstr "되돌리기/되돌리기 취소 활성화"
-
-#: ../Beremiz_service.py:380
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr "비어있는"
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr "배열에서 비어있는 차원은 허용되지 않습니다. "
+
+#: ../Beremiz_service.py:341
 msgid "Enter a name "
 msgstr "이름 입력"
 
-#: ../Beremiz_service.py:365
+#: ../Beremiz_service.py:326
 msgid "Enter a port number "
 msgstr "포트 번호 입력"
 
-#: ../Beremiz_service.py:355
+#: ../Beremiz_service.py:317
 msgid "Enter the IP of the interface to bind"
 msgstr "바인드 인터페이스 IP 입력"
 
-#: ../editors/DataTypeEditor.py:52
+#: ../editors/DataTypeEditor.py:60
 msgid "Enumerated"
 msgstr "열거형 데이터"
 
@@ -1561,69 +1525,47 @@
 msgid "Equal to"
 msgstr "같은 값 일때"
 
-#: ../Beremiz_service.py:270
-#: ../Beremiz_service.py:394
-#: ../controls/VariablePanel.py:330
-#: ../controls/VariablePanel.py:678
-#: ../controls/DebugVariablePanel.py:164
-#: ../IDEFrame.py:1083
-#: ../IDEFrame.py:1672
-#: ../IDEFrame.py:1709
-#: ../IDEFrame.py:1714
-#: ../IDEFrame.py:1728
-#: ../IDEFrame.py:1733
-#: ../IDEFrame.py:2422
-#: ../Beremiz.py:1083
-#: ../PLCOpenEditor.py:358
-#: ../PLCOpenEditor.py:363
-#: ../PLCOpenEditor.py:531
-#: ../PLCOpenEditor.py:541
-#: ../editors/TextViewer.py:376
-#: ../editors/DataTypeEditor.py:543
-#: ../editors/DataTypeEditor.py:548
-#: ../editors/DataTypeEditor.py:572
-#: ../editors/DataTypeEditor.py:577
-#: ../editors/DataTypeEditor.py:587
-#: ../editors/DataTypeEditor.py:719
-#: ../editors/DataTypeEditor.py:726
-#: ../editors/Viewer.py:366
-#: ../editors/LDViewer.py:663
-#: ../editors/LDViewer.py:879
-#: ../editors/LDViewer.py:883
-#: ../editors/FileManagementPanel.py:210
-#: ../ProjectController.py:221
-#: ../dialogs/PouNameDialog.py:53
-#: ../dialogs/PouTransitionDialog.py:107
-#: ../dialogs/BrowseLocationsDialog.py:175
-#: ../dialogs/ProjectDialog.py:71
-#: ../dialogs/SFCStepNameDialog.py:59
-#: ../dialogs/ConnectionDialog.py:152
-#: ../dialogs/FBDVariableDialog.py:201
-#: ../dialogs/PouActionDialog.py:104
-#: ../dialogs/BrowseValuesLibraryDialog.py:83
-#: ../dialogs/PouDialog.py:132
-#: ../dialogs/SFCTransitionDialog.py:147
-#: ../dialogs/DurationEditorDialog.py:121
-#: ../dialogs/DurationEditorDialog.py:163
-#: ../dialogs/SearchInProjectDialog.py:157
-#: ../dialogs/SFCStepDialog.py:130
-#: ../dialogs/ArrayTypeDialog.py:97
-#: ../dialogs/ArrayTypeDialog.py:103
-#: ../dialogs/FBDBlockDialog.py:164
-#: ../dialogs/ForceVariableDialog.py:169
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
 msgid "Error"
 msgstr "에러"
 
-#: ../ProjectController.py:587
-msgid "Error : At least one configuration and one resource must be declared in PLC !\n"
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
 msgstr "에러 : PLC 프로그램은 하나 이상의 설정과 리소스가 반드시 선언되어야 합니다!\n"
 
-#: ../ProjectController.py:579
+#: ../ProjectController.py:803
 #, python-format
 msgid "Error : IEC to C compiler returned %d\n"
 msgstr "에러 : IEC -> C 컴파일러 %d\n"
 
-#: ../ProjectController.py:520
+#: ../ProjectController.py:731
 #, python-format
 msgid ""
 "Error in ST/IL/SFC code generator :\n"
@@ -1632,38 +1574,44 @@
 "ST/IL/SFC 코드 생성기 에러 : \n"
 "%s\n"
 
-#: ../ConfigTreeNode.py:182
+#: ../ConfigTreeNode.py:219
 #, python-format
 msgid "Error while saving \"%s\"\n"
 msgstr "저장 중 에러 발생 \"%s\"\n"
 
-#: ../canfestival/canfestival.py:122
+#: ../canfestival/canfestival.py:179
 msgid "Error: Export slave failed\n"
-msgstr ""
-
-#: ../canfestival/canfestival.py:270
+msgstr "에러: 슬레이브 내보내기 실패\n"
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr "에러: Modbus/IP 서버 %{a1}.x와 %{a2}.x가 같은 port 번호 {a3}을 사용하고 있습니다.\n"
+
+#: ../canfestival/canfestival.py:388
 msgid "Error: No Master generated\n"
 msgstr "에러 : 마스터 미생성 \"%s\"\n"
 
-#: ../canfestival/canfestival.py:265
+#: ../canfestival/canfestival.py:383
 msgid "Error: No PLC built\n"
 msgstr "에러 : PLC 빌드 미생성\n"
 
-#: ../ProjectController.py:1378
+#: ../ProjectController.py:1708
 #, python-format
 msgid "Exception while connecting %s!\n"
 msgstr "%s접속중 예외 상황이 발생했습니다!\n"
 
-#: ../dialogs/FBDBlockDialog.py:95
+#: ../dialogs/FBDBlockDialog.py:123
 msgid "Execution Control:"
 msgstr "실행 제어:"
 
-#: ../dialogs/FBDVariableDialog.py:76
-#: ../dialogs/FBDBlockDialog.py:87
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
 msgid "Execution Order:"
 msgstr "실행 순서:"
 
-#: ../features.py:10
+#: ../features.py:36
 msgid "Experimental web based HMI"
 msgstr "웹 기반의 HMI(실험중)"
 
@@ -1675,193 +1623,167 @@
 msgid "Exponentiation"
 msgstr "지수화"
 
-#: ../canfestival/canfestival.py:128
+#: ../canfestival/canfestival.py:186
 msgid "Export CanOpen slave to EDS file"
-msgstr ""
-
-#: ../editors/GraphicViewer.py:144
+msgstr "CanOpen 슬레이브를 EDS 파일로 내보내기"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
 msgid "Export graph values to clipboard"
-msgstr ""
-
-#: ../canfestival/canfestival.py:127
+msgstr "그래프 값들을 클립보드로 내보내기"
+
+#: ../canfestival/canfestival.py:185
 msgid "Export slave"
-msgstr ""
-
-#: ../dialogs/FBDVariableDialog.py:69
+msgstr "슬레이브 내보내기"
+
+#: ../dialogs/FBDVariableDialog.py:94
 msgid "Expression:"
 msgstr "표현식:"
 
-#: ../controls/VariablePanel.py:77
+#: ../controls/VariablePanel.py:90
 msgid "External"
 msgstr "외부"
 
-#: ../ProjectController.py:591
+#: ../ProjectController.py:826
 msgid "Extracting Located Variables...\n"
 msgstr "위치 변수(located variables) 추출 중...\n"
 
-#: ../controls/ProjectPropertiesPanel.py:143
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "FBD"
 msgstr "FBD"
 
-#: ../ProjectController.py:1445
+#: ../ProjectController.py:1773
 msgid "Failed : Must build before transfer.\n"
 msgstr "실패 : 빌드 후에 전송 하세요.\n"
 
-#: ../editors/Viewer.py:405
-#: ../dialogs/LDElementDialog.py:84
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
 msgid "Falling Edge"
 msgstr "폴링 엣지"
 
-#: ../plcopen/structures.py:217
-msgid ""
-"Falling edge detector\n"
-"The output produces a single pulse when a falling edge is detected."
-msgstr ""
-"폴링 엣지 검출\n"
-"출력부의 폴링 엣지를 검출합니다"
-
-#: ../ProjectController.py:900
+#: ../ProjectController.py:1098
 msgid "Fatal : cannot get builder.\n"
 msgstr "치명적 오류 : 빌드 파일 생성 프로그램을 찾을 수 없습니다.\n"
 
-#: ../dialogs/DurationEditorDialog.py:160
-#, fuzzy, python-format
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr "%s 가져오기 중"
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
 msgid "Field %s hasn't a valid value!"
-msgstr "\"%s\" 유효하지 않은 값입니다!"
-
-#: ../dialogs/DurationEditorDialog.py:162
-#, fuzzy, python-format
+msgstr "필드 %s는 유효하지 않은 값입니다!"
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
 msgid "Fields %s haven't a valid value!"
-msgstr "\"%s\" 유효하지 않은 값입니다!"
-
-#: ../editors/FileManagementPanel.py:209
-#, fuzzy, python-format
+msgstr "필드 %s는 유효한 값이 아닙니다!"
+
+#: ../controls/FolderTree.py:221
+#, python-format
 msgid "File '%s' already exists!"
-msgstr "입력 하신 \"%s\" 이 중복 되는 이름입니다. -> \"%s\"\n"
-
-#: ../IDEFrame.py:353
-#: ../dialogs/FindInPouDialog.py:30
-#: ../dialogs/FindInPouDialog.py:99
+msgstr "파일 '%s' 가 이미 존재합니다!"
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
 msgid "Find"
-msgstr ""
-
-#: ../IDEFrame.py:355
-#, fuzzy
+msgstr "찾기"
+
+#: ../IDEFrame.py:379
 msgid "Find Next"
-msgstr "인쇄\tCTRL+P"
-
-#: ../IDEFrame.py:357
-#, fuzzy
+msgstr "다음 찾기"
+
+#: ../IDEFrame.py:381
 msgid "Find Previous"
-msgstr "인쇄 페이지 미리보기\tCTRL+SHIFT+P"
+msgstr "이전 찾기"
 
 #: ../plcopen/iec_std.csv:90
 msgid "Find position"
 msgstr "위치 찾기"
 
-#: ../dialogs/FindInPouDialog.py:51
+#: ../dialogs/FindInPouDialog.py:58
 msgid "Find:"
-msgstr ""
-
-#: ../connectors/PYRO/__init__.py:125
-msgid "Force runtime reload\n"
-msgstr "실행환경 강제 리로딩\n"
-
-#: ../controls/DebugVariablePanel.py:295
-#: ../editors/Viewer.py:1353
+msgstr "찾기:"
+
+#: ../editors/Viewer.py:1633
 msgid "Force value"
 msgstr "강제 데이터 입력"
 
-#: ../dialogs/ForceVariableDialog.py:152
+#: ../dialogs/ForceVariableDialog.py:176
 msgid "Forcing Variable Value"
 msgstr "강제 변수 데이터"
 
-#: ../dialogs/PouTransitionDialog.py:97
-#: ../dialogs/ProjectDialog.py:70
-#: ../dialogs/PouActionDialog.py:94
-#: ../dialogs/PouDialog.py:114
-#: ../dialogs/SFCTransitionDialog.py:147
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
 #, python-format
 msgid "Form isn't complete. %s must be filled!"
 msgstr "형식이 완성되지 않았습니다. %s 를 입력하세요!"
 
-#: ../dialogs/ConnectionDialog.py:142
-#: ../dialogs/FBDBlockDialog.py:154
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
 msgid "Form isn't complete. Name must be filled!"
 msgstr "형식이 완성되지 않았습니다. 이름을 입력하세요"
 
-#: ../dialogs/SearchInProjectDialog.py:145
-msgid "Form isn't complete. Pattern to search must be filled!"
-msgstr "형식이 완성되지 않았습니다. 검색어를 입력하세요!"
-
-#: ../dialogs/FBDBlockDialog.py:152
+#: ../dialogs/FBDBlockDialog.py:235
 msgid "Form isn't complete. Valid block type must be selected!"
 msgstr "형식이 완성되지 않았습니다. 블럭 타입을 선택하세요!"
 
-#: ../dialogs/FindInPouDialog.py:67
+#: ../dialogs/FindInPouDialog.py:75
 msgid "Forward"
-msgstr ""
-
-#: ../dialogs/SearchInProjectDialog.py:44
+msgstr "앞으로"
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
 msgid "Function"
 msgstr "함수"
 
-#: ../IDEFrame.py:329
+#: ../IDEFrame.py:354
 msgid "Function &Block"
 msgstr "함수 &블록"
 
-#: ../IDEFrame.py:1969
-#: ../dialogs/SearchInProjectDialog.py:45
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
 msgid "Function Block"
 msgstr "함수 블럭(Function Block)"
 
-#: ../controls/VariablePanel.py:741
+#: ../controls/VariablePanel.py:868
 msgid "Function Block Types"
 msgstr "함수 블럭 타입"
 
-#: ../PLCControler.py:94
+#: ../plcopen/types_enums.py:75
 msgid "Function Blocks"
 msgstr "함수 블럭(Function Blocks)"
 
-#: ../editors/Viewer.py:236
+#: ../editors/Viewer.py:290
 msgid "Function Blocks can't be used in Functions!"
 msgstr "함수 블럭을 함수에서 사용할 수 없습니다!"
 
-#: ../editors/Viewer.py:238
-msgid "Function Blocks can't be used in Transitions!"
-msgstr "함수 블럭을 트랜지션에서 사용할 수 없습니다!"
-
-#: ../PLCControler.py:2055
+#: ../PLCControler.py:1907
 #, python-format
 msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
 msgstr "함수 블럭 \"%s\" 을 함수에 붙여 넣기 할 수 없습니다!!!"
 
-#: ../PLCControler.py:94
+#: ../plcopen/types_enums.py:75
 msgid "Functions"
 msgstr "함수 (Functions)"
 
-#: ../PLCOpenEditor.py:138
-#, fuzzy
+#: ../PLCOpenEditor.py:88
 msgid "Generate Program"
-msgstr "프로그램 생성\tCTRL+G"
-
-#: ../ProjectController.py:510
+msgstr "프로그램 생성"
+
+#: ../ProjectController.py:722
 msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
 msgstr "IEC-61131 기반의 ST/IL/SFC 코드 생성중...\n"
 
-#: ../controls/VariablePanel.py:78
+#: ../controls/VariablePanel.py:91
 msgid "Global"
 msgstr "글로벌"
 
-#: ../editors/GraphicViewer.py:131
-#, fuzzy
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
 msgid "Go to current value"
-msgstr "강제 데이터 입력"
-
-#: ../controls/ProjectPropertiesPanel.py:173
+msgstr "현재 값으로 가기"
+
+#: ../controls/ProjectPropertiesPanel.py:189
 msgid "Graphics"
 msgstr "그래픽"
 
@@ -1873,114 +1795,114 @@
 msgid "Greater than or equal to"
 msgstr "크거나 같은 값 일때"
 
-#: ../controls/ProjectPropertiesPanel.py:134
+#: ../controls/ProjectPropertiesPanel.py:149
 msgid "Grid Resolution:"
 msgstr "격자 해상도:"
 
-#: ../controls/ProjectPropertiesPanel.py:120
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr "HTTP 인터페이스 포트:"
+
+#: ../controls/ProjectPropertiesPanel.py:135
 msgid "Height:"
 msgstr "높이:"
 
-#: ../editors/FileManagementPanel.py:303
+#: ../editors/FileManagementPanel.py:89
 msgid "Home Directory:"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:150
+msgstr "홈 디렉토리:"
+
+#: ../controls/ProjectPropertiesPanel.py:165
 msgid "Horizontal:"
 msgstr "가로:"
 
-#: ../dialogs/DurationEditorDialog.py:44
+#: ../dialogs/DurationEditorDialog.py:47
 msgid "Hours:"
-msgstr ""
-
-#: ../plcopen/structures.py:279
-msgid ""
-"Hysteresis\n"
-"The hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2."
-msgstr ""
-"이력(Hysteresis)\n"
-"이력 펑션 블럭은 두 부동 소수점(REAL) 입력 XIN1, XIN2의 차이에 의한 이력(Hysteresis) 참,거짓(불린) 출력을 제공합니다"
-
-#: ../ProjectController.py:827
-msgid "IEC-61131-3 code generation failed !\n"
-msgstr "IEC-61131-3 코드 생성 실패!\n"
-
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+msgstr "시간:"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
 msgid "IL"
 msgstr "IL"
 
-#: ../Beremiz_service.py:356
-#: ../Beremiz_service.py:357
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr "IP"
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
 msgid "IP is not valid!"
 msgstr "IP를 정확히 입력하세요!"
 
-#: ../svgui/svgui.py:17
-#: ../svgui/svgui.py:18
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
 msgid "Import SVG"
 msgstr "SVG 가져오기"
 
-#: ../controls/VariablePanel.py:76
-#: ../dialogs/FBDVariableDialog.py:34
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
 msgid "InOut"
 msgstr "입출력"
 
-#: ../controls/VariablePanel.py:263
-#, python-format
-msgid "Incompatible data types between \"%s\" and \"%s\""
-msgstr "\"%s\" 와 \"%s\"간의 데이터 타입이 호환되지 않습니다"
-
-#: ../controls/VariablePanel.py:274
-#, python-format
-msgid "Incompatible size of data between \"%s\" and \"%s\""
-msgstr "\"%s\"와 \"%s\"간의 데이터 크기가 호환되지 않습니다"
-
-#: ../controls/VariablePanel.py:270
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr "POU {a3} 안의 블록 {a2} 내의 입출력 변수 {a1}이 연결되어야 합니다. "
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr "비활성"
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr "\"{a1}\" 과 \"{a2}\" 의 데이터 형이 호환되지 않습니다."
+
+#: ../controls/VariablePanel.py:306
 #, python-format
 msgid "Incompatible size of data between \"%s\" and \"BOOL\""
 msgstr "\"%s\"와 \"BOOL\"간의 데이터 크기가 호환되지 않습니다"
 
-#: ../dialogs/ActionBlockDialog.py:37
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr "\"{a1}\" 과 \"{a2}\" 의 데이터 크기가 호환되지 않습니다."
+
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Indicator"
 msgstr "지시기(Indicator)"
 
-#: ../editors/Viewer.py:492
-#, fuzzy
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr "초기값"
+
+#: ../editors/Viewer.py:650
 msgid "Initial Step"
-msgstr "초기 값"
-
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
-#: ../editors/DataTypeEditor.py:48
+msgstr "초기 스텝"
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
 msgid "Initial Value"
 msgstr "초기 값"
 
-#: ../editors/DataTypeEditor.py:178
-#: ../editors/DataTypeEditor.py:209
-#: ../editors/DataTypeEditor.py:265
-#: ../editors/DataTypeEditor.py:303
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
 msgid "Initial Value:"
 msgstr "초기 값:"
 
-#: ../svgui/svgui.py:21
+#: ../svgui/svgui.py:56
 msgid "Inkscape"
 msgstr "Inkscape"
 
-#: ../dialogs/ActionBlockDialog.py:41
-#: ../dialogs/SFCTransitionDialog.py:66
-#: ../dialogs/SFCTransitionDialog.py:137
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "인라인"
 
-#: ../controls/VariablePanel.py:76
-#: ../dialogs/BrowseLocationsDialog.py:36
-#: ../dialogs/FBDVariableDialog.py:33
-#: ../dialogs/SFCStepDialog.py:61
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Input"
 msgstr "입력"
 
-#: ../dialogs/FBDBlockDialog.py:78
+#: ../dialogs/FBDBlockDialog.py:99
 msgid "Inputs:"
 msgstr "입력(Inputs):"
 
@@ -1988,125 +1910,128 @@
 msgid "Insertion (into)"
 msgstr "대상에 삽입"
 
-#: ../plcopen/plcopen.py:1833
+#: ../plcopen/plcopen.py:1948
 #, python-format
 msgid "Instance with id %d doesn't exist!"
 msgstr "ID %d의 인스턴스가 존재하지 않습니다!"
 
-#: ../editors/ResourceEditor.py:247
+#: ../editors/ResourceEditor.py:279
 msgid "Instances:"
 msgstr "인스턴스:"
 
-#: ../plcopen/structures.py:259
-msgid ""
-"Integral\n"
-"The integral function block integrates the value of input XIN over time."
-msgstr ""
-"적분\n"
-"적분 함수 블럭은 시간에 따른 입력 XIN의 데이터를 적분합니다"
-
-#: ../controls/VariablePanel.py:75
+#: ../controls/VariablePanel.py:88
 msgid "Interface"
 msgstr "인터페이스"
 
-#: ../editors/ResourceEditor.py:71
+#: ../editors/ResourceEditor.py:81
 msgid "Interrupt"
 msgstr "인터럽트"
 
-#: ../editors/ResourceEditor.py:67
+#: ../editors/ResourceEditor.py:76
 msgid "Interval"
 msgstr "간격 (Interval)"
 
-#: ../PLCControler.py:2032
-#: ../PLCControler.py:2070
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+"부적절한 URL 입니다!\n"
+"올바른 URL 주소를 입력하세요. "
+
+#: ../PLCControler.py:1895
 msgid "Invalid plcopen element(s)!!!"
 msgstr "알 수 없는 plcopen 항목입니다!!!"
 
-#: ../canfestival/config_utils.py:376
-#: ../canfestival/config_utils.py:637
-#, python-format
-msgid "Invalid type \"%s\"-> %d != %d  for location\"%s\""
-msgstr "타입 에러 \"%s\" -> %d != %d 위치 \"%s\""
-
-#: ../dialogs/ForceVariableDialog.py:167
-#, python-format
-msgid "Invalid value \"%s\" for \"%s\" variable!"
-msgstr "\"%s\"값은 \"%s\" 변수에 적합하지 않습니다!"
-
-#: ../controls/DebugVariablePanel.py:153
-#: ../controls/DebugVariablePanel.py:156
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr "위치 \"{a4}\" 에 대한 부적절한 타입 \"{a1}\"->{a2} != {a3}"
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr "위치 \"{a4}\" 에 대한 부적절한 타입 \"{a1}\"->{a2} != {a3}"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
 #, python-format
 msgid "Invalid value \"%s\" for debug variable"
 msgstr "\"%s\"값은 디버그 변수에 적합하지 않습니다!"
 
-#: ../controls/VariablePanel.py:244
-#: ../controls/VariablePanel.py:247
-#, fuzzy, python-format
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
 msgid "Invalid value \"%s\" for variable grid element"
-msgstr "\"%s\"값은 \"%s\" 변수에 적합하지 않습니다!"
-
-#: ../editors/Viewer.py:221
-#: ../editors/Viewer.py:224
+msgstr "변수 그리드 엘리먼트에 대해 부적절한 값 \"%s\" 입니다"
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
 #, python-format
 msgid "Invalid value \"%s\" for viewer block"
 msgstr "\"%s\" 값은 뷰어 블록에 적합하지 않습니다!"
 
-#: ../dialogs/DurationEditorDialog.py:121
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr "\"{a2}\" 변수에 대해 \"{a1}\" 값은 적절하지 않습니다!"
+
+#: ../dialogs/DurationEditorDialog.py:124
 msgid ""
 "Invalid value!\n"
 "You must fill a numeric value."
 msgstr ""
-
-#: ../editors/Viewer.py:497
+"부적절한 값입니다!\n"
+"숫자 값을 채우셔야 합니다."
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr "연결이 보안 되어있습니까?"
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
 msgid "Jump"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:143
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+msgstr "점프"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "LD"
 msgstr "LD"
 
-#: ../editors/LDViewer.py:215
-#: ../editors/LDViewer.py:231
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
 #, python-format
 msgid "Ladder element with id %d is on more than one rung."
 msgstr "래더 항목 ID %d이 하나 이상의 Rung에 존재합니다"
 
-#: ../dialogs/PouTransitionDialog.py:86
-#: ../dialogs/PouActionDialog.py:83
-#: ../dialogs/PouDialog.py:102
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
 msgid "Language"
 msgstr "언어"
 
-#: ../controls/ProjectPropertiesPanel.py:186
+#: ../controls/ProjectPropertiesPanel.py:206
 msgid "Language (optional):"
 msgstr "언어(옵션):"
 
-#: ../dialogs/PouTransitionDialog.py:60
-#: ../dialogs/PouActionDialog.py:56
-#: ../dialogs/PouDialog.py:71
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
 msgid "Language:"
 msgstr "언어:"
 
-#: ../ProjectController.py:1451
+#: ../ProjectController.py:1779
 msgid "Latest build already matches current target. Transfering anyway...\n"
 msgstr "최근 빌드가 이미 타겟과 일치합니다. 전송합니다...\n"
 
-#: ../Beremiz_service.py:324
+#: ../Beremiz_service.py:281
 msgid "Launch WX GUI inspector"
 msgstr "WX GUI Inspector 실행"
 
-#: ../Beremiz_service.py:323
+#: ../Beremiz_service.py:280
 msgid "Launch a live Python shell"
 msgstr "Live Python Shell 실행"
 
-#: ../editors/Viewer.py:428
+#: ../editors/Viewer.py:580
 msgid "Left"
 msgstr "좌측"
 
-#: ../dialogs/LDPowerRailDialog.py:55
+#: ../dialogs/LDPowerRailDialog.py:64
 msgid "Left PowerRail"
 msgstr "좌측 전원 레일"
 
@@ -2122,195 +2047,184 @@
 msgid "Less than or equal to"
 msgstr "작거나 같은 값 일때"
 
-#: ../IDEFrame.py:600
+#: ../IDEFrame.py:652
 msgid "Library"
 msgstr "라이브러리"
 
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr "라이센스"
+
 #: ../plcopen/iec_std.csv:73
 msgid "Limitation"
 msgstr "한도"
 
-#: ../targets/toolchain_gcc.py:142
+#: ../targets/toolchain_gcc.py:209
 msgid "Linking :\n"
 msgstr "링크 중 : \n"
 
-#: ../controls/VariablePanel.py:77
-#: ../dialogs/DiscoveryDialog.py:110
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
 msgid "Local"
 msgstr "로컬"
 
-#: ../ProjectController.py:1353
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr "Local Entries"
+
+#: ../ProjectController.py:1685
 msgid "Local service discovery failed!\n"
-msgstr ""
-
-#: ../controls/VariablePanel.py:58
+msgstr "로컬 서비스 발견이 실패하였습니다!\n"
+
+#: ../controls/VariablePanel.py:62
 msgid "Location"
 msgstr "위치"
 
-#: ../dialogs/BrowseLocationsDialog.py:61
+#: ../dialogs/BrowseLocationsDialog.py:79
 msgid "Locations available:"
-msgstr "가능한 위치:"
-
-#: ../Beremiz.py:393
-msgid "Log Console"
-msgstr "로그 콘솔"
+msgstr "이용 가능한 Location:"
 
 #: ../plcopen/iec_std.csv:25
 msgid "Logarithm to base 10"
 msgstr "상용로그(상용대수)"
 
-#: ../connectors/PYRO/__init__.py:55
+#: ../connectors/PYRO/__init__.py:102
 #, python-format
 msgid "MDNS resolution failure for '%s'\n"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:37
-#: ../canfestival/NetworkEditor.py:67
+msgstr "'%s'에 대한 MDNS 확인 실패\n"
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
 msgid "Map Variable"
 msgstr "변수 맵"
 
-#: ../features.py:6
+#: ../features.py:31
 msgid "Map located variables over CANopen"
 msgstr "CANopen 변수 맵"
 
-#: ../canfestival/NetworkEditor.py:89
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr "Modbus 상에서의 위치 변수 맵"
+
+#: ../canfestival/NetworkEditor.py:113
 msgid "Master"
 msgstr "CAN 마스터"
 
-#: ../ConfigTreeNode.py:480
-#, python-format
-msgid "Max count (%d) reached for this confnode of type %s "
-msgstr "플러그인 최대 카운트 (%d)에 도달했습니다. %s"
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr "confnode 타입 {a2}에 대해 최대 카운트({a1})가 도달하였습니다."
 
 #: ../plcopen/iec_std.csv:71
 msgid "Maximum"
 msgstr "최대값"
 
-#: ../editors/DataTypeEditor.py:232
+#: ../editors/DataTypeEditor.py:246
 msgid "Maximum:"
 msgstr "최대값:"
 
-#: ../dialogs/BrowseLocationsDialog.py:38
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Memory"
 msgstr "메모리"
 
-#: ../IDEFrame.py:568
-#, fuzzy
+#: ../IDEFrame.py:617
 msgid "Menu ToolBar"
 msgstr "툴바"
 
-#: ../dialogs/DurationEditorDialog.py:48
+#: ../dialogs/DurationEditorDialog.py:51
 msgid "Microseconds:"
-msgstr ""
-
-#: ../editors/Viewer.py:433
+msgstr "마이크로초:"
+
+#: ../editors/Viewer.py:585
 msgid "Middle"
 msgstr "중간"
 
-#: ../dialogs/DurationEditorDialog.py:47
+#: ../dialogs/DurationEditorDialog.py:50
 msgid "Milliseconds:"
-msgstr ""
+msgstr "밀리초:"
 
 #: ../plcopen/iec_std.csv:72
 msgid "Minimum"
 msgstr "최소값"
 
-#: ../editors/DataTypeEditor.py:219
+#: ../editors/DataTypeEditor.py:233
 msgid "Minimum:"
 msgstr "최소값:"
 
-#: ../dialogs/DurationEditorDialog.py:45
+#: ../dialogs/DurationEditorDialog.py:48
 msgid "Minutes:"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:210
+msgstr "분:"
+
+#: ../controls/ProjectPropertiesPanel.py:231
 msgid "Miscellaneous"
 msgstr "기타"
 
-#: ../dialogs/LDElementDialog.py:59
+#: ../features.py:32
+msgid "Modbus support"
+msgstr "Modbus 지원"
+
+#: ../dialogs/LDElementDialog.py:65
 msgid "Modifier:"
 msgstr "수정자:"
 
-#: ../PLCGenerator.py:703
-#: ../PLCGenerator.py:936
-#, python-format
-msgid "More than one connector found corresponding to \"%s\" continuation in \"%s\" POU"
-msgstr "\"%s\"에 대응하는 하나 이상의 연결이 \"%s\" POU에서 발견 되었습니다"
-
-#: ../dialogs/ActionBlockDialog.py:141
-#, fuzzy
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr "\"{a2}\" POU에서 하나 이상의 \"{a1}\" 연속적인 커넥터를 찾았습니다"
+
+#: ../dialogs/ActionBlockDialog.py:146
 msgid "Move action down"
-msgstr "하단 이동"
-
-#: ../dialogs/ActionBlockDialog.py:140
-#, fuzzy
+msgstr "액션을 아래로 이동"
+
+#: ../dialogs/ActionBlockDialog.py:145
 msgid "Move action up"
-msgstr "상단 이동"
-
-#: ../controls/DebugVariablePanel.py:185
-#, fuzzy
-msgid "Move debug variable down"
-msgstr "출력 변수를 찾을 수 없습니다"
-
-#: ../controls/DebugVariablePanel.py:184
-#, fuzzy
-msgid "Move debug variable up"
-msgstr "출력 변수를 찾을 수 없습니다"
-
-#: ../controls/CustomEditableListBox.py:43
+msgstr "액션을 위로 이동"
+
+#: ../controls/CustomEditableListBox.py:46
 msgid "Move down"
 msgstr "하단 이동"
 
-#: ../editors/DataTypeEditor.py:348
-#, fuzzy
+#: ../editors/DataTypeEditor.py:367
 msgid "Move element down"
-msgstr "하단 이동"
-
-#: ../editors/DataTypeEditor.py:347
-#, fuzzy
+msgstr "엘리먼트를 아래로 이동"
+
+#: ../editors/DataTypeEditor.py:366
 msgid "Move element up"
-msgstr "상단 이동"
+msgstr "엘리먼트를 위로 이동"
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr "인스턴스를 아래로 이동"
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr "인스턴스를 위로 이동"
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr "태스크를 아래로 이동"
 
 #: ../editors/ResourceEditor.py:254
-#, fuzzy
-msgid "Move instance down"
-msgstr "하단 이동"
-
-#: ../editors/ResourceEditor.py:253
-#, fuzzy
-msgid "Move instance up"
-msgstr "상단 이동"
-
-#: ../editors/ResourceEditor.py:225
-#, fuzzy
-msgid "Move task down"
-msgstr "하단 이동"
-
-#: ../editors/ResourceEditor.py:224
-#, fuzzy
 msgid "Move task up"
-msgstr "상단 이동"
-
-#: ../IDEFrame.py:75
-#: ../IDEFrame.py:90
-#: ../IDEFrame.py:120
-#: ../IDEFrame.py:161
+msgstr "태스크를 위로 이동"
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
 msgid "Move the view"
 msgstr "화면을 드래그하여 이동"
 
-#: ../controls/CustomEditableListBox.py:42
+#: ../controls/CustomEditableListBox.py:45
 msgid "Move up"
 msgstr "상단 이동"
 
-#: ../controls/VariablePanel.py:381
-#, fuzzy
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
 msgid "Move variable down"
-msgstr "하단 이동"
-
-#: ../controls/VariablePanel.py:380
-#, fuzzy
+msgstr "변수를 아래로 이동"
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
 msgid "Move variable up"
-msgstr "상단 이동"
+msgstr "변수를 위로 이동"
 
 #: ../plcopen/iec_std.csv:74
 msgid "Multiplexer (select 1 of N)"
@@ -2320,28 +2234,26 @@
 msgid "Multiplication"
 msgstr "곱셈"
 
-#: ../editors/FileManagementPanel.py:301
-#, fuzzy
+#: ../editors/FileManagementPanel.py:87
 msgid "My Computer:"
-msgstr "컴파일러"
-
-#: ../controls/VariablePanel.py:58
+msgstr "내 컴퓨터:"
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr "이름"
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
 #: ../controls/VariablePanel.py:59
-#: ../editors/DataTypeEditor.py:48
-#: ../editors/ResourceEditor.py:67
-#: ../editors/ResourceEditor.py:76
 msgid "Name"
 msgstr "이름"
 
-#: ../Beremiz_service.py:381
+#: ../Beremiz_service.py:342
 msgid "Name must not be null!"
 msgstr "이름은 널(null)이 되어서는 안됩니다!"
 
-#: ../dialogs/ConnectionDialog.py:65
-#: ../dialogs/FBDVariableDialog.py:89
-#: ../dialogs/LDElementDialog.py:88
-#: ../dialogs/SFCStepDialog.py:51
-#: ../dialogs/FBDBlockDialog.py:70
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
 msgid "Name:"
 msgstr "이름:"
 
@@ -2349,46 +2261,46 @@
 msgid "Natural logarithm"
 msgstr "자연 로그"
 
-#: ../editors/Viewer.py:403
-#: ../dialogs/LDElementDialog.py:67
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
 msgid "Negated"
 msgstr "역 방향(Negate)"
 
-#: ../Beremiz.py:307
-#: ../Beremiz.py:342
-#: ../PLCOpenEditor.py:125
-#: ../PLCOpenEditor.py:167
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr "Nevow 웹서비스 실패"
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr "Nevow/Athena 불러오기가 실패했습니다:"
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
 msgid "New"
 msgstr "새로 만들기"
 
-#: ../controls/CustomEditableListBox.py:40
+#: ../controls/CustomEditableListBox.py:43
 msgid "New item"
 msgstr "새로운 아이템"
 
-#: ../editors/Viewer.py:402
+#: ../editors/Viewer.py:553
 msgid "No Modifier"
 msgstr "수정자 없음"
 
-#: ../PLCControler.py:2929
-msgid "No PLC project found"
-msgstr "PLC 프로젝트를 찾을 수 없습니다"
-
-#: ../ProjectController.py:1478
+#: ../ProjectController.py:1808
 msgid "No PLC to transfer (did build succeed ?)\n"
 msgstr "전송할 PLC 파일이 없습니다 (빌드 성공 여부를 확인하세요)\n"
 
-#: ../PLCGenerator.py:1321
+#: ../PLCGenerator.py:1678
 #, python-format
 msgid "No body defined in \"%s\" POU"
 msgstr "\"%s\" POU에 바디(body)가 정의되어 있지 않습니다"
 
-#: ../PLCGenerator.py:722
-#: ../PLCGenerator.py:945
-#, python-format
-msgid "No connector found corresponding to \"%s\" continuation in \"%s\" POU"
-msgstr "\"%s\"에 대응하는 연결을 \"%s\" POU에서 찾을 수 없습니다"
-
-#: ../PLCOpenEditor.py:370
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr "\"{a2}\" POU에서 연속적인 \"{a1}\" 커넥터를 찾을 수 없습니다. "
+
+#: ../PLCOpenEditor.py:331
 msgid ""
 "No documentation available.\n"
 "Coming soon."
@@ -2396,75 +2308,69 @@
 "현재 지원되는 도움 문서가 없습니다.\n"
 "지원 예정"
 
-#: ../PLCGenerator.py:744
+#: ../PLCGenerator.py:841
 #, python-format
 msgid "No informations found for \"%s\" block"
 msgstr "\"%s\"블럭에 대한 정보를 찾을 수 없습니다"
 
-#: ../plcopen/structures.py:167
-msgid "No output variable found"
-msgstr "출력 변수를 찾을 수 없습니다"
-
-#: ../Beremiz_service.py:394
-msgid "No running PLC"
-msgstr "실행중인 PLC가 없습니다"
-
-#: ../controls/SearchResultPanel.py:169
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr "POU {a3} 내부 블록 {a2}에 대해 출력 변수 {a1}를 찾을 수 없습니다. 연결이 끊어졌음이 틀림없습니다."
+
+#: ../controls/SearchResultPanel.py:175
 msgid "No search results available."
 msgstr "검색된 결과가 없습니다"
 
-#: ../svgui/svgui.py:98
+#: ../svgui/svgui.py:142
 #, python-format
 msgid "No such SVG file: %s\n"
-msgstr "선택하신 %s파일은 없습니다\n"
-
-#: ../canfestival/config_utils.py:632
-#, python-format
-msgid "No such index/subindex (%x,%x) (variable %s)"
-msgstr "인덱스/서브 인덱스 (%x,%x)(변수 %s) 에러"
-
-#: ../canfestival/config_utils.py:361
-#, python-format
-msgid "No such index/subindex (%x,%x) in ID : %d (variable %s)"
-msgstr "인덱스/서브 인덱스 (%x,%x) ID 위치: %d (변수 %s)"
-
-#: ../dialogs/BrowseValuesLibraryDialog.py:83
+msgstr "선택하신 %s SVG 파일은 없습니다\n"
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr "({a1}, {a2})와 같은 index/subindex가 없습니다(변수 {a3})."
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr "{a3} ID 에서 ({a1}, {a2})와 같은 index/subindex가 없습니다: (변수 {a4}). "
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
 msgid "No valid value selected!"
 msgstr "유효한 데이터 값을 선택하세요!"
 
-#: ../PLCGenerator.py:1319
+#: ../PLCGenerator.py:1676
 #, python-format
 msgid "No variable defined in \"%s\" POU"
 msgstr "\"%s\" POU에 정의된 변수가 없습니다"
 
-#: ../canfestival/SlaveEditor.py:49
-#: ../canfestival/NetworkEditor.py:79
-msgid "Node infos"
-msgstr "노드 정보"
-
-#: ../canfestival/config_utils.py:354
-#, python-format
-msgid "Non existing node ID : %d (variable %s)"
-msgstr "Node ID : %d(변수%s)를 찾을 수 없습니다"
-
-#: ../controls/VariablePanel.py:69
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr "node ID {a1}이 존재하지 않습니다: (변수 {a2})"
+
+#: ../controls/VariablePanel.py:79
 msgid "Non-Retain"
 msgstr "유지 안함(No Retain)"
 
-#: ../dialogs/LDElementDialog.py:62
+#: ../dialogs/LDElementDialog.py:78
 msgid "Normal"
 msgstr "기본(Normal)"
 
-#: ../canfestival/config_utils.py:383
-#, python-format
-msgid "Not PDO mappable variable : '%s' (ID:%d,Idx:%x,sIdx:%x))"
-msgstr "PDO 맵핑 변수가 아닙니다 : '%s'(ID:%d,ldx:%x,sldx:%x))"
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr "PDO 매핑 가능한 변수가 아닙니다: '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
 
 #: ../plcopen/iec_std.csv:80
 msgid "Not equal to"
 msgstr "같지 않을 때"
 
-#: ../dialogs/SFCDivergenceDialog.py:80
+#: ../dialogs/SFCDivergenceDialog.py:91
 msgid "Number of sequences:"
 msgstr "시퀀스 넘버:"
 
@@ -2472,299 +2378,317 @@
 msgid "Numerical"
 msgstr "수치(Numeric)"
 
-#: ../plcopen/structures.py:247
-msgid ""
-"Off-delay timer\n"
-"The off-delay timer can be used to delay setting an output false, for fixed period after input goes false."
-msgstr ""
-"오프 딜레이 타이머\n"
-"오프 딜레이 타이머는 입력이 FALSE로 진행되는 주기를 수정하여 출력을 FALSE로 셋팅합니다"
-
-#: ../plcopen/structures.py:242
-msgid ""
-"On-delay timer\n"
-"The on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true."
-msgstr ""
-"온 딜레이 타이머\n"
-"온 딜레이 타이머는 입력이 TRUE로 진행되는 주기를 수정하여 출력을 TRUE로 셋팅합니다"
-
-#: ../dialogs/SearchInProjectDialog.py:93
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr "값 변경 알림"
+
+#: ../dialogs/SearchInProjectDialog.py:88
 msgid "Only Elements"
 msgstr "구성원 내부 검색"
 
-#: ../Beremiz.py:309
-#: ../Beremiz.py:343
-#: ../PLCOpenEditor.py:127
-#: ../PLCOpenEditor.py:168
-#, fuzzy
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
 msgid "Open"
-msgstr ""
-"#-#-#-#-#  Beremiz_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"프로젝트 열기\n"
-"#-#-#-#-#  PLCOpenEditor_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"파일 열기"
-
-#: ../svgui/svgui.py:107
+msgstr "프로젝트 불러오기"
+
+#: ../svgui/svgui.py:151
 msgid "Open Inkscape"
 msgstr "잉크스케이프 열기"
 
-#: ../ProjectController.py:1530
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+"IEC 61131 통합 개발환경과 다양한 확장 모듈들을 바탕으로 유연한 소프트 PLC 런타임을 생성하는, 자동화 분야를 위한 오픈 소스 "
+"프레임워크"
+
+#: ../ProjectController.py:1879
 msgid "Open a file explorer to manage project files"
-msgstr ""
-
-#: ../wxglade_hmi/wxglade_hmi.py:109
+msgstr "프로젝트 파일들을 관리하기 위해 파일 탐색기를 실행하세요"
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
 msgid "Open wxGlade"
 msgstr "WxGlade 열기"
 
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
+#: ../controls/VariablePanel.py:64
 msgid "Option"
 msgstr "옵션"
 
-#: ../dialogs/FindInPouDialog.py:76
-#, fuzzy
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
 msgid "Options"
-msgstr "옵션"
-
-#: ../controls/ProjectPropertiesPanel.py:97
+msgstr "옵션들"
+
+#: ../controls/ProjectPropertiesPanel.py:109
 msgid "Organization (optional):"
 msgstr "구성단체(옵션):"
 
-#: ../canfestival/SlaveEditor.py:47
-#: ../canfestival/NetworkEditor.py:77
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
 msgid "Other Profile"
 msgstr "다른 프로필"
 
-#: ../controls/VariablePanel.py:76
-#: ../dialogs/BrowseLocationsDialog.py:37
-#: ../dialogs/FBDVariableDialog.py:35
-#: ../dialogs/SFCStepDialog.py:65
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Output"
 msgstr "출력"
 
-#: ../canfestival/SlaveEditor.py:36
-#: ../canfestival/NetworkEditor.py:66
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
 msgid "PDO Receive"
 msgstr "수신 PDO"
 
-#: ../canfestival/SlaveEditor.py:35
-#: ../canfestival/NetworkEditor.py:65
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
 msgid "PDO Transmit"
 msgstr "전송 PDO"
 
-#: ../plcopen/structures.py:269
-msgid ""
-"PID\n"
-"The PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control."
-msgstr ""
-"PID\n"
-"PID 펑션 블럭은 폐쇄 루프 제어를 위한 다음과 같은 비례상수, 미분, 적분등의 기본 제어 규칙을 제공합니다"
-
-#: ../targets/toolchain_gcc.py:107
+#: ../targets/toolchain_gcc.py:174
 msgid "PLC :\n"
 msgstr "PLC :\n"
 
-#: ../ProjectController.py:1096
-#: ../ProjectController.py:1398
-#, python-format
-msgid "PLC is %s\n"
-msgstr "현재 PLC %s\n"
-
-#: ../PLCOpenEditor.py:313
-#: ../PLCOpenEditor.py:391
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr "PLC 로그"
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr "PLC 코드 생성에 실패하였습니다!\n"
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr "비어있는 PLC 이거나 PLC가 이미 시작되었습니다."
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr "PLC가 시작되지 않았습니다."
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+"PLC 문법 에러 발생 {a1}:\n"
+"{a2}"
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
 msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
 msgstr "PLCOpen files (*.xml)|*.xml|모든 파일|*.*"
 
-#: ../PLCOpenEditor.py:175
-#: ../PLCOpenEditor.py:231
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
 msgid "PLCOpenEditor"
 msgstr "PLCOpenEditor"
 
-#: ../dialogs/PouDialog.py:98
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+"PLCOpenEditor는 Beremiz 프로젝트의 일부입니다.\n"
+"\n"
+"Beremiz는"
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr "포트"
+
+#: ../dialogs/PouDialog.py:109
 msgid "POU Name"
 msgstr "POU 이름"
 
-#: ../dialogs/PouDialog.py:56
+#: ../dialogs/PouDialog.py:66
 msgid "POU Name:"
 msgstr "POU 이름:"
 
-#: ../dialogs/PouDialog.py:100
+#: ../dialogs/PouDialog.py:111
 msgid "POU Type"
 msgstr "POU 타입"
 
-#: ../dialogs/PouDialog.py:63
+#: ../dialogs/PouDialog.py:73
 msgid "POU Type:"
 msgstr "POU 타입:"
 
-#: ../Beremiz.py:322
-#: ../PLCOpenEditor.py:141
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr "PYRO가 URI:%s 에 연결중입니다. \n"
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr "PYRO는 '%s'에 있는 증명서를 사용합니다.\n"
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
 msgid "Page Setup"
 msgstr "인쇄 페이지 설정"
 
-#: ../controls/ProjectPropertiesPanel.py:110
+#: ../controls/ProjectPropertiesPanel.py:124
 msgid "Page Size (optional):"
 msgstr "페이지 크기(옵션):"
 
-#: ../PLCOpenEditor.py:476
+#: ../IDEFrame.py:2640
 #, python-format
 msgid "Page: %d"
 msgstr "인쇄 페이지: %d"
 
-#: ../controls/PouInstanceVariablesPanel.py:41
-#, fuzzy
+#: ../controls/PouInstanceVariablesPanel.py:134
 msgid "Parent instance"
-msgstr "인스턴스 삭제"
-
-#: ../IDEFrame.py:350
-#: ../IDEFrame.py:402
-#: ../editors/Viewer.py:537
+msgstr "부모 인스턴스"
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
 msgid "Paste"
 msgstr "붙여넣기"
 
-#: ../IDEFrame.py:1900
+#: ../IDEFrame.py:1899
 msgid "Paste POU"
 msgstr "POU 붙여넣기"
 
-#: ../dialogs/SearchInProjectDialog.py:64
+#: ../dialogs/SearchInProjectDialog.py:60
 msgid "Pattern to search:"
 msgstr "검색할 문자열 패턴:"
 
-#: ../dialogs/LDPowerRailDialog.py:64
+#: ../dialogs/LDPowerRailDialog.py:75
 msgid "Pin number:"
 msgstr "핀 넘버:"
 
-#: ../editors/Viewer.py:2289
-#: ../editors/Viewer.py:2594
-#: ../editors/SFCViewer.py:696
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
 msgid "Please choose a target"
 msgstr "타겟을 선택하세요"
 
-#: ../editors/Viewer.py:2112
-#: ../editors/Viewer.py:2114
-#: ../editors/Viewer.py:2630
-#: ../editors/Viewer.py:2632
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr "블록의 이름을 입력하세요"
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
 msgid "Please enter comment text"
 msgstr "코멘트를 입력하세요"
 
-#: ../editors/SFCViewer.py:359
-#: ../editors/SFCViewer.py:381
-#: ../editors/SFCViewer.py:725
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
 msgid "Please enter step name"
 msgstr "스텝 이름을 입력하세요"
 
-#: ../dialogs/ForceVariableDialog.py:153
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr "텍스트를 입력하세요"
+
+#: ../dialogs/ForceVariableDialog.py:177
 #, python-format
 msgid "Please enter value for a \"%s\" variable:"
 msgstr "\"%s\" 변수의 데이터를 입력하세요"
 
-#: ../Beremiz_service.py:366
+#: ../Beremiz_service.py:327
 msgid "Port number must be 0 <= port <= 65535!"
 msgstr "포트 번호는 0~65535까지 유효합니다!"
 
-#: ../Beremiz_service.py:366
+#: ../Beremiz_service.py:327
 msgid "Port number must be an integer!"
 msgstr "포트 번호는 숫자로만 입력하세요!"
 
-#: ../editors/GraphicViewer.py:105
-msgid "Position:"
-msgstr "위치:"
-
-#: ../editors/Viewer.py:476
-#, fuzzy
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
 msgid "Power Rail"
-msgstr "좌측 전원 레일"
-
-#: ../dialogs/LDPowerRailDialog.py:36
+msgstr "전원 레일"
+
+#: ../dialogs/LDPowerRailDialog.py:52
 msgid "Power Rail Properties"
 msgstr "전원 레일 속성"
 
-#: ../Beremiz.py:324
-#: ../PLCOpenEditor.py:143
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
 msgid "Preview"
 msgstr "인쇄 페이지 미리보기"
 
-#: ../dialogs/SFCDivergenceDialog.py:93
-#: ../dialogs/LDPowerRailDialog.py:78
-#: ../dialogs/ConnectionDialog.py:78
-#: ../dialogs/FBDVariableDialog.py:97
-#: ../dialogs/SFCTransitionDialog.py:96
-#: ../dialogs/LDElementDialog.py:101
-#: ../dialogs/SFCStepDialog.py:79
-#: ../dialogs/FBDBlockDialog.py:103
+#: ../dialogs/BlockPreviewDialog.py:59
 msgid "Preview:"
 msgstr "인쇄 페이지 미리보기:"
 
-#: ../Beremiz.py:326
-#: ../Beremiz.py:346
-#: ../PLCOpenEditor.py:145
-#: ../PLCOpenEditor.py:171
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
 msgid "Print"
 msgstr "인쇄"
 
-#: ../IDEFrame.py:1155
+#: ../IDEFrame.py:1110
 msgid "Print preview"
 msgstr "인쇄 미리보기"
 
-#: ../editors/ResourceEditor.py:67
+#: ../editors/ResourceEditor.py:76
 msgid "Priority"
 msgstr "우선권"
 
-#: ../dialogs/SFCTransitionDialog.py:83
+#: ../dialogs/SFCTransitionDialog.py:91
 msgid "Priority:"
 msgstr "우선권:"
 
-#: ../controls/ProjectPropertiesPanel.py:80
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr "PLC를 시작하는데 문제가 발생했습니다: 에러 %d"
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr "제품명"
+
+#: ../controls/ProjectPropertiesPanel.py:90
 msgid "Product Name (required):"
 msgstr "제품 이름(필수):"
 
-#: ../controls/ProjectPropertiesPanel.py:82
+#: ../controls/ProjectPropertiesPanel.py:92
 msgid "Product Release (optional):"
 msgstr "제품 출시 번호(옵션):"
 
-#: ../controls/ProjectPropertiesPanel.py:81
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr "제품 버전"
+
+#: ../controls/ProjectPropertiesPanel.py:91
 msgid "Product Version (required):"
 msgstr "제품 버젼(필수):"
 
-#: ../IDEFrame.py:1972
-#: ../dialogs/SearchInProjectDialog.py:46
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
 msgid "Program"
 msgstr "프로그램"
 
-#: ../PLCOpenEditor.py:360
+#: ../PLCOpenEditor.py:321
 msgid "Program was successfully generated!"
 msgstr "프로그램이 성공적으로 생성되었습니다!"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:76
 msgid "Programs"
 msgstr "프로그램(Programs)"
 
-#: ../editors/Viewer.py:230
+#: ../editors/Viewer.py:285
 msgid "Programs can't be used by other POUs!"
 msgstr "다른 POU에서 사용할 수 없는 프로그램입니다!"
 
-#: ../controls/ProjectPropertiesPanel.py:84
-#: ../IDEFrame.py:553
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
 msgid "Project"
 msgstr "프로젝트"
 
-#: ../controls/SearchResultPanel.py:173
-#, fuzzy, python-format
+#: ../controls/SearchResultPanel.py:180
+#, python-format
 msgid "Project '%s':"
-msgstr "프로젝트"
-
-#: ../ProjectController.py:1529
+msgstr "프로젝트 '%s':"
+
+#: ../ProjectController.py:1878
 msgid "Project Files"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:78
+msgstr "프로젝트 파일"
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr "프로젝트 명"
+
+#: ../controls/ProjectPropertiesPanel.py:88
 msgid "Project Name (required):"
 msgstr "프로젝트 명(필수):"
 
-#: ../controls/ProjectPropertiesPanel.py:79
+#: ../controls/ProjectPropertiesPanel.py:89
 msgid "Project Version (optional):"
 msgstr "프로젝트 버젼(옵션):"
 
-#: ../PLCControler.py:2916
+#: ../PLCControler.py:2717
 msgid ""
 "Project file syntax error:\n"
 "\n"
@@ -2772,103 +2696,90 @@
 "프로젝트 파일 구문 오류:\n"
 "\n"
 
-#: ../dialogs/ProjectDialog.py:32
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
 msgid "Project properties"
 msgstr "프로젝트 속성"
 
-#: ../ConfigTreeNode.py:506
-#, python-format
-msgid "Project tree layout do not match confnode.xml %s!=%s "
-msgstr "프로젝트 레이아웃이 포함된 %s!=%s confnode.xml파일이 손상되거나 일치 하지 않습니다"
-
-#: ../PLCControler.py:96
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr "프로젝트 트리 레이아웃이 confnode.xml과 일치하지 않습니다. {a1}!={a2}"
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr "연결자 이름 수정"
+
+#: ../plcopen/types_enums.py:77
 msgid "Properties"
 msgstr "속성"
 
-#: ../plcopen/structures.py:237
-msgid ""
-"Pulse timer\n"
-"The pulse timer can be used to generate output pulses of a given time duration."
-msgstr ""
-"펄스 타이머\n"
-"펄스 타이머 펑션 블럭은 사용자가 설정한 시간동안 출력 신호를 생성하는데 사용합니다"
-
-#: ../features.py:8
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr "로컬 네트워크에 서비스를 퍼블리싱하는 중"
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr "Pyro 예외상황: %s\n"
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr "Pyro 포트:"
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr "Python 코드"
+
+#: ../features.py:34
 msgid "Python file"
 msgstr "파이썬 파일"
 
-#: ../dialogs/ActionBlockDialog.py:37
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Qualifier"
 msgstr "한정자"
 
-#: ../Beremiz_service.py:328
-#: ../Beremiz.py:329
-#: ../PLCOpenEditor.py:151
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
 msgid "Quit"
 msgstr "프로그램 종료"
 
-#: ../plcopen/structures.py:202
-msgid ""
-"RS bistable\n"
-"The RS bistable is a latch where the Reset dominates."
-msgstr ""
-"RS 쌍안정 회로\n"
-"RS 쌍안정(bistable) 회로 함수은 리셋 동작시 래치가 발생됩니다"
-
-#: ../plcopen/structures.py:274
-#, fuzzy
-msgid ""
-"Ramp\n"
-"The RAMP function block is modelled on example given in the standard."
-msgstr ""
-"램프(Ramp)\n"
-"램프(Ramp) 함수 블럭은 정지(Holdback) 기능이 추가된 기본 예제 모델입니다"
-
-#: ../editors/GraphicViewer.py:89
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
 msgid "Range:"
 msgstr "범위:"
 
-#: ../ProjectController.py:1525
+#: ../ProjectController.py:1872
 msgid "Raw IEC code"
 msgstr "IEC 코드"
 
-#: ../plcopen/structures.py:254
-msgid ""
-"Real time clock\n"
-"The real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on."
-msgstr ""
-
-#: ../Beremiz.py:1039
-#, fuzzy, python-format
+#: ../BeremizIDE.py:1083
+#, python-format
 msgid "Really delete node '%s'?"
-msgstr "플러그인을 삭제하시겠습니까?"
-
-#: ../IDEFrame.py:340
-#: ../IDEFrame.py:398
+msgstr " 정말로 노드 '%s' 를 지우겠습니까?"
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr "렐름:"
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
 msgid "Redo"
 msgstr "되돌리기 취소"
 
-#: ../dialogs/SFCTransitionDialog.py:57
-#: ../dialogs/SFCTransitionDialog.py:135
+#: ../dialogs/SFCTransitionDialog.py:76
 msgid "Reference"
 msgstr "레퍼런스"
 
-#: ../IDEFrame.py:408
-#: ../dialogs/DiscoveryDialog.py:105
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
 msgid "Refresh"
 msgstr "새로고침"
 
-#: ../dialogs/SearchInProjectDialog.py:73
+#: ../dialogs/SearchInProjectDialog.py:70
 msgid "Regular expression"
 msgstr "정규 표현식"
 
-#: ../dialogs/FindInPouDialog.py:91
-#, fuzzy
+#: ../dialogs/FindInPouDialog.py:99
 msgid "Regular expressions"
 msgstr "정규 표현식"
 
-#: ../controls/DebugVariablePanel.py:299
-#: ../editors/Viewer.py:1356
+#: ../editors/Viewer.py:1636
 msgid "Release value"
 msgstr "강제 데이터 입력 해제"
 
@@ -2876,112 +2787,103 @@
 msgid "Remainder (modulo)"
 msgstr "잔여 (모듈)"
 
-#: ../Beremiz.py:1040
-#, fuzzy, python-format
+#: ../BeremizIDE.py:1084
+#, python-format
 msgid "Remove %s node"
-msgstr "플러그인 제거"
-
-#: ../dialogs/ActionBlockDialog.py:139
-#, fuzzy
+msgstr "%s 노드 제거"
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr "데이터 타입 제거"
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr "POU 제거"
+
+#: ../dialogs/ActionBlockDialog.py:144
 msgid "Remove action"
-msgstr "선택"
-
-#: ../controls/DebugVariablePanel.py:183
-#, fuzzy
-msgid "Remove debug variable"
-msgstr "새로운 변수 생성"
-
-#: ../editors/DataTypeEditor.py:346
+msgstr "액션 제거"
+
+#: ../editors/DataTypeEditor.py:365
 msgid "Remove element"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:281
+msgstr "엘리먼트 제거"
+
+#: ../editors/FileManagementPanel.py:66
 msgid "Remove file from left folder"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:252
-#, fuzzy
+msgstr "좌측 폴더로부터 파일 제거"
+
+#: ../editors/ResourceEditor.py:284
 msgid "Remove instance"
-msgstr "인스턴스 삭제"
-
-#: ../canfestival/NetworkEditor.py:87
+msgstr "인스턴스 제거"
+
+#: ../canfestival/NetworkEditor.py:111
 msgid "Remove slave"
 msgstr "슬레이브 제거"
 
-#: ../editors/ResourceEditor.py:223
+#: ../editors/ResourceEditor.py:253
 msgid "Remove task"
-msgstr ""
-
-#: ../controls/VariablePanel.py:379
-#, fuzzy
+msgstr "태스크 제거"
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
 msgid "Remove variable"
-msgstr "새로운 변수 생성"
-
-#: ../IDEFrame.py:1976
+msgstr "변수 제거"
+
+#: ../IDEFrame.py:1979
 msgid "Rename"
 msgstr "이름 변경"
 
-#: ../editors/FileManagementPanel.py:399
+#: ../editors/FileManagementPanel.py:187
 msgid "Replace File"
-msgstr ""
+msgstr "파일 교체"
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr "와이어를 연결자로 교체"
 
 #: ../plcopen/iec_std.csv:89
 msgid "Replacement (within)"
 msgstr "내부 교체"
 
-#: ../dialogs/LDElementDialog.py:76
+#: ../dialogs/LDElementDialog.py:79
 msgid "Reset"
 msgstr "리셋 코일(Unlatch)"
 
-#: ../editors/Viewer.py:521
+#: ../editors/Viewer.py:681
 msgid "Reset Execution Order"
 msgstr "실행 순서 초기화"
 
-#: ../IDEFrame.py:423
+#: ../IDEFrame.py:453
 msgid "Reset Perspective"
-msgstr ""
-
-#: ../controls/SearchResultPanel.py:105
+msgstr "풀 스크린 에디팅 모드에서 복귀"
+
+#: ../controls/SearchResultPanel.py:103
 msgid "Reset search result"
-msgstr ""
-
-#: ../editors/GraphicViewer.py:137
-msgid "Reset zoom and offset"
-msgstr ""
-
-#: ../PLCControler.py:96
+msgstr "검색 결과 재설정"
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
 msgid "Resources"
 msgstr "리소스"
 
-#: ../controls/VariablePanel.py:67
+#: ../controls/VariablePanel.py:77
 msgid "Retain"
 msgstr "유지 변수"
 
-#: ../controls/VariablePanel.py:352
+#: ../controls/VariablePanel.py:455
 msgid "Return Type:"
 msgstr "반환(Return) 타입:"
 
-#: ../editors/Viewer.py:430
+#: ../editors/Viewer.py:582
 msgid "Right"
 msgstr "우측"
 
-#: ../dialogs/LDPowerRailDialog.py:60
+#: ../dialogs/LDPowerRailDialog.py:65
 msgid "Right PowerRail"
 msgstr "우측 전원 레일"
 
-#: ../editors/Viewer.py:404
-#: ../dialogs/LDElementDialog.py:80
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
 msgid "Rising Edge"
 msgstr "라이징 엣지"
 
-#: ../plcopen/structures.py:212
-msgid ""
-"Rising edge detector\n"
-"The output produces a single pulse when a rising edge is detected."
-msgstr ""
-"라이징 엣지 검출\n"
-"출력부의 라이징 엣지를 검출합니다"
-
 #: ../plcopen/iec_std.csv:65
 msgid "Rotate left"
 msgstr "좌측으로 회전 (rotate)"
@@ -2994,156 +2896,138 @@
 msgid "Rounding up/down"
 msgstr "라운딩 업/다운"
 
-#: ../ProjectController.py:1493
+#: ../ProjectController.py:1828
 msgid "Run"
 msgstr "실행"
 
-#: ../ProjectController.py:841
-#: ../ProjectController.py:850
-msgid "Runtime extensions C code generation failed !\n"
-msgstr "확장 C 코드의 생성에 실패하였습니다 ! \n"
-
-#: ../canfestival/SlaveEditor.py:34
-#: ../canfestival/NetworkEditor.py:64
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr "런타임 IO 확장 C 코드 생성에 실패했습니다 !\n"
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr "런타임 라이브러리 확장 C 코드 생성에 실패했습니다 !\n"
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
 msgid "SDO Client"
 msgstr "SDO 클라이언트"
 
-#: ../canfestival/SlaveEditor.py:33
-#: ../canfestival/NetworkEditor.py:63
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
 msgid "SDO Server"
 msgstr "SDO 서버"
 
-#: ../controls/ProjectPropertiesPanel.py:143
-#: ../dialogs/PouDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "SFC"
 msgstr "SFC"
 
-#: ../plcopen/structures.py:197
-msgid ""
-"SR bistable\n"
-"The SR bistable is a latch where the Set dominates."
-msgstr ""
-"SR 쌍안정\n"
-"SR 쌍안정 셋팅시 래치 스위치가 동작합니다"
-
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr "POU \"{a1}\"에 있는 SFC jump는 존재하지 않는 SFC 스텝 \"{a2}\"를 참조합니다."
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr "POU \"%s\" 안의 SFC 트랜지션은 연결이 되어야 합니다."
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
 msgid "ST"
 msgstr "ST"
 
-#: ../PLCOpenEditor.py:347
+#: ../PLCOpenEditor.py:308
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "ST 파일 (*.st)|*.st|모든 파일|*.*"
 
-#: ../svgui/svgui.py:92
+#: ../svgui/svgui.py:136
 msgid "SVG files (*.svg)|*.svg|All files|*.*"
 msgstr "SVG 파일 (*.svg)|*svg|모든 파일|*.*"
 
-#: ../features.py:10
+#: ../features.py:36
 msgid "SVGUI"
 msgstr "SVGUI"
 
-#: ../Beremiz.py:313
-#: ../Beremiz.py:344
-#: ../PLCOpenEditor.py:134
-#: ../PLCOpenEditor.py:169
-#, fuzzy
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
 msgid "Save"
-msgstr ""
-"#-#-#-#-#  Beremiz_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"프로젝트 저장\n"
-"#-#-#-#-#  PLCOpenEditor_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"파일 저장"
-
-#: ../Beremiz.py:345
-#: ../PLCOpenEditor.py:136
-#: ../PLCOpenEditor.py:170
-#, fuzzy
+msgstr "저장"
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
 msgid "Save As..."
-msgstr ""
-"#-#-#-#-#  Beremiz_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"다른 이름으로 저장\n"
-"#-#-#-#-#  PLCOpenEditor_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"다른 이름으로 저장..."
-
-#: ../Beremiz.py:315
-#, fuzzy
+msgstr "다른 이름으로 저장..."
+
+#: ../BeremizIDE.py:249
 msgid "Save as"
-msgstr ""
-"#-#-#-#-#  Beremiz_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"프로젝트 저장\n"
-"#-#-#-#-#  PLCOpenEditor_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"파일 저장"
-
-#: ../dialogs/SearchInProjectDialog.py:76
+msgstr "다른 이름으로 저장"
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr "저장 경로는 프로젝트 경로와 동일하여야 합니다!\n"
+
+#: ../dialogs/SearchInProjectDialog.py:73
 msgid "Scope"
 msgstr "검색 범위"
 
-#: ../IDEFrame.py:592
-#: ../dialogs/SearchInProjectDialog.py:105
+#: ../IDEFrame.py:644
 msgid "Search"
 msgstr "검색"
 
-#: ../IDEFrame.py:360
-#: ../IDEFrame.py:404
-#: ../dialogs/SearchInProjectDialog.py:52
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
 msgid "Search in Project"
 msgstr "프로젝트 내부 검색"
 
-#: ../dialogs/DurationEditorDialog.py:46
+#: ../dialogs/DurationEditorDialog.py:49
 msgid "Seconds:"
-msgstr ""
-
-#: ../IDEFrame.py:366
-#, fuzzy
+msgstr "초:"
+
+#: ../IDEFrame.py:390
 msgid "Select All"
-msgstr "모두 선택\tCTRL+A"
-
-#: ../controls/VariablePanel.py:277
-#: ../editors/TextViewer.py:330
-#: ../editors/Viewer.py:277
+msgstr "전부 선택"
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
 msgid "Select a variable class:"
 msgstr "변수 클래스 선택:"
 
-#: ../ProjectController.py:1013
+#: ../ProjectController.py:1293
 msgid "Select an editor:"
-msgstr ""
-
-#: ../controls/PouInstanceVariablesPanel.py:197
-#, fuzzy
+msgstr "에디터 선택"
+
+#: ../controls/PouInstanceVariablesPanel.py:292
 msgid "Select an instance"
-msgstr "인스턴스 삭제"
-
-#: ../IDEFrame.py:576
+msgstr "인스턴스 선택"
+
+#: ../IDEFrame.py:628
 msgid "Select an object"
 msgstr "오브젝트 선택"
 
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr "선택한 디렉토리는 다른 프로젝트가 사용중입니다. 덮어쓰겠습니까?\n"
+
 #: ../plcopen/iec_std.csv:70
 msgid "Selection"
 msgstr "선택"
 
-#: ../dialogs/SFCDivergenceDialog.py:62
+#: ../dialogs/SFCDivergenceDialog.py:66
 msgid "Selection Convergence"
 msgstr "수렴(Convergence) 선택"
 
-#: ../dialogs/SFCDivergenceDialog.py:55
+#: ../dialogs/SFCDivergenceDialog.py:65
 msgid "Selection Divergence"
 msgstr "벡터 발산(Divergence) 선택"
 
-#: ../plcopen/structures.py:207
-msgid ""
-"Semaphore\n"
-"The semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources."
-msgstr ""
-"세마포어(semaphore)\n"
-"세마포어 함수 블럭은 소프트웨어적으로 동시에 두 개 이상의 프로그램 요소가 실행될 수 있는 다중 프로그래밍 환경에서 한순간에 반드시 하나의 작업에 의해 접근되어야 하는 임계 영역 및 상호 배제 원리를 지키기 위해 사용됩니다"
-
-#: ../dialogs/DiscoveryDialog.py:84
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr "서비스 발견"
+
+#: ../dialogs/DiscoveryDialog.py:104
 msgid "Services available:"
 msgstr "서비스 이용 가능:"
 
-#: ../dialogs/LDElementDialog.py:72
+#: ../dialogs/LDElementDialog.py:79
 msgid "Set"
 msgstr "셋팅 코일(Latch)"
 
@@ -3155,27 +3039,27 @@
 msgid "Shift right"
 msgstr "우측이로 이동(Shift)"
 
-#: ../ProjectController.py:1519
+#: ../ProjectController.py:1863
 msgid "Show IEC code generated by PLCGenerator"
 msgstr "PLCGenerator가 생성한 IEC 코드 보기"
 
-#: ../canfestival/canfestival.py:288
+#: ../canfestival/canfestival.py:407
 msgid "Show Master"
 msgstr "마스터 보기"
 
-#: ../canfestival/canfestival.py:289
+#: ../canfestival/canfestival.py:408
 msgid "Show Master generated by config_utils"
 msgstr "config_util(설정 유틸리티)에 의해 생성된 마스터 보기"
 
-#: ../ProjectController.py:1517
+#: ../ProjectController.py:1862
 msgid "Show code"
 msgstr "코드 보기"
 
-#: ../dialogs/SFCDivergenceDialog.py:74
+#: ../dialogs/SFCDivergenceDialog.py:68
 msgid "Simultaneous Convergence"
 msgstr "동시 수렴"
 
-#: ../dialogs/SFCDivergenceDialog.py:68
+#: ../dialogs/SFCDivergenceDialog.py:67
 msgid "Simultaneous Divergence"
 msgstr "동시 발산"
 
@@ -3183,62 +3067,75 @@
 msgid "Sine"
 msgstr "Sine"
 
-#: ../editors/ResourceEditor.py:67
+#: ../editors/ResourceEditor.py:76
 msgid "Single"
 msgstr "싱글"
 
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr "소스파일이 변경되지 않았습니다, 재빌드되지 않습니다.\n"
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr "소스 신호는 리소스 '{a2}.{a3}' 내의 단일 태스크 '{a1}' 에 대해서 정의되어야만 합니다. "
+
 #: ../plcopen/iec_std.csv:23
 msgid "Square root (base 2)"
 msgstr "제곱근 (SQRT: base 2)"
 
-#: ../plcopen/structures.py:193
+#: ../plcopen/definitions.py:50
 msgid "Standard function blocks"
 msgstr "기본 함수 블럭"
 
-#: ../Beremiz_service.py:319
-#: ../ProjectController.py:1495
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
 msgid "Start PLC"
 msgstr "PLC 시작"
 
-#: ../ProjectController.py:819
+#: ../ProjectController.py:1074
 #, python-format
 msgid "Start build in %s\n"
 msgstr "%s에서 빌드를 시작합니다\n"
 
-#: ../ProjectController.py:1314
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr "시작됨"
+
+#: ../ProjectController.py:1633
 msgid "Starting PLC\n"
 msgstr "PLC 시작중\n"
 
-#: ../Beremiz.py:403
+#: ../BeremizIDE.py:393
 msgid "Status ToolBar"
-msgstr ""
-
-#: ../editors/Viewer.py:493
-#, fuzzy
+msgstr "툴바"
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
 msgid "Step"
-msgstr "스텝 수정"
-
-#: ../ProjectController.py:1498
+msgstr "스텝"
+
+#: ../ProjectController.py:1835
 msgid "Stop"
 msgstr "정지"
 
-#: ../Beremiz_service.py:320
+#: ../Beremiz_service.py:272
 msgid "Stop PLC"
 msgstr "PLC 정지"
 
-#: ../ProjectController.py:1500
+#: ../ProjectController.py:1836
 msgid "Stop Running PLC"
 msgstr "작동중인 PLC 정지"
 
-#: ../ProjectController.py:1292
-msgid "Stopping debugger...\n"
-msgstr "디버거 정지중...\n"
-
-#: ../editors/DataTypeEditor.py:52
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr "멈춤"
+
+#: ../editors/DataTypeEditor.py:60
 msgid "Structure"
 msgstr "구조"
 
-#: ../editors/DataTypeEditor.py:52
+#: ../editors/DataTypeEditor.py:60
 msgid "Subrange"
 msgstr "서브레인지"
 
@@ -3246,58 +3143,82 @@
 msgid "Subtraction"
 msgstr "뺄셈 연산"
 
-#: ../ProjectController.py:915
+#: ../ProjectController.py:1113
 msgid "Successfully built.\n"
 msgstr "성공적으로 빌드 완료 되었습니다\n"
 
-#: ../dialogs/SearchInProjectDialog.py:154
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr "풀 스크린 에디팅 모드로 전환"
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
 msgid "Syntax error in regular expression of pattern to search!"
 msgstr "정규 표현식에 적합하지 않은 검색어 입니다!"
 
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr "타입"
+
 #: ../plcopen/iec_std.csv:29
 msgid "Tangent"
 msgstr "Tangent"
 
-#: ../editors/ResourceEditor.py:76
+#: ../editors/ResourceEditor.py:97
 msgid "Task"
 msgstr "태스크"
 
-#: ../editors/ResourceEditor.py:218
+#: ../editors/ResourceEditor.py:248
 msgid "Tasks:"
 msgstr "태스크:"
 
-#: ../controls/VariablePanel.py:78
+#: ../controls/VariablePanel.py:91
 msgid "Temp"
 msgstr "임시"
 
-#: ../editors/FileManagementPanel.py:398
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+"Beremiz 및 PLCOpenEditor에 관한 질문들을 남길 수 있는 제일 좋은 장소는 프로젝트 메일링 리스트입니다: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"이곳은 메인 커뮤니티 지원 채널입니다. \n"
+"글을 남기기 위해서는 메일링 리스트를 구독해야 합니다.\n"
+"\n"
+"메일링 리스트 구독은 다음 주소에서 가능합니다:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+
+#: ../editors/FileManagementPanel.py:186
 #, python-format
 msgid ""
 "The file '%s' already exist.\n"
 "Do you want to replace it?"
 msgstr ""
-
-#: ../editors/LDViewer.py:879
+"파일 '%s' 가 이미 존재합니다. \n"
+"정말 교체하겠습니까?"
+
+#: ../editors/LDViewer.py:893
 msgid "The group of block must be coherent!"
 msgstr "블럭 그룹은 일관성을 가져야 합니다!"
 
-#: ../IDEFrame.py:1091
-#: ../Beremiz.py:555
-#, fuzzy
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
 msgid "There are changes, do you want to save?"
-msgstr ""
-"#-#-#-#-#  Beremiz_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"프로젝트가 수정되었습니다. 저장 하시겠습니까?\n"
-"#-#-#-#-#  PLCOpenEditor_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-"프로젝트 파일이 변경되었습니다. 저장 하시겠습니까?"
-
-#: ../IDEFrame.py:1709
-#: ../IDEFrame.py:1728
-#, python-format
-msgid "There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?"
+msgstr "변경된 사항이 있습니다, 저장하시겠습니까?"
+
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
 msgstr "\"%s\" POU 에 문제가 있을 수 있습니다. 계속 하시겠습니까?"
 
-#: ../IDEFrame.py:1178
+#: ../IDEFrame.py:1133
 msgid ""
 "There was a problem printing.\n"
 "Perhaps your current printer is not set correctly?"
@@ -3305,20 +3226,20 @@
 "인쇄 작업에 문제가 있습니다.\n"
 "프린터 설정을 확인하세요"
 
-#: ../editors/LDViewer.py:888
+#: ../editors/LDViewer.py:902
 msgid "This option isn't available yet!"
 msgstr "선택하신 옵션은 지원되지 않습니다!"
 
-#: ../editors/GraphicViewer.py:278
-msgid "Tick"
-msgstr "틱(Tick)"
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr "Tick: %d"
 
 #: ../plcopen/iec_std.csv:40
 msgid "Time"
 msgstr "시간 연산"
 
-#: ../plcopen/iec_std.csv:40
-#: ../plcopen/iec_std.csv:41
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
 msgid "Time addition"
 msgstr "시간 더하기 연산"
 
@@ -3326,104 +3247,115 @@
 msgid "Time concatenation"
 msgstr "시간 연결 연산"
 
-#: ../plcopen/iec_std.csv:60
-#: ../plcopen/iec_std.csv:61
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
 msgid "Time division"
 msgstr "시간 나누기 연산"
 
-#: ../plcopen/iec_std.csv:46
-#: ../plcopen/iec_std.csv:47
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
 msgid "Time multiplication"
 msgstr "시간 곱하기 연산"
 
-#: ../plcopen/iec_std.csv:48
-#: ../plcopen/iec_std.csv:49
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
 msgid "Time subtraction"
 msgstr "시간 뺄셈 연산"
 
-#: ../plcopen/iec_std.csv:42
-#: ../plcopen/iec_std.csv:43
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
 msgid "Time-of-day addition"
 msgstr "하루의 시간 더하기"
 
-#: ../plcopen/iec_std.csv:52
-#: ../plcopen/iec_std.csv:53
-#: ../plcopen/iec_std.csv:54
-#: ../plcopen/iec_std.csv:55
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
 msgid "Time-of-day subtraction"
 msgstr "하루의 시간 빼기"
 
-#: ../editors/Viewer.py:432
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr "값을 토글"
+
+#: ../editors/Viewer.py:584
 msgid "Top"
 msgstr "상단"
 
-#: ../ProjectController.py:1507
+#: ../ProjectController.py:1848
 msgid "Transfer"
 msgstr "전송"
 
-#: ../ProjectController.py:1509
+#: ../ProjectController.py:1849
 msgid "Transfer PLC"
 msgstr "PLC에 전송"
 
-#: ../ProjectController.py:1474
+#: ../ProjectController.py:1802
 msgid "Transfer completed successfully.\n"
 msgstr "전송이 성공적으로 완료되었습니다\n"
 
-#: ../ProjectController.py:1476
+#: ../ProjectController.py:1805
 msgid "Transfer failed\n"
 msgstr "전송 실패\n"
 
-#: ../editors/Viewer.py:494
-#, fuzzy
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
 msgid "Transition"
 msgstr "트랜지션"
 
-#: ../PLCGenerator.py:1212
-#, python-format
-msgid "Transition \"%s\" body must contain an output variable or coil referring to its name"
-msgstr ""
-
-#: ../dialogs/PouTransitionDialog.py:84
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr "트랜지션 \"%s\" body는 출력 변수 또는 출력 변수의 이름을 참조하는 코일을 포함해야 합니다."
+
+#: ../dialogs/PouTransitionDialog.py:91
 msgid "Transition Name"
 msgstr "트랜지션 이름"
 
-#: ../dialogs/PouTransitionDialog.py:53
+#: ../dialogs/PouTransitionDialog.py:60
 msgid "Transition Name:"
 msgstr "트랜지션 이름:"
 
-#: ../PLCGenerator.py:1301
-#, python-format
-msgid "Transition with content \"%s\" not connected to a next step in \"%s\" POU"
-msgstr "\"%s\" 트랜지션의 내용이 POU 다음 스텝 \"%s\"와 연결되지 않았습니다"
-
-#: ../PLCGenerator.py:1292
-#, python-format
-msgid "Transition with content \"%s\" not connected to a previous step in \"%s\" POU"
-msgstr "\"%s\" 트랜지션의 내용이 POU 이전 스텝 \"%s\"와 연결되지 않았습니다"
-
-#: ../plcopen/plcopen.py:1442
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr "컨텐츠 \"{a1}\"의 트렌지션은 \"{a2}\" POU 내의 다음 스텝으로 연결되지 않았습니다. "
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr " 컨텐츠 \"{a1}\"의 트랜지션은 \"{a2}\" POU 내의 이전 스텝으로 연결되지 않았습니다. "
+
+#: ../plcopen/plcopen.py:1526
 #, python-format
 msgid "Transition with name %s doesn't exist!"
 msgstr "%s 트랜지션 이름이 존재 하지 않습니다!"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:76
 msgid "Transitions"
 msgstr "트랜지션"
 
-#: ../editors/ResourceEditor.py:67
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr "번역자"
+
+#: ../editors/ResourceEditor.py:76
 msgid "Triggering"
 msgstr "트리거링 스위치"
 
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
-#: ../editors/DataTypeEditor.py:48
-#: ../editors/ResourceEditor.py:76
-#: ../dialogs/ActionBlockDialog.py:37
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr "Twisted 모듈을 이용할 수 없습니다."
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
 msgid "Type"
 msgstr "타입"
 
-#: ../canfestival/config_utils.py:335
-#: ../canfestival/config_utils.py:617
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr "타입과 파생형 타입"
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
 #, python-format
 msgid "Type conflict for location \"%s\""
 msgstr "\"%s\" 타입 에러"
@@ -3432,175 +3364,233 @@
 msgid "Type conversion"
 msgstr "변환 타입"
 
-#: ../editors/DataTypeEditor.py:155
+#: ../editors/DataTypeEditor.py:170
 msgid "Type infos:"
 msgstr "타입 정보:"
 
-#: ../dialogs/SFCDivergenceDialog.py:51
-#: ../dialogs/LDPowerRailDialog.py:51
-#: ../dialogs/ConnectionDialog.py:52
-#: ../dialogs/SFCTransitionDialog.py:53
-#: ../dialogs/FBDBlockDialog.py:48
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr "엄격한 형"
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
 msgid "Type:"
 msgstr "타입:"
 
-#: ../canfestival/config_utils.py:455
-#: ../canfestival/config_utils.py:469
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr "URI 호스트:"
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr "URI 포트:"
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr "URI 종류:"
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
 #, python-format
 msgid "Unable to define PDO mapping for node %02x"
 msgstr "PDO 매핑 정의 에러:%02x"
 
-#: ../targets/Xenomai/__init__.py:14
+#: ../targets/Xenomai/__init__.py:43
 #, python-format
 msgid "Unable to get Xenomai's %s \n"
 msgstr "Xenomai의 %s 를 가져 올 수 없습니다\n"
 
-#: ../PLCGenerator.py:865
-#: ../PLCGenerator.py:924
-#, fuzzy, python-format
-msgid "Undefined block type \"%s\" in \"%s\" POU"
-msgstr "\"%s\" 의 POU 타입이 정의되지 않았습니다"
-
-#: ../PLCGenerator.py:240
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr "\"{a2}\" POU에서 정의되지 않은 블록 타입 \"{a1}\""
+
+#: ../PLCGenerator.py:261
 #, python-format
 msgid "Undefined pou type \"%s\""
 msgstr "\"%s\" 의 POU 타입이 정의되지 않았습니다"
 
-#: ../IDEFrame.py:338
-#: ../IDEFrame.py:397
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
 msgid "Undo"
 msgstr "되돌리기"
 
-#: ../ProjectController.py:254
+#: ../ProjectController.py:442
 msgid "Unknown"
-msgstr ""
-
-#: ../editors/Viewer.py:336
+msgstr "알려지지 않은"
+
+#: ../editors/Viewer.py:437
 #, python-format
 msgid "Unknown variable \"%s\" for this POU!"
 msgstr "\"%s\" 변수를 현재 POU에서 알 수 없습니다!"
 
-#: ../ProjectController.py:251
-#: ../ProjectController.py:252
+#: ../ProjectController.py:439 ../ProjectController.py:440
 msgid "Unnamed"
-msgstr ""
-
-#: ../PLCControler.py:305
+msgstr "이름이 없는"
+
+#: ../PLCControler.py:263
 #, python-format
 msgid "Unnamed%d"
 msgstr "이름 없음%d"
 
-#: ../controls/VariablePanel.py:272
+#: ../controls/VariablePanel.py:308
 #, python-format
 msgid "Unrecognized data size \"%s\""
 msgstr "\"%s\"의 데이터 크기를 알 수 없습니다"
 
-#: ../plcopen/structures.py:222
-msgid ""
-"Up-counter\n"
-"The up-counter can be used to signal when a count has reached a maximum value."
-msgstr ""
-"업 카운터\n"
-"업 카운터는 시그널이 사용자가 설정한 최대값에 도달할 때까지 동작합니다"
-
-#: ../plcopen/structures.py:232
-msgid ""
-"Up-down counter\n"
-"The up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other."
-msgstr ""
-"업 다운 카운터\n"
-"업 다운 카운터는 CU, CD 두 개의 입력부를 가지고 있습니다. 입력부는 동시에 동작하며 하나는 카운터 상승, 다른 하나는 카운터 감소로 동작합니다"
-
-#: ../controls/VariablePanel.py:709
-#: ../editors/DataTypeEditor.py:623
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
 msgid "User Data Types"
 msgstr "사용자 데이터 타입"
 
-#: ../canfestival/SlaveEditor.py:38
-#: ../canfestival/NetworkEditor.py:68
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
 msgid "User Type"
 msgstr "사용자 타입"
 
-#: ../PLCControler.py:94
+#: ../plcopen/types_enums.py:75
 msgid "User-defined POUs"
 msgstr "사용자 정의 POU"
 
-#: ../controls/DebugVariablePanel.py:40
-#: ../dialogs/ActionBlockDialog.py:37
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Value"
 msgstr "데이터 값"
 
-#: ../editors/GraphicViewer.py:278
-msgid "Values"
-msgstr "데이터 값"
-
-#: ../editors/DataTypeEditor.py:252
+#: ../editors/DataTypeEditor.py:267
 msgid "Values:"
 msgstr "데이터 값:"
 
-#: ../controls/DebugVariablePanel.py:40
-#: ../editors/Viewer.py:466
-#: ../dialogs/ActionBlockDialog.py:41
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
 msgid "Variable"
 msgstr "변수"
 
-#: ../dialogs/FBDVariableDialog.py:47
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr "변수 드롭"
+
+#: ../dialogs/FBDVariableDialog.py:68
 msgid "Variable Properties"
 msgstr "변수 속성"
 
-#: ../controls/VariablePanel.py:277
-#: ../editors/TextViewer.py:330
-#: ../editors/Viewer.py:277
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
 msgid "Variable class"
 msgstr "변수 클래스"
 
-#: ../editors/TextViewer.py:374
-#: ../editors/Viewer.py:338
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
 msgid "Variable don't belong to this POU!"
 msgstr "POU에 속하지 않는 변수 입니다!"
 
-#: ../controls/VariablePanel.py:77
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr "변수:"
+
+#: ../controls/VariablePanel.py:90
 msgid "Variables"
 msgstr "변수"
 
-#: ../controls/ProjectPropertiesPanel.py:151
+#: ../controls/ProjectPropertiesPanel.py:166
 msgid "Vertical:"
 msgstr "수직:"
 
-#: ../wxglade_hmi/wxglade_hmi.py:11
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr "WAMP 클라이언트 연결이 실패하였습니다 (%s) ...재시도 중..."
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr "WAMP 클라이언트 연결이 끈겼습니다 (%s) ..재시도중.."
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr "WAMP 아이디:"
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr "WAMP 클라이언트가 연결중입니다:"
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr "WAMP 클라이언트 연결이 성립되지 않았습니다!"
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr "WAMP 클라이언트의 시작이 실패했습니다."
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr "WAMP 설정이 불완전합니다."
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr "WAMP 설정이 누락되어 있습니다."
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr "WAMP URL에 연결중입니다: %s\n"
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr "WAMP 연결 타임아웃"
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr "WAMP '%s'에 연결이 실패하였습니다.\n"
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr "WAMP 불러오기 실패:"
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr "WAMP 로드 에러:"
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr "WAMP 세션 종료"
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
 msgid "WXGLADE GUI"
 msgstr "WXGLADE GUI"
 
-#: ../ProjectController.py:1276
-msgid "Waiting debugger to recover...\n"
-msgstr "디버거 복구 대기중...\n"
-
-#: ../editors/LDViewer.py:888
-#: ../dialogs/PouDialog.py:126
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr "WAMP 비밀 로드 에러:"
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
 msgid "Warning"
 msgstr "경고"
 
-#: ../ProjectController.py:515
+#: ../ProjectController.py:726
 msgid "Warnings in ST/IL/SFC code generator :\n"
 msgstr "ST/IL/SFC 코드 생성기 경고:\n"
 
-#: ../dialogs/SearchInProjectDialog.py:85
+#: ../dialogs/SearchInProjectDialog.py:82
 msgid "Whole Project"
 msgstr "프로젝트 전체 검색"
 
-#: ../controls/ProjectPropertiesPanel.py:119
+#: ../controls/ProjectPropertiesPanel.py:134
 msgid "Width:"
 msgstr "폭:"
 
-#: ../dialogs/FindInPouDialog.py:86
+#: ../dialogs/FindInPouDialog.py:94
 msgid "Wrap search"
-msgstr ""
-
-#: ../features.py:9
+msgstr "페이지 끝까지 검색한 후 처음으로 와서 다시 검색"
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr "개발자"
+
+#: ../features.py:35
 msgid "WxGlade GUI"
 msgstr "WxGlade GUI"
 
-#: ../svgui/svgui.py:106
+#: ../svgui/svgui.py:150
 msgid ""
 "You don't have write permissions.\n"
 "Open Inkscape anyway ?"
@@ -3608,7 +3598,7 @@
 "현재 쓰기 권한이 없습니다\n"
 "그래도 Inkscape를 열까요?"
 
-#: ../wxglade_hmi/wxglade_hmi.py:108
+#: ../wxglade_hmi/wxglade_hmi.py:160
 msgid ""
 "You don't have write permissions.\n"
 "Open wxGlade anyway ?"
@@ -3616,7 +3606,7 @@
 "현재 쓰기 권한이 없습니다\n"
 "그래도 WxGlade를 열까요?"
 
-#: ../ProjectController.py:220
+#: ../ProjectController.py:390
 msgid ""
 "You must have permission to work on the project\n"
 "Work on a project copy ?"
@@ -3624,68 +3614,74 @@
 "프로젝트 작업에는 권한이 필요합니다\n"
 "사본으로 작업하시겠습니까?"
 
-#: ../editors/LDViewer.py:883
-msgid "You must select the block or group of blocks around which a branch should be added!"
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
 msgstr "Branch를 추가할 블럭 또는 블럭 그룹을 선택해야 합니다!"
 
-#: ../editors/LDViewer.py:663
+#: ../editors/LDViewer.py:677
 msgid "You must select the wire where a contact should be added!"
 msgstr "접점에 추가될 와이어를 선택해야 합니다!"
 
-#: ../dialogs/PouNameDialog.py:45
-#: ../dialogs/SFCStepNameDialog.py:47
-#: ../dialogs/SFCStepDialog.py:118
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
 msgid "You must type a name!"
 msgstr "이름을 입력하세요!"
 
-#: ../dialogs/ForceVariableDialog.py:165
+#: ../dialogs/ForceVariableDialog.py:209
 msgid "You must type a value!"
 msgstr "데이터 값을 입력하세요!"
 
-#: ../IDEFrame.py:414
+#: ../IDEFrame.py:440
 msgid "Zoom"
 msgstr "확대(Zoom)"
 
-#: ../editors/GraphicViewer.py:97
-#, fuzzy
-msgid "Zoom:"
-msgstr "확대(Zoom)"
-
-#: ../PLCOpenEditor.py:356
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr "일"
+
+#: ../PLCOpenEditor.py:317
 #, python-format
 msgid "error: %s\n"
 msgstr "에러: %s\n"
 
-#: ../util/ProcessLogger.py:161
-#, python-format
-msgid "exited with status %s (pid %s)\n"
-msgstr "종료함: 종료 상태 번호 %s(PID %s)\n"
-
-#: ../PLCOpenEditor.py:508
-#: ../PLCOpenEditor.py:510
-msgid "file : "
-msgstr "파일 :"
-
-#: ../dialogs/PouDialog.py:31
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr "상태 {a1}과 함께 종료되었음 (pid {a2})\n"
+
+#: ../dialogs/PouDialog.py:36
 msgid "function"
 msgstr "함수"
 
-#: ../PLCOpenEditor.py:511
-msgid "function : "
-msgstr "함수 :"
-
-#: ../dialogs/PouDialog.py:31
+#: ../dialogs/PouDialog.py:36
 msgid "functionBlock"
 msgstr "함수 블럭"
 
-#: ../PLCOpenEditor.py:511
-msgid "line : "
-msgstr "라인 :"
-
-#: ../dialogs/PouDialog.py:31
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr "시간"
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr "matiec 설치 경로를 찾을 수 없습니다.\n"
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr "밀리초"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr "분"
+
+#: ../dialogs/PouDialog.py:36
 msgid "program"
 msgstr "프로그램"
 
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr "초"
+
 #: ../plcopen/iec_std.csv:84
 msgid "string from the middle"
 msgstr "중간 문자열"
@@ -3698,11 +3694,29 @@
 msgid "string right of"
 msgstr "우측 문자열"
 
-#: ../PLCOpenEditor.py:354
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr "업데이트 정보를 이용할 수 없습니다."
+
+#: ../PLCOpenEditor.py:315
 #, python-format
 msgid "warning: %s\n"
 msgstr "경고: %s\n"
 
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr "{a1} \"{a2}\"는 {a3}으로 붙여넣을 수 없습니다."
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+"{a1} XML 파일은 XSD 스키마를 따르지 않습니다. 라인 넘버 {a2}:\n"
+"{a3}"
+
 #: Extra XSD strings
 msgid "CanFestivalSlaveNode"
 msgstr "CANFestival 슬레이브 노드"
@@ -3734,18 +3748,102 @@
 msgid "CAN_Driver"
 msgstr "CAN 드라이버"
 
-msgid "Debug_mode"
-msgstr "디버그 모드"
-
-msgid "CExtension"
-msgstr "C 확장"
+msgid "Generic"
+msgstr "지너릭"
+
+msgid "Command"
+msgstr "명령"
+
+msgid "Xenomai"
+msgstr "Xenomai"
+
+msgid "XenoConfig"
+msgstr "Xenomai 설정"
+
+msgid "Compiler"
+msgstr "컴파일러"
 
 msgid "CFLAGS"
 msgstr "CFLAGS"
 
+msgid "Linker"
+msgstr "링커"
+
 msgid "LDFLAGS"
 msgstr "LDFLAGS"
 
+msgid "Linux"
+msgstr "리눅스"
+
+msgid "Win32"
+msgstr "Win32"
+
+msgid "ModbusRequest"
+msgstr "Modbus 요청"
+
+msgid "SlaveID"
+msgstr "슬레이브ID"
+
+msgid "Nr_of_Channels"
+msgstr "채널 수"
+
+msgid "Start_Address"
+msgstr "시작 주소"
+
+msgid "Timeout_in_ms"
+msgstr "타임아웃_ms"
+
+msgid "MemoryArea"
+msgstr "메모리공간"
+
+msgid "MemoryAreaType"
+msgstr "MemoryArea 종류"
+
+msgid "ModbusTCPclient"
+msgstr "ModbusTCP 클라이언트"
+
+msgid "Remote_IP_Address"
+msgstr "원격 IP 주소"
+
+msgid "Remote_Port_Number"
+msgstr "원격 포트 번호"
+
+msgid "Invocation_Rate_in_ms"
+msgstr "ms당 호출비율"
+
+msgid "ModbusServerNode"
+msgstr "Modbus 서버 노드"
+
+msgid "Local_IP_Address"
+msgstr "로컬 IP 주소"
+
+msgid "Local_Port_Number"
+msgstr "로컬 Port 번호"
+
+msgid "ModbusRTUclient"
+msgstr "ModbusRTU 클라이언트"
+
+msgid "Serial_Port"
+msgstr "시리얼 포트"
+
+msgid "Baud_Rate"
+msgstr "보레이트"
+
+msgid "Parity"
+msgstr "패리티"
+
+msgid "Stop_Bits"
+msgstr "스탑 비트"
+
+msgid "ModbusRTUslave"
+msgstr "ModbusRTU 슬레이브"
+
+msgid "ModbusRoot"
+msgstr "Modbus 루트"
+
+msgid "MaxRemoteTCPclients"
+msgstr "최대 원격 TCP 클라이언트"
+
 msgid "BaseParams"
 msgstr "베이스 파라메터"
 
@@ -3755,24 +3853,6 @@
 msgid "Enabled"
 msgstr "가능"
 
-msgid "Linux"
-msgstr "리눅스"
-
-msgid "Compiler"
-msgstr "컴파일러"
-
-msgid "Linker"
-msgstr "링커"
-
-msgid "Win32"
-msgstr "Win32"
-
-msgid "Xenomai"
-msgstr "Xenomai"
-
-msgid "XenoConfig"
-msgstr "Xenomai 설정"
-
 msgid "BeremizRoot"
 msgstr "베레미즈 루트"
 
@@ -3788,159 +3868,210 @@
 msgid "Disable_Extensions"
 msgstr "확장 모듈 제거 (Extension 제거)"
 
-#~ msgid "Close Project\tCTRL+SHIFT+W"
-#~ msgstr "프로젝트 닫기\tCTRL+SHIFT+W"
-
-#~ msgid "New\tCTRL+N"
-#~ msgstr "새로 만들기\tCTRL+N"
-
-#~ msgid "Open\tCTRL+O"
-#~ msgstr "프로젝트 열기\tCTRL+O"
-
-#~ msgid "Page Setup\tCTRL+ALT+P"
-#~ msgstr "인쇄 페이지 설정\tCTRL+ALT+P"
-
-#, fuzzy
-#~ msgid "Preview\tCTRL+SHIFT+P"
-#~ msgstr ""
-#~ "#-#-#-#-#  Beremiz_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-#~ "인쇄 미리보기\tnCTRL+SHIFT+P\n"
-#~ "#-#-#-#-#  PLCOpenEditor_ko_KR.po (Beremiz_Korean_Version)  #-#-#-#-#\n"
-#~ "인쇄 페이지 미리보기\tCTRL+SHIFT+P"
-
-#~ msgid "Print\tCTRL+P"
-#~ msgstr "인쇄\tCTRL+P"
-
-#~ msgid "Quit\tCTRL+Q"
-#~ msgstr "프로그램 종료\tCTRL+Q"
-
-#~ msgid "Save\tCTRL+S"
-#~ msgstr "프로젝트 저장\tCTRL+S"
-
-#~ msgid "Save as\tCTRL+SHIFT+S"
-#~ msgstr "다른 이름으로 저장\tCTRL+SHIFT+S"
-
-#~ msgid "Copy\tCTRL+C"
-#~ msgstr "복사\tCTRL+C"
-
-#~ msgid "Cut\tCTRL+X"
-#~ msgstr "잘라내기\tCTRL+X"
-
-#, fuzzy
-#~ msgid "Find\tCTRL+F"
-#~ msgstr "되돌리기\tCTRL+Z"
-
-#~ msgid "PLCOpenEditor\tF1"
-#~ msgstr "PLCOpenEditor\tF1"
-
-#~ msgid "Paste\tCTRL+V"
-#~ msgstr "붙여넣기\tCTRL+V"
-
-#~ msgid "Redo\tCTRL+Y"
-#~ msgstr "되돌리기 취소\tCTRL+Y"
-
-#~ msgid "Refresh\tCTRL+R"
-#~ msgstr "새로 고침\tCTRL+R"
-
-#~ msgid "Save As...\tCTRL+SHIFT+S"
-#~ msgstr "다른 이름으로 저장...\tCTRL+SHIFT+S"
-
-#, fuzzy
-#~ msgid "Search in Project\tCTRL+SHIFT+F"
-#~ msgstr "프로젝트 내부 검색\tCTRL+F"
-
-#~ msgid "Undo\tCTRL+Z"
-#~ msgstr "되돌리기\tCTRL+Z"
-
-#~ msgid "&ConfNode"
-#~ msgstr "&플러그인"
-
-#~ msgid "Add ConfNode"
-#~ msgstr "플러그인 추가"
-
-#~ msgid "Add a sub confnode"
-#~ msgstr "서브 플러그인 추가"
-
-#~ msgid "Append "
-#~ msgstr "추가"
-
-#~ msgid "Delete this confnode"
-#~ msgstr "해당 플러그인 삭제"
-
-#~ msgid "Edit CanOpen Network with NetworkEdit"
-#~ msgstr "네트워크 에디터를 이용하여 CanOpen 네트워크 수정"
-
-#~ msgid "Edit Python File"
-#~ msgstr "파이썬 파일 수정"
-
-#~ msgid "Edit network"
-#~ msgstr "네트워크 수정"
-
-#~ msgid "Enable/Disable this confnode"
-#~ msgstr "플러그인 사용/정지"
-
-#~ msgid "Please enter a name for confnode:"
-#~ msgstr "플러그인 이름을 입력하세요:"
-
-#~ msgid "Project not created"
-#~ msgstr "프로젝트가 생성되지 않았습니다"
-
-#~ msgid "Topology"
-#~ msgstr "토폴로지"
-
-#~ msgid "Wrong URI, please check it !\n"
-#~ msgstr "URI 타입 주소를 확인하세요!\n"
-
-#~ msgid "Add a new data type"
-#~ msgstr "새로운 데이터 타입 추가"
-
-#~ msgid "Add new configuration"
-#~ msgstr "새로운 설정(configuration) 추가"
-
-#~ msgid "Add new resource"
-#~ msgstr "새로운 리소스 추가"
-
-#~ msgid "Block Types"
-#~ msgstr "블럭 타입"
-
-#~ msgid "CSV Log"
-#~ msgstr "CSV 로그"
-
-#~ msgid "Delete Task"
-#~ msgstr "태스크 삭제"
-
-#~ msgid "Display"
-#~ msgstr "디스플레이"
-
-#~ msgid "File"
-#~ msgstr "파일"
-
-#~ msgid "Graphic Panel"
-#~ msgstr "그래픽 패널"
-
-#~ msgid "Help"
-#~ msgstr "도움말"
-
-#~ msgid "Instances"
-#~ msgstr "인스턴스"
-
-#~ msgid "Invalid value \"%s\" for location"
-#~ msgstr "\"%s\"값은 위치에 적합하지 않습니다!"
-
-#~ msgid "Please enter configuration name"
-#~ msgstr "설정(configuration) 이름을 입력하세요"
-
-#~ msgid "Please enter data type name"
-#~ msgstr "데이터 타입 이름을 입력하세요"
-
-#~ msgid "Please enter resource name"
-#~ msgstr "리소스 이름을 입력하세요"
-
-#~ msgid "Please enter text"
-#~ msgstr "텍스트를 입력하세요"
-
-#~ msgid "Plugins"
-#~ msgstr "플러그인"
-
-#~ msgid "Types"
-#~ msgstr "타입(Types)"
+msgid "%(codefile_name)s"
+msgstr "%(codefile_name)s"
+
+msgid "variables"
+msgstr "변수들"
+
+msgid "variable"
+msgstr "변수"
+
+msgid "name"
+msgstr "이름"
+
+msgid "type"
+msgstr "타입"
+
+msgid "class"
+msgstr "클래스"
+
+msgid "initial"
+msgstr "초기"
+
+msgid "desc"
+msgstr "설명"
+
+msgid "onchange"
+msgstr "값 변경 알림"
+
+msgid "opts"
+msgstr "옵션들"
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr "0 - 현재 시간, 1 - PDT로부터 시간 읽어오기"
+
+msgid "Preset datetime"
+msgstr "날짜 기본설정"
+
+msgid "Copy of IN"
+msgstr "IN의 복사"
+
+msgid "Datetime, current or relative to PDT"
+msgstr "태평양 일광 절약 시간 기준으로 현재 또는 그에 상대적인 현재 시간"
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr "실시간 시계는 타임 스탬핑, batch 리포트에서의 시간/날짜 설정, 알람 메세지 등과 같은 일에 사용됩니다. "
+
+msgid "1 = integrate, 0 = hold"
+msgstr "1 = 인테그레이트, 0 = 홀드"
+
+msgid "Overriding reset"
+msgstr "Overriding 리셋"
+
+msgid "Input variable"
+msgstr "입력 변수"
+
+msgid "Initial value"
+msgstr "초기값"
+
+msgid "Sampling period"
+msgstr "샘플링 주기"
+
+msgid "NOT R1"
+msgstr "R1이 아님"
+
+msgid "Integrated output"
+msgstr "적분된 출력"
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr "적분 함수 블록은 시간에 따라 입력 XIN의 값을 적분합니다."
+
+msgid "0 = reset"
+msgstr "0 = 리셋"
+
+msgid "Input to be differentiated"
+msgstr "미분되어야 하는 입력"
+
+msgid "Differentiated output"
+msgstr "미분된 출력"
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr "미분 함수 블록은 입력 XIN의 변화율에 비례하는 출력 XOUT을 생성합니다."
+
+msgid "0 - manual , 1 - automatic"
+msgstr "0 - 수동, 1 - 자동"
+
+msgid "Process variable"
+msgstr "프로세스 변수"
+
+msgid "Set point"
+msgstr "셋 포인트"
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr "수동 출력값 조정 - 일반적으로 전송 스테이션으로부터"
+
+msgid "Proportionality constant"
+msgstr "비례 상수"
+
+msgid "Reset time"
+msgstr "시간 초기화"
+
+msgid "Derivative time constant"
+msgstr "미분 시간 상수"
+
+msgid "PV - SP"
+msgstr "PV-SP"
+
+msgid "FB for integral term"
+msgstr "적분항을 위한 함수 블록"
+
+msgid "FB for derivative term"
+msgstr "미분항을 위한 함수 블록"
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr "PID (비례, 적분, 미분) 함수 블록은 폐루프 제어를 위한 세 가지 항 제어기를 제공합니다. "
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr "0 - X0 따라가기, 1 - X1 ramp / X1 따라가기 "
+
+msgid "Ramp duration"
+msgstr "Ramp 지속시간"
+
+msgid "BUSY = 1 during ramping period"
+msgstr "ramping 주기동안 BUSY = 1"
+
+msgid "Elapsed time of ramp"
+msgstr "ramp의 경과된 시간"
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr "RAMP 함수 블록은 표준에서 주어진 예제를 모델로 합니다."
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+"히스테리시스 기능 블록은 두 개의 부동 소수점 (REAL) 입력 XIN1 및 XIN2의 차이로 구동되는 히스테리시스 부울 출력을 "
+"제공합니다."
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr "SR bistable은 Set 도미넌트한 래치입니다."
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr "RS bistable은 Reset 도미넌트한 래치입니다."
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr "세마포어는 소프트웨어 엘리먼트들이 특정 자원에 접근에 대해 상호배제 매커니즘을 제공합니다."
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr "상승 엣지가 감지되면 출력은 단일한 펄스를 만들어냅니다. "
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr "하강 엣지가 검출되면 출력은 단일한 펄스를 만들어냅니다."
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr "업 카운터는 카운트가 최대값에 도달하였을때 신호를 주기 위해 사용될 수 있습니다. "
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr "다운 카운터는 특정 값에서부터 감소하여 제로값이 될 때 신호를 주기 위해 사용될 수 있습니다. "
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+"업 다운 카운터는 두 개의 입력값 CU,CD을 가집니다. 입력값들은 하나의 입력을 업 카운트하거나 다운 카운트하는데 사용될 수 있습니다."
+" "
+
+msgid "first input parameter"
+msgstr "첫번째 입력 파라메터"
+
+msgid "second input parameter"
+msgstr "두번째 입력 파라메터"
+
+msgid "first output parameter"
+msgstr "첫번째 출력 파라메터"
+
+msgid "second output parameter"
+msgstr "두번째 출력 파라메터"
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr "초기 상태: 0-리셋, 1-카운팅, 2-셋"
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr "펄스 타이머는 주어진 시간동안의 아웃풋 펄스 생성에 사용될 수 있습니다. "
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr "온 딜레이 타이머는 입력이 참이 된 이후 고정된 시간 동안 출력 설정을 참으로 지연시키는데 사용될 수 있습니다. "
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr "오프 딜레이 타이머는 입력이 거짓값이 된 이후 고정된 시간 동안 출력 설정을 거짓값으로 지연시키는데 사용될 수 있습니다. "
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/Beremiz_nl_NL.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4056 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Jordy van der Heijden <jordyvanderheijden@gmail.com>, 2018\n"
+"Language-Team: Dutch (Netherlands) (https://www.transifex.com/beremiz/teams/75746/nl_NL/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl_NL\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
+msgid ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "   External"
+msgstr "Extern"
+
+#: ../controls/VariablePanel.py:89
+msgid "   InOut"
+msgstr "InUit"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Input"
+msgstr "Invoer"
+
+#: ../controls/VariablePanel.py:90
+msgid "   Local"
+msgstr "Lokaal"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Output"
+msgstr "Uitvoer"
+
+#: ../controls/VariablePanel.py:91
+msgid "   Temp"
+msgstr "Tijdelijk"
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
+#, python-format
+msgid " and %s"
+msgstr "en %s"
+
+#: ../ProjectController.py:1182
+msgid " generation failed !\n"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1029
+#, python-format
+msgid "\"%s\" Data Type doesn't exist !!!"
+msgstr "Datatype \"%s\" bestaat niet !!!"
+
+#: ../plcopen/plcopen.py:1047
+#, python-format
+msgid "\"%s\" POU already exists !!!"
+msgstr "\"%s\" bestaat al !!!"
+
+#: ../plcopen/plcopen.py:1068
+#, python-format
+msgid "\"%s\" POU doesn't exist !!!"
+msgstr "\"%s\" bestaat niet !!!"
+
+#: ../editors/Viewer.py:288
+#, python-format
+msgid "\"%s\" can't use itself!"
+msgstr ""
+
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
+#, python-format
+msgid "\"%s\" config already exists!"
+msgstr "\"%s\" config bestaat al !!!"
+
+#: ../plcopen/plcopen.py:531
+#, python-format
+msgid "\"%s\" configuration already exists !!!"
+msgstr "\"%s\" configuratie bestaat al !!!"
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr "\"%s\" configuratie bestaat niet !!!"
+
+#: ../IDEFrame.py:1638
+#, python-format
+msgid "\"%s\" data type already exists!"
+msgstr "\"%s\" datatype bestaat al !!!"
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
+#, python-format
+msgid "\"%s\" element for this pou already exists!"
+msgstr "\"%s\" element voor deze POU bestaat al !!!"
+
+#: ../BeremizIDE.py:928
+#, python-format
+msgid "\"%s\" folder is not a valid Beremiz project\n"
+msgstr "\"%s\" map is geen geldig Beremiz project.\n"
+
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
+#, python-format
+msgid "\"%s\" is a keyword. It can't be used!"
+msgstr "\"%s\" is een keyword en mag niet gebruikt worden."
+
+#: ../plcopen/plcopen.py:2836
+#, python-format
+msgid "\"%s\" is an invalid value!"
+msgstr "\"%s\" is een ongeldige waarde!"
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
+msgid "\"%s\" is not a valid folder!"
+msgstr "\"%s\" is geen geldige map!"
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
+#, python-format
+msgid "\"%s\" is not a valid identifier!"
+msgstr "\"%s\" is geen geldige identifier!"
+
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr ""
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
+#, python-format
+msgid "\"%s\" pou already exists!"
+msgstr "\"%s\" POU bestaat al!"
+
+#: ../dialogs/SFCStepNameDialog.py:62
+#, python-format
+msgid "\"%s\" step already exists!"
+msgstr "\"%s\" stap bestaat al!"
+
+#: ../editors/DataTypeEditor.py:566
+#, python-format
+msgid "\"%s\" value already defined!"
+msgstr "\"%s\" waarde al gedefiniëerd!"
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
+#, python-format
+msgid "\"%s\" value isn't a valid array dimension!"
+msgstr "\"%s\" waarde is geen geldige arraydimensie!"
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
+#, python-format
+msgid ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+msgstr ""
+"\"%s\" waarde is geen geldige arraydimensie! Rechterwaarde moet groter zijn "
+"dan linkerwaarde."
+
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr "\"{a1}\" functie afgebroken in \"{a2}\" POU: Geen invoer aangesloten!"
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr "\"{a1}\" wordt al gebruikt door \"{a2}\"!"
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr "\"{a1}\" bron bestaat al in \"{a2}\" configuratie !!!"
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr "\"{a1}\" bron bestaat niet in \"{a2}\" configuratie !!!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr "%03gms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr "%dd"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr "%dh"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr "%dm"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr "%dms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr "%ds"
+
+#: ../PLCControler.py:1114
+#, python-format
+msgid "%s Data Types"
+msgstr "%sDatatypes"
+
+#: ../PLCControler.py:1097
+#, python-format
+msgid "%s POUs"
+msgstr "%sPOU's"
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
+#, python-format
+msgid "%s Profile"
+msgstr "%sProfiel"
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
+#, python-format
+msgid "%s body don't have instances!"
+msgstr "%sbody heeft geen instances!"
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
+#, python-format
+msgid "%s body don't have text!"
+msgstr "%sbody heeft geen tekst!"
+
+#: ../IDEFrame.py:388
+msgid "&Add Element"
+msgstr "&Element Toevoegen"
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr "&Sluiten"
+
+#: ../IDEFrame.py:361
+msgid "&Configuration"
+msgstr "&Configuratie"
+
+#: ../IDEFrame.py:350
+msgid "&Data Type"
+msgstr "&Datatype"
+
+#: ../IDEFrame.py:392
+msgid "&Delete"
+msgstr "&Verwijderen"
+
+#: ../IDEFrame.py:342
+msgid "&Display"
+msgstr "&Weegeven"
+
+#: ../IDEFrame.py:341
+msgid "&Edit"
+msgstr "&Wijzigen"
+
+#: ../IDEFrame.py:340
+msgid "&File"
+msgstr "&Bestand"
+
+#: ../IDEFrame.py:352
+msgid "&Function"
+msgstr "&Functie"
+
+#: ../IDEFrame.py:343
+msgid "&Help"
+msgstr "&Help"
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr "&Licentie"
+
+#: ../IDEFrame.py:356
+msgid "&Program"
+msgstr "&Programma"
+
+#: ../PLCOpenEditor.py:98
+msgid "&Properties"
+msgstr "&Eigenschappen"
+
+#: ../BeremizIDE.py:244
+msgid "&Recent Projects"
+msgstr "&Recente Projecten"
+
+#: ../IDEFrame.py:358
+msgid "&Resource"
+msgstr "&Bron"
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr "'{a1}' - {a2} overeenkomst in project."
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr "'{a1}' - {a2} overeenkomsten in project."
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr "'{a1}' bevindt zich op {a2} \n"
+
+#: ../controls/SearchResultPanel.py:298
+#, python-format
+msgid "(%d matches)"
+msgstr "(%d overeenkomsten)"
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
+#, python-format
+msgid ", %s"
+msgstr ", %s"
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr ""
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr "1d"
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr "1u"
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr "1m"
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr "1s"
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+"Een POU heeft een element genaamd \"%s\". Dit kan een conflict veroorzaken. "
+"Wilt u toch doorgaan?"
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
+#, python-format
+msgid "A POU named \"%s\" already exists!"
+msgstr "Er bestaat al een POU genaamd \"%s\"!"
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr "Een kind genaamd \"{a1}\" bestaat al -> \"{a2}\"\n"
+
+#: ../dialogs/BrowseLocationsDialog.py:229
+msgid "A location must be selected!"
+msgstr "Er moet een locatie geselecteerd worden!"
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr "Er bestaat al een taak met dezelfde naam!"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
+#, python-format
+msgid "A variable with \"%s\" as name already exists in this pou!"
+msgstr "Er bestaat al een variabele met de naam \"%s\" in deze POU!"
+
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr "Er bestaat al een variabele met de naam \"%s\"!"
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
+msgid "About"
+msgstr "Over"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Absolute number"
+msgstr "Absoluut getal"
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
+msgid "Action"
+msgstr "Actie"
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
+msgid "Action Block"
+msgstr "Actieblok"
+
+#: ../dialogs/PouActionDialog.py:89
+msgid "Action Name"
+msgstr "Actienaam"
+
+#: ../dialogs/PouActionDialog.py:56
+msgid "Action Name:"
+msgstr "Actienaam:"
+
+#: ../plcopen/plcopen.py:1567
+#, python-format
+msgid "Action with name %s doesn't exist!"
+msgstr "Er bestaat geen actie met naam \"%s\"!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Actions"
+msgstr "Acties"
+
+#: ../dialogs/ActionBlockDialog.py:139
+msgid "Actions:"
+msgstr "Acties:"
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr "Actief"
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
+msgid "Add"
+msgstr "Toevoegen"
+
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
+msgid "Add Action"
+msgstr "Actie Toevoegen"
+
+#: ../features.py:33
+msgid "Add C code accessing located variables synchronously"
+msgstr ""
+
+#: ../IDEFrame.py:1907
+msgid "Add Configuration"
+msgstr "Configuratie Toevoegen"
+
+#: ../IDEFrame.py:1887
+msgid "Add DataType"
+msgstr "Datatype Toevoegen"
+
+#: ../editors/Viewer.py:609
+msgid "Add Divergence Branch"
+msgstr "Divergentietak Toevoegen"
+
+#: ../dialogs/DiscoveryDialog.py:121
+msgid "Add IP"
+msgstr "IP Toevoegen"
+
+#: ../IDEFrame.py:1895
+msgid "Add POU"
+msgstr "POU Toevoegen"
+
+#: ../features.py:34
+msgid "Add Python code executed asynchronously"
+msgstr "Asynchrone Pythoncode toevoegen"
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
+msgid "Add Resource"
+msgstr "Bron Toevoegen"
+
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
+msgid "Add Transition"
+msgstr "Overgang Toevoegen"
+
+#: ../editors/Viewer.py:596
+msgid "Add Wire Segment"
+msgstr "Draadsegment Toevoegen"
+
+#: ../editors/SFCViewer.py:447
+msgid "Add a new initial step"
+msgstr "Nieuwe Initiële Stap Toevoegen"
+
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
+msgid "Add a new jump"
+msgstr "Nieuwe Sprong Toevoegen"
+
+#: ../editors/SFCViewer.py:469
+msgid "Add a new step"
+msgstr "Nieuwe Stap Toevoegen"
+
+#: ../features.py:35
+msgid "Add a simple WxGlade based GUI."
+msgstr "Simpele WxGlade GUI Toevoegen"
+
+#: ../dialogs/ActionBlockDialog.py:143
+msgid "Add action"
+msgstr "Actie Toevoegen"
+
+#: ../editors/DataTypeEditor.py:364
+msgid "Add element"
+msgstr "Element Toevoegen"
+
+#: ../editors/ResourceEditor.py:283
+msgid "Add instance"
+msgstr "Instance Toevoegen"
+
+#: ../canfestival/NetworkEditor.py:110
+msgid "Add slave"
+msgstr "Slaaf Toevoegen"
+
+#: ../editors/ResourceEditor.py:252
+msgid "Add task"
+msgstr "Taak Toevoegen"
+
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
+msgid "Add variable"
+msgstr "Variabele Toevoegen"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Addition"
+msgstr "Toevoeging"
+
+#: ../plcopen/definitions.py:51
+msgid "Additional function blocks"
+msgstr "Extra Functieblokken"
+
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr "Blokgrootte Aanpassen"
+
+#: ../editors/Viewer.py:1720
+msgid "Alignment"
+msgstr "Uitlijning"
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
+msgid "All"
+msgstr "Alles"
+
+#: ../editors/FileManagementPanel.py:37
+msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+msgstr "Alle bestanden (*.*)|*.*|CSV (*.csv)|*.csv"
+
+#: ../ProjectController.py:1670
+msgid "Already connected. Please disconnect\n"
+msgstr "Al verbonden. Verbinding verbreken alstublieft.\n"
+
+#: ../editors/DataTypeEditor.py:607
+#, python-format
+msgid "An element named \"%s\" already exists in this structure!"
+msgstr "Er bestaat al een element genaamd \"%s\" in deze constructie!"
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr "Er bestaat al een instance met dezelfde naam!"
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr "Naamwijziging toepassen op alle continuations met dezelfde naam."
+
+#: ../plcopen/iec_std.csv:31
+msgid "Arc cosine"
+msgstr "Boogcosinus"
+
+#: ../plcopen/iec_std.csv:30
+msgid "Arc sine"
+msgstr "Boogsinus"
+
+#: ../plcopen/iec_std.csv:32
+msgid "Arc tangent"
+msgstr "Boogtangens"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Arithmetic"
+msgstr "Rekenkundig"
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
+msgid "Array"
+msgstr "Array"
+
+#: ../plcopen/iec_std.csv:39
+msgid "Assignment"
+msgstr "Opdracht/Toewijzing"
+
+#: ../dialogs/FBDVariableDialog.py:226
+msgid "At least a variable or an expression must be selected!"
+msgstr "Er moet minstens één variabele of uitdrukking geselecteerd worden!"
+
+#: ../controls/ProjectPropertiesPanel.py:111
+msgid "Author"
+msgstr "Auteur"
+
+#: ../controls/ProjectPropertiesPanel.py:108
+msgid "Author Name (optional):"
+msgstr "Auteursnaam (optioneel):"
+
+#: ../dialogs/FindInPouDialog.py:80
+msgid "Backward"
+msgstr ""
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
+#, python-format
+msgid "Bad location size : %s"
+msgstr "Ongeldige locatiegrootte: %s"
+
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
+msgid "Base Type:"
+msgstr "Basistype:"
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
+msgid "Base Types"
+msgstr "Basistypes"
+
+#: ../BeremizIDE.py:483
+msgid "Beremiz"
+msgstr "Beremiz"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Binary selection (1 of 2)"
+msgstr "Binaire selectie (1 van 2)"
+
+#: ../plcopen/iec_std.csv:62
+msgid "Bit-shift"
+msgstr "Bitverschuiving"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise"
+msgstr "Bitsgewijs"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise AND"
+msgstr "Bitsgewijze AND"
+
+#: ../plcopen/iec_std.csv:67
+msgid "Bitwise OR"
+msgstr "Bitsgewijze OR"
+
+#: ../plcopen/iec_std.csv:68
+msgid "Bitwise XOR"
+msgstr "Bitsgewijze XOR"
+
+#: ../plcopen/iec_std.csv:69
+msgid "Bitwise inverting"
+msgstr "Bitsgewijze inversie"
+
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
+msgid "Block"
+msgstr "Blok"
+
+#: ../dialogs/FBDBlockDialog.py:63
+msgid "Block Properties"
+msgstr "Blokeigenschappen"
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr "Bloknaam"
+
+#: ../editors/Viewer.py:586
+msgid "Bottom"
+msgstr "Bodem"
+
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr "Kapot"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
+msgid "Browse %s values library"
+msgstr "%s waardenbibliotheek doorbladeren,"
+
+#: ../dialogs/BrowseLocationsDialog.py:72
+msgid "Browse Locations"
+msgstr "Locaties doorbladeren."
+
+#: ../ProjectController.py:1815
+msgid "Build"
+msgstr "Compileer"
+
+#: ../ProjectController.py:1335
+msgid "Build directory already clean\n"
+msgstr "Compilatiemap al schoon.\n"
+
+#: ../ProjectController.py:1816
+msgid "Build project into build folder"
+msgstr "Compileer project in compilatiemap"
+
+#: ../ProjectController.py:1108
+msgid "C Build crashed !\n"
+msgstr "C compilatie vastgelopen!\n"
+
+#: ../ProjectController.py:1105
+msgid "C Build failed.\n"
+msgstr "C compilatie niet geslaagd!\n"
+
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr "C code"
+
+#: ../ProjectController.py:1186
+msgid "C code generated successfully.\n"
+msgstr "C code succesvol gegenereerd.\n"
+
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr "C compilatie niet geslaagd.\n"
+
+#: ../targets/toolchain_gcc.py:199
+#, python-format
+msgid "C compilation of %s failed.\n"
+msgstr "C compilatie van %s niet geslaagd.\n"
+
+#: ../features.py:33
+msgid "C extension"
+msgstr "C uitbreiding"
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr "C&redits"
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr "CANOpen netwerk"
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr "CANOpen slaaf"
+
+#: ../features.py:31
+msgid "CANopen support"
+msgstr "CANOpen ondersteuning"
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
+msgid "Can only generate execution order on FBD networks!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:291
+msgid "Can only give a location to local or global variables"
+msgstr "Kan alleen een locatie toewijzen aan lokale of globale variabelen"
+
+#: ../PLCOpenEditor.py:318
+#, python-format
+msgid "Can't generate program to file %s!"
+msgstr "Kan geen programma genereren naar bestand%s!"
+
+#: ../controls/VariablePanel.py:289
+msgid "Can't give a location to a function block instance"
+msgstr "Kan geen locatie toewijzen aan een functieblok instance"
+
+#: ../PLCOpenEditor.py:363
+#, python-format
+msgid "Can't save project to file %s!"
+msgstr "Kan project niet opslaan naar bestand %s!"
+
+#: ../controls/VariablePanel.py:339
+msgid "Can't set an initial value to a function block instance"
+msgstr "Kan geen initiële variabele instellen voor een functieblok."
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr "Kan geen {a1} kind aanmaken van type {a2}"
+
+#: ../ConfigTreeNode.py:454
+#, python-format
+msgid "Cannot find lower free IEC channel than %d\n"
+msgstr "Kan geen lager vrij IEC kanaal vinden dan %d\n"
+
+#: ../connectors/PYRO/__init__.py:139
+msgid "Cannot get PLC status - connection failed.\n"
+msgstr "Kan geen PLC status opvragen - verbinden niet gelukt\n"
+
+#: ../ProjectController.py:967
+msgid "Cannot open/parse VARIABLES.csv!\n"
+msgstr "Kan VARIABLES.csv niet openen/verwerken!\n"
+
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+"Kan geen bit-offset instellen voor niet-booleaanse '{a1}' variabele "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
+msgid "Case sensitive"
+msgstr "Hoofdlettergevoelig"
+
+#: ../editors/Viewer.py:581
+msgid "Center"
+msgstr "Centreer"
+
+#: ../Beremiz_service.py:276
+msgid "Change IP of interface to bind"
+msgstr "Verander IP of interface om te binden"
+
+#: ../Beremiz_service.py:275
+msgid "Change Name"
+msgstr "Naam Wijzigen"
+
+#: ../IDEFrame.py:1977
+msgid "Change POU Type To"
+msgstr "Verander POU-type Naar"
+
+#: ../Beremiz_service.py:277
+msgid "Change Port Number"
+msgstr "Verander Poortnummer"
+
+#: ../Beremiz_service.py:278
+msgid "Change working directory"
+msgstr "Verander Werkmap"
+
+#: ../plcopen/iec_std.csv:81
+msgid "Character string"
+msgstr "Karakterstreng"
+
+#: ../svgui/svgui.py:136
+msgid "Choose a SVG file"
+msgstr "Kies een SVG-bestand"
+
+#: ../ProjectController.py:561
+msgid "Choose a directory to save project"
+msgstr "Kies een map om het project in op te slaan"
+
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
+msgid "Choose a file"
+msgstr "Kies een bestand"
+
+#: ../BeremizIDE.py:900
+msgid "Choose a project"
+msgstr "Kies een project"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
+msgid "Choose a value for %s:"
+msgstr "Kies een waarde voor %s:"
+
+#: ../Beremiz_service.py:333
+msgid "Choose a working directory "
+msgstr "Kies een werkmap"
+
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr "Kies een lege map voor een nieuw project"
+
+#: ../ProjectController.py:468
+msgid "Chosen folder doesn't contain a program. It's not a valid project!"
+msgstr "Gekozen map bevat geen programma. Het is geen geldig project."
+
+#: ../ProjectController.py:435
+msgid "Chosen folder isn't empty. You can't use it for a new project!"
+msgstr ""
+"De gekozen map is niet leeg. Je kunt het niet gebruiken voor een nieuw "
+"project!"
+
+#: ../controls/VariablePanel.py:60
+msgid "Class"
+msgstr "Klasse"
+
+#: ../controls/VariablePanel.py:472
+msgid "Class Filter:"
+msgstr "Klassefilter:"
+
+#: ../dialogs/FBDVariableDialog.py:74
+msgid "Class:"
+msgstr "Klasse:"
+
+#: ../ProjectController.py:1821
+msgid "Clean"
+msgstr "Schoonmaken"
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr "Maak berichtenlog schoon"
+
+#: ../ProjectController.py:1822
+msgid "Clean project build folder"
+msgstr "Project buildmap schoonmaken"
+
+#: ../ProjectController.py:1332
+msgid "Cleaning the build directory\n"
+msgstr "Buildmap aan het schoonmaken\n"
+
+#: ../IDEFrame.py:437
+msgid "Clear Errors"
+msgstr "Foutmeldingen verwijderen"
+
+#: ../editors/Viewer.py:680
+msgid "Clear Execution Order"
+msgstr "Uitvoerorder verwijderen"
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr "Sluiten"
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
+msgid "Close Application"
+msgstr "Programma Afsluiten"
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
+msgid "Close Project"
+msgstr "Project Sluiten"
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
+msgid "Close Tab"
+msgstr "Tab Sluiten"
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
+msgid "Coil"
+msgstr ""
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
+msgid "Comment"
+msgstr "Commentaar"
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr "Community Ondersteuning"
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr "Bedrijfsnaam"
+
+#: ../controls/ProjectPropertiesPanel.py:106
+msgid "Company Name (required):"
+msgstr "Bedrijfsnaam (verplicht):"
+
+#: ../controls/ProjectPropertiesPanel.py:107
+msgid "Company URL (optional):"
+msgstr "Bedrijfs-URL (optioneel):"
+
+#: ../plcopen/iec_std.csv:75
+msgid "Comparison"
+msgstr "Vergelijking"
+
+#: ../ProjectController.py:756
+msgid "Compiling IEC Program into C code...\n"
+msgstr "IEC Progamma compileren naar C-code...\n"
+
+#: ../plcopen/iec_std.csv:85
+msgid "Concatenation"
+msgstr "Aaneenschakeling"
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr "Config"
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr "Config variabelen"
+
+#: ../dialogs/SearchInProjectDialog.py:43
+msgid "Configuration"
+msgstr "Configuratie"
+
+#: ../plcopen/types_enums.py:77
+msgid "Configurations"
+msgstr "Configuraties"
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr "Bevestig of verander variabelenaam"
+
+#: ../ProjectController.py:1842
+msgid "Connect"
+msgstr "Verbinden"
+
+#: ../ProjectController.py:1843
+msgid "Connect to the target PLC"
+msgstr "Verbind met doel-PLC"
+
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr "Verbonden met URI: %s"
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
+msgid "Connection"
+msgstr "Verbinding"
+
+#: ../dialogs/ConnectionDialog.py:55
+msgid "Connection Properties"
+msgstr "Verbindingseigenschappen"
+
+#: ../ProjectController.py:1691
+msgid "Connection canceled!\n"
+msgstr "Verbinden afgebroken!\n"
+
+#: ../ProjectController.py:1714
+#, python-format
+msgid "Connection failed to %s!\n"
+msgstr "Verbinden met %s niet gelukt!\n"
+
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr "Verbinding verbroken!\n"
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
+msgid "Connection to '%s' failed.\n"
+msgstr "Verbinden met '%s' niet gelukt! \n"
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
+msgid "Connector"
+msgstr "Stekker"
+
+#: ../dialogs/SFCStepDialog.py:68
+msgid "Connectors:"
+msgstr "Stekkers:"
+
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr ""
+
+#: ../controls/VariablePanel.py:75
+msgid "Constant"
+msgstr "Constante"
+
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
+msgid "Contact"
+msgstr "Contact"
+
+#: ../controls/ProjectPropertiesPanel.py:217
+msgid "Content Description (optional):"
+msgstr "Inhoudsbeschrijving (optioneel):"
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
+msgid "Continuation"
+msgstr "Vervolg"
+
+#: ../plcopen/iec_std.csv:18
+msgid "Conversion from BCD"
+msgstr "Conversie van BCD"
+
+#: ../plcopen/iec_std.csv:19
+msgid "Conversion to BCD"
+msgstr "Conversie naar BCD"
+
+#: ../plcopen/iec_std.csv:21
+msgid "Conversion to date"
+msgstr "Conversie naar datum"
+
+#: ../plcopen/iec_std.csv:20
+msgid "Conversion to time-of-day"
+msgstr "Conversie naar tijd van de dag"
+
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
+msgid "Copy"
+msgstr "Kopiëren"
+
+#: ../IDEFrame.py:1964
+msgid "Copy POU"
+msgstr "POU Kopiëren"
+
+#: ../editors/FileManagementPanel.py:68
+msgid "Copy file from left folder to right"
+msgstr "Bestand kopiëren van linker- naar rechtermap"
+
+#: ../editors/FileManagementPanel.py:67
+msgid "Copy file from right folder to left"
+msgstr "Bestand kopiëren van rechter- naar linkermap"
+
+#: ../plcopen/iec_std.csv:28
+msgid "Cosine"
+msgstr "Cosinus"
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+"Kan kind \"{a1}\", type {a2} niet toevoegen:\n"
+"{a3}\n"
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr "Kan oud%s bestand niet importeren."
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Kan conflode basisparameters {a1} niet laden:\n"
+"{a2}"
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Kan conflode parameters {a1} niet laden:\n"
+"{a2}"
+
+#: ../PLCControler.py:552
+msgid "Couldn't paste non-POU object."
+msgstr "Kan niet-POU object niet plakken."
+
+#: ../ProjectController.py:1636
+msgid "Couldn't start PLC !\n"
+msgstr "Kan PLC niet opstarten!\n"
+
+#: ../ProjectController.py:1644
+msgid "Couldn't stop PLC !\n"
+msgstr "Kan PLC niet stoppen!\n"
+
+#: ../svgui/svgui.py:57
+msgid "Create HMI"
+msgstr "Maak HMI"
+
+#: ../dialogs/PouDialog.py:54
+msgid "Create a new POU"
+msgstr "Maak een nieuwe POU"
+
+#: ../dialogs/PouActionDialog.py:45
+msgid "Create a new action"
+msgstr "Maak een nieuwe actie"
+
+#: ../IDEFrame.py:166
+msgid "Create a new action block"
+msgstr "Maak een nieuw actieblok"
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
+msgid "Create a new block"
+msgstr "Maak een nieuw blok"
+
+#: ../IDEFrame.py:139
+msgid "Create a new branch"
+msgstr "Maak een nieuwe tak"
+
+#: ../IDEFrame.py:133
+msgid "Create a new coil"
+msgstr ""
+
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
+msgid "Create a new comment"
+msgstr "Maak een nieuwe opmerking"
+
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
+msgid "Create a new connection"
+msgstr "Maak een nieuwe verbinding"
+
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
+msgid "Create a new contact"
+msgstr "Maak een nieuw contact"
+
+#: ../IDEFrame.py:169
+msgid "Create a new divergence"
+msgstr "Maak een nieuwe divergentie"
+
+#: ../dialogs/SFCDivergenceDialog.py:54
+msgid "Create a new divergence or convergence"
+msgstr "Maak een nieuwe di- of convergentie"
+
+#: ../IDEFrame.py:157
+msgid "Create a new initial step"
+msgstr "Maak een nieuwe beginstap"
+
+#: ../IDEFrame.py:172
+msgid "Create a new jump"
+msgstr "Maak een nieuwe sprong"
+
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
+msgid "Create a new power rail"
+msgstr "Maak een nieuwe spanningslijn"
+
+#: ../IDEFrame.py:130
+msgid "Create a new rung"
+msgstr ""
+
+#: ../IDEFrame.py:160
+msgid "Create a new step"
+msgstr "Maak een nieuwe stap"
+
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
+msgid "Create a new transition"
+msgstr "Maak een nieuwe overgang"
+
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
+msgid "Create a new variable"
+msgstr "Maak een nieuwe variabele"
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr "Credits"
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr "Huidige werkmap:"
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
+msgid "Cut"
+msgstr "Knip"
+
+#: ../editors/ResourceEditor.py:81
+msgid "Cyclic"
+msgstr "Cyclisch"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:60
+msgid "DEPRECATED"
+msgstr "VEROUDERD"
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
+msgid "DS-301 Profile"
+msgstr "DS-301 Profiel"
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
+msgid "DS-302 Profile"
+msgstr "DS-302 Profiel"
+
+#: ../dialogs/SearchInProjectDialog.py:39
+msgid "Data Type"
+msgstr "Datatype"
+
+#: ../plcopen/types_enums.py:76
+msgid "Data Types"
+msgstr "Datatypes"
+
+#: ../plcopen/iec_std.csv:16
+msgid "Data type conversion"
+msgstr "Datatypeconversie"
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
+msgid "Date addition"
+msgstr "Datatoevoeging"
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
+msgid "Date and time subtraction"
+msgstr "Datum- en tijdaftrekking"
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
+msgid "Date subtraction"
+msgstr "Datumaftrekking"
+
+#: ../dialogs/DurationEditorDialog.py:46
+msgid "Days:"
+msgstr "Dagen:"
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr ""
+"Debug komt niet overeen met PLC - stop/transfer/start om opnieuw in te "
+"schakelen\n"
+
+#: ../controls/PouInstanceVariablesPanel.py:144
+msgid "Debug instance"
+msgstr "Instance Debuggen"
+
+#: ../editors/Viewer.py:490
+#, python-format
+msgid "Debug: %s"
+msgstr "Debuggen: %s"
+
+#: ../ProjectController.py:1471
+#, python-format
+msgid "Debug: Unknown variable '%s'\n"
+msgstr "Debug: Onbekende variabele '%s'\n"
+
+#: ../ProjectController.py:1469
+#, python-format
+msgid "Debug: Unsupported type to debug '%s'\n"
+msgstr "Debug: Type om te debuggen '%s' wordt niet ondersteund\n"
+
+#: ../IDEFrame.py:660
+msgid "Debugger"
+msgstr "Debugger"
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr "Debugger klaar\n"
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
+msgid "Delete"
+msgstr "Verwijderen"
+
+#: ../editors/Viewer.py:610
+msgid "Delete Divergence Branch"
+msgstr "Divergerende Tak Verwijderen"
+
+#: ../editors/FileManagementPanel.py:157
+msgid "Delete File"
+msgstr "Bestand Verwijderen"
+
+#: ../editors/Viewer.py:597
+msgid "Delete Wire Segment"
+msgstr "Draadsegment Verwijderen"
+
+#: ../controls/CustomEditableListBox.py:44
+msgid "Delete item"
+msgstr "Item Verwijderen"
+
+#: ../plcopen/iec_std.csv:88
+msgid "Deletion (within)"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:161
+msgid "Derivation Type:"
+msgstr "Afleidingstype:"
+
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr "Beschrijving"
+
+#: ../controls/VariablePanel.py:463
+msgid "Description:"
+msgstr "Beschrijving:"
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
+msgid "Dimensions:"
+msgstr "Dimensies:"
+
+#: ../dialogs/FindInPouDialog.py:69
+msgid "Direction"
+msgstr "Richting"
+
+#: ../dialogs/BrowseLocationsDialog.py:102
+msgid "Direction:"
+msgstr "Richting:"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Directly"
+msgstr "Direct"
+
+#: ../ProjectController.py:1855
+msgid "Disconnect"
+msgstr "Verbinding Verbreken"
+
+#: ../ProjectController.py:1856
+msgid "Disconnect from PLC"
+msgstr "Verbinding met PLC verbreken"
+
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr "Verbinding Verbroken"
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
+msgid "Divergence"
+msgstr "Divergentie"
+
+#: ../plcopen/iec_std.csv:36
+msgid "Division"
+msgstr "Deling"
+
+#: ../editors/FileManagementPanel.py:156
+#, python-format
+msgid "Do you really want to delete the file '%s'?"
+msgstr "Weet u zeker dat u het bestand '%s' wilt verwijderen?"
+
+#: ../controls/VariablePanel.py:65
+msgid "Documentation"
+msgstr "Documentatie"
+
+#: ../PLCOpenEditor.py:312
+msgid "Done"
+msgstr "Klaar"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Duration"
+msgstr "Duur"
+
+#: ../canfestival/canfestival.py:174
+msgid "EDS files (*.eds)|*.eds|All files|*.*"
+msgstr "EDS bestanden (*.eds)|*.eds|All files|*.*"
+
+#: ../editors/Viewer.py:668
+msgid "Edit Block"
+msgstr "Blok wijzigen"
+
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:56
+msgid "Edit Contact Values"
+msgstr "Contactwaarden Wijzigen"
+
+#: ../dialogs/DurationEditorDialog.py:62
+msgid "Edit Duration"
+msgstr "Duur Wijzigen"
+
+#: ../dialogs/SFCStepDialog.py:53
+msgid "Edit Step"
+msgstr "Stap Wijzigen"
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
+msgid "Edit a WxWidgets GUI with WXGlade"
+msgstr "Een WxWidgets GUI with WXGlade wijzigen"
+
+#: ../dialogs/ActionBlockDialog.py:127
+msgid "Edit action block properties"
+msgstr "Actieblokeigenschappen wijzigen"
+
+#: ../dialogs/ArrayTypeDialog.py:47
+msgid "Edit array type properties"
+msgstr "Arraytype-eigenschappen wijzigen"
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
+msgid "Edit comment"
+msgstr "Opmerking Wijzigen"
+
+#: ../editors/FileManagementPanel.py:69
+msgid "Edit file"
+msgstr "Bestand Wijzigen"
+
+#: ../controls/CustomEditableListBox.py:42
+msgid "Edit item"
+msgstr "Item Wijzigen"
+
+#: ../editors/Viewer.py:3059
+msgid "Edit jump target"
+msgstr "Springdoel wijzigen"
+
+#: ../ProjectController.py:1873
+msgid "Edit raw IEC code added to code generated by PLCGenerator"
+msgstr ""
+"Wijzig rauwe IEC-code die toegevoegd is aan de door PLCGenerator "
+"gegenereerde code"
+
+#: ../editors/SFCViewer.py:815
+msgid "Edit step name"
+msgstr "Stapnaam wijzigen"
+
+#: ../dialogs/SFCTransitionDialog.py:53
+msgid "Edit transition"
+msgstr "Vertaling Wijzigen"
+
+#: ../IDEFrame.py:632
+msgid "Editor ToolBar"
+msgstr "Editor ToolBar "
+
+#: ../ProjectController.py:1294
+msgid "Editor selection"
+msgstr "Editorkeuze"
+
+#: ../editors/DataTypeEditor.py:360
+msgid "Elements :"
+msgstr "Elementen:"
+
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr "Leeg"
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr "Lege dimensie niet toegestaan."
+
+#: ../Beremiz_service.py:341
+msgid "Enter a name "
+msgstr "Voer een naam in"
+
+#: ../Beremiz_service.py:326
+msgid "Enter a port number "
+msgstr "Voer een poortnummer in"
+
+#: ../Beremiz_service.py:317
+msgid "Enter the IP of the interface to bind"
+msgstr "Voer het IP van de te binden interface in"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Enumerated"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:77
+msgid "Equal to"
+msgstr "Gelijk aan"
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
+msgid "Error"
+msgstr "Fout"
+
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+"Fout: Er moeten tenminste één configuratie en één bron gedeclareerd worden "
+"in de PLC!\n"
+
+#: ../ProjectController.py:803
+#, python-format
+msgid "Error : IEC to C compiler returned %d\n"
+msgstr "Fout: IEC naar C compiler geeft %d\n"
+
+#: ../ProjectController.py:731
+#, python-format
+msgid ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+msgstr ""
+"Fout in ST/IL/SFC codegenerator:\n"
+"%s\n"
+
+#: ../ConfigTreeNode.py:219
+#, python-format
+msgid "Error while saving \"%s\"\n"
+msgstr "Fout tijdens het opslaan \"%s\"\n"
+
+#: ../canfestival/canfestival.py:179
+msgid "Error: Export slave failed\n"
+msgstr "Fout: Export Slaaf niet gelukt\n"
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:388
+msgid "Error: No Master generated\n"
+msgstr "Fout: Geen Meester gegenereerd\n"
+
+#: ../canfestival/canfestival.py:383
+msgid "Error: No PLC built\n"
+msgstr ""
+
+#: ../ProjectController.py:1708
+#, python-format
+msgid "Exception while connecting %s!\n"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:123
+msgid "Execution Control:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
+msgid "Execution Order:"
+msgstr ""
+
+#: ../features.py:36
+msgid "Experimental web based HMI"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:38
+msgid "Exponent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:26
+msgid "Exponentiation"
+msgstr ""
+
+#: ../canfestival/canfestival.py:186
+msgid "Export CanOpen slave to EDS file"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
+msgid "Export graph values to clipboard"
+msgstr ""
+
+#: ../canfestival/canfestival.py:185
+msgid "Export slave"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:94
+msgid "Expression:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "External"
+msgstr ""
+
+#: ../ProjectController.py:826
+msgid "Extracting Located Variables...\n"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "FBD"
+msgstr ""
+
+#: ../ProjectController.py:1773
+msgid "Failed : Must build before transfer.\n"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
+msgid "Falling Edge"
+msgstr ""
+
+#: ../ProjectController.py:1098
+msgid "Fatal : cannot get builder.\n"
+msgstr ""
+
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
+msgid "Field %s hasn't a valid value!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
+msgid "Fields %s haven't a valid value!"
+msgstr ""
+
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
+msgid "Find"
+msgstr ""
+
+#: ../IDEFrame.py:379
+msgid "Find Next"
+msgstr ""
+
+#: ../IDEFrame.py:381
+msgid "Find Previous"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:90
+msgid "Find position"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:58
+msgid "Find:"
+msgstr ""
+
+#: ../editors/Viewer.py:1633
+msgid "Force value"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:176
+msgid "Forcing Variable Value"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
+#, python-format
+msgid "Form isn't complete. %s must be filled!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
+msgid "Form isn't complete. Name must be filled!"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:235
+msgid "Form isn't complete. Valid block type must be selected!"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:75
+msgid "Forward"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
+msgid "Function"
+msgstr ""
+
+#: ../IDEFrame.py:354
+msgid "Function &Block"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
+msgid "Function Block"
+msgstr ""
+
+#: ../controls/VariablePanel.py:868
+msgid "Function Block Types"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Function Blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:290
+msgid "Function Blocks can't be used in Functions!"
+msgstr ""
+
+#: ../PLCControler.py:1907
+#, python-format
+msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Functions"
+msgstr ""
+
+#: ../PLCOpenEditor.py:88
+msgid "Generate Program"
+msgstr ""
+
+#: ../ProjectController.py:722
+msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Global"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
+msgid "Go to current value"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:189
+msgid "Graphics"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Greater than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:76
+msgid "Greater than or equal to"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:149
+msgid "Grid Resolution:"
+msgstr ""
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:135
+msgid "Height:"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:89
+msgid "Home Directory:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:165
+msgid "Horizontal:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:47
+msgid "Hours:"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "IL"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr ""
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
+msgid "IP is not valid!"
+msgstr ""
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
+msgid "Import SVG"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
+msgid "InOut"
+msgstr ""
+
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr ""
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:306
+#, python-format
+msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Indicator"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr ""
+
+#: ../editors/Viewer.py:650
+msgid "Initial Step"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
+msgid "Initial Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
+msgid "Initial Value:"
+msgstr ""
+
+#: ../svgui/svgui.py:56
+msgid "Inkscape"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
+msgid "Inline"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Input"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:99
+msgid "Inputs:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:87
+msgid "Insertion (into)"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1948
+#, python-format
+msgid "Instance with id %d doesn't exist!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:279
+msgid "Instances:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:88
+msgid "Interface"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Interrupt"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Interval"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+
+#: ../PLCControler.py:1895
+msgid "Invalid plcopen element(s)!!!"
+msgstr ""
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr ""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
+#, python-format
+msgid "Invalid value \"%s\" for debug variable"
+msgstr ""
+
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
+msgid "Invalid value \"%s\" for variable grid element"
+msgstr ""
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
+#, python-format
+msgid "Invalid value \"%s\" for viewer block"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:124
+msgid ""
+"Invalid value!\n"
+"You must fill a numeric value."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr ""
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
+msgid "Jump"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "LD"
+msgstr ""
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
+#, python-format
+msgid "Ladder element with id %d is on more than one rung."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
+msgid "Language"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:206
+msgid "Language (optional):"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
+msgid "Language:"
+msgstr ""
+
+#: ../ProjectController.py:1779
+msgid "Latest build already matches current target. Transfering anyway...\n"
+msgstr ""
+
+#: ../Beremiz_service.py:281
+msgid "Launch WX GUI inspector"
+msgstr ""
+
+#: ../Beremiz_service.py:280
+msgid "Launch a live Python shell"
+msgstr ""
+
+#: ../editors/Viewer.py:580
+msgid "Left"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:64
+msgid "Left PowerRail"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Length of string"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:78
+msgid "Less than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:79
+msgid "Less than or equal to"
+msgstr ""
+
+#: ../IDEFrame.py:652
+msgid "Library"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:73
+msgid "Limitation"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:209
+msgid "Linking :\n"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
+msgid "Local"
+msgstr ""
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr ""
+
+#: ../ProjectController.py:1685
+msgid "Local service discovery failed!\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:62
+msgid "Location"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:79
+msgid "Locations available:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:25
+msgid "Logarithm to base 10"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:102
+#, python-format
+msgid "MDNS resolution failure for '%s'\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
+msgid "Map Variable"
+msgstr ""
+
+#: ../features.py:31
+msgid "Map located variables over CANopen"
+msgstr ""
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:113
+msgid "Master"
+msgstr ""
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr ""
+
+#: ../plcopen/iec_std.csv:71
+msgid "Maximum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:246
+msgid "Maximum:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Memory"
+msgstr ""
+
+#: ../IDEFrame.py:617
+msgid "Menu ToolBar"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:51
+msgid "Microseconds:"
+msgstr ""
+
+#: ../editors/Viewer.py:585
+msgid "Middle"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:50
+msgid "Milliseconds:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:72
+msgid "Minimum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:233
+msgid "Minimum:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:48
+msgid "Minutes:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:231
+msgid "Miscellaneous"
+msgstr ""
+
+#: ../features.py:32
+msgid "Modbus support"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:65
+msgid "Modifier:"
+msgstr ""
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:146
+msgid "Move action down"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:145
+msgid "Move action up"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:46
+msgid "Move down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:367
+msgid "Move element down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:366
+msgid "Move element up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:254
+msgid "Move task up"
+msgstr ""
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
+msgid "Move the view"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:45
+msgid "Move up"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
+msgid "Move variable down"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
+msgid "Move variable up"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:74
+msgid "Multiplexer (select 1 of N)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:34
+msgid "Multiplication"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:87
+msgid "My Computer:"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
+#: ../controls/VariablePanel.py:59
+msgid "Name"
+msgstr ""
+
+#: ../Beremiz_service.py:342
+msgid "Name must not be null!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
+msgid "Name:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:24
+msgid "Natural logarithm"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
+msgid "Negated"
+msgstr ""
+
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr ""
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
+msgid "New"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:43
+msgid "New item"
+msgstr ""
+
+#: ../editors/Viewer.py:553
+msgid "No Modifier"
+msgstr ""
+
+#: ../ProjectController.py:1808
+msgid "No PLC to transfer (did build succeed ?)\n"
+msgstr ""
+
+#: ../PLCGenerator.py:1678
+#, python-format
+msgid "No body defined in \"%s\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCOpenEditor.py:331
+msgid ""
+"No documentation available.\n"
+"Coming soon."
+msgstr ""
+
+#: ../PLCGenerator.py:841
+#, python-format
+msgid "No informations found for \"%s\" block"
+msgstr ""
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:175
+msgid "No search results available."
+msgstr ""
+
+#: ../svgui/svgui.py:142
+#, python-format
+msgid "No such SVG file: %s\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr ""
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+msgid "No valid value selected!"
+msgstr ""
+
+#: ../PLCGenerator.py:1676
+#, python-format
+msgid "No variable defined in \"%s\" POU"
+msgstr ""
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr ""
+
+#: ../controls/VariablePanel.py:79
+msgid "Non-Retain"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78
+msgid "Normal"
+msgstr ""
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:80
+msgid "Not equal to"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:91
+msgid "Number of sequences:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:22
+msgid "Numerical"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:88
+msgid "Only Elements"
+msgstr ""
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
+msgid "Open"
+msgstr ""
+
+#: ../svgui/svgui.py:151
+msgid "Open Inkscape"
+msgstr ""
+
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+
+#: ../ProjectController.py:1879
+msgid "Open a file explorer to manage project files"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
+msgid "Open wxGlade"
+msgstr ""
+
+#: ../controls/VariablePanel.py:64
+msgid "Option"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
+msgid "Options"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:109
+msgid "Organization (optional):"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
+msgid "Other Profile"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Output"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
+msgid "PDO Receive"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
+msgid "PDO Transmit"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:174
+msgid "PLC :\n"
+msgstr ""
+
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr ""
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr ""
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr ""
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr ""
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
+msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
+msgstr ""
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
+msgid "PLCOpenEditor"
+msgstr ""
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:109
+msgid "POU Name"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:66
+msgid "POU Name:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:111
+msgid "POU Type"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:73
+msgid "POU Type:"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr ""
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
+msgid "Page Setup"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:124
+msgid "Page Size (optional):"
+msgstr ""
+
+#: ../IDEFrame.py:2640
+#, python-format
+msgid "Page: %d"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:134
+msgid "Parent instance"
+msgstr ""
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
+msgid "Paste"
+msgstr ""
+
+#: ../IDEFrame.py:1899
+msgid "Paste POU"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:60
+msgid "Pattern to search:"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:75
+msgid "Pin number:"
+msgstr ""
+
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
+msgid "Please choose a target"
+msgstr ""
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr ""
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
+msgid "Please enter comment text"
+msgstr ""
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
+msgid "Please enter step name"
+msgstr ""
+
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
+msgid "Please enter value for a \"%s\" variable:"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be 0 <= port <= 65535!"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be an integer!"
+msgstr ""
+
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
+msgid "Power Rail"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:52
+msgid "Power Rail Properties"
+msgstr ""
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
+msgid "Preview"
+msgstr ""
+
+#: ../dialogs/BlockPreviewDialog.py:59
+msgid "Preview:"
+msgstr ""
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
+msgid "Print"
+msgstr ""
+
+#: ../IDEFrame.py:1110
+msgid "Print preview"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Priority"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:91
+msgid "Priority:"
+msgstr ""
+
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:90
+msgid "Product Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:92
+msgid "Product Release (optional):"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:91
+msgid "Product Version (required):"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
+msgid "Program"
+msgstr ""
+
+#: ../PLCOpenEditor.py:321
+msgid "Program was successfully generated!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Programs"
+msgstr ""
+
+#: ../editors/Viewer.py:285
+msgid "Programs can't be used by other POUs!"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
+msgid "Project"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:180
+#, python-format
+msgid "Project '%s':"
+msgstr ""
+
+#: ../ProjectController.py:1878
+msgid "Project Files"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:88
+msgid "Project Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:89
+msgid "Project Version (optional):"
+msgstr ""
+
+#: ../PLCControler.py:2717
+msgid ""
+"Project file syntax error:\n"
+"\n"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
+msgid "Project properties"
+msgstr ""
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Properties"
+msgstr ""
+
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr ""
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr ""
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr ""
+
+#: ../features.py:34
+msgid "Python file"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Qualifier"
+msgstr ""
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
+msgid "Quit"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
+msgid "Range:"
+msgstr ""
+
+#: ../ProjectController.py:1872
+msgid "Raw IEC code"
+msgstr ""
+
+#: ../BeremizIDE.py:1083
+#, python-format
+msgid "Really delete node '%s'?"
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
+msgid "Redo"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:76
+msgid "Reference"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
+msgid "Refresh"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:70
+msgid "Regular expression"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:99
+msgid "Regular expressions"
+msgstr ""
+
+#: ../editors/Viewer.py:1636
+msgid "Release value"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:37
+msgid "Remainder (modulo)"
+msgstr ""
+
+#: ../BeremizIDE.py:1084
+#, python-format
+msgid "Remove %s node"
+msgstr ""
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr ""
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:144
+msgid "Remove action"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:365
+msgid "Remove element"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:66
+msgid "Remove file from left folder"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:284
+msgid "Remove instance"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:111
+msgid "Remove slave"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:253
+msgid "Remove task"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
+msgid "Remove variable"
+msgstr ""
+
+#: ../IDEFrame.py:1979
+msgid "Rename"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:187
+msgid "Replace File"
+msgstr ""
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:89
+msgid "Replacement (within)"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Reset"
+msgstr ""
+
+#: ../editors/Viewer.py:681
+msgid "Reset Execution Order"
+msgstr ""
+
+#: ../IDEFrame.py:453
+msgid "Reset Perspective"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:103
+msgid "Reset search result"
+msgstr ""
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
+msgid "Resources"
+msgstr ""
+
+#: ../controls/VariablePanel.py:77
+msgid "Retain"
+msgstr ""
+
+#: ../controls/VariablePanel.py:455
+msgid "Return Type:"
+msgstr ""
+
+#: ../editors/Viewer.py:582
+msgid "Right"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:65
+msgid "Right PowerRail"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
+msgid "Rising Edge"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:65
+msgid "Rotate left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:64
+msgid "Rotate right"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:17
+msgid "Rounding up/down"
+msgstr ""
+
+#: ../ProjectController.py:1828
+msgid "Run"
+msgstr ""
+
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
+msgid "SDO Client"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
+msgid "SDO Server"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "SFC"
+msgstr ""
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr ""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "ST"
+msgstr ""
+
+#: ../PLCOpenEditor.py:308
+msgid "ST files (*.st)|*.st|All files|*.*"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "SVG files (*.svg)|*.svg|All files|*.*"
+msgstr ""
+
+#: ../features.py:36
+msgid "SVGUI"
+msgstr ""
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
+msgid "Save"
+msgstr ""
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
+msgid "Save As..."
+msgstr ""
+
+#: ../BeremizIDE.py:249
+msgid "Save as"
+msgstr ""
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:73
+msgid "Scope"
+msgstr ""
+
+#: ../IDEFrame.py:644
+msgid "Search"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
+msgid "Search in Project"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:49
+msgid "Seconds:"
+msgstr ""
+
+#: ../IDEFrame.py:390
+msgid "Select All"
+msgstr ""
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
+msgid "Select a variable class:"
+msgstr ""
+
+#: ../ProjectController.py:1293
+msgid "Select an editor:"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:292
+msgid "Select an instance"
+msgstr ""
+
+#: ../IDEFrame.py:628
+msgid "Select an object"
+msgstr ""
+
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:70
+msgid "Selection"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:65
+msgid "Selection Divergence"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:104
+msgid "Services available:"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Set"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Shift left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:63
+msgid "Shift right"
+msgstr ""
+
+#: ../ProjectController.py:1863
+msgid "Show IEC code generated by PLCGenerator"
+msgstr ""
+
+#: ../canfestival/canfestival.py:407
+msgid "Show Master"
+msgstr ""
+
+#: ../canfestival/canfestival.py:408
+msgid "Show Master generated by config_utils"
+msgstr ""
+
+#: ../ProjectController.py:1862
+msgid "Show code"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:67
+msgid "Simultaneous Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:27
+msgid "Sine"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Single"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr ""
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+
+#: ../plcopen/iec_std.csv:23
+msgid "Square root (base 2)"
+msgstr ""
+
+#: ../plcopen/definitions.py:50
+msgid "Standard function blocks"
+msgstr ""
+
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
+msgid "Start PLC"
+msgstr ""
+
+#: ../ProjectController.py:1074
+#, python-format
+msgid "Start build in %s\n"
+msgstr ""
+
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr ""
+
+#: ../ProjectController.py:1633
+msgid "Starting PLC\n"
+msgstr ""
+
+#: ../BeremizIDE.py:393
+msgid "Status ToolBar"
+msgstr ""
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
+msgid "Step"
+msgstr ""
+
+#: ../ProjectController.py:1835
+msgid "Stop"
+msgstr ""
+
+#: ../Beremiz_service.py:272
+msgid "Stop PLC"
+msgstr ""
+
+#: ../ProjectController.py:1836
+msgid "Stop Running PLC"
+msgstr ""
+
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Structure"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Subrange"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:35
+msgid "Subtraction"
+msgstr ""
+
+#: ../ProjectController.py:1113
+msgid "Successfully built.\n"
+msgstr ""
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
+msgid "Syntax error in regular expression of pattern to search!"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:29
+msgid "Tangent"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:97
+msgid "Task"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:248
+msgid "Tasks:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Temp"
+msgstr ""
+
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:186
+#, python-format
+msgid ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+msgstr ""
+
+#: ../editors/LDViewer.py:893
+msgid "The group of block must be coherent!"
+msgstr ""
+
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
+msgid "There are changes, do you want to save?"
+msgstr ""
+
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+
+#: ../IDEFrame.py:1133
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+
+#: ../editors/LDViewer.py:902
+msgid "This option isn't available yet!"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40
+msgid "Time"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
+msgid "Time addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:86
+msgid "Time concatenation"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
+msgid "Time division"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
+msgid "Time multiplication"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
+msgid "Time subtraction"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
+msgid "Time-of-day addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
+msgid "Time-of-day subtraction"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr ""
+
+#: ../editors/Viewer.py:584
+msgid "Top"
+msgstr ""
+
+#: ../ProjectController.py:1848
+msgid "Transfer"
+msgstr ""
+
+#: ../ProjectController.py:1849
+msgid "Transfer PLC"
+msgstr ""
+
+#: ../ProjectController.py:1802
+msgid "Transfer completed successfully.\n"
+msgstr ""
+
+#: ../ProjectController.py:1805
+msgid "Transfer failed\n"
+msgstr ""
+
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
+msgid "Transition"
+msgstr ""
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:91
+msgid "Transition Name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:60
+msgid "Transition Name:"
+msgstr ""
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1526
+#, python-format
+msgid "Transition with name %s doesn't exist!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Transitions"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Triggering"
+msgstr ""
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
+msgid "Type"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr ""
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
+#, python-format
+msgid "Type conflict for location \"%s\""
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Type conversion"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:170
+msgid "Type infos:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
+msgid "Type:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
+#, python-format
+msgid "Unable to define PDO mapping for node %02x"
+msgstr ""
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
+msgid "Unable to get Xenomai's %s \n"
+msgstr ""
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:261
+#, python-format
+msgid "Undefined pou type \"%s\""
+msgstr ""
+
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
+msgid "Undo"
+msgstr ""
+
+#: ../ProjectController.py:442
+msgid "Unknown"
+msgstr ""
+
+#: ../editors/Viewer.py:437
+#, python-format
+msgid "Unknown variable \"%s\" for this POU!"
+msgstr ""
+
+#: ../ProjectController.py:439 ../ProjectController.py:440
+msgid "Unnamed"
+msgstr ""
+
+#: ../PLCControler.py:263
+#, python-format
+msgid "Unnamed%d"
+msgstr ""
+
+#: ../controls/VariablePanel.py:308
+#, python-format
+msgid "Unrecognized data size \"%s\""
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
+msgid "User Data Types"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
+msgid "User Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "User-defined POUs"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:267
+msgid "Values:"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
+msgid "Variable"
+msgstr ""
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:68
+msgid "Variable Properties"
+msgstr ""
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
+msgid "Variable class"
+msgstr ""
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
+msgid "Variable don't belong to this POU!"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "Variables"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:166
+msgid "Vertical:"
+msgstr ""
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr ""
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr ""
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr ""
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr ""
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr ""
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr ""
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr ""
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr ""
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
+msgid "WXGLADE GUI"
+msgstr ""
+
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
+msgid "Warning"
+msgstr ""
+
+#: ../ProjectController.py:726
+msgid "Warnings in ST/IL/SFC code generator :\n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:82
+msgid "Whole Project"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:134
+msgid "Width:"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:94
+msgid "Wrap search"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr ""
+
+#: ../features.py:35
+msgid "WxGlade GUI"
+msgstr ""
+
+#: ../svgui/svgui.py:150
+msgid ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:160
+msgid ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+msgstr ""
+
+#: ../ProjectController.py:390
+msgid ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+msgstr ""
+
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+
+#: ../editors/LDViewer.py:677
+msgid "You must select the wire where a contact should be added!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
+msgid "You must type a name!"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:209
+msgid "You must type a value!"
+msgstr ""
+
+#: ../IDEFrame.py:440
+msgid "Zoom"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr ""
+
+#: ../PLCOpenEditor.py:317
+#, python-format
+msgid "error: %s\n"
+msgstr ""
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "function"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "functionBlock"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr ""
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "program"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:84
+msgid "string from the middle"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:82
+msgid "string left of"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:83
+msgid "string right of"
+msgstr ""
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr ""
+
+#: ../PLCOpenEditor.py:315
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr ""
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr ""
+
+msgid "CAN_Device"
+msgstr ""
+
+msgid "CAN_Baudrate"
+msgstr ""
+
+msgid "NodeId"
+msgstr ""
+
+msgid "Sync_Align"
+msgstr ""
+
+msgid "Sync_Align_Ratio"
+msgstr ""
+
+msgid "CanFestivalNode"
+msgstr ""
+
+msgid "Sync_TPDOs"
+msgstr ""
+
+msgid "CanFestivalInstance"
+msgstr ""
+
+msgid "CAN_Driver"
+msgstr ""
+
+msgid "Generic"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Xenomai"
+msgstr ""
+
+msgid "XenoConfig"
+msgstr ""
+
+msgid "Compiler"
+msgstr ""
+
+msgid "CFLAGS"
+msgstr ""
+
+msgid "Linker"
+msgstr ""
+
+msgid "LDFLAGS"
+msgstr ""
+
+msgid "Linux"
+msgstr ""
+
+msgid "Win32"
+msgstr ""
+
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr ""
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
+msgid "BaseParams"
+msgstr ""
+
+msgid "IEC_Channel"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "BeremizRoot"
+msgstr ""
+
+msgid "TargetType"
+msgstr ""
+
+msgid "Libraries"
+msgstr ""
+
+msgid "URI_location"
+msgstr ""
+
+msgid "Disable_Extensions"
+msgstr ""
+
+msgid "%(codefile_name)s"
+msgstr ""
+
+msgid "variables"
+msgstr ""
+
+msgid "variable"
+msgstr ""
+
+msgid "name"
+msgstr ""
+
+msgid "type"
+msgstr ""
+
+msgid "class"
+msgstr ""
+
+msgid "initial"
+msgstr ""
+
+msgid "desc"
+msgstr ""
+
+msgid "onchange"
+msgstr ""
+
+msgid "opts"
+msgstr ""
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr ""
+
+msgid "Preset datetime"
+msgstr ""
+
+msgid "Copy of IN"
+msgstr ""
+
+msgid "Datetime, current or relative to PDT"
+msgstr ""
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+
+msgid "1 = integrate, 0 = hold"
+msgstr ""
+
+msgid "Overriding reset"
+msgstr ""
+
+msgid "Input variable"
+msgstr ""
+
+msgid "Initial value"
+msgstr ""
+
+msgid "Sampling period"
+msgstr ""
+
+msgid "NOT R1"
+msgstr ""
+
+msgid "Integrated output"
+msgstr ""
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr ""
+
+msgid "0 = reset"
+msgstr ""
+
+msgid "Input to be differentiated"
+msgstr ""
+
+msgid "Differentiated output"
+msgstr ""
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+
+msgid "0 - manual , 1 - automatic"
+msgstr ""
+
+msgid "Process variable"
+msgstr ""
+
+msgid "Set point"
+msgstr ""
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr ""
+
+msgid "Proportionality constant"
+msgstr ""
+
+msgid "Reset time"
+msgstr ""
+
+msgid "Derivative time constant"
+msgstr ""
+
+msgid "PV - SP"
+msgstr ""
+
+msgid "FB for integral term"
+msgstr ""
+
+msgid "FB for derivative term"
+msgstr ""
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr ""
+
+msgid "Ramp duration"
+msgstr ""
+
+msgid "BUSY = 1 during ramping period"
+msgstr ""
+
+msgid "Elapsed time of ramp"
+msgstr ""
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr ""
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr ""
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr ""
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+"De uitgang produceert één enkele puls wanneer een stijgende flank wordt "
+"gedetecteerd."
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+"De uitgang produceert één enkele puls wanneer een dalende flank wordt "
+"gedetecteerd."
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+"De opteller kan gebruikt worden om aan te geven wanneer een teller de "
+"maximale waarde heeft bereikt."
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+"De afteller kan gebruikt worden om aan te geven wanneer een teller de nul "
+"heeft bereikt na het aftellen vanaf een vooraf ingestelde waarde."
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+"De op/af-teller heeft twee ingangen, CU en CD. Deze kan gebruikt worden om "
+"op één ingang op, en de andere af te tellen."
+
+msgid "first input parameter"
+msgstr "eerste ingangsparameter"
+
+msgid "second input parameter"
+msgstr "tweede ingangsparameter"
+
+msgid "first output parameter"
+msgstr "eerste uitgangsparameter"
+
+msgid "second output parameter"
+msgstr "tweede uitgangsparameter"
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr "Interne staat: 0-reset, 1-tellen, 2-set"
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+"Met de pulse timer kunt u uitgangspulsen met een bepaalde tijdsduur "
+"genereren."
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+"Met de on-delay timer kunt instellen hoe lang na het 'waar' worden van de "
+"ingang, de uitgang 'waa' geschakeld wordt. "
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
+"Met de off-delay timer kunt instellen hoe lang na het 'onwaar' worden van de"
+" ingang, de uitgang 'onwaar' geschakeld wordt. "
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/Beremiz_pl.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4032 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Adam B <adisz.pl@gmail.com>, 2018\n"
+"Language-Team: Polish (https://www.transifex.com/beremiz/teams/75746/pl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pl\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
+msgid ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+msgstr ""
+"\n"
+"Wystąpił nieobsługiwany wyjątek (błąd). Raport błędu zapisano w:\n"
+"(%s)\n"
+"\n"
+"Proszę o przesłanie go na adres:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"Zaleca się zrestartowanie programu.\n"
+"\n"
+"Przegląd:\n"
+
+#: ../controls/VariablePanel.py:90
+msgid "   External"
+msgstr "Zewnętrzny"
+
+#: ../controls/VariablePanel.py:89
+msgid "   InOut"
+msgstr "WeWyj"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Input"
+msgstr "Wejście"
+
+#: ../controls/VariablePanel.py:90
+msgid "   Local"
+msgstr "Lokalny"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Output"
+msgstr "Wyjście"
+
+#: ../controls/VariablePanel.py:91
+msgid "   Temp"
+msgstr "Tymczasowe"
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
+#, python-format
+msgid " and %s"
+msgstr "i %s"
+
+#: ../ProjectController.py:1182
+msgid " generation failed !\n"
+msgstr "generowanie nieudane!\n"
+
+#: ../plcopen/plcopen.py:1029
+#, python-format
+msgid "\"%s\" Data Type doesn't exist !!!"
+msgstr "\"%s\" Typ danych nie istnieje !!!"
+
+#: ../plcopen/plcopen.py:1047
+#, python-format
+msgid "\"%s\" POU already exists !!!"
+msgstr "\"%s\" POU już istnieje!"
+
+#: ../plcopen/plcopen.py:1068
+#, python-format
+msgid "\"%s\" POU doesn't exist !!!"
+msgstr "\"POU %s\" nie istnieje !!!"
+
+#: ../editors/Viewer.py:288
+#, python-format
+msgid "\"%s\" can't use itself!"
+msgstr "\"%s\" nie może używać samego siebie!"
+
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
+#, python-format
+msgid "\"%s\" config already exists!"
+msgstr "Konfiguracja \"%s\" już istnieje!"
+
+#: ../plcopen/plcopen.py:531
+#, python-format
+msgid "\"%s\" configuration already exists !!!"
+msgstr "Konfiguracja \"%s\" już istnieje !!!"
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr "Konfiguracja \"%s\" nie istnieje !!!"
+
+#: ../IDEFrame.py:1638
+#, python-format
+msgid "\"%s\" data type already exists!"
+msgstr "Typ danych \"%s\" już istnieje!"
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
+#, python-format
+msgid "\"%s\" element for this pou already exists!"
+msgstr "Element \"%s\" dla tego pou już istnieje!"
+
+#: ../BeremizIDE.py:928
+#, python-format
+msgid "\"%s\" folder is not a valid Beremiz project\n"
+msgstr "Folder \"%s\" nie jest prawidłowym projektem Beremiz\n"
+
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
+#, python-format
+msgid "\"%s\" is a keyword. It can't be used!"
+msgstr "\"%s\" jest słowem kluczowym. Nie można go użyć!"
+
+#: ../plcopen/plcopen.py:2836
+#, python-format
+msgid "\"%s\" is an invalid value!"
+msgstr "\"%s\" jest nieprawidłową wartością!"
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
+msgid "\"%s\" is not a valid folder!"
+msgstr "\"%s\" nie jest prawidłowym folderem!"
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
+#, python-format
+msgid "\"%s\" is not a valid identifier!"
+msgstr "\"%s\" nie jest prawidłowym identyfikatorem!"
+
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr "\"%s\" jest używane przez jeden lub więcej POU. Czy chcesz kontynuować?"
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
+#, python-format
+msgid "\"%s\" pou already exists!"
+msgstr "\"%s\" pou już istnieje!"
+
+#: ../dialogs/SFCStepNameDialog.py:62
+#, python-format
+msgid "\"%s\" step already exists!"
+msgstr "Krok \"%s\" już istnieje!"
+
+#: ../editors/DataTypeEditor.py:566
+#, python-format
+msgid "\"%s\" value already defined!"
+msgstr "\"%s\" wartość już zdefiniowana!"
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
+#, python-format
+msgid "\"%s\" value isn't a valid array dimension!"
+msgstr "\"%s\" wartość nie jest prawidłowym wymiarem tablicy!"
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
+#, python-format
+msgid ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+msgstr ""
+"\"%s\" wartość nie jest prawidłowym wymiarem tablicy!\n"
+"Prawa wartość musi być większa od lewej."
+
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr "Funkcja \"{a1}\" anulowana w \"{a2}\" POU: brak podłączonego wejścia"
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr "\"{a1}\" jest już używane przez \"{a2}\"!"
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr "Zasób \"{a1}\" już istnieje w konfiguracji \"{a2}\" !!!"
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr "Zasób \"{a1}\" nie istnieje w konfiguracji \"{a2}\" !!!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr "%03gms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr "%dd"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr "%dh"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr "%dm"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr "%dms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr "%ds"
+
+#: ../PLCControler.py:1114
+#, python-format
+msgid "%s Data Types"
+msgstr "%s Typy danych"
+
+#: ../PLCControler.py:1097
+#, python-format
+msgid "%s POUs"
+msgstr "%s POU"
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
+#, python-format
+msgid "%s Profile"
+msgstr "%s Profil"
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
+#, python-format
+msgid "%s body don't have instances!"
+msgstr "%s 'body' nie ma instancji!"
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
+#, python-format
+msgid "%s body don't have text!"
+msgstr "%s 'body' nie ma tekstu!"
+
+#: ../IDEFrame.py:388
+msgid "&Add Element"
+msgstr "&Dodaj element"
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr "&Zamknij"
+
+#: ../IDEFrame.py:361
+msgid "&Configuration"
+msgstr "&Konfiguracja"
+
+#: ../IDEFrame.py:350
+msgid "&Data Type"
+msgstr "&Typ danych"
+
+#: ../IDEFrame.py:392
+msgid "&Delete"
+msgstr "&Usuń"
+
+#: ../IDEFrame.py:342
+msgid "&Display"
+msgstr "&Wyświetlanie"
+
+#: ../IDEFrame.py:341
+msgid "&Edit"
+msgstr "&Edytuj"
+
+#: ../IDEFrame.py:340
+msgid "&File"
+msgstr "&Plik"
+
+#: ../IDEFrame.py:352
+msgid "&Function"
+msgstr "&Funkcja"
+
+#: ../IDEFrame.py:343
+msgid "&Help"
+msgstr "&Pomoc"
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr "&Licencja"
+
+#: ../IDEFrame.py:356
+msgid "&Program"
+msgstr "&Program"
+
+#: ../PLCOpenEditor.py:98
+msgid "&Properties"
+msgstr "&Właściwości"
+
+#: ../BeremizIDE.py:244
+msgid "&Recent Projects"
+msgstr "&Ostatnie projekty"
+
+#: ../IDEFrame.py:358
+msgid "&Resource"
+msgstr "&Zasoby"
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr "\"{a1}\" - {a2} powiązanie w projekcie"
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr "\"{a1}\" - {a2} powiązań w projekcie"
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr "\"{a1}\" znajduje się w {a2}\n"
+
+#: ../controls/SearchResultPanel.py:298
+#, python-format
+msgid "(%d matches)"
+msgstr "(%d powiązań)"
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
+#, python-format
+msgid ", %s"
+msgstr ", %s"
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr "- Wybierz typ URI -"
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr "1d"
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr "1h"
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr "1m"
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr "1s"
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+"POU ma element o nazwie \"%s\". Może to spowodować konflikt. Czy chcesz "
+"kontynuować?"
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
+#, python-format
+msgid "A POU named \"%s\" already exists!"
+msgstr "POU o nazwie \"%s\" już istnieje!"
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr "Podobiekt o nazwie \"{a1}\" już istnieje -> \"{a2}\"\n"
+
+#: ../dialogs/BrowseLocationsDialog.py:229
+msgid "A location must be selected!"
+msgstr "Lokalizacja musi być wybrana!"
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr "Zadanie o tej samej nazwie już istnieje!"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
+#, python-format
+msgid "A variable with \"%s\" as name already exists in this pou!"
+msgstr "Zmienna o nazwie \"%s\" już istnieje w tym pou!"
+
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr "Zmienna o nazwie \"%s\" już istnieje!"
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
+msgid "About"
+msgstr "O programie"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Absolute number"
+msgstr "Liczba bezwzględna"
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
+msgid "Action"
+msgstr "Akcja"
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
+msgid "Action Block"
+msgstr "Blok akcji"
+
+#: ../dialogs/PouActionDialog.py:89
+msgid "Action Name"
+msgstr "Nazwa akcji"
+
+#: ../dialogs/PouActionDialog.py:56
+msgid "Action Name:"
+msgstr "Nazwa akcji:"
+
+#: ../plcopen/plcopen.py:1567
+#, python-format
+msgid "Action with name %s doesn't exist!"
+msgstr "Akcja o nazwie %s nie istnieje!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Actions"
+msgstr "Akcje"
+
+#: ../dialogs/ActionBlockDialog.py:139
+msgid "Actions:"
+msgstr "Akcje:"
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr "Aktywny"
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
+msgid "Add"
+msgstr "Dodaj"
+
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
+msgid "Add Action"
+msgstr "Dodaj akcję"
+
+#: ../features.py:33
+msgid "Add C code accessing located variables synchronously"
+msgstr ""
+
+#: ../IDEFrame.py:1907
+msgid "Add Configuration"
+msgstr ""
+
+#: ../IDEFrame.py:1887
+msgid "Add DataType"
+msgstr ""
+
+#: ../editors/Viewer.py:609
+msgid "Add Divergence Branch"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:121
+msgid "Add IP"
+msgstr ""
+
+#: ../IDEFrame.py:1895
+msgid "Add POU"
+msgstr ""
+
+#: ../features.py:34
+msgid "Add Python code executed asynchronously"
+msgstr ""
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
+msgid "Add Resource"
+msgstr ""
+
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
+msgid "Add Transition"
+msgstr ""
+
+#: ../editors/Viewer.py:596
+msgid "Add Wire Segment"
+msgstr ""
+
+#: ../editors/SFCViewer.py:447
+msgid "Add a new initial step"
+msgstr ""
+
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
+msgid "Add a new jump"
+msgstr ""
+
+#: ../editors/SFCViewer.py:469
+msgid "Add a new step"
+msgstr ""
+
+#: ../features.py:35
+msgid "Add a simple WxGlade based GUI."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:143
+msgid "Add action"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:364
+msgid "Add element"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:283
+msgid "Add instance"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:110
+msgid "Add slave"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:252
+msgid "Add task"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
+msgid "Add variable"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:33
+msgid "Addition"
+msgstr ""
+
+#: ../plcopen/definitions.py:51
+msgid "Additional function blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr ""
+
+#: ../editors/Viewer.py:1720
+msgid "Alignment"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
+msgid "All"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:37
+msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+msgstr ""
+
+#: ../ProjectController.py:1670
+msgid "Already connected. Please disconnect\n"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:607
+#, python-format
+msgid "An element named \"%s\" already exists in this structure!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:31
+msgid "Arc cosine"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:30
+msgid "Arc sine"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:32
+msgid "Arc tangent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:33
+msgid "Arithmetic"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
+msgid "Array"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:39
+msgid "Assignment"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:226
+msgid "At least a variable or an expression must be selected!"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:111
+msgid "Author"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:108
+msgid "Author Name (optional):"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:80
+msgid "Backward"
+msgstr ""
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
+#, python-format
+msgid "Bad location size : %s"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
+msgid "Base Type:"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
+msgid "Base Types"
+msgstr ""
+
+#: ../BeremizIDE.py:483
+msgid "Beremiz"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:70
+msgid "Binary selection (1 of 2)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Bit-shift"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise AND"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:67
+msgid "Bitwise OR"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:68
+msgid "Bitwise XOR"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:69
+msgid "Bitwise inverting"
+msgstr ""
+
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
+msgid "Block"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:63
+msgid "Block Properties"
+msgstr ""
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr ""
+
+#: ../editors/Viewer.py:586
+msgid "Bottom"
+msgstr ""
+
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
+msgid "Browse %s values library"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:72
+msgid "Browse Locations"
+msgstr ""
+
+#: ../ProjectController.py:1815
+msgid "Build"
+msgstr ""
+
+#: ../ProjectController.py:1335
+msgid "Build directory already clean\n"
+msgstr ""
+
+#: ../ProjectController.py:1816
+msgid "Build project into build folder"
+msgstr ""
+
+#: ../ProjectController.py:1108
+msgid "C Build crashed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1105
+msgid "C Build failed.\n"
+msgstr ""
+
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr ""
+
+#: ../ProjectController.py:1186
+msgid "C code generated successfully.\n"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:199
+#, python-format
+msgid "C compilation of %s failed.\n"
+msgstr ""
+
+#: ../features.py:33
+msgid "C extension"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr ""
+
+#: ../features.py:31
+msgid "CANopen support"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
+msgid "Can only generate execution order on FBD networks!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:291
+msgid "Can only give a location to local or global variables"
+msgstr ""
+
+#: ../PLCOpenEditor.py:318
+#, python-format
+msgid "Can't generate program to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:289
+msgid "Can't give a location to a function block instance"
+msgstr ""
+
+#: ../PLCOpenEditor.py:363
+#, python-format
+msgid "Can't save project to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:339
+msgid "Can't set an initial value to a function block instance"
+msgstr ""
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr ""
+
+#: ../ConfigTreeNode.py:454
+#, python-format
+msgid "Cannot find lower free IEC channel than %d\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:139
+msgid "Cannot get PLC status - connection failed.\n"
+msgstr ""
+
+#: ../ProjectController.py:967
+msgid "Cannot open/parse VARIABLES.csv!\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
+msgid "Case sensitive"
+msgstr ""
+
+#: ../editors/Viewer.py:581
+msgid "Center"
+msgstr ""
+
+#: ../Beremiz_service.py:276
+msgid "Change IP of interface to bind"
+msgstr ""
+
+#: ../Beremiz_service.py:275
+msgid "Change Name"
+msgstr ""
+
+#: ../IDEFrame.py:1977
+msgid "Change POU Type To"
+msgstr ""
+
+#: ../Beremiz_service.py:277
+msgid "Change Port Number"
+msgstr ""
+
+#: ../Beremiz_service.py:278
+msgid "Change working directory"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Character string"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "Choose a SVG file"
+msgstr ""
+
+#: ../ProjectController.py:561
+msgid "Choose a directory to save project"
+msgstr ""
+
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
+msgid "Choose a file"
+msgstr ""
+
+#: ../BeremizIDE.py:900
+msgid "Choose a project"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
+msgid "Choose a value for %s:"
+msgstr ""
+
+#: ../Beremiz_service.py:333
+msgid "Choose a working directory "
+msgstr ""
+
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr ""
+
+#: ../ProjectController.py:468
+msgid "Chosen folder doesn't contain a program. It's not a valid project!"
+msgstr ""
+
+#: ../ProjectController.py:435
+msgid "Chosen folder isn't empty. You can't use it for a new project!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:60
+msgid "Class"
+msgstr ""
+
+#: ../controls/VariablePanel.py:472
+msgid "Class Filter:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:74
+msgid "Class:"
+msgstr ""
+
+#: ../ProjectController.py:1821
+msgid "Clean"
+msgstr ""
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr ""
+
+#: ../ProjectController.py:1822
+msgid "Clean project build folder"
+msgstr ""
+
+#: ../ProjectController.py:1332
+msgid "Cleaning the build directory\n"
+msgstr ""
+
+#: ../IDEFrame.py:437
+msgid "Clear Errors"
+msgstr ""
+
+#: ../editors/Viewer.py:680
+msgid "Clear Execution Order"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr ""
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
+msgid "Close Application"
+msgstr ""
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
+msgid "Close Project"
+msgstr ""
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
+msgid "Close Tab"
+msgstr ""
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
+msgid "Coil"
+msgstr ""
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
+msgid "Comment"
+msgstr ""
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:106
+msgid "Company Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:107
+msgid "Company URL (optional):"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Comparison"
+msgstr ""
+
+#: ../ProjectController.py:756
+msgid "Compiling IEC Program into C code...\n"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:85
+msgid "Concatenation"
+msgstr ""
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr ""
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:43
+msgid "Configuration"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Configurations"
+msgstr ""
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr ""
+
+#: ../ProjectController.py:1842
+msgid "Connect"
+msgstr ""
+
+#: ../ProjectController.py:1843
+msgid "Connect to the target PLC"
+msgstr ""
+
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
+msgid "Connection"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:55
+msgid "Connection Properties"
+msgstr ""
+
+#: ../ProjectController.py:1691
+msgid "Connection canceled!\n"
+msgstr ""
+
+#: ../ProjectController.py:1714
+#, python-format
+msgid "Connection failed to %s!\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
+msgid "Connection to '%s' failed.\n"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
+msgid "Connector"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:68
+msgid "Connectors:"
+msgstr ""
+
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr ""
+
+#: ../controls/VariablePanel.py:75
+msgid "Constant"
+msgstr ""
+
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
+msgid "Contact"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:217
+msgid "Content Description (optional):"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
+msgid "Continuation"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:18
+msgid "Conversion from BCD"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:19
+msgid "Conversion to BCD"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:21
+msgid "Conversion to date"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:20
+msgid "Conversion to time-of-day"
+msgstr ""
+
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
+msgid "Copy"
+msgstr ""
+
+#: ../IDEFrame.py:1964
+msgid "Copy POU"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:68
+msgid "Copy file from left folder to right"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:67
+msgid "Copy file from right folder to left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:28
+msgid "Cosine"
+msgstr ""
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr ""
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../PLCControler.py:552
+msgid "Couldn't paste non-POU object."
+msgstr ""
+
+#: ../ProjectController.py:1636
+msgid "Couldn't start PLC !\n"
+msgstr ""
+
+#: ../ProjectController.py:1644
+msgid "Couldn't stop PLC !\n"
+msgstr ""
+
+#: ../svgui/svgui.py:57
+msgid "Create HMI"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:54
+msgid "Create a new POU"
+msgstr ""
+
+#: ../dialogs/PouActionDialog.py:45
+msgid "Create a new action"
+msgstr ""
+
+#: ../IDEFrame.py:166
+msgid "Create a new action block"
+msgstr ""
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
+msgid "Create a new block"
+msgstr ""
+
+#: ../IDEFrame.py:139
+msgid "Create a new branch"
+msgstr ""
+
+#: ../IDEFrame.py:133
+msgid "Create a new coil"
+msgstr ""
+
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
+msgid "Create a new comment"
+msgstr ""
+
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
+msgid "Create a new connection"
+msgstr ""
+
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
+msgid "Create a new contact"
+msgstr ""
+
+#: ../IDEFrame.py:169
+msgid "Create a new divergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:54
+msgid "Create a new divergence or convergence"
+msgstr ""
+
+#: ../IDEFrame.py:157
+msgid "Create a new initial step"
+msgstr ""
+
+#: ../IDEFrame.py:172
+msgid "Create a new jump"
+msgstr ""
+
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
+msgid "Create a new power rail"
+msgstr ""
+
+#: ../IDEFrame.py:130
+msgid "Create a new rung"
+msgstr ""
+
+#: ../IDEFrame.py:160
+msgid "Create a new step"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
+msgid "Create a new transition"
+msgstr ""
+
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
+msgid "Create a new variable"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr ""
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr ""
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
+msgid "Cut"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Cyclic"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:60
+msgid "DEPRECATED"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
+msgid "DS-301 Profile"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
+msgid "DS-302 Profile"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:39
+msgid "Data Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Data Types"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Data type conversion"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
+msgid "Date addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
+msgid "Date and time subtraction"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
+msgid "Date subtraction"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:46
+msgid "Days:"
+msgstr ""
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:144
+msgid "Debug instance"
+msgstr ""
+
+#: ../editors/Viewer.py:490
+#, python-format
+msgid "Debug: %s"
+msgstr ""
+
+#: ../ProjectController.py:1471
+#, python-format
+msgid "Debug: Unknown variable '%s'\n"
+msgstr ""
+
+#: ../ProjectController.py:1469
+#, python-format
+msgid "Debug: Unsupported type to debug '%s'\n"
+msgstr ""
+
+#: ../IDEFrame.py:660
+msgid "Debugger"
+msgstr ""
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr ""
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
+msgid "Delete"
+msgstr ""
+
+#: ../editors/Viewer.py:610
+msgid "Delete Divergence Branch"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:157
+msgid "Delete File"
+msgstr ""
+
+#: ../editors/Viewer.py:597
+msgid "Delete Wire Segment"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:44
+msgid "Delete item"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:88
+msgid "Deletion (within)"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:161
+msgid "Derivation Type:"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr ""
+
+#: ../controls/VariablePanel.py:463
+msgid "Description:"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
+msgid "Dimensions:"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:69
+msgid "Direction"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:102
+msgid "Direction:"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Directly"
+msgstr ""
+
+#: ../ProjectController.py:1855
+msgid "Disconnect"
+msgstr ""
+
+#: ../ProjectController.py:1856
+msgid "Disconnect from PLC"
+msgstr ""
+
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr ""
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
+msgid "Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:36
+msgid "Division"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:156
+#, python-format
+msgid "Do you really want to delete the file '%s'?"
+msgstr ""
+
+#: ../controls/VariablePanel.py:65
+msgid "Documentation"
+msgstr ""
+
+#: ../PLCOpenEditor.py:312
+msgid "Done"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Duration"
+msgstr ""
+
+#: ../canfestival/canfestival.py:174
+msgid "EDS files (*.eds)|*.eds|All files|*.*"
+msgstr ""
+
+#: ../editors/Viewer.py:668
+msgid "Edit Block"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:56
+msgid "Edit Contact Values"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:62
+msgid "Edit Duration"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:53
+msgid "Edit Step"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
+msgid "Edit a WxWidgets GUI with WXGlade"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:127
+msgid "Edit action block properties"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:47
+msgid "Edit array type properties"
+msgstr ""
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
+msgid "Edit comment"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:69
+msgid "Edit file"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:42
+msgid "Edit item"
+msgstr ""
+
+#: ../editors/Viewer.py:3059
+msgid "Edit jump target"
+msgstr ""
+
+#: ../ProjectController.py:1873
+msgid "Edit raw IEC code added to code generated by PLCGenerator"
+msgstr ""
+
+#: ../editors/SFCViewer.py:815
+msgid "Edit step name"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:53
+msgid "Edit transition"
+msgstr ""
+
+#: ../IDEFrame.py:632
+msgid "Editor ToolBar"
+msgstr ""
+
+#: ../ProjectController.py:1294
+msgid "Editor selection"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:360
+msgid "Elements :"
+msgstr ""
+
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr ""
+
+#: ../Beremiz_service.py:341
+msgid "Enter a name "
+msgstr ""
+
+#: ../Beremiz_service.py:326
+msgid "Enter a port number "
+msgstr ""
+
+#: ../Beremiz_service.py:317
+msgid "Enter the IP of the interface to bind"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Enumerated"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:77
+msgid "Equal to"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
+msgid "Error"
+msgstr ""
+
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+
+#: ../ProjectController.py:803
+#, python-format
+msgid "Error : IEC to C compiler returned %d\n"
+msgstr ""
+
+#: ../ProjectController.py:731
+#, python-format
+msgid ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+msgstr ""
+
+#: ../ConfigTreeNode.py:219
+#, python-format
+msgid "Error while saving \"%s\"\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:179
+msgid "Error: Export slave failed\n"
+msgstr ""
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:388
+msgid "Error: No Master generated\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:383
+msgid "Error: No PLC built\n"
+msgstr ""
+
+#: ../ProjectController.py:1708
+#, python-format
+msgid "Exception while connecting %s!\n"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:123
+msgid "Execution Control:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
+msgid "Execution Order:"
+msgstr ""
+
+#: ../features.py:36
+msgid "Experimental web based HMI"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:38
+msgid "Exponent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:26
+msgid "Exponentiation"
+msgstr ""
+
+#: ../canfestival/canfestival.py:186
+msgid "Export CanOpen slave to EDS file"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
+msgid "Export graph values to clipboard"
+msgstr ""
+
+#: ../canfestival/canfestival.py:185
+msgid "Export slave"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:94
+msgid "Expression:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "External"
+msgstr ""
+
+#: ../ProjectController.py:826
+msgid "Extracting Located Variables...\n"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "FBD"
+msgstr ""
+
+#: ../ProjectController.py:1773
+msgid "Failed : Must build before transfer.\n"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
+msgid "Falling Edge"
+msgstr ""
+
+#: ../ProjectController.py:1098
+msgid "Fatal : cannot get builder.\n"
+msgstr ""
+
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
+msgid "Field %s hasn't a valid value!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
+msgid "Fields %s haven't a valid value!"
+msgstr ""
+
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
+msgid "Find"
+msgstr ""
+
+#: ../IDEFrame.py:379
+msgid "Find Next"
+msgstr ""
+
+#: ../IDEFrame.py:381
+msgid "Find Previous"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:90
+msgid "Find position"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:58
+msgid "Find:"
+msgstr ""
+
+#: ../editors/Viewer.py:1633
+msgid "Force value"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:176
+msgid "Forcing Variable Value"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
+#, python-format
+msgid "Form isn't complete. %s must be filled!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
+msgid "Form isn't complete. Name must be filled!"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:235
+msgid "Form isn't complete. Valid block type must be selected!"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:75
+msgid "Forward"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
+msgid "Function"
+msgstr ""
+
+#: ../IDEFrame.py:354
+msgid "Function &Block"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
+msgid "Function Block"
+msgstr ""
+
+#: ../controls/VariablePanel.py:868
+msgid "Function Block Types"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Function Blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:290
+msgid "Function Blocks can't be used in Functions!"
+msgstr ""
+
+#: ../PLCControler.py:1907
+#, python-format
+msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Functions"
+msgstr ""
+
+#: ../PLCOpenEditor.py:88
+msgid "Generate Program"
+msgstr ""
+
+#: ../ProjectController.py:722
+msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Global"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
+msgid "Go to current value"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:189
+msgid "Graphics"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Greater than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:76
+msgid "Greater than or equal to"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:149
+msgid "Grid Resolution:"
+msgstr ""
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:135
+msgid "Height:"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:89
+msgid "Home Directory:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:165
+msgid "Horizontal:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:47
+msgid "Hours:"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "IL"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr ""
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
+msgid "IP is not valid!"
+msgstr ""
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
+msgid "Import SVG"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
+msgid "InOut"
+msgstr ""
+
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr ""
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:306
+#, python-format
+msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Indicator"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr ""
+
+#: ../editors/Viewer.py:650
+msgid "Initial Step"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
+msgid "Initial Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
+msgid "Initial Value:"
+msgstr ""
+
+#: ../svgui/svgui.py:56
+msgid "Inkscape"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
+msgid "Inline"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Input"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:99
+msgid "Inputs:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:87
+msgid "Insertion (into)"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1948
+#, python-format
+msgid "Instance with id %d doesn't exist!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:279
+msgid "Instances:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:88
+msgid "Interface"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Interrupt"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Interval"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+
+#: ../PLCControler.py:1895
+msgid "Invalid plcopen element(s)!!!"
+msgstr ""
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr ""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
+#, python-format
+msgid "Invalid value \"%s\" for debug variable"
+msgstr ""
+
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
+msgid "Invalid value \"%s\" for variable grid element"
+msgstr ""
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
+#, python-format
+msgid "Invalid value \"%s\" for viewer block"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:124
+msgid ""
+"Invalid value!\n"
+"You must fill a numeric value."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr ""
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
+msgid "Jump"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "LD"
+msgstr ""
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
+#, python-format
+msgid "Ladder element with id %d is on more than one rung."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
+msgid "Language"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:206
+msgid "Language (optional):"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
+msgid "Language:"
+msgstr ""
+
+#: ../ProjectController.py:1779
+msgid "Latest build already matches current target. Transfering anyway...\n"
+msgstr ""
+
+#: ../Beremiz_service.py:281
+msgid "Launch WX GUI inspector"
+msgstr ""
+
+#: ../Beremiz_service.py:280
+msgid "Launch a live Python shell"
+msgstr ""
+
+#: ../editors/Viewer.py:580
+msgid "Left"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:64
+msgid "Left PowerRail"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Length of string"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:78
+msgid "Less than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:79
+msgid "Less than or equal to"
+msgstr ""
+
+#: ../IDEFrame.py:652
+msgid "Library"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:73
+msgid "Limitation"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:209
+msgid "Linking :\n"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
+msgid "Local"
+msgstr ""
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr ""
+
+#: ../ProjectController.py:1685
+msgid "Local service discovery failed!\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:62
+msgid "Location"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:79
+msgid "Locations available:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:25
+msgid "Logarithm to base 10"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:102
+#, python-format
+msgid "MDNS resolution failure for '%s'\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
+msgid "Map Variable"
+msgstr ""
+
+#: ../features.py:31
+msgid "Map located variables over CANopen"
+msgstr ""
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:113
+msgid "Master"
+msgstr ""
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr ""
+
+#: ../plcopen/iec_std.csv:71
+msgid "Maximum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:246
+msgid "Maximum:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Memory"
+msgstr ""
+
+#: ../IDEFrame.py:617
+msgid "Menu ToolBar"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:51
+msgid "Microseconds:"
+msgstr ""
+
+#: ../editors/Viewer.py:585
+msgid "Middle"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:50
+msgid "Milliseconds:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:72
+msgid "Minimum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:233
+msgid "Minimum:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:48
+msgid "Minutes:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:231
+msgid "Miscellaneous"
+msgstr ""
+
+#: ../features.py:32
+msgid "Modbus support"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:65
+msgid "Modifier:"
+msgstr ""
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:146
+msgid "Move action down"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:145
+msgid "Move action up"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:46
+msgid "Move down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:367
+msgid "Move element down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:366
+msgid "Move element up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:254
+msgid "Move task up"
+msgstr ""
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
+msgid "Move the view"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:45
+msgid "Move up"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
+msgid "Move variable down"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
+msgid "Move variable up"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:74
+msgid "Multiplexer (select 1 of N)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:34
+msgid "Multiplication"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:87
+msgid "My Computer:"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
+#: ../controls/VariablePanel.py:59
+msgid "Name"
+msgstr ""
+
+#: ../Beremiz_service.py:342
+msgid "Name must not be null!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
+msgid "Name:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:24
+msgid "Natural logarithm"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
+msgid "Negated"
+msgstr ""
+
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr ""
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
+msgid "New"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:43
+msgid "New item"
+msgstr ""
+
+#: ../editors/Viewer.py:553
+msgid "No Modifier"
+msgstr ""
+
+#: ../ProjectController.py:1808
+msgid "No PLC to transfer (did build succeed ?)\n"
+msgstr ""
+
+#: ../PLCGenerator.py:1678
+#, python-format
+msgid "No body defined in \"%s\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCOpenEditor.py:331
+msgid ""
+"No documentation available.\n"
+"Coming soon."
+msgstr ""
+
+#: ../PLCGenerator.py:841
+#, python-format
+msgid "No informations found for \"%s\" block"
+msgstr ""
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:175
+msgid "No search results available."
+msgstr ""
+
+#: ../svgui/svgui.py:142
+#, python-format
+msgid "No such SVG file: %s\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr ""
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+msgid "No valid value selected!"
+msgstr ""
+
+#: ../PLCGenerator.py:1676
+#, python-format
+msgid "No variable defined in \"%s\" POU"
+msgstr ""
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr ""
+
+#: ../controls/VariablePanel.py:79
+msgid "Non-Retain"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78
+msgid "Normal"
+msgstr ""
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:80
+msgid "Not equal to"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:91
+msgid "Number of sequences:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:22
+msgid "Numerical"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:88
+msgid "Only Elements"
+msgstr ""
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
+msgid "Open"
+msgstr ""
+
+#: ../svgui/svgui.py:151
+msgid "Open Inkscape"
+msgstr ""
+
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+
+#: ../ProjectController.py:1879
+msgid "Open a file explorer to manage project files"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
+msgid "Open wxGlade"
+msgstr ""
+
+#: ../controls/VariablePanel.py:64
+msgid "Option"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
+msgid "Options"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:109
+msgid "Organization (optional):"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
+msgid "Other Profile"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Output"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
+msgid "PDO Receive"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
+msgid "PDO Transmit"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:174
+msgid "PLC :\n"
+msgstr ""
+
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr ""
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr ""
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr ""
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr ""
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
+msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
+msgstr ""
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
+msgid "PLCOpenEditor"
+msgstr ""
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:109
+msgid "POU Name"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:66
+msgid "POU Name:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:111
+msgid "POU Type"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:73
+msgid "POU Type:"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr ""
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
+msgid "Page Setup"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:124
+msgid "Page Size (optional):"
+msgstr ""
+
+#: ../IDEFrame.py:2640
+#, python-format
+msgid "Page: %d"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:134
+msgid "Parent instance"
+msgstr ""
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
+msgid "Paste"
+msgstr ""
+
+#: ../IDEFrame.py:1899
+msgid "Paste POU"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:60
+msgid "Pattern to search:"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:75
+msgid "Pin number:"
+msgstr ""
+
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
+msgid "Please choose a target"
+msgstr ""
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr ""
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
+msgid "Please enter comment text"
+msgstr ""
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
+msgid "Please enter step name"
+msgstr ""
+
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
+msgid "Please enter value for a \"%s\" variable:"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be 0 <= port <= 65535!"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be an integer!"
+msgstr ""
+
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
+msgid "Power Rail"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:52
+msgid "Power Rail Properties"
+msgstr ""
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
+msgid "Preview"
+msgstr ""
+
+#: ../dialogs/BlockPreviewDialog.py:59
+msgid "Preview:"
+msgstr ""
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
+msgid "Print"
+msgstr ""
+
+#: ../IDEFrame.py:1110
+msgid "Print preview"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Priority"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:91
+msgid "Priority:"
+msgstr ""
+
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:90
+msgid "Product Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:92
+msgid "Product Release (optional):"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:91
+msgid "Product Version (required):"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
+msgid "Program"
+msgstr ""
+
+#: ../PLCOpenEditor.py:321
+msgid "Program was successfully generated!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Programs"
+msgstr ""
+
+#: ../editors/Viewer.py:285
+msgid "Programs can't be used by other POUs!"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
+msgid "Project"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:180
+#, python-format
+msgid "Project '%s':"
+msgstr ""
+
+#: ../ProjectController.py:1878
+msgid "Project Files"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:88
+msgid "Project Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:89
+msgid "Project Version (optional):"
+msgstr ""
+
+#: ../PLCControler.py:2717
+msgid ""
+"Project file syntax error:\n"
+"\n"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
+msgid "Project properties"
+msgstr ""
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Properties"
+msgstr ""
+
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr ""
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr ""
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr ""
+
+#: ../features.py:34
+msgid "Python file"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Qualifier"
+msgstr ""
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
+msgid "Quit"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
+msgid "Range:"
+msgstr ""
+
+#: ../ProjectController.py:1872
+msgid "Raw IEC code"
+msgstr ""
+
+#: ../BeremizIDE.py:1083
+#, python-format
+msgid "Really delete node '%s'?"
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
+msgid "Redo"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:76
+msgid "Reference"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
+msgid "Refresh"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:70
+msgid "Regular expression"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:99
+msgid "Regular expressions"
+msgstr ""
+
+#: ../editors/Viewer.py:1636
+msgid "Release value"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:37
+msgid "Remainder (modulo)"
+msgstr ""
+
+#: ../BeremizIDE.py:1084
+#, python-format
+msgid "Remove %s node"
+msgstr ""
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr ""
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:144
+msgid "Remove action"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:365
+msgid "Remove element"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:66
+msgid "Remove file from left folder"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:284
+msgid "Remove instance"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:111
+msgid "Remove slave"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:253
+msgid "Remove task"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
+msgid "Remove variable"
+msgstr ""
+
+#: ../IDEFrame.py:1979
+msgid "Rename"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:187
+msgid "Replace File"
+msgstr ""
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:89
+msgid "Replacement (within)"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Reset"
+msgstr ""
+
+#: ../editors/Viewer.py:681
+msgid "Reset Execution Order"
+msgstr ""
+
+#: ../IDEFrame.py:453
+msgid "Reset Perspective"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:103
+msgid "Reset search result"
+msgstr ""
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
+msgid "Resources"
+msgstr ""
+
+#: ../controls/VariablePanel.py:77
+msgid "Retain"
+msgstr ""
+
+#: ../controls/VariablePanel.py:455
+msgid "Return Type:"
+msgstr ""
+
+#: ../editors/Viewer.py:582
+msgid "Right"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:65
+msgid "Right PowerRail"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
+msgid "Rising Edge"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:65
+msgid "Rotate left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:64
+msgid "Rotate right"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:17
+msgid "Rounding up/down"
+msgstr ""
+
+#: ../ProjectController.py:1828
+msgid "Run"
+msgstr ""
+
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
+msgid "SDO Client"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
+msgid "SDO Server"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "SFC"
+msgstr ""
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr ""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "ST"
+msgstr ""
+
+#: ../PLCOpenEditor.py:308
+msgid "ST files (*.st)|*.st|All files|*.*"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "SVG files (*.svg)|*.svg|All files|*.*"
+msgstr ""
+
+#: ../features.py:36
+msgid "SVGUI"
+msgstr ""
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
+msgid "Save"
+msgstr ""
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
+msgid "Save As..."
+msgstr ""
+
+#: ../BeremizIDE.py:249
+msgid "Save as"
+msgstr ""
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:73
+msgid "Scope"
+msgstr ""
+
+#: ../IDEFrame.py:644
+msgid "Search"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
+msgid "Search in Project"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:49
+msgid "Seconds:"
+msgstr ""
+
+#: ../IDEFrame.py:390
+msgid "Select All"
+msgstr ""
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
+msgid "Select a variable class:"
+msgstr ""
+
+#: ../ProjectController.py:1293
+msgid "Select an editor:"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:292
+msgid "Select an instance"
+msgstr ""
+
+#: ../IDEFrame.py:628
+msgid "Select an object"
+msgstr ""
+
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:70
+msgid "Selection"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:65
+msgid "Selection Divergence"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:104
+msgid "Services available:"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Set"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Shift left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:63
+msgid "Shift right"
+msgstr ""
+
+#: ../ProjectController.py:1863
+msgid "Show IEC code generated by PLCGenerator"
+msgstr ""
+
+#: ../canfestival/canfestival.py:407
+msgid "Show Master"
+msgstr ""
+
+#: ../canfestival/canfestival.py:408
+msgid "Show Master generated by config_utils"
+msgstr ""
+
+#: ../ProjectController.py:1862
+msgid "Show code"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:67
+msgid "Simultaneous Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:27
+msgid "Sine"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Single"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr ""
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+
+#: ../plcopen/iec_std.csv:23
+msgid "Square root (base 2)"
+msgstr ""
+
+#: ../plcopen/definitions.py:50
+msgid "Standard function blocks"
+msgstr ""
+
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
+msgid "Start PLC"
+msgstr ""
+
+#: ../ProjectController.py:1074
+#, python-format
+msgid "Start build in %s\n"
+msgstr ""
+
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr ""
+
+#: ../ProjectController.py:1633
+msgid "Starting PLC\n"
+msgstr ""
+
+#: ../BeremizIDE.py:393
+msgid "Status ToolBar"
+msgstr ""
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
+msgid "Step"
+msgstr ""
+
+#: ../ProjectController.py:1835
+msgid "Stop"
+msgstr ""
+
+#: ../Beremiz_service.py:272
+msgid "Stop PLC"
+msgstr ""
+
+#: ../ProjectController.py:1836
+msgid "Stop Running PLC"
+msgstr ""
+
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Structure"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Subrange"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:35
+msgid "Subtraction"
+msgstr ""
+
+#: ../ProjectController.py:1113
+msgid "Successfully built.\n"
+msgstr ""
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
+msgid "Syntax error in regular expression of pattern to search!"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:29
+msgid "Tangent"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:97
+msgid "Task"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:248
+msgid "Tasks:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Temp"
+msgstr ""
+
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:186
+#, python-format
+msgid ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+msgstr ""
+
+#: ../editors/LDViewer.py:893
+msgid "The group of block must be coherent!"
+msgstr ""
+
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
+msgid "There are changes, do you want to save?"
+msgstr ""
+
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+
+#: ../IDEFrame.py:1133
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+
+#: ../editors/LDViewer.py:902
+msgid "This option isn't available yet!"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40
+msgid "Time"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
+msgid "Time addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:86
+msgid "Time concatenation"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
+msgid "Time division"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
+msgid "Time multiplication"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
+msgid "Time subtraction"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
+msgid "Time-of-day addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
+msgid "Time-of-day subtraction"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr ""
+
+#: ../editors/Viewer.py:584
+msgid "Top"
+msgstr ""
+
+#: ../ProjectController.py:1848
+msgid "Transfer"
+msgstr ""
+
+#: ../ProjectController.py:1849
+msgid "Transfer PLC"
+msgstr ""
+
+#: ../ProjectController.py:1802
+msgid "Transfer completed successfully.\n"
+msgstr ""
+
+#: ../ProjectController.py:1805
+msgid "Transfer failed\n"
+msgstr ""
+
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
+msgid "Transition"
+msgstr ""
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:91
+msgid "Transition Name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:60
+msgid "Transition Name:"
+msgstr ""
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1526
+#, python-format
+msgid "Transition with name %s doesn't exist!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Transitions"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Triggering"
+msgstr ""
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
+msgid "Type"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr ""
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
+#, python-format
+msgid "Type conflict for location \"%s\""
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Type conversion"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:170
+msgid "Type infos:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
+msgid "Type:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
+#, python-format
+msgid "Unable to define PDO mapping for node %02x"
+msgstr ""
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
+msgid "Unable to get Xenomai's %s \n"
+msgstr ""
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:261
+#, python-format
+msgid "Undefined pou type \"%s\""
+msgstr ""
+
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
+msgid "Undo"
+msgstr ""
+
+#: ../ProjectController.py:442
+msgid "Unknown"
+msgstr ""
+
+#: ../editors/Viewer.py:437
+#, python-format
+msgid "Unknown variable \"%s\" for this POU!"
+msgstr ""
+
+#: ../ProjectController.py:439 ../ProjectController.py:440
+msgid "Unnamed"
+msgstr ""
+
+#: ../PLCControler.py:263
+#, python-format
+msgid "Unnamed%d"
+msgstr ""
+
+#: ../controls/VariablePanel.py:308
+#, python-format
+msgid "Unrecognized data size \"%s\""
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
+msgid "User Data Types"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
+msgid "User Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "User-defined POUs"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:267
+msgid "Values:"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
+msgid "Variable"
+msgstr ""
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:68
+msgid "Variable Properties"
+msgstr ""
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
+msgid "Variable class"
+msgstr ""
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
+msgid "Variable don't belong to this POU!"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "Variables"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:166
+msgid "Vertical:"
+msgstr ""
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr ""
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr ""
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr ""
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr ""
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr ""
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr ""
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr ""
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr ""
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
+msgid "WXGLADE GUI"
+msgstr ""
+
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
+msgid "Warning"
+msgstr ""
+
+#: ../ProjectController.py:726
+msgid "Warnings in ST/IL/SFC code generator :\n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:82
+msgid "Whole Project"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:134
+msgid "Width:"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:94
+msgid "Wrap search"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr ""
+
+#: ../features.py:35
+msgid "WxGlade GUI"
+msgstr ""
+
+#: ../svgui/svgui.py:150
+msgid ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:160
+msgid ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+msgstr ""
+
+#: ../ProjectController.py:390
+msgid ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+msgstr ""
+
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+
+#: ../editors/LDViewer.py:677
+msgid "You must select the wire where a contact should be added!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
+msgid "You must type a name!"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:209
+msgid "You must type a value!"
+msgstr ""
+
+#: ../IDEFrame.py:440
+msgid "Zoom"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr ""
+
+#: ../PLCOpenEditor.py:317
+#, python-format
+msgid "error: %s\n"
+msgstr ""
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "function"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "functionBlock"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr ""
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "program"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:84
+msgid "string from the middle"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:82
+msgid "string left of"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:83
+msgid "string right of"
+msgstr ""
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr ""
+
+#: ../PLCOpenEditor.py:315
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr ""
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr ""
+
+msgid "CAN_Device"
+msgstr ""
+
+msgid "CAN_Baudrate"
+msgstr ""
+
+msgid "NodeId"
+msgstr ""
+
+msgid "Sync_Align"
+msgstr ""
+
+msgid "Sync_Align_Ratio"
+msgstr ""
+
+msgid "CanFestivalNode"
+msgstr ""
+
+msgid "Sync_TPDOs"
+msgstr ""
+
+msgid "CanFestivalInstance"
+msgstr ""
+
+msgid "CAN_Driver"
+msgstr ""
+
+msgid "Generic"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Xenomai"
+msgstr ""
+
+msgid "XenoConfig"
+msgstr ""
+
+msgid "Compiler"
+msgstr ""
+
+msgid "CFLAGS"
+msgstr ""
+
+msgid "Linker"
+msgstr ""
+
+msgid "LDFLAGS"
+msgstr ""
+
+msgid "Linux"
+msgstr ""
+
+msgid "Win32"
+msgstr ""
+
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr ""
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
+msgid "BaseParams"
+msgstr ""
+
+msgid "IEC_Channel"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "BeremizRoot"
+msgstr ""
+
+msgid "TargetType"
+msgstr ""
+
+msgid "Libraries"
+msgstr ""
+
+msgid "URI_location"
+msgstr ""
+
+msgid "Disable_Extensions"
+msgstr ""
+
+msgid "%(codefile_name)s"
+msgstr ""
+
+msgid "variables"
+msgstr ""
+
+msgid "variable"
+msgstr ""
+
+msgid "name"
+msgstr ""
+
+msgid "type"
+msgstr ""
+
+msgid "class"
+msgstr ""
+
+msgid "initial"
+msgstr ""
+
+msgid "desc"
+msgstr ""
+
+msgid "onchange"
+msgstr ""
+
+msgid "opts"
+msgstr ""
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr ""
+
+msgid "Preset datetime"
+msgstr ""
+
+msgid "Copy of IN"
+msgstr ""
+
+msgid "Datetime, current or relative to PDT"
+msgstr ""
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+
+msgid "1 = integrate, 0 = hold"
+msgstr ""
+
+msgid "Overriding reset"
+msgstr ""
+
+msgid "Input variable"
+msgstr ""
+
+msgid "Initial value"
+msgstr ""
+
+msgid "Sampling period"
+msgstr ""
+
+msgid "NOT R1"
+msgstr ""
+
+msgid "Integrated output"
+msgstr ""
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr ""
+
+msgid "0 = reset"
+msgstr ""
+
+msgid "Input to be differentiated"
+msgstr ""
+
+msgid "Differentiated output"
+msgstr ""
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+
+msgid "0 - manual , 1 - automatic"
+msgstr ""
+
+msgid "Process variable"
+msgstr ""
+
+msgid "Set point"
+msgstr ""
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr ""
+
+msgid "Proportionality constant"
+msgstr ""
+
+msgid "Reset time"
+msgstr ""
+
+msgid "Derivative time constant"
+msgstr ""
+
+msgid "PV - SP"
+msgstr ""
+
+msgid "FB for integral term"
+msgstr ""
+
+msgid "FB for derivative term"
+msgstr ""
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr ""
+
+msgid "Ramp duration"
+msgstr ""
+
+msgid "BUSY = 1 during ramping period"
+msgstr ""
+
+msgid "Elapsed time of ramp"
+msgstr ""
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr ""
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr ""
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr ""
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+
+msgid "first input parameter"
+msgstr ""
+
+msgid "second input parameter"
+msgstr ""
+
+msgid "first output parameter"
+msgstr ""
+
+msgid "second output parameter"
+msgstr ""
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr ""
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/Beremiz_pt.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4036 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Pedro Coimbra <pcoimbra310@gmail.com>, 2017\n"
+"Language-Team: Portuguese (https://www.transifex.com/beremiz/teams/75746/pt/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pt\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
+msgid ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "   External"
+msgstr "Externo"
+
+#: ../controls/VariablePanel.py:89
+msgid "   InOut"
+msgstr "EntradaSaída"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Input"
+msgstr "Entrada"
+
+#: ../controls/VariablePanel.py:90
+msgid "   Local"
+msgstr "Local"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Output"
+msgstr "Saída"
+
+#: ../controls/VariablePanel.py:91
+msgid "   Temp"
+msgstr "Temp"
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
+#, python-format
+msgid " and %s"
+msgstr "e %s"
+
+#: ../ProjectController.py:1182
+msgid " generation failed !\n"
+msgstr "geração falhada !\n"
+
+#: ../plcopen/plcopen.py:1029
+#, python-format
+msgid "\"%s\" Data Type doesn't exist !!!"
+msgstr "\" %s \" O tipo de dados não existe !!!"
+
+#: ../plcopen/plcopen.py:1047
+#, python-format
+msgid "\"%s\" POU already exists !!!"
+msgstr "\" %s \" POU já existe !!!"
+
+#: ../plcopen/plcopen.py:1068
+#, python-format
+msgid "\"%s\" POU doesn't exist !!!"
+msgstr "\" %s \" POU não existe !!!"
+
+#: ../editors/Viewer.py:288
+#, python-format
+msgid "\"%s\" can't use itself!"
+msgstr "\"%s\" não pode usar-se!"
+
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
+#, python-format
+msgid "\"%s\" config already exists!"
+msgstr "\"%s \" config já existe!"
+
+#: ../plcopen/plcopen.py:531
+#, python-format
+msgid "\"%s\" configuration already exists !!!"
+msgstr "\"%s\" configuração já existe !!!"
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr ""
+
+#: ../IDEFrame.py:1638
+#, python-format
+msgid "\"%s\" data type already exists!"
+msgstr "\"%s\" o tipo de dados já existe!"
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
+#, python-format
+msgid "\"%s\" element for this pou already exists!"
+msgstr "\"%s\" o elemento para esta pou já existe!"
+
+#: ../BeremizIDE.py:928
+#, python-format
+msgid "\"%s\" folder is not a valid Beremiz project\n"
+msgstr "\"%s\" o ficheiro não é um projecto Beremiz válido\n"
+
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
+#, python-format
+msgid "\"%s\" is a keyword. It can't be used!"
+msgstr "\"%s\" é uma palavra-chave. Não pode ser usada!"
+
+#: ../plcopen/plcopen.py:2836
+#, python-format
+msgid "\"%s\" is an invalid value!"
+msgstr "\"%s\" é um valor inválido!"
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
+msgid "\"%s\" is not a valid folder!"
+msgstr "\"%s\" não é um ficheiro válido!"
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
+#, python-format
+msgid "\"%s\" is not a valid identifier!"
+msgstr "\"%s\" não é um identificador válido!"
+
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr "\"%s\" é usáda por uma ou mais POUs. Deseja continuar?"
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
+#, python-format
+msgid "\"%s\" pou already exists!"
+msgstr "\"%s\" pou já existe!"
+
+#: ../dialogs/SFCStepNameDialog.py:62
+#, python-format
+msgid "\"%s\" step already exists!"
+msgstr "\"%s\" o passo já existe!"
+
+#: ../editors/DataTypeEditor.py:566
+#, python-format
+msgid "\"%s\" value already defined!"
+msgstr "\"%s\" valor já defenido|"
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
+#, python-format
+msgid "\"%s\" value isn't a valid array dimension!"
+msgstr "\"%s\" o valor não é uma dimensão de matriz válida!"
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
+#, python-format
+msgid ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+msgstr ""
+"\"%s\" o valor não é uma dimensão de matriz válida!\n"
+"O valor direito tem de ser maior do que o valor esquerdo."
+
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr "\"{a1}\" função cancelada na POU  \"{a2}\" : Sem entrada conectada"
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr "\"{a1}\" já está a ser usada por \"{a2}\"!"
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr "o recurso\"{a1}\" já existe na  configuração\"{a2}\" !!!"
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr "o recurso\"{a1}\" não existe na configuração\"{a2}\" !!!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr "%03gms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr "%dd"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr "%dh"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr "%dm"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr "%dms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr "%ds"
+
+#: ../PLCControler.py:1114
+#, python-format
+msgid "%s Data Types"
+msgstr "%s Tipo de dados"
+
+#: ../PLCControler.py:1097
+#, python-format
+msgid "%s POUs"
+msgstr "%s POUs"
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
+#, python-format
+msgid "%s Profile"
+msgstr "%s Perfil"
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
+#, python-format
+msgid "%s body don't have instances!"
+msgstr "%s o corpo não tem instâncias!"
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
+#, python-format
+msgid "%s body don't have text!"
+msgstr "%s o corpo não tem texto!"
+
+#: ../IDEFrame.py:388
+msgid "&Add Element"
+msgstr "&Adicione elemento"
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr "&Fechar"
+
+#: ../IDEFrame.py:361
+msgid "&Configuration"
+msgstr "&Configuração"
+
+#: ../IDEFrame.py:350
+msgid "&Data Type"
+msgstr "&Tipo de dados"
+
+#: ../IDEFrame.py:392
+msgid "&Delete"
+msgstr "&Apagar"
+
+#: ../IDEFrame.py:342
+msgid "&Display"
+msgstr "&Exibir"
+
+#: ../IDEFrame.py:341
+msgid "&Edit"
+msgstr "&Editar"
+
+#: ../IDEFrame.py:340
+msgid "&File"
+msgstr "&Ficheiro"
+
+#: ../IDEFrame.py:352
+msgid "&Function"
+msgstr "&Função"
+
+#: ../IDEFrame.py:343
+msgid "&Help"
+msgstr "&Ajuda"
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr "&Licensa"
+
+#: ../IDEFrame.py:356
+msgid "&Program"
+msgstr "&Programa"
+
+#: ../PLCOpenEditor.py:98
+msgid "&Properties"
+msgstr "&Propriedades"
+
+#: ../BeremizIDE.py:244
+msgid "&Recent Projects"
+msgstr "&Projectos recentes"
+
+#: ../IDEFrame.py:358
+msgid "&Resource"
+msgstr "&Recurso"
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr "'{a1}' - {a2} é idêntico no projecto"
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr "'{a1}' - {a2} são idênticos no projecto"
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr "'{a1}' está localizado em {a2}\n"
+
+#: ../controls/SearchResultPanel.py:298
+#, python-format
+msgid "(%d matches)"
+msgstr "(%d corresponde)"
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
+#, python-format
+msgid ", %s"
+msgstr ", %s"
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr ""
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr "1d"
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr "1h"
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr "1m"
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr "1s"
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+"Uma POU contém um elemento chamado \"%s\" Isto pode causar um conflito. "
+"Deseja continuar?"
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
+#, python-format
+msgid "A POU named \"%s\" already exists!"
+msgstr "Uma POU chmada  \"%s\" já existe!"
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr "Um filho chamado \"{a1}\" ajá existe -> \"{a2}\"\n"
+
+#: ../dialogs/BrowseLocationsDialog.py:229
+msgid "A location must be selected!"
+msgstr "Uma localização tem de ser seleccionada!"
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr "Uma tarefa com o mesmo nome já existe!"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
+#, python-format
+msgid "A variable with \"%s\" as name already exists in this pou!"
+msgstr "Uma variavel com o nome\"%s\" já existe nesta pou!"
+
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr "Uma variavel com o nome\"%s\" já existe!"
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
+msgid "About"
+msgstr "Sobre"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Absolute number"
+msgstr "Numero absoluto"
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
+msgid "Action"
+msgstr "Acção"
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
+msgid "Action Block"
+msgstr "Bloco de acção"
+
+#: ../dialogs/PouActionDialog.py:89
+msgid "Action Name"
+msgstr "Nome da acção"
+
+#: ../dialogs/PouActionDialog.py:56
+msgid "Action Name:"
+msgstr "Nome da acção:"
+
+#: ../plcopen/plcopen.py:1567
+#, python-format
+msgid "Action with name %s doesn't exist!"
+msgstr "A acção com o nome \"%s\" não existe!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Actions"
+msgstr "Acções"
+
+#: ../dialogs/ActionBlockDialog.py:139
+msgid "Actions:"
+msgstr "Acções:"
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr "Activo"
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
+msgid "Add"
+msgstr "Adicionar"
+
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
+msgid "Add Action"
+msgstr "Adicionar acção"
+
+#: ../features.py:33
+msgid "Add C code accessing located variables synchronously"
+msgstr "Adicionar codigo C acessando variaveis localizadas sincronamente"
+
+#: ../IDEFrame.py:1907
+msgid "Add Configuration"
+msgstr "Adicionar Configuração"
+
+#: ../IDEFrame.py:1887
+msgid "Add DataType"
+msgstr "Adicionar  um Tipo de Dados"
+
+#: ../editors/Viewer.py:609
+msgid "Add Divergence Branch"
+msgstr "Adicionar um Ramo de divergência"
+
+#: ../dialogs/DiscoveryDialog.py:121
+msgid "Add IP"
+msgstr "Adicionar IP"
+
+#: ../IDEFrame.py:1895
+msgid "Add POU"
+msgstr "Adicionao POU"
+
+#: ../features.py:34
+msgid "Add Python code executed asynchronously"
+msgstr "Adicionar codigo Python executado assincronamente"
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
+msgid "Add Resource"
+msgstr "Adicionar Recurso"
+
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
+msgid "Add Transition"
+msgstr "Adicionar Transição"
+
+#: ../editors/Viewer.py:596
+msgid "Add Wire Segment"
+msgstr "Adicionar seguemento de ligação"
+
+#: ../editors/SFCViewer.py:447
+msgid "Add a new initial step"
+msgstr "Adicionar um novo passo de inicio"
+
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
+msgid "Add a new jump"
+msgstr "Adicionar um novo salto"
+
+#: ../editors/SFCViewer.py:469
+msgid "Add a new step"
+msgstr "Adicionar um novo passo"
+
+#: ../features.py:35
+msgid "Add a simple WxGlade based GUI."
+msgstr "Adicionar um simples GUI baseado em WxGlade"
+
+#: ../dialogs/ActionBlockDialog.py:143
+msgid "Add action"
+msgstr "Adicionar acção"
+
+#: ../editors/DataTypeEditor.py:364
+msgid "Add element"
+msgstr "Adicionar elemento"
+
+#: ../editors/ResourceEditor.py:283
+msgid "Add instance"
+msgstr "Adicionar instância"
+
+#: ../canfestival/NetworkEditor.py:110
+msgid "Add slave"
+msgstr "Adicionar escravo"
+
+#: ../editors/ResourceEditor.py:252
+msgid "Add task"
+msgstr "Adicionar tarefa"
+
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
+msgid "Add variable"
+msgstr "Adicionar variável"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Addition"
+msgstr "Adição"
+
+#: ../plcopen/definitions.py:51
+msgid "Additional function blocks"
+msgstr "Blocos de função adicionais"
+
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr "Ajustar tamanho de bloco"
+
+#: ../editors/Viewer.py:1720
+msgid "Alignment"
+msgstr "Alinhamento"
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
+msgid "All"
+msgstr "Tudo"
+
+#: ../editors/FileManagementPanel.py:37
+msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+msgstr "Todos os ficheiros (*.*)|*.*|CSV files (*.csv)|*.csv"
+
+#: ../ProjectController.py:1670
+msgid "Already connected. Please disconnect\n"
+msgstr "Já conectado. Por favor desconecte-se\n"
+
+#: ../editors/DataTypeEditor.py:607
+#, python-format
+msgid "An element named \"%s\" already exists in this structure!"
+msgstr "Um elemento chamado \"%s\" já existe nesta estrutura!"
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr "Uma instância com o mesmo nome já existe!"
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr ""
+"Aplicar modificação de nome para todas as continuações com o mesmo nome"
+
+#: ../plcopen/iec_std.csv:31
+msgid "Arc cosine"
+msgstr "Arco coseno"
+
+#: ../plcopen/iec_std.csv:30
+msgid "Arc sine"
+msgstr "Arco seno"
+
+#: ../plcopen/iec_std.csv:32
+msgid "Arc tangent"
+msgstr "Arco tangente"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Arithmetic"
+msgstr "Aritmético"
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
+msgid "Array"
+msgstr "Array"
+
+#: ../plcopen/iec_std.csv:39
+msgid "Assignment"
+msgstr "Atribuição"
+
+#: ../dialogs/FBDVariableDialog.py:226
+msgid "At least a variable or an expression must be selected!"
+msgstr "Pelo menos uma variável ou expressão tem de ser seleccionada!"
+
+#: ../controls/ProjectPropertiesPanel.py:111
+msgid "Author"
+msgstr "Autor"
+
+#: ../controls/ProjectPropertiesPanel.py:108
+msgid "Author Name (optional):"
+msgstr "Nome de Autor (opcional)"
+
+#: ../dialogs/FindInPouDialog.py:80
+msgid "Backward"
+msgstr "Para trás"
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
+#, python-format
+msgid "Bad location size : %s"
+msgstr "Mau tamanho de posição %s"
+
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
+msgid "Base Type:"
+msgstr "Tipo base"
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
+msgid "Base Types"
+msgstr "Tipos base"
+
+#: ../BeremizIDE.py:483
+msgid "Beremiz"
+msgstr "Beremiz"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Binary selection (1 of 2)"
+msgstr "Selecção binária (1 de 2)"
+
+#: ../plcopen/iec_std.csv:62
+msgid "Bit-shift"
+msgstr "Bit-shift"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise"
+msgstr "Bitwise"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise AND"
+msgstr "Bitwise AND"
+
+#: ../plcopen/iec_std.csv:67
+msgid "Bitwise OR"
+msgstr "Bitwise OR"
+
+#: ../plcopen/iec_std.csv:68
+msgid "Bitwise XOR"
+msgstr "Bitwise XOR"
+
+#: ../plcopen/iec_std.csv:69
+msgid "Bitwise inverting"
+msgstr "Bitwise inverting"
+
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
+msgid "Block"
+msgstr "Bloco"
+
+#: ../dialogs/FBDBlockDialog.py:63
+msgid "Block Properties"
+msgstr "Propriedades do bloco"
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr "Nome do bloco "
+
+#: ../editors/Viewer.py:586
+msgid "Bottom"
+msgstr "Fundo"
+
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr "Avariado"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
+msgid "Browse %s values library"
+msgstr "Explore a biblioteca de valores %s"
+
+#: ../dialogs/BrowseLocationsDialog.py:72
+msgid "Browse Locations"
+msgstr "Navegar nos endereços"
+
+#: ../ProjectController.py:1815
+msgid "Build"
+msgstr "Compilar"
+
+#: ../ProjectController.py:1335
+msgid "Build directory already clean\n"
+msgstr "Directório de compilação já está limpo\n"
+
+#: ../ProjectController.py:1816
+msgid "Build project into build folder"
+msgstr "Compilar projecto no ficheiro de compilação"
+
+#: ../ProjectController.py:1108
+msgid "C Build crashed !\n"
+msgstr "A compilação C quebrou !\n"
+
+#: ../ProjectController.py:1105
+msgid "C Build failed.\n"
+msgstr "A compilação C falhou.\n"
+
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr "Codigo C"
+
+#: ../ProjectController.py:1186
+msgid "C code generated successfully.\n"
+msgstr "Codigo C gerado com sucesso.\n"
+
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr "A compilação C falhou.\n"
+
+#: ../targets/toolchain_gcc.py:199
+#, python-format
+msgid "C compilation of %s failed.\n"
+msgstr "A compilação C de %s falhou.\n"
+
+#: ../features.py:33
+msgid "C extension"
+msgstr "Extensão C"
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr "C&redits"
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr "Rede CANOpen"
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr "Escravo CANOpen"
+
+#: ../features.py:31
+msgid "CANopen support"
+msgstr "Suporte CANOpen"
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
+msgid "Can only generate execution order on FBD networks!"
+msgstr "Só pode gerar ordens de execução em redes FBD!"
+
+#: ../controls/VariablePanel.py:291
+msgid "Can only give a location to local or global variables"
+msgstr "Só pode gerar um endereço para variáveis locais ou globais"
+
+#: ../PLCOpenEditor.py:318
+#, python-format
+msgid "Can't generate program to file %s!"
+msgstr "Não é possivel gerar um programa no ficheiro %s !"
+
+#: ../controls/VariablePanel.py:289
+msgid "Can't give a location to a function block instance"
+msgstr ""
+"Não é possivel gerar um endereço para uma instância de bloco de função"
+
+#: ../PLCOpenEditor.py:363
+#, python-format
+msgid "Can't save project to file %s!"
+msgstr "Não é possivel salvar o projecto no ficheiro %s !"
+
+#: ../controls/VariablePanel.py:339
+msgid "Can't set an initial value to a function block instance"
+msgstr ""
+"Não é possivel atribuir um valor inicial a uma instância de bloco de função"
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr "Não é possivel criar um elemento filho {a1} do tipo {a2} "
+
+#: ../ConfigTreeNode.py:454
+#, python-format
+msgid "Cannot find lower free IEC channel than %d\n"
+msgstr "Nâo é possivel encontrar um canal IEC livre inferior a %d\n"
+
+#: ../connectors/PYRO/__init__.py:139
+msgid "Cannot get PLC status - connection failed.\n"
+msgstr "Não é possivel obter o estado do PLC - falha de conexão.\n"
+
+#: ../ProjectController.py:967
+msgid "Cannot open/parse VARIABLES.csv!\n"
+msgstr "Não é possível abrir / analisar VARIÁVEIS.csv!\n"
+
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+"Não é possível defenir o bit de offset para uma variavel não  bool '{a1}'  "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
+msgid "Case sensitive"
+msgstr "Maiúsculas e minúsculas"
+
+#: ../editors/Viewer.py:581
+msgid "Center"
+msgstr "Centrar"
+
+#: ../Beremiz_service.py:276
+msgid "Change IP of interface to bind"
+msgstr "Alterar IP da interface a ligar"
+
+#: ../Beremiz_service.py:275
+msgid "Change Name"
+msgstr "Alterar nome"
+
+#: ../IDEFrame.py:1977
+msgid "Change POU Type To"
+msgstr "Alterar tipo de Pou para"
+
+#: ../Beremiz_service.py:277
+msgid "Change Port Number"
+msgstr "Alterar numero de porto"
+
+#: ../Beremiz_service.py:278
+msgid "Change working directory"
+msgstr "Alterar directoria de trabalho"
+
+#: ../plcopen/iec_std.csv:81
+msgid "Character string"
+msgstr "Cadeia de caracteres"
+
+#: ../svgui/svgui.py:136
+msgid "Choose a SVG file"
+msgstr "Escolha um ficheiro SVG"
+
+#: ../ProjectController.py:561
+msgid "Choose a directory to save project"
+msgstr "Escolha um directório para salvar projecto"
+
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
+msgid "Choose a file"
+msgstr "Escolha um ficheiro"
+
+#: ../BeremizIDE.py:900
+msgid "Choose a project"
+msgstr "Escolha um projecto"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
+msgid "Choose a value for %s:"
+msgstr "Escalha um valor para %s :"
+
+#: ../Beremiz_service.py:333
+msgid "Choose a working directory "
+msgstr "Escolha um directório de trabalho"
+
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr ""
+
+#: ../ProjectController.py:468
+msgid "Chosen folder doesn't contain a program. It's not a valid project!"
+msgstr "A pasta escolhida não contém um programa. Não é um projecto válido!"
+
+#: ../ProjectController.py:435
+msgid "Chosen folder isn't empty. You can't use it for a new project!"
+msgstr ""
+"A pasta escolhida não está vazia. Não pode ser usada para um novo projecto!"
+
+#: ../controls/VariablePanel.py:60
+msgid "Class"
+msgstr "Classe"
+
+#: ../controls/VariablePanel.py:472
+msgid "Class Filter:"
+msgstr "Filtro de Classe:"
+
+#: ../dialogs/FBDVariableDialog.py:74
+msgid "Class:"
+msgstr "Classe:"
+
+#: ../ProjectController.py:1821
+msgid "Clean"
+msgstr "Limpar"
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr "Limpar menssagens log"
+
+#: ../ProjectController.py:1822
+msgid "Clean project build folder"
+msgstr "Limpar a pasta de compilação do projeto"
+
+#: ../ProjectController.py:1332
+msgid "Cleaning the build directory\n"
+msgstr "Limpar o directório de compilação\n"
+
+#: ../IDEFrame.py:437
+msgid "Clear Errors"
+msgstr "limpar erros"
+
+#: ../editors/Viewer.py:680
+msgid "Clear Execution Order"
+msgstr "limpar ordem de execução"
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr "Fechar"
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
+msgid "Close Application"
+msgstr "Fechar aplicação"
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
+msgid "Close Project"
+msgstr "Fechar projecto"
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
+msgid "Close Tab"
+msgstr "Fechar aba"
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
+msgid "Coil"
+msgstr "Bobine"
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
+msgid "Comment"
+msgstr "Comentário"
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr "Suporte da comunidade"
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr "Nome da Empresa"
+
+#: ../controls/ProjectPropertiesPanel.py:106
+msgid "Company Name (required):"
+msgstr "Nome da Empresa (obrigatório):"
+
+#: ../controls/ProjectPropertiesPanel.py:107
+msgid "Company URL (optional):"
+msgstr "URL da Empresa (opcional):"
+
+#: ../plcopen/iec_std.csv:75
+msgid "Comparison"
+msgstr "Comparação"
+
+#: ../ProjectController.py:756
+msgid "Compiling IEC Program into C code...\n"
+msgstr "A compilar programa ICE para codigo C...\n"
+
+#: ../plcopen/iec_std.csv:85
+msgid "Concatenation"
+msgstr "Concatenação"
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr "Config"
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr "Config variáveis"
+
+#: ../dialogs/SearchInProjectDialog.py:43
+msgid "Configuration"
+msgstr "Configuração"
+
+#: ../plcopen/types_enums.py:77
+msgid "Configurations"
+msgstr "Configurações"
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr "Confirme ou altere o nome da variável"
+
+#: ../ProjectController.py:1842
+msgid "Connect"
+msgstr "Conectar"
+
+#: ../ProjectController.py:1843
+msgid "Connect to the target PLC"
+msgstr "Conectar ao PLC alvo"
+
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr "Conectar ao URI: %s"
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
+msgid "Connection"
+msgstr "Conexão"
+
+#: ../dialogs/ConnectionDialog.py:55
+msgid "Connection Properties"
+msgstr "Propriedades da conexão"
+
+#: ../ProjectController.py:1691
+msgid "Connection canceled!\n"
+msgstr "Conexão cancelada!\n"
+
+#: ../ProjectController.py:1714
+#, python-format
+msgid "Connection failed to %s!\n"
+msgstr "Falha na conexão a %s !\n"
+
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr "Conexão perdida!\n"
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
+msgid "Connection to '%s' failed.\n"
+msgstr "A conexão com %s falhou.\n"
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
+msgid "Connector"
+msgstr "Conector"
+
+#: ../dialogs/SFCStepDialog.py:68
+msgid "Connectors:"
+msgstr "Conectores:"
+
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr "Consola"
+
+#: ../controls/VariablePanel.py:75
+msgid "Constant"
+msgstr "Constante"
+
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
+msgid "Contact"
+msgstr "Contacto"
+
+#: ../controls/ProjectPropertiesPanel.py:217
+msgid "Content Description (optional):"
+msgstr "descrição de conteúdo (opcional):"
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
+msgid "Continuation"
+msgstr "Continuação"
+
+#: ../plcopen/iec_std.csv:18
+msgid "Conversion from BCD"
+msgstr "Conversão de BCD"
+
+#: ../plcopen/iec_std.csv:19
+msgid "Conversion to BCD"
+msgstr "Conversão para BCD"
+
+#: ../plcopen/iec_std.csv:21
+msgid "Conversion to date"
+msgstr "Conversão para data"
+
+#: ../plcopen/iec_std.csv:20
+msgid "Conversion to time-of-day"
+msgstr "Conversão para hora-do-dia"
+
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
+msgid "Copy"
+msgstr "Copiar"
+
+#: ../IDEFrame.py:1964
+msgid "Copy POU"
+msgstr "Copiar POU"
+
+#: ../editors/FileManagementPanel.py:68
+msgid "Copy file from left folder to right"
+msgstr "Copiar o arquivo da pasta esquerda para a direita"
+
+#: ../editors/FileManagementPanel.py:67
+msgid "Copy file from right folder to left"
+msgstr "Copiar o arquivo da pasta direita para a esquerda"
+
+#: ../plcopen/iec_std.csv:28
+msgid "Cosine"
+msgstr "Coseno"
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+"Não foi possível adicionar elemento filho \"{a1}\", tipo  {a2}:\n"
+" {a3} \n"
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr "Não foi possivél importar o ficheiro antigo %s."
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Não foi possível carregar parâmetros  base de confnode {a1} : \n"
+" {a2}"
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Não foi possível carregar parâmetros  de confnode {a1} : \n"
+" {a2}"
+
+#: ../PLCControler.py:552
+msgid "Couldn't paste non-POU object."
+msgstr "Não foi possível colar o objeto não-POU."
+
+#: ../ProjectController.py:1636
+msgid "Couldn't start PLC !\n"
+msgstr "Não foi possível iniciar o PLC!\n"
+
+#: ../ProjectController.py:1644
+msgid "Couldn't stop PLC !\n"
+msgstr "Não foi possível parar o PLC!\n"
+
+#: ../svgui/svgui.py:57
+msgid "Create HMI"
+msgstr "Criar HMI"
+
+#: ../dialogs/PouDialog.py:54
+msgid "Create a new POU"
+msgstr "Criar uma nova POU"
+
+#: ../dialogs/PouActionDialog.py:45
+msgid "Create a new action"
+msgstr "Criar uma nova acção"
+
+#: ../IDEFrame.py:166
+msgid "Create a new action block"
+msgstr "Criar um novo bloco de ação"
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
+msgid "Create a new block"
+msgstr "Criar um novo bloco"
+
+#: ../IDEFrame.py:139
+msgid "Create a new branch"
+msgstr "Criar uma nova ramificação"
+
+#: ../IDEFrame.py:133
+msgid "Create a new coil"
+msgstr "Criar uma nova bobine"
+
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
+msgid "Create a new comment"
+msgstr "Criar um novo comentário"
+
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
+msgid "Create a new connection"
+msgstr "Criar uma nova conexão"
+
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
+msgid "Create a new contact"
+msgstr "Criar um novo contacto"
+
+#: ../IDEFrame.py:169
+msgid "Create a new divergence"
+msgstr "Criar uma nova divergência"
+
+#: ../dialogs/SFCDivergenceDialog.py:54
+msgid "Create a new divergence or convergence"
+msgstr "Criar uma nova divergência ou convergência"
+
+#: ../IDEFrame.py:157
+msgid "Create a new initial step"
+msgstr "Criar um novo passo inicial"
+
+#: ../IDEFrame.py:172
+msgid "Create a new jump"
+msgstr "Criar um novo salto"
+
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
+msgid "Create a new power rail"
+msgstr "Criar um novo trilho de energia"
+
+#: ../IDEFrame.py:130
+msgid "Create a new rung"
+msgstr "Criar uma nova rung"
+
+#: ../IDEFrame.py:160
+msgid "Create a new step"
+msgstr "Criar um novo passo"
+
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
+msgid "Create a new transition"
+msgstr "Criar uma nova transição"
+
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
+msgid "Create a new variable"
+msgstr "Criar uma nova variável"
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr "Creditos"
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr "Directoria de trabalho actual"
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
+msgid "Cut"
+msgstr "Cortar"
+
+#: ../editors/ResourceEditor.py:81
+msgid "Cyclic"
+msgstr "Cíclico"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:60
+msgid "DEPRECATED"
+msgstr "Descontinuada"
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
+msgid "DS-301 Profile"
+msgstr "Perfile DS-301"
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
+msgid "DS-302 Profile"
+msgstr "Perfile DS-302"
+
+#: ../dialogs/SearchInProjectDialog.py:39
+msgid "Data Type"
+msgstr "Tipo de dado"
+
+#: ../plcopen/types_enums.py:76
+msgid "Data Types"
+msgstr "Tipo de dados"
+
+#: ../plcopen/iec_std.csv:16
+msgid "Data type conversion"
+msgstr "Converção de tipo de dados"
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
+msgid "Date addition"
+msgstr "Adição de data"
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
+msgid "Date and time subtraction"
+msgstr "Subtração de data e hora"
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
+msgid "Date subtraction"
+msgstr "Subtração de data"
+
+#: ../dialogs/DurationEditorDialog.py:46
+msgid "Days:"
+msgstr "Dias:"
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr ""
+"Depuração não corresponde ao PLC - parar / transferir / iniciar para "
+"reativar\n"
+
+#: ../controls/PouInstanceVariablesPanel.py:144
+msgid "Debug instance"
+msgstr "Depurar a instância"
+
+#: ../editors/Viewer.py:490
+#, python-format
+msgid "Debug: %s"
+msgstr "depuração %s"
+
+#: ../ProjectController.py:1471
+#, python-format
+msgid "Debug: Unknown variable '%s'\n"
+msgstr "Depuração: Variável desconhecida '%s '\n"
+
+#: ../ProjectController.py:1469
+#, python-format
+msgid "Debug: Unsupported type to debug '%s'\n"
+msgstr "Depuração: Tipo não suportado para depurar ' %s '\n"
+
+#: ../IDEFrame.py:660
+msgid "Debugger"
+msgstr "Depurador"
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr "Depurador pronto\n"
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
+msgid "Delete"
+msgstr "Eliminar"
+
+#: ../editors/Viewer.py:610
+msgid "Delete Divergence Branch"
+msgstr "Eliminar ramificação de divergência"
+
+#: ../editors/FileManagementPanel.py:157
+msgid "Delete File"
+msgstr "Eliminar ficheiro"
+
+#: ../editors/Viewer.py:597
+msgid "Delete Wire Segment"
+msgstr "Eliminar seguemento de fio"
+
+#: ../controls/CustomEditableListBox.py:44
+msgid "Delete item"
+msgstr "Eliminar item"
+
+#: ../plcopen/iec_std.csv:88
+msgid "Deletion (within)"
+msgstr "Eliminação (dentro)"
+
+#: ../editors/DataTypeEditor.py:161
+msgid "Derivation Type:"
+msgstr "Tipo de Derivação:"
+
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr "Descrição"
+
+#: ../controls/VariablePanel.py:463
+msgid "Description:"
+msgstr "Descrição:"
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
+msgid "Dimensions:"
+msgstr "Dimensões:"
+
+#: ../dialogs/FindInPouDialog.py:69
+msgid "Direction"
+msgstr "Direcção"
+
+#: ../dialogs/BrowseLocationsDialog.py:102
+msgid "Direction:"
+msgstr "Direcção:"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Directly"
+msgstr "Diretamente"
+
+#: ../ProjectController.py:1855
+msgid "Disconnect"
+msgstr ""
+
+#: ../ProjectController.py:1856
+msgid "Disconnect from PLC"
+msgstr ""
+
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr ""
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
+msgid "Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:36
+msgid "Division"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:156
+#, python-format
+msgid "Do you really want to delete the file '%s'?"
+msgstr ""
+
+#: ../controls/VariablePanel.py:65
+msgid "Documentation"
+msgstr ""
+
+#: ../PLCOpenEditor.py:312
+msgid "Done"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Duration"
+msgstr ""
+
+#: ../canfestival/canfestival.py:174
+msgid "EDS files (*.eds)|*.eds|All files|*.*"
+msgstr ""
+
+#: ../editors/Viewer.py:668
+msgid "Edit Block"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:56
+msgid "Edit Contact Values"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:62
+msgid "Edit Duration"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:53
+msgid "Edit Step"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
+msgid "Edit a WxWidgets GUI with WXGlade"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:127
+msgid "Edit action block properties"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:47
+msgid "Edit array type properties"
+msgstr ""
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
+msgid "Edit comment"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:69
+msgid "Edit file"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:42
+msgid "Edit item"
+msgstr ""
+
+#: ../editors/Viewer.py:3059
+msgid "Edit jump target"
+msgstr ""
+
+#: ../ProjectController.py:1873
+msgid "Edit raw IEC code added to code generated by PLCGenerator"
+msgstr ""
+
+#: ../editors/SFCViewer.py:815
+msgid "Edit step name"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:53
+msgid "Edit transition"
+msgstr ""
+
+#: ../IDEFrame.py:632
+msgid "Editor ToolBar"
+msgstr ""
+
+#: ../ProjectController.py:1294
+msgid "Editor selection"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:360
+msgid "Elements :"
+msgstr ""
+
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr ""
+
+#: ../Beremiz_service.py:341
+msgid "Enter a name "
+msgstr ""
+
+#: ../Beremiz_service.py:326
+msgid "Enter a port number "
+msgstr ""
+
+#: ../Beremiz_service.py:317
+msgid "Enter the IP of the interface to bind"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Enumerated"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:77
+msgid "Equal to"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
+msgid "Error"
+msgstr ""
+
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+
+#: ../ProjectController.py:803
+#, python-format
+msgid "Error : IEC to C compiler returned %d\n"
+msgstr ""
+
+#: ../ProjectController.py:731
+#, python-format
+msgid ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+msgstr ""
+
+#: ../ConfigTreeNode.py:219
+#, python-format
+msgid "Error while saving \"%s\"\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:179
+msgid "Error: Export slave failed\n"
+msgstr ""
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:388
+msgid "Error: No Master generated\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:383
+msgid "Error: No PLC built\n"
+msgstr ""
+
+#: ../ProjectController.py:1708
+#, python-format
+msgid "Exception while connecting %s!\n"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:123
+msgid "Execution Control:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
+msgid "Execution Order:"
+msgstr ""
+
+#: ../features.py:36
+msgid "Experimental web based HMI"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:38
+msgid "Exponent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:26
+msgid "Exponentiation"
+msgstr ""
+
+#: ../canfestival/canfestival.py:186
+msgid "Export CanOpen slave to EDS file"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
+msgid "Export graph values to clipboard"
+msgstr ""
+
+#: ../canfestival/canfestival.py:185
+msgid "Export slave"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:94
+msgid "Expression:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "External"
+msgstr ""
+
+#: ../ProjectController.py:826
+msgid "Extracting Located Variables...\n"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "FBD"
+msgstr ""
+
+#: ../ProjectController.py:1773
+msgid "Failed : Must build before transfer.\n"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
+msgid "Falling Edge"
+msgstr ""
+
+#: ../ProjectController.py:1098
+msgid "Fatal : cannot get builder.\n"
+msgstr ""
+
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
+msgid "Field %s hasn't a valid value!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
+msgid "Fields %s haven't a valid value!"
+msgstr ""
+
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
+msgid "Find"
+msgstr ""
+
+#: ../IDEFrame.py:379
+msgid "Find Next"
+msgstr ""
+
+#: ../IDEFrame.py:381
+msgid "Find Previous"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:90
+msgid "Find position"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:58
+msgid "Find:"
+msgstr ""
+
+#: ../editors/Viewer.py:1633
+msgid "Force value"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:176
+msgid "Forcing Variable Value"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
+#, python-format
+msgid "Form isn't complete. %s must be filled!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
+msgid "Form isn't complete. Name must be filled!"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:235
+msgid "Form isn't complete. Valid block type must be selected!"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:75
+msgid "Forward"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
+msgid "Function"
+msgstr ""
+
+#: ../IDEFrame.py:354
+msgid "Function &Block"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
+msgid "Function Block"
+msgstr ""
+
+#: ../controls/VariablePanel.py:868
+msgid "Function Block Types"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Function Blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:290
+msgid "Function Blocks can't be used in Functions!"
+msgstr ""
+
+#: ../PLCControler.py:1907
+#, python-format
+msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Functions"
+msgstr ""
+
+#: ../PLCOpenEditor.py:88
+msgid "Generate Program"
+msgstr ""
+
+#: ../ProjectController.py:722
+msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Global"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
+msgid "Go to current value"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:189
+msgid "Graphics"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Greater than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:76
+msgid "Greater than or equal to"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:149
+msgid "Grid Resolution:"
+msgstr ""
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:135
+msgid "Height:"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:89
+msgid "Home Directory:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:165
+msgid "Horizontal:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:47
+msgid "Hours:"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "IL"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr ""
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
+msgid "IP is not valid!"
+msgstr ""
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
+msgid "Import SVG"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
+msgid "InOut"
+msgstr ""
+
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr ""
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:306
+#, python-format
+msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Indicator"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr ""
+
+#: ../editors/Viewer.py:650
+msgid "Initial Step"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
+msgid "Initial Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
+msgid "Initial Value:"
+msgstr ""
+
+#: ../svgui/svgui.py:56
+msgid "Inkscape"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
+msgid "Inline"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Input"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:99
+msgid "Inputs:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:87
+msgid "Insertion (into)"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1948
+#, python-format
+msgid "Instance with id %d doesn't exist!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:279
+msgid "Instances:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:88
+msgid "Interface"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Interrupt"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Interval"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+
+#: ../PLCControler.py:1895
+msgid "Invalid plcopen element(s)!!!"
+msgstr ""
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr ""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
+#, python-format
+msgid "Invalid value \"%s\" for debug variable"
+msgstr ""
+
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
+msgid "Invalid value \"%s\" for variable grid element"
+msgstr ""
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
+#, python-format
+msgid "Invalid value \"%s\" for viewer block"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:124
+msgid ""
+"Invalid value!\n"
+"You must fill a numeric value."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr ""
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
+msgid "Jump"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "LD"
+msgstr ""
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
+#, python-format
+msgid "Ladder element with id %d is on more than one rung."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
+msgid "Language"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:206
+msgid "Language (optional):"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
+msgid "Language:"
+msgstr ""
+
+#: ../ProjectController.py:1779
+msgid "Latest build already matches current target. Transfering anyway...\n"
+msgstr ""
+
+#: ../Beremiz_service.py:281
+msgid "Launch WX GUI inspector"
+msgstr ""
+
+#: ../Beremiz_service.py:280
+msgid "Launch a live Python shell"
+msgstr ""
+
+#: ../editors/Viewer.py:580
+msgid "Left"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:64
+msgid "Left PowerRail"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Length of string"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:78
+msgid "Less than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:79
+msgid "Less than or equal to"
+msgstr ""
+
+#: ../IDEFrame.py:652
+msgid "Library"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:73
+msgid "Limitation"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:209
+msgid "Linking :\n"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
+msgid "Local"
+msgstr ""
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr ""
+
+#: ../ProjectController.py:1685
+msgid "Local service discovery failed!\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:62
+msgid "Location"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:79
+msgid "Locations available:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:25
+msgid "Logarithm to base 10"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:102
+#, python-format
+msgid "MDNS resolution failure for '%s'\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
+msgid "Map Variable"
+msgstr ""
+
+#: ../features.py:31
+msgid "Map located variables over CANopen"
+msgstr ""
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:113
+msgid "Master"
+msgstr ""
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr ""
+
+#: ../plcopen/iec_std.csv:71
+msgid "Maximum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:246
+msgid "Maximum:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Memory"
+msgstr ""
+
+#: ../IDEFrame.py:617
+msgid "Menu ToolBar"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:51
+msgid "Microseconds:"
+msgstr ""
+
+#: ../editors/Viewer.py:585
+msgid "Middle"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:50
+msgid "Milliseconds:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:72
+msgid "Minimum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:233
+msgid "Minimum:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:48
+msgid "Minutes:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:231
+msgid "Miscellaneous"
+msgstr ""
+
+#: ../features.py:32
+msgid "Modbus support"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:65
+msgid "Modifier:"
+msgstr ""
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:146
+msgid "Move action down"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:145
+msgid "Move action up"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:46
+msgid "Move down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:367
+msgid "Move element down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:366
+msgid "Move element up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:254
+msgid "Move task up"
+msgstr ""
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
+msgid "Move the view"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:45
+msgid "Move up"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
+msgid "Move variable down"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
+msgid "Move variable up"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:74
+msgid "Multiplexer (select 1 of N)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:34
+msgid "Multiplication"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:87
+msgid "My Computer:"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
+#: ../controls/VariablePanel.py:59
+msgid "Name"
+msgstr ""
+
+#: ../Beremiz_service.py:342
+msgid "Name must not be null!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
+msgid "Name:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:24
+msgid "Natural logarithm"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
+msgid "Negated"
+msgstr ""
+
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr ""
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
+msgid "New"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:43
+msgid "New item"
+msgstr ""
+
+#: ../editors/Viewer.py:553
+msgid "No Modifier"
+msgstr ""
+
+#: ../ProjectController.py:1808
+msgid "No PLC to transfer (did build succeed ?)\n"
+msgstr ""
+
+#: ../PLCGenerator.py:1678
+#, python-format
+msgid "No body defined in \"%s\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCOpenEditor.py:331
+msgid ""
+"No documentation available.\n"
+"Coming soon."
+msgstr ""
+
+#: ../PLCGenerator.py:841
+#, python-format
+msgid "No informations found for \"%s\" block"
+msgstr ""
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:175
+msgid "No search results available."
+msgstr ""
+
+#: ../svgui/svgui.py:142
+#, python-format
+msgid "No such SVG file: %s\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr ""
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+msgid "No valid value selected!"
+msgstr ""
+
+#: ../PLCGenerator.py:1676
+#, python-format
+msgid "No variable defined in \"%s\" POU"
+msgstr ""
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr ""
+
+#: ../controls/VariablePanel.py:79
+msgid "Non-Retain"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78
+msgid "Normal"
+msgstr ""
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:80
+msgid "Not equal to"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:91
+msgid "Number of sequences:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:22
+msgid "Numerical"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:88
+msgid "Only Elements"
+msgstr ""
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
+msgid "Open"
+msgstr ""
+
+#: ../svgui/svgui.py:151
+msgid "Open Inkscape"
+msgstr ""
+
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+
+#: ../ProjectController.py:1879
+msgid "Open a file explorer to manage project files"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
+msgid "Open wxGlade"
+msgstr ""
+
+#: ../controls/VariablePanel.py:64
+msgid "Option"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
+msgid "Options"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:109
+msgid "Organization (optional):"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
+msgid "Other Profile"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Output"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
+msgid "PDO Receive"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
+msgid "PDO Transmit"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:174
+msgid "PLC :\n"
+msgstr ""
+
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr ""
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr ""
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr ""
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr ""
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
+msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
+msgstr ""
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
+msgid "PLCOpenEditor"
+msgstr ""
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:109
+msgid "POU Name"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:66
+msgid "POU Name:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:111
+msgid "POU Type"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:73
+msgid "POU Type:"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr ""
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
+msgid "Page Setup"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:124
+msgid "Page Size (optional):"
+msgstr ""
+
+#: ../IDEFrame.py:2640
+#, python-format
+msgid "Page: %d"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:134
+msgid "Parent instance"
+msgstr ""
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
+msgid "Paste"
+msgstr ""
+
+#: ../IDEFrame.py:1899
+msgid "Paste POU"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:60
+msgid "Pattern to search:"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:75
+msgid "Pin number:"
+msgstr ""
+
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
+msgid "Please choose a target"
+msgstr ""
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr ""
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
+msgid "Please enter comment text"
+msgstr ""
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
+msgid "Please enter step name"
+msgstr ""
+
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
+msgid "Please enter value for a \"%s\" variable:"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be 0 <= port <= 65535!"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be an integer!"
+msgstr ""
+
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
+msgid "Power Rail"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:52
+msgid "Power Rail Properties"
+msgstr ""
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
+msgid "Preview"
+msgstr ""
+
+#: ../dialogs/BlockPreviewDialog.py:59
+msgid "Preview:"
+msgstr ""
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
+msgid "Print"
+msgstr ""
+
+#: ../IDEFrame.py:1110
+msgid "Print preview"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Priority"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:91
+msgid "Priority:"
+msgstr ""
+
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:90
+msgid "Product Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:92
+msgid "Product Release (optional):"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:91
+msgid "Product Version (required):"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
+msgid "Program"
+msgstr ""
+
+#: ../PLCOpenEditor.py:321
+msgid "Program was successfully generated!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Programs"
+msgstr ""
+
+#: ../editors/Viewer.py:285
+msgid "Programs can't be used by other POUs!"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
+msgid "Project"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:180
+#, python-format
+msgid "Project '%s':"
+msgstr ""
+
+#: ../ProjectController.py:1878
+msgid "Project Files"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:88
+msgid "Project Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:89
+msgid "Project Version (optional):"
+msgstr ""
+
+#: ../PLCControler.py:2717
+msgid ""
+"Project file syntax error:\n"
+"\n"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
+msgid "Project properties"
+msgstr ""
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Properties"
+msgstr ""
+
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr ""
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr ""
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr ""
+
+#: ../features.py:34
+msgid "Python file"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Qualifier"
+msgstr ""
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
+msgid "Quit"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
+msgid "Range:"
+msgstr ""
+
+#: ../ProjectController.py:1872
+msgid "Raw IEC code"
+msgstr ""
+
+#: ../BeremizIDE.py:1083
+#, python-format
+msgid "Really delete node '%s'?"
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
+msgid "Redo"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:76
+msgid "Reference"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
+msgid "Refresh"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:70
+msgid "Regular expression"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:99
+msgid "Regular expressions"
+msgstr ""
+
+#: ../editors/Viewer.py:1636
+msgid "Release value"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:37
+msgid "Remainder (modulo)"
+msgstr ""
+
+#: ../BeremizIDE.py:1084
+#, python-format
+msgid "Remove %s node"
+msgstr ""
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr ""
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:144
+msgid "Remove action"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:365
+msgid "Remove element"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:66
+msgid "Remove file from left folder"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:284
+msgid "Remove instance"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:111
+msgid "Remove slave"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:253
+msgid "Remove task"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
+msgid "Remove variable"
+msgstr ""
+
+#: ../IDEFrame.py:1979
+msgid "Rename"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:187
+msgid "Replace File"
+msgstr ""
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:89
+msgid "Replacement (within)"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Reset"
+msgstr ""
+
+#: ../editors/Viewer.py:681
+msgid "Reset Execution Order"
+msgstr ""
+
+#: ../IDEFrame.py:453
+msgid "Reset Perspective"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:103
+msgid "Reset search result"
+msgstr ""
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
+msgid "Resources"
+msgstr ""
+
+#: ../controls/VariablePanel.py:77
+msgid "Retain"
+msgstr ""
+
+#: ../controls/VariablePanel.py:455
+msgid "Return Type:"
+msgstr ""
+
+#: ../editors/Viewer.py:582
+msgid "Right"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:65
+msgid "Right PowerRail"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
+msgid "Rising Edge"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:65
+msgid "Rotate left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:64
+msgid "Rotate right"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:17
+msgid "Rounding up/down"
+msgstr ""
+
+#: ../ProjectController.py:1828
+msgid "Run"
+msgstr ""
+
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
+msgid "SDO Client"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
+msgid "SDO Server"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "SFC"
+msgstr ""
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr ""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "ST"
+msgstr ""
+
+#: ../PLCOpenEditor.py:308
+msgid "ST files (*.st)|*.st|All files|*.*"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "SVG files (*.svg)|*.svg|All files|*.*"
+msgstr ""
+
+#: ../features.py:36
+msgid "SVGUI"
+msgstr ""
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
+msgid "Save"
+msgstr ""
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
+msgid "Save As..."
+msgstr ""
+
+#: ../BeremizIDE.py:249
+msgid "Save as"
+msgstr ""
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:73
+msgid "Scope"
+msgstr ""
+
+#: ../IDEFrame.py:644
+msgid "Search"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
+msgid "Search in Project"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:49
+msgid "Seconds:"
+msgstr ""
+
+#: ../IDEFrame.py:390
+msgid "Select All"
+msgstr ""
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
+msgid "Select a variable class:"
+msgstr ""
+
+#: ../ProjectController.py:1293
+msgid "Select an editor:"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:292
+msgid "Select an instance"
+msgstr ""
+
+#: ../IDEFrame.py:628
+msgid "Select an object"
+msgstr ""
+
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:70
+msgid "Selection"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:65
+msgid "Selection Divergence"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:104
+msgid "Services available:"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Set"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Shift left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:63
+msgid "Shift right"
+msgstr ""
+
+#: ../ProjectController.py:1863
+msgid "Show IEC code generated by PLCGenerator"
+msgstr ""
+
+#: ../canfestival/canfestival.py:407
+msgid "Show Master"
+msgstr ""
+
+#: ../canfestival/canfestival.py:408
+msgid "Show Master generated by config_utils"
+msgstr ""
+
+#: ../ProjectController.py:1862
+msgid "Show code"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:67
+msgid "Simultaneous Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:27
+msgid "Sine"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Single"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr ""
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+
+#: ../plcopen/iec_std.csv:23
+msgid "Square root (base 2)"
+msgstr ""
+
+#: ../plcopen/definitions.py:50
+msgid "Standard function blocks"
+msgstr ""
+
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
+msgid "Start PLC"
+msgstr ""
+
+#: ../ProjectController.py:1074
+#, python-format
+msgid "Start build in %s\n"
+msgstr ""
+
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr ""
+
+#: ../ProjectController.py:1633
+msgid "Starting PLC\n"
+msgstr ""
+
+#: ../BeremizIDE.py:393
+msgid "Status ToolBar"
+msgstr ""
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
+msgid "Step"
+msgstr ""
+
+#: ../ProjectController.py:1835
+msgid "Stop"
+msgstr ""
+
+#: ../Beremiz_service.py:272
+msgid "Stop PLC"
+msgstr ""
+
+#: ../ProjectController.py:1836
+msgid "Stop Running PLC"
+msgstr ""
+
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Structure"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Subrange"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:35
+msgid "Subtraction"
+msgstr ""
+
+#: ../ProjectController.py:1113
+msgid "Successfully built.\n"
+msgstr ""
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
+msgid "Syntax error in regular expression of pattern to search!"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:29
+msgid "Tangent"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:97
+msgid "Task"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:248
+msgid "Tasks:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Temp"
+msgstr ""
+
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:186
+#, python-format
+msgid ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+msgstr ""
+
+#: ../editors/LDViewer.py:893
+msgid "The group of block must be coherent!"
+msgstr ""
+
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
+msgid "There are changes, do you want to save?"
+msgstr ""
+
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+
+#: ../IDEFrame.py:1133
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+
+#: ../editors/LDViewer.py:902
+msgid "This option isn't available yet!"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40
+msgid "Time"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
+msgid "Time addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:86
+msgid "Time concatenation"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
+msgid "Time division"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
+msgid "Time multiplication"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
+msgid "Time subtraction"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
+msgid "Time-of-day addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
+msgid "Time-of-day subtraction"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr ""
+
+#: ../editors/Viewer.py:584
+msgid "Top"
+msgstr ""
+
+#: ../ProjectController.py:1848
+msgid "Transfer"
+msgstr ""
+
+#: ../ProjectController.py:1849
+msgid "Transfer PLC"
+msgstr ""
+
+#: ../ProjectController.py:1802
+msgid "Transfer completed successfully.\n"
+msgstr ""
+
+#: ../ProjectController.py:1805
+msgid "Transfer failed\n"
+msgstr ""
+
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
+msgid "Transition"
+msgstr ""
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:91
+msgid "Transition Name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:60
+msgid "Transition Name:"
+msgstr ""
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1526
+#, python-format
+msgid "Transition with name %s doesn't exist!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Transitions"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Triggering"
+msgstr ""
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
+msgid "Type"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr ""
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
+#, python-format
+msgid "Type conflict for location \"%s\""
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Type conversion"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:170
+msgid "Type infos:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
+msgid "Type:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
+#, python-format
+msgid "Unable to define PDO mapping for node %02x"
+msgstr ""
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
+msgid "Unable to get Xenomai's %s \n"
+msgstr ""
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:261
+#, python-format
+msgid "Undefined pou type \"%s\""
+msgstr ""
+
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
+msgid "Undo"
+msgstr ""
+
+#: ../ProjectController.py:442
+msgid "Unknown"
+msgstr ""
+
+#: ../editors/Viewer.py:437
+#, python-format
+msgid "Unknown variable \"%s\" for this POU!"
+msgstr ""
+
+#: ../ProjectController.py:439 ../ProjectController.py:440
+msgid "Unnamed"
+msgstr ""
+
+#: ../PLCControler.py:263
+#, python-format
+msgid "Unnamed%d"
+msgstr ""
+
+#: ../controls/VariablePanel.py:308
+#, python-format
+msgid "Unrecognized data size \"%s\""
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
+msgid "User Data Types"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
+msgid "User Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "User-defined POUs"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:267
+msgid "Values:"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
+msgid "Variable"
+msgstr ""
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:68
+msgid "Variable Properties"
+msgstr ""
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
+msgid "Variable class"
+msgstr ""
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
+msgid "Variable don't belong to this POU!"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "Variables"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:166
+msgid "Vertical:"
+msgstr ""
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr ""
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr ""
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr ""
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr ""
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr ""
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr ""
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr ""
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr ""
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
+msgid "WXGLADE GUI"
+msgstr ""
+
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
+msgid "Warning"
+msgstr ""
+
+#: ../ProjectController.py:726
+msgid "Warnings in ST/IL/SFC code generator :\n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:82
+msgid "Whole Project"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:134
+msgid "Width:"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:94
+msgid "Wrap search"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr ""
+
+#: ../features.py:35
+msgid "WxGlade GUI"
+msgstr ""
+
+#: ../svgui/svgui.py:150
+msgid ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:160
+msgid ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+msgstr ""
+
+#: ../ProjectController.py:390
+msgid ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+msgstr ""
+
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+
+#: ../editors/LDViewer.py:677
+msgid "You must select the wire where a contact should be added!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
+msgid "You must type a name!"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:209
+msgid "You must type a value!"
+msgstr ""
+
+#: ../IDEFrame.py:440
+msgid "Zoom"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr ""
+
+#: ../PLCOpenEditor.py:317
+#, python-format
+msgid "error: %s\n"
+msgstr ""
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "function"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "functionBlock"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr ""
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "program"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:84
+msgid "string from the middle"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:82
+msgid "string left of"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:83
+msgid "string right of"
+msgstr ""
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr ""
+
+#: ../PLCOpenEditor.py:315
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr ""
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr ""
+
+msgid "CAN_Device"
+msgstr ""
+
+msgid "CAN_Baudrate"
+msgstr ""
+
+msgid "NodeId"
+msgstr ""
+
+msgid "Sync_Align"
+msgstr ""
+
+msgid "Sync_Align_Ratio"
+msgstr ""
+
+msgid "CanFestivalNode"
+msgstr ""
+
+msgid "Sync_TPDOs"
+msgstr ""
+
+msgid "CanFestivalInstance"
+msgstr ""
+
+msgid "CAN_Driver"
+msgstr ""
+
+msgid "Generic"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Xenomai"
+msgstr ""
+
+msgid "XenoConfig"
+msgstr ""
+
+msgid "Compiler"
+msgstr ""
+
+msgid "CFLAGS"
+msgstr ""
+
+msgid "Linker"
+msgstr ""
+
+msgid "LDFLAGS"
+msgstr ""
+
+msgid "Linux"
+msgstr ""
+
+msgid "Win32"
+msgstr ""
+
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr ""
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
+msgid "BaseParams"
+msgstr ""
+
+msgid "IEC_Channel"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "BeremizRoot"
+msgstr ""
+
+msgid "TargetType"
+msgstr ""
+
+msgid "Libraries"
+msgstr ""
+
+msgid "URI_location"
+msgstr ""
+
+msgid "Disable_Extensions"
+msgstr ""
+
+msgid "%(codefile_name)s"
+msgstr ""
+
+msgid "variables"
+msgstr ""
+
+msgid "variable"
+msgstr ""
+
+msgid "name"
+msgstr ""
+
+msgid "type"
+msgstr ""
+
+msgid "class"
+msgstr ""
+
+msgid "initial"
+msgstr ""
+
+msgid "desc"
+msgstr ""
+
+msgid "onchange"
+msgstr ""
+
+msgid "opts"
+msgstr ""
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr ""
+
+msgid "Preset datetime"
+msgstr ""
+
+msgid "Copy of IN"
+msgstr ""
+
+msgid "Datetime, current or relative to PDT"
+msgstr ""
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+
+msgid "1 = integrate, 0 = hold"
+msgstr ""
+
+msgid "Overriding reset"
+msgstr ""
+
+msgid "Input variable"
+msgstr ""
+
+msgid "Initial value"
+msgstr ""
+
+msgid "Sampling period"
+msgstr ""
+
+msgid "NOT R1"
+msgstr ""
+
+msgid "Integrated output"
+msgstr ""
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr ""
+
+msgid "0 = reset"
+msgstr ""
+
+msgid "Input to be differentiated"
+msgstr ""
+
+msgid "Differentiated output"
+msgstr ""
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+
+msgid "0 - manual , 1 - automatic"
+msgstr ""
+
+msgid "Process variable"
+msgstr ""
+
+msgid "Set point"
+msgstr ""
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr ""
+
+msgid "Proportionality constant"
+msgstr ""
+
+msgid "Reset time"
+msgstr ""
+
+msgid "Derivative time constant"
+msgstr ""
+
+msgid "PV - SP"
+msgstr ""
+
+msgid "FB for integral term"
+msgstr ""
+
+msgid "FB for derivative term"
+msgstr ""
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr ""
+
+msgid "Ramp duration"
+msgstr ""
+
+msgid "BUSY = 1 during ramping period"
+msgstr ""
+
+msgid "Elapsed time of ramp"
+msgstr ""
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr ""
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr ""
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr ""
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+
+msgid "first input parameter"
+msgstr ""
+
+msgid "second input parameter"
+msgstr ""
+
+msgid "first output parameter"
+msgstr ""
+
+msgid "second output parameter"
+msgstr ""
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr ""
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/Beremiz_pt_BR.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4081 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Rodrigo Rolle <ro_pita@hotmail.com>, 2018\n"
+"Language-Team: Portuguese (Brazil) (https://www.transifex.com/beremiz/teams/75746/pt_BR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: pt_BR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
+msgid ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+msgstr ""
+"\n"
+"Ocorreu uma exceção não tratada (bug). Relatório de erro salvo em:\n"
+"(%s)\n"
+"\n"
+"Favor enviar este relatório de erro para:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"Você deve reiniciar este programa.\n"
+"\n"
+"Traceback:\n"
+
+#: ../controls/VariablePanel.py:90
+msgid "   External"
+msgstr "Externo"
+
+#: ../controls/VariablePanel.py:89
+msgid "   InOut"
+msgstr "InOut"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Input"
+msgstr "Input"
+
+#: ../controls/VariablePanel.py:90
+msgid "   Local"
+msgstr "Local"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Output"
+msgstr "Output"
+
+#: ../controls/VariablePanel.py:91
+msgid "   Temp"
+msgstr "Temp"
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
+#, python-format
+msgid " and %s"
+msgstr "e %s"
+
+#: ../ProjectController.py:1182
+msgid " generation failed !\n"
+msgstr "falha na geração !\n"
+
+#: ../plcopen/plcopen.py:1029
+#, python-format
+msgid "\"%s\" Data Type doesn't exist !!!"
+msgstr "Data Type \"%s\" não existe !!!"
+
+#: ../plcopen/plcopen.py:1047
+#, python-format
+msgid "\"%s\" POU already exists !!!"
+msgstr "POU \"%s\" já existe !!!"
+
+#: ../plcopen/plcopen.py:1068
+#, python-format
+msgid "\"%s\" POU doesn't exist !!!"
+msgstr "POU \"%s\" não existe !!!"
+
+#: ../editors/Viewer.py:288
+#, python-format
+msgid "\"%s\" can't use itself!"
+msgstr "\"%s\" não pode usar a si mesmo!"
+
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
+#, python-format
+msgid "\"%s\" config already exists!"
+msgstr "configuração \"%s\" já existe"
+
+#: ../plcopen/plcopen.py:531
+#, python-format
+msgid "\"%s\" configuration already exists !!!"
+msgstr "Configuração \"%s\" já existe !!!"
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr "Configuração \"%s\" não existe !!!"
+
+#: ../IDEFrame.py:1638
+#, python-format
+msgid "\"%s\" data type already exists!"
+msgstr "Data Type \"%s\" já existe!"
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
+#, python-format
+msgid "\"%s\" element for this pou already exists!"
+msgstr "Elemento \"%s\" para este POU já existe!"
+
+#: ../BeremizIDE.py:928
+#, python-format
+msgid "\"%s\" folder is not a valid Beremiz project\n"
+msgstr "A pasta \"%s\" não é um projeto Beremiz válido\n"
+
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
+#, python-format
+msgid "\"%s\" is a keyword. It can't be used!"
+msgstr "\"%s\" é uma palavra-chave (keyword) e não pode ser usado!"
+
+#: ../plcopen/plcopen.py:2836
+#, python-format
+msgid "\"%s\" is an invalid value!"
+msgstr "\"%s\" é um valor inválido!"
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
+msgid "\"%s\" is not a valid folder!"
+msgstr "\"%s\" não é uma pasta válida!"
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
+#, python-format
+msgid "\"%s\" is not a valid identifier!"
+msgstr "\"%s\" não é um identifier válido!"
+
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr "\"%s\" está sendo usado por um ou mais POUs. Você deseja continuar?"
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
+#, python-format
+msgid "\"%s\" pou already exists!"
+msgstr "POU \"%s\" já existe!"
+
+#: ../dialogs/SFCStepNameDialog.py:62
+#, python-format
+msgid "\"%s\" step already exists!"
+msgstr "Passo \"%s\" já existe!"
+
+#: ../editors/DataTypeEditor.py:566
+#, python-format
+msgid "\"%s\" value already defined!"
+msgstr "Valor \"%s\" já definido!"
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
+#, python-format
+msgid "\"%s\" value isn't a valid array dimension!"
+msgstr "\"%s\" não é um valor válido para dimensão de vetores!"
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
+#, python-format
+msgid ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+msgstr ""
+"\"%s\" não é um valor válido para dimensão de vetores!\n"
+"O valor correto deve ser maior do que o valor da esquerda."
+
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr "Função \"{a1}\" cancelada em POU \"{a2}\": Nenhuma entrada conectada"
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr "\"{a1}\" já é usado por \"{a2}\"!"
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr "Recurso \"{a1}\" já existe em configuração \"{a2}\" !!!"
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr "Recurso \"{a1}\" não existe em configuração \"{a2}\" !!!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr "%03gms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr "%dd"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr "%dh"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr "%dm"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr "%dms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr "%ds"
+
+#: ../PLCControler.py:1114
+#, python-format
+msgid "%s Data Types"
+msgstr "%s Data Types"
+
+#: ../PLCControler.py:1097
+#, python-format
+msgid "%s POUs"
+msgstr "%s POUs"
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
+#, python-format
+msgid "%s Profile"
+msgstr "%s Perfil"
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
+#, python-format
+msgid "%s body don't have instances!"
+msgstr "%s não possui instâncias!"
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
+#, python-format
+msgid "%s body don't have text!"
+msgstr "%s não possui texto!"
+
+#: ../IDEFrame.py:388
+msgid "&Add Element"
+msgstr "&Adicionar Elemento"
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr "&Fechar"
+
+#: ../IDEFrame.py:361
+msgid "&Configuration"
+msgstr "&Configuração"
+
+#: ../IDEFrame.py:350
+msgid "&Data Type"
+msgstr "&Data Type"
+
+#: ../IDEFrame.py:392
+msgid "&Delete"
+msgstr "&Deletar"
+
+#: ../IDEFrame.py:342
+msgid "&Display"
+msgstr "&Exibir"
+
+#: ../IDEFrame.py:341
+msgid "&Edit"
+msgstr "&Editar"
+
+#: ../IDEFrame.py:340
+msgid "&File"
+msgstr "&Arquivo"
+
+#: ../IDEFrame.py:352
+msgid "&Function"
+msgstr "&Função"
+
+#: ../IDEFrame.py:343
+msgid "&Help"
+msgstr "&Ajuda"
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr "&Licença"
+
+#: ../IDEFrame.py:356
+msgid "&Program"
+msgstr "&Programa"
+
+#: ../PLCOpenEditor.py:98
+msgid "&Properties"
+msgstr "&Propriedades"
+
+#: ../BeremizIDE.py:244
+msgid "&Recent Projects"
+msgstr "&Projetos Recentes"
+
+#: ../IDEFrame.py:358
+msgid "&Resource"
+msgstr "&Recursos"
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr "'{a1}' - {a2} correspondência no projeto"
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr "'{a1}' - {a2} correspondências no projeto"
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr "'{a1}' está localizado em {a2}\n"
+
+#: ../controls/SearchResultPanel.py:298
+#, python-format
+msgid "(%d matches)"
+msgstr "(%d correspondências)"
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
+#, python-format
+msgid ", %s"
+msgstr ", %s"
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr ""
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr "1d"
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr "1h"
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr "1m"
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr "1s"
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+"Um POU já tem um elemento chamado \"%s\". Isto pode causar um conflito. "
+"Deseja continuar?"
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
+#, python-format
+msgid "A POU named \"%s\" already exists!"
+msgstr "Já existe POU chamado \"%s\"!"
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:229
+msgid "A location must be selected!"
+msgstr "Uma localização deve ser selecionada!"
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr "Já existe uma tarefa com o mesmo nome!"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
+#, python-format
+msgid "A variable with \"%s\" as name already exists in this pou!"
+msgstr "Já existe uma variável com nome \"%s\" neste POU!"
+
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr "Já existe uma variável com o nome \"%s\"!"
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
+msgid "About"
+msgstr "Sobre"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Absolute number"
+msgstr "Número absoluto"
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
+msgid "Action"
+msgstr "Ação"
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
+msgid "Action Block"
+msgstr "Bloco de Ação"
+
+#: ../dialogs/PouActionDialog.py:89
+msgid "Action Name"
+msgstr "Nome de Ação"
+
+#: ../dialogs/PouActionDialog.py:56
+msgid "Action Name:"
+msgstr "Nome de Ação:"
+
+#: ../plcopen/plcopen.py:1567
+#, python-format
+msgid "Action with name %s doesn't exist!"
+msgstr "Não existe ação com o nome \"%s\"!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Actions"
+msgstr "Ações"
+
+#: ../dialogs/ActionBlockDialog.py:139
+msgid "Actions:"
+msgstr "Ações:"
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr "Ativo"
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
+msgid "Add"
+msgstr "Adicionar"
+
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
+msgid "Add Action"
+msgstr "Adicionar ação"
+
+#: ../features.py:33
+msgid "Add C code accessing located variables synchronously"
+msgstr ""
+
+#: ../IDEFrame.py:1907
+msgid "Add Configuration"
+msgstr "Adicionar Configuração"
+
+#: ../IDEFrame.py:1887
+msgid "Add DataType"
+msgstr ""
+
+#: ../editors/Viewer.py:609
+msgid "Add Divergence Branch"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:121
+msgid "Add IP"
+msgstr "Adicionar IP"
+
+#: ../IDEFrame.py:1895
+msgid "Add POU"
+msgstr "Adicionar POU"
+
+#: ../features.py:34
+msgid "Add Python code executed asynchronously"
+msgstr ""
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
+msgid "Add Resource"
+msgstr "Adicionar Recurso"
+
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
+msgid "Add Transition"
+msgstr "Adicionar Transição"
+
+#: ../editors/Viewer.py:596
+msgid "Add Wire Segment"
+msgstr "Adicionar Segmento de Fio"
+
+#: ../editors/SFCViewer.py:447
+msgid "Add a new initial step"
+msgstr "Adicionar um novo passo inicial"
+
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
+msgid "Add a new jump"
+msgstr "Adicionar um novo salto"
+
+#: ../editors/SFCViewer.py:469
+msgid "Add a new step"
+msgstr "Adicionar um novo passo"
+
+#: ../features.py:35
+msgid "Add a simple WxGlade based GUI."
+msgstr "Adicionar uma GUI simples baseada em WxGlade"
+
+#: ../dialogs/ActionBlockDialog.py:143
+msgid "Add action"
+msgstr "Adicionar ação"
+
+#: ../editors/DataTypeEditor.py:364
+msgid "Add element"
+msgstr "Adicionar elemento"
+
+#: ../editors/ResourceEditor.py:283
+msgid "Add instance"
+msgstr "Adicionar instância"
+
+#: ../canfestival/NetworkEditor.py:110
+msgid "Add slave"
+msgstr "Adicionar escravo"
+
+#: ../editors/ResourceEditor.py:252
+msgid "Add task"
+msgstr "Adicionar tarefa"
+
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
+msgid "Add variable"
+msgstr "Adicionar variável"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Addition"
+msgstr "Adição"
+
+#: ../plcopen/definitions.py:51
+msgid "Additional function blocks"
+msgstr "Blocos de função adicionais"
+
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr "Ajustar Tamanho do Bloco"
+
+#: ../editors/Viewer.py:1720
+msgid "Alignment"
+msgstr "Alinhamento"
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
+msgid "All"
+msgstr "Todos"
+
+#: ../editors/FileManagementPanel.py:37
+msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+msgstr "Todos os arquivos (*.*)|*.*|arquivos CSV  (*.csv)|*.csv"
+
+#: ../ProjectController.py:1670
+msgid "Already connected. Please disconnect\n"
+msgstr "Já conectado. Por favor desconecte\n"
+
+#: ../editors/DataTypeEditor.py:607
+#, python-format
+msgid "An element named \"%s\" already exists in this structure!"
+msgstr "Um elemento chamado \"%s\" já existe nesta estrutura!"
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr "Já existe uma instância com o mesmo nome!"
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:31
+msgid "Arc cosine"
+msgstr "Arco cosseno"
+
+#: ../plcopen/iec_std.csv:30
+msgid "Arc sine"
+msgstr "Arco seno"
+
+#: ../plcopen/iec_std.csv:32
+msgid "Arc tangent"
+msgstr "Arco tangente"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Arithmetic"
+msgstr "Aritmética"
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
+msgid "Array"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:39
+msgid "Assignment"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:226
+msgid "At least a variable or an expression must be selected!"
+msgstr "Pelo menos uma variável ou expressão deve ser selecionada!"
+
+#: ../controls/ProjectPropertiesPanel.py:111
+msgid "Author"
+msgstr "Autor"
+
+#: ../controls/ProjectPropertiesPanel.py:108
+msgid "Author Name (optional):"
+msgstr "Nome do Autor (opcional):"
+
+#: ../dialogs/FindInPouDialog.py:80
+msgid "Backward"
+msgstr ""
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
+#, python-format
+msgid "Bad location size : %s"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
+msgid "Base Type:"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
+msgid "Base Types"
+msgstr ""
+
+#: ../BeremizIDE.py:483
+msgid "Beremiz"
+msgstr "Beremiz"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Binary selection (1 of 2)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Bit-shift"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise AND"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:67
+msgid "Bitwise OR"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:68
+msgid "Bitwise XOR"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:69
+msgid "Bitwise inverting"
+msgstr ""
+
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
+msgid "Block"
+msgstr "Bloco"
+
+#: ../dialogs/FBDBlockDialog.py:63
+msgid "Block Properties"
+msgstr "Propriedades do Bloco"
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr "Nome do Bloco"
+
+#: ../editors/Viewer.py:586
+msgid "Bottom"
+msgstr ""
+
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
+msgid "Browse %s values library"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:72
+msgid "Browse Locations"
+msgstr ""
+
+#: ../ProjectController.py:1815
+msgid "Build"
+msgstr ""
+
+#: ../ProjectController.py:1335
+msgid "Build directory already clean\n"
+msgstr ""
+
+#: ../ProjectController.py:1816
+msgid "Build project into build folder"
+msgstr ""
+
+#: ../ProjectController.py:1108
+msgid "C Build crashed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1105
+msgid "C Build failed.\n"
+msgstr "Construção em C falhou.\n"
+
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr "Código C"
+
+#: ../ProjectController.py:1186
+msgid "C code generated successfully.\n"
+msgstr "Código em C gerado com sucesso.\n"
+
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr "Compilação em C falhou!\n"
+
+#: ../targets/toolchain_gcc.py:199
+#, python-format
+msgid "C compilation of %s failed.\n"
+msgstr "Compilação em C de \"%s\" falhou.\n"
+
+#: ../features.py:33
+msgid "C extension"
+msgstr "Extensão em C"
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr "Rede CANOpen"
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr "Escravo CANOpen"
+
+#: ../features.py:31
+msgid "CANopen support"
+msgstr "Suporte CANOpen"
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
+msgid "Can only generate execution order on FBD networks!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:291
+msgid "Can only give a location to local or global variables"
+msgstr "Só é possível atribuir localização para variáveis locais ou globais."
+
+#: ../PLCOpenEditor.py:318
+#, python-format
+msgid "Can't generate program to file %s!"
+msgstr "Não foi possível gerar programa para o arquivo \"%s\"!"
+
+#: ../controls/VariablePanel.py:289
+msgid "Can't give a location to a function block instance"
+msgstr ""
+
+#: ../PLCOpenEditor.py:363
+#, python-format
+msgid "Can't save project to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:339
+msgid "Can't set an initial value to a function block instance"
+msgstr ""
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr ""
+
+#: ../ConfigTreeNode.py:454
+#, python-format
+msgid "Cannot find lower free IEC channel than %d\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:139
+msgid "Cannot get PLC status - connection failed.\n"
+msgstr "Impossível obter status do CLP - conexão falha.\n"
+
+#: ../ProjectController.py:967
+msgid "Cannot open/parse VARIABLES.csv!\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+"Não é possível transferir enquanto o CLP está em execução. Deseja pará-lo "
+"agora?"
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
+msgid "Case sensitive"
+msgstr ""
+
+#: ../editors/Viewer.py:581
+msgid "Center"
+msgstr ""
+
+#: ../Beremiz_service.py:276
+msgid "Change IP of interface to bind"
+msgstr ""
+
+#: ../Beremiz_service.py:275
+msgid "Change Name"
+msgstr "Mudar Nome"
+
+#: ../IDEFrame.py:1977
+msgid "Change POU Type To"
+msgstr ""
+
+#: ../Beremiz_service.py:277
+msgid "Change Port Number"
+msgstr "Mudar Número da Porta"
+
+#: ../Beremiz_service.py:278
+msgid "Change working directory"
+msgstr "Mudar diretório de trabalho"
+
+#: ../plcopen/iec_std.csv:81
+msgid "Character string"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "Choose a SVG file"
+msgstr "Escolha um arquivo SVG"
+
+#: ../ProjectController.py:561
+msgid "Choose a directory to save project"
+msgstr "Escolha um diretório para salvar o projeto"
+
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
+msgid "Choose a file"
+msgstr "Escolha um arquivo"
+
+#: ../BeremizIDE.py:900
+msgid "Choose a project"
+msgstr "Escolha um projeto"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
+msgid "Choose a value for %s:"
+msgstr "Escolha um valor para \"%s\":"
+
+#: ../Beremiz_service.py:333
+msgid "Choose a working directory "
+msgstr "Escolha um diretório de trabalho"
+
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr "Escolha um diretório vazio para o novo projeto"
+
+#: ../ProjectController.py:468
+msgid "Chosen folder doesn't contain a program. It's not a valid project!"
+msgstr ""
+"O diretório escolhido não contém um programa. Não é um projeto válido!"
+
+#: ../ProjectController.py:435
+msgid "Chosen folder isn't empty. You can't use it for a new project!"
+msgstr ""
+"O diretório escolhido não está vazio. Você não pode usá-lo para um novo "
+"projeto!"
+
+#: ../controls/VariablePanel.py:60
+msgid "Class"
+msgstr ""
+
+#: ../controls/VariablePanel.py:472
+msgid "Class Filter:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:74
+msgid "Class:"
+msgstr ""
+
+#: ../ProjectController.py:1821
+msgid "Clean"
+msgstr "Limpar"
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr "Limpar mensagens do log"
+
+#: ../ProjectController.py:1822
+msgid "Clean project build folder"
+msgstr ""
+
+#: ../ProjectController.py:1332
+msgid "Cleaning the build directory\n"
+msgstr ""
+
+#: ../IDEFrame.py:437
+msgid "Clear Errors"
+msgstr "Limpar Erros"
+
+#: ../editors/Viewer.py:680
+msgid "Clear Execution Order"
+msgstr "Limpar Ordem de Execução"
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr "Fechar"
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
+msgid "Close Application"
+msgstr "Fechar Aplicação"
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
+msgid "Close Project"
+msgstr "Fechar Projeto"
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
+msgid "Close Tab"
+msgstr "Fechar Aba"
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
+msgid "Coil"
+msgstr "Bobina"
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
+msgid "Comment"
+msgstr "Comentário"
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr "Suporte da Comunidade"
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr "Nome da Companhia"
+
+#: ../controls/ProjectPropertiesPanel.py:106
+msgid "Company Name (required):"
+msgstr "Nome da Companhia (obrigatório):"
+
+#: ../controls/ProjectPropertiesPanel.py:107
+msgid "Company URL (optional):"
+msgstr "URL da Companhia (opcional):"
+
+#: ../plcopen/iec_std.csv:75
+msgid "Comparison"
+msgstr "Comparação"
+
+#: ../ProjectController.py:756
+msgid "Compiling IEC Program into C code...\n"
+msgstr "Compilando programa IEC em código C...\n"
+
+#: ../plcopen/iec_std.csv:85
+msgid "Concatenation"
+msgstr "Concatenação"
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr ""
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:43
+msgid "Configuration"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Configurations"
+msgstr ""
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr "Confirmar ou alterar nome de variável"
+
+#: ../ProjectController.py:1842
+msgid "Connect"
+msgstr "Conectar"
+
+#: ../ProjectController.py:1843
+msgid "Connect to the target PLC"
+msgstr "Conectar ao CLP alvo"
+
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
+msgid "Connection"
+msgstr "Conexão"
+
+#: ../dialogs/ConnectionDialog.py:55
+msgid "Connection Properties"
+msgstr "Propriedades da Conexão"
+
+#: ../ProjectController.py:1691
+msgid "Connection canceled!\n"
+msgstr "Conexão Cancelada!\n"
+
+#: ../ProjectController.py:1714
+#, python-format
+msgid "Connection failed to %s!\n"
+msgstr "Conexão falha para \"%s\"!\n"
+
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr "Conexão perdida!\n"
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
+msgid "Connection to '%s' failed.\n"
+msgstr "Conexão para '\"%s\"' falhou.\n"
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
+msgid "Connector"
+msgstr "Conector"
+
+#: ../dialogs/SFCStepDialog.py:68
+msgid "Connectors:"
+msgstr "Conectores:"
+
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr ""
+
+#: ../controls/VariablePanel.py:75
+msgid "Constant"
+msgstr "Constante"
+
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
+msgid "Contact"
+msgstr "Contato"
+
+#: ../controls/ProjectPropertiesPanel.py:217
+msgid "Content Description (optional):"
+msgstr "Descrição do conteúdo (opcional):"
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
+msgid "Continuation"
+msgstr "Continuação"
+
+#: ../plcopen/iec_std.csv:18
+msgid "Conversion from BCD"
+msgstr "Conversão de BCD"
+
+#: ../plcopen/iec_std.csv:19
+msgid "Conversion to BCD"
+msgstr "Conversão para BCD"
+
+#: ../plcopen/iec_std.csv:21
+msgid "Conversion to date"
+msgstr "Conversão para data"
+
+#: ../plcopen/iec_std.csv:20
+msgid "Conversion to time-of-day"
+msgstr "Conversão para hora-do-dia"
+
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
+msgid "Copy"
+msgstr "Copiar"
+
+#: ../IDEFrame.py:1964
+msgid "Copy POU"
+msgstr "Copiar POU"
+
+#: ../editors/FileManagementPanel.py:68
+msgid "Copy file from left folder to right"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:67
+msgid "Copy file from right folder to left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:28
+msgid "Cosine"
+msgstr "Cosseno"
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr ""
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../PLCControler.py:552
+msgid "Couldn't paste non-POU object."
+msgstr ""
+
+#: ../ProjectController.py:1636
+msgid "Couldn't start PLC !\n"
+msgstr "Não foi possível iniciar o CLP!\n"
+
+#: ../ProjectController.py:1644
+msgid "Couldn't stop PLC !\n"
+msgstr "Não foi possível parar o CLP!\n"
+
+#: ../svgui/svgui.py:57
+msgid "Create HMI"
+msgstr "Criar IHM"
+
+#: ../dialogs/PouDialog.py:54
+msgid "Create a new POU"
+msgstr "Criar um novo POU"
+
+#: ../dialogs/PouActionDialog.py:45
+msgid "Create a new action"
+msgstr "Criar uma nova ação"
+
+#: ../IDEFrame.py:166
+msgid "Create a new action block"
+msgstr "Criar um novo bloco de ação"
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
+msgid "Create a new block"
+msgstr "Criar um novo bloco"
+
+#: ../IDEFrame.py:139
+msgid "Create a new branch"
+msgstr ""
+
+#: ../IDEFrame.py:133
+msgid "Create a new coil"
+msgstr "Criar uma nova bobina"
+
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
+msgid "Create a new comment"
+msgstr "Criar um novo comentário"
+
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
+msgid "Create a new connection"
+msgstr "Criar uma nova conexão"
+
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
+msgid "Create a new contact"
+msgstr "Criar um novo contato"
+
+#: ../IDEFrame.py:169
+msgid "Create a new divergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:54
+msgid "Create a new divergence or convergence"
+msgstr ""
+
+#: ../IDEFrame.py:157
+msgid "Create a new initial step"
+msgstr ""
+
+#: ../IDEFrame.py:172
+msgid "Create a new jump"
+msgstr ""
+
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
+msgid "Create a new power rail"
+msgstr ""
+
+#: ../IDEFrame.py:130
+msgid "Create a new rung"
+msgstr ""
+
+#: ../IDEFrame.py:160
+msgid "Create a new step"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
+msgid "Create a new transition"
+msgstr "Criar uma nova transição"
+
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
+msgid "Create a new variable"
+msgstr "Criar uma nova variável"
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr "Créditos"
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr ""
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
+msgid "Cut"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Cyclic"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:60
+msgid "DEPRECATED"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
+msgid "DS-301 Profile"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
+msgid "DS-302 Profile"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:39
+msgid "Data Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Data Types"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Data type conversion"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
+msgid "Date addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
+msgid "Date and time subtraction"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
+msgid "Date subtraction"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:46
+msgid "Days:"
+msgstr ""
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:144
+msgid "Debug instance"
+msgstr ""
+
+#: ../editors/Viewer.py:490
+#, python-format
+msgid "Debug: %s"
+msgstr ""
+
+#: ../ProjectController.py:1471
+#, python-format
+msgid "Debug: Unknown variable '%s'\n"
+msgstr ""
+
+#: ../ProjectController.py:1469
+#, python-format
+msgid "Debug: Unsupported type to debug '%s'\n"
+msgstr ""
+
+#: ../IDEFrame.py:660
+msgid "Debugger"
+msgstr ""
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr ""
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
+msgid "Delete"
+msgstr ""
+
+#: ../editors/Viewer.py:610
+msgid "Delete Divergence Branch"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:157
+msgid "Delete File"
+msgstr ""
+
+#: ../editors/Viewer.py:597
+msgid "Delete Wire Segment"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:44
+msgid "Delete item"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:88
+msgid "Deletion (within)"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:161
+msgid "Derivation Type:"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr "Descrição"
+
+#: ../controls/VariablePanel.py:463
+msgid "Description:"
+msgstr "Descrição:"
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
+msgid "Dimensions:"
+msgstr "Dimensões:"
+
+#: ../dialogs/FindInPouDialog.py:69
+msgid "Direction"
+msgstr "Direção"
+
+#: ../dialogs/BrowseLocationsDialog.py:102
+msgid "Direction:"
+msgstr "Direção:"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Directly"
+msgstr "Diretamente"
+
+#: ../ProjectController.py:1855
+msgid "Disconnect"
+msgstr "Desconectar"
+
+#: ../ProjectController.py:1856
+msgid "Disconnect from PLC"
+msgstr "Desconecte do CLP"
+
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr "Desconectado"
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
+msgid "Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:36
+msgid "Division"
+msgstr "Divisão"
+
+#: ../editors/FileManagementPanel.py:156
+#, python-format
+msgid "Do you really want to delete the file '%s'?"
+msgstr "Realmente deseja excluir o arquivo '%s'?"
+
+#: ../controls/VariablePanel.py:65
+msgid "Documentation"
+msgstr "Documentaçã"
+
+#: ../PLCOpenEditor.py:312
+msgid "Done"
+msgstr "Feito"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Duration"
+msgstr "Duração"
+
+#: ../canfestival/canfestival.py:174
+msgid "EDS files (*.eds)|*.eds|All files|*.*"
+msgstr ""
+
+#: ../editors/Viewer.py:668
+msgid "Edit Block"
+msgstr "Editar Bloco"
+
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:56
+msgid "Edit Contact Values"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:62
+msgid "Edit Duration"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:53
+msgid "Edit Step"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
+msgid "Edit a WxWidgets GUI with WXGlade"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:127
+msgid "Edit action block properties"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:47
+msgid "Edit array type properties"
+msgstr ""
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
+msgid "Edit comment"
+msgstr "Editar comentário"
+
+#: ../editors/FileManagementPanel.py:69
+msgid "Edit file"
+msgstr "Editar arquivo"
+
+#: ../controls/CustomEditableListBox.py:42
+msgid "Edit item"
+msgstr "Editar item"
+
+#: ../editors/Viewer.py:3059
+msgid "Edit jump target"
+msgstr ""
+
+#: ../ProjectController.py:1873
+msgid "Edit raw IEC code added to code generated by PLCGenerator"
+msgstr ""
+
+#: ../editors/SFCViewer.py:815
+msgid "Edit step name"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:53
+msgid "Edit transition"
+msgstr "Editar transição"
+
+#: ../IDEFrame.py:632
+msgid "Editor ToolBar"
+msgstr ""
+
+#: ../ProjectController.py:1294
+msgid "Editor selection"
+msgstr "Seleção de editor"
+
+#: ../editors/DataTypeEditor.py:360
+msgid "Elements :"
+msgstr "Elementos:"
+
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr "Vazio"
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr "Dimensão vazia não é permitida."
+
+#: ../Beremiz_service.py:341
+msgid "Enter a name "
+msgstr "Digite um nome"
+
+#: ../Beremiz_service.py:326
+msgid "Enter a port number "
+msgstr "Digite um número de porta"
+
+#: ../Beremiz_service.py:317
+msgid "Enter the IP of the interface to bind"
+msgstr "Digite o IP da interface para conectar"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Enumerated"
+msgstr "Enumerado"
+
+#: ../plcopen/iec_std.csv:77
+msgid "Equal to"
+msgstr "Igual a"
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
+msgid "Error"
+msgstr "Erro"
+
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+
+#: ../ProjectController.py:803
+#, python-format
+msgid "Error : IEC to C compiler returned %d\n"
+msgstr "Erro: compilador IEC para C retornou %d\n"
+
+#: ../ProjectController.py:731
+#, python-format
+msgid ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+msgstr ""
+"Erro no gerador de código ST/IL/SFC: \n"
+"%s\n"
+
+#: ../ConfigTreeNode.py:219
+#, python-format
+msgid "Error while saving \"%s\"\n"
+msgstr "Erro ao salvar \"%s\" \n"
+
+#: ../canfestival/canfestival.py:179
+msgid "Error: Export slave failed\n"
+msgstr "Erro: falha na exportação de escravo.\n"
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:388
+msgid "Error: No Master generated\n"
+msgstr "Erro: nenhum mestre gerado\n"
+
+#: ../canfestival/canfestival.py:383
+msgid "Error: No PLC built\n"
+msgstr ""
+
+#: ../ProjectController.py:1708
+#, python-format
+msgid "Exception while connecting %s!\n"
+msgstr "Exceção enquanto conectando a %s!\n"
+
+#: ../dialogs/FBDBlockDialog.py:123
+msgid "Execution Control:"
+msgstr "Controle de Execução:"
+
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
+msgid "Execution Order:"
+msgstr "Ordem de Execução:"
+
+#: ../features.py:36
+msgid "Experimental web based HMI"
+msgstr "IHM experimental baseada em web"
+
+#: ../plcopen/iec_std.csv:38
+msgid "Exponent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:26
+msgid "Exponentiation"
+msgstr "Exponenciação"
+
+#: ../canfestival/canfestival.py:186
+msgid "Export CanOpen slave to EDS file"
+msgstr "Exportar escravo CANopen para arquivo EDS"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
+msgid "Export graph values to clipboard"
+msgstr ""
+
+#: ../canfestival/canfestival.py:185
+msgid "Export slave"
+msgstr "Exportar escravo"
+
+#: ../dialogs/FBDVariableDialog.py:94
+msgid "Expression:"
+msgstr "Expressão:"
+
+#: ../controls/VariablePanel.py:90
+msgid "External"
+msgstr "Externo"
+
+#: ../ProjectController.py:826
+msgid "Extracting Located Variables...\n"
+msgstr "Extraindo Variáveis Alocadas...\n"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "FBD"
+msgstr "FBD"
+
+#: ../ProjectController.py:1773
+msgid "Failed : Must build before transfer.\n"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
+msgid "Falling Edge"
+msgstr "Borda de descida"
+
+#: ../ProjectController.py:1098
+msgid "Fatal : cannot get builder.\n"
+msgstr ""
+
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
+msgid "Field %s hasn't a valid value!"
+msgstr "Campo %s não tem valor válido!"
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
+msgid "Fields %s haven't a valid value!"
+msgstr "Campos %s não possuem valor válido!"
+
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr "Arquivo '%s' já existe!"
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
+msgid "Find"
+msgstr "Localizar"
+
+#: ../IDEFrame.py:379
+msgid "Find Next"
+msgstr "Localizar Próximo"
+
+#: ../IDEFrame.py:381
+msgid "Find Previous"
+msgstr "Localizar Anterior"
+
+#: ../plcopen/iec_std.csv:90
+msgid "Find position"
+msgstr "Localizar posiçã"
+
+#: ../dialogs/FindInPouDialog.py:58
+msgid "Find:"
+msgstr "Localizar:"
+
+#: ../editors/Viewer.py:1633
+msgid "Force value"
+msgstr "Forçar valor"
+
+#: ../dialogs/ForceVariableDialog.py:176
+msgid "Forcing Variable Value"
+msgstr "Forçando valor de variável"
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
+#, python-format
+msgid "Form isn't complete. %s must be filled!"
+msgstr "O formulário não está completo. %s deve ser preenchido!"
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
+msgid "Form isn't complete. Name must be filled!"
+msgstr "O formulário não está completo. O nome deve ser preenchido!"
+
+#: ../dialogs/FBDBlockDialog.py:235
+msgid "Form isn't complete. Valid block type must be selected!"
+msgstr ""
+"O formulário não está completo. Deve ser selecionado um tipo de bloco "
+"válido."
+
+#: ../dialogs/FindInPouDialog.py:75
+msgid "Forward"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
+msgid "Function"
+msgstr "Função"
+
+#: ../IDEFrame.py:354
+msgid "Function &Block"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
+msgid "Function Block"
+msgstr ""
+
+#: ../controls/VariablePanel.py:868
+msgid "Function Block Types"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Function Blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:290
+msgid "Function Blocks can't be used in Functions!"
+msgstr ""
+
+#: ../PLCControler.py:1907
+#, python-format
+msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Functions"
+msgstr ""
+
+#: ../PLCOpenEditor.py:88
+msgid "Generate Program"
+msgstr "Gerar Programa"
+
+#: ../ProjectController.py:722
+msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+msgstr "Gerando código do SoftPLC IEC-61131 ST/IL/SFC...\n"
+
+#: ../controls/VariablePanel.py:91
+msgid "Global"
+msgstr "Global"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
+msgid "Go to current value"
+msgstr "Ir para valor atua"
+
+#: ../controls/ProjectPropertiesPanel.py:189
+msgid "Graphics"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Greater than"
+msgstr "Maior que"
+
+#: ../plcopen/iec_std.csv:76
+msgid "Greater than or equal to"
+msgstr "Maior que ou igual a"
+
+#: ../controls/ProjectPropertiesPanel.py:149
+msgid "Grid Resolution:"
+msgstr ""
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:135
+msgid "Height:"
+msgstr "Altura:"
+
+#: ../editors/FileManagementPanel.py:89
+msgid "Home Directory:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:165
+msgid "Horizontal:"
+msgstr "Horizontal:"
+
+#: ../dialogs/DurationEditorDialog.py:47
+msgid "Hours:"
+msgstr "Horas:"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "IL"
+msgstr "IL"
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr "IP"
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
+msgid "IP is not valid!"
+msgstr "IP inválido!"
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
+msgid "Import SVG"
+msgstr "Importar SVG"
+
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
+msgid "InOut"
+msgstr ""
+
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr "Inativo"
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr "Tipos de dados incompatíveis entre \"{a1}\" e \"{a2}\""
+
+#: ../controls/VariablePanel.py:306
+#, python-format
+msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+msgstr "Tipo de dado incompatível entre \"1%s\" e \"BOOL\""
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr "Tamanho de dado incompatível entre \"{a1}\" e \"{a2}\""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Indicator"
+msgstr "Indicador"
+
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr "Inicial"
+
+#: ../editors/Viewer.py:650
+msgid "Initial Step"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
+msgid "Initial Value"
+msgstr "Valor Inicial"
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
+msgid "Initial Value:"
+msgstr "Valor Inicial:"
+
+#: ../svgui/svgui.py:56
+msgid "Inkscape"
+msgstr "Inkscape"
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
+msgid "Inline"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Input"
+msgstr "Entrada"
+
+#: ../dialogs/FBDBlockDialog.py:99
+msgid "Inputs:"
+msgstr "Entradas:"
+
+#: ../plcopen/iec_std.csv:87
+msgid "Insertion (into)"
+msgstr "Inserção (em)"
+
+#: ../plcopen/plcopen.py:1948
+#, python-format
+msgid "Instance with id %d doesn't exist!"
+msgstr "Instância com ID %d não existe!"
+
+#: ../editors/ResourceEditor.py:279
+msgid "Instances:"
+msgstr "Instâncias:"
+
+#: ../controls/VariablePanel.py:88
+msgid "Interface"
+msgstr "Interface"
+
+#: ../editors/ResourceEditor.py:81
+msgid "Interrupt"
+msgstr "Interromper"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Interval"
+msgstr "Intervalo"
+
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+"URL inválido!\n"
+"Por favor entre com um endereço URL correto."
+
+#: ../PLCControler.py:1895
+msgid "Invalid plcopen element(s)!!!"
+msgstr "Elemento(s) do PLCOpen inválido(s)!"
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr "Tipo inválido  \"{a1}\"-> {a2} != {a3} para localização \"{a4}\""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr "Tipo inválido \"{a1}\"-> {a2} != {a3} para localização \"{a4}\""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
+#, python-format
+msgid "Invalid value \"%s\" for debug variable"
+msgstr "Valor inválido \"%s\" para variável de depuração"
+
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
+msgid "Invalid value \"%s\" for variable grid element"
+msgstr ""
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
+#, python-format
+msgid "Invalid value \"%s\" for viewer block"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr "Valor inválido \"{a1}\" para variável \"{a2}\""
+
+#: ../dialogs/DurationEditorDialog.py:124
+msgid ""
+"Invalid value!\n"
+"You must fill a numeric value."
+msgstr ""
+"Valor inválido.\n"
+"Você deve inserir um valor numérico."
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr "A conexão é segura?"
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
+msgid "Jump"
+msgstr "Salto"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "LD"
+msgstr "LD"
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
+#, python-format
+msgid "Ladder element with id %d is on more than one rung."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
+msgid "Language"
+msgstr "Idioma"
+
+#: ../controls/ProjectPropertiesPanel.py:206
+msgid "Language (optional):"
+msgstr "Idioma (opcional):"
+
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
+msgid "Language:"
+msgstr "Idioma:"
+
+#: ../ProjectController.py:1779
+msgid "Latest build already matches current target. Transfering anyway...\n"
+msgstr ""
+"Última construção já idêntica com o alvo atual. Transferindo mesmo "
+"assim...\n"
+
+#: ../Beremiz_service.py:281
+msgid "Launch WX GUI inspector"
+msgstr "Iniciar Inspetor WX GUI "
+
+#: ../Beremiz_service.py:280
+msgid "Launch a live Python shell"
+msgstr ""
+
+#: ../editors/Viewer.py:580
+msgid "Left"
+msgstr "Esquerdo"
+
+#: ../dialogs/LDPowerRailDialog.py:64
+msgid "Left PowerRail"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Length of string"
+msgstr "Comprimento da \"string\""
+
+#: ../plcopen/iec_std.csv:78
+msgid "Less than"
+msgstr "Menos que"
+
+#: ../plcopen/iec_std.csv:79
+msgid "Less than or equal to"
+msgstr "Menor que ou igual a"
+
+#: ../IDEFrame.py:652
+msgid "Library"
+msgstr "Biblioteca"
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr "Licença"
+
+#: ../plcopen/iec_std.csv:73
+msgid "Limitation"
+msgstr "Limitação"
+
+#: ../targets/toolchain_gcc.py:209
+msgid "Linking :\n"
+msgstr "Linkando:\n"
+
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
+msgid "Local"
+msgstr "Local"
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr ""
+
+#: ../ProjectController.py:1685
+msgid "Local service discovery failed!\n"
+msgstr "Falha na descoberta de serviço local!\n"
+
+#: ../controls/VariablePanel.py:62
+msgid "Location"
+msgstr "Localização"
+
+#: ../dialogs/BrowseLocationsDialog.py:79
+msgid "Locations available:"
+msgstr "Localizações disponíveis:"
+
+#: ../plcopen/iec_std.csv:25
+msgid "Logarithm to base 10"
+msgstr "Logaritmo para base 10"
+
+#: ../connectors/PYRO/__init__.py:102
+#, python-format
+msgid "MDNS resolution failure for '%s'\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
+msgid "Map Variable"
+msgstr "Mapear Variável"
+
+#: ../features.py:31
+msgid "Map located variables over CANopen"
+msgstr "Mapear variáveis alocadas por CANopen"
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr "Mapear variáveis alocadas por Modbus"
+
+#: ../canfestival/NetworkEditor.py:113
+msgid "Master"
+msgstr "Mestre"
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr ""
+
+#: ../plcopen/iec_std.csv:71
+msgid "Maximum"
+msgstr "Máximo"
+
+#: ../editors/DataTypeEditor.py:246
+msgid "Maximum:"
+msgstr "Máximo:"
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Memory"
+msgstr "Memória"
+
+#: ../IDEFrame.py:617
+msgid "Menu ToolBar"
+msgstr "Barra de ferramentas Menu"
+
+#: ../dialogs/DurationEditorDialog.py:51
+msgid "Microseconds:"
+msgstr "Microssegundos:"
+
+#: ../editors/Viewer.py:585
+msgid "Middle"
+msgstr "Meio"
+
+#: ../dialogs/DurationEditorDialog.py:50
+msgid "Milliseconds:"
+msgstr "Milissegundos:"
+
+#: ../plcopen/iec_std.csv:72
+msgid "Minimum"
+msgstr "Mínimo"
+
+#: ../editors/DataTypeEditor.py:233
+msgid "Minimum:"
+msgstr "Mínimo:"
+
+#: ../dialogs/DurationEditorDialog.py:48
+msgid "Minutes:"
+msgstr "Minutos:"
+
+#: ../controls/ProjectPropertiesPanel.py:231
+msgid "Miscellaneous"
+msgstr "Miscelânea"
+
+#: ../features.py:32
+msgid "Modbus support"
+msgstr "Suporte Modbus"
+
+#: ../dialogs/LDElementDialog.py:65
+msgid "Modifier:"
+msgstr "Modificador:"
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+"Mais de um conector encontrado correspondente a continuação \"{a1}\" no POU "
+"\"{a2}\""
+
+#: ../dialogs/ActionBlockDialog.py:146
+msgid "Move action down"
+msgstr "Mover ação para baixo"
+
+#: ../dialogs/ActionBlockDialog.py:145
+msgid "Move action up"
+msgstr "Mover ação para cima"
+
+#: ../controls/CustomEditableListBox.py:46
+msgid "Move down"
+msgstr "Mover para baixo"
+
+#: ../editors/DataTypeEditor.py:367
+msgid "Move element down"
+msgstr "Mover elemento para baixo"
+
+#: ../editors/DataTypeEditor.py:366
+msgid "Move element up"
+msgstr "Mover elemento para cima"
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr "Mover instância para baixo"
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr "Mover instância para cima"
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:254
+msgid "Move task up"
+msgstr ""
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
+msgid "Move the view"
+msgstr "Mover a visualização"
+
+#: ../controls/CustomEditableListBox.py:45
+msgid "Move up"
+msgstr "Mover para cima"
+
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
+msgid "Move variable down"
+msgstr "Mover variável para baixo"
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
+msgid "Move variable up"
+msgstr "Mover variável para cima"
+
+#: ../plcopen/iec_std.csv:74
+msgid "Multiplexer (select 1 of N)"
+msgstr "Multiplexador (selecione 1 de N)"
+
+#: ../plcopen/iec_std.csv:34
+msgid "Multiplication"
+msgstr "Multiplicação"
+
+#: ../editors/FileManagementPanel.py:87
+msgid "My Computer:"
+msgstr "Meu Computador:"
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr "NOME"
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
+#: ../controls/VariablePanel.py:59
+msgid "Name"
+msgstr "Nome"
+
+#: ../Beremiz_service.py:342
+msgid "Name must not be null!"
+msgstr "Nome deve ser não-nulo!"
+
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
+msgid "Name:"
+msgstr "Nome:"
+
+#: ../plcopen/iec_std.csv:24
+msgid "Natural logarithm"
+msgstr "Logaritmo natural"
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
+msgid "Negated"
+msgstr "Negado"
+
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr "Falha no serviço Nevow Web."
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr "Falha na importação Nevow/Athena:"
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
+msgid "New"
+msgstr "Novo"
+
+#: ../controls/CustomEditableListBox.py:43
+msgid "New item"
+msgstr "Novo item"
+
+#: ../editors/Viewer.py:553
+msgid "No Modifier"
+msgstr "Sem Modificador"
+
+#: ../ProjectController.py:1808
+msgid "No PLC to transfer (did build succeed ?)\n"
+msgstr "Sem CLP para transferir (a construção foi bem-sucedida?)\n"
+
+#: ../PLCGenerator.py:1678
+#, python-format
+msgid "No body defined in \"%s\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCOpenEditor.py:331
+msgid ""
+"No documentation available.\n"
+"Coming soon."
+msgstr ""
+"Sem documentação disponível.\n"
+"Em breve."
+
+#: ../PLCGenerator.py:841
+#, python-format
+msgid "No informations found for \"%s\" block"
+msgstr "Nenhuma informação encontrada para o bloco \"%s\" "
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+"Nenhuma variável de saída {a1} encontrada no bloco {a2} no POU {a3}. Conexão"
+" deve estar interrompida"
+
+#: ../controls/SearchResultPanel.py:175
+msgid "No search results available."
+msgstr "Sem resultados de busca disponíveis."
+
+#: ../svgui/svgui.py:142
+#, python-format
+msgid "No such SVG file: %s\n"
+msgstr "Nenhum arquivo SVG: %s\n"
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr ""
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+msgid "No valid value selected!"
+msgstr "Nenhum valor válido selecionado!"
+
+#: ../PLCGenerator.py:1676
+#, python-format
+msgid "No variable defined in \"%s\" POU"
+msgstr "Nenhuma variável definida no POU \"%s\""
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr "ID de nó inexistente: {a1} (variável {a2})"
+
+#: ../controls/VariablePanel.py:79
+msgid "Non-Retain"
+msgstr "Não-Reter"
+
+#: ../dialogs/LDElementDialog.py:78
+msgid "Normal"
+msgstr "Normal"
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:80
+msgid "Not equal to"
+msgstr "Não igual a"
+
+#: ../dialogs/SFCDivergenceDialog.py:91
+msgid "Number of sequences:"
+msgstr "Número de sequências:"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Numerical"
+msgstr "Numérico"
+
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:88
+msgid "Only Elements"
+msgstr ""
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
+msgid "Open"
+msgstr "Abrir"
+
+#: ../svgui/svgui.py:151
+msgid "Open Inkscape"
+msgstr "Abrir Inkscape"
+
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+"Framework Open Source para automação, IDE implementada IEC 61131 com um "
+"conjunto constantemente crescente de extensões e ambiente flexível para CLP."
+
+#: ../ProjectController.py:1879
+msgid "Open a file explorer to manage project files"
+msgstr "Abrir um explorador de arquivos para gerenciar arquivos de projeto"
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
+msgid "Open wxGlade"
+msgstr "Abrir wxGlade"
+
+#: ../controls/VariablePanel.py:64
+msgid "Option"
+msgstr "Opção"
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
+msgid "Options"
+msgstr "Opções"
+
+#: ../controls/ProjectPropertiesPanel.py:109
+msgid "Organization (optional):"
+msgstr "Organização (opcional):"
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
+msgid "Other Profile"
+msgstr "Outro Perfil"
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Output"
+msgstr "Saída"
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
+msgid "PDO Receive"
+msgstr "PDO Receber"
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
+msgid "PDO Transmit"
+msgstr "PDO Transmitir"
+
+#: ../targets/toolchain_gcc.py:174
+msgid "PLC :\n"
+msgstr "CLP:\n"
+
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr "Log do CLP:"
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr "Falha na geração de código do CLP!\n"
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr "O CLP está vazio ou já iniciado."
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr "O CLP não está iniciado."
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+"Erro de sintaxe no CLP na linha {a1}:\n"
+"{a2}"
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
+msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
+msgstr "Arquivos PLCOpen (*.xml)|*.xml|Todos os arquivos|*.*"
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
+msgid "PLCOpenEditor"
+msgstr "PLCOpenEditor"
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+"O PLCOpen Editor é parte do projeto Beremiz.\n"
+"\n"
+"Beremiz é um"
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr "PORTA"
+
+#: ../dialogs/PouDialog.py:109
+msgid "POU Name"
+msgstr "Nome do POU"
+
+#: ../dialogs/PouDialog.py:66
+msgid "POU Name:"
+msgstr "Nome do POU:"
+
+#: ../dialogs/PouDialog.py:111
+msgid "POU Type"
+msgstr "Tipo do POU"
+
+#: ../dialogs/PouDialog.py:73
+msgid "POU Type:"
+msgstr "Tipo do POU:"
+
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr "PYRO conectando à URI : %s\n"
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr "PYRO utilizando certificados em '%s' \n"
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
+msgid "Page Setup"
+msgstr "Configurar Página"
+
+#: ../controls/ProjectPropertiesPanel.py:124
+msgid "Page Size (optional):"
+msgstr "Tamanho da Página (opcional):"
+
+#: ../IDEFrame.py:2640
+#, python-format
+msgid "Page: %d"
+msgstr "Página: %d"
+
+#: ../controls/PouInstanceVariablesPanel.py:134
+msgid "Parent instance"
+msgstr ""
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
+msgid "Paste"
+msgstr "Colar"
+
+#: ../IDEFrame.py:1899
+msgid "Paste POU"
+msgstr "Colar POU"
+
+#: ../dialogs/SearchInProjectDialog.py:60
+msgid "Pattern to search:"
+msgstr "Padrão para pesquisar:"
+
+#: ../dialogs/LDPowerRailDialog.py:75
+msgid "Pin number:"
+msgstr ""
+
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
+msgid "Please choose a target"
+msgstr "Por favor escolha um alvo"
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr "Por favor insira um nome para o bloco"
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
+msgid "Please enter comment text"
+msgstr "Por favor insira texto de comentário"
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
+msgid "Please enter step name"
+msgstr ""
+
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr "Por favor insira o texto"
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
+msgid "Please enter value for a \"%s\" variable:"
+msgstr "Por favor insira um valor para a variável \"%s\":"
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be 0 <= port <= 65535!"
+msgstr "Número da porta deve ser 0 <= porta <= 65535!"
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be an integer!"
+msgstr "Número da porta deve ser um inteiro!"
+
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
+msgid "Power Rail"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:52
+msgid "Power Rail Properties"
+msgstr ""
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
+msgid "Preview"
+msgstr "Previsualização"
+
+#: ../dialogs/BlockPreviewDialog.py:59
+msgid "Preview:"
+msgstr "Previsualização:"
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
+msgid "Print"
+msgstr "Imprimir"
+
+#: ../IDEFrame.py:1110
+msgid "Print preview"
+msgstr "Visualizar impressão"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Priority"
+msgstr "Prioridade"
+
+#: ../dialogs/SFCTransitionDialog.py:91
+msgid "Priority:"
+msgstr "Prioridade:"
+
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr "Problema ao inicializar o CLP: erro \"%d\""
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr "Nome do Produto"
+
+#: ../controls/ProjectPropertiesPanel.py:90
+msgid "Product Name (required):"
+msgstr "Nome do Produto (obrigatório):"
+
+#: ../controls/ProjectPropertiesPanel.py:92
+msgid "Product Release (optional):"
+msgstr "Lançamento do Produto (opcional):"
+
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr "Versão do Produto"
+
+#: ../controls/ProjectPropertiesPanel.py:91
+msgid "Product Version (required):"
+msgstr "Versão do produto (obrigatório):"
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
+msgid "Program"
+msgstr "Programa"
+
+#: ../PLCOpenEditor.py:321
+msgid "Program was successfully generated!"
+msgstr "O programa foi gerado com sucesso!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Programs"
+msgstr "Programas"
+
+#: ../editors/Viewer.py:285
+msgid "Programs can't be used by other POUs!"
+msgstr "Programas não podem ser usados por outros POUs!"
+
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
+msgid "Project"
+msgstr "Projeto"
+
+#: ../controls/SearchResultPanel.py:180
+#, python-format
+msgid "Project '%s':"
+msgstr "Projeto '%s':"
+
+#: ../ProjectController.py:1878
+msgid "Project Files"
+msgstr "Arquivos de Projeto"
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr "Nome do Projeto"
+
+#: ../controls/ProjectPropertiesPanel.py:88
+msgid "Project Name (required):"
+msgstr "Nome do Projeto (obrigatório):"
+
+#: ../controls/ProjectPropertiesPanel.py:89
+msgid "Project Version (optional):"
+msgstr "Versão do Produto (opcional):"
+
+#: ../PLCControler.py:2717
+msgid ""
+"Project file syntax error:\n"
+"\n"
+msgstr ""
+"Erro de sintaxe no arquivo do projeto:\n"
+"\n"
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
+msgid "Project properties"
+msgstr "Propriedades do projeto"
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr ""
+"Layout da árvore de projeto não compatível com confnode.xml {a1}!={a2}"
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Properties"
+msgstr "Propriedades"
+
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr "Publicando serviço na rede local"
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr "Exceção do Pyro: %s \n"
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr "Porta do Pyro:"
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr "Código Python"
+
+#: ../features.py:34
+msgid "Python file"
+msgstr "Arquivo Python"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Qualifier"
+msgstr ""
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
+msgid "Quit"
+msgstr "Fechar"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
+msgid "Range:"
+msgstr "Faixa:"
+
+#: ../ProjectController.py:1872
+msgid "Raw IEC code"
+msgstr ""
+
+#: ../BeremizIDE.py:1083
+#, python-format
+msgid "Really delete node '%s'?"
+msgstr "Deseja realmente excluir o nó '%s'?"
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
+msgid "Redo"
+msgstr "Refazer"
+
+#: ../dialogs/SFCTransitionDialog.py:76
+msgid "Reference"
+msgstr "Referência"
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
+msgid "Refresh"
+msgstr "Atualizar"
+
+#: ../dialogs/SearchInProjectDialog.py:70
+msgid "Regular expression"
+msgstr "Expressão regular"
+
+#: ../dialogs/FindInPouDialog.py:99
+msgid "Regular expressions"
+msgstr "Expressões regulares"
+
+#: ../editors/Viewer.py:1636
+msgid "Release value"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:37
+msgid "Remainder (modulo)"
+msgstr "Resto (módulo)"
+
+#: ../BeremizIDE.py:1084
+#, python-format
+msgid "Remove %s node"
+msgstr "Remover nó %s"
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr ""
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr "Remover POU"
+
+#: ../dialogs/ActionBlockDialog.py:144
+msgid "Remove action"
+msgstr "Remover ação"
+
+#: ../editors/DataTypeEditor.py:365
+msgid "Remove element"
+msgstr "Remover elemento"
+
+#: ../editors/FileManagementPanel.py:66
+msgid "Remove file from left folder"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:284
+msgid "Remove instance"
+msgstr "Remover instância"
+
+#: ../canfestival/NetworkEditor.py:111
+msgid "Remove slave"
+msgstr "Remover escravo"
+
+#: ../editors/ResourceEditor.py:253
+msgid "Remove task"
+msgstr "Remover tarefa"
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
+msgid "Remove variable"
+msgstr "Remover variável"
+
+#: ../IDEFrame.py:1979
+msgid "Rename"
+msgstr "Renomear"
+
+#: ../editors/FileManagementPanel.py:187
+msgid "Replace File"
+msgstr "Substituir arquivo"
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr "Substituir Fio por conexões"
+
+#: ../plcopen/iec_std.csv:89
+msgid "Replacement (within)"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Reset"
+msgstr "Reiniciar"
+
+#: ../editors/Viewer.py:681
+msgid "Reset Execution Order"
+msgstr "Reiniciar Ordem de Execução"
+
+#: ../IDEFrame.py:453
+msgid "Reset Perspective"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:103
+msgid "Reset search result"
+msgstr ""
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
+msgid "Resources"
+msgstr "Recursos"
+
+#: ../controls/VariablePanel.py:77
+msgid "Retain"
+msgstr ""
+
+#: ../controls/VariablePanel.py:455
+msgid "Return Type:"
+msgstr ""
+
+#: ../editors/Viewer.py:582
+msgid "Right"
+msgstr "Direita"
+
+#: ../dialogs/LDPowerRailDialog.py:65
+msgid "Right PowerRail"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
+msgid "Rising Edge"
+msgstr "Borda de Subida"
+
+#: ../plcopen/iec_std.csv:65
+msgid "Rotate left"
+msgstr "Girar para a esquerda"
+
+#: ../plcopen/iec_std.csv:64
+msgid "Rotate right"
+msgstr "Girar para a direita"
+
+#: ../plcopen/iec_std.csv:17
+msgid "Rounding up/down"
+msgstr ""
+
+#: ../ProjectController.py:1828
+msgid "Run"
+msgstr "Rodar"
+
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
+msgid "SDO Client"
+msgstr "Cliente SDO"
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
+msgid "SDO Server"
+msgstr "Servidor SDO"
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "SFC"
+msgstr "SFC"
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr ""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "ST"
+msgstr "ST"
+
+#: ../PLCOpenEditor.py:308
+msgid "ST files (*.st)|*.st|All files|*.*"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "SVG files (*.svg)|*.svg|All files|*.*"
+msgstr ""
+
+#: ../features.py:36
+msgid "SVGUI"
+msgstr "SVGUI"
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
+msgid "Save"
+msgstr "Salvar"
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
+msgid "Save As..."
+msgstr "Salvar Como..."
+
+#: ../BeremizIDE.py:249
+msgid "Save as"
+msgstr "Salvar como"
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:73
+msgid "Scope"
+msgstr ""
+
+#: ../IDEFrame.py:644
+msgid "Search"
+msgstr "Buscar"
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
+msgid "Search in Project"
+msgstr "Buscar no Projeto"
+
+#: ../dialogs/DurationEditorDialog.py:49
+msgid "Seconds:"
+msgstr "Segundos:"
+
+#: ../IDEFrame.py:390
+msgid "Select All"
+msgstr "Selecionar Tudo"
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
+msgid "Select a variable class:"
+msgstr "Selecionar uma classe de variáveis:"
+
+#: ../ProjectController.py:1293
+msgid "Select an editor:"
+msgstr "Selecionar um editor:"
+
+#: ../controls/PouInstanceVariablesPanel.py:292
+msgid "Select an instance"
+msgstr "Selecionar uma instância"
+
+#: ../IDEFrame.py:628
+msgid "Select an object"
+msgstr "Selecionar um objeto"
+
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr "A pasta selecionada já contém outro projeto. Sobrescrever?\n"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Selection"
+msgstr "Seleção"
+
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:65
+msgid "Selection Divergence"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr "Descoberta de Serviços"
+
+#: ../dialogs/DiscoveryDialog.py:104
+msgid "Services available:"
+msgstr "Serviços disponíveis:"
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Set"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Shift left"
+msgstr "Deslocar para a esquerda"
+
+#: ../plcopen/iec_std.csv:63
+msgid "Shift right"
+msgstr "Deslocar para a direita"
+
+#: ../ProjectController.py:1863
+msgid "Show IEC code generated by PLCGenerator"
+msgstr "Mostrar código IEC gerado pelo PLCGenerator"
+
+#: ../canfestival/canfestival.py:407
+msgid "Show Master"
+msgstr "Mostrar Mestre"
+
+#: ../canfestival/canfestival.py:408
+msgid "Show Master generated by config_utils"
+msgstr ""
+
+#: ../ProjectController.py:1862
+msgid "Show code"
+msgstr "Mostrar Código"
+
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:67
+msgid "Simultaneous Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:27
+msgid "Sine"
+msgstr "Seno"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Single"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr ""
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+
+#: ../plcopen/iec_std.csv:23
+msgid "Square root (base 2)"
+msgstr "Raiz quadrada (base 2)"
+
+#: ../plcopen/definitions.py:50
+msgid "Standard function blocks"
+msgstr "Blocos de função padrão"
+
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
+msgid "Start PLC"
+msgstr "Iniciar CLP"
+
+#: ../ProjectController.py:1074
+#, python-format
+msgid "Start build in %s\n"
+msgstr "Iniciar construção em %s\n"
+
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr "Iniciado"
+
+#: ../ProjectController.py:1633
+msgid "Starting PLC\n"
+msgstr "Iniciando CLP\n"
+
+#: ../BeremizIDE.py:393
+msgid "Status ToolBar"
+msgstr "Barra de Status"
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
+msgid "Step"
+msgstr ""
+
+#: ../ProjectController.py:1835
+msgid "Stop"
+msgstr "Parar"
+
+#: ../Beremiz_service.py:272
+msgid "Stop PLC"
+msgstr "Parar PLC"
+
+#: ../ProjectController.py:1836
+msgid "Stop Running PLC"
+msgstr "Parar Execução do CLP"
+
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr "Parado"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Structure"
+msgstr "Estrutura"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Subrange"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:35
+msgid "Subtraction"
+msgstr "Subtração"
+
+#: ../ProjectController.py:1113
+msgid "Successfully built.\n"
+msgstr "Construído com sucesso.\n"
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr "Alterar perspectiva"
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
+msgid "Syntax error in regular expression of pattern to search!"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:29
+msgid "Tangent"
+msgstr "Tangente"
+
+#: ../editors/ResourceEditor.py:97
+msgid "Task"
+msgstr "Tarefa"
+
+#: ../editors/ResourceEditor.py:248
+msgid "Tasks:"
+msgstr "Tarefas:"
+
+#: ../controls/VariablePanel.py:91
+msgid "Temp"
+msgstr "Temporário"
+
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+"O melhor lugar para enviar perguntas sobre o Beremiz/PLCOpen Editor\n"
+"é a lista de e=mails do projeto: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"Este é o canal de suporte principal da comunidade.\n"
+"Para enviar é necessário estar inscrito na lista de e-mail.\n"
+"\n"
+"Você pode se inscrever na lista aqui: https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+
+#: ../editors/FileManagementPanel.py:186
+#, python-format
+msgid ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+msgstr ""
+"O arquivo '%s' já existe.\n"
+"Deseja substituí-lo?"
+
+#: ../editors/LDViewer.py:893
+msgid "The group of block must be coherent!"
+msgstr "O grupo do bloco deve ser coerente!"
+
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
+msgid "There are changes, do you want to save?"
+msgstr "Há mudanças, deseja salvá-la?"
+
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+"Há um POU com o nome \"%s\". Isto pode causar um conflito. Deseja continuar?"
+
+#: ../IDEFrame.py:1133
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+"Houve um problema na impressão.\n"
+"A impressora está configurada corretamente?"
+
+#: ../editors/LDViewer.py:902
+msgid "This option isn't available yet!"
+msgstr "Esta opção ainda não está disponível!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40
+msgid "Time"
+msgstr "Tempo"
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
+msgid "Time addition"
+msgstr "Adição de tempo"
+
+#: ../plcopen/iec_std.csv:86
+msgid "Time concatenation"
+msgstr "Concatenação de tempo"
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
+msgid "Time division"
+msgstr "Divisão de tempo"
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
+msgid "Time multiplication"
+msgstr "Multiplicação de tempo"
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
+msgid "Time subtraction"
+msgstr "Subtração de tempo"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
+msgid "Time-of-day addition"
+msgstr "Adição de hora-do-dia"
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
+msgid "Time-of-day subtraction"
+msgstr "Subtração de hora-do-dia"
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr "Inverter valor"
+
+#: ../editors/Viewer.py:584
+msgid "Top"
+msgstr ""
+
+#: ../ProjectController.py:1848
+msgid "Transfer"
+msgstr "Transferir"
+
+#: ../ProjectController.py:1849
+msgid "Transfer PLC"
+msgstr "Transferir CLP"
+
+#: ../ProjectController.py:1802
+msgid "Transfer completed successfully.\n"
+msgstr "Transferência completada com sucesso.\n"
+
+#: ../ProjectController.py:1805
+msgid "Transfer failed\n"
+msgstr "Falha na transferência.\n"
+
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
+msgid "Transition"
+msgstr "Transição"
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:91
+msgid "Transition Name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:60
+msgid "Transition Name:"
+msgstr ""
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1526
+#, python-format
+msgid "Transition with name %s doesn't exist!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Transitions"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr "Traduzido por"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Triggering"
+msgstr ""
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
+msgid "Type"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr ""
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
+#, python-format
+msgid "Type conflict for location \"%s\""
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Type conversion"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:170
+msgid "Type infos:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
+msgid "Type:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
+#, python-format
+msgid "Unable to define PDO mapping for node %02x"
+msgstr ""
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
+msgid "Unable to get Xenomai's %s \n"
+msgstr ""
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:261
+#, python-format
+msgid "Undefined pou type \"%s\""
+msgstr ""
+
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
+msgid "Undo"
+msgstr "Desfazer"
+
+#: ../ProjectController.py:442
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: ../editors/Viewer.py:437
+#, python-format
+msgid "Unknown variable \"%s\" for this POU!"
+msgstr "Variável desconhecida \"%s\" para este POU!"
+
+#: ../ProjectController.py:439 ../ProjectController.py:440
+msgid "Unnamed"
+msgstr "Sem nome"
+
+#: ../PLCControler.py:263
+#, python-format
+msgid "Unnamed%d"
+msgstr "Sem nome %d"
+
+#: ../controls/VariablePanel.py:308
+#, python-format
+msgid "Unrecognized data size \"%s\""
+msgstr "Tamanho de dado não reconhecido \"%s\""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
+msgid "User Data Types"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
+msgid "User Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "User-defined POUs"
+msgstr "POUs definidos pelo usuário"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Value"
+msgstr "Valor"
+
+#: ../editors/DataTypeEditor.py:267
+msgid "Values:"
+msgstr "Valores:"
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
+msgid "Variable"
+msgstr "Variável"
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:68
+msgid "Variable Properties"
+msgstr "Propriedades da variável"
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
+msgid "Variable class"
+msgstr "Classe da variável"
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
+msgid "Variable don't belong to this POU!"
+msgstr "Variável não pertence a este POU!"
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr "Variável:"
+
+#: ../controls/VariablePanel.py:90
+msgid "Variables"
+msgstr "Variáveis"
+
+#: ../controls/ProjectPropertiesPanel.py:166
+msgid "Vertical:"
+msgstr ""
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr "Falha na conexão com cliente WAMP (%s) ... tentando novamente... "
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr "Perda de conexão com cliente WAMP (%s)... tentando novamente..."
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr "ID WAMP:"
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr "Cliente WAMP conectando a:"
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr "Conexão com cliente WAMP não estabelecida!"
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr "Falha na inicialização de cliente WAMP."
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr "Configuração WAMP incompleta."
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr "Configuração WAMP está faltando."
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr "WAMP conectando a URL: %s\n"
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr "Timeout da conexão WAMP"
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr "Falha na conexão WAMP para '%s'.\n"
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr "Falha na importação WAMP :"
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr "Erro de carregamento WAMP:"
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
+msgid "WXGLADE GUI"
+msgstr ""
+
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
+msgid "Warning"
+msgstr ""
+
+#: ../ProjectController.py:726
+msgid "Warnings in ST/IL/SFC code generator :\n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:82
+msgid "Whole Project"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:134
+msgid "Width:"
+msgstr "Largura:"
+
+#: ../dialogs/FindInPouDialog.py:94
+msgid "Wrap search"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr "Escrito por"
+
+#: ../features.py:35
+msgid "WxGlade GUI"
+msgstr "GUI WxGlade"
+
+#: ../svgui/svgui.py:150
+msgid ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+msgstr ""
+"Você não possui permissão de escrita.\n"
+"Abrir mesmo assim?"
+
+#: ../wxglade_hmi/wxglade_hmi.py:160
+msgid ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+msgstr ""
+"Você não tem permissão de escrita.\n"
+"Abrir WxGlade mesmo assim?"
+
+#: ../ProjectController.py:390
+msgid ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+msgstr ""
+"É necessária permissão para trabalhar no projeto.\n"
+"Trabalhar numa cópia do projeto?"
+
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+
+#: ../editors/LDViewer.py:677
+msgid "You must select the wire where a contact should be added!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
+msgid "You must type a name!"
+msgstr "Você deve digitar um nome!"
+
+#: ../dialogs/ForceVariableDialog.py:209
+msgid "You must type a value!"
+msgstr "Você deve digitar um valor!"
+
+#: ../IDEFrame.py:440
+msgid "Zoom"
+msgstr "Zoom"
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr "dias"
+
+#: ../PLCOpenEditor.py:317
+#, python-format
+msgid "error: %s\n"
+msgstr "erro: %s\n"
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "function"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "functionBlock"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr "horas"
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr "instalação do matiec não encontrada\n"
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr "milissegundos"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr "minutos"
+
+#: ../dialogs/PouDialog.py:36
+msgid "program"
+msgstr "programa"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr "segundos"
+
+#: ../plcopen/iec_std.csv:84
+msgid "string from the middle"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:82
+msgid "string left of"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:83
+msgid "string right of"
+msgstr ""
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr ""
+
+#: ../PLCOpenEditor.py:315
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr ""
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr ""
+
+msgid "CAN_Device"
+msgstr ""
+
+msgid "CAN_Baudrate"
+msgstr ""
+
+msgid "NodeId"
+msgstr ""
+
+msgid "Sync_Align"
+msgstr ""
+
+msgid "Sync_Align_Ratio"
+msgstr ""
+
+msgid "CanFestivalNode"
+msgstr ""
+
+msgid "Sync_TPDOs"
+msgstr ""
+
+msgid "CanFestivalInstance"
+msgstr ""
+
+msgid "CAN_Driver"
+msgstr ""
+
+msgid "Generic"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Xenomai"
+msgstr ""
+
+msgid "XenoConfig"
+msgstr ""
+
+msgid "Compiler"
+msgstr "Compilador"
+
+msgid "CFLAGS"
+msgstr ""
+
+msgid "Linker"
+msgstr ""
+
+msgid "LDFLAGS"
+msgstr ""
+
+msgid "Linux"
+msgstr "Linux"
+
+msgid "Win32"
+msgstr "Win32"
+
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr "Paridade"
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
+msgid "BaseParams"
+msgstr ""
+
+msgid "IEC_Channel"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "BeremizRoot"
+msgstr ""
+
+msgid "TargetType"
+msgstr ""
+
+msgid "Libraries"
+msgstr "Bibliotecas"
+
+msgid "URI_location"
+msgstr ""
+
+msgid "Disable_Extensions"
+msgstr ""
+
+msgid "%(codefile_name)s"
+msgstr ""
+
+msgid "variables"
+msgstr "variáveis"
+
+msgid "variable"
+msgstr "variável"
+
+msgid "name"
+msgstr "nome"
+
+msgid "type"
+msgstr "tipo"
+
+msgid "class"
+msgstr "classe"
+
+msgid "initial"
+msgstr "inicia"
+
+msgid "desc"
+msgstr ""
+
+msgid "onchange"
+msgstr ""
+
+msgid "opts"
+msgstr ""
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr ""
+
+msgid "Preset datetime"
+msgstr ""
+
+msgid "Copy of IN"
+msgstr ""
+
+msgid "Datetime, current or relative to PDT"
+msgstr ""
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+
+msgid "1 = integrate, 0 = hold"
+msgstr ""
+
+msgid "Overriding reset"
+msgstr ""
+
+msgid "Input variable"
+msgstr ""
+
+msgid "Initial value"
+msgstr ""
+
+msgid "Sampling period"
+msgstr ""
+
+msgid "NOT R1"
+msgstr ""
+
+msgid "Integrated output"
+msgstr ""
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr ""
+
+msgid "0 = reset"
+msgstr ""
+
+msgid "Input to be differentiated"
+msgstr ""
+
+msgid "Differentiated output"
+msgstr ""
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+
+msgid "0 - manual , 1 - automatic"
+msgstr "0 - manual, 1 - automático"
+
+msgid "Process variable"
+msgstr ""
+
+msgid "Set point"
+msgstr ""
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr ""
+
+msgid "Proportionality constant"
+msgstr ""
+
+msgid "Reset time"
+msgstr ""
+
+msgid "Derivative time constant"
+msgstr ""
+
+msgid "PV - SP"
+msgstr ""
+
+msgid "FB for integral term"
+msgstr ""
+
+msgid "FB for derivative term"
+msgstr ""
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr ""
+
+msgid "Ramp duration"
+msgstr ""
+
+msgid "BUSY = 1 during ramping period"
+msgstr ""
+
+msgid "Elapsed time of ramp"
+msgstr ""
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr ""
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr ""
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr ""
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+
+msgid "first input parameter"
+msgstr ""
+
+msgid "second input parameter"
+msgstr ""
+
+msgid "first output parameter"
+msgstr ""
+
+msgid "second output parameter"
+msgstr ""
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr ""
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/Beremiz_ro_RO.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4018 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Emil Saracutu <emil_saracutu@yahoo.com>, 2018\n"
+"Language-Team: Romanian (Romania) (https://www.transifex.com/beremiz/teams/75746/ro_RO/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: ro_RO\n"
+"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
+msgid ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "   External"
+msgstr "Extern"
+
+#: ../controls/VariablePanel.py:89
+msgid "   InOut"
+msgstr ""
+
+#: ../controls/VariablePanel.py:89
+msgid "   Input"
+msgstr "Intrare"
+
+#: ../controls/VariablePanel.py:90
+msgid "   Local"
+msgstr "Local"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Output"
+msgstr "Ieșire"
+
+#: ../controls/VariablePanel.py:91
+msgid "   Temp"
+msgstr "Temporar"
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
+#, python-format
+msgid " and %s"
+msgstr "și%s"
+
+#: ../ProjectController.py:1182
+msgid " generation failed !\n"
+msgstr "generare eșuată\n"
+
+#: ../plcopen/plcopen.py:1029
+#, python-format
+msgid "\"%s\" Data Type doesn't exist !!!"
+msgstr "\"%s\" Tipul de dată nu există !"
+
+#: ../plcopen/plcopen.py:1047
+#, python-format
+msgid "\"%s\" POU already exists !!!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1068
+#, python-format
+msgid "\"%s\" POU doesn't exist !!!"
+msgstr ""
+
+#: ../editors/Viewer.py:288
+#, python-format
+msgid "\"%s\" can't use itself!"
+msgstr ""
+
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
+#, python-format
+msgid "\"%s\" config already exists!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:531
+#, python-format
+msgid "\"%s\" configuration already exists !!!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr ""
+
+#: ../IDEFrame.py:1638
+#, python-format
+msgid "\"%s\" data type already exists!"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
+#, python-format
+msgid "\"%s\" element for this pou already exists!"
+msgstr ""
+
+#: ../BeremizIDE.py:928
+#, python-format
+msgid "\"%s\" folder is not a valid Beremiz project\n"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
+#, python-format
+msgid "\"%s\" is a keyword. It can't be used!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:2836
+#, python-format
+msgid "\"%s\" is an invalid value!"
+msgstr ""
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
+msgid "\"%s\" is not a valid folder!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
+#, python-format
+msgid "\"%s\" is not a valid identifier!"
+msgstr ""
+
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr ""
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
+#, python-format
+msgid "\"%s\" pou already exists!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:62
+#, python-format
+msgid "\"%s\" step already exists!"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:566
+#, python-format
+msgid "\"%s\" value already defined!"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
+#, python-format
+msgid "\"%s\" value isn't a valid array dimension!"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
+#, python-format
+msgid ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+msgstr ""
+
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr ""
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr ""
+
+#: ../PLCControler.py:1114
+#, python-format
+msgid "%s Data Types"
+msgstr ""
+
+#: ../PLCControler.py:1097
+#, python-format
+msgid "%s POUs"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
+#, python-format
+msgid "%s Profile"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
+#, python-format
+msgid "%s body don't have instances!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
+#, python-format
+msgid "%s body don't have text!"
+msgstr ""
+
+#: ../IDEFrame.py:388
+msgid "&Add Element"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr ""
+
+#: ../IDEFrame.py:361
+msgid "&Configuration"
+msgstr ""
+
+#: ../IDEFrame.py:350
+msgid "&Data Type"
+msgstr ""
+
+#: ../IDEFrame.py:392
+msgid "&Delete"
+msgstr ""
+
+#: ../IDEFrame.py:342
+msgid "&Display"
+msgstr ""
+
+#: ../IDEFrame.py:341
+msgid "&Edit"
+msgstr ""
+
+#: ../IDEFrame.py:340
+msgid "&File"
+msgstr ""
+
+#: ../IDEFrame.py:352
+msgid "&Function"
+msgstr ""
+
+#: ../IDEFrame.py:343
+msgid "&Help"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr ""
+
+#: ../IDEFrame.py:356
+msgid "&Program"
+msgstr ""
+
+#: ../PLCOpenEditor.py:98
+msgid "&Properties"
+msgstr ""
+
+#: ../BeremizIDE.py:244
+msgid "&Recent Projects"
+msgstr ""
+
+#: ../IDEFrame.py:358
+msgid "&Resource"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:298
+#, python-format
+msgid "(%d matches)"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
+#, python-format
+msgid ", %s"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr ""
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr ""
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr ""
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr ""
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
+#, python-format
+msgid "A POU named \"%s\" already exists!"
+msgstr ""
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:229
+msgid "A location must be selected!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
+#, python-format
+msgid "A variable with \"%s\" as name already exists in this pou!"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr ""
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
+msgid "About"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:22
+msgid "Absolute number"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
+msgid "Action"
+msgstr ""
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
+msgid "Action Block"
+msgstr ""
+
+#: ../dialogs/PouActionDialog.py:89
+msgid "Action Name"
+msgstr ""
+
+#: ../dialogs/PouActionDialog.py:56
+msgid "Action Name:"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1567
+#, python-format
+msgid "Action with name %s doesn't exist!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Actions"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:139
+msgid "Actions:"
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
+msgid "Add"
+msgstr ""
+
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
+msgid "Add Action"
+msgstr ""
+
+#: ../features.py:33
+msgid "Add C code accessing located variables synchronously"
+msgstr ""
+
+#: ../IDEFrame.py:1907
+msgid "Add Configuration"
+msgstr ""
+
+#: ../IDEFrame.py:1887
+msgid "Add DataType"
+msgstr ""
+
+#: ../editors/Viewer.py:609
+msgid "Add Divergence Branch"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:121
+msgid "Add IP"
+msgstr ""
+
+#: ../IDEFrame.py:1895
+msgid "Add POU"
+msgstr ""
+
+#: ../features.py:34
+msgid "Add Python code executed asynchronously"
+msgstr ""
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
+msgid "Add Resource"
+msgstr ""
+
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
+msgid "Add Transition"
+msgstr ""
+
+#: ../editors/Viewer.py:596
+msgid "Add Wire Segment"
+msgstr ""
+
+#: ../editors/SFCViewer.py:447
+msgid "Add a new initial step"
+msgstr ""
+
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
+msgid "Add a new jump"
+msgstr ""
+
+#: ../editors/SFCViewer.py:469
+msgid "Add a new step"
+msgstr ""
+
+#: ../features.py:35
+msgid "Add a simple WxGlade based GUI."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:143
+msgid "Add action"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:364
+msgid "Add element"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:283
+msgid "Add instance"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:110
+msgid "Add slave"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:252
+msgid "Add task"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
+msgid "Add variable"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:33
+msgid "Addition"
+msgstr ""
+
+#: ../plcopen/definitions.py:51
+msgid "Additional function blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr ""
+
+#: ../editors/Viewer.py:1720
+msgid "Alignment"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
+msgid "All"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:37
+msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+msgstr ""
+
+#: ../ProjectController.py:1670
+msgid "Already connected. Please disconnect\n"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:607
+#, python-format
+msgid "An element named \"%s\" already exists in this structure!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:31
+msgid "Arc cosine"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:30
+msgid "Arc sine"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:32
+msgid "Arc tangent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:33
+msgid "Arithmetic"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
+msgid "Array"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:39
+msgid "Assignment"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:226
+msgid "At least a variable or an expression must be selected!"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:111
+msgid "Author"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:108
+msgid "Author Name (optional):"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:80
+msgid "Backward"
+msgstr ""
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
+#, python-format
+msgid "Bad location size : %s"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
+msgid "Base Type:"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
+msgid "Base Types"
+msgstr ""
+
+#: ../BeremizIDE.py:483
+msgid "Beremiz"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:70
+msgid "Binary selection (1 of 2)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Bit-shift"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise AND"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:67
+msgid "Bitwise OR"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:68
+msgid "Bitwise XOR"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:69
+msgid "Bitwise inverting"
+msgstr ""
+
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
+msgid "Block"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:63
+msgid "Block Properties"
+msgstr ""
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr ""
+
+#: ../editors/Viewer.py:586
+msgid "Bottom"
+msgstr ""
+
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
+msgid "Browse %s values library"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:72
+msgid "Browse Locations"
+msgstr ""
+
+#: ../ProjectController.py:1815
+msgid "Build"
+msgstr ""
+
+#: ../ProjectController.py:1335
+msgid "Build directory already clean\n"
+msgstr ""
+
+#: ../ProjectController.py:1816
+msgid "Build project into build folder"
+msgstr ""
+
+#: ../ProjectController.py:1108
+msgid "C Build crashed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1105
+msgid "C Build failed.\n"
+msgstr ""
+
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr ""
+
+#: ../ProjectController.py:1186
+msgid "C code generated successfully.\n"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:199
+#, python-format
+msgid "C compilation of %s failed.\n"
+msgstr ""
+
+#: ../features.py:33
+msgid "C extension"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr ""
+
+#: ../features.py:31
+msgid "CANopen support"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
+msgid "Can only generate execution order on FBD networks!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:291
+msgid "Can only give a location to local or global variables"
+msgstr ""
+
+#: ../PLCOpenEditor.py:318
+#, python-format
+msgid "Can't generate program to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:289
+msgid "Can't give a location to a function block instance"
+msgstr ""
+
+#: ../PLCOpenEditor.py:363
+#, python-format
+msgid "Can't save project to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:339
+msgid "Can't set an initial value to a function block instance"
+msgstr ""
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr ""
+
+#: ../ConfigTreeNode.py:454
+#, python-format
+msgid "Cannot find lower free IEC channel than %d\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:139
+msgid "Cannot get PLC status - connection failed.\n"
+msgstr ""
+
+#: ../ProjectController.py:967
+msgid "Cannot open/parse VARIABLES.csv!\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
+msgid "Case sensitive"
+msgstr ""
+
+#: ../editors/Viewer.py:581
+msgid "Center"
+msgstr ""
+
+#: ../Beremiz_service.py:276
+msgid "Change IP of interface to bind"
+msgstr ""
+
+#: ../Beremiz_service.py:275
+msgid "Change Name"
+msgstr ""
+
+#: ../IDEFrame.py:1977
+msgid "Change POU Type To"
+msgstr ""
+
+#: ../Beremiz_service.py:277
+msgid "Change Port Number"
+msgstr ""
+
+#: ../Beremiz_service.py:278
+msgid "Change working directory"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Character string"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "Choose a SVG file"
+msgstr ""
+
+#: ../ProjectController.py:561
+msgid "Choose a directory to save project"
+msgstr ""
+
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
+msgid "Choose a file"
+msgstr ""
+
+#: ../BeremizIDE.py:900
+msgid "Choose a project"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
+msgid "Choose a value for %s:"
+msgstr ""
+
+#: ../Beremiz_service.py:333
+msgid "Choose a working directory "
+msgstr ""
+
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr ""
+
+#: ../ProjectController.py:468
+msgid "Chosen folder doesn't contain a program. It's not a valid project!"
+msgstr ""
+
+#: ../ProjectController.py:435
+msgid "Chosen folder isn't empty. You can't use it for a new project!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:60
+msgid "Class"
+msgstr ""
+
+#: ../controls/VariablePanel.py:472
+msgid "Class Filter:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:74
+msgid "Class:"
+msgstr ""
+
+#: ../ProjectController.py:1821
+msgid "Clean"
+msgstr ""
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr ""
+
+#: ../ProjectController.py:1822
+msgid "Clean project build folder"
+msgstr ""
+
+#: ../ProjectController.py:1332
+msgid "Cleaning the build directory\n"
+msgstr ""
+
+#: ../IDEFrame.py:437
+msgid "Clear Errors"
+msgstr ""
+
+#: ../editors/Viewer.py:680
+msgid "Clear Execution Order"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr ""
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
+msgid "Close Application"
+msgstr ""
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
+msgid "Close Project"
+msgstr ""
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
+msgid "Close Tab"
+msgstr ""
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
+msgid "Coil"
+msgstr ""
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
+msgid "Comment"
+msgstr ""
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:106
+msgid "Company Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:107
+msgid "Company URL (optional):"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Comparison"
+msgstr ""
+
+#: ../ProjectController.py:756
+msgid "Compiling IEC Program into C code...\n"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:85
+msgid "Concatenation"
+msgstr ""
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr ""
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:43
+msgid "Configuration"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Configurations"
+msgstr ""
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr ""
+
+#: ../ProjectController.py:1842
+msgid "Connect"
+msgstr ""
+
+#: ../ProjectController.py:1843
+msgid "Connect to the target PLC"
+msgstr ""
+
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
+msgid "Connection"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:55
+msgid "Connection Properties"
+msgstr ""
+
+#: ../ProjectController.py:1691
+msgid "Connection canceled!\n"
+msgstr ""
+
+#: ../ProjectController.py:1714
+#, python-format
+msgid "Connection failed to %s!\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
+msgid "Connection to '%s' failed.\n"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
+msgid "Connector"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:68
+msgid "Connectors:"
+msgstr ""
+
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr ""
+
+#: ../controls/VariablePanel.py:75
+msgid "Constant"
+msgstr ""
+
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
+msgid "Contact"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:217
+msgid "Content Description (optional):"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
+msgid "Continuation"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:18
+msgid "Conversion from BCD"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:19
+msgid "Conversion to BCD"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:21
+msgid "Conversion to date"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:20
+msgid "Conversion to time-of-day"
+msgstr ""
+
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
+msgid "Copy"
+msgstr ""
+
+#: ../IDEFrame.py:1964
+msgid "Copy POU"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:68
+msgid "Copy file from left folder to right"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:67
+msgid "Copy file from right folder to left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:28
+msgid "Cosine"
+msgstr ""
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr ""
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../PLCControler.py:552
+msgid "Couldn't paste non-POU object."
+msgstr ""
+
+#: ../ProjectController.py:1636
+msgid "Couldn't start PLC !\n"
+msgstr ""
+
+#: ../ProjectController.py:1644
+msgid "Couldn't stop PLC !\n"
+msgstr ""
+
+#: ../svgui/svgui.py:57
+msgid "Create HMI"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:54
+msgid "Create a new POU"
+msgstr ""
+
+#: ../dialogs/PouActionDialog.py:45
+msgid "Create a new action"
+msgstr ""
+
+#: ../IDEFrame.py:166
+msgid "Create a new action block"
+msgstr ""
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
+msgid "Create a new block"
+msgstr ""
+
+#: ../IDEFrame.py:139
+msgid "Create a new branch"
+msgstr ""
+
+#: ../IDEFrame.py:133
+msgid "Create a new coil"
+msgstr ""
+
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
+msgid "Create a new comment"
+msgstr ""
+
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
+msgid "Create a new connection"
+msgstr ""
+
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
+msgid "Create a new contact"
+msgstr ""
+
+#: ../IDEFrame.py:169
+msgid "Create a new divergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:54
+msgid "Create a new divergence or convergence"
+msgstr ""
+
+#: ../IDEFrame.py:157
+msgid "Create a new initial step"
+msgstr ""
+
+#: ../IDEFrame.py:172
+msgid "Create a new jump"
+msgstr ""
+
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
+msgid "Create a new power rail"
+msgstr ""
+
+#: ../IDEFrame.py:130
+msgid "Create a new rung"
+msgstr ""
+
+#: ../IDEFrame.py:160
+msgid "Create a new step"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
+msgid "Create a new transition"
+msgstr ""
+
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
+msgid "Create a new variable"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr ""
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr ""
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
+msgid "Cut"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Cyclic"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:60
+msgid "DEPRECATED"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
+msgid "DS-301 Profile"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
+msgid "DS-302 Profile"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:39
+msgid "Data Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Data Types"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Data type conversion"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
+msgid "Date addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
+msgid "Date and time subtraction"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
+msgid "Date subtraction"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:46
+msgid "Days:"
+msgstr ""
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:144
+msgid "Debug instance"
+msgstr ""
+
+#: ../editors/Viewer.py:490
+#, python-format
+msgid "Debug: %s"
+msgstr ""
+
+#: ../ProjectController.py:1471
+#, python-format
+msgid "Debug: Unknown variable '%s'\n"
+msgstr ""
+
+#: ../ProjectController.py:1469
+#, python-format
+msgid "Debug: Unsupported type to debug '%s'\n"
+msgstr ""
+
+#: ../IDEFrame.py:660
+msgid "Debugger"
+msgstr ""
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr ""
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
+msgid "Delete"
+msgstr ""
+
+#: ../editors/Viewer.py:610
+msgid "Delete Divergence Branch"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:157
+msgid "Delete File"
+msgstr ""
+
+#: ../editors/Viewer.py:597
+msgid "Delete Wire Segment"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:44
+msgid "Delete item"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:88
+msgid "Deletion (within)"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:161
+msgid "Derivation Type:"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr ""
+
+#: ../controls/VariablePanel.py:463
+msgid "Description:"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
+msgid "Dimensions:"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:69
+msgid "Direction"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:102
+msgid "Direction:"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Directly"
+msgstr ""
+
+#: ../ProjectController.py:1855
+msgid "Disconnect"
+msgstr ""
+
+#: ../ProjectController.py:1856
+msgid "Disconnect from PLC"
+msgstr ""
+
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr ""
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
+msgid "Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:36
+msgid "Division"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:156
+#, python-format
+msgid "Do you really want to delete the file '%s'?"
+msgstr ""
+
+#: ../controls/VariablePanel.py:65
+msgid "Documentation"
+msgstr ""
+
+#: ../PLCOpenEditor.py:312
+msgid "Done"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Duration"
+msgstr ""
+
+#: ../canfestival/canfestival.py:174
+msgid "EDS files (*.eds)|*.eds|All files|*.*"
+msgstr ""
+
+#: ../editors/Viewer.py:668
+msgid "Edit Block"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:56
+msgid "Edit Contact Values"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:62
+msgid "Edit Duration"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:53
+msgid "Edit Step"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
+msgid "Edit a WxWidgets GUI with WXGlade"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:127
+msgid "Edit action block properties"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:47
+msgid "Edit array type properties"
+msgstr ""
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
+msgid "Edit comment"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:69
+msgid "Edit file"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:42
+msgid "Edit item"
+msgstr ""
+
+#: ../editors/Viewer.py:3059
+msgid "Edit jump target"
+msgstr ""
+
+#: ../ProjectController.py:1873
+msgid "Edit raw IEC code added to code generated by PLCGenerator"
+msgstr ""
+
+#: ../editors/SFCViewer.py:815
+msgid "Edit step name"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:53
+msgid "Edit transition"
+msgstr ""
+
+#: ../IDEFrame.py:632
+msgid "Editor ToolBar"
+msgstr ""
+
+#: ../ProjectController.py:1294
+msgid "Editor selection"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:360
+msgid "Elements :"
+msgstr ""
+
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr ""
+
+#: ../Beremiz_service.py:341
+msgid "Enter a name "
+msgstr ""
+
+#: ../Beremiz_service.py:326
+msgid "Enter a port number "
+msgstr ""
+
+#: ../Beremiz_service.py:317
+msgid "Enter the IP of the interface to bind"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Enumerated"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:77
+msgid "Equal to"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
+msgid "Error"
+msgstr ""
+
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+
+#: ../ProjectController.py:803
+#, python-format
+msgid "Error : IEC to C compiler returned %d\n"
+msgstr ""
+
+#: ../ProjectController.py:731
+#, python-format
+msgid ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+msgstr ""
+
+#: ../ConfigTreeNode.py:219
+#, python-format
+msgid "Error while saving \"%s\"\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:179
+msgid "Error: Export slave failed\n"
+msgstr ""
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:388
+msgid "Error: No Master generated\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:383
+msgid "Error: No PLC built\n"
+msgstr ""
+
+#: ../ProjectController.py:1708
+#, python-format
+msgid "Exception while connecting %s!\n"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:123
+msgid "Execution Control:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
+msgid "Execution Order:"
+msgstr ""
+
+#: ../features.py:36
+msgid "Experimental web based HMI"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:38
+msgid "Exponent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:26
+msgid "Exponentiation"
+msgstr ""
+
+#: ../canfestival/canfestival.py:186
+msgid "Export CanOpen slave to EDS file"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
+msgid "Export graph values to clipboard"
+msgstr ""
+
+#: ../canfestival/canfestival.py:185
+msgid "Export slave"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:94
+msgid "Expression:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "External"
+msgstr ""
+
+#: ../ProjectController.py:826
+msgid "Extracting Located Variables...\n"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "FBD"
+msgstr ""
+
+#: ../ProjectController.py:1773
+msgid "Failed : Must build before transfer.\n"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
+msgid "Falling Edge"
+msgstr ""
+
+#: ../ProjectController.py:1098
+msgid "Fatal : cannot get builder.\n"
+msgstr ""
+
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
+msgid "Field %s hasn't a valid value!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
+msgid "Fields %s haven't a valid value!"
+msgstr ""
+
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
+msgid "Find"
+msgstr ""
+
+#: ../IDEFrame.py:379
+msgid "Find Next"
+msgstr ""
+
+#: ../IDEFrame.py:381
+msgid "Find Previous"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:90
+msgid "Find position"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:58
+msgid "Find:"
+msgstr ""
+
+#: ../editors/Viewer.py:1633
+msgid "Force value"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:176
+msgid "Forcing Variable Value"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
+#, python-format
+msgid "Form isn't complete. %s must be filled!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
+msgid "Form isn't complete. Name must be filled!"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:235
+msgid "Form isn't complete. Valid block type must be selected!"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:75
+msgid "Forward"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
+msgid "Function"
+msgstr ""
+
+#: ../IDEFrame.py:354
+msgid "Function &Block"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
+msgid "Function Block"
+msgstr ""
+
+#: ../controls/VariablePanel.py:868
+msgid "Function Block Types"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Function Blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:290
+msgid "Function Blocks can't be used in Functions!"
+msgstr ""
+
+#: ../PLCControler.py:1907
+#, python-format
+msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Functions"
+msgstr ""
+
+#: ../PLCOpenEditor.py:88
+msgid "Generate Program"
+msgstr ""
+
+#: ../ProjectController.py:722
+msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Global"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
+msgid "Go to current value"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:189
+msgid "Graphics"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Greater than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:76
+msgid "Greater than or equal to"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:149
+msgid "Grid Resolution:"
+msgstr ""
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:135
+msgid "Height:"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:89
+msgid "Home Directory:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:165
+msgid "Horizontal:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:47
+msgid "Hours:"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "IL"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr ""
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
+msgid "IP is not valid!"
+msgstr ""
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
+msgid "Import SVG"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
+msgid "InOut"
+msgstr ""
+
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr ""
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:306
+#, python-format
+msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Indicator"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr ""
+
+#: ../editors/Viewer.py:650
+msgid "Initial Step"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
+msgid "Initial Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
+msgid "Initial Value:"
+msgstr ""
+
+#: ../svgui/svgui.py:56
+msgid "Inkscape"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
+msgid "Inline"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Input"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:99
+msgid "Inputs:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:87
+msgid "Insertion (into)"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1948
+#, python-format
+msgid "Instance with id %d doesn't exist!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:279
+msgid "Instances:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:88
+msgid "Interface"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Interrupt"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Interval"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+
+#: ../PLCControler.py:1895
+msgid "Invalid plcopen element(s)!!!"
+msgstr ""
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr ""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
+#, python-format
+msgid "Invalid value \"%s\" for debug variable"
+msgstr ""
+
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
+msgid "Invalid value \"%s\" for variable grid element"
+msgstr ""
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
+#, python-format
+msgid "Invalid value \"%s\" for viewer block"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:124
+msgid ""
+"Invalid value!\n"
+"You must fill a numeric value."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr ""
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
+msgid "Jump"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "LD"
+msgstr ""
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
+#, python-format
+msgid "Ladder element with id %d is on more than one rung."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
+msgid "Language"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:206
+msgid "Language (optional):"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
+msgid "Language:"
+msgstr ""
+
+#: ../ProjectController.py:1779
+msgid "Latest build already matches current target. Transfering anyway...\n"
+msgstr ""
+
+#: ../Beremiz_service.py:281
+msgid "Launch WX GUI inspector"
+msgstr ""
+
+#: ../Beremiz_service.py:280
+msgid "Launch a live Python shell"
+msgstr ""
+
+#: ../editors/Viewer.py:580
+msgid "Left"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:64
+msgid "Left PowerRail"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Length of string"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:78
+msgid "Less than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:79
+msgid "Less than or equal to"
+msgstr ""
+
+#: ../IDEFrame.py:652
+msgid "Library"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:73
+msgid "Limitation"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:209
+msgid "Linking :\n"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
+msgid "Local"
+msgstr ""
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr ""
+
+#: ../ProjectController.py:1685
+msgid "Local service discovery failed!\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:62
+msgid "Location"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:79
+msgid "Locations available:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:25
+msgid "Logarithm to base 10"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:102
+#, python-format
+msgid "MDNS resolution failure for '%s'\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
+msgid "Map Variable"
+msgstr ""
+
+#: ../features.py:31
+msgid "Map located variables over CANopen"
+msgstr ""
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:113
+msgid "Master"
+msgstr ""
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr ""
+
+#: ../plcopen/iec_std.csv:71
+msgid "Maximum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:246
+msgid "Maximum:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Memory"
+msgstr ""
+
+#: ../IDEFrame.py:617
+msgid "Menu ToolBar"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:51
+msgid "Microseconds:"
+msgstr ""
+
+#: ../editors/Viewer.py:585
+msgid "Middle"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:50
+msgid "Milliseconds:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:72
+msgid "Minimum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:233
+msgid "Minimum:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:48
+msgid "Minutes:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:231
+msgid "Miscellaneous"
+msgstr ""
+
+#: ../features.py:32
+msgid "Modbus support"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:65
+msgid "Modifier:"
+msgstr ""
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:146
+msgid "Move action down"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:145
+msgid "Move action up"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:46
+msgid "Move down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:367
+msgid "Move element down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:366
+msgid "Move element up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:254
+msgid "Move task up"
+msgstr ""
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
+msgid "Move the view"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:45
+msgid "Move up"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
+msgid "Move variable down"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
+msgid "Move variable up"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:74
+msgid "Multiplexer (select 1 of N)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:34
+msgid "Multiplication"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:87
+msgid "My Computer:"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
+#: ../controls/VariablePanel.py:59
+msgid "Name"
+msgstr ""
+
+#: ../Beremiz_service.py:342
+msgid "Name must not be null!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
+msgid "Name:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:24
+msgid "Natural logarithm"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
+msgid "Negated"
+msgstr ""
+
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr ""
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
+msgid "New"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:43
+msgid "New item"
+msgstr ""
+
+#: ../editors/Viewer.py:553
+msgid "No Modifier"
+msgstr ""
+
+#: ../ProjectController.py:1808
+msgid "No PLC to transfer (did build succeed ?)\n"
+msgstr ""
+
+#: ../PLCGenerator.py:1678
+#, python-format
+msgid "No body defined in \"%s\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCOpenEditor.py:331
+msgid ""
+"No documentation available.\n"
+"Coming soon."
+msgstr ""
+
+#: ../PLCGenerator.py:841
+#, python-format
+msgid "No informations found for \"%s\" block"
+msgstr ""
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:175
+msgid "No search results available."
+msgstr ""
+
+#: ../svgui/svgui.py:142
+#, python-format
+msgid "No such SVG file: %s\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr ""
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+msgid "No valid value selected!"
+msgstr ""
+
+#: ../PLCGenerator.py:1676
+#, python-format
+msgid "No variable defined in \"%s\" POU"
+msgstr ""
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr ""
+
+#: ../controls/VariablePanel.py:79
+msgid "Non-Retain"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78
+msgid "Normal"
+msgstr ""
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:80
+msgid "Not equal to"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:91
+msgid "Number of sequences:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:22
+msgid "Numerical"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:88
+msgid "Only Elements"
+msgstr ""
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
+msgid "Open"
+msgstr ""
+
+#: ../svgui/svgui.py:151
+msgid "Open Inkscape"
+msgstr ""
+
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+
+#: ../ProjectController.py:1879
+msgid "Open a file explorer to manage project files"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
+msgid "Open wxGlade"
+msgstr ""
+
+#: ../controls/VariablePanel.py:64
+msgid "Option"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
+msgid "Options"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:109
+msgid "Organization (optional):"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
+msgid "Other Profile"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Output"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
+msgid "PDO Receive"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
+msgid "PDO Transmit"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:174
+msgid "PLC :\n"
+msgstr ""
+
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr ""
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr ""
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr ""
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr ""
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
+msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
+msgstr ""
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
+msgid "PLCOpenEditor"
+msgstr ""
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:109
+msgid "POU Name"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:66
+msgid "POU Name:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:111
+msgid "POU Type"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:73
+msgid "POU Type:"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr ""
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
+msgid "Page Setup"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:124
+msgid "Page Size (optional):"
+msgstr ""
+
+#: ../IDEFrame.py:2640
+#, python-format
+msgid "Page: %d"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:134
+msgid "Parent instance"
+msgstr ""
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
+msgid "Paste"
+msgstr ""
+
+#: ../IDEFrame.py:1899
+msgid "Paste POU"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:60
+msgid "Pattern to search:"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:75
+msgid "Pin number:"
+msgstr ""
+
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
+msgid "Please choose a target"
+msgstr ""
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr ""
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
+msgid "Please enter comment text"
+msgstr ""
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
+msgid "Please enter step name"
+msgstr ""
+
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
+msgid "Please enter value for a \"%s\" variable:"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be 0 <= port <= 65535!"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be an integer!"
+msgstr ""
+
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
+msgid "Power Rail"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:52
+msgid "Power Rail Properties"
+msgstr ""
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
+msgid "Preview"
+msgstr ""
+
+#: ../dialogs/BlockPreviewDialog.py:59
+msgid "Preview:"
+msgstr ""
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
+msgid "Print"
+msgstr ""
+
+#: ../IDEFrame.py:1110
+msgid "Print preview"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Priority"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:91
+msgid "Priority:"
+msgstr ""
+
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:90
+msgid "Product Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:92
+msgid "Product Release (optional):"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:91
+msgid "Product Version (required):"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
+msgid "Program"
+msgstr ""
+
+#: ../PLCOpenEditor.py:321
+msgid "Program was successfully generated!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Programs"
+msgstr ""
+
+#: ../editors/Viewer.py:285
+msgid "Programs can't be used by other POUs!"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
+msgid "Project"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:180
+#, python-format
+msgid "Project '%s':"
+msgstr ""
+
+#: ../ProjectController.py:1878
+msgid "Project Files"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:88
+msgid "Project Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:89
+msgid "Project Version (optional):"
+msgstr ""
+
+#: ../PLCControler.py:2717
+msgid ""
+"Project file syntax error:\n"
+"\n"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
+msgid "Project properties"
+msgstr ""
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Properties"
+msgstr ""
+
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr ""
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr ""
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr ""
+
+#: ../features.py:34
+msgid "Python file"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Qualifier"
+msgstr ""
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
+msgid "Quit"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
+msgid "Range:"
+msgstr ""
+
+#: ../ProjectController.py:1872
+msgid "Raw IEC code"
+msgstr ""
+
+#: ../BeremizIDE.py:1083
+#, python-format
+msgid "Really delete node '%s'?"
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
+msgid "Redo"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:76
+msgid "Reference"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
+msgid "Refresh"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:70
+msgid "Regular expression"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:99
+msgid "Regular expressions"
+msgstr ""
+
+#: ../editors/Viewer.py:1636
+msgid "Release value"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:37
+msgid "Remainder (modulo)"
+msgstr ""
+
+#: ../BeremizIDE.py:1084
+#, python-format
+msgid "Remove %s node"
+msgstr ""
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr ""
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:144
+msgid "Remove action"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:365
+msgid "Remove element"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:66
+msgid "Remove file from left folder"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:284
+msgid "Remove instance"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:111
+msgid "Remove slave"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:253
+msgid "Remove task"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
+msgid "Remove variable"
+msgstr ""
+
+#: ../IDEFrame.py:1979
+msgid "Rename"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:187
+msgid "Replace File"
+msgstr ""
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:89
+msgid "Replacement (within)"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Reset"
+msgstr ""
+
+#: ../editors/Viewer.py:681
+msgid "Reset Execution Order"
+msgstr ""
+
+#: ../IDEFrame.py:453
+msgid "Reset Perspective"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:103
+msgid "Reset search result"
+msgstr ""
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
+msgid "Resources"
+msgstr ""
+
+#: ../controls/VariablePanel.py:77
+msgid "Retain"
+msgstr ""
+
+#: ../controls/VariablePanel.py:455
+msgid "Return Type:"
+msgstr ""
+
+#: ../editors/Viewer.py:582
+msgid "Right"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:65
+msgid "Right PowerRail"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
+msgid "Rising Edge"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:65
+msgid "Rotate left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:64
+msgid "Rotate right"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:17
+msgid "Rounding up/down"
+msgstr ""
+
+#: ../ProjectController.py:1828
+msgid "Run"
+msgstr ""
+
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
+msgid "SDO Client"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
+msgid "SDO Server"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "SFC"
+msgstr ""
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr ""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "ST"
+msgstr ""
+
+#: ../PLCOpenEditor.py:308
+msgid "ST files (*.st)|*.st|All files|*.*"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "SVG files (*.svg)|*.svg|All files|*.*"
+msgstr ""
+
+#: ../features.py:36
+msgid "SVGUI"
+msgstr ""
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
+msgid "Save"
+msgstr ""
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
+msgid "Save As..."
+msgstr ""
+
+#: ../BeremizIDE.py:249
+msgid "Save as"
+msgstr ""
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:73
+msgid "Scope"
+msgstr ""
+
+#: ../IDEFrame.py:644
+msgid "Search"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
+msgid "Search in Project"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:49
+msgid "Seconds:"
+msgstr ""
+
+#: ../IDEFrame.py:390
+msgid "Select All"
+msgstr ""
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
+msgid "Select a variable class:"
+msgstr ""
+
+#: ../ProjectController.py:1293
+msgid "Select an editor:"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:292
+msgid "Select an instance"
+msgstr ""
+
+#: ../IDEFrame.py:628
+msgid "Select an object"
+msgstr ""
+
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:70
+msgid "Selection"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:65
+msgid "Selection Divergence"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:104
+msgid "Services available:"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Set"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Shift left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:63
+msgid "Shift right"
+msgstr ""
+
+#: ../ProjectController.py:1863
+msgid "Show IEC code generated by PLCGenerator"
+msgstr ""
+
+#: ../canfestival/canfestival.py:407
+msgid "Show Master"
+msgstr ""
+
+#: ../canfestival/canfestival.py:408
+msgid "Show Master generated by config_utils"
+msgstr ""
+
+#: ../ProjectController.py:1862
+msgid "Show code"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:67
+msgid "Simultaneous Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:27
+msgid "Sine"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Single"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr ""
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+
+#: ../plcopen/iec_std.csv:23
+msgid "Square root (base 2)"
+msgstr ""
+
+#: ../plcopen/definitions.py:50
+msgid "Standard function blocks"
+msgstr ""
+
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
+msgid "Start PLC"
+msgstr ""
+
+#: ../ProjectController.py:1074
+#, python-format
+msgid "Start build in %s\n"
+msgstr ""
+
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr ""
+
+#: ../ProjectController.py:1633
+msgid "Starting PLC\n"
+msgstr ""
+
+#: ../BeremizIDE.py:393
+msgid "Status ToolBar"
+msgstr ""
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
+msgid "Step"
+msgstr ""
+
+#: ../ProjectController.py:1835
+msgid "Stop"
+msgstr ""
+
+#: ../Beremiz_service.py:272
+msgid "Stop PLC"
+msgstr ""
+
+#: ../ProjectController.py:1836
+msgid "Stop Running PLC"
+msgstr ""
+
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Structure"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Subrange"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:35
+msgid "Subtraction"
+msgstr ""
+
+#: ../ProjectController.py:1113
+msgid "Successfully built.\n"
+msgstr ""
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
+msgid "Syntax error in regular expression of pattern to search!"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:29
+msgid "Tangent"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:97
+msgid "Task"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:248
+msgid "Tasks:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Temp"
+msgstr ""
+
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:186
+#, python-format
+msgid ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+msgstr ""
+
+#: ../editors/LDViewer.py:893
+msgid "The group of block must be coherent!"
+msgstr ""
+
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
+msgid "There are changes, do you want to save?"
+msgstr ""
+
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+
+#: ../IDEFrame.py:1133
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+
+#: ../editors/LDViewer.py:902
+msgid "This option isn't available yet!"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40
+msgid "Time"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
+msgid "Time addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:86
+msgid "Time concatenation"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
+msgid "Time division"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
+msgid "Time multiplication"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
+msgid "Time subtraction"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
+msgid "Time-of-day addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
+msgid "Time-of-day subtraction"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr ""
+
+#: ../editors/Viewer.py:584
+msgid "Top"
+msgstr ""
+
+#: ../ProjectController.py:1848
+msgid "Transfer"
+msgstr ""
+
+#: ../ProjectController.py:1849
+msgid "Transfer PLC"
+msgstr ""
+
+#: ../ProjectController.py:1802
+msgid "Transfer completed successfully.\n"
+msgstr ""
+
+#: ../ProjectController.py:1805
+msgid "Transfer failed\n"
+msgstr ""
+
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
+msgid "Transition"
+msgstr ""
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:91
+msgid "Transition Name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:60
+msgid "Transition Name:"
+msgstr ""
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1526
+#, python-format
+msgid "Transition with name %s doesn't exist!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Transitions"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Triggering"
+msgstr ""
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
+msgid "Type"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr ""
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
+#, python-format
+msgid "Type conflict for location \"%s\""
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Type conversion"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:170
+msgid "Type infos:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
+msgid "Type:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
+#, python-format
+msgid "Unable to define PDO mapping for node %02x"
+msgstr ""
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
+msgid "Unable to get Xenomai's %s \n"
+msgstr ""
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:261
+#, python-format
+msgid "Undefined pou type \"%s\""
+msgstr ""
+
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
+msgid "Undo"
+msgstr ""
+
+#: ../ProjectController.py:442
+msgid "Unknown"
+msgstr ""
+
+#: ../editors/Viewer.py:437
+#, python-format
+msgid "Unknown variable \"%s\" for this POU!"
+msgstr ""
+
+#: ../ProjectController.py:439 ../ProjectController.py:440
+msgid "Unnamed"
+msgstr ""
+
+#: ../PLCControler.py:263
+#, python-format
+msgid "Unnamed%d"
+msgstr ""
+
+#: ../controls/VariablePanel.py:308
+#, python-format
+msgid "Unrecognized data size \"%s\""
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
+msgid "User Data Types"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
+msgid "User Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "User-defined POUs"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:267
+msgid "Values:"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
+msgid "Variable"
+msgstr ""
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:68
+msgid "Variable Properties"
+msgstr ""
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
+msgid "Variable class"
+msgstr ""
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
+msgid "Variable don't belong to this POU!"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "Variables"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:166
+msgid "Vertical:"
+msgstr ""
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr ""
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr ""
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr ""
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr ""
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr ""
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr ""
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr ""
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr ""
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
+msgid "WXGLADE GUI"
+msgstr ""
+
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
+msgid "Warning"
+msgstr ""
+
+#: ../ProjectController.py:726
+msgid "Warnings in ST/IL/SFC code generator :\n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:82
+msgid "Whole Project"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:134
+msgid "Width:"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:94
+msgid "Wrap search"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr ""
+
+#: ../features.py:35
+msgid "WxGlade GUI"
+msgstr ""
+
+#: ../svgui/svgui.py:150
+msgid ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:160
+msgid ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+msgstr ""
+
+#: ../ProjectController.py:390
+msgid ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+msgstr ""
+
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+
+#: ../editors/LDViewer.py:677
+msgid "You must select the wire where a contact should be added!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
+msgid "You must type a name!"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:209
+msgid "You must type a value!"
+msgstr ""
+
+#: ../IDEFrame.py:440
+msgid "Zoom"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr ""
+
+#: ../PLCOpenEditor.py:317
+#, python-format
+msgid "error: %s\n"
+msgstr ""
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "function"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "functionBlock"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr ""
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "program"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:84
+msgid "string from the middle"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:82
+msgid "string left of"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:83
+msgid "string right of"
+msgstr ""
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr ""
+
+#: ../PLCOpenEditor.py:315
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr ""
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr ""
+
+msgid "CAN_Device"
+msgstr ""
+
+msgid "CAN_Baudrate"
+msgstr ""
+
+msgid "NodeId"
+msgstr ""
+
+msgid "Sync_Align"
+msgstr ""
+
+msgid "Sync_Align_Ratio"
+msgstr ""
+
+msgid "CanFestivalNode"
+msgstr ""
+
+msgid "Sync_TPDOs"
+msgstr ""
+
+msgid "CanFestivalInstance"
+msgstr ""
+
+msgid "CAN_Driver"
+msgstr ""
+
+msgid "Generic"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Xenomai"
+msgstr ""
+
+msgid "XenoConfig"
+msgstr ""
+
+msgid "Compiler"
+msgstr ""
+
+msgid "CFLAGS"
+msgstr ""
+
+msgid "Linker"
+msgstr ""
+
+msgid "LDFLAGS"
+msgstr ""
+
+msgid "Linux"
+msgstr ""
+
+msgid "Win32"
+msgstr ""
+
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr ""
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
+msgid "BaseParams"
+msgstr ""
+
+msgid "IEC_Channel"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "BeremizRoot"
+msgstr ""
+
+msgid "TargetType"
+msgstr ""
+
+msgid "Libraries"
+msgstr ""
+
+msgid "URI_location"
+msgstr ""
+
+msgid "Disable_Extensions"
+msgstr ""
+
+msgid "%(codefile_name)s"
+msgstr ""
+
+msgid "variables"
+msgstr ""
+
+msgid "variable"
+msgstr ""
+
+msgid "name"
+msgstr ""
+
+msgid "type"
+msgstr ""
+
+msgid "class"
+msgstr ""
+
+msgid "initial"
+msgstr ""
+
+msgid "desc"
+msgstr ""
+
+msgid "onchange"
+msgstr ""
+
+msgid "opts"
+msgstr ""
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr ""
+
+msgid "Preset datetime"
+msgstr ""
+
+msgid "Copy of IN"
+msgstr ""
+
+msgid "Datetime, current or relative to PDT"
+msgstr ""
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+
+msgid "1 = integrate, 0 = hold"
+msgstr ""
+
+msgid "Overriding reset"
+msgstr ""
+
+msgid "Input variable"
+msgstr ""
+
+msgid "Initial value"
+msgstr ""
+
+msgid "Sampling period"
+msgstr ""
+
+msgid "NOT R1"
+msgstr ""
+
+msgid "Integrated output"
+msgstr ""
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr ""
+
+msgid "0 = reset"
+msgstr ""
+
+msgid "Input to be differentiated"
+msgstr ""
+
+msgid "Differentiated output"
+msgstr ""
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+
+msgid "0 - manual , 1 - automatic"
+msgstr ""
+
+msgid "Process variable"
+msgstr ""
+
+msgid "Set point"
+msgstr ""
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr ""
+
+msgid "Proportionality constant"
+msgstr ""
+
+msgid "Reset time"
+msgstr ""
+
+msgid "Derivative time constant"
+msgstr ""
+
+msgid "PV - SP"
+msgstr ""
+
+msgid "FB for integral term"
+msgstr ""
+
+msgid "FB for derivative term"
+msgstr ""
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr ""
+
+msgid "Ramp duration"
+msgstr ""
+
+msgid "BUSY = 1 during ramping period"
+msgstr ""
+
+msgid "Elapsed time of ramp"
+msgstr ""
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr ""
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr ""
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr ""
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+
+msgid "first input parameter"
+msgstr ""
+
+msgid "second input parameter"
+msgstr ""
+
+msgid "first output parameter"
+msgstr ""
+
+msgid "second output parameter"
+msgstr ""
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr ""
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
--- a/i18n/Beremiz_ru_RU.po	Sat Jun 02 11:56:01 2018 +0100
+++ b/i18n/Beremiz_ru_RU.po	Mon Jan 07 13:50:39 2019 +0100
@@ -1,23 +1,24 @@
 # SOME DESCRIPTIVE TITLE.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the Beremiz package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
+# 
+#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: Beremiz\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-12 14:39+0300\n"
-"PO-Revision-Date: 2017-01-12 14:41+0300\n"
-"Last-Translator: Andrey Skvortsov <andrej.skvortzov@gmail.com>\n"
-"Language-Team: Andrey Skvortsov <andrej.skvortzov@gmail.com>\n"
-"Language: ru_RU\n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: zx_alexis <zxalexis@gmail.com>, 2017\n"
+"Language-Team: Russian (Russia) (https://www.transifex.com/beremiz/teams/75746/ru_RU/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.11\n"
-
-#: ../PLCOpenEditor.py:408 ../Beremiz.py:1191
+"Language: ru_RU\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
+
+#: ../util/ExceptionHandler.py:58
 #, python-format
 msgid ""
 "\n"
@@ -42,375 +43,365 @@
 "\n"
 "Traceback:\n"
 
-#: ../controls/VariablePanel.py:72
+#: ../controls/VariablePanel.py:90
 msgid "   External"
 msgstr "   Внешний"
 
-#: ../controls/VariablePanel.py:71
+#: ../controls/VariablePanel.py:89
 msgid "   InOut"
 msgstr "   Вход/Выход"
 
-#: ../controls/VariablePanel.py:71
+#: ../controls/VariablePanel.py:89
 msgid "   Input"
 msgstr "   Вход"
 
-#: ../controls/VariablePanel.py:72
+#: ../controls/VariablePanel.py:90
 msgid "   Local"
 msgstr "   Локальный"
 
-#: ../controls/VariablePanel.py:71
+#: ../controls/VariablePanel.py:89
 msgid "   Output"
 msgstr "   Выход"
 
-#: ../controls/VariablePanel.py:73
+#: ../controls/VariablePanel.py:91
 msgid "   Temp"
 msgstr "   Временный"
 
-#: ../dialogs/PouTransitionDialog.py:99 ../dialogs/ProjectDialog.py:66
-#: ../dialogs/PouActionDialog.py:91 ../dialogs/PouDialog.py:113
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
 #, python-format
 msgid " and %s"
-msgstr "и %s"
-
-#: ../ProjectController.py:1089
+msgstr " и %s"
+
+#: ../ProjectController.py:1182
 msgid " generation failed !\n"
 msgstr "неудачная генерация кода!\n"
 
-#: ../plcopen/plcopen.py:881
+#: ../plcopen/plcopen.py:1029
 #, python-format
 msgid "\"%s\" Data Type doesn't exist !!!"
 msgstr "Тип данных \"%s\" не существует!!!"
 
-#: ../plcopen/plcopen.py:899
+#: ../plcopen/plcopen.py:1047
 #, python-format
 msgid "\"%s\" POU already exists !!!"
 msgstr "POU \"%s\"  уже существует!!!"
 
-#: ../plcopen/plcopen.py:920
+#: ../plcopen/plcopen.py:1068
 #, python-format
 msgid "\"%s\" POU doesn't exist !!!"
 msgstr "POU \"%s\"  не найден!!!"
 
-#: ../editors/Viewer.py:246
+#: ../editors/Viewer.py:288
 #, python-format
 msgid "\"%s\" can't use itself!"
 msgstr "\"%s\" не может использовать сам себя!!!"
 
-#: ../IDEFrame.py:1652 ../IDEFrame.py:1671
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
 #, python-format
 msgid "\"%s\" config already exists!"
 msgstr "Конфигурация \"%s\"  уже существует!!!"
 
-#: ../plcopen/plcopen.py:467
+#: ../plcopen/plcopen.py:531
 #, python-format
 msgid "\"%s\" configuration already exists !!!"
 msgstr "Конфигурация \"%s\"  уже существует!!!"
 
-#: ../IDEFrame.py:1602
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr "конфигурация \"%s\" не существует!!!"
+
+#: ../IDEFrame.py:1638
 #, python-format
 msgid "\"%s\" data type already exists!"
 msgstr "Тип данных \"%s\"  уже существует!!!"
 
-#: ../dialogs/PouTransitionDialog.py:110 ../dialogs/BlockPreviewDialog.py:219
-#: ../dialogs/PouActionDialog.py:102 ../editors/Viewer.py:262
-#: ../editors/Viewer.py:330 ../editors/Viewer.py:354 ../editors/Viewer.py:374
-#: ../editors/TextViewer.py:272 ../editors/TextViewer.py:301
-#: ../controls/VariablePanel.py:396
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
 #, python-format
 msgid "\"%s\" element for this pou already exists!"
 msgstr "Элемент с именем \"%s\" уже существует в этом POU!!!"
 
-#: ../Beremiz.py:994
+#: ../BeremizIDE.py:928
 #, python-format
 msgid "\"%s\" folder is not a valid Beremiz project\n"
 msgstr "Директория \"%s\" не является проектом Beremiz\n"
 
-#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouTransitionDialog.py:106
-#: ../dialogs/BlockPreviewDialog.py:207 ../dialogs/PouNameDialog.py:50
-#: ../dialogs/PouActionDialog.py:98 ../dialogs/PouDialog.py:120
-#: ../editors/DataTypeEditor.py:555 ../editors/DataTypeEditor.py:584
-#: ../editors/CodeFileEditor.py:770 ../controls/VariablePanel.py:751
-#: ../IDEFrame.py:1593
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
 #, python-format
 msgid "\"%s\" is a keyword. It can't be used!"
 msgstr "\"%s\" является ключевым словом и не может быть использован!"
 
-#: ../plcopen/plcopen.py:2412
+#: ../plcopen/plcopen.py:2836
 #, python-format
 msgid "\"%s\" is an invalid value!"
 msgstr "\"%s\" недопустимое значение!"
 
-#: ../PLCOpenEditor.py:339 ../PLCOpenEditor.py:381
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
 #, python-format
 msgid "\"%s\" is not a valid folder!"
 msgstr "\"%s\" не является директорией!"
 
-#: ../dialogs/SFCStepNameDialog.py:50 ../dialogs/PouTransitionDialog.py:104
-#: ../dialogs/BlockPreviewDialog.py:203 ../dialogs/PouNameDialog.py:48
-#: ../dialogs/PouActionDialog.py:96 ../dialogs/PouDialog.py:118
-#: ../editors/DataTypeEditor.py:579 ../editors/CodeFileEditor.py:768
-#: ../controls/VariablePanel.py:749 ../IDEFrame.py:1591
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
 #, python-format
 msgid "\"%s\" is not a valid identifier!"
 msgstr "\"%s\" неверный идентификатор!"
 
-#: ../IDEFrame.py:2396
+#: ../IDEFrame.py:2436
 #, python-format
 msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
-msgstr "\"%s\" используется более чем одним POU. Продолжить?"
-
-#: ../dialogs/BlockPreviewDialog.py:211 ../dialogs/PouDialog.py:122
-#: ../editors/Viewer.py:260 ../editors/Viewer.py:315 ../editors/Viewer.py:345
-#: ../editors/Viewer.py:367 ../editors/TextViewer.py:270
-#: ../editors/TextViewer.py:299 ../editors/TextViewer.py:350
-#: ../editors/TextViewer.py:373 ../controls/VariablePanel.py:338
-#: ../IDEFrame.py:1611
+msgstr "\"%s\" используется одним или более POU. Продолжить?"
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
 #, python-format
 msgid "\"%s\" pou already exists!"
 msgstr "POU \"%s\" уже существует!"
 
-#: ../dialogs/SFCStepNameDialog.py:58
+#: ../dialogs/SFCStepNameDialog.py:62
 #, python-format
 msgid "\"%s\" step already exists!"
 msgstr "Шаг \"%s\" уже существует!"
 
-#: ../editors/DataTypeEditor.py:550
+#: ../editors/DataTypeEditor.py:566
 #, python-format
 msgid "\"%s\" value already defined!"
 msgstr "\"%s\" значение уже задано!"
 
-#: ../dialogs/ArrayTypeDialog.py:97 ../editors/DataTypeEditor.py:745
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
 #, python-format
 msgid "\"%s\" value isn't a valid array dimension!"
 msgstr "\"%s\" не является корректной размерностью для массива! "
 
-#: ../dialogs/ArrayTypeDialog.py:103 ../editors/DataTypeEditor.py:752
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
 #, python-format
 msgid ""
 "\"%s\" value isn't a valid array dimension!\n"
 "Right value must be greater than left value."
-msgstr "\"%s\" не является корректной размерностью массива! Правое значение должно быть больше левого."
-
-#: ../PLCGenerator.py:1101
+msgstr ""
+"\"%s\" не является корректной размерностью массива! Правое значение должно "
+"быть больше левого."
+
+#: ../PLCGenerator.py:1133
 #, python-brace-format
 msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
 msgstr "Функция \"{a1}\" не используется  в POU \"{a2}\": входы не подключены"
 
-#: ../editors/Viewer.py:250
+#: ../editors/Viewer.py:292
 #, python-brace-format
 msgid "\"{a1}\" is already used by \"{a2}\"!"
 msgstr "\"{a1}\" уже используется \"{a2}\"!"
 
-#: ../plcopen/plcopen.py:491
+#: ../plcopen/plcopen.py:557
 #, python-brace-format
 msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
 msgstr "Ресурс \"{a1}\"  уже существует в конфигурации \"{a2}\"!!!"
 
-#: ../plcopen/plcopen.py:509
+#: ../plcopen/plcopen.py:577
 #, python-brace-format
 msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
 msgstr "Ресурс \"{a1}\"  отсутствует в конфигурации \"{a2}\"!!!"
 
-msgid "%(codefile_name)s"
-msgstr "%(codefile_name)"
-
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:578
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
 #, python-format
 msgid "%03gms"
 msgstr "%03gмс"
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:569
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
 #, python-format
 msgid "%dd"
 msgstr "%dд"
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:56
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:570
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
 #, python-format
 msgid "%dh"
 msgstr "%dч"
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:55
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
 #, python-format
 msgid "%dm"
 msgstr "%dм"
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:53
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
 #, python-format
 msgid "%dms"
 msgstr "%dмс"
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:54
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
 #, python-format
 msgid "%ds"
 msgstr "%dc"
 
-#: ../PLCControler.py:1531
+#: ../PLCControler.py:1114
 #, python-format
 msgid "%s Data Types"
 msgstr "%s типы данных"
 
-#: ../PLCControler.py:1514
+#: ../PLCControler.py:1097
 #, python-format
 msgid "%s POUs"
 msgstr "%s POU"
 
-#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:90
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
 #, python-format
 msgid "%s Profile"
 msgstr "%s профиль"
 
-#: ../plcopen/plcopen.py:1645 ../plcopen/plcopen.py:1652
-#: ../plcopen/plcopen.py:1664 ../plcopen/plcopen.py:1672
-#: ../plcopen/plcopen.py:1682
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
 #, python-format
 msgid "%s body don't have instances!"
 msgstr "Тело %s не содержит экземпляров!"
 
-#: ../plcopen/plcopen.py:1700 ../plcopen/plcopen.py:1707
-#: ../plcopen/plcopen.py:1714
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
 #, python-format
 msgid "%s body don't have text!"
 msgstr "Тело %s не содержит никакой текст!"
 
-#: ../IDEFrame.py:386
+#: ../IDEFrame.py:388
 msgid "&Add Element"
 msgstr "&Добавить элемент"
 
-#: ../dialogs/AboutDialog.py:65 ../dialogs/AboutDialog.py:113
-#: ../dialogs/AboutDialog.py:150
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
 msgid "&Close"
 msgstr "&Закрыть"
 
-#: ../IDEFrame.py:356
+#: ../IDEFrame.py:361
 msgid "&Configuration"
 msgstr "&Конфигурация"
 
-#: ../IDEFrame.py:345
+#: ../IDEFrame.py:350
 msgid "&Data Type"
 msgstr "&Типы данных"
 
-#: ../IDEFrame.py:390
+#: ../IDEFrame.py:392
 msgid "&Delete"
 msgstr "&Удалить"
 
-#: ../IDEFrame.py:337
+#: ../IDEFrame.py:342
 msgid "&Display"
 msgstr "&Вид"
 
-#: ../IDEFrame.py:336
+#: ../IDEFrame.py:341
 msgid "&Edit"
 msgstr "&Редактировать"
 
-#: ../IDEFrame.py:335
+#: ../IDEFrame.py:340
 msgid "&File"
 msgstr "&Файл"
 
-#: ../IDEFrame.py:347
+#: ../IDEFrame.py:352
 msgid "&Function"
 msgstr "&Функции"
 
-#: ../IDEFrame.py:338
+#: ../IDEFrame.py:343
 msgid "&Help"
 msgstr "&Помощь"
 
-#: ../dialogs/AboutDialog.py:64
+#: ../dialogs/AboutDialog.py:70
 msgid "&License"
 msgstr "&Лицензия"
 
-#: ../IDEFrame.py:351
+#: ../IDEFrame.py:356
 msgid "&Program"
 msgstr "&Программы"
 
-#: ../PLCOpenEditor.py:125
+#: ../PLCOpenEditor.py:98
 msgid "&Properties"
 msgstr "&Свойства"
 
-#: ../Beremiz.py:324
+#: ../BeremizIDE.py:244
 msgid "&Recent Projects"
 msgstr "&Недавние проекты"
 
-#: ../IDEFrame.py:353
+#: ../IDEFrame.py:358
 msgid "&Resource"
 msgstr "&Ресурсы"
 
-#: ../controls/SearchResultPanel.py:239
+#: ../controls/SearchResultPanel.py:247
 #, python-brace-format
 msgid "'{a1}' - {a2} match in project"
 msgstr "'{a1}'- {a2} совпадений в проекте"
 
-#: ../controls/SearchResultPanel.py:241
+#: ../controls/SearchResultPanel.py:249
 #, python-brace-format
 msgid "'{a1}' - {a2} matches in project"
 msgstr "'{a1}' - {a2} совпадений в проекте"
 
-#: ../connectors/PYRO/__init__.py:90
+#: ../connectors/PYRO/__init__.py:98
 #, python-brace-format
 msgid "'{a1}' is located at {a2}\n"
 msgstr "'{a1}' находится {a2}\n"
 
-#: ../controls/SearchResultPanel.py:291
+#: ../controls/SearchResultPanel.py:298
 #, python-format
 msgid "(%d matches)"
 msgstr "(%d совпадений)"
 
-#: ../PLCOpenEditor.py:396 ../PLCOpenEditor.py:398 ../PLCOpenEditor.py:399
-msgid ",   "
-msgstr ",   "
-
-#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/PouActionDialog.py:93
-#: ../dialogs/PouDialog.py:115
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
 #, python-format
 msgid ", %s"
 msgstr ", %s"
 
-#: ../PLCOpenEditor.py:394
-msgid ". "
-msgstr ". "
-
-#: Extra TC6 documentation strings
-msgid "0 - current time, 1 - load time from PDT"
-msgstr "0 - текущее время, 1 - отклонение от PDT"
-
-msgid "0 - manual , 1 - automatic"
-msgstr "0 - ручной, 1 - автоматический"
-
-msgid "0 - track X0, 1 - ramp to/track X1"
-msgstr "0 - вход X0, 1 - нарастание до значения X1"
-
-msgid "0 = reset"
-msgstr "0 = сброс"
-
-msgid "1 = integrate, 0 = hold"
-msgstr "1 = интегрировать, 0 = остановка"
-
-#: ../controls/LogViewer.py:279
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr "- Выбирете тип URI -"
+
+#: ../controls/LogViewer.py:287
 msgid "1d"
 msgstr "1 день"
 
-#: ../controls/LogViewer.py:280
+#: ../controls/LogViewer.py:288
 msgid "1h"
 msgstr "1 час"
 
-#: ../controls/LogViewer.py:281
+#: ../controls/LogViewer.py:289
 msgid "1m"
 msgstr "1 мин"
 
-#: ../controls/LogViewer.py:282
+#: ../controls/LogViewer.py:290
 msgid "1s"
 msgstr "1 сек"
 
-#: ../dialogs/PouDialog.py:124 ../IDEFrame.py:1614 ../IDEFrame.py:1660
-#: ../IDEFrame.py:1679
-#, python-format
-msgid "A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?"
-msgstr "В POU присутствует элемент с именем \"%s\". Это может вызвать конфликт. Хотите продолжить?"
-
-#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:108
-#: ../dialogs/PouNameDialog.py:52 ../dialogs/PouActionDialog.py:100
-#: ../controls/VariablePanel.py:753 ../IDEFrame.py:1628 ../IDEFrame.py:1641
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+"В POU присутствует элемент с именем \"%s\". Это может вызвать конфликт. "
+"Хотите продолжить?"
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
 #, python-format
 msgid "A POU named \"%s\" already exists!"
 msgstr "POU с именем \"%s\" уже существует!"
@@ -420,22 +411,26 @@
 msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
 msgstr "Дочерний элемент с именем \"{a1}\" уже существует -> \"{a2}\"\n"
 
-#: ../dialogs/BrowseLocationsDialog.py:216
+#: ../dialogs/BrowseLocationsDialog.py:229
 msgid "A location must be selected!"
 msgstr "Необходимо выбрать размещение!"
 
-#: ../dialogs/SFCStepNameDialog.py:56 ../controls/VariablePanel.py:755
-#: ../IDEFrame.py:1630 ../IDEFrame.py:1643
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr "Задача с таким именем уже существует!"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
 #, python-format
 msgid "A variable with \"%s\" as name already exists in this pou!"
 msgstr "Переменная с именем \"%s\" уже существует в этом POU!"
 
-#: ../editors/CodeFileEditor.py:774
+#: ../editors/CodeFileEditor.py:778
 #, python-format
 msgid "A variable with \"%s\" as name already exists!"
 msgstr "Переменная с именем \"%s\" уже существует!"
 
-#: ../dialogs/AboutDialog.py:40 ../PLCOpenEditor.py:158 ../Beremiz.py:381
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
 msgid "About"
 msgstr "О программе"
 
@@ -443,125 +438,125 @@
 msgid "Absolute number"
 msgstr "Абсолютный номер"
 
-#: ../dialogs/SFCStepDialog.py:72 ../dialogs/ActionBlockDialog.py:42
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
 msgid "Action"
 msgstr "Действие"
 
-#: ../editors/Viewer.py:555 ../editors/Viewer.py:2345
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
 msgid "Action Block"
 msgstr "Блок действия"
 
-#: ../dialogs/PouActionDialog.py:81
+#: ../dialogs/PouActionDialog.py:89
 msgid "Action Name"
 msgstr "Имя действия"
 
-#: ../dialogs/PouActionDialog.py:49
+#: ../dialogs/PouActionDialog.py:56
 msgid "Action Name:"
 msgstr "Имя действия:"
 
-#: ../plcopen/plcopen.py:1359
+#: ../plcopen/plcopen.py:1567
 #, python-format
 msgid "Action with name %s doesn't exist!"
 msgstr "Действие с именем %s не существует!"
 
-#: ../PLCControler.py:96
+#: ../plcopen/types_enums.py:76
 msgid "Actions"
 msgstr "Действия"
 
-#: ../dialogs/ActionBlockDialog.py:133
+#: ../dialogs/ActionBlockDialog.py:139
 msgid "Actions:"
 msgstr "Действия:"
 
-#: ../editors/Viewer.py:1100
+#: ../editors/Viewer.py:473
 msgid "Active"
 msgstr "Активный"
 
-#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:101
-#: ../editors/Viewer.py:588 ../Beremiz.py:1060
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
 msgid "Add"
 msgstr "Добавить"
 
-#: ../IDEFrame.py:1890 ../IDEFrame.py:1925
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
 msgid "Add Action"
 msgstr "Добавить действие"
 
-#: ../features.py:32
+#: ../features.py:33
 msgid "Add C code accessing located variables synchronously"
 msgstr "Добавить C-код с синхронным доступом к локальным переменным"
 
-#: ../IDEFrame.py:1873
+#: ../IDEFrame.py:1907
 msgid "Add Configuration"
 msgstr "Добавить конфигурацию"
 
-#: ../IDEFrame.py:1853
+#: ../IDEFrame.py:1887
 msgid "Add DataType"
 msgstr "Добавить тип данных"
 
-#: ../editors/Viewer.py:513
+#: ../editors/Viewer.py:609
 msgid "Add Divergence Branch"
 msgstr "Добавить ветвление"
 
-#: ../dialogs/DiscoveryDialog.py:116
+#: ../dialogs/DiscoveryDialog.py:121
 msgid "Add IP"
 msgstr "Добавить IP адрес"
 
-#: ../IDEFrame.py:1861
+#: ../IDEFrame.py:1895
 msgid "Add POU"
 msgstr "Добавить POU"
 
-#: ../features.py:33
+#: ../features.py:34
 msgid "Add Python code executed asynchronously"
 msgstr "Добавить асинхронно вызываемый код на Python"
 
-#: ../IDEFrame.py:1901 ../IDEFrame.py:1951
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
 msgid "Add Resource"
 msgstr "Добавить ресурс"
 
-#: ../IDEFrame.py:1879 ../IDEFrame.py:1922
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
 msgid "Add Transition"
 msgstr "Добавить переход"
 
-#: ../editors/Viewer.py:500
+#: ../editors/Viewer.py:596
 msgid "Add Wire Segment"
 msgstr "Добавить провод"
 
-#: ../editors/SFCViewer.py:433
+#: ../editors/SFCViewer.py:447
 msgid "Add a new initial step"
 msgstr "Добавить новый исходный шаг"
 
-#: ../editors/Viewer.py:2706 ../editors/SFCViewer.py:770
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
 msgid "Add a new jump"
 msgstr "Добавить новый безусловный переход"
 
-#: ../editors/SFCViewer.py:455
+#: ../editors/SFCViewer.py:469
 msgid "Add a new step"
 msgstr "Добавить новый шаг"
 
-#: ../features.py:34
+#: ../features.py:35
 msgid "Add a simple WxGlade based GUI."
 msgstr "Добавить простой GUI на WxGlade "
 
-#: ../dialogs/ActionBlockDialog.py:137
+#: ../dialogs/ActionBlockDialog.py:143
 msgid "Add action"
 msgstr "Добавить действие"
 
-#: ../editors/DataTypeEditor.py:352
+#: ../editors/DataTypeEditor.py:364
 msgid "Add element"
 msgstr "Добавить элемент"
 
-#: ../editors/ResourceEditor.py:268
+#: ../editors/ResourceEditor.py:283
 msgid "Add instance"
 msgstr "Добавить экземпляр"
 
-#: ../canfestival/NetworkEditor.py:103
+#: ../canfestival/NetworkEditor.py:110
 msgid "Add slave"
 msgstr "Добавить слэйв"
 
-#: ../editors/ResourceEditor.py:239
+#: ../editors/ResourceEditor.py:252
 msgid "Add task"
 msgstr "Добавить задачу"
 
-#: ../editors/CodeFileEditor.py:658 ../controls/VariablePanel.py:450
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
 msgid "Add variable"
 msgstr "Добавить переменную"
 
@@ -569,40 +564,44 @@
 msgid "Addition"
 msgstr "Сложение"
 
-#: ../plcopen/definitions.py:47
+#: ../plcopen/definitions.py:51
 msgid "Additional function blocks"
 msgstr "Дополнительные функциональные блоки"
 
-#: ../editors/Viewer.py:571
+#: ../editors/Viewer.py:669
 msgid "Adjust Block Size"
 msgstr "Скорректировать размер элемента"
 
-#: ../editors/Viewer.py:1637
+#: ../editors/Viewer.py:1720
 msgid "Alignment"
 msgstr "Выравнивание"
 
-#: ../dialogs/BrowseLocationsDialog.py:39
-#: ../dialogs/BrowseLocationsDialog.py:47
-#: ../dialogs/BrowseLocationsDialog.py:140
-#: ../dialogs/BrowseLocationsDialog.py:143 ../controls/LogViewer.py:298
-#: ../controls/VariablePanel.py:70
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
 msgid "All"
 msgstr "Все"
 
-#: ../editors/FileManagementPanel.py:35
+#: ../editors/FileManagementPanel.py:37
 msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
 msgstr "Все файлы  (*.*)|*.*|CSV files (*.csv)|*.csv"
 
-#: ../ProjectController.py:1623
+#: ../ProjectController.py:1670
 msgid "Already connected. Please disconnect\n"
 msgstr "Уже подключен. Пожалуйста, отключитесь сначала.\n"
 
-#: ../editors/DataTypeEditor.py:594
+#: ../editors/DataTypeEditor.py:607
 #, python-format
 msgid "An element named \"%s\" already exists in this structure!"
 msgstr "Поле с именем \"%s\" уже существует в данной структуре!"
 
-#: ../dialogs/ConnectionDialog.py:96
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr "Экземпляр задачи с таким именем уже существует!"
+
+#: ../dialogs/ConnectionDialog.py:103
 msgid "Apply name modification to all continuations with the same name"
 msgstr "Переименовать все цепи с тем же самым именем"
 
@@ -622,8 +621,8 @@
 msgid "Arithmetic"
 msgstr "Математика"
 
-#: ../editors/DataTypeEditor.py:54 ../editors/DataTypeEditor.py:635
-#: ../controls/VariablePanel.py:829
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
 msgid "Array"
 msgstr "Массив"
 
@@ -631,57 +630,40 @@
 msgid "Assignment"
 msgstr "Присвоение"
 
-#: ../dialogs/FBDVariableDialog.py:217
+#: ../dialogs/FBDVariableDialog.py:226
 msgid "At least a variable or an expression must be selected!"
 msgstr "Переменная или выражение должно быть выбрано!"
 
-#: ../controls/ProjectPropertiesPanel.py:99
+#: ../controls/ProjectPropertiesPanel.py:111
 msgid "Author"
 msgstr "Автор"
 
-#: ../controls/ProjectPropertiesPanel.py:96
+#: ../controls/ProjectPropertiesPanel.py:108
 msgid "Author Name (optional):"
 msgstr "Имя автора (опционально):"
 
-msgid "BUSY = 1 during ramping period"
-msgstr "BOSY = 1 во время "
-
-#: ../dialogs/FindInPouDialog.py:79
+#: ../dialogs/FindInPouDialog.py:80
 msgid "Backward"
 msgstr "Назад"
 
-#: ../util/Zeroconf.py:599
-msgid "Bad domain name (circular) at "
-msgstr "Неправильное доменное имя (ответ) в "
-
-#: ../util/Zeroconf.py:602
-msgid "Bad domain name at "
-msgstr "Неправильное доменное имя в"
-
-#: ../canfestival/config_utils.py:342 ../canfestival/config_utils.py:630
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
 #, python-format
 msgid "Bad location size : %s"
 msgstr "Неправильный размер: %s"
 
-#: ../dialogs/ArrayTypeDialog.py:55 ../editors/DataTypeEditor.py:175
-#: ../editors/DataTypeEditor.py:205 ../editors/DataTypeEditor.py:297
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
 msgid "Base Type:"
 msgstr "Базовый тип:"
 
-#: ../editors/DataTypeEditor.py:625 ../controls/VariablePanel.py:787
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
 msgid "Base Types"
 msgstr "Базовые типы"
 
-msgid "BaseParams"
-msgstr "Базовые параметры"
-
-#: ../Beremiz.py:553
+#: ../BeremizIDE.py:483
 msgid "Beremiz"
 msgstr "Beremiz"
 
-msgid "BeremizRoot"
-msgstr "Настройки Beremiz "
-
 #: ../plcopen/iec_std.csv:70
 msgid "Binary selection (1 of 2)"
 msgstr "Бинарный выбор (1 или 2)"
@@ -710,142 +692,120 @@
 msgid "Bitwise inverting"
 msgstr "Битовое НЕ"
 
-#: ../editors/Viewer.py:525 ../editors/Viewer.py:2358
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
 msgid "Block"
 msgstr "Блок"
 
-#: ../dialogs/FBDBlockDialog.py:59
+#: ../dialogs/FBDBlockDialog.py:63
 msgid "Block Properties"
 msgstr "Свойства блока"
 
-#: ../editors/TextViewer.py:262
+#: ../editors/TextViewer.py:260
 msgid "Block name"
 msgstr "Имя блока"
 
-#: ../editors/Viewer.py:491
+#: ../editors/Viewer.py:586
 msgid "Bottom"
 msgstr "Низ"
 
-#: ../ProjectController.py:1301
+#: ../ProjectController.py:1400
 msgid "Broken"
 msgstr "Ошибка"
 
-#: ../dialogs/BrowseValuesLibraryDialog.py:37
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
 #, python-format
 msgid "Browse %s values library"
-msgstr "Browse %s values library"
-
-#: ../dialogs/BrowseLocationsDialog.py:65
+msgstr "Просмотр %s значений библиотеки"
+
+#: ../dialogs/BrowseLocationsDialog.py:72
 msgid "Browse Locations"
-msgstr "Просмотр директорий"
-
-#: ../ProjectController.py:1769
+msgstr "Просмотр доступных МЭК-адресов"
+
+#: ../ProjectController.py:1815
 msgid "Build"
 msgstr "Сборка"
 
-#: ../ProjectController.py:1235
+#: ../ProjectController.py:1335
 msgid "Build directory already clean\n"
 msgstr "Директория сборки уже пуста\n"
 
-#: ../ProjectController.py:1770
+#: ../ProjectController.py:1816
 msgid "Build project into build folder"
 msgstr "Сборка проекта в директории сборки"
 
-#: ../ProjectController.py:1018
+#: ../ProjectController.py:1108
 msgid "C Build crashed !\n"
 msgstr "Крэш во время сборки C-кода!\n"
 
-#: ../ProjectController.py:1015
+#: ../ProjectController.py:1105
 msgid "C Build failed.\n"
 msgstr "Ошибка сборки C-кода.\n"
 
-#: ../c_ext/CFileEditor.py:63
+#: ../c_ext/CFileEditor.py:66
 msgid "C code"
 msgstr "C код "
 
-#: ../ProjectController.py:1093
+#: ../ProjectController.py:1186
 msgid "C code generated successfully.\n"
 msgstr "C-код успешно сгенерирован.\n"
 
-#: ../targets/toolchain_makefile.py:122
+#: ../targets/toolchain_makefile.py:126
 msgid "C compilation failed.\n"
 msgstr "Ошибка компиляции.\n"
 
-#: ../targets/toolchain_gcc.py:156
+#: ../targets/toolchain_gcc.py:199
 #, python-format
 msgid "C compilation of %s failed.\n"
 msgstr "Ошибка компиляции %s.\n"
 
-#: ../features.py:32
+#: ../features.py:33
 msgid "C extension"
 msgstr "С-расширение"
 
-#: ../dialogs/AboutDialog.py:63
+#: ../dialogs/AboutDialog.py:69
 msgid "C&redits"
 msgstr "&Благодарности"
 
-#: ../canfestival/NetworkEditor.py:52
+#: ../canfestival/NetworkEditor.py:58
 msgid "CANOpen network"
 msgstr "Сеть CANOpen"
 
-#: ../canfestival/SlaveEditor.py:44
+#: ../canfestival/SlaveEditor.py:48
 msgid "CANOpen slave"
 msgstr "CANOpen ведущий"
 
-msgid "CAN_Baudrate"
-msgstr "Скорость CAN"
-
-msgid "CAN_Device"
-msgstr "CAN устройство"
-
-msgid "CAN_Driver"
-msgstr "CAN драйвер"
-
 #: ../features.py:31
 msgid "CANopen support"
 msgstr "Поддержка CANOpen"
 
-msgid "CFLAGS"
-msgstr "CFLAGS"
-
-#: ../plcopen/plcopen.py:1584 ../plcopen/plcopen.py:1598
-#: ../plcopen/plcopen.py:1622 ../plcopen/plcopen.py:1638
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
 msgid "Can only generate execution order on FBD networks!"
 msgstr "Можно сгенерировать порядок исполнения только для FBD!"
 
-#: ../controls/VariablePanel.py:267
+#: ../controls/VariablePanel.py:291
 msgid "Can only give a location to local or global variables"
-msgstr "Можно задать размещение только локальным или глобальным переменны"
-
-#: ../PLCOpenEditor.py:334
+msgstr "Можно задать адреса только локальным или глобальным переменным"
+
+#: ../PLCOpenEditor.py:318
 #, python-format
 msgid "Can't generate program to file %s!"
 msgstr "Нельзя сгенерировать программу в файл %s!"
 
-#: ../controls/VariablePanel.py:265
+#: ../controls/VariablePanel.py:289
 msgid "Can't give a location to a function block instance"
 msgstr "Нельзя задать размещение для экземпляра функционального блока"
 
-#: ../PLCOpenEditor.py:379
+#: ../PLCOpenEditor.py:363
 #, python-format
 msgid "Can't save project to file %s!"
 msgstr "Нельзя сохранить проект в файл %s!"
 
-#: ../controls/VariablePanel.py:313
+#: ../controls/VariablePanel.py:339
 msgid "Can't set an initial value to a function block instance"
 msgstr "Нельзя задать исходное значение экземпляру функционального блока"
 
-msgid "CanFestivalInstance"
-msgstr ""
-
-msgid "CanFestivalNode"
-msgstr ""
-
-#: Extra XSD strings
-msgid "CanFestivalSlaveNode"
-msgstr ""
-
-#: ../ConfigTreeNode.py:529
+#: ../ConfigTreeNode.py:532
 #, python-brace-format
 msgid "Cannot create child {a1} of type {a2} "
 msgstr "Нельзя создать дочерний элемент {a1} типа {a2}"
@@ -853,46 +813,54 @@
 #: ../ConfigTreeNode.py:454
 #, python-format
 msgid "Cannot find lower free IEC channel than %d\n"
-msgstr "Не удалось найти свободный МЭК-канал с номером меньше чем %d\n"
-
-#: ../connectors/PYRO/__init__.py:131
+msgstr "Не удалось найти свободный МЭК-канал с номером меньше, чем %d\n"
+
+#: ../connectors/PYRO/__init__.py:139
 msgid "Cannot get PLC status - connection failed.\n"
 msgstr "Невозможно получить состояние ПЛК - ошибка подключения.\n"
 
-#: ../ProjectController.py:881
+#: ../ProjectController.py:967
 msgid "Cannot open/parse VARIABLES.csv!\n"
 msgstr "Не удалось открыть/прочитать VARIABLES.csv\n"
 
-#: ../canfestival/config_utils.py:374
+#: ../canfestival/config_utils.py:400
 #, python-brace-format
-msgid "Cannot set bit offset for non bool '{a1}' variable (ID:{a2},Idx:{a3},sIdx:{a4}))"
-msgstr "Невозможно установить битовое смещение для небулевой переменной '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
-
-#: ../dialogs/SearchInProjectDialog.py:59 ../dialogs/FindInPouDialog.py:88
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+"Невозможно установить битовое смещение для не булевой переменной '{a1}' "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr "Передача запрещена во время работы ПЛК. Остановить?"
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
 msgid "Case sensitive"
 msgstr "Регистрозависимый"
 
-#: ../editors/Viewer.py:486
+#: ../editors/Viewer.py:581
 msgid "Center"
 msgstr "Центр"
 
-#: ../Beremiz_service.py:266
+#: ../Beremiz_service.py:276
 msgid "Change IP of interface to bind"
 msgstr "Сменить IP-адрес интерфейса для привязки сокета"
 
-#: ../Beremiz_service.py:265
+#: ../Beremiz_service.py:275
 msgid "Change Name"
 msgstr "Сменить имя"
 
-#: ../IDEFrame.py:1943
+#: ../IDEFrame.py:1977
 msgid "Change POU Type To"
 msgstr "Сменить тип POU на"
 
-#: ../Beremiz_service.py:267
+#: ../Beremiz_service.py:277
 msgid "Change Port Number"
 msgstr "Сменить номер порта"
 
-#: ../Beremiz_service.py:268
+#: ../Beremiz_service.py:278
 msgid "Change working directory"
 msgstr "Сменить рабочую директорию"
 
@@ -900,113 +868,120 @@
 msgid "Character string"
 msgstr "Строковые операции"
 
-#: ../svgui/svgui.py:125
+#: ../svgui/svgui.py:136
 msgid "Choose a SVG file"
 msgstr "Выберите SVG-файл"
 
-#: ../ProjectController.py:451
+#: ../ProjectController.py:561
 msgid "Choose a directory to save project"
 msgstr "Выберите директорию, чтобы сохранить проект"
 
-#: ../canfestival/canfestival.py:160 ../PLCOpenEditor.py:292
-#: ../PLCOpenEditor.py:324 ../PLCOpenEditor.py:373
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
 msgid "Choose a file"
 msgstr "Выберите файл"
 
-#: ../Beremiz.py:931 ../Beremiz.py:966
+#: ../BeremizIDE.py:900
 msgid "Choose a project"
 msgstr "Выберите проект"
 
-#: ../dialogs/BrowseValuesLibraryDialog.py:42
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
 #, python-format
 msgid "Choose a value for %s:"
 msgstr "Выберите значение для %s:"
 
-#: ../Beremiz_service.py:323
+#: ../Beremiz_service.py:333
 msgid "Choose a working directory "
 msgstr "Выберите рабочую директорию"
 
-#: ../ProjectController.py:358
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr "Выберите пустой каталог для проекта"
+
+#: ../ProjectController.py:468
 msgid "Chosen folder doesn't contain a program. It's not a valid project!"
 msgstr "Выбранная директория не содержит программы. Это некорректный проект!"
 
-#: ../ProjectController.py:325
+#: ../ProjectController.py:435
 msgid "Chosen folder isn't empty. You can't use it for a new project!"
-msgstr "Выбранная директория не пуста и не может использоваться для нового проекта!"
-
-#: ../controls/VariablePanel.py:53 ../controls/VariablePanel.py:54
+msgstr ""
+"Выбранная директория не пуста и не может использоваться для нового проекта!"
+
+#: ../controls/VariablePanel.py:60
 msgid "Class"
 msgstr "Класс"
 
-#: ../controls/VariablePanel.py:441
+#: ../controls/VariablePanel.py:472
 msgid "Class Filter:"
 msgstr "Фильтр класса:"
 
-#: ../dialogs/FBDVariableDialog.py:69
+#: ../dialogs/FBDVariableDialog.py:74
 msgid "Class:"
 msgstr "Класс:"
 
-#: ../ProjectController.py:1773
+#: ../ProjectController.py:1821
 msgid "Clean"
 msgstr "Очистить"
 
-#: ../controls/LogViewer.py:318
+#: ../controls/LogViewer.py:327
 msgid "Clean log messages"
 msgstr "Очистить лог"
 
-#: ../ProjectController.py:1775
+#: ../ProjectController.py:1822
 msgid "Clean project build folder"
 msgstr "Очистить директорию сборки проекта"
 
-#: ../ProjectController.py:1232
+#: ../ProjectController.py:1332
 msgid "Cleaning the build directory\n"
 msgstr "Очистка директории сборки\n"
 
-#: ../IDEFrame.py:435
+#: ../IDEFrame.py:437
 msgid "Clear Errors"
 msgstr "Очистить ошибки"
 
-#: ../editors/Viewer.py:582
+#: ../editors/Viewer.py:680
 msgid "Clear Execution Order"
 msgstr "Очистить порядок исполнения"
 
-#: ../dialogs/SearchInProjectDialog.py:105 ../dialogs/FindInPouDialog.py:111
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
 msgid "Close"
 msgstr "Закрыть"
 
-#: ../PLCOpenEditor.py:199 ../Beremiz.py:693
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
 msgid "Close Application"
 msgstr "Закрыть приложение"
 
-#: ../PLCOpenEditor.py:108 ../Beremiz.py:333 ../Beremiz.py:637
-#: ../IDEFrame.py:1009
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
 msgid "Close Project"
 msgstr "Закрыть проект"
 
-#: ../PLCOpenEditor.py:106 ../Beremiz.py:331
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
 msgid "Close Tab"
 msgstr "Закрыть вкладку"
 
-#: ../editors/Viewer.py:541 ../editors/Viewer.py:2366
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
 msgid "Coil"
 msgstr "Катушка"
 
-msgid "Command"
-msgstr "Комманда"
-
-#: ../editors/Viewer.py:561 ../editors/LDViewer.py:506
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
 msgid "Comment"
 msgstr "Комментарий"
 
-#: ../dialogs/ProjectDialog.py:57
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr "Поддержка сообщества"
+
+#: ../dialogs/ProjectDialog.py:65
 msgid "Company Name"
 msgstr "Имя компании"
 
-#: ../controls/ProjectPropertiesPanel.py:94
+#: ../controls/ProjectPropertiesPanel.py:106
 msgid "Company Name (required):"
 msgstr "Компания (обязательно):"
 
-#: ../controls/ProjectPropertiesPanel.py:95
+#: ../controls/ProjectPropertiesPanel.py:107
 msgid "Company URL (optional):"
 msgstr "Сайт компании (опционально):"
 
@@ -1014,10 +989,7 @@
 msgid "Comparison"
 msgstr "Сравнение"
 
-msgid "Compiler"
-msgstr "Компилятор"
-
-#: ../ProjectController.py:672
+#: ../ProjectController.py:756
 msgid "Compiling IEC Program into C code...\n"
 msgstr "Компиляция МЭК-программы в C-код...\n"
 
@@ -1025,93 +997,93 @@
 msgid "Concatenation"
 msgstr "Объединение"
 
-#: ../editors/ConfTreeNodeEditor.py:229
+#: ../editors/ConfTreeNodeEditor.py:241
 msgid "Config"
 msgstr "Конфигурация"
 
-#: ../editors/ProjectNodeEditor.py:36
+#: ../editors/ProjectNodeEditor.py:39
 msgid "Config variables"
 msgstr "Конфигурационные переменные"
 
-#: ../dialogs/SearchInProjectDialog.py:39
+#: ../dialogs/SearchInProjectDialog.py:43
 msgid "Configuration"
 msgstr "Конфигурация"
 
-#: ../PLCControler.py:97
+#: ../plcopen/types_enums.py:77
 msgid "Configurations"
 msgstr "Конфигурации"
 
-#: ../editors/Viewer.py:307 ../editors/Viewer.py:337 ../editors/Viewer.py:359
-#: ../editors/TextViewer.py:291 ../editors/TextViewer.py:342
-#: ../editors/TextViewer.py:365 ../controls/VariablePanel.py:328
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
 msgid "Confirm or change variable name"
 msgstr "Подтвердить или поменять имя переменной"
 
-#: ../ProjectController.py:1788
+#: ../ProjectController.py:1842
 msgid "Connect"
 msgstr "Подключиться"
 
-#: ../ProjectController.py:1789
+#: ../ProjectController.py:1843
 msgid "Connect to the target PLC"
 msgstr "Подключиться к целевому ПЛК"
 
-#: ../ProjectController.py:1292
+#: ../ProjectController.py:1391
 #, python-format
 msgid "Connected to URI: %s"
 msgstr "Подключен к URI: %s"
 
-#: ../dialogs/SFCTransitionDialog.py:76 ../editors/Viewer.py:527
-#: ../editors/Viewer.py:2359
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
 msgid "Connection"
 msgstr "Подключение"
 
-#: ../dialogs/ConnectionDialog.py:52
+#: ../dialogs/ConnectionDialog.py:55
 msgid "Connection Properties"
-msgstr "Свойства подключение"
-
-#: ../ProjectController.py:1647
+msgstr "Свойства подключения"
+
+#: ../ProjectController.py:1691
 msgid "Connection canceled!\n"
 msgstr "Подключение отменено!\n"
 
-#: ../ProjectController.py:1672
+#: ../ProjectController.py:1714
 #, python-format
 msgid "Connection failed to %s!\n"
 msgstr "Неудачное подключение к %s!\n"
 
-#: ../connectors/PYRO/__init__.py:115 ../connectors/WAMP/__init__.py:111
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
 msgid "Connection lost!\n"
 msgstr "Подключение прервано!\n"
 
-#: ../connectors/PYRO/__init__.py:102
+#: ../connectors/PYRO/__init__.py:110
 #, python-format
 msgid "Connection to '%s' failed.\n"
 msgstr "Неудачное подключение к %s!\n"
 
-#: ../dialogs/ConnectionDialog.py:64 ../editors/Viewer.py:1594
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
 msgid "Connector"
 msgstr "Коннектор"
 
-#: ../dialogs/SFCStepDialog.py:65
+#: ../dialogs/SFCStepDialog.py:68
 msgid "Connectors:"
 msgstr "Коннекторы:"
 
-#: ../Beremiz.py:448
+#: ../BeremizIDE.py:378
 msgid "Console"
 msgstr "Консоль"
 
-#: ../controls/VariablePanel.py:60
+#: ../controls/VariablePanel.py:75
 msgid "Constant"
 msgstr "Константа"
 
-#: ../editors/Viewer.py:537 ../editors/Viewer.py:2362
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
 msgid "Contact"
 msgstr "Контакт"
 
-#: ../controls/ProjectPropertiesPanel.py:197
+#: ../controls/ProjectPropertiesPanel.py:217
 msgid "Content Description (optional):"
 msgstr "Описание содержимого (опционально):"
 
-#: ../dialogs/ConnectionDialog.py:65 ../editors/Viewer.py:1595
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
 msgid "Continuation"
 msgstr "Продолжение"
 
@@ -1131,31 +1103,28 @@
 msgid "Conversion to time-of-day"
 msgstr "Преобразование во время суток"
 
-#: ../editors/Viewer.py:597 ../controls/LogViewer.py:693 ../IDEFrame.py:370
-#: ../IDEFrame.py:425
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
 msgid "Copy"
 msgstr "Копировать"
 
-#: ../IDEFrame.py:1930
+#: ../IDEFrame.py:1964
 msgid "Copy POU"
 msgstr "Копировать POU"
 
-#: ../editors/FileManagementPanel.py:65
+#: ../editors/FileManagementPanel.py:68
 msgid "Copy file from left folder to right"
 msgstr "Скопировать файл с левой директории в правую"
 
-#: ../editors/FileManagementPanel.py:64
+#: ../editors/FileManagementPanel.py:67
 msgid "Copy file from right folder to left"
 msgstr "Скопировать файл с правой директории в левую"
 
-msgid "Copy of IN"
-msgstr "Копия входа IN"
-
 #: ../plcopen/iec_std.csv:28
 msgid "Cosine"
 msgstr "Косинус"
 
-#: ../ConfigTreeNode.py:656
+#: ../ConfigTreeNode.py:660
 #, python-brace-format
 msgid ""
 "Could not add child \"{a1}\", type {a2} :\n"
@@ -1164,12 +1133,12 @@
 "Невозможно добавить дочерний элемент \"{a1}\", тип {a2}:\n"
 "{a3}\n"
 
-#: ../py_ext/PythonFileCTNMixin.py:77
+#: ../py_ext/PythonFileCTNMixin.py:81
 #, python-format
 msgid "Couldn't import old %s file."
 msgstr "Невозможно импортировать старый файл %s."
 
-#: ../ConfigTreeNode.py:626
+#: ../ConfigTreeNode.py:630
 #, python-brace-format
 msgid ""
 "Couldn't load confnode base parameters {a1} :\n"
@@ -1178,7 +1147,7 @@
 "Невозможно загрузить базовые параметры confnode {a1}:\n"
 " {a2}"
 
-#: ../ConfigTreeNode.py:643 ../CodeFileTreeNode.py:124
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
 #, python-brace-format
 msgid ""
 "Couldn't load confnode parameters {a1} :\n"
@@ -1187,111 +1156,107 @@
 "Невозможно загрузить параметры confnode {a1}:\n"
 " {a2}"
 
-#: ../PLCControler.py:946
+#: ../PLCControler.py:552
 msgid "Couldn't paste non-POU object."
 msgstr "Невозможно вставить не-POU."
 
-#: ../ProjectController.py:1589
+#: ../ProjectController.py:1636
 msgid "Couldn't start PLC !\n"
 msgstr "Невозможно запустить ПЛК!\n"
 
-#: ../ProjectController.py:1597
+#: ../ProjectController.py:1644
 msgid "Couldn't stop PLC !\n"
 msgstr "Невозможно остановить ПЛК!\n"
 
-#: ../ProjectController.py:1561
-msgid "Couldn't stop debugger.\n"
-msgstr "Невозможно остановить отладчик.\n"
-
-#: ../svgui/svgui.py:47
+#: ../svgui/svgui.py:57
 msgid "Create HMI"
 msgstr "Создать HMI"
 
-#: ../dialogs/PouDialog.py:45
+#: ../dialogs/PouDialog.py:54
 msgid "Create a new POU"
 msgstr "Создать новый POU"
 
-#: ../dialogs/PouActionDialog.py:38
+#: ../dialogs/PouActionDialog.py:45
 msgid "Create a new action"
 msgstr "Создать новое действие"
 
-#: ../IDEFrame.py:159
+#: ../IDEFrame.py:166
 msgid "Create a new action block"
 msgstr "Создать новый блок действие"
 
-#: ../IDEFrame.py:108 ../IDEFrame.py:138 ../IDEFrame.py:171
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
 msgid "Create a new block"
 msgstr "Создать новый блок"
 
-#: ../IDEFrame.py:132
+#: ../IDEFrame.py:139
 msgid "Create a new branch"
 msgstr "Создать новое ветвление"
 
-#: ../IDEFrame.py:126
+#: ../IDEFrame.py:133
 msgid "Create a new coil"
 msgstr "Создать новую катушку"
 
-#: ../IDEFrame.py:102 ../IDEFrame.py:117 ../IDEFrame.py:147
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
 msgid "Create a new comment"
 msgstr "Создать новый комментарий"
 
-#: ../IDEFrame.py:111 ../IDEFrame.py:141 ../IDEFrame.py:174
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
 msgid "Create a new connection"
 msgstr "Создать новое подключение"
 
-#: ../IDEFrame.py:129 ../IDEFrame.py:180
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
 msgid "Create a new contact"
 msgstr "Создать новый контакт"
 
-#: ../IDEFrame.py:162
+#: ../IDEFrame.py:169
 msgid "Create a new divergence"
 msgstr "Создать новое ветвление"
 
-#: ../dialogs/SFCDivergenceDialog.py:53
+#: ../dialogs/SFCDivergenceDialog.py:54
 msgid "Create a new divergence or convergence"
 msgstr "Создать новое ветвление или объединение"
 
-#: ../IDEFrame.py:150
+#: ../IDEFrame.py:157
 msgid "Create a new initial step"
 msgstr "Создать исходный шаг"
 
-#: ../IDEFrame.py:165
+#: ../IDEFrame.py:172
 msgid "Create a new jump"
 msgstr "Создать новый безусловный переход"
 
-#: ../IDEFrame.py:120 ../IDEFrame.py:177
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
 msgid "Create a new power rail"
 msgstr "Создать новую линию питания"
 
-#: ../IDEFrame.py:123
+#: ../IDEFrame.py:130
 msgid "Create a new rung"
 msgstr "Создать новую цепь"
 
-#: ../IDEFrame.py:153
+#: ../IDEFrame.py:160
 msgid "Create a new step"
 msgstr "Создать новый шаг"
 
-#: ../dialogs/PouTransitionDialog.py:47 ../IDEFrame.py:156
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
 msgid "Create a new transition"
 msgstr "Создать новый переход"
 
-#: ../IDEFrame.py:105 ../IDEFrame.py:135 ../IDEFrame.py:168
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
 msgid "Create a new variable"
 msgstr "Создать новую переменную"
 
-#: ../dialogs/AboutDialog.py:105
+#: ../dialogs/AboutDialog.py:109
 msgid "Credits"
 msgstr "Благодарности"
 
-#: ../Beremiz_service.py:432
+#: ../Beremiz_service.py:424
 msgid "Current working directory :"
 msgstr "Текущая рабочая директория :"
 
-#: ../editors/Viewer.py:596 ../IDEFrame.py:368 ../IDEFrame.py:424
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
 msgid "Cut"
 msgstr "Вырезать"
 
-#: ../editors/ResourceEditor.py:72
+#: ../editors/ResourceEditor.py:81
 msgid "Cyclic"
 msgstr "Циклический"
 
@@ -1303,19 +1268,19 @@
 msgid "DEPRECATED"
 msgstr "УСТАРЕЛО"
 
-#: ../canfestival/SlaveEditor.py:76 ../canfestival/NetworkEditor.py:97
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
 msgid "DS-301 Profile"
 msgstr "Профиль DS-301"
 
-#: ../canfestival/SlaveEditor.py:77 ../canfestival/NetworkEditor.py:98
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
 msgid "DS-302 Profile"
 msgstr "Профиль DS-302"
 
-#: ../dialogs/SearchInProjectDialog.py:35
+#: ../dialogs/SearchInProjectDialog.py:39
 msgid "Data Type"
 msgstr "Тип данных"
 
-#: ../PLCControler.py:96
+#: ../plcopen/types_enums.py:76
 msgid "Data Types"
 msgstr "Типы данных"
 
@@ -1336,69 +1301,60 @@
 msgid "Date subtraction"
 msgstr "Вычитание дат"
 
-msgid "Datetime, current or relative to PDT"
-msgstr "Текущие дата и время, абсолютные или относительные от PDT"
-
-#: ../dialogs/DurationEditorDialog.py:43
+#: ../dialogs/DurationEditorDialog.py:46
 msgid "Days:"
 msgstr "Дни:"
 
-#: ../ProjectController.py:1694
+#: ../ProjectController.py:1729
 msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
-msgstr "Отлаживаемая программа не соответствует программе в ПЛК - остановите/загрузите/запустите, чтобы разрешить отладку\n"
-
-#: ../controls/PouInstanceVariablesPanel.py:134
+msgstr ""
+"Отлаживаемая программа не соответствует программе в ПЛК - "
+"остановите/загрузите/запустите, чтобы разрешить отладку\n"
+
+#: ../controls/PouInstanceVariablesPanel.py:144
 msgid "Debug instance"
 msgstr "Отладка экземпляра"
 
-#: ../editors/Viewer.py:1117 ../editors/Viewer.py:3653
+#: ../editors/Viewer.py:490
 #, python-format
 msgid "Debug: %s"
 msgstr "Отладка: %s"
 
-#: ../ProjectController.py:1350
+#: ../ProjectController.py:1471
 #, python-format
 msgid "Debug: Unknown variable '%s'\n"
 msgstr "Отладка: неизвестная переменная '%s'\n"
 
-#: ../ProjectController.py:1348
+#: ../ProjectController.py:1469
 #, python-format
 msgid "Debug: Unsupported type to debug '%s'\n"
 msgstr "Отладка: неподдерживамый отладкой тип '%s'\n"
 
-#: ../IDEFrame.py:639
+#: ../IDEFrame.py:660
 msgid "Debugger"
 msgstr "Отладчик"
 
-#: ../ProjectController.py:1530
-msgid "Debugger disabled\n"
-msgstr "Отладчик запрещен\n"
-
-#: ../ProjectController.py:1691
+#: ../ProjectController.py:1726
 msgid "Debugger ready\n"
 msgstr "Отладчик готов\n"
 
-#: ../ProjectController.py:1563
-msgid "Debugger stopped.\n"
-msgstr "Отладчик остановлен.\n"
-
-#: ../editors/Viewer.py:572 ../Beremiz.py:1064 ../IDEFrame.py:1959
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
 msgid "Delete"
 msgstr "Удалить"
 
-#: ../editors/Viewer.py:514
+#: ../editors/Viewer.py:610
 msgid "Delete Divergence Branch"
 msgstr "Удалить ветвь"
 
-#: ../editors/FileManagementPanel.py:153
+#: ../editors/FileManagementPanel.py:157
 msgid "Delete File"
 msgstr "Удалить файл"
 
-#: ../editors/Viewer.py:501
+#: ../editors/Viewer.py:597
 msgid "Delete Wire Segment"
 msgstr "Удалить сегмент цепи"
 
-#: ../controls/CustomEditableListBox.py:41
+#: ../controls/CustomEditableListBox.py:44
 msgid "Delete item"
 msgstr "Удалить"
 
@@ -1406,52 +1362,47 @@
 msgid "Deletion (within)"
 msgstr "Удаление подстроки"
 
-#: ../editors/DataTypeEditor.py:153
+#: ../editors/DataTypeEditor.py:161
 msgid "Derivation Type:"
 msgstr "Механизм создания типа:"
 
-msgid "Derivative time constant"
-msgstr "Постоянная времени дифференцирования"
-
-#: ../controls/VariablePanel.py:432
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr "Описание"
+
+#: ../controls/VariablePanel.py:463
 msgid "Description:"
 msgstr "Описание:"
 
-msgid "Differentiated output"
-msgstr "Дифференцированный выход"
-
-#: ../dialogs/ArrayTypeDialog.py:61 ../editors/DataTypeEditor.py:321
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
 msgid "Dimensions:"
 msgstr "Размеры:"
 
-#: ../dialogs/FindInPouDialog.py:68
+#: ../dialogs/FindInPouDialog.py:69
 msgid "Direction"
 msgstr "Направление"
 
-#: ../dialogs/BrowseLocationsDialog.py:90
+#: ../dialogs/BrowseLocationsDialog.py:102
 msgid "Direction:"
 msgstr "Направление:"
 
-#: ../editors/DataTypeEditor.py:54
+#: ../editors/DataTypeEditor.py:60
 msgid "Directly"
 msgstr "Синоним"
 
-msgid "Disable_Extensions"
-msgstr "Запретить расширения"
-
-#: ../ProjectController.py:1797
+#: ../ProjectController.py:1855
 msgid "Disconnect"
 msgstr "Отключиться"
 
-#: ../ProjectController.py:1799
+#: ../ProjectController.py:1856
 msgid "Disconnect from PLC"
 msgstr "Отключиться от ПЛК"
 
-#: ../ProjectController.py:1302
+#: ../ProjectController.py:1401
 msgid "Disconnected"
 msgstr "Отключено"
 
-#: ../editors/Viewer.py:556 ../editors/Viewer.py:2354
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
 msgid "Divergence"
 msgstr "Ветвление"
 
@@ -1459,126 +1410,121 @@
 msgid "Division"
 msgstr "Деление"
 
-#: ../editors/FileManagementPanel.py:152
+#: ../editors/FileManagementPanel.py:156
 #, python-format
 msgid "Do you really want to delete the file '%s'?"
 msgstr "Вы действительно хотите удалить этот файл '%s'?"
 
-#: ../controls/VariablePanel.py:53 ../controls/VariablePanel.py:54
+#: ../controls/VariablePanel.py:65
 msgid "Documentation"
 msgstr "Описание"
 
-#: ../PLCOpenEditor.py:328
+#: ../PLCOpenEditor.py:312
 msgid "Done"
 msgstr "Завершено"
 
-#: ../dialogs/ActionBlockDialog.py:38
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Duration"
 msgstr "Длительность"
 
-#: ../canfestival/canfestival.py:163
+#: ../canfestival/canfestival.py:174
 msgid "EDS files (*.eds)|*.eds|All files|*.*"
 msgstr "Файлы EDS (*.eds)|*.eds|All files|*.*"
 
-#: ../editors/Viewer.py:570
+#: ../editors/Viewer.py:668
 msgid "Edit Block"
 msgstr "Редактировать блок"
 
-#: ../dialogs/LDElementDialog.py:56
+#: ../dialogs/LDElementDialog.py:58
 msgid "Edit Coil Values"
 msgstr "Редактировать значение катушки"
 
-#: ../dialogs/LDElementDialog.py:54
+#: ../dialogs/LDElementDialog.py:56
 msgid "Edit Contact Values"
 msgstr "Редактировать значение контакта"
 
-#: ../dialogs/DurationEditorDialog.py:59
+#: ../dialogs/DurationEditorDialog.py:62
 msgid "Edit Duration"
 msgstr "Редактировать длительность"
 
-#: ../dialogs/SFCStepDialog.py:50
+#: ../dialogs/SFCStepDialog.py:53
 msgid "Edit Step"
 msgstr "Редактировать шаг"
 
-#: ../wxglade_hmi/wxglade_hmi.py:36
+#: ../wxglade_hmi/wxglade_hmi.py:45
 msgid "Edit a WxWidgets GUI with WXGlade"
 msgstr "Редактировать WxWidgets GUI с помощью WXGlade"
 
-#: ../dialogs/ActionBlockDialog.py:121
+#: ../dialogs/ActionBlockDialog.py:127
 msgid "Edit action block properties"
 msgstr "Редактировать свойства блока действия"
 
-#: ../dialogs/ArrayTypeDialog.py:45
+#: ../dialogs/ArrayTypeDialog.py:47
 msgid "Edit array type properties"
 msgstr "Редактировать свойства массива"
 
-#: ../editors/Viewer.py:2575 ../editors/Viewer.py:3004
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
 msgid "Edit comment"
 msgstr "Редактировать комментарий"
 
-#: ../editors/FileManagementPanel.py:66
+#: ../editors/FileManagementPanel.py:69
 msgid "Edit file"
 msgstr "Редактировать файл"
 
-#: ../controls/CustomEditableListBox.py:39
+#: ../controls/CustomEditableListBox.py:42
 msgid "Edit item"
 msgstr "Редактировать элемент"
 
-#: ../editors/Viewer.py:2963
+#: ../editors/Viewer.py:3059
 msgid "Edit jump target"
 msgstr "Редактирование безусловного перехода"
 
-#: ../ProjectController.py:1811
+#: ../ProjectController.py:1873
 msgid "Edit raw IEC code added to code generated by PLCGenerator"
-msgstr "Редактировать МЭК-код добавленный к коду сгенерированному PLCGenerator"
-
-#: ../editors/SFCViewer.py:799
+msgstr ""
+"Редактировать МЭК-код добавленный к коду сгенерированному PLCGenerator"
+
+#: ../editors/SFCViewer.py:815
 msgid "Edit step name"
 msgstr "Редактировать имя шага"
 
-#: ../dialogs/SFCTransitionDialog.py:51
+#: ../dialogs/SFCTransitionDialog.py:53
 msgid "Edit transition"
 msgstr "Редактировать переход"
 
-#: ../IDEFrame.py:611
+#: ../IDEFrame.py:632
 msgid "Editor ToolBar"
 msgstr "Редактор панели инструментов"
 
-#: ../ProjectController.py:1195
+#: ../ProjectController.py:1294
 msgid "Editor selection"
 msgstr "Редактор выделения"
 
-msgid "Elapsed time of ramp"
-msgstr "Прошедшее время нарастания"
-
-#: ../editors/DataTypeEditor.py:348
+#: ../editors/DataTypeEditor.py:360
 msgid "Elements :"
 msgstr "Элементы:"
 
-#: ../ProjectController.py:1300
+#: ../ProjectController.py:1399
 msgid "Empty"
 msgstr "Нет программы"
 
-#: ../IDEFrame.py:365
-msgid "Enable Undo/Redo"
-msgstr "Разрешить отмену и повтор операций"
-
-msgid "Enabled"
-msgstr "Разрешено"
-
-#: ../Beremiz_service.py:331
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr "Размер не должен быть нулевым"
+
+#: ../Beremiz_service.py:341
 msgid "Enter a name "
 msgstr "Введите имя"
 
-#: ../Beremiz_service.py:316
+#: ../Beremiz_service.py:326
 msgid "Enter a port number "
 msgstr "Введите номер порта"
 
-#: ../Beremiz_service.py:307
+#: ../Beremiz_service.py:317
 msgid "Enter the IP of the interface to bind"
 msgstr "Введите IP-адрес используемого интерфейса"
 
-#: ../editors/DataTypeEditor.py:54
+#: ../editors/DataTypeEditor.py:60
 msgid "Enumerated"
 msgstr "Перечисление"
 
@@ -1586,81 +1532,95 @@
 msgid "Equal to"
 msgstr "Равно"
 
-#: ../dialogs/ForceVariableDialog.py:179
-#: ../dialogs/SearchInProjectDialog.py:168 ../dialogs/SFCStepNameDialog.py:60
-#: ../dialogs/DurationEditorDialog.py:121
-#: ../dialogs/DurationEditorDialog.py:163 ../dialogs/PouTransitionDialog.py:112
-#: ../dialogs/BlockPreviewDialog.py:236 ../dialogs/ProjectDialog.py:71
-#: ../dialogs/ArrayTypeDialog.py:97 ../dialogs/ArrayTypeDialog.py:103
-#: ../dialogs/PouNameDialog.py:54 ../dialogs/BrowseLocationsDialog.py:216
-#: ../dialogs/BrowseValuesLibraryDialog.py:83 ../dialogs/PouActionDialog.py:104
-#: ../dialogs/PouDialog.py:134 ../PLCOpenEditor.py:335 ../PLCOpenEditor.py:340
-#: ../PLCOpenEditor.py:420 ../PLCOpenEditor.py:430 ../editors/Viewer.py:423
-#: ../editors/LDViewer.py:666 ../editors/LDViewer.py:882
-#: ../editors/LDViewer.py:886 ../editors/DataTypeEditor.py:550
-#: ../editors/DataTypeEditor.py:555 ../editors/DataTypeEditor.py:579
-#: ../editors/DataTypeEditor.py:584 ../editors/DataTypeEditor.py:594
-#: ../editors/DataTypeEditor.py:745 ../editors/DataTypeEditor.py:752
-#: ../editors/TextViewer.py:389 ../editors/CodeFileEditor.py:783
-#: ../ProjectController.py:293 ../ProjectController.py:421
-#: ../ProjectController.py:428 ../controls/FolderTree.py:217
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:166
-#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:137
-#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:231
-#: ../controls/VariablePanel.py:402 ../controls/VariablePanel.py:772
-#: ../Beremiz.py:1203 ../IDEFrame.py:1003 ../IDEFrame.py:1614
-#: ../IDEFrame.py:1655 ../IDEFrame.py:1660 ../IDEFrame.py:1674
-#: ../IDEFrame.py:1679 ../Beremiz_service.py:211
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
 msgid "Error"
 msgstr "Ошибка"
 
-#: ../ProjectController.py:727
-msgid "Error : At least one configuration and one resource must be declared in PLC !\n"
-msgstr "Ошибка: Как минимум одна конфигурация и один ресурс должны быть задекларированы в ПЛК!\n"
-
-#: ../ProjectController.py:719
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+"Ошибка: Как минимум одна конфигурация и один ресурс должны быть "
+"задекларированы в ПЛК!\n"
+
+#: ../ProjectController.py:803
 #, python-format
 msgid "Error : IEC to C compiler returned %d\n"
 msgstr "Ошибка: компилятор МЭК в C вернул код ошибки %d\n"
 
-#: ../ProjectController.py:621
+#: ../ProjectController.py:731
 #, python-format
 msgid ""
 "Error in ST/IL/SFC code generator :\n"
 "%s\n"
 msgstr "Ошибка в ST/IL/SFC кодогенераторе: %s\n"
 
-#: ../ConfigTreeNode.py:216
+#: ../ConfigTreeNode.py:219
 #, python-format
 msgid "Error while saving \"%s\"\n"
 msgstr "Ошибка во время сохранения \"%s\"\n"
 
-#: ../canfestival/canfestival.py:168
+#: ../canfestival/canfestival.py:179
 msgid "Error: Export slave failed\n"
 msgstr "Ошибка: неудачный экспорт ведомого\n"
 
-#: ../canfestival/canfestival.py:369
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+"Ошибка: Modbus/IP сервера %{a1}.x и %{a2}.x используют один и тот же порт "
+"{a3}.\n"
+
+#: ../canfestival/canfestival.py:388
 msgid "Error: No Master generated\n"
 msgstr "Ошибка: мастер не сгенерирован\n"
 
-#: ../canfestival/canfestival.py:364
+#: ../canfestival/canfestival.py:383
 msgid "Error: No PLC built\n"
 msgstr "Ошибка: ПЛК не собран\n"
 
-#: ../ProjectController.py:1666
+#: ../ProjectController.py:1708
 #, python-format
 msgid "Exception while connecting %s!\n"
 msgstr "Исключение во время подключения %s!\n"
 
-#: ../dialogs/FBDBlockDialog.py:117
+#: ../dialogs/FBDBlockDialog.py:123
 msgid "Execution Control:"
 msgstr "Управление исполнением:"
 
-#: ../dialogs/FBDVariableDialog.py:79 ../dialogs/FBDBlockDialog.py:105
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
 msgid "Execution Order:"
 msgstr "Порядок исполнения:"
 
-#: ../features.py:35
+#: ../features.py:36
 msgid "Experimental web based HMI"
 msgstr "Экспериментальный WEB-HMI"
 
@@ -1672,83 +1632,77 @@
 msgid "Exponentiation"
 msgstr "Взятие экспоненты"
 
-#: ../canfestival/canfestival.py:174
+#: ../canfestival/canfestival.py:186
 msgid "Export CanOpen slave to EDS file"
 msgstr "Экспортировать CanOpen ведомое устройство в EDS файл"
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:243
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
 msgid "Export graph values to clipboard"
 msgstr "Экспортировать график значений в буфер обмена"
 
-#: ../canfestival/canfestival.py:173
+#: ../canfestival/canfestival.py:185
 msgid "Export slave"
 msgstr "Экспортировать ведомое устройство"
 
-#: ../dialogs/FBDVariableDialog.py:89
+#: ../dialogs/FBDVariableDialog.py:94
 msgid "Expression:"
 msgstr "Выражение:"
 
-#: ../controls/VariablePanel.py:72
+#: ../controls/VariablePanel.py:90
 msgid "External"
 msgstr "Внешний"
 
-#: ../ProjectController.py:740
+#: ../ProjectController.py:826
 msgid "Extracting Located Variables...\n"
 msgstr "Экспорт локальных переменных...\n"
 
-msgid "FB for derivative term"
-msgstr "ФБ дифференцирования"
-
-msgid "FB for integral term"
-msgstr "ФД интегрирования"
-
-#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36 ../controls/ProjectPropertiesPanel.py:143
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "FBD"
 msgstr "FBD"
 
-#: ../ProjectController.py:1729
+#: ../ProjectController.py:1773
 msgid "Failed : Must build before transfer.\n"
 msgstr "Ошибка: необходима сборка перед передачей.\n"
 
-#: ../dialogs/LDElementDialog.py:77 ../editors/Viewer.py:462
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
 msgid "Falling Edge"
 msgstr "Спадающий фронт"
 
-#: ../ProjectController.py:1008
+#: ../ProjectController.py:1098
 msgid "Fatal : cannot get builder.\n"
 msgstr "Ошибка: невозможно получить сборщик.\n"
 
-#: ../Beremiz.py:118
+#: ../Beremiz.py:160
 #, python-format
 msgid "Fetching %s"
 msgstr "Проверка %s"
 
-#: ../dialogs/DurationEditorDialog.py:160
+#: ../dialogs/DurationEditorDialog.py:167
 #, python-format
 msgid "Field %s hasn't a valid value!"
 msgstr "Поле %s имеет неверное значение!"
 
-#: ../dialogs/DurationEditorDialog.py:162
+#: ../dialogs/DurationEditorDialog.py:169
 #, python-format
 msgid "Fields %s haven't a valid value!"
 msgstr "Поля %s имеют неверные значения!"
 
-#: ../controls/FolderTree.py:216
+#: ../controls/FolderTree.py:221
 #, python-format
 msgid "File '%s' already exists!"
 msgstr "Файл '%s' уже существует!"
 
-#: ../dialogs/SearchInProjectDialog.py:100 ../dialogs/FindInPouDialog.py:36
-#: ../dialogs/FindInPouDialog.py:106 ../IDEFrame.py:375
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
 msgid "Find"
 msgstr "Поиск"
 
-#: ../IDEFrame.py:377
+#: ../IDEFrame.py:379
 msgid "Find Next"
 msgstr "Поиск следующего"
 
-#: ../IDEFrame.py:379
+#: ../IDEFrame.py:381
 msgid "Find Previous"
 msgstr "Поиск предыдущего"
 
@@ -1756,96 +1710,90 @@
 msgid "Find position"
 msgstr "Поиск позиции"
 
-#: ../dialogs/FindInPouDialog.py:57
+#: ../dialogs/FindInPouDialog.py:58
 msgid "Find:"
 msgstr "Поиск:"
 
-#: ../connectors/PYRO/__init__.py:163
-msgid "Force runtime reload\n"
-msgstr "Принудительный перезапуск системы исполнения\n"
-
-#: ../editors/Viewer.py:1553
+#: ../editors/Viewer.py:1633
 msgid "Force value"
-msgstr "Фиксировать значение"
-
-#: ../dialogs/ForceVariableDialog.py:162
+msgstr "Форсировать значение"
+
+#: ../dialogs/ForceVariableDialog.py:176
 msgid "Forcing Variable Value"
 msgstr "Форсировать значение переменной"
 
-#: ../dialogs/SFCTransitionDialog.py:179 ../dialogs/PouTransitionDialog.py:102
-#: ../dialogs/ProjectDialog.py:70 ../dialogs/PouActionDialog.py:94
-#: ../dialogs/PouDialog.py:116
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
 #, python-format
 msgid "Form isn't complete. %s must be filled!"
-msgstr "Форма заполнена неполностью. %s должен быть заполнен!"
-
-#: ../dialogs/SFCStepDialog.py:144 ../dialogs/FBDBlockDialog.py:232
-#: ../dialogs/ConnectionDialog.py:160
+msgstr "Форма заполнена не полностью. %s необходимо заполнить!"
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
 msgid "Form isn't complete. Name must be filled!"
-msgstr "Форма заполнена неполностью. Имя должно быть заполнено!"
-
-#: ../dialogs/FBDBlockDialog.py:228
+msgstr "Форма заполнена не полностью. Имя должно быть заполнено!"
+
+#: ../dialogs/FBDBlockDialog.py:235
 msgid "Form isn't complete. Valid block type must be selected!"
-msgstr "Форма заполнена неполностью. Должен быть выбран корректный тип блока!"
-
-#: ../dialogs/FindInPouDialog.py:74
+msgstr ""
+"Форма заполнена не полностью. Должен быть выбран корректный тип блока!"
+
+#: ../dialogs/FindInPouDialog.py:75
 msgid "Forward"
 msgstr "Вперед"
 
-#: ../dialogs/SearchInProjectDialog.py:36 ../IDEFrame.py:1746
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
 msgid "Function"
 msgstr "Функция"
 
-#: ../IDEFrame.py:349
+#: ../IDEFrame.py:354
 msgid "Function &Block"
 msgstr "Функциональный &блок"
 
-#: ../dialogs/SearchInProjectDialog.py:37 ../IDEFrame.py:1745
-#: ../IDEFrame.py:1938
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
 msgid "Function Block"
 msgstr "Функциональный блок"
 
-#: ../controls/VariablePanel.py:825
+#: ../controls/VariablePanel.py:868
 msgid "Function Block Types"
 msgstr "Типы функциональных блоков"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:75
 msgid "Function Blocks"
 msgstr "Функциональные блоки"
 
-#: ../editors/Viewer.py:248
+#: ../editors/Viewer.py:290
 msgid "Function Blocks can't be used in Functions!"
 msgstr "Функциональные блоки не могут использоваться в функциях!"
 
-#: ../PLCControler.py:2337
+#: ../PLCControler.py:1907
 #, python-format
 msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
 msgstr "Функциональный блок \"%s\" не может быть вставлен в функцию!!!"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:75
 msgid "Functions"
 msgstr "Функции"
 
-#: ../PLCOpenEditor.py:115
+#: ../PLCOpenEditor.py:88
 msgid "Generate Program"
 msgstr "Сгенерировать программу"
 
-#: ../ProjectController.py:612
+#: ../ProjectController.py:722
 msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
 msgstr "Генерация МЭК-61131 ST/IL/SFC кода ПЛК...\n"
 
-msgid "Generic"
-msgstr "Generic"
-
-#: ../controls/VariablePanel.py:73
+#: ../controls/VariablePanel.py:91
 msgid "Global"
 msgstr "Глобальный"
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:242
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
 msgid "Go to current value"
 msgstr "Перейти к текущему значению"
 
-#: ../controls/ProjectPropertiesPanel.py:173
+#: ../controls/ProjectPropertiesPanel.py:189
 msgid "Graphics"
 msgstr "Графика"
 
@@ -1857,117 +1805,116 @@
 msgid "Greater than or equal to"
 msgstr "Больше или равно"
 
-#: ../controls/ProjectPropertiesPanel.py:134
+#: ../controls/ProjectPropertiesPanel.py:149
 msgid "Grid Resolution:"
 msgstr "Шаг сетки:"
 
-#: ../runtime/NevowServer.py:181
+#: ../runtime/NevowServer.py:192
 msgid "HTTP interface port :"
 msgstr "Порт HTTP-интерфейса :"
 
-#: ../controls/ProjectPropertiesPanel.py:120
+#: ../controls/ProjectPropertiesPanel.py:135
 msgid "Height:"
 msgstr "Высота:"
 
-#: ../editors/FileManagementPanel.py:85
+#: ../editors/FileManagementPanel.py:89
 msgid "Home Directory:"
 msgstr "Домашняя директория:"
 
-#: ../controls/ProjectPropertiesPanel.py:150
+#: ../controls/ProjectPropertiesPanel.py:165
 msgid "Horizontal:"
 msgstr "Горизонтальный:"
 
-#: ../dialogs/DurationEditorDialog.py:44
+#: ../dialogs/DurationEditorDialog.py:47
 msgid "Hours:"
 msgstr "Часы:"
 
-msgid "IEC_Channel"
-msgstr "МЭК-канал"
-
-#: ../dialogs/PouActionDialog.py:31 ../dialogs/PouDialog.py:36
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
 msgid "IL"
 msgstr "IL"
 
-#: ../dialogs/DiscoveryDialog.py:94
+#: ../dialogs/DiscoveryDialog.py:91
 msgid "IP"
 msgstr "IP"
 
-#: ../Beremiz_service.py:308 ../Beremiz_service.py:309
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
 msgid "IP is not valid!"
 msgstr "Неверный IP-адрес"
 
-#: ../svgui/svgui.py:42 ../svgui/svgui.py:43
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
 msgid "Import SVG"
 msgstr "Импорт SVG"
 
-#: ../dialogs/FBDVariableDialog.py:38 ../editors/Viewer.py:1580
-#: ../controls/VariablePanel.py:71
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
 msgid "InOut"
 msgstr "Вход/Выход"
 
-#: ../editors/Viewer.py:1100
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+"Входная/Выходная переменная {a1} в блоке {a2} в POU {a3} должна быть "
+"подключена."
+
+#: ../editors/Viewer.py:473
 msgid "Inactive"
 msgstr "Неактивный"
 
-#: ../controls/VariablePanel.py:276
+#: ../controls/VariablePanel.py:300
 #, python-brace-format
 msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
 msgstr "\"{a1}\" и \"{a2}\" имеют несовместимые типы данных"
 
-#: ../controls/VariablePanel.py:282
+#: ../controls/VariablePanel.py:306
 #, python-format
 msgid "Incompatible size of data between \"%s\" and \"BOOL\""
 msgstr "Несовместимый размер данных \"%s\" с типом \"BOOL\""
 
-#: ../controls/VariablePanel.py:286
+#: ../controls/VariablePanel.py:310
 #, python-brace-format
 msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
 msgstr "\"{a1}\" и \"{a2}\" имеют несовместимый размер данных"
 
-#: ../dialogs/ActionBlockDialog.py:38
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Indicator"
 msgstr "Индикатор"
 
-#: ../editors/Viewer.py:552
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr "Исходное значение"
+
+#: ../editors/Viewer.py:650
 msgid "Initial Step"
 msgstr "Исходный шаг"
 
-#: ../editors/DataTypeEditor.py:50 ../controls/VariablePanel.py:53
-#: ../controls/VariablePanel.py:54
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
 msgid "Initial Value"
 msgstr "Исходное значение"
 
-#: ../editors/DataTypeEditor.py:185 ../editors/DataTypeEditor.py:216
-#: ../editors/DataTypeEditor.py:272 ../editors/DataTypeEditor.py:310
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
 msgid "Initial Value:"
 msgstr "Исходное значение:"
 
-msgid "Initial value"
-msgstr "Исходное значение"
-
-#: ../svgui/svgui.py:46
+#: ../svgui/svgui.py:56
 msgid "Inkscape"
 msgstr "Inkscape"
 
-#: ../dialogs/SFCTransitionDialog.py:75 ../dialogs/ActionBlockDialog.py:42
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "Непосредственно"
 
-#: ../dialogs/SFCStepDialog.py:70 ../dialogs/FBDVariableDialog.py:37
-#: ../dialogs/BrowseLocationsDialog.py:40 ../editors/Viewer.py:289
-#: ../editors/Viewer.py:1578 ../editors/TextViewer.py:307
-#: ../controls/LocationCellEditor.py:98 ../controls/VariablePanel.py:71
-#: ../controls/VariablePanel.py:291 ../controls/VariablePanel.py:351
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Input"
 msgstr "Вход"
 
-msgid "Input to be differentiated"
-msgstr "Вход для дифференцирования"
-
-msgid "Input variable"
-msgstr "Входная переменная"
-
-#: ../dialogs/FBDBlockDialog.py:93
+#: ../dialogs/FBDBlockDialog.py:99
 msgid "Inputs:"
 msgstr "Входы:"
 
@@ -1975,67 +1922,72 @@
 msgid "Insertion (into)"
 msgstr "Вставка подстроки"
 
-#: ../plcopen/plcopen.py:1691
+#: ../plcopen/plcopen.py:1948
 #, python-format
 msgid "Instance with id %d doesn't exist!"
 msgstr "Экземпляр с id %d не существует!"
 
-#: ../editors/ResourceEditor.py:264
+#: ../editors/ResourceEditor.py:279
 msgid "Instances:"
 msgstr "Экземпляры:"
 
-msgid "Integrated output"
-msgstr "Интегрированный выход"
-
-#: ../controls/VariablePanel.py:70
+#: ../controls/VariablePanel.py:88
 msgid "Interface"
 msgstr "Интерфейс"
 
-#: ../editors/ResourceEditor.py:72
+#: ../editors/ResourceEditor.py:81
 msgid "Interrupt"
 msgstr "Прерывание"
 
-#: ../editors/ResourceEditor.py:68
+#: ../editors/ResourceEditor.py:76
 msgid "Interval"
 msgstr "Интервал"
 
-#: ../PLCControler.py:2325
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+"Неверный URL!\n"
+"Пожалуйста, введите корректный URL."
+
+#: ../PLCControler.py:1895
 msgid "Invalid plcopen element(s)!!!"
 msgstr "Некорректный PlcOpen элемент(ы)!!!"
 
-#: ../canfestival/config_utils.py:381
+#: ../canfestival/config_utils.py:407
 #, python-brace-format
-msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location\"{a4}\""
-msgstr "Неправильный тип \"{a1}\"-> {a2} != {a3} для \"{a4}\""
-
-#: ../canfestival/config_utils.py:645
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr "Неверный тип \"{a1}\"-> {a2} != {a3} в функции \"{a4}\""
+
+#: ../canfestival/config_utils.py:689
 #, python-brace-format
 msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
 msgstr "Неправильный тип \"{a1}\"-> {a2} != {a3} для \"{a4}\""
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:132
-#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:92
-#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:166
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
 #, python-format
 msgid "Invalid value \"%s\" for debug variable"
 msgstr "Неверное значение \"%s\" для отлаживаемой переменной"
 
-#: ../controls/VariablePanel.py:255 ../controls/VariablePanel.py:258
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
 #, python-format
 msgid "Invalid value \"%s\" for variable grid element"
 msgstr "Неверное значение \"%s\" для значения размещения переменной"
 
-#: ../editors/Viewer.py:233 ../editors/Viewer.py:236
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
 #, python-format
 msgid "Invalid value \"%s\" for viewer block"
 msgstr "Неверное значение \"%s\" для вставки в редактор"
 
-#: ../dialogs/ForceVariableDialog.py:177
+#: ../dialogs/ForceVariableDialog.py:211
 #, python-brace-format
 msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
 msgstr "Неверное значение \"{a1}\" для переменной \"{a2}\"!"
 
-#: ../dialogs/DurationEditorDialog.py:121
+#: ../dialogs/DurationEditorDialog.py:124
 msgid ""
 "Invalid value!\n"
 "You must fill a numeric value."
@@ -2043,54 +1995,57 @@
 "Неверное значение!\n"
 "Необходимо ввести числовое значение."
 
-#: ../editors/Viewer.py:557 ../editors/Viewer.py:2343
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr "Безопасное подключение?"
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
 msgid "Jump"
 msgstr "Безусловный переход"
 
-#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36 ../controls/ProjectPropertiesPanel.py:143
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "LD"
 msgstr "LD"
 
-msgid "LDFLAGS"
-msgstr "LDFLAGS"
-
-#: ../editors/LDViewer.py:215 ../editors/LDViewer.py:231
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
 #, python-format
 msgid "Ladder element with id %d is on more than one rung."
 msgstr "Элемент лестничной диаграммы с id %d более чем на одной ступени."
 
-#: ../dialogs/PouTransitionDialog.py:91 ../dialogs/PouActionDialog.py:83
-#: ../dialogs/PouDialog.py:104
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
 msgid "Language"
 msgstr "Язык"
 
-#: ../controls/ProjectPropertiesPanel.py:186
+#: ../controls/ProjectPropertiesPanel.py:206
 msgid "Language (optional):"
 msgstr "Язык (опционально):"
 
-#: ../dialogs/PouTransitionDialog.py:65 ../dialogs/PouActionDialog.py:56
-#: ../dialogs/PouDialog.py:73
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
 msgid "Language:"
 msgstr "Язык:"
 
-#: ../ProjectController.py:1735
+#: ../ProjectController.py:1779
 msgid "Latest build already matches current target. Transfering anyway...\n"
-msgstr "Загружаемая программа совпадает с текущий программой в целевом ПЛК. Загрузка продолжена...\n"
-
-#: ../Beremiz_service.py:271
+msgstr ""
+"Загружаемая программа совпадает с текущий программой в целевом ПЛК. Загрузка"
+" продолжена...\n"
+
+#: ../Beremiz_service.py:281
 msgid "Launch WX GUI inspector"
 msgstr "Запустить WX GUI Inspector"
 
-#: ../Beremiz_service.py:270
+#: ../Beremiz_service.py:280
 msgid "Launch a live Python shell"
 msgstr "Запустить консоль Python"
 
-#: ../editors/Viewer.py:485
+#: ../editors/Viewer.py:580
 msgid "Left"
 msgstr "Слева"
 
-#: ../dialogs/LDPowerRailDialog.py:62
+#: ../dialogs/LDPowerRailDialog.py:64
 msgid "Left PowerRail"
 msgstr "Левая шина питания"
 
@@ -2106,14 +2061,11 @@
 msgid "Less than or equal to"
 msgstr "Меньше либо равно"
 
-msgid "Libraries"
-msgstr "Библиотеки"
-
-#: ../IDEFrame.py:631
+#: ../IDEFrame.py:652
 msgid "Library"
 msgstr "Библиотеки"
 
-#: ../dialogs/AboutDialog.py:143
+#: ../dialogs/AboutDialog.py:145
 msgid "License"
 msgstr "Лицензия"
 
@@ -2121,49 +2073,40 @@
 msgid "Limitation"
 msgstr "Ограничение"
 
-msgid "Linker"
-msgstr "Линковщик"
-
-#: ../targets/toolchain_gcc.py:166
+#: ../targets/toolchain_gcc.py:209
 msgid "Linking :\n"
 msgstr "Линковка:\n"
 
-msgid "Linux"
-msgstr "GNU/Linux"
-
-#: ../dialogs/DiscoveryDialog.py:111 ../controls/VariablePanel.py:72
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
 msgid "Local"
 msgstr "Локальный"
 
-#: ../canfestival/canfestival.py:346
+#: ../canfestival/canfestival.py:359
 msgid "Local entries"
 msgstr "Локальные записи"
 
-#: ../ProjectController.py:1641
+#: ../ProjectController.py:1685
 msgid "Local service discovery failed!\n"
 msgstr "Локальный сервис не найден!\n"
 
-#: ../controls/VariablePanel.py:53
+#: ../controls/VariablePanel.py:62
 msgid "Location"
-msgstr "Размещение"
-
-#: ../dialogs/BrowseLocationsDialog.py:72
+msgstr "Адрес"
+
+#: ../dialogs/BrowseLocationsDialog.py:79
 msgid "Locations available:"
-msgstr "Доступные размещения:"
+msgstr "Доступные адреса:"
 
 #: ../plcopen/iec_std.csv:25
 msgid "Logarithm to base 10"
 msgstr "Десятичный логарифм"
 
-#: ../connectors/PYRO/__init__.py:94
+#: ../connectors/PYRO/__init__.py:102
 #, python-format
 msgid "MDNS resolution failure for '%s'\n"
 msgstr "MDNS разрешение неудачно для '%s'\n"
 
-msgid "Manual output adjustment - Typically from transfer station"
-msgstr "Ручной выход"
-
-#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:85
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
 msgid "Map Variable"
 msgstr "Отображение переменной"
 
@@ -2171,42 +2114,47 @@
 msgid "Map located variables over CANopen"
 msgstr "Отображение переменных по CANopen"
 
-#: ../canfestival/NetworkEditor.py:106
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr "Отображение переменных по Modbus"
+
+#: ../canfestival/NetworkEditor.py:113
 msgid "Master"
 msgstr "Ведущий"
 
-#: ../ConfigTreeNode.py:539
+#: ../ConfigTreeNode.py:544
 #, python-brace-format
 msgid "Max count ({a1}) reached for this confnode of type {a2} "
-msgstr "Достигнуто максимальное количество ({a1}) для типа узла конфигурации {a2} "
+msgstr ""
+"Достигнуто максимальное количество ({a1}) для типа узла конфигурации {a2} "
 
 #: ../plcopen/iec_std.csv:71
 msgid "Maximum"
 msgstr "Максимум"
 
-#: ../editors/DataTypeEditor.py:239
+#: ../editors/DataTypeEditor.py:246
 msgid "Maximum:"
 msgstr "Максимум:"
 
-#: ../dialogs/BrowseLocationsDialog.py:42 ../editors/Viewer.py:289
-#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:98
-#: ../controls/VariablePanel.py:291 ../controls/VariablePanel.py:351
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Memory"
 msgstr "Память"
 
-#: ../IDEFrame.py:599
+#: ../IDEFrame.py:617
 msgid "Menu ToolBar"
 msgstr "Меню"
 
-#: ../dialogs/DurationEditorDialog.py:48
+#: ../dialogs/DurationEditorDialog.py:51
 msgid "Microseconds:"
 msgstr "Микросекунды:"
 
-#: ../editors/Viewer.py:490
+#: ../editors/Viewer.py:585
 msgid "Middle"
 msgstr "Посередине"
 
-#: ../dialogs/DurationEditorDialog.py:47
+#: ../dialogs/DurationEditorDialog.py:50
 msgid "Milliseconds:"
 msgstr "Миллисекунды:"
 
@@ -2214,76 +2162,84 @@
 msgid "Minimum"
 msgstr "Минимум"
 
-#: ../editors/DataTypeEditor.py:226
+#: ../editors/DataTypeEditor.py:233
 msgid "Minimum:"
 msgstr "Минимум:"
 
-#: ../dialogs/DurationEditorDialog.py:45
+#: ../dialogs/DurationEditorDialog.py:48
 msgid "Minutes:"
 msgstr "Минуты:"
 
-#: ../controls/ProjectPropertiesPanel.py:210
+#: ../controls/ProjectPropertiesPanel.py:231
 msgid "Miscellaneous"
 msgstr "Прочее"
 
-#: ../dialogs/LDElementDialog.py:63
+#: ../features.py:32
+msgid "Modbus support"
+msgstr "Поддержка Modbus"
+
+#: ../dialogs/LDElementDialog.py:65
 msgid "Modifier:"
 msgstr "Модификатор:"
 
-#: ../PLCGenerator.py:786 ../PLCGenerator.py:1230
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
 #, python-brace-format
-msgid "More than one connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
-msgstr "Более одного коннектора соответствуют продолжению цепи \"{a1}\" в POU \"{a2}\""
-
-#: ../dialogs/ActionBlockDialog.py:140
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+"Более одного коннектора соответствуют продолжению цепи \"{a1}\" в POU "
+"\"{a2}\""
+
+#: ../dialogs/ActionBlockDialog.py:146
 msgid "Move action down"
 msgstr "Переместить действие ниже"
 
-#: ../dialogs/ActionBlockDialog.py:139
+#: ../dialogs/ActionBlockDialog.py:145
 msgid "Move action up"
 msgstr "Переместить действие выше"
 
-#: ../controls/CustomEditableListBox.py:43
+#: ../controls/CustomEditableListBox.py:46
 msgid "Move down"
 msgstr "Переместить ниже"
 
-#: ../editors/DataTypeEditor.py:355
+#: ../editors/DataTypeEditor.py:367
 msgid "Move element down"
 msgstr "Переместить элемент ниже"
 
-#: ../editors/DataTypeEditor.py:354
+#: ../editors/DataTypeEditor.py:366
 msgid "Move element up"
 msgstr "Переместить элементы выше"
 
-#: ../editors/ResourceEditor.py:271
+#: ../editors/ResourceEditor.py:286
 msgid "Move instance down"
 msgstr "Переместить экземпляр ниже"
 
-#: ../editors/ResourceEditor.py:270
+#: ../editors/ResourceEditor.py:285
 msgid "Move instance up"
 msgstr "Переместить экземпляр выше"
 
-#: ../editors/ResourceEditor.py:242
+#: ../editors/ResourceEditor.py:255
 msgid "Move task down"
 msgstr "Переместить задачу ниже"
 
-#: ../editors/ResourceEditor.py:241
+#: ../editors/ResourceEditor.py:254
 msgid "Move task up"
 msgstr "Переместить задачу выше"
 
-#: ../IDEFrame.py:99 ../IDEFrame.py:114 ../IDEFrame.py:144 ../IDEFrame.py:185
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
 msgid "Move the view"
 msgstr "Переместить отображение"
 
-#: ../controls/CustomEditableListBox.py:42
+#: ../controls/CustomEditableListBox.py:45
 msgid "Move up"
 msgstr "Переместить выше"
 
-#: ../editors/CodeFileEditor.py:661 ../controls/VariablePanel.py:453
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
 msgid "Move variable down"
 msgstr "Переместить переменную ниже"
 
-#: ../editors/CodeFileEditor.py:660 ../controls/VariablePanel.py:452
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
 msgid "Move variable up"
 msgstr "Переместить переменную выше"
 
@@ -2295,29 +2251,26 @@
 msgid "Multiplication"
 msgstr "Умножение"
 
-#: ../editors/FileManagementPanel.py:83
+#: ../editors/FileManagementPanel.py:87
 msgid "My Computer:"
 msgstr "Мой компьютер:"
 
-#: ../dialogs/DiscoveryDialog.py:92
+#: ../dialogs/DiscoveryDialog.py:89
 msgid "NAME"
 msgstr "Имя"
 
-msgid "NOT R1"
-msgstr "НЕ R1"
-
-#: ../editors/ResourceEditor.py:68 ../editors/ResourceEditor.py:83
-#: ../editors/DataTypeEditor.py:50 ../controls/VariablePanel.py:53
-#: ../controls/VariablePanel.py:54
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
+#: ../controls/VariablePanel.py:59
 msgid "Name"
 msgstr "Имя"
 
-#: ../Beremiz_service.py:332
+#: ../Beremiz_service.py:342
 msgid "Name must not be null!"
 msgstr "Имя не может быть null!"
 
-#: ../dialogs/SFCStepDialog.py:56 ../dialogs/FBDBlockDialog.py:83
-#: ../dialogs/ConnectionDialog.py:75
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
 msgid "Name:"
 msgstr "Имя:"
 
@@ -2325,46 +2278,46 @@
 msgid "Natural logarithm"
 msgstr "Натуральный логарифм"
 
-#: ../dialogs/LDElementDialog.py:75 ../editors/Viewer.py:460
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
 msgid "Negated"
 msgstr "Инверсия"
 
-#: ../Beremiz_service.py:578
+#: ../Beremiz_service.py:610
 msgid "Nevow Web service failed. "
 msgstr "Ошибка Web сервиса Nevow. "
 
-#: ../Beremiz_service.py:554
+#: ../Beremiz_service.py:580
 msgid "Nevow/Athena import failed :"
 msgstr "Ошибка импорта Nevow/Athena :"
 
-#: ../PLCOpenEditor.py:102 ../PLCOpenEditor.py:144 ../Beremiz.py:321
-#: ../Beremiz.py:356
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
 msgid "New"
 msgstr "Новый"
 
-#: ../controls/CustomEditableListBox.py:40
+#: ../controls/CustomEditableListBox.py:43
 msgid "New item"
 msgstr "Новый элемент"
 
-#: ../editors/Viewer.py:459
+#: ../editors/Viewer.py:553
 msgid "No Modifier"
 msgstr "Нет модификатора"
 
-#: ../ProjectController.py:1763
+#: ../ProjectController.py:1808
 msgid "No PLC to transfer (did build succeed ?)\n"
 msgstr "Нет ПЛК для передачи (была сборка успешна?)\n"
 
-#: ../PLCGenerator.py:1631
+#: ../PLCGenerator.py:1678
 #, python-format
 msgid "No body defined in \"%s\" POU"
 msgstr "Нет тела для POU \"%s\""
 
-#: ../PLCGenerator.py:806 ../PLCGenerator.py:1241
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
 #, python-brace-format
 msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
 msgstr "Не найден коннектор, соответствующий продолжению цепи \"{a1}\" в POU \"{a2}\""
 
-#: ../PLCOpenEditor.py:347
+#: ../PLCOpenEditor.py:331
 msgid ""
 "No documentation available.\n"
 "Coming soon."
@@ -2372,70 +2325,70 @@
 "Документация отсутствует.\n"
 "В разработке."
 
-#: ../PLCGenerator.py:829
+#: ../PLCGenerator.py:841
 #, python-format
 msgid "No informations found for \"%s\" block"
 msgstr "Не найдена информация по блоку \"%s\""
 
-#: ../PLCGenerator.py:1194
+#: ../PLCGenerator.py:1232
 #, python-brace-format
-msgid "No output {a1} variable found in block {a2} in POU {a3}. Connection must be broken"
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
 msgstr "Выходная переменная {a1} не найдена в блоке {a2} в POU {a3}."
 
-#: ../controls/SearchResultPanel.py:169
+#: ../controls/SearchResultPanel.py:175
 msgid "No search results available."
 msgstr "Ничего не найдено."
 
-#: ../svgui/svgui.py:131
+#: ../svgui/svgui.py:142
 #, python-format
 msgid "No such SVG file: %s\n"
 msgstr "Нет такого SVG файла: %s\n"
 
-#: ../canfestival/config_utils.py:639
+#: ../canfestival/config_utils.py:682
 #, python-brace-format
 msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
 msgstr "Нет индекса/подиндекса ({a1},{a2}) (переменная {a3})"
 
-#: ../canfestival/config_utils.py:362
+#: ../canfestival/config_utils.py:387
 #, python-brace-format
 msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
 msgstr "Нет индекса/подиндекса ({a1},{a2}) в ID: {a3} (переменная {a4})"
 
-#: ../dialogs/BrowseValuesLibraryDialog.py:83
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
 msgid "No valid value selected!"
 msgstr "Не выбрано допустимое значение!"
 
-#: ../PLCGenerator.py:1629
+#: ../PLCGenerator.py:1676
 #, python-format
 msgid "No variable defined in \"%s\" POU"
 msgstr "Переменная не определена в POU \"%s\""
 
-msgid "NodeId"
-msgstr "ID узла"
-
-#: ../canfestival/config_utils.py:355
+#: ../canfestival/config_utils.py:379
 #, python-brace-format
 msgid "Non existing node ID : {a1} (variable {a2})"
 msgstr "Несуществующий ID узла: {a1} (переменная {a2})"
 
-#: ../controls/VariablePanel.py:64
+#: ../controls/VariablePanel.py:79
 msgid "Non-Retain"
 msgstr "Не-Retain"
 
-#: ../dialogs/LDElementDialog.py:75
+#: ../dialogs/LDElementDialog.py:78
 msgid "Normal"
 msgstr "Обычный"
 
-#: ../canfestival/config_utils.py:389
+#: ../canfestival/config_utils.py:426
 #, python-brace-format
 msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
-msgstr "Не переменная для отображения в PDO: '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+"Не переменная для отображения в PDO: '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
 
 #: ../plcopen/iec_std.csv:80
 msgid "Not equal to"
 msgstr "Не равно"
 
-#: ../dialogs/SFCDivergenceDialog.py:89
+#: ../dialogs/SFCDivergenceDialog.py:91
 msgid "Number of sequences:"
 msgstr "Число ветвей:"
 
@@ -2443,90 +2396,93 @@
 msgid "Numerical"
 msgstr "Математические функции"
 
-#: ../dialogs/SearchInProjectDialog.py:86
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr "При изменении"
+
+#: ../dialogs/SearchInProjectDialog.py:88
 msgid "Only Elements"
 msgstr "Только элементы"
 
-#: ../PLCOpenEditor.py:104 ../PLCOpenEditor.py:145 ../Beremiz.py:323
-#: ../Beremiz.py:357
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
 msgid "Open"
 msgstr "Открыть"
 
-#: ../svgui/svgui.py:140
+#: ../svgui/svgui.py:151
 msgid "Open Inkscape"
 msgstr "Открыть Inkscape"
 
-#: ../version.py:66
-msgid "Open Source framework for automation, implemented IEC 61131 IDE with constantly growing set of extensions and flexible PLC runtime."
-msgstr "Свободное программное обеспечение для промышленной автоматизации, состоящие из среды разработки программ по стандарту МЭК 61131 с постоянно расширяющимся набором плагинов и гибкой системой исполнения для ПЛК."
-
-#: ../ProjectController.py:1815
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+"Свободное программное обеспечение для промышленной автоматизации, состоящие "
+"из среды разработки программ по стандарту МЭК 61131 с постоянно "
+"расширяющимся набором плагинов и гибкой системой исполнения для ПЛК."
+
+#: ../ProjectController.py:1879
 msgid "Open a file explorer to manage project files"
 msgstr "Открыть файловый менеджер для просмотра файлов проекта"
 
-#: ../wxglade_hmi/wxglade_hmi.py:138
+#: ../wxglade_hmi/wxglade_hmi.py:161
 msgid "Open wxGlade"
 msgstr "Открыть wxGlade"
 
-#: ../controls/VariablePanel.py:53 ../controls/VariablePanel.py:54
+#: ../controls/VariablePanel.py:64
 msgid "Option"
-msgstr "Настройка"
-
-#: ../dialogs/FindInPouDialog.py:83
+msgstr "Квалификатор"
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
 msgid "Options"
 msgstr "Настройки"
 
-#: ../controls/ProjectPropertiesPanel.py:97
+#: ../controls/ProjectPropertiesPanel.py:109
 msgid "Organization (optional):"
 msgstr "Организация (опционально):"
 
-#: ../canfestival/SlaveEditor.py:74 ../canfestival/NetworkEditor.py:95
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
 msgid "Other Profile"
 msgstr "Другой профиль"
 
-#: ../dialogs/SFCStepDialog.py:71 ../dialogs/FBDVariableDialog.py:39
-#: ../dialogs/BrowseLocationsDialog.py:41 ../editors/Viewer.py:289
-#: ../editors/Viewer.py:1579 ../editors/TextViewer.py:307
-#: ../controls/LocationCellEditor.py:98 ../controls/VariablePanel.py:71
-#: ../controls/VariablePanel.py:291 ../controls/VariablePanel.py:351
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Output"
 msgstr "Выход"
 
-msgid "Overriding reset"
-msgstr "Сброс интегратора"
-
-#: ../canfestival/SlaveEditor.py:63 ../canfestival/NetworkEditor.py:84
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
 msgid "PDO Receive"
 msgstr "PDO приема"
 
-#: ../canfestival/SlaveEditor.py:62 ../canfestival/NetworkEditor.py:83
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
 msgid "PDO Transmit"
 msgstr "PDO передачи"
 
-msgid "PLC"
-msgstr "ПЛК"
-
-#: ../targets/toolchain_gcc.py:131
+#: ../targets/toolchain_gcc.py:174
 msgid "PLC :\n"
 msgstr "ПЛК:\n"
 
-#: ../Beremiz.py:453
+#: ../BeremizIDE.py:383
 msgid "PLC Log"
 msgstr "Лог ПЛК"
 
-#: ../ProjectController.py:992
+#: ../ProjectController.py:1082
 msgid "PLC code generation failed !\n"
 msgstr "Неудачная генерация кода!\n"
 
-#: ../Beremiz_service.py:295
+#: ../Beremiz_service.py:305
 msgid "PLC is empty or already started."
 msgstr "В ПЛК нет программы или он уже запущен."
 
-#: ../Beremiz_service.py:302
+#: ../Beremiz_service.py:312
 msgid "PLC is not started."
 msgstr "ПЛК незапущен."
 
-#: ../PLCOpenEditor.py:196 ../PLCOpenEditor.py:309
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
 #, python-brace-format
 msgid ""
 "PLC syntax error at line {a1}:\n"
@@ -2535,15 +2491,15 @@
 "Синтаксическая ошибка в строке {a1}:\n"
 "{a2}"
 
-#: ../PLCOpenEditor.py:292 ../PLCOpenEditor.py:373
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
 msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
 msgstr "PLCOpen файлы (*.xml)|*.xml|All files|*.*"
 
-#: ../PLCOpenEditor.py:152 ../PLCOpenEditor.py:209
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
 msgid "PLCOpenEditor"
 msgstr "PLCOpenEditor"
 
-#: ../PLCOpenEditor.py:355
+#: ../PLCOpenEditor.py:339
 msgid ""
 "PLCOpenEditor is part of Beremiz project.\n"
 "\n"
@@ -2553,214 +2509,205 @@
 "\n"
 "Beremiz — "
 
-#: ../dialogs/DiscoveryDialog.py:95
+#: ../dialogs/DiscoveryDialog.py:92
 msgid "PORT"
 msgstr "Порт"
 
-#: ../dialogs/PouDialog.py:100
+#: ../dialogs/PouDialog.py:109
 msgid "POU Name"
 msgstr "Имя POU"
 
-#: ../dialogs/PouDialog.py:58
+#: ../dialogs/PouDialog.py:66
 msgid "POU Name:"
 msgstr "Имя POU:"
 
-#: ../dialogs/PouDialog.py:102
+#: ../dialogs/PouDialog.py:111
 msgid "POU Type"
 msgstr "Тип POU"
 
-#: ../dialogs/PouDialog.py:65
+#: ../dialogs/PouDialog.py:73
 msgid "POU Type:"
 msgstr "Тип POU:"
 
-msgid "PV - SP"
-msgstr "Ошибка, PV - SP"
-
-#: ../connectors/PYRO/__init__.py:45
+#: ../connectors/PYRO/__init__.py:52
 #, python-format
 msgid "PYRO connecting to URI : %s\n"
 msgstr "PYRO подключение к URI: %s\n"
 
-#: ../connectors/PYRO/__init__.py:61
+#: ../connectors/PYRO/__init__.py:68
 #, python-format
 msgid "PYRO using certificates in '%s' \n"
 msgstr "PYRO использует сертификаты в '%s'\n"
 
-#: ../PLCOpenEditor.py:118 ../Beremiz.py:336
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
 msgid "Page Setup"
 msgstr "Настройки страницы"
 
-#: ../controls/ProjectPropertiesPanel.py:110
+#: ../controls/ProjectPropertiesPanel.py:124
 msgid "Page Size (optional):"
 msgstr "Размер страницы (опционально):"
 
-#: ../IDEFrame.py:2599
+#: ../IDEFrame.py:2640
 #, python-format
 msgid "Page: %d"
 msgstr "Страница: %d"
 
-#: ../controls/PouInstanceVariablesPanel.py:124
+#: ../controls/PouInstanceVariablesPanel.py:134
 msgid "Parent instance"
 msgstr "Родительский экземпляр"
 
-#: ../editors/Viewer.py:598 ../IDEFrame.py:372 ../IDEFrame.py:426
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
 msgid "Paste"
 msgstr "Вставить"
 
-#: ../IDEFrame.py:1865
+#: ../IDEFrame.py:1899
 msgid "Paste POU"
 msgstr "Вставить POU"
 
-#: ../dialogs/SearchInProjectDialog.py:56
+#: ../dialogs/SearchInProjectDialog.py:60
 msgid "Pattern to search:"
 msgstr "Шаблон поиска:"
 
-#: ../dialogs/LDPowerRailDialog.py:73
+#: ../dialogs/LDPowerRailDialog.py:75
 msgid "Pin number:"
 msgstr "Номер пина:"
 
-#: ../editors/Viewer.py:2706 ../editors/Viewer.py:2963
-#: ../editors/SFCViewer.py:770
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
 msgid "Please choose a target"
 msgstr "Выберите цель перехода"
 
-#: ../editors/TextViewer.py:262
+#: ../editors/TextViewer.py:260
 msgid "Please enter a block name"
 msgstr "Введите имя блока"
 
-#: ../editors/Viewer.py:2576 ../editors/Viewer.py:3005
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
 msgid "Please enter comment text"
 msgstr "Введите текст комментария"
 
-#: ../editors/SFCViewer.py:433 ../editors/SFCViewer.py:455
-#: ../editors/SFCViewer.py:799
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
 msgid "Please enter step name"
 msgstr "Введите имя шага"
 
-#: ../Beremiz_service.py:194
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
 msgid "Please enter text"
 msgstr "Введите текст"
 
-#: ../dialogs/ForceVariableDialog.py:163
+#: ../dialogs/ForceVariableDialog.py:177
 #, python-format
 msgid "Please enter value for a \"%s\" variable:"
 msgstr "Введите значение для переменной \"%s\":"
 
-#: ../Beremiz_service.py:317
+#: ../Beremiz_service.py:327
 msgid "Port number must be 0 <= port <= 65535!"
 msgstr "Номер порта должен быть в диапазоне от 0 до 65535!"
 
-#: ../Beremiz_service.py:317
+#: ../Beremiz_service.py:327
 msgid "Port number must be an integer!"
 msgstr "Номер порта должен быть целым числом!"
 
-#: ../editors/Viewer.py:536 ../editors/Viewer.py:2367
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
 msgid "Power Rail"
 msgstr "Шина питания"
 
-#: ../dialogs/LDPowerRailDialog.py:50
+#: ../dialogs/LDPowerRailDialog.py:52
 msgid "Power Rail Properties"
 msgstr "Свойства шины питания"
 
-msgid "Preset datetime"
-msgstr "Основное время"
-
-#: ../PLCOpenEditor.py:120 ../Beremiz.py:338
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
 msgid "Preview"
 msgstr "Просмотр"
 
-#: ../dialogs/BlockPreviewDialog.py:57
+#: ../dialogs/BlockPreviewDialog.py:59
 msgid "Preview:"
 msgstr "Просмотр:"
 
-#: ../PLCOpenEditor.py:122 ../PLCOpenEditor.py:148 ../Beremiz.py:340
-#: ../Beremiz.py:360
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
 msgid "Print"
 msgstr "Печать"
 
-#: ../IDEFrame.py:1075
+#: ../IDEFrame.py:1110
 msgid "Print preview"
 msgstr "Предварительный просмотр"
 
-#: ../editors/ResourceEditor.py:68
+#: ../editors/ResourceEditor.py:76
 msgid "Priority"
 msgstr "Приоритет"
 
-#: ../dialogs/SFCTransitionDialog.py:89
+#: ../dialogs/SFCTransitionDialog.py:91
 msgid "Priority:"
 msgstr "Приоритет:"
 
-#: ../runtime/PLCObject.py:370
+#: ../runtime/PLCObject.py:518
 #, python-format
 msgid "Problem starting PLC : error %d"
 msgstr "Проблема запуска ПЛК: ошибка %d"
 
-msgid "Process variable"
-msgstr "Текущее значение регулируемой переменной"
-
-#: ../dialogs/ProjectDialog.py:55
+#: ../dialogs/ProjectDialog.py:63
 msgid "Product Name"
 msgstr "Имя продукта"
 
-#: ../controls/ProjectPropertiesPanel.py:80
+#: ../controls/ProjectPropertiesPanel.py:90
 msgid "Product Name (required):"
 msgstr "Имя продукта (обязательно):"
 
-#: ../controls/ProjectPropertiesPanel.py:82
+#: ../controls/ProjectPropertiesPanel.py:92
 msgid "Product Release (optional):"
-msgstr "Релиз продукта (опцинально):"
-
-#: ../dialogs/ProjectDialog.py:56
+msgstr "Релиз продукта (опционально):"
+
+#: ../dialogs/ProjectDialog.py:64
 msgid "Product Version"
 msgstr "Версия продукта"
 
-#: ../controls/ProjectPropertiesPanel.py:81
+#: ../controls/ProjectPropertiesPanel.py:91
 msgid "Product Version (required):"
 msgstr "Версия продукта (обязательно):"
 
-#: ../dialogs/SearchInProjectDialog.py:38 ../IDEFrame.py:1744
-#: ../IDEFrame.py:1941
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
 msgid "Program"
 msgstr "Программа"
 
-#: ../PLCOpenEditor.py:337
+#: ../PLCOpenEditor.py:321
 msgid "Program was successfully generated!"
 msgstr "Программа успешно сгенерирована!"
 
-#: ../PLCControler.py:96
+#: ../plcopen/types_enums.py:76
 msgid "Programs"
 msgstr "Программы"
 
-#: ../editors/Viewer.py:242
+#: ../editors/Viewer.py:285
 msgid "Programs can't be used by other POUs!"
 msgstr "Программы не могут использоваться другими POU!"
 
-#: ../controls/ProjectPropertiesPanel.py:84 ../IDEFrame.py:584
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
 msgid "Project"
 msgstr "Проект"
 
-#: ../controls/SearchResultPanel.py:173
+#: ../controls/SearchResultPanel.py:180
 #, python-format
 msgid "Project '%s':"
 msgstr "Проект '%s':"
 
-#: ../ProjectController.py:1814
+#: ../ProjectController.py:1878
 msgid "Project Files"
 msgstr "Файлы проекта"
 
-#: ../dialogs/ProjectDialog.py:54
+#: ../dialogs/ProjectDialog.py:62
 msgid "Project Name"
 msgstr "Имя проекта"
 
-#: ../controls/ProjectPropertiesPanel.py:78
+#: ../controls/ProjectPropertiesPanel.py:88
 msgid "Project Name (required):"
 msgstr "Имя проекта (обязательно):"
 
-#: ../controls/ProjectPropertiesPanel.py:79
+#: ../controls/ProjectPropertiesPanel.py:89
 msgid "Project Version (optional):"
 msgstr "Версия проекта (опционально):"
 
-#: ../PLCControler.py:3158
+#: ../PLCControler.py:2717
 msgid ""
 "Project file syntax error:\n"
 "\n"
@@ -2768,96 +2715,90 @@
 "Синтаксическая ошибка в файле проекта:\n"
 "\n"
 
-#: ../dialogs/ProjectDialog.py:32 ../editors/ProjectNodeEditor.py:37
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
 msgid "Project properties"
 msgstr "Свойства проекта"
 
-#: ../ConfigTreeNode.py:566
+#: ../ConfigTreeNode.py:571
 #, python-brace-format
 msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
 msgstr "Дерево проекта не соответствует confnode.xml {a1}!={a2} "
 
-#: ../dialogs/ConnectionDialog.py:94
+#: ../dialogs/ConnectionDialog.py:101
 msgid "Propagate Name"
 msgstr "Для всей цепи"
 
-#: ../PLCControler.py:97
+#: ../plcopen/types_enums.py:77
 msgid "Properties"
 msgstr "Свойства"
 
-msgid "Proportionality constant"
-msgstr "Коэффициент пропорциональности"
-
-#: ../Beremiz_service.py:440
+#: ../Beremiz_service.py:427
 msgid "Publishing service on local network"
 msgstr "Сервис доступен в локальной сети"
 
-#: ../connectors/PYRO/__init__.py:118
+#: ../connectors/PYRO/__init__.py:126
 #, python-format
 msgid "Pyro exception: %s\n"
 msgstr "Исключение Pyro: %s\n"
 
-#: ../Beremiz_service.py:427
-msgid "Pyro object's uri :"
-msgstr "URI для Pyro :"
-
-#: ../Beremiz_service.py:426
+#: ../Beremiz_service.py:420
 msgid "Pyro port :"
 msgstr "Порт Pyro :"
 
-#: ../py_ext/PythonEditor.py:81
+#: ../py_ext/PythonEditor.py:84
 msgid "Python code"
 msgstr "Код на python"
 
-#: ../features.py:33
+#: ../features.py:34
 msgid "Python file"
 msgstr "Python файл"
 
-#: ../dialogs/ActionBlockDialog.py:38
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Qualifier"
 msgstr "Спецификатор"
 
-#: ../PLCOpenEditor.py:128 ../Beremiz.py:343 ../Beremiz_service.py:273
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
 msgid "Quit"
 msgstr "Выход"
 
-msgid "Ramp duration"
-msgstr "Длительность нарастания"
-
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:225
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
 msgid "Range:"
 msgstr "Диапазон:"
 
-#: ../ProjectController.py:1810
+#: ../ProjectController.py:1872
 msgid "Raw IEC code"
 msgstr "МЭК-код"
 
-#: ../Beremiz.py:1143
+#: ../BeremizIDE.py:1083
 #, python-format
 msgid "Really delete node '%s'?"
 msgstr "Действительно удалить элемент '%s'?"
 
-#: ../IDEFrame.py:362 ../IDEFrame.py:422
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr "Realm:"
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
 msgid "Redo"
 msgstr "Повторить"
 
-#: ../dialogs/SFCTransitionDialog.py:74
+#: ../dialogs/SFCTransitionDialog.py:76
 msgid "Reference"
 msgstr "Ссылка"
 
-#: ../dialogs/DiscoveryDialog.py:106 ../IDEFrame.py:432
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
 msgid "Refresh"
 msgstr "Обновить"
 
-#: ../dialogs/SearchInProjectDialog.py:66
+#: ../dialogs/SearchInProjectDialog.py:70
 msgid "Regular expression"
 msgstr "Регулярное выражение"
 
-#: ../dialogs/FindInPouDialog.py:98
+#: ../dialogs/FindInPouDialog.py:99
 msgid "Regular expressions"
 msgstr "Регулярные выражения"
 
-#: ../editors/Viewer.py:1556
+#: ../editors/Viewer.py:1636
 msgid "Release value"
 msgstr "Освободить значение"
 
@@ -2865,56 +2806,56 @@
 msgid "Remainder (modulo)"
 msgstr "Остаток от деления (modulo)"
 
-#: ../Beremiz.py:1144
+#: ../BeremizIDE.py:1084
 #, python-format
 msgid "Remove %s node"
 msgstr "Удалить %s элемент"
 
-#: ../IDEFrame.py:2405
+#: ../IDEFrame.py:2445
 msgid "Remove Datatype"
 msgstr "Удалить тип данных"
 
-#: ../IDEFrame.py:2410
+#: ../IDEFrame.py:2450
 msgid "Remove Pou"
 msgstr "Удалить POU"
 
-#: ../dialogs/ActionBlockDialog.py:138
+#: ../dialogs/ActionBlockDialog.py:144
 msgid "Remove action"
 msgstr "Удалить действие"
 
-#: ../editors/DataTypeEditor.py:353
+#: ../editors/DataTypeEditor.py:365
 msgid "Remove element"
 msgstr "Удалить элемент"
 
-#: ../editors/FileManagementPanel.py:63
+#: ../editors/FileManagementPanel.py:66
 msgid "Remove file from left folder"
 msgstr "Удалить файл из левой директории"
 
-#: ../editors/ResourceEditor.py:269
+#: ../editors/ResourceEditor.py:284
 msgid "Remove instance"
 msgstr "Удалить экземпляр"
 
-#: ../canfestival/NetworkEditor.py:104
+#: ../canfestival/NetworkEditor.py:111
 msgid "Remove slave"
 msgstr "Удалить ведомое устройство"
 
-#: ../editors/ResourceEditor.py:240
+#: ../editors/ResourceEditor.py:253
 msgid "Remove task"
 msgstr "Удалить задачу"
 
-#: ../editors/CodeFileEditor.py:659 ../controls/VariablePanel.py:451
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
 msgid "Remove variable"
 msgstr "Удалить переменную"
 
-#: ../IDEFrame.py:1945
+#: ../IDEFrame.py:1979
 msgid "Rename"
 msgstr "Переименовать"
 
-#: ../editors/FileManagementPanel.py:181
+#: ../editors/FileManagementPanel.py:187
 msgid "Replace File"
 msgstr "Заменить файл"
 
-#: ../editors/Viewer.py:502
+#: ../editors/Viewer.py:598
 msgid "Replace Wire by connections"
 msgstr "Заменить цепь подключениями"
 
@@ -2922,46 +2863,43 @@
 msgid "Replacement (within)"
 msgstr "Замена подстроки"
 
-#: ../dialogs/LDElementDialog.py:76
+#: ../dialogs/LDElementDialog.py:79
 msgid "Reset"
 msgstr "Сброс"
 
-#: ../editors/Viewer.py:583
+#: ../editors/Viewer.py:681
 msgid "Reset Execution Order"
 msgstr "Сбросить порядок исполнения"
 
-#: ../IDEFrame.py:451
+#: ../IDEFrame.py:453
 msgid "Reset Perspective"
 msgstr "Сбросить представление"
 
-#: ../controls/SearchResultPanel.py:105
+#: ../controls/SearchResultPanel.py:103
 msgid "Reset search result"
 msgstr "Сбросить результаты поиска"
 
-msgid "Reset time"
-msgstr "Постоянная времени интегрирования"
-
-#: ../PLCControler.py:97 ../Beremiz.py:1075
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
 msgid "Resources"
 msgstr "Ресурсы"
 
-#: ../controls/VariablePanel.py:62
+#: ../controls/VariablePanel.py:77
 msgid "Retain"
 msgstr "Retain"
 
-#: ../controls/VariablePanel.py:424
+#: ../controls/VariablePanel.py:455
 msgid "Return Type:"
 msgstr "Возвращаемый тип:"
 
-#: ../editors/Viewer.py:487
+#: ../editors/Viewer.py:582
 msgid "Right"
 msgstr "Право"
 
-#: ../dialogs/LDPowerRailDialog.py:63
+#: ../dialogs/LDPowerRailDialog.py:65
 msgid "Right PowerRail"
 msgstr "Правая шина питания"
 
-#: ../dialogs/LDElementDialog.py:77 ../editors/Viewer.py:461
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
 msgid "Rising Edge"
 msgstr "Нарастающий фронт"
 
@@ -2977,116 +2915,116 @@
 msgid "Rounding up/down"
 msgstr "Округление вверх/вниз"
 
-#: ../ProjectController.py:1778
+#: ../ProjectController.py:1828
 msgid "Run"
 msgstr "Старт"
 
-#: ../ProjectController.py:1037
+#: ../ProjectController.py:1127
 msgid "Runtime IO extensions C code generation failed !\n"
 msgstr "Ошибка генерации C-кода для расширений ввода-вывода!\n"
 
-#: ../ProjectController.py:1046
+#: ../ProjectController.py:1136
 msgid "Runtime library extensions C code generation failed !\n"
 msgstr "Ошибка генерации C-кода для библиотеки расширений системы исполнения!\n"
 
-#: ../canfestival/SlaveEditor.py:61 ../canfestival/NetworkEditor.py:82
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
 msgid "SDO Client"
 msgstr "SDO клиент"
 
-#: ../canfestival/SlaveEditor.py:60 ../canfestival/NetworkEditor.py:81
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
 msgid "SDO Server"
 msgstr "SDO сервер"
 
-#: ../dialogs/PouDialog.py:36 ../controls/ProjectPropertiesPanel.py:143
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "SFC"
 msgstr "SFC"
 
-#: ../PLCGenerator.py:1392
+#: ../PLCGenerator.py:1433
 #, python-brace-format
 msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
-msgstr "Безусловный переход в POU \"{a1}\" ссылается на несуществующий SFC шаг \"{a2}\""
-
-#: ../PLCGenerator.py:773
+msgstr ""
+"Безусловный переход в POU \"{a1}\" ссылается на несуществующий SFC шаг "
+"\"{a2}\""
+
+#: ../PLCGenerator.py:780
 #, python-format
 msgid "SFC transition in POU \"%s\" must be connected."
 msgstr "SFC переход в POU \"%s\" должен быть подключен."
 
-#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
 msgid "ST"
 msgstr "ST"
 
-#: ../PLCOpenEditor.py:324
+#: ../PLCOpenEditor.py:308
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "ST файлы (*.st)|*.st|Все файлы|*.*"
 
-#: ../svgui/svgui.py:125
+#: ../svgui/svgui.py:136
 msgid "SVG files (*.svg)|*.svg|All files|*.*"
 msgstr "SVG файлы (*.svg)|*.svg|Все файлы|*.*"
 
-#: ../features.py:35
+#: ../features.py:36
 msgid "SVGUI"
 msgstr "SVGUI"
 
-msgid "Sampling period"
-msgstr "Период сэмплирования"
-
-#: ../PLCOpenEditor.py:111 ../PLCOpenEditor.py:146 ../Beremiz.py:327
-#: ../Beremiz.py:358
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
 msgid "Save"
 msgstr "Сохранить"
 
-#: ../PLCOpenEditor.py:113 ../PLCOpenEditor.py:147 ../Beremiz.py:359
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
 msgid "Save As..."
 msgstr "Сохранить как..."
 
-#: ../Beremiz.py:329
+#: ../BeremizIDE.py:249
 msgid "Save as"
 msgstr "Сохранить как"
 
-#: ../ProjectController.py:420
+#: ../ProjectController.py:530
 msgid "Save path is the same as path of a project! \n"
 msgstr "Выбранный путь совпадает с путём проекта!\n"
 
-#: ../dialogs/SearchInProjectDialog.py:69
+#: ../dialogs/SearchInProjectDialog.py:73
 msgid "Scope"
 msgstr "Область действия"
 
-#: ../IDEFrame.py:623
+#: ../IDEFrame.py:644
 msgid "Search"
 msgstr "Поиск"
 
-#: ../dialogs/SearchInProjectDialog.py:44 ../IDEFrame.py:382 ../IDEFrame.py:428
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
 msgid "Search in Project"
 msgstr "Поиск в проекте"
 
-#: ../dialogs/DurationEditorDialog.py:46
+#: ../dialogs/DurationEditorDialog.py:49
 msgid "Seconds:"
 msgstr "Секунды:"
 
-#: ../IDEFrame.py:388
+#: ../IDEFrame.py:390
 msgid "Select All"
 msgstr "Выделить все"
 
-#: ../editors/Viewer.py:288 ../editors/TextViewer.py:306
-#: ../controls/LocationCellEditor.py:97 ../controls/VariablePanel.py:290
-#: ../controls/VariablePanel.py:350
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
 msgid "Select a variable class:"
 msgstr "Выберите класс переменной:"
 
-#: ../ProjectController.py:1195
+#: ../ProjectController.py:1293
 msgid "Select an editor:"
 msgstr "Выберите редактор:"
 
-#: ../controls/PouInstanceVariablesPanel.py:276
+#: ../controls/PouInstanceVariablesPanel.py:292
 msgid "Select an instance"
 msgstr "Выберите экземпляр"
 
-#: ../IDEFrame.py:607
+#: ../IDEFrame.py:628
 msgid "Select an object"
 msgstr "Выберите объект"
 
-#: ../ProjectController.py:427
+#: ../ProjectController.py:537
 msgid "Selected directory already contains another project. Overwrite? \n"
 msgstr "Выбранная директория уже содержит другой проект. Перезаписать?\n"
 
@@ -3094,29 +3032,26 @@
 msgid "Selection"
 msgstr "Выбор"
 
-#: ../dialogs/SFCDivergenceDialog.py:65
+#: ../dialogs/SFCDivergenceDialog.py:66
 msgid "Selection Convergence"
 msgstr "Альтернативное объединение"
 
-#: ../dialogs/SFCDivergenceDialog.py:64
+#: ../dialogs/SFCDivergenceDialog.py:65
 msgid "Selection Divergence"
 msgstr "Альтернативное ветвление"
 
-#: ../dialogs/DiscoveryDialog.py:82
+#: ../dialogs/DiscoveryDialog.py:135
 msgid "Service Discovery"
 msgstr "Поиск сервиса"
 
-#: ../dialogs/DiscoveryDialog.py:85
+#: ../dialogs/DiscoveryDialog.py:104
 msgid "Services available:"
-msgstr "Сервисы доступны:"
-
-#: ../dialogs/LDElementDialog.py:76
+msgstr "Доступные сервисы:"
+
+#: ../dialogs/LDElementDialog.py:79
 msgid "Set"
 msgstr "Установить"
 
-msgid "Set point"
-msgstr "Уставка"
-
 #: ../plcopen/iec_std.csv:62
 msgid "Shift left"
 msgstr "Сдвиг влево"
@@ -3125,27 +3060,27 @@
 msgid "Shift right"
 msgstr "Сдвиг вправо"
 
-#: ../ProjectController.py:1804
+#: ../ProjectController.py:1863
 msgid "Show IEC code generated by PLCGenerator"
-msgstr "Показать год, сгенерированный PLCGenerator"
-
-#: ../canfestival/canfestival.py:387
+msgstr "Показать код, сгенерированный PLCGenerator"
+
+#: ../canfestival/canfestival.py:407
 msgid "Show Master"
 msgstr "Показать ведущего"
 
-#: ../canfestival/canfestival.py:388
+#: ../canfestival/canfestival.py:408
 msgid "Show Master generated by config_utils"
 msgstr "Показать ведущий узел сгенерированный config_utils"
 
-#: ../ProjectController.py:1802
+#: ../ProjectController.py:1862
 msgid "Show code"
 msgstr "Показать код"
 
-#: ../dialogs/SFCDivergenceDialog.py:67
+#: ../dialogs/SFCDivergenceDialog.py:68
 msgid "Simultaneous Convergence"
 msgstr "Параллельное объединение"
 
-#: ../dialogs/SFCDivergenceDialog.py:66
+#: ../dialogs/SFCDivergenceDialog.py:67
 msgid "Simultaneous Divergence"
 msgstr "Параллельное ветвление"
 
@@ -3153,77 +3088,76 @@
 msgid "Sine"
 msgstr "Синус"
 
-#: ../editors/ResourceEditor.py:68
+#: ../editors/ResourceEditor.py:76
 msgid "Single"
 msgstr "Источник"
 
-#: ../targets/toolchain_makefile.py:126
+#: ../targets/toolchain_makefile.py:130
 msgid "Source didn't change, no build.\n"
 msgstr "Исходные файлы не изменились, сборка не нужна.\n"
 
-#: ../PLCGenerator.py:397
+#: ../PLCGenerator.py:404
 #, python-brace-format
-msgid "Source signal has to be defined for single task '{a1}' in resource '{a2}.{a3}'."
-msgstr "Для задачи '{a1}' в ресурсе '{a2}.{a3}' отсутсвует задание источника."
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+"Для задачи '{a1}' в ресурсе '{a2}.{a3}' отсутствует задание источника."
 
 #: ../plcopen/iec_std.csv:23
 msgid "Square root (base 2)"
 msgstr "Квадратный корень"
 
-#: ../plcopen/definitions.py:46
+#: ../plcopen/definitions.py:50
 msgid "Standard function blocks"
 msgstr "Стандартные функциональные блоки"
 
-#: ../ProjectController.py:1780 ../Beremiz_service.py:261
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
 msgid "Start PLC"
 msgstr "Запустить ПЛК"
 
-#: ../ProjectController.py:984
+#: ../ProjectController.py:1074
 #, python-format
 msgid "Start build in %s\n"
 msgstr "Сборка запущена в %s\n"
 
-#: ../ProjectController.py:1298
+#: ../ProjectController.py:1397
 msgid "Started"
 msgstr "Работа"
 
-#: ../ProjectController.py:1586
+#: ../ProjectController.py:1633
 msgid "Starting PLC\n"
 msgstr "ПЛК запускается\n"
 
-#: ../Beremiz.py:463
+#: ../BeremizIDE.py:393
 msgid "Status ToolBar"
 msgstr "Панель статуса"
 
-#: ../editors/Viewer.py:553 ../editors/Viewer.py:2342
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
 msgid "Step"
 msgstr "Шаг"
 
-#: ../ProjectController.py:1783
+#: ../ProjectController.py:1835
 msgid "Stop"
 msgstr "Стоп"
 
-#: ../Beremiz_service.py:262
+#: ../Beremiz_service.py:272
 msgid "Stop PLC"
 msgstr "Остановить ПЛК"
 
-#: ../ProjectController.py:1785
+#: ../ProjectController.py:1836
 msgid "Stop Running PLC"
 msgstr "Остановить запущенный ПЛК"
 
-#: ../ProjectController.py:1299
+#: ../ProjectController.py:1398
 msgid "Stopped"
 msgstr "Стоп"
 
-#: ../ProjectController.py:1558
-msgid "Stopping debugger...\n"
-msgstr "Остановка отладчика...\n"
-
-#: ../editors/DataTypeEditor.py:54
+#: ../editors/DataTypeEditor.py:60
 msgid "Structure"
 msgstr "Структура"
 
-#: ../editors/DataTypeEditor.py:54
+#: ../editors/DataTypeEditor.py:60
 msgid "Subrange"
 msgstr "Поддиапазон"
 
@@ -3231,28 +3165,19 @@
 msgid "Subtraction"
 msgstr "Вычитание"
 
-#: ../ProjectController.py:1023
+#: ../ProjectController.py:1113
 msgid "Successfully built.\n"
 msgstr "Сборка прошла успешно.\n"
 
-#: ../IDEFrame.py:447
+#: ../IDEFrame.py:449
 msgid "Switch perspective"
 msgstr "Сменить представление"
 
-msgid "Sync_Align"
-msgstr ""
-
-msgid "Sync_Align_Ratio"
-msgstr ""
-
-msgid "Sync_TPDOs"
-msgstr ""
-
-#: ../dialogs/SearchInProjectDialog.py:165 ../dialogs/FindInPouDialog.py:172
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
 msgid "Syntax error in regular expression of pattern to search!"
 msgstr "Синтаксическая ошибка в регулярном выражении шаблона поиска!"
 
-#: ../dialogs/DiscoveryDialog.py:93
+#: ../dialogs/DiscoveryDialog.py:90
 msgid "TYPE"
 msgstr "Тип"
 
@@ -3260,40 +3185,41 @@
 msgid "Tangent"
 msgstr "Тангенс"
 
-msgid "TargetType"
-msgstr "Целевая платформа"
-
-#: ../editors/ResourceEditor.py:83
+#: ../editors/ResourceEditor.py:97
 msgid "Task"
 msgstr "Задача"
 
-#: ../editors/ResourceEditor.py:235
+#: ../editors/ResourceEditor.py:248
 msgid "Tasks:"
 msgstr "Задачи:"
 
-#: ../controls/VariablePanel.py:73
+#: ../controls/VariablePanel.py:91
 msgid "Temp"
 msgstr "Временный"
 
-msgid "The PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control."
-msgstr "ПИД (Пропорциональный Интегральный Дифференциальный) ФБ - классический регулятор, используемый в системах с обратной связью."
-
-msgid "The RAMP function block is modelled on example given in the standard."
-msgstr "Ограничитель скорости изменения сигнала. Функциональный блок написан согласно примеру, приведенному в стандарте."
-
-msgid "The RS bistable is a latch where the Reset dominates."
-msgstr "RS-триггер с приоритетом выключения."
-
-msgid "The SR bistable is a latch where the Set dominates."
-msgstr "SR-триггер с приоритетом включения."
-
-msgid "The derivative function block produces an output XOUT proportional to the rate of change of the input XIN."
-msgstr "Функциональный блок формирует выход XOUT пропорционально частоте изменения входа XIN."
-
-msgid "The down-counter can be used to signal when a count has reached zero, on counting down from a preset value."
-msgstr "Декрементный счетчик может использоваться, когда необходимо сигнализировать, что счетчик достиг нулевого значения с исходного заданного значения."
-
-#: ../editors/FileManagementPanel.py:180
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+"Самым правильным местом для вопросов\n"
+"о Beremiz/PLCOpenEditor\n"
+"является список рассылки проекта:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"Это основной канал общения сообщества.\n"
+"Для написания сообщений туда необходимо быть подписанным на список рассылки.\n"
+"\n"
+"Вы можете подписаться на список рассылки здесь:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+
+#: ../editors/FileManagementPanel.py:186
 #, python-format
 msgid ""
 "The file '%s' already exist.\n"
@@ -3302,53 +3228,24 @@
 "Файл '%s' уже существует.\n"
 "Вы хотите заменить его?"
 
-#: ../editors/LDViewer.py:882
+#: ../editors/LDViewer.py:893
 msgid "The group of block must be coherent!"
 msgstr "Группа блоков должна быть связанной!"
 
-msgid "The hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2."
-msgstr "Функциональный блок формирует дискретный выход с гистерезисом в зависимости от разницы двух вещественных входов XIN1 и XIN2."
-
-msgid "The integral function block integrates the value of input XIN over time."
-msgstr "Функциональный блок интегрирует входное значение XIN во времени."
-
-msgid "The off-delay timer can be used to delay setting an output false, for fixed period after input goes false."
-msgstr "Таймер выключения может быть использован, чтобы внести задержку установки выхода в FALSE на фиксированный период времени после того, как вход стал FALSE."
-
-msgid "The on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true."
-msgstr "Таймер выключения может быть использован, чтобы внести задержку установки выхода в TRUE на фиксированный период времени после того, как вход стал TRUE."
-
-msgid "The output produces a single pulse when a falling edge is detected."
-msgstr "Детектор падающего фронта.  На выходе формируется одиночный импульс, если обнаружен падающий фронт."
-
-msgid "The output produces a single pulse when a rising edge is detected."
-msgstr "Детектор нарастающего фронта. На выходе формируется одиночный импульс, если обнаружен нарастающий фронт."
-
-msgid "The pulse timer can be used to generate output pulses of a given time duration."
-msgstr "Генератор импульсов. Функциональный блок используется для генерации выходных импульсов заданной длительности."
-
-msgid "The real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on."
-msgstr "Часы реального времени используется для получения меток времени, установки даты и времени дня в отчетах, сообщениях об авариях и пр."
-
-msgid "The semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources."
-msgstr "Семафор предоставляет собой программный механизм синхронизации для обеспечения исключительного доступа к определенным ресурсам."
-
-msgid "The up-counter can be used to signal when a count has reached a maximum value."
-msgstr "Инкрементный счетчик может использоваться, когда необходимо сигнализировать, что счетчик достиг максимального значения."
-
-msgid "The up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other."
-msgstr "Инкрементный/декрементный счетчик имеет два входа CU и CD. Он может использоваться для счета вверх по одному входу и для счета низ по другому."
-
-#: ../Beremiz.py:640 ../IDEFrame.py:1011
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
 msgid "There are changes, do you want to save?"
 msgstr "Хотите сохранить изменения?"
 
-#: ../IDEFrame.py:1655 ../IDEFrame.py:1674
-#, python-format
-msgid "There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?"
-msgstr "Существует POU с именем \"%s\". Это может вызвать конфликт. Хотите продолжить?"
-
-#: ../IDEFrame.py:1098
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+"Существует POU с именем \"%s\". Это может вызвать конфликт. Хотите "
+"продолжить?"
+
+#: ../IDEFrame.py:1133
 msgid ""
 "There was a problem printing.\n"
 "Perhaps your current printer is not set correctly?"
@@ -3356,11 +3253,11 @@
 "Произошла проблема во время печати.\n"
 "Возможно, текущий принтер не настроен?"
 
-#: ../editors/LDViewer.py:891
+#: ../editors/LDViewer.py:902
 msgid "This option isn't available yet!"
 msgstr "Это опция еще не доступна!"
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:565
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
 #, python-format
 msgid "Tick: %d"
 msgstr "Цикл: %d"
@@ -3398,278 +3295,331 @@
 msgid "Time-of-day subtraction"
 msgstr "Вычитание времени суток"
 
-#: ../editors/Viewer.py:489
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr "Переключить значение"
+
+#: ../editors/Viewer.py:584
 msgid "Top"
 msgstr "Верх"
 
-#: ../ProjectController.py:1792
+#: ../ProjectController.py:1848
 msgid "Transfer"
 msgstr "Передать"
 
-#: ../ProjectController.py:1794
+#: ../ProjectController.py:1849
 msgid "Transfer PLC"
 msgstr "Передать ПЛК"
 
-#: ../ProjectController.py:1758
+#: ../ProjectController.py:1802
 msgid "Transfer completed successfully.\n"
 msgstr "Передача успешно завершена.\n"
 
-#: ../ProjectController.py:1760
+#: ../ProjectController.py:1805
 msgid "Transfer failed\n"
 msgstr "Ошибка передачи\n"
 
-#: ../editors/Viewer.py:554 ../editors/Viewer.py:2344 ../editors/Viewer.py:2371
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
 msgid "Transition"
 msgstr "Переход"
 
-#: ../PLCGenerator.py:1518
-#, python-format
-msgid "Transition \"%s\" body must contain an output variable or coil referring to its name"
-msgstr "Тело перехода \"%s\" должно содержать выходную переменную или катушку, ссылающуюся на его имя"
-
-#: ../dialogs/PouTransitionDialog.py:89
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+"Тело перехода \"%s\" должно содержать выходную переменную или катушку, "
+"ссылающуюся на его имя"
+
+#: ../dialogs/PouTransitionDialog.py:91
 msgid "Transition Name"
 msgstr "Имя перехода"
 
-#: ../dialogs/PouTransitionDialog.py:58
+#: ../dialogs/PouTransitionDialog.py:60
 msgid "Transition Name:"
 msgstr "Имя перехода:"
 
-#: ../PLCGenerator.py:1609
+#: ../PLCGenerator.py:1657
 #, python-brace-format
 msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
 msgstr "Переход с содержимым \"{a1}\" не подключен к следующему шагу в POU \"{a2}\""
 
-#: ../PLCGenerator.py:1598
+#: ../PLCGenerator.py:1646
 #, python-brace-format
-msgid "Transition with content \"{a1}\" not connected to a previous step in \"{a2}\" POU"
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
 msgstr "Переход с содержимым \"{a1}\" не подключен к предыдущему шагу в POU \"{a2}\""
 
-#: ../plcopen/plcopen.py:1318
+#: ../plcopen/plcopen.py:1526
 #, python-format
 msgid "Transition with name %s doesn't exist!"
 msgstr "Переход с именем %s отсутствует!"
 
-#: ../PLCControler.py:96
+#: ../plcopen/types_enums.py:76
 msgid "Transitions"
 msgstr "Переходы"
 
-#: ../dialogs/AboutDialog.py:123
+#: ../dialogs/AboutDialog.py:127
 msgid "Translated by"
 msgstr "Перевод"
 
-#: ../editors/ResourceEditor.py:68
+#: ../editors/ResourceEditor.py:76
 msgid "Triggering"
 msgstr "Запуск"
 
-#: ../Beremiz_service.py:476
+#: ../Beremiz_service.py:490
 msgid "Twisted unavailable."
 msgstr "Модуль Twisted недоступен."
 
-#: ../dialogs/ActionBlockDialog.py:38 ../editors/ResourceEditor.py:83
-#: ../editors/DataTypeEditor.py:50 ../controls/VariablePanel.py:53
-#: ../controls/VariablePanel.py:54
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
 msgid "Type"
 msgstr "Тип"
 
-#: ../dialogs/BrowseLocationsDialog.py:48
+#: ../dialogs/BrowseLocationsDialog.py:54
 msgid "Type and derivated"
 msgstr "Тип и его производные"
 
-#: ../canfestival/config_utils.py:336 ../canfestival/config_utils.py:624
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
 #, python-format
 msgid "Type conflict for location \"%s\""
-msgstr "Конфликт типов \"%s\""
+msgstr "Конфликт типов для адреса \"%s\""
 
 #: ../plcopen/iec_std.csv:16
 msgid "Type conversion"
 msgstr "Преобразование типов"
 
-#: ../editors/DataTypeEditor.py:162
+#: ../editors/DataTypeEditor.py:170
 msgid "Type infos:"
 msgstr "Информация о типе:"
 
-#: ../dialogs/BrowseLocationsDialog.py:49
+#: ../dialogs/BrowseLocationsDialog.py:55
 msgid "Type strict"
 msgstr "Только данный тип"
 
-#: ../dialogs/SFCDivergenceDialog.py:59 ../dialogs/SFCTransitionDialog.py:57
-#: ../dialogs/LDPowerRailDialog.py:56 ../dialogs/BrowseLocationsDialog.py:99
-#: ../dialogs/FBDBlockDialog.py:65 ../dialogs/ConnectionDialog.py:58
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
 msgid "Type:"
 msgstr "Тип:"
 
-msgid "URI_location"
-msgstr "URI системы исполнения"
-
-#: ../canfestival/config_utils.py:462 ../canfestival/config_utils.py:476
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr "Узел:"
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr "Порт:"
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr "Тип URI:"
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
 #, python-format
 msgid "Unable to define PDO mapping for node %02x"
 msgstr "Невозможно определить отображение PDO для узла %02x"
 
-#: ../targets/Xenomai/__init__.py:39
+#: ../targets/Xenomai/__init__.py:43
 #, python-format
 msgid "Unable to get Xenomai's %s \n"
 msgstr "Невозможно получить Xenomai %s\n"
 
-#: ../PLCGenerator.py:961 ../PLCGenerator.py:1214
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
 #, python-brace-format
 msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
 msgstr "Неопределенный тип блока \"{a1}\" в POU \"{a2}\""
 
-#: ../PLCGenerator.py:254
+#: ../PLCGenerator.py:261
 #, python-format
 msgid "Undefined pou type \"%s\""
 msgstr "Неопределенный тип POU \"%s\""
 
-#: ../IDEFrame.py:360 ../IDEFrame.py:421
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
 msgid "Undo"
 msgstr "Отмена"
 
-#: ../ProjectController.py:332
+#: ../ProjectController.py:442
 msgid "Unknown"
 msgstr "Неизвестно"
 
-#: ../editors/Viewer.py:393
+#: ../editors/Viewer.py:437
 #, python-format
 msgid "Unknown variable \"%s\" for this POU!"
 msgstr "Неизвестная переменная \"%s\" для этого POU!"
 
-#: ../ProjectController.py:329 ../ProjectController.py:330
+#: ../ProjectController.py:439 ../ProjectController.py:440
 msgid "Unnamed"
 msgstr "Unnamed"
 
-#: ../PLCControler.py:636
+#: ../PLCControler.py:263
 #, python-format
 msgid "Unnamed%d"
 msgstr "Unnamed%d"
 
-#: ../controls/VariablePanel.py:284
+#: ../controls/VariablePanel.py:308
 #, python-format
 msgid "Unrecognized data size \"%s\""
 msgstr "Неопределенный размер данных \"%s\""
 
-#: ../editors/DataTypeEditor.py:632 ../controls/VariablePanel.py:798
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
 msgid "User Data Types"
 msgstr "Пользовательские типы данных"
 
-#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:86
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
 msgid "User Type"
 msgstr "Пользовательский тип"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:75
 msgid "User-defined POUs"
 msgstr "Пользовательские POU"
 
-#: ../dialogs/ActionBlockDialog.py:38
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Value"
 msgstr "Значение"
 
-#: ../editors/DataTypeEditor.py:259
+#: ../editors/DataTypeEditor.py:267
 msgid "Values:"
 msgstr "Значения:"
 
-#: ../dialogs/ActionBlockDialog.py:42 ../editors/Viewer.py:526
-#: ../editors/Viewer.py:2374
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
 msgid "Variable"
 msgstr "Переменная"
 
-#: ../editors/Viewer.py:308 ../editors/Viewer.py:338 ../editors/Viewer.py:360
-#: ../editors/TextViewer.py:292 ../editors/TextViewer.py:343
-#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:329
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
 msgid "Variable Drop"
 msgstr "Перетаскивание переменной"
 
-#: ../dialogs/FBDVariableDialog.py:63
+#: ../dialogs/FBDVariableDialog.py:68
 msgid "Variable Properties"
 msgstr "Свойства переменных"
 
-#: ../editors/Viewer.py:288 ../editors/TextViewer.py:306
-#: ../controls/LocationCellEditor.py:97 ../controls/VariablePanel.py:290
-#: ../controls/VariablePanel.py:350
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
 msgid "Variable class"
 msgstr "Класс переменной"
 
-#: ../editors/Viewer.py:395 ../editors/TextViewer.py:387
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
 msgid "Variable don't belong to this POU!"
 msgstr "Переменная не принадлежит этому POU!"
 
-#: ../dialogs/LDElementDialog.py:89
+#: ../dialogs/LDElementDialog.py:92
 msgid "Variable:"
 msgstr "Переменная:"
 
-#: ../controls/VariablePanel.py:72
+#: ../controls/VariablePanel.py:90
 msgid "Variables"
 msgstr "Переменные"
 
-#: ../controls/ProjectPropertiesPanel.py:151
+#: ../controls/ProjectPropertiesPanel.py:166
 msgid "Vertical:"
 msgstr "Вертикальный:"
 
-#: ../Beremiz_service.py:586
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr "Неудачное подключение WAMP (%s) .. повтор .."
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr "WAMP соединение потеряно (%s) .. переподключение .."
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr "WAMP ID:"
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr "WAMP клиент подключается к :"
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr "Не удалось выполнить WAMP подключение!"
+
+#: ../Beremiz_service.py:625
 msgid "WAMP client startup failed. "
 msgstr "Ошибка импорта WAMP. "
 
-#: ../connectors/WAMP/__init__.py:91
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr "Неполная конфигурация WAMP."
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr "Конфигурация WAMP отсутствует."
+
+#: ../connectors/WAMP/__init__.py:99
 #, python-format
 msgid "WAMP connecting to URL : %s\n"
 msgstr "WAMP подключение к URI: %s\n"
 
-#: ../connectors/WAMP/__init__.py:131
+#: ../connectors/WAMP/__init__.py:140
 msgid "WAMP connection timeout"
 msgstr "Тайм-аут WAMP подключения "
 
-#: ../connectors/WAMP/__init__.py:150
+#: ../connectors/WAMP/__init__.py:158
 #, python-format
 msgid "WAMP connection to '%s' failed.\n"
 msgstr "Не удалось установить WAMP подключение к %s.\n"
 
-#: ../Beremiz_service.py:562
+#: ../Beremiz_service.py:595
 msgid "WAMP import failed :"
 msgstr "Ошибка импорта WAMP :"
 
-#: ../wxglade_hmi/wxglade_hmi.py:35
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr "Ошибка загрузки WAMP:"
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr "Завершение сеанса WAMP"
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
 msgid "WXGLADE GUI"
 msgstr "WXGLADE GUI"
 
-#: ../dialogs/PouDialog.py:128 ../editors/LDViewer.py:891
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr "Ошибка загрузки секретной информации Wamp:"
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
 msgid "Warning"
 msgstr "Предупреждение"
 
-#: ../ProjectController.py:616
+#: ../ProjectController.py:726
 msgid "Warnings in ST/IL/SFC code generator :\n"
 msgstr "Предупреждения в ST/IL/SFC коде генераторе:\n"
 
-#: ../dialogs/SearchInProjectDialog.py:78
+#: ../dialogs/SearchInProjectDialog.py:82
 msgid "Whole Project"
-msgstr "Целый проект"
-
-#: ../controls/ProjectPropertiesPanel.py:119
+msgstr "Весь проект"
+
+#: ../controls/ProjectPropertiesPanel.py:134
 msgid "Width:"
 msgstr "Ширина:"
 
-msgid "Win32"
-msgstr "Win32"
-
-#: ../dialogs/FindInPouDialog.py:93
+#: ../dialogs/FindInPouDialog.py:94
 msgid "Wrap search"
 msgstr "Продолжить поиск сначала"
 
-#: ../dialogs/AboutDialog.py:122
+#: ../dialogs/AboutDialog.py:126
 msgid "Written by"
 msgstr "Авторы"
 
-#: ../features.py:34
+#: ../features.py:35
 msgid "WxGlade GUI"
 msgstr "WxGlade GUI"
 
-msgid "XenoConfig"
-msgstr "Настройки Xenomai"
-
-msgid "Xenomai"
-msgstr "Xenomai"
-
-#: ../svgui/svgui.py:139
+#: ../svgui/svgui.py:150
 msgid ""
 "You don't have write permissions.\n"
 "Open Inkscape anyway ?"
@@ -3677,7 +3627,7 @@
 "У вас недостаточно прав для записи.\n"
 "Открыть Inkscape все равно?"
 
-#: ../wxglade_hmi/wxglade_hmi.py:137
+#: ../wxglade_hmi/wxglade_hmi.py:160
 msgid ""
 "You don't have write permissions.\n"
 "Open wxGlade anyway ?"
@@ -3685,7 +3635,7 @@
 "У вас недостаточно прав для записи.\n"
 "Открыть wxGlade все равно?"
 
-#: ../ProjectController.py:292
+#: ../ProjectController.py:390
 msgid ""
 "You must have permission to work on the project\n"
 "Work on a project copy ?"
@@ -3693,110 +3643,72 @@
 "Вы должны иметь права на запись, чтобы работать с проектом\n"
 "Работать с копией проекта?"
 
-#: ../editors/LDViewer.py:886
-msgid "You must select the block or group of blocks around which a branch should be added!"
-msgstr "Выберите блок или группу блоков, вокруг которых нужно добавить ветвление!"
-
-#: ../editors/LDViewer.py:666
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+"Выберите блок или группу блоков, вокруг которых нужно добавить ветвление!"
+
+#: ../editors/LDViewer.py:677
 msgid "You must select the wire where a contact should be added!"
 msgstr "Выберите провод, куда должен быть добавлен контакт!"
 
-#: ../dialogs/SFCStepNameDialog.py:48 ../dialogs/PouNameDialog.py:46
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
 msgid "You must type a name!"
 msgstr "Введите имя!"
 
-#: ../dialogs/ForceVariableDialog.py:175
+#: ../dialogs/ForceVariableDialog.py:209
 msgid "You must type a value!"
 msgstr "Введите значение!"
 
-#: ../IDEFrame.py:438
+#: ../IDEFrame.py:440
 msgid "Zoom"
 msgstr "Приближение"
 
-msgid "class"
-msgstr "класс"
-
-#: ../dialogs/DurationEditorDialog.py:151
+#: ../dialogs/DurationEditorDialog.py:158
 msgid "days"
 msgstr "дни"
 
-msgid "desc"
-msgstr ""
-
-#: ../PLCOpenEditor.py:333
+#: ../PLCOpenEditor.py:317
 #, python-format
 msgid "error: %s\n"
 msgstr "ошибка: %s\n"
 
-#: ../util/ProcessLogger.py:169
+#: ../util/ProcessLogger.py:178
 #, python-brace-format
 msgid "exited with status {a1} (pid {a2})\n"
 msgstr "завершился с кодом {a1} (pid {a2})\n"
 
-#: ../PLCOpenEditor.py:396 ../PLCOpenEditor.py:398
-msgid "file : "
-msgstr "файл:"
-
-msgid "first input parameter"
-msgstr "первый входной параметр"
-
-msgid "first output parameter"
-msgstr "первый выходной параметр"
-
-#: ../dialogs/PouDialog.py:31
+#: ../dialogs/PouDialog.py:36
 msgid "function"
 msgstr "функция"
 
-#: ../PLCOpenEditor.py:399
-msgid "function : "
-msgstr "функция: "
-
-#: ../dialogs/PouDialog.py:31
+#: ../dialogs/PouDialog.py:36
 msgid "functionBlock"
 msgstr "функциональный блок"
 
-#: ../dialogs/DurationEditorDialog.py:151
+#: ../dialogs/DurationEditorDialog.py:158
 msgid "hours"
 msgstr "часы"
 
-msgid "initial"
-msgstr "исходный"
-
-msgid "internal state: 0-reset, 1-counting, 2-set"
-msgstr "состояние: 0 - сброс, 1 - счёт, 2 - установка"
-
-#: ../PLCOpenEditor.py:399
-msgid "line : "
-msgstr "строка:"
-
-#: ../dialogs/DurationEditorDialog.py:153
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr "Установка matiec не найдена\n"
+
+#: ../dialogs/DurationEditorDialog.py:160
 msgid "milliseconds"
 msgstr "милисекунды"
 
-#: ../dialogs/DurationEditorDialog.py:152
+#: ../dialogs/DurationEditorDialog.py:159
 msgid "minutes"
 msgstr "минуты"
 
-msgid "name"
-msgstr "имя"
-
-msgid "onchange"
-msgstr ""
-
-msgid "opts"
-msgstr ""
-
-#: ../dialogs/PouDialog.py:31
+#: ../dialogs/PouDialog.py:36
 msgid "program"
 msgstr "программа"
 
-msgid "second input parameter"
-msgstr "второй входной параметр"
-
-msgid "second output parameter"
-msgstr "второй выходной параметр"
-
-#: ../dialogs/DurationEditorDialog.py:152
+#: ../dialogs/DurationEditorDialog.py:159
 msgid "seconds"
 msgstr "секунды"
 
@@ -3812,252 +3724,408 @@
 msgid "string right of"
 msgstr "строка справа от "
 
-msgid "type"
-msgstr "тип"
-
-#: ../Beremiz.py:126
+#: ../Beremiz.py:167
 msgid "update info unavailable."
 msgstr "информация об обновлениях недоступна."
 
-msgid "variable"
-msgstr "переменная"
-
-msgid "variables"
-msgstr "переменные"
-
-#: ../PLCOpenEditor.py:331
+#: ../PLCOpenEditor.py:315
 #, python-format
 msgid "warning: %s\n"
 msgstr "предупреждение: %s\n"
 
-#: ../PLCControler.py:970
+#: ../PLCControler.py:576
 #, python-brace-format
 msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
 msgstr "{a1} \"{a2}\" не может быть вставлен как {a3}."
 
-#: ../ConfigTreeNode.py:56
+#: ../ConfigTreeNode.py:58
 #, python-brace-format
 msgid ""
-"{a1} XML file doesn't follow XSD schema at line %{a2}:\n"
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
 "{a3}"
-msgstr ""
-"{a1} XML файл не следует XSD-схеме в строке {a2}:\n"
-"{a3}"
-
-#~ msgid ""
-#~ "\n"
-#~ "An error has occurred.\n"
-#~ "\n"
-#~ "Click OK to save an error report.\n"
-#~ "\n"
-#~ "Please be kind enough to send this file to:\n"
-#~ "edouard.tisserant@gmail.com\n"
-#~ "\n"
-#~ "Error:\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Произошла ошибка.\n"
-#~ "\n"
-#~ "Нажмите OK, чтобы сохранить репорт об ошибке.\n"
-#~ "\n"
-#~ "Будьте так добры, пошлите этот файл:\n"
-#~ "edouard.tisserant@gmail.com\n"
-#~ "\n"
-#~ "Ошибка:\n"
-
-#~ msgid " -> Nothing to do\n"
-#~ msgstr " -> Ничего не нужно делать\n"
-
-#~ msgid " : "
-#~ msgstr " : "
-
-#~ msgid "\"%s\" element can't be pasted here!!!"
-#~ msgstr "Элемент \"%s\" не может быть вставлен сюда!!!"
-
-#~ msgid "... debugger recovered\n"
-#~ msgstr "... отладчик восстановлен\n"
-
-#~ msgid "About Beremiz"
-#~ msgstr "О Beremiz"
-
-#~ msgid "About PLCOpenEditor"
-#~ msgstr "О PLCOpenEditor"
-
-#~ msgid "Clear the graph values"
-#~ msgstr "Очистить значения на графике"
-
-#~ msgid ""
-#~ "Derivative\n"
-#~ "The derivative function block produces an output XOUT proportional to the rate of change of the input XIN."
-#~ msgstr ""
-#~ "Производная\n"
-#~ "Функциональный блок формирует выход XOUT пропорционально частоте изменения входа XIN."
-
-#~ msgid "Description"
-#~ msgstr "Описание"
-
-#~ msgid ""
-#~ "Down-counter\n"
-#~ "The down-counter can be used to signal when a count has reached zero, on counting down from a preset value."
-#~ msgstr ""
-#~ "Декрементный счетчик\n"
-#~ "Декрементный счетчик может использоваться, когда необходимо сигнализировать, что счетчик достиг нулевого значения с исходного заданного значения."
-
-#~ msgid "Enable_Native_Library"
-#~ msgstr "Разрешить библиотеку Native"
-
-#~ msgid ""
-#~ "Falling edge detector\n"
-#~ "The output produces a single pulse when a falling edge is detected."
-#~ msgstr ""
-#~ "Детектор падающего фронта\n"
-#~ "На выходе формируется одиночный импульс, если обнаружен падающий фронт."
-
-#~ msgid "Form isn't complete. Pattern to search must be filled!"
-#~ msgstr "Форма заполнена неполностью. Шаблон поиска должен быть заполнен!"
-
-#~ msgid ""
-#~ "Hysteresis\n"
-#~ "The hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2."
-#~ msgstr ""
-#~ "Гистерезис\n"
-#~ "Функциональный блок формирует дискретный выход с гистерезисом в зависимости от разницы двух вещественных входов XIN1 и XIN2."
-
-#~ msgid "IEC-61131-3 code generation failed !\n"
-#~ msgstr "Неудачная генерация МЭК-61131-3 кода!\n"
-
-#~ msgid "In section: "
-#~ msgstr "В секции: "
-
-#~ msgid "Initial"
-#~ msgstr "Исходное значение"
-
-#~ msgid ""
-#~ "Integral\n"
-#~ "The integral function block integrates the value of input XIN over time."
-#~ msgstr ""
-#~ "Интеграл\n"
-#~ "Функциональный блок интегрирует входное значение XIN во времени."
-
-#~ msgid "Move debug variable down"
-#~ msgstr "Переместить отлаживаемую переменную ниже"
-
-#~ msgid "Move debug variable up"
-#~ msgstr "Переместить отлаживаемую переменную выше"
-
-#~ msgid "No PLC project found"
-#~ msgstr "Не найден проект ПЛК"
-
-#~ msgid "No output variable found"
-#~ msgstr "Выходная переменная не найдена"
-
-#~ msgid ""
-#~ "Off-delay timer\n"
-#~ "The off-delay timer can be used to delay setting an output false, for fixed period after input goes false."
-#~ msgstr ""
-#~ "Таймер выключения\n"
-#~ "Таймер выключения может быть использован, чтобы внести задержку установки выхода в FALSE на фиксированный период времени после того, как вход стал FALSE."
-
-#~ msgid ""
-#~ "On-delay timer\n"
-#~ "The on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true."
-#~ msgstr ""
-#~ "Таймер включения\n"
-#~ "Таймер выключения может быть использован, чтобы внести задержку установки выхода в TRUE на фиксированный период времени после того, как вход стал TRUE."
-
-#~ msgid ""
-#~ "PID\n"
-#~ "The PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control."
-#~ msgstr ""
-#~ "ПИД\n"
-#~ "ПИД (Пропорциональный Интегральный Дифференциальный) ФБ - классический регулятор, используемый в системах с обратной связью."
-
-#~ msgid "Position:"
-#~ msgstr "Позиция:"
-
-#~ msgid ""
-#~ "Pulse timer\n"
-#~ "The pulse timer can be used to generate output pulses of a given time duration."
-#~ msgstr ""
-#~ "Генератор импульсов\n"
-#~ "Функциональный блок используется для генерации выходных импульсов заданной длительности."
-
-#~ msgid ""
-#~ "RS bistable\n"
-#~ "The RS bistable is a latch where the Reset dominates."
-#~ msgstr ""
-#~ "RS триггер\n"
-#~ "RS триггер - переключатель с доминантой выключения."
-
-#~ msgid ""
-#~ "Ramp\n"
-#~ "The RAMP function block is modelled on example given in the standard."
-#~ msgstr ""
-#~ "Ограничитель скорости изменения сигнала\n"
-#~ "Функциональный блок написан согласно примеру, приведенному в стандарте."
-
-#~ msgid ""
-#~ "Real time clock\n"
-#~ "The real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on."
-#~ msgstr ""
-#~ "RTC часы\n"
-#~ "Часы реального времени используется для получения меток времени, установки даты и времени дня в отчетах, сообщениях об авариях и пр."
-
-#~ msgid "Remove debug variable"
-#~ msgstr "Удалить отлаживаемую переменную"
-
-#~ msgid "Reset zoom and offset"
-#~ msgstr "Сбросить приближение и смещение"
-
-#~ msgid ""
-#~ "Rising edge detector\n"
-#~ "The output produces a single pulse when a rising edge is detected."
-#~ msgstr ""
-#~ "Детектор нарастающего фронта\n"
-#~ "На выходе формируется одиночный импульс, если обнаружен нарастающий фронт."
-
-#~ msgid ""
-#~ "SR bistable\n"
-#~ "The SR bistable is a latch where the Set dominates."
-#~ msgstr ""
-#~ "SR триггер\n"
-#~ "SR триггер - переключатель с доминантой включения."
-
-#~ msgid ""
-#~ "Semaphore\n"
-#~ "The semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources."
-#~ msgstr ""
-#~ "Семафор\n"
-#~ "Семафор предоставляет собой программный механизм синхронизации для обеспечения исключительного доступа к определенным ресурсам."
-
-#~ msgid "Tick"
-#~ msgstr "Тик"
-
-#~ msgid ""
-#~ "Up-counter\n"
-#~ "The up-counter can be used to signal when a count has reached a maximum value."
-#~ msgstr ""
-#~ "Инкрементный счетчик\n"
-#~ "Инкрементный счетчик может использоваться, когда необходимо сигнализировать, что счетчик достиг максимального значения."
-
-#~ msgid ""
-#~ "Up-down counter\n"
-#~ "The up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other."
-#~ msgstr ""
-#~ "Инкрементный/декрементный счетчик\n"
-#~ "Инкрементный/декрементный счетчик имеет два входа CU и CD. Он может использоваться для счета вверх по одному входу и для счета низ по другому."
-
-#~ msgid "Values"
-#~ msgstr "Значения"
-
-#~ msgid "Waiting debugger to recover...\n"
-#~ msgstr "Ожидание восстановления отладчика...\n"
-
-#~ msgid "Zoom:"
-#~ msgstr "Приближение:"
-
-#~ msgid "about.html"
-#~ msgstr "about.ru.html"
-
-#~ msgid "plcopen_about.html"
-#~ msgstr "plcopen_about.ru.html"
+msgstr "{a1} Файл XML не соответствует XSD-схеме в строке {a2}:{a3}"
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr "Подчинённое устройство CanOpen"
+
+msgid "CAN_Device"
+msgstr "CAN устройство"
+
+msgid "CAN_Baudrate"
+msgstr "Скорость CAN"
+
+msgid "NodeId"
+msgstr "ID узла"
+
+msgid "Sync_Align"
+msgstr "Sync_Aligh"
+
+msgid "Sync_Align_Ratio"
+msgstr "Sync_Align_Ratio"
+
+msgid "CanFestivalNode"
+msgstr "Узел CanFestival"
+
+msgid "Sync_TPDOs"
+msgstr "Sync_TPDOs"
+
+msgid "CanFestivalInstance"
+msgstr "Экземпляр CanFestival"
+
+msgid "CAN_Driver"
+msgstr "CAN драйвер"
+
+msgid "Generic"
+msgstr "Generic"
+
+msgid "Command"
+msgstr "Команда"
+
+msgid "Xenomai"
+msgstr "Xenomai"
+
+msgid "XenoConfig"
+msgstr "Настройки Xenomai"
+
+msgid "Compiler"
+msgstr "Компилятор"
+
+msgid "CFLAGS"
+msgstr "CFLAGS"
+
+msgid "Linker"
+msgstr "Компоновщик"
+
+msgid "LDFLAGS"
+msgstr "LDFLAGS"
+
+msgid "Linux"
+msgstr "GNU/Linux"
+
+msgid "Win32"
+msgstr "Win32"
+
+msgid "ModbusRequest"
+msgstr "Запрос Modbus"
+
+msgid "SlaveID"
+msgstr "Адрес устройства"
+
+msgid "Nr_of_Channels"
+msgstr "Число каналов"
+
+msgid "Start_Address"
+msgstr "Начальный адрес"
+
+msgid "Timeout_in_ms"
+msgstr "Таймаут, мс"
+
+msgid "MemoryArea"
+msgstr "Область памяти"
+
+msgid "MemoryAreaType"
+msgstr "Тип области памяти"
+
+msgid "ModbusTCPclient"
+msgstr "Modbus/TCP Master"
+
+msgid "Remote_IP_Address"
+msgstr "IP адрес"
+
+msgid "Remote_Port_Number"
+msgstr "TCP порт"
+
+msgid "Invocation_Rate_in_ms"
+msgstr "Период опроса, мс"
+
+msgid "ModbusServerNode"
+msgstr "Modbus/TCP Slave"
+
+msgid "Local_IP_Address"
+msgstr "IP адрес"
+
+msgid "Local_Port_Number"
+msgstr "TCP порт"
+
+msgid "ModbusRTUclient"
+msgstr "Modbus/RTU Master"
+
+msgid "Serial_Port"
+msgstr "Последовательный порт"
+
+msgid "Baud_Rate"
+msgstr "Скорость"
+
+msgid "Parity"
+msgstr "Чётность"
+
+msgid "Stop_Bits"
+msgstr "Стоп-биты"
+
+msgid "ModbusRTUslave"
+msgstr "Modbus/RTU Slave"
+
+msgid "ModbusRoot"
+msgstr "Modbus"
+
+msgid "MaxRemoteTCPclients"
+msgstr "Максимальное количество TCP клиентов"
+
+msgid "BaseParams"
+msgstr "Базовые параметры"
+
+msgid "IEC_Channel"
+msgstr "МЭК-канал"
+
+msgid "Enabled"
+msgstr "Разрешено"
+
+msgid "BeremizRoot"
+msgstr "Настройки Beremiz "
+
+msgid "TargetType"
+msgstr "Целевая платформа"
+
+msgid "Libraries"
+msgstr "Библиотеки"
+
+msgid "URI_location"
+msgstr "URI системы исполнения"
+
+msgid "Disable_Extensions"
+msgstr "Запретить расширения"
+
+msgid "%(codefile_name)s"
+msgstr "%(codefile_name)"
+
+msgid "variables"
+msgstr "переменные"
+
+msgid "variable"
+msgstr "переменная"
+
+msgid "name"
+msgstr "имя"
+
+msgid "type"
+msgstr "тип"
+
+msgid "class"
+msgstr "класс"
+
+msgid "initial"
+msgstr "исходный"
+
+msgid "desc"
+msgstr "описание"
+
+msgid "onchange"
+msgstr "по изменению"
+
+msgid "opts"
+msgstr "опции"
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr "0 - текущее время, 1 - отклонение от PDT"
+
+msgid "Preset datetime"
+msgstr "Основное время"
+
+msgid "Copy of IN"
+msgstr "Копия входа IN"
+
+msgid "Datetime, current or relative to PDT"
+msgstr "Текущие дата и время, абсолютные или относительные от PDT"
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+"Часы реального времени используется для получения меток времени, установки "
+"даты и времени дня в отчетах, сообщениях об авариях и пр."
+
+msgid "1 = integrate, 0 = hold"
+msgstr "1 = интегрировать, 0 = остановка"
+
+msgid "Overriding reset"
+msgstr "Сброс интегратора"
+
+msgid "Input variable"
+msgstr "Входная переменная"
+
+msgid "Initial value"
+msgstr "Исходное значение"
+
+msgid "Sampling period"
+msgstr "Период сэмплирования"
+
+msgid "NOT R1"
+msgstr "НЕ R1"
+
+msgid "Integrated output"
+msgstr "Интегрированный выход"
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr "Функциональный блок интегрирует входное значение XIN во времени."
+
+msgid "0 = reset"
+msgstr "0 = сброс"
+
+msgid "Input to be differentiated"
+msgstr "Вход для дифференцирования"
+
+msgid "Differentiated output"
+msgstr "Дифференцированный выход"
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+"Функциональный блок формирует выход XOUT пропорционально частоте изменения "
+"входа XIN."
+
+msgid "0 - manual , 1 - automatic"
+msgstr "0 - ручной, 1 - автоматический"
+
+msgid "Process variable"
+msgstr "Текущее значение регулируемой переменной"
+
+msgid "Set point"
+msgstr "Уставка"
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr "Ручной выход"
+
+msgid "Proportionality constant"
+msgstr "Коэффициент пропорциональности"
+
+msgid "Reset time"
+msgstr "Постоянная времени интегрирования"
+
+msgid "Derivative time constant"
+msgstr "Постоянная времени дифференцирования"
+
+msgid "PV - SP"
+msgstr "Ошибка, PV - SP"
+
+msgid "FB for integral term"
+msgstr "ФД интегрирования"
+
+msgid "FB for derivative term"
+msgstr "ФБ дифференцирования"
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+"ПИД (Пропорциональный Интегральный Дифференциальный) ФБ - классический "
+"регулятор, используемый в системах с обратной связью."
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr "0 - вход X0, 1 - нарастание до значения X1"
+
+msgid "Ramp duration"
+msgstr "Длительность нарастания"
+
+msgid "BUSY = 1 during ramping period"
+msgstr "BUSY = 1 во время "
+
+msgid "Elapsed time of ramp"
+msgstr "Прошедшее время нарастания"
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr ""
+"Ограничитель скорости изменения сигнала. Функциональный блок написан "
+"согласно примеру, приведенному в стандарте."
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+"Функциональный блок формирует дискретный выход с гистерезисом в зависимости "
+"от разницы двух вещественных входов XIN1 и XIN2."
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr "SR-триггер с приоритетом включения."
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr "RS-триггер с приоритетом выключения."
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+"Семафоры обеспечивают механизм эксклюзивного использования ресурсов частями "
+"приложения"
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+"Детектор нарастающего фронта. На выходе формируется одиночный импульс, если "
+"обнаружен нарастающий фронт."
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+"Детектор падающего фронта.  На выходе формируется одиночный импульс, если "
+"обнаружен падающий фронт."
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+"Инкрементный счетчик может использоваться, когда необходимо сигнализировать,"
+" что счетчик достиг максимального значения."
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+"Декрементный счетчик может использоваться, когда необходимо сигнализировать,"
+" что счетчик достиг нулевого значения с исходного заданного значения."
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+"Инкрементный/декрементный счетчик имеет два входа CU и CD. Он может "
+"использоваться для счета вверх по одному входу и для счета низ по другому."
+
+msgid "first input parameter"
+msgstr "первый входной параметр"
+
+msgid "second input parameter"
+msgstr "второй входной параметр"
+
+msgid "first output parameter"
+msgstr "первый выходной параметр"
+
+msgid "second output parameter"
+msgstr "второй выходной параметр"
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr "состояние: 0 - сброс, 1 - счёт, 2 - установка"
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+"Генератор импульсов. Функциональный блок используется для генерации выходных"
+" импульсов заданной длительности."
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+"Таймер включения может быть использован, чтобы внести задержку установки "
+"выхода в TRUE на фиксированный период времени после того, как вход стал "
+"TRUE."
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
+"Таймер выключения может быть использован, чтобы внести задержку установки "
+"выхода в FALSE на фиксированный период времени после того, как вход стал "
+"FALSE."
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/Beremiz_sl_SI.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4123 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Andrey Skvortsov <andrej.skvortzov@gmail.com>, 2018\n"
+"Language-Team: Slovenian (Slovenia) (https://www.transifex.com/beremiz/teams/75746/sl_SI/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sl_SI\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
+msgid ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+msgstr ""
+"\n"
+"Nepredvidena izjema se je zgodila v programu( bug). Poročilo je shranjeno na:\n"
+"(%s)\n"
+"\n"
+"Prosim pošljite to datoteko na naslov :\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"Potrebno je na novo zagnati program.\n"
+"\n"
+"Izvor:\n"
+
+#: ../controls/VariablePanel.py:90
+msgid "   External"
+msgstr "Zunanji"
+
+#: ../controls/VariablePanel.py:89
+msgid "   InOut"
+msgstr "Vhod-Izhod"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Input"
+msgstr "Vhod"
+
+#: ../controls/VariablePanel.py:90
+msgid "   Local"
+msgstr "Lokalni"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Output"
+msgstr "Izhod"
+
+#: ../controls/VariablePanel.py:91
+msgid "   Temp"
+msgstr "Začasni"
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
+#, python-format
+msgid " and %s"
+msgstr " in %s"
+
+#: ../ProjectController.py:1182
+msgid " generation failed !\n"
+msgstr "ustvarjanje prekinjeno !\n"
+
+#: ../plcopen/plcopen.py:1029
+#, python-format
+msgid "\"%s\" Data Type doesn't exist !!!"
+msgstr "Podatkovni tip \"%s\" ne obstaja !!!"
+
+#: ../plcopen/plcopen.py:1047
+#, python-format
+msgid "\"%s\" POU already exists !!!"
+msgstr "POU \"%s\" že obstaja !!!"
+
+#: ../plcopen/plcopen.py:1068
+#, python-format
+msgid "\"%s\" POU doesn't exist !!!"
+msgstr "POU \"%s\" ne obstaja!!!"
+
+#: ../editors/Viewer.py:288
+#, python-format
+msgid "\"%s\" can't use itself!"
+msgstr "\"%s\" ne morem uporabiti sebe!"
+
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
+#, python-format
+msgid "\"%s\" config already exists!"
+msgstr "\"%s\" konfiguracija že obstaja !"
+
+#: ../plcopen/plcopen.py:531
+#, python-format
+msgid "\"%s\" configuration already exists !!!"
+msgstr "\"%s\" konfiguracija že obstaja !!!"
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr "\"%s\" konfiguracija ne obstaja !!!"
+
+#: ../IDEFrame.py:1638
+#, python-format
+msgid "\"%s\" data type already exists!"
+msgstr "Podatkovni tip \"%s\" že obstaja!"
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
+#, python-format
+msgid "\"%s\" element for this pou already exists!"
+msgstr "Element \"%s\" tega POU že obstaja!"
+
+#: ../BeremizIDE.py:928
+#, python-format
+msgid "\"%s\" folder is not a valid Beremiz project\n"
+msgstr "Mapa \"%s\" ni veljaven Beremiz projekt\n"
+
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
+#, python-format
+msgid "\"%s\" is a keyword. It can't be used!"
+msgstr "Beseda \"%s\" je rezervirana beseda in se ne more uporabit!"
+
+#: ../plcopen/plcopen.py:2836
+#, python-format
+msgid "\"%s\" is an invalid value!"
+msgstr "\"%s\" je neveljavna vrednost!"
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
+msgid "\"%s\" is not a valid folder!"
+msgstr "\"%s\" ni veljavna mapa!"
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
+#, python-format
+msgid "\"%s\" is not a valid identifier!"
+msgstr "\"%s\" ni veljavena označba!"
+
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr "\"%s\" je uporabljen v ene ali več POU. Želiš nadaljevati?"
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
+#, python-format
+msgid "\"%s\" pou already exists!"
+msgstr "POU \"%s\" že obstaja!"
+
+#: ../dialogs/SFCStepNameDialog.py:62
+#, python-format
+msgid "\"%s\" step already exists!"
+msgstr "Korak \"%s\" že obstaja!"
+
+#: ../editors/DataTypeEditor.py:566
+#, python-format
+msgid "\"%s\" value already defined!"
+msgstr "Vrednost \"%s\" je že definirana!"
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
+#, python-format
+msgid "\"%s\" value isn't a valid array dimension!"
+msgstr "\"%s\" vrednost ni veljavna dimenzija tabele!"
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
+#, python-format
+msgid ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+msgstr ""
+"\"%s\" vrednost ni veljavna dimenzija tabele!\n"
+"Desna vrednost mora biti večja od leve vrednosti."
+
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr "Funkcija \"{a1}\" je bila preklicana v POU \"{a2}\": Nobeden vhod ni povezan"
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr "\"{a1}\" je že uporabljen v \"{a2}\"!"
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr "Vir \"{a1}\" že obstaja v konfiguraciji \"{a2}\"  !!!"
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr "Vir \"{a1}\" ne obstaja v konfiguraciji \"{a2}\" !!!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr "%03gms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr "%dd"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr "%dh"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr "%dm"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr "%dms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr "%ds"
+
+#: ../PLCControler.py:1114
+#, python-format
+msgid "%s Data Types"
+msgstr "Podatkovni tipi %s "
+
+#: ../PLCControler.py:1097
+#, python-format
+msgid "%s POUs"
+msgstr "%s POU-ji"
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
+#, python-format
+msgid "%s Profile"
+msgstr "%s profil"
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
+#, python-format
+msgid "%s body don't have instances!"
+msgstr "Telo %s nima Primerkov!"
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
+#, python-format
+msgid "%s body don't have text!"
+msgstr "%s telo nima besedila!"
+
+#: ../IDEFrame.py:388
+msgid "&Add Element"
+msgstr "&Dodaj Element"
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr "&Zapri"
+
+#: ../IDEFrame.py:361
+msgid "&Configuration"
+msgstr "%Konfiguracija"
+
+#: ../IDEFrame.py:350
+msgid "&Data Type"
+msgstr "&Podatkovni tip"
+
+#: ../IDEFrame.py:392
+msgid "&Delete"
+msgstr "&Pobriši"
+
+#: ../IDEFrame.py:342
+msgid "&Display"
+msgstr "&Prikaži"
+
+#: ../IDEFrame.py:341
+msgid "&Edit"
+msgstr "&Uredi"
+
+#: ../IDEFrame.py:340
+msgid "&File"
+msgstr "&Datoteka"
+
+#: ../IDEFrame.py:352
+msgid "&Function"
+msgstr "&Funkcija"
+
+#: ../IDEFrame.py:343
+msgid "&Help"
+msgstr "&Pomoč"
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr "&Licenca"
+
+#: ../IDEFrame.py:356
+msgid "&Program"
+msgstr "&Program"
+
+#: ../PLCOpenEditor.py:98
+msgid "&Properties"
+msgstr "&Lastnosti"
+
+#: ../BeremizIDE.py:244
+msgid "&Recent Projects"
+msgstr "&Nedavni Projekti"
+
+#: ../IDEFrame.py:358
+msgid "&Resource"
+msgstr "&Vir"
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr "'{a1}' - {a2} ujema v Projektu"
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr "'{a1}' - {a2} ujema v Projektu"
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr "'{a1}' je najden v  {a2}\n"
+
+#: ../controls/SearchResultPanel.py:298
+#, python-format
+msgid "(%d matches)"
+msgstr "(%d ujemanj)"
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
+#, python-format
+msgid ", %s"
+msgstr ", %s"
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr ""
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr "1d"
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr "1h"
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr "1m"
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr "1s"
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+"POU že ima element poimenovan \"%s\". To lahko povzroči težave. Ali želiš "
+"nadaljevati?"
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
+#, python-format
+msgid "A POU named \"%s\" already exists!"
+msgstr "POU z imenom \"%s\" že obstaja!"
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr "Otrok z imenom \"{a1}\" že obstaja -> \"{a2}\"\n"
+
+#: ../dialogs/BrowseLocationsDialog.py:229
+msgid "A location must be selected!"
+msgstr "Lokacija mora biti izbrana!"
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr "Opravilo z enakim imenom že obstaja!"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
+#, python-format
+msgid "A variable with \"%s\" as name already exists in this pou!"
+msgstr "Spremenljivka z imenom \"%s\" že obstaja v tem POU!"
+
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr "Spremenljivka z imenom \"%s\" že obstaja!"
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
+msgid "About"
+msgstr "O programu"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Absolute number"
+msgstr "Absolutna številka"
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
+msgid "Action"
+msgstr "Akcija"
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
+msgid "Action Block"
+msgstr "Akcijski blok"
+
+#: ../dialogs/PouActionDialog.py:89
+msgid "Action Name"
+msgstr "Ime Akcije"
+
+#: ../dialogs/PouActionDialog.py:56
+msgid "Action Name:"
+msgstr "Ime Akcije:"
+
+#: ../plcopen/plcopen.py:1567
+#, python-format
+msgid "Action with name %s doesn't exist!"
+msgstr "Akcija z imenom %s ne obstaja!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Actions"
+msgstr "Akcije"
+
+#: ../dialogs/ActionBlockDialog.py:139
+msgid "Actions:"
+msgstr "Akcije:"
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr "Aktiven"
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
+msgid "Add"
+msgstr "Dodaj"
+
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
+msgid "Add Action"
+msgstr "Dodaj Akcijo"
+
+#: ../features.py:33
+msgid "Add C code accessing located variables synchronously"
+msgstr "Dodaj C programsko kodo z sočasnim dostopom do lokalnih spremenljivk"
+
+#: ../IDEFrame.py:1907
+msgid "Add Configuration"
+msgstr "Dodaj Konfiguracijo"
+
+#: ../IDEFrame.py:1887
+msgid "Add DataType"
+msgstr "Dodaj Podatkovni tip"
+
+#: ../editors/Viewer.py:609
+msgid "Add Divergence Branch"
+msgstr "Dodaj Razhajališče"
+
+#: ../dialogs/DiscoveryDialog.py:121
+msgid "Add IP"
+msgstr "Dodaj IP"
+
+#: ../IDEFrame.py:1895
+msgid "Add POU"
+msgstr "Dodaj POU"
+
+#: ../features.py:34
+msgid "Add Python code executed asynchronously"
+msgstr "Dodaj Python programsko koda, ki se izvaja asinhrono"
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
+msgid "Add Resource"
+msgstr "Dodaj Vir"
+
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
+msgid "Add Transition"
+msgstr "Dodaj Prehod"
+
+#: ../editors/Viewer.py:596
+msgid "Add Wire Segment"
+msgstr "Dodaj odsek žice"
+
+#: ../editors/SFCViewer.py:447
+msgid "Add a new initial step"
+msgstr "Dodaj začetni skok"
+
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
+msgid "Add a new jump"
+msgstr "Dodaj nov skok"
+
+#: ../editors/SFCViewer.py:469
+msgid "Add a new step"
+msgstr "Dodaj nov korak"
+
+#: ../features.py:35
+msgid "Add a simple WxGlade based GUI."
+msgstr "Dodaj enostaven WxGlade GUI."
+
+#: ../dialogs/ActionBlockDialog.py:143
+msgid "Add action"
+msgstr "Dodaj Akcijo"
+
+#: ../editors/DataTypeEditor.py:364
+msgid "Add element"
+msgstr "Dodaj ELEMENT"
+
+#: ../editors/ResourceEditor.py:283
+msgid "Add instance"
+msgstr "Dodaj Primerek"
+
+#: ../canfestival/NetworkEditor.py:110
+msgid "Add slave"
+msgstr "Dodaj podrejeno napravo"
+
+#: ../editors/ResourceEditor.py:252
+msgid "Add task"
+msgstr "Dodaj Opravilo"
+
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
+msgid "Add variable"
+msgstr "Dodaj spremenljivko!"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Addition"
+msgstr "Dodajanje"
+
+#: ../plcopen/definitions.py:51
+msgid "Additional function blocks"
+msgstr "Dodatni funkcijski bloki"
+
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr "Nastavi velikost bloka"
+
+#: ../editors/Viewer.py:1720
+msgid "Alignment"
+msgstr "Poravnava"
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
+msgid "All"
+msgstr "Vse"
+
+#: ../editors/FileManagementPanel.py:37
+msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+msgstr "Vse datoteke (*.*)|*.*|CSV datoteke (*.csv)|*.csv"
+
+#: ../ProjectController.py:1670
+msgid "Already connected. Please disconnect\n"
+msgstr "Že povezan. Prosim najprej prekini\n"
+
+#: ../editors/DataTypeEditor.py:607
+#, python-format
+msgid "An element named \"%s\" already exists in this structure!"
+msgstr "Element z imenom \"%s\" že obstaja v tej strukturi!"
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr "Primerek z enakim imenom že obstaja"
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr "Uveljavi spremembo imena za vse nadaljnje objekte z enakim imenom"
+
+#: ../plcopen/iec_std.csv:31
+msgid "Arc cosine"
+msgstr "Arkus kosinus"
+
+#: ../plcopen/iec_std.csv:30
+msgid "Arc sine"
+msgstr "Arkus sinus"
+
+#: ../plcopen/iec_std.csv:32
+msgid "Arc tangent"
+msgstr "Arkus tangens"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Arithmetic"
+msgstr "Aritmetičen"
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
+msgid "Array"
+msgstr "Tabela"
+
+#: ../plcopen/iec_std.csv:39
+msgid "Assignment"
+msgstr "Prireditev"
+
+#: ../dialogs/FBDVariableDialog.py:226
+msgid "At least a variable or an expression must be selected!"
+msgstr "Vsaj ena spremenljivka ali logični izraz mora biti izbran!"
+
+#: ../controls/ProjectPropertiesPanel.py:111
+msgid "Author"
+msgstr "Avtor"
+
+#: ../controls/ProjectPropertiesPanel.py:108
+msgid "Author Name (optional):"
+msgstr "Avtorjevo ime (ni obvezno):"
+
+#: ../dialogs/FindInPouDialog.py:80
+msgid "Backward"
+msgstr "Nazaj"
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
+#, python-format
+msgid "Bad location size : %s"
+msgstr "Nepravilna velikost lokacije : %s"
+
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
+msgid "Base Type:"
+msgstr "Osnovni Tip:"
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
+msgid "Base Types"
+msgstr "Osnovni Tipi"
+
+#: ../BeremizIDE.py:483
+msgid "Beremiz"
+msgstr "Beremiz"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Binary selection (1 of 2)"
+msgstr "Bitna izbira (1 od 2)"
+
+#: ../plcopen/iec_std.csv:62
+msgid "Bit-shift"
+msgstr "Bitno premikanje"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise"
+msgstr "Bitna operacija"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise AND"
+msgstr "Bitna operacija IN"
+
+#: ../plcopen/iec_std.csv:67
+msgid "Bitwise OR"
+msgstr "Bitna operacija ALI"
+
+#: ../plcopen/iec_std.csv:68
+msgid "Bitwise XOR"
+msgstr "Bitni XOR"
+
+#: ../plcopen/iec_std.csv:69
+msgid "Bitwise inverting"
+msgstr "Bitni invertiranje"
+
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
+msgid "Block"
+msgstr "Blok"
+
+#: ../dialogs/FBDBlockDialog.py:63
+msgid "Block Properties"
+msgstr "Lastnosti bloka"
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr "Ime bloka"
+
+#: ../editors/Viewer.py:586
+msgid "Bottom"
+msgstr "Spodaj"
+
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr "Prekinjen"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
+msgid "Browse %s values library"
+msgstr "Razišči %s vrednosti v knjižnici"
+
+#: ../dialogs/BrowseLocationsDialog.py:72
+msgid "Browse Locations"
+msgstr "Razišči lokacije"
+
+#: ../ProjectController.py:1815
+msgid "Build"
+msgstr "Gradnja"
+
+#: ../ProjectController.py:1335
+msgid "Build directory already clean\n"
+msgstr "Projektna mapa - gradnje je že bila očiščena\n"
+
+#: ../ProjectController.py:1816
+msgid "Build project into build folder"
+msgstr "Gradnja projekta v mapo projekta - gradnje"
+
+#: ../ProjectController.py:1108
+msgid "C Build crashed !\n"
+msgstr "Gradnja C programske kode ni uspela !\n"
+
+#: ../ProjectController.py:1105
+msgid "C Build failed.\n"
+msgstr "Gradnja C programske kode neuspešna.\n"
+
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr "C programska koda"
+
+#: ../ProjectController.py:1186
+msgid "C code generated successfully.\n"
+msgstr "C programska koda uspešno ustvarjena.\n"
+
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr "Generiranje C programske kode ni uspelo.\n"
+
+#: ../targets/toolchain_gcc.py:199
+#, python-format
+msgid "C compilation of %s failed.\n"
+msgstr "Generiranje C programske kode %s ni uspelo.\n"
+
+#: ../features.py:33
+msgid "C extension"
+msgstr "C razširitev"
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr "Zasluge C&"
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr "CANOpen mreža"
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr "CANOpen podrejena naprava"
+
+#: ../features.py:31
+msgid "CANopen support"
+msgstr "CANopen podpora"
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
+msgid "Can only generate execution order on FBD networks!"
+msgstr "Lahko ustvarim vrstni red izvajanja le za FBD stavke!"
+
+#: ../controls/VariablePanel.py:291
+msgid "Can only give a location to local or global variables"
+msgstr "Lokacijo lahko določiš le lokalni ali globalni spremenljivki."
+
+#: ../PLCOpenEditor.py:318
+#, python-format
+msgid "Can't generate program to file %s!"
+msgstr "Ne morem ustvariti programa v datoteko %s!"
+
+#: ../controls/VariablePanel.py:289
+msgid "Can't give a location to a function block instance"
+msgstr "Ne morem dodeliti lokacije Primerku funkcijskega bloka"
+
+#: ../PLCOpenEditor.py:363
+#, python-format
+msgid "Can't save project to file %s!"
+msgstr "Ne morem shraniti projekt v datoteko %s!"
+
+#: ../controls/VariablePanel.py:339
+msgid "Can't set an initial value to a function block instance"
+msgstr "Ne morem dodeliti začetne vrednosti Primerku funkcijskega bloka"
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr "Ne morem ustvariti otroka {a1} tipa {a2} "
+
+#: ../ConfigTreeNode.py:454
+#, python-format
+msgid "Cannot find lower free IEC channel than %d\n"
+msgstr "Ne morem najti nižjega IEC kanala kot je %d\n"
+
+#: ../connectors/PYRO/__init__.py:139
+msgid "Cannot get PLC status - connection failed.\n"
+msgstr "Ne morem pridobiti status krmilnika - povezava prekinjena.\n"
+
+#: ../ProjectController.py:967
+msgid "Cannot open/parse VARIABLES.csv!\n"
+msgstr "Ne morem odpreti/razvozlati VARIABLES.csv!\n"
+
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+"Ne morem nastaviti bit offset za nebitno '{a1}' spremenljivko "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
+msgid "Case sensitive"
+msgstr "Razlikovanje velikih in malih črk"
+
+#: ../editors/Viewer.py:581
+msgid "Center"
+msgstr "Sredinsko"
+
+#: ../Beremiz_service.py:276
+msgid "Change IP of interface to bind"
+msgstr "Spremeni IP vmesnika za povezavo"
+
+#: ../Beremiz_service.py:275
+msgid "Change Name"
+msgstr "Spremeni ime"
+
+#: ../IDEFrame.py:1977
+msgid "Change POU Type To"
+msgstr "Spremeni tip POU v"
+
+#: ../Beremiz_service.py:277
+msgid "Change Port Number"
+msgstr "Spremeni številko vrat"
+
+#: ../Beremiz_service.py:278
+msgid "Change working directory"
+msgstr "Spremeni delovno mapo"
+
+#: ../plcopen/iec_std.csv:81
+msgid "Character string"
+msgstr "Niz znakov"
+
+#: ../svgui/svgui.py:136
+msgid "Choose a SVG file"
+msgstr "Izberi SVG datoteko"
+
+#: ../ProjectController.py:561
+msgid "Choose a directory to save project"
+msgstr "Izberi mapo za shranjevanje projekta"
+
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
+msgid "Choose a file"
+msgstr "Izberi datoteko"
+
+#: ../BeremizIDE.py:900
+msgid "Choose a project"
+msgstr "Izberi projekt"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
+msgid "Choose a value for %s:"
+msgstr "Izberi vrednost za %s:"
+
+#: ../Beremiz_service.py:333
+msgid "Choose a working directory "
+msgstr "Izberi delovno mapo"
+
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr "Izberi prazno mapo za nov projekt"
+
+#: ../ProjectController.py:468
+msgid "Chosen folder doesn't contain a program. It's not a valid project!"
+msgstr "Izbrana mapa ne vsebuje programa. Ni veljaven projekt!"
+
+#: ../ProjectController.py:435
+msgid "Chosen folder isn't empty. You can't use it for a new project!"
+msgstr "Mapa ni prazna. Ne morem uporabiti za nov projekt!"
+
+#: ../controls/VariablePanel.py:60
+msgid "Class"
+msgstr "Razred"
+
+#: ../controls/VariablePanel.py:472
+msgid "Class Filter:"
+msgstr "Filter Razreda:"
+
+#: ../dialogs/FBDVariableDialog.py:74
+msgid "Class:"
+msgstr "Razred:"
+
+#: ../ProjectController.py:1821
+msgid "Clean"
+msgstr "Počisti"
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr "Počisti dnevniška sporočila"
+
+#: ../ProjectController.py:1822
+msgid "Clean project build folder"
+msgstr "Počisti projektno mapo - gradnje"
+
+#: ../ProjectController.py:1332
+msgid "Cleaning the build directory\n"
+msgstr "Čistim projektno mapo - gradnje\n"
+
+#: ../IDEFrame.py:437
+msgid "Clear Errors"
+msgstr "Počisti napake"
+
+#: ../editors/Viewer.py:680
+msgid "Clear Execution Order"
+msgstr "Počisti vrstni red izvajanja"
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr "Zapri"
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
+msgid "Close Application"
+msgstr "Zapri program"
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
+msgid "Close Project"
+msgstr "Zapri projekt"
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
+msgid "Close Tab"
+msgstr "Zapri zavihek"
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
+msgid "Coil"
+msgstr "Tuljava"
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
+msgid "Comment"
+msgstr "Komentar"
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr "Podpora skupnosti"
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr "Ime podjetja"
+
+#: ../controls/ProjectPropertiesPanel.py:106
+msgid "Company Name (required):"
+msgstr "Ime podjetja (obvezno)"
+
+#: ../controls/ProjectPropertiesPanel.py:107
+msgid "Company URL (optional):"
+msgstr "Spletn stran podjetja (ni obvezno):"
+
+#: ../plcopen/iec_std.csv:75
+msgid "Comparison"
+msgstr "Primerjava"
+
+#: ../ProjectController.py:756
+msgid "Compiling IEC Program into C code...\n"
+msgstr "Prevajam IEC program v C programsko kodo...\n"
+
+#: ../plcopen/iec_std.csv:85
+msgid "Concatenation"
+msgstr "Združevanje"
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr "Konfiguracija"
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr "Konfiguracijske spremenljivke"
+
+#: ../dialogs/SearchInProjectDialog.py:43
+msgid "Configuration"
+msgstr "Konfiguracija"
+
+#: ../plcopen/types_enums.py:77
+msgid "Configurations"
+msgstr "Konfiguracije"
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr "Potrdi ali spremeni ime spremenljivke"
+
+#: ../ProjectController.py:1842
+msgid "Connect"
+msgstr "Poveži"
+
+#: ../ProjectController.py:1843
+msgid "Connect to the target PLC"
+msgstr "Poveži na krmilnik"
+
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr "Povezan na URI: %s"
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
+msgid "Connection"
+msgstr "Povezava"
+
+#: ../dialogs/ConnectionDialog.py:55
+msgid "Connection Properties"
+msgstr "Lastnosti povezave"
+
+#: ../ProjectController.py:1691
+msgid "Connection canceled!\n"
+msgstr "Povezava prekinjena!\n"
+
+#: ../ProjectController.py:1714
+#, python-format
+msgid "Connection failed to %s!\n"
+msgstr "Povezava do %s prekinjena!\n"
+
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr "Povezava prekinjena!\n"
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
+msgid "Connection to '%s' failed.\n"
+msgstr "Povezava na %s' ni bila uspešna.\n"
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
+msgid "Connector"
+msgstr "Konektor-vhod"
+
+#: ../dialogs/SFCStepDialog.py:68
+msgid "Connectors:"
+msgstr "Konektor-vhodi:"
+
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr "Konzola"
+
+#: ../controls/VariablePanel.py:75
+msgid "Constant"
+msgstr "Konstanta"
+
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
+msgid "Contact"
+msgstr "Kontakt"
+
+#: ../controls/ProjectPropertiesPanel.py:217
+msgid "Content Description (optional):"
+msgstr "Opis vsebine (ni obvezno):"
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
+msgid "Continuation"
+msgstr "Nadaljevanje"
+
+#: ../plcopen/iec_std.csv:18
+msgid "Conversion from BCD"
+msgstr "Pretvorba iz BCD"
+
+#: ../plcopen/iec_std.csv:19
+msgid "Conversion to BCD"
+msgstr "Pretvorba v BCD"
+
+#: ../plcopen/iec_std.csv:21
+msgid "Conversion to date"
+msgstr "Pretvorba v datum"
+
+#: ../plcopen/iec_std.csv:20
+msgid "Conversion to time-of-day"
+msgstr "Pretvorba v čas-dneva"
+
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
+msgid "Copy"
+msgstr "Kopiraj"
+
+#: ../IDEFrame.py:1964
+msgid "Copy POU"
+msgstr "Kopiraj POU"
+
+#: ../editors/FileManagementPanel.py:68
+msgid "Copy file from left folder to right"
+msgstr "Kopiraj datoteko iz leve mape v desno"
+
+#: ../editors/FileManagementPanel.py:67
+msgid "Copy file from right folder to left"
+msgstr "Kopiraj datoteko iz desne mape v levo"
+
+#: ../plcopen/iec_std.csv:28
+msgid "Cosine"
+msgstr "Kosinus"
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+"Ne morem dodati otroka  \"{a1}\", tip {a2} :\n"
+"{a3}\n"
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr "Ne morem uvoziti staro datoteko %s ."
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Ne morem naložiti confnode osnovne parametre {a1} :\n"
+" {a2}"
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Ne moreme naložiti confnode parametre {a1} :\n"
+" {a2}"
+
+#: ../PLCControler.py:552
+msgid "Couldn't paste non-POU object."
+msgstr "Prilepim lahko samo objekte tipa POU."
+
+#: ../ProjectController.py:1636
+msgid "Couldn't start PLC !\n"
+msgstr "Ne morem zagnati krmilnik !\n"
+
+#: ../ProjectController.py:1644
+msgid "Couldn't stop PLC !\n"
+msgstr "Ne morem ustaviti krmilnika !\n"
+
+#: ../svgui/svgui.py:57
+msgid "Create HMI"
+msgstr "Kreiraj HMI"
+
+#: ../dialogs/PouDialog.py:54
+msgid "Create a new POU"
+msgstr "Ustvari nov POU"
+
+#: ../dialogs/PouActionDialog.py:45
+msgid "Create a new action"
+msgstr "Ustvari novo Akcijo"
+
+#: ../IDEFrame.py:166
+msgid "Create a new action block"
+msgstr "Ustvari nov Akcijski blok"
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
+msgid "Create a new block"
+msgstr "Ustvari nov blok"
+
+#: ../IDEFrame.py:139
+msgid "Create a new branch"
+msgstr "Ustvari nov skok"
+
+#: ../IDEFrame.py:133
+msgid "Create a new coil"
+msgstr "Ustvari novo tuljavo"
+
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
+msgid "Create a new comment"
+msgstr "Ustvari nov komentar"
+
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
+msgid "Create a new connection"
+msgstr "Ustvari novo povezavo"
+
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
+msgid "Create a new contact"
+msgstr "Ustvari nov kontakt"
+
+#: ../IDEFrame.py:169
+msgid "Create a new divergence"
+msgstr "Ustvari novo Razhajališče"
+
+#: ../dialogs/SFCDivergenceDialog.py:54
+msgid "Create a new divergence or convergence"
+msgstr "Ustvari novo Razhajališče ali Stekališče"
+
+#: ../IDEFrame.py:157
+msgid "Create a new initial step"
+msgstr "Ustvari nov začetni korak"
+
+#: ../IDEFrame.py:172
+msgid "Create a new jump"
+msgstr "Ustvari nov skok"
+
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
+msgid "Create a new power rail"
+msgstr "Ustvari nov napajalni vodnik"
+
+#: ../IDEFrame.py:130
+msgid "Create a new rung"
+msgstr "Ustvari novo prečko"
+
+#: ../IDEFrame.py:160
+msgid "Create a new step"
+msgstr "Ustvari nov Korak"
+
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
+msgid "Create a new transition"
+msgstr "Ustvari nov prehod"
+
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
+msgid "Create a new variable"
+msgstr "Ustvari novo spremenljivko"
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr "Zasluge"
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr "Trenutna delovna mapa :"
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
+msgid "Cut"
+msgstr "Izreži"
+
+#: ../editors/ResourceEditor.py:81
+msgid "Cyclic"
+msgstr "Cikličen"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:60
+msgid "DEPRECATED"
+msgstr "OPUŠČENO"
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
+msgid "DS-301 Profile"
+msgstr "DS-301 Profile"
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
+msgid "DS-302 Profile"
+msgstr "DS-302 Profile"
+
+#: ../dialogs/SearchInProjectDialog.py:39
+msgid "Data Type"
+msgstr "Podatkovni tip"
+
+#: ../plcopen/types_enums.py:76
+msgid "Data Types"
+msgstr "Podatkovni tipi"
+
+#: ../plcopen/iec_std.csv:16
+msgid "Data type conversion"
+msgstr "Pretvorba podatkovnega tipa"
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
+msgid "Date addition"
+msgstr "Dodajanje datuma"
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
+msgid "Date and time subtraction"
+msgstr "Odštevanje Datum in ure"
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
+msgid "Date subtraction"
+msgstr "Odštevanje Datuma"
+
+#: ../dialogs/DurationEditorDialog.py:46
+msgid "Days:"
+msgstr "Dnevi:"
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr ""
+"Razhroščevalnik in krmilnik nimata enakega programa - Izvedi "
+"Ustavi/Prenos/Zaženi za ponovno omogočanje razhroščevalnika\n"
+
+#: ../controls/PouInstanceVariablesPanel.py:144
+msgid "Debug instance"
+msgstr "Razhroščevalnik Primerka"
+
+#: ../editors/Viewer.py:490
+#, python-format
+msgid "Debug: %s"
+msgstr "Razhroščevalnik: %s"
+
+#: ../ProjectController.py:1471
+#, python-format
+msgid "Debug: Unknown variable '%s'\n"
+msgstr "Razhroščevalnik: Neznana spremenljivka '%s'\n"
+
+#: ../ProjectController.py:1469
+#, python-format
+msgid "Debug: Unsupported type to debug '%s'\n"
+msgstr "Razhroščevalnik: Nepodprti podatkovni tip '%s'\n"
+
+#: ../IDEFrame.py:660
+msgid "Debugger"
+msgstr "Razhroščevalnik"
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr "Razhroščevalnik pripravljen\n"
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
+msgid "Delete"
+msgstr "Izbriši"
+
+#: ../editors/Viewer.py:610
+msgid "Delete Divergence Branch"
+msgstr "Izbriši Razhajališče"
+
+#: ../editors/FileManagementPanel.py:157
+msgid "Delete File"
+msgstr "Izbriši datoteko"
+
+#: ../editors/Viewer.py:597
+msgid "Delete Wire Segment"
+msgstr "Pobriši odsek žice"
+
+#: ../controls/CustomEditableListBox.py:44
+msgid "Delete item"
+msgstr "Izbriši element"
+
+#: ../plcopen/iec_std.csv:88
+msgid "Deletion (within)"
+msgstr "Izbriši (znotraj)"
+
+#: ../editors/DataTypeEditor.py:161
+msgid "Derivation Type:"
+msgstr "Izpeljani podatkovni tip:"
+
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr "Opis"
+
+#: ../controls/VariablePanel.py:463
+msgid "Description:"
+msgstr "Opis:"
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
+msgid "Dimensions:"
+msgstr "Dimenzije:"
+
+#: ../dialogs/FindInPouDialog.py:69
+msgid "Direction"
+msgstr "Smer"
+
+#: ../dialogs/BrowseLocationsDialog.py:102
+msgid "Direction:"
+msgstr "Smer:"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Directly"
+msgstr "Direkten"
+
+#: ../ProjectController.py:1855
+msgid "Disconnect"
+msgstr "Prekini"
+
+#: ../ProjectController.py:1856
+msgid "Disconnect from PLC"
+msgstr "Prekini povezavo do krmilnika"
+
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr "Prekinjen"
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
+msgid "Divergence"
+msgstr "Razhajališče"
+
+#: ../plcopen/iec_std.csv:36
+msgid "Division"
+msgstr "Deljenje"
+
+#: ../editors/FileManagementPanel.py:156
+#, python-format
+msgid "Do you really want to delete the file '%s'?"
+msgstr "Ali res želiš izbrisati datoteko '%s'?"
+
+#: ../controls/VariablePanel.py:65
+msgid "Documentation"
+msgstr "Dokumentacija"
+
+#: ../PLCOpenEditor.py:312
+msgid "Done"
+msgstr "Končano"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Duration"
+msgstr "Čas trajanja"
+
+#: ../canfestival/canfestival.py:174
+msgid "EDS files (*.eds)|*.eds|All files|*.*"
+msgstr "EDS datoteke (*.eds)|*.eds|Vse datoteke|*.*"
+
+#: ../editors/Viewer.py:668
+msgid "Edit Block"
+msgstr "Uredi Blok"
+
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr "Uredi vrednost Tuljave"
+
+#: ../dialogs/LDElementDialog.py:56
+msgid "Edit Contact Values"
+msgstr "Uredi vrednost Kontakta"
+
+#: ../dialogs/DurationEditorDialog.py:62
+msgid "Edit Duration"
+msgstr "Uredi čas trajanja"
+
+#: ../dialogs/SFCStepDialog.py:53
+msgid "Edit Step"
+msgstr "Uredi Korak"
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
+msgid "Edit a WxWidgets GUI with WXGlade"
+msgstr "Uredi WxWidgets GUI z WXGlade"
+
+#: ../dialogs/ActionBlockDialog.py:127
+msgid "Edit action block properties"
+msgstr "Uredi lastnosti Akcijskega bloka"
+
+#: ../dialogs/ArrayTypeDialog.py:47
+msgid "Edit array type properties"
+msgstr "Uredi lastnosti tipa tabele"
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
+msgid "Edit comment"
+msgstr "Uredi komentar"
+
+#: ../editors/FileManagementPanel.py:69
+msgid "Edit file"
+msgstr "Uredi datoteko"
+
+#: ../controls/CustomEditableListBox.py:42
+msgid "Edit item"
+msgstr "Uredi element"
+
+#: ../editors/Viewer.py:3059
+msgid "Edit jump target"
+msgstr "Nastavi Skok na kateri Korak"
+
+#: ../ProjectController.py:1873
+msgid "Edit raw IEC code added to code generated by PLCGenerator"
+msgstr "Urejanje čiste IEC programske kode je bilo dodano PLCGenerator-ju"
+
+#: ../editors/SFCViewer.py:815
+msgid "Edit step name"
+msgstr "Uredi ime koroka"
+
+#: ../dialogs/SFCTransitionDialog.py:53
+msgid "Edit transition"
+msgstr "Uredi ime prehoda"
+
+#: ../IDEFrame.py:632
+msgid "Editor ToolBar"
+msgstr "Urejevalnik orodne vrrstice"
+
+#: ../ProjectController.py:1294
+msgid "Editor selection"
+msgstr "Izbira urejevalnika"
+
+#: ../editors/DataTypeEditor.py:360
+msgid "Elements :"
+msgstr "Elementi :"
+
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr "Prazen"
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr "Prazna dimenzija ni dovoljena."
+
+#: ../Beremiz_service.py:341
+msgid "Enter a name "
+msgstr "Vstavi ime"
+
+#: ../Beremiz_service.py:326
+msgid "Enter a port number "
+msgstr "Vnesi števiko vrat"
+
+#: ../Beremiz_service.py:317
+msgid "Enter the IP of the interface to bind"
+msgstr "Vnesi IP vmesnika za povezavo"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Enumerated"
+msgstr "Naštevni"
+
+#: ../plcopen/iec_std.csv:77
+msgid "Equal to"
+msgstr "Enak"
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
+msgid "Error"
+msgstr "Napaka"
+
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+"Napaka: V krmilniku mora biti definirana vsaj ena Konfiguracija in Vir!\n"
+
+#: ../ProjectController.py:803
+#, python-format
+msgid "Error : IEC to C compiler returned %d\n"
+msgstr "Napaka: Prevajalnik IEC v C programsko kodo je vrnil napako %d\n"
+
+#: ../ProjectController.py:731
+#, python-format
+msgid ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+msgstr ""
+"Napaka v ST/IL/SFC ustvarjalniku programske kode :\n"
+"%s\n"
+
+#: ../ConfigTreeNode.py:219
+#, python-format
+msgid "Error while saving \"%s\"\n"
+msgstr "Napaka pri shranjevanju \"%s\"\n"
+
+#: ../canfestival/canfestival.py:179
+msgid "Error: Export slave failed\n"
+msgstr "Napaka: Izvoz podrejene naprave ni uspešen\n"
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:388
+msgid "Error: No Master generated\n"
+msgstr "Napaka: Ni bil ustvarjena nadrejena naprava\n"
+
+#: ../canfestival/canfestival.py:383
+msgid "Error: No PLC built\n"
+msgstr "Napaka: Program za krmilnik ni bil generiran\n"
+
+#: ../ProjectController.py:1708
+#, python-format
+msgid "Exception while connecting %s!\n"
+msgstr "Izjemna napaka pri povezovanju na %s!\n"
+
+#: ../dialogs/FBDBlockDialog.py:123
+msgid "Execution Control:"
+msgstr "Nadzor izvajanja:"
+
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
+msgid "Execution Order:"
+msgstr "Vrstni red izvajanja:"
+
+#: ../features.py:36
+msgid "Experimental web based HMI"
+msgstr "Preizkusni spletni HMI"
+
+#: ../plcopen/iec_std.csv:38
+msgid "Exponent"
+msgstr "Eksponent"
+
+#: ../plcopen/iec_std.csv:26
+msgid "Exponentiation"
+msgstr "Potenciranje"
+
+#: ../canfestival/canfestival.py:186
+msgid "Export CanOpen slave to EDS file"
+msgstr "Izvoz CanOpen podrejene naprave v EDS datoteko"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
+msgid "Export graph values to clipboard"
+msgstr "Izvozi vrednosti grafa v Odlagališče"
+
+#: ../canfestival/canfestival.py:185
+msgid "Export slave"
+msgstr "Izvozi podrejeno napravo"
+
+#: ../dialogs/FBDVariableDialog.py:94
+msgid "Expression:"
+msgstr "Logičen izraz:"
+
+#: ../controls/VariablePanel.py:90
+msgid "External"
+msgstr "Zunanji"
+
+#: ../ProjectController.py:826
+msgid "Extracting Located Variables...\n"
+msgstr "Povzemam locirane spremenjljivke...\n"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "FBD"
+msgstr "FBD"
+
+#: ../ProjectController.py:1773
+msgid "Failed : Must build before transfer.\n"
+msgstr "Nauspešno: Potrebno zfraditi programsko kodo pred prenosom.\n"
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
+msgid "Falling Edge"
+msgstr "Negativna fronta"
+
+#: ../ProjectController.py:1098
+msgid "Fatal : cannot get builder.\n"
+msgstr "Usodna napaka: ne morem najti programa za izgradnjo.\n"
+
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr "Prejemam %s"
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
+msgid "Field %s hasn't a valid value!"
+msgstr "Polje %s nima veljavne vrednosti!"
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
+msgid "Fields %s haven't a valid value!"
+msgstr "Polja %s nimajo veljavne vrednosti!"
+
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr "Datoteka '%s' že obstaja!"
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
+msgid "Find"
+msgstr "Išči"
+
+#: ../IDEFrame.py:379
+msgid "Find Next"
+msgstr "Išči naslednjega"
+
+#: ../IDEFrame.py:381
+msgid "Find Previous"
+msgstr "Išči prejšnjega"
+
+#: ../plcopen/iec_std.csv:90
+msgid "Find position"
+msgstr "Išči pozicijo"
+
+#: ../dialogs/FindInPouDialog.py:58
+msgid "Find:"
+msgstr "Išči:"
+
+#: ../editors/Viewer.py:1633
+msgid "Force value"
+msgstr "Vsili vrednost"
+
+#: ../dialogs/ForceVariableDialog.py:176
+msgid "Forcing Variable Value"
+msgstr "Vsili vrednost spremenljivke"
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
+#, python-format
+msgid "Form isn't complete. %s must be filled!"
+msgstr "Obrazec ni dokončan! . %s mora biti vpisano!"
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
+msgid "Form isn't complete. Name must be filled!"
+msgstr "Obrazec ni dokončan! Ime mora biti vpisano!"
+
+#: ../dialogs/FBDBlockDialog.py:235
+msgid "Form isn't complete. Valid block type must be selected!"
+msgstr "Obrazec ni dokončan! Izbran mora biti veljaven Tip bloka!"
+
+#: ../dialogs/FindInPouDialog.py:75
+msgid "Forward"
+msgstr "Naprej"
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
+msgid "Function"
+msgstr "Funkcija"
+
+#: ../IDEFrame.py:354
+msgid "Function &Block"
+msgstr "Funkcijski &Blok"
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
+msgid "Function Block"
+msgstr "Funkcijski blok"
+
+#: ../controls/VariablePanel.py:868
+msgid "Function Block Types"
+msgstr "Tipi funkcijskih blokov"
+
+#: ../plcopen/types_enums.py:75
+msgid "Function Blocks"
+msgstr "Funkcijski bloki"
+
+#: ../editors/Viewer.py:290
+msgid "Function Blocks can't be used in Functions!"
+msgstr "Funkcijski blok ne more biti uporabljen v funkcijah"
+
+#: ../PLCControler.py:1907
+#, python-format
+msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+msgstr "Funkcijski blok \"%s\" ne more biti prilepljen v Funkcijo!!!"
+
+#: ../plcopen/types_enums.py:75
+msgid "Functions"
+msgstr "Funkcije"
+
+#: ../PLCOpenEditor.py:88
+msgid "Generate Program"
+msgstr "Ustvari Program"
+
+#: ../ProjectController.py:722
+msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+msgstr "Generiram SoftPLC IEC-61131 ST/IL/SFC programsko kodo...\n"
+
+#: ../controls/VariablePanel.py:91
+msgid "Global"
+msgstr "Globalen"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
+msgid "Go to current value"
+msgstr "Pojdi na trenutno vrednost"
+
+#: ../controls/ProjectPropertiesPanel.py:189
+msgid "Graphics"
+msgstr "Grafika"
+
+#: ../plcopen/iec_std.csv:75
+msgid "Greater than"
+msgstr "Večji kot"
+
+#: ../plcopen/iec_std.csv:76
+msgid "Greater than or equal to"
+msgstr "Večji kot ali enak"
+
+#: ../controls/ProjectPropertiesPanel.py:149
+msgid "Grid Resolution:"
+msgstr "Resolucija mreže:"
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr "HTTP  vmesnik - številka vrat :"
+
+#: ../controls/ProjectPropertiesPanel.py:135
+msgid "Height:"
+msgstr "Višina:"
+
+#: ../editors/FileManagementPanel.py:89
+msgid "Home Directory:"
+msgstr "Domači direktorij:"
+
+#: ../controls/ProjectPropertiesPanel.py:165
+msgid "Horizontal:"
+msgstr "Horizontalno:"
+
+#: ../dialogs/DurationEditorDialog.py:47
+msgid "Hours:"
+msgstr "Ure:"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "IL"
+msgstr "IL"
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr "IP"
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
+msgid "IP is not valid!"
+msgstr "IP naslov ni veljaven!"
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
+msgid "Import SVG"
+msgstr "Uvoz SVG"
+
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
+msgid "InOut"
+msgstr "Vhod-Izhod"
+
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr "Neaktiven"
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr "Podatkovna tipa \"{a1}\" in \"{a2}\" sta med seboj nezdružljiva"
+
+#: ../controls/VariablePanel.py:306
+#, python-format
+msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+msgstr "Neprimerljiva velikost podatkov med  \"%s\" and \"BOOL\""
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr "Neprimerljiva velikost podatkov med \"{a1}\" in \"{a2}\""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Indicator"
+msgstr "Indikator"
+
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr "Začetni"
+
+#: ../editors/Viewer.py:650
+msgid "Initial Step"
+msgstr "Začetni korak"
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
+msgid "Initial Value"
+msgstr "Začetna vrednost"
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
+msgid "Initial Value:"
+msgstr "Začetna vrednost:"
+
+#: ../svgui/svgui.py:56
+msgid "Inkscape"
+msgstr "Inkscape"
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
+msgid "Inline"
+msgstr "Vstavljen"
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Input"
+msgstr "Vhod"
+
+#: ../dialogs/FBDBlockDialog.py:99
+msgid "Inputs:"
+msgstr "Vhodi:"
+
+#: ../plcopen/iec_std.csv:87
+msgid "Insertion (into)"
+msgstr "Vstavljanje ( v ) "
+
+#: ../plcopen/plcopen.py:1948
+#, python-format
+msgid "Instance with id %d doesn't exist!"
+msgstr "Primerek z oznako %d ne obstaja!"
+
+#: ../editors/ResourceEditor.py:279
+msgid "Instances:"
+msgstr "Primerki:"
+
+#: ../controls/VariablePanel.py:88
+msgid "Interface"
+msgstr "Vmesnik"
+
+#: ../editors/ResourceEditor.py:81
+msgid "Interrupt"
+msgstr "Prekinitev"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Interval"
+msgstr "Interval"
+
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+
+#: ../PLCControler.py:1895
+msgid "Invalid plcopen element(s)!!!"
+msgstr "Neveljavni plcopen element(-i)!!!"
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr "Neveljavni Tip \"{a1}\"-> {a2} != {a3} za lokacijo \"{a4}\""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr "Neveljavni Tip \"{a1}\"-> {a2} != {a3} za lokacijo \"{a4}\""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
+#, python-format
+msgid "Invalid value \"%s\" for debug variable"
+msgstr "Neveljavna vrednost \"%s\" za razhroščevalno spremenljivko"
+
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
+msgid "Invalid value \"%s\" for variable grid element"
+msgstr "Neveljavna vrednost \"%s\" za element liste spremenljivk"
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
+#, python-format
+msgid "Invalid value \"%s\" for viewer block"
+msgstr "Neveljavna vrednost \"%s\" za pogled bloka"
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr "Neveljavna vrednost \"{a1}\" za spremenljivko \"{a2}\" !"
+
+#: ../dialogs/DurationEditorDialog.py:124
+msgid ""
+"Invalid value!\n"
+"You must fill a numeric value."
+msgstr ""
+"Neveljavna vrednost!\n"
+"Vnesti moraš numerično vrednost."
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr ""
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
+msgid "Jump"
+msgstr "Skok"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "LD"
+msgstr "LD"
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
+#, python-format
+msgid "Ladder element with id %d is on more than one rung."
+msgstr "Lestvični element z oznako %d je uporabljen več kot v eni prečki."
+
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
+msgid "Language"
+msgstr "Jezik"
+
+#: ../controls/ProjectPropertiesPanel.py:206
+msgid "Language (optional):"
+msgstr "Jezik (ni obvezno):"
+
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
+msgid "Language:"
+msgstr "Jezik:"
+
+#: ../ProjectController.py:1779
+msgid "Latest build already matches current target. Transfering anyway...\n"
+msgstr ""
+"Zadnji gradnja projekta že ustreza izbranemu krmilniku. Izvajam ponovno "
+"prenašanje...\n"
+
+#: ../Beremiz_service.py:281
+msgid "Launch WX GUI inspector"
+msgstr "Odpri WX GUI nadzor izvajanja"
+
+#: ../Beremiz_service.py:280
+msgid "Launch a live Python shell"
+msgstr "Odpri Python lupino"
+
+#: ../editors/Viewer.py:580
+msgid "Left"
+msgstr "Levo"
+
+#: ../dialogs/LDPowerRailDialog.py:64
+msgid "Left PowerRail"
+msgstr "Levi napajalni vodnik"
+
+#: ../plcopen/iec_std.csv:81
+msgid "Length of string"
+msgstr "Dolžina niza"
+
+#: ../plcopen/iec_std.csv:78
+msgid "Less than"
+msgstr "Manj kot"
+
+#: ../plcopen/iec_std.csv:79
+msgid "Less than or equal to"
+msgstr "Manj kot ali enak"
+
+#: ../IDEFrame.py:652
+msgid "Library"
+msgstr "Knjižnica"
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr "Licenca"
+
+#: ../plcopen/iec_std.csv:73
+msgid "Limitation"
+msgstr "Omejitve"
+
+#: ../targets/toolchain_gcc.py:209
+msgid "Linking :\n"
+msgstr "Povezovanje :\n"
+
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
+msgid "Local"
+msgstr "Lokalni"
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr "Lokalni vpisi"
+
+#: ../ProjectController.py:1685
+msgid "Local service discovery failed!\n"
+msgstr "Pregled lokalnih storitev ni uspelo!\n"
+
+#: ../controls/VariablePanel.py:62
+msgid "Location"
+msgstr "Lokacija"
+
+#: ../dialogs/BrowseLocationsDialog.py:79
+msgid "Locations available:"
+msgstr "Razpoložljive lokacije:"
+
+#: ../plcopen/iec_std.csv:25
+msgid "Logarithm to base 10"
+msgstr "Logaritem osnova 10"
+
+#: ../connectors/PYRO/__init__.py:102
+#, python-format
+msgid "MDNS resolution failure for '%s'\n"
+msgstr "Napaka MDNS razpoznave za '%s'\n"
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
+msgid "Map Variable"
+msgstr "Preslikava spremenljivke"
+
+#: ../features.py:31
+msgid "Map located variables over CANopen"
+msgstr "Preslikaj najdeno spremenljivko na CANopen"
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:113
+msgid "Master"
+msgstr "Nadrejena naprava"
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr "Maksimalno število ({a1}) doseženo za confnode tipa {a2} "
+
+#: ../plcopen/iec_std.csv:71
+msgid "Maximum"
+msgstr "Maksimum"
+
+#: ../editors/DataTypeEditor.py:246
+msgid "Maximum:"
+msgstr "Maksimum"
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Memory"
+msgstr "Spomin"
+
+#: ../IDEFrame.py:617
+msgid "Menu ToolBar"
+msgstr "Meni orodna vrstica"
+
+#: ../dialogs/DurationEditorDialog.py:51
+msgid "Microseconds:"
+msgstr "Mikrosekunde:"
+
+#: ../editors/Viewer.py:585
+msgid "Middle"
+msgstr "Sredina"
+
+#: ../dialogs/DurationEditorDialog.py:50
+msgid "Milliseconds:"
+msgstr "Milisekunde:"
+
+#: ../plcopen/iec_std.csv:72
+msgid "Minimum"
+msgstr "Minimum"
+
+#: ../editors/DataTypeEditor.py:233
+msgid "Minimum:"
+msgstr "Minimum:"
+
+#: ../dialogs/DurationEditorDialog.py:48
+msgid "Minutes:"
+msgstr "Minute:"
+
+#: ../controls/ProjectPropertiesPanel.py:231
+msgid "Miscellaneous"
+msgstr "Razno"
+
+#: ../features.py:32
+msgid "Modbus support"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:65
+msgid "Modifier:"
+msgstr "Modifikator:"
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+"Najden več kot en Konektor-vhod, ki ustreza \"{a1}\"  Konektor-izhodu v "
+"\"{a2}\" POU"
+
+#: ../dialogs/ActionBlockDialog.py:146
+msgid "Move action down"
+msgstr "Premakni Akcijo navzdol"
+
+#: ../dialogs/ActionBlockDialog.py:145
+msgid "Move action up"
+msgstr "Premakni Akcijo navzgor"
+
+#: ../controls/CustomEditableListBox.py:46
+msgid "Move down"
+msgstr "Premakni navzdol"
+
+#: ../editors/DataTypeEditor.py:367
+msgid "Move element down"
+msgstr "Premakni element navzdol"
+
+#: ../editors/DataTypeEditor.py:366
+msgid "Move element up"
+msgstr "Premakni element navzgor"
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr "Premakni Primerek navzdol"
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr "Premakni Primerek navzgor"
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr "Premakni Opravilo navzdol"
+
+#: ../editors/ResourceEditor.py:254
+msgid "Move task up"
+msgstr "Premakni Opravilo navzgor"
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
+msgid "Move the view"
+msgstr "Premakni pogled"
+
+#: ../controls/CustomEditableListBox.py:45
+msgid "Move up"
+msgstr "Premakni navzgor"
+
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
+msgid "Move variable down"
+msgstr "Premakni spremenljivko navzdol"
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
+msgid "Move variable up"
+msgstr "Premakni spremenljivko navzgor"
+
+#: ../plcopen/iec_std.csv:74
+msgid "Multiplexer (select 1 of N)"
+msgstr "Multiplekser (izbira 1 od N)"
+
+#: ../plcopen/iec_std.csv:34
+msgid "Multiplication"
+msgstr "Množenje"
+
+#: ../editors/FileManagementPanel.py:87
+msgid "My Computer:"
+msgstr "Moj računalnik:"
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr "NAME"
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
+#: ../controls/VariablePanel.py:59
+msgid "Name"
+msgstr "Ime"
+
+#: ../Beremiz_service.py:342
+msgid "Name must not be null!"
+msgstr "Ime ne sme biti prazno!"
+
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
+msgid "Name:"
+msgstr "Ime:"
+
+#: ../plcopen/iec_std.csv:24
+msgid "Natural logarithm"
+msgstr "Naravni logaritem"
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
+msgid "Negated"
+msgstr "Negiran"
+
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr "Storitev Nevow Web ni uspešna. "
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr "Uvoz Nevow/Athena ni uspešen :"
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
+msgid "New"
+msgstr "Nov"
+
+#: ../controls/CustomEditableListBox.py:43
+msgid "New item"
+msgstr "Nov element"
+
+#: ../editors/Viewer.py:553
+msgid "No Modifier"
+msgstr "Ni modifikator"
+
+#: ../ProjectController.py:1808
+msgid "No PLC to transfer (did build succeed ?)\n"
+msgstr "Ni programa za prenos na krmilnik (je bila gradnja projekta uspešna?)\n"
+
+#: ../PLCGenerator.py:1678
+#, python-format
+msgid "No body defined in \"%s\" POU"
+msgstr "Ni definirana vsebina POU \"%s\""
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr ""
+"Ni bil najden Konektor-vhod, ki ustreza  \"{a1}\" Konektor-izhodu \"{a2}\" "
+"POU"
+
+#: ../PLCOpenEditor.py:331
+msgid ""
+"No documentation available.\n"
+"Coming soon."
+msgstr ""
+"Dokumentacija ni na voljo.\n"
+"Pride kmalu."
+
+#: ../PLCGenerator.py:841
+#, python-format
+msgid "No informations found for \"%s\" block"
+msgstr "Ni informacij za \"%s\" blok"
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+"Nisem našel izhodne  spremenljivke {a1} v bloku {a2} znotraj POU {a3}. "
+"Povezava mora biti prekinjena"
+
+#: ../controls/SearchResultPanel.py:175
+msgid "No search results available."
+msgstr "Ni rezultata iskanja."
+
+#: ../svgui/svgui.py:142
+#, python-format
+msgid "No such SVG file: %s\n"
+msgstr "Ni take SVG datoteke: %s\n"
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr "Ni take kombinacije index/subindex ({a1},{a2}) (spremenljivka {a3})"
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr ""
+"Ni takege kombinacije index/subindex ({a1},{a2}) in ID : {a3} (spremenljivka"
+" {a4})"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+msgid "No valid value selected!"
+msgstr "Izbrana napačna vrednost!"
+
+#: ../PLCGenerator.py:1676
+#, python-format
+msgid "No variable defined in \"%s\" POU"
+msgstr "Ni definiranih spremenljivk v POU \"%s\""
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr "Ne obstaja element z oznako : {a1} (spremenljivka {a2})"
+
+#: ../controls/VariablePanel.py:79
+msgid "Non-Retain"
+msgstr "Ne-obdrži v spominu"
+
+#: ../dialogs/LDElementDialog.py:78
+msgid "Normal"
+msgstr "Normal"
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+"Ni PDO preslikana spremnenljivka : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+
+#: ../plcopen/iec_std.csv:80
+msgid "Not equal to"
+msgstr "Ni enako "
+
+#: ../dialogs/SFCDivergenceDialog.py:91
+msgid "Number of sequences:"
+msgstr "Število sekvenc:"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Numerical"
+msgstr "Numeričen"
+
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr "Na spremembo"
+
+#: ../dialogs/SearchInProjectDialog.py:88
+msgid "Only Elements"
+msgstr "Samo Elementi"
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
+msgid "Open"
+msgstr "Odpri"
+
+#: ../svgui/svgui.py:151
+msgid "Open Inkscape"
+msgstr "Odpri Inkscape"
+
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+"Odprtokodno ogrodje za avtomatizacijo, povzeto po standardu  IEC 61131 z "
+"nepretrgano rastjo razširitev na prilagodljivo izvajalno kodo za krmilnike."
+
+#: ../ProjectController.py:1879
+msgid "Open a file explorer to manage project files"
+msgstr "Odpri Urejevalnik datotek za upravljanje z projektnimi datotekami"
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
+msgid "Open wxGlade"
+msgstr "Odpri wxGlade"
+
+#: ../controls/VariablePanel.py:64
+msgid "Option"
+msgstr "Nastavitev"
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
+msgid "Options"
+msgstr "Nastavitve"
+
+#: ../controls/ProjectPropertiesPanel.py:109
+msgid "Organization (optional):"
+msgstr "Organizacija (ni obvezno):"
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
+msgid "Other Profile"
+msgstr "Drugi Profil"
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Output"
+msgstr "Izhod"
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
+msgid "PDO Receive"
+msgstr "PDO Sprejem"
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
+msgid "PDO Transmit"
+msgstr "PDO oddaja"
+
+#: ../targets/toolchain_gcc.py:174
+msgid "PLC :\n"
+msgstr "Krmilnik :\n"
+
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr "Dnevnik krmilnika"
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr "Ustvarjanje kode krmilnika neuspešno !\n"
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr "Krmilnik je prazen ali že deluje."
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr "Krmilnik ni zagnan."
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+"Krmilniška sintaktična napaka v vrstici {a1}:\n"
+"{a2}"
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
+msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
+msgstr "PLCOpen datoteke (*.xml)|*.xml|Vse datoteke|*.*"
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
+msgid "PLCOpenEditor"
+msgstr "PLCOpenEditor"
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+"PLCOpenEditor je del Beremiz projekta.\n"
+"\n"
+"Beremiz je "
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr "VRATA"
+
+#: ../dialogs/PouDialog.py:109
+msgid "POU Name"
+msgstr "Ime POU"
+
+#: ../dialogs/PouDialog.py:66
+msgid "POU Name:"
+msgstr "Ime POU:"
+
+#: ../dialogs/PouDialog.py:111
+msgid "POU Type"
+msgstr "Tip POU"
+
+#: ../dialogs/PouDialog.py:73
+msgid "POU Type:"
+msgstr "Tip POU:"
+
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr "PYRO povezuje na URI : %s\n"
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr "PYRO uporablja certifikate v  '%s' \n"
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
+msgid "Page Setup"
+msgstr "Nastavitev strani"
+
+#: ../controls/ProjectPropertiesPanel.py:124
+msgid "Page Size (optional):"
+msgstr "Velikost strani (ni obvezno):"
+
+#: ../IDEFrame.py:2640
+#, python-format
+msgid "Page: %d"
+msgstr "Stran: %d"
+
+#: ../controls/PouInstanceVariablesPanel.py:134
+msgid "Parent instance"
+msgstr "Starš Primerka"
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
+msgid "Paste"
+msgstr "Prilepi"
+
+#: ../IDEFrame.py:1899
+msgid "Paste POU"
+msgstr "Prilepi POU"
+
+#: ../dialogs/SearchInProjectDialog.py:60
+msgid "Pattern to search:"
+msgstr "Vzorec za iskanje:"
+
+#: ../dialogs/LDPowerRailDialog.py:75
+msgid "Pin number:"
+msgstr "Številka prečke:"
+
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
+msgid "Please choose a target"
+msgstr "Prosim izberi ciljni krmilnik"
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr "Prosim vnesi ime bloka"
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
+msgid "Please enter comment text"
+msgstr "Prosim vnesi komentar"
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
+msgid "Please enter step name"
+msgstr "Prosim vnesi ime koraka"
+
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr "Prosim vnesi besedilo"
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
+msgid "Please enter value for a \"%s\" variable:"
+msgstr "Prosim vnesi vrednost za spremenljivko \"%s\" :"
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be 0 <= port <= 65535!"
+msgstr "Številka vrat mora biti med 0 <= številka vrat <= 65535!"
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be an integer!"
+msgstr "Številka vrat mora biti celoštevilčna!"
+
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
+msgid "Power Rail"
+msgstr "Napajalni vodnik"
+
+#: ../dialogs/LDPowerRailDialog.py:52
+msgid "Power Rail Properties"
+msgstr "Lastnosti napajalnega vodnika"
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
+msgid "Preview"
+msgstr "Predogled"
+
+#: ../dialogs/BlockPreviewDialog.py:59
+msgid "Preview:"
+msgstr "Predogled:"
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
+msgid "Print"
+msgstr "Natisni"
+
+#: ../IDEFrame.py:1110
+msgid "Print preview"
+msgstr "Predogled tiskanja"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Priority"
+msgstr "Prioriteta"
+
+#: ../dialogs/SFCTransitionDialog.py:91
+msgid "Priority:"
+msgstr "Prioriteta:"
+
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr "Napaka pri zagonu krmilnika: %d"
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr "Ime Produkta"
+
+#: ../controls/ProjectPropertiesPanel.py:90
+msgid "Product Name (required):"
+msgstr "Ime Produkta (obvezno)"
+
+#: ../controls/ProjectPropertiesPanel.py:92
+msgid "Product Release (optional):"
+msgstr "Izdaja Produkta (ni obvezno):"
+
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr "Verzija Produkta"
+
+#: ../controls/ProjectPropertiesPanel.py:91
+msgid "Product Version (required):"
+msgstr "Verzija produkta (obvezno)"
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
+msgid "Program"
+msgstr "Program"
+
+#: ../PLCOpenEditor.py:321
+msgid "Program was successfully generated!"
+msgstr "Program je bil uspešno ustvarjen!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Programs"
+msgstr "Programi"
+
+#: ../editors/Viewer.py:285
+msgid "Programs can't be used by other POUs!"
+msgstr "Programi ne morejo biti uporabljeni v drugih POU!"
+
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
+msgid "Project"
+msgstr "Projekt"
+
+#: ../controls/SearchResultPanel.py:180
+#, python-format
+msgid "Project '%s':"
+msgstr "Projekt '%s':"
+
+#: ../ProjectController.py:1878
+msgid "Project Files"
+msgstr "Projektne datoteke"
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr "Ime projekta"
+
+#: ../controls/ProjectPropertiesPanel.py:88
+msgid "Project Name (required):"
+msgstr "Ime projekta (obvezno):"
+
+#: ../controls/ProjectPropertiesPanel.py:89
+msgid "Project Version (optional):"
+msgstr "Verzija projekta (ni obvezno):"
+
+#: ../PLCControler.py:2717
+msgid ""
+"Project file syntax error:\n"
+"\n"
+msgstr ""
+"Sintaktična napaka v imenu Projektne datoteke:\n"
+"\n"
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
+msgid "Project properties"
+msgstr "Lastnosti Projekta"
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr "Drevesna struktura Projekta ne ustreza confnode.xml {a1}!={a2} "
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr "Razmnoži ime"
+
+#: ../plcopen/types_enums.py:77
+msgid "Properties"
+msgstr "Lastnosti"
+
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr "Objava storitve na lokalnem omrežju"
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr "Pyro izjema: %s\n"
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr "Pyro številka vrat :"
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr "Python programska koda"
+
+#: ../features.py:34
+msgid "Python file"
+msgstr "Python datoteka"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Qualifier"
+msgstr "Kvalifikator"
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
+msgid "Quit"
+msgstr "Izhod"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
+msgid "Range:"
+msgstr "Obseg:"
+
+#: ../ProjectController.py:1872
+msgid "Raw IEC code"
+msgstr "IEC programska koda"
+
+#: ../BeremizIDE.py:1083
+#, python-format
+msgid "Really delete node '%s'?"
+msgstr "Ali želiš izbrisati element '%s'?"
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
+msgid "Redo"
+msgstr "Ponovi"
+
+#: ../dialogs/SFCTransitionDialog.py:76
+msgid "Reference"
+msgstr "Reference"
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
+msgid "Refresh"
+msgstr "Osveži"
+
+#: ../dialogs/SearchInProjectDialog.py:70
+msgid "Regular expression"
+msgstr "Regularni izraz"
+
+#: ../dialogs/FindInPouDialog.py:99
+msgid "Regular expressions"
+msgstr "Regularni izrazi"
+
+#: ../editors/Viewer.py:1636
+msgid "Release value"
+msgstr "Prenehaj vsiljevati vrednost"
+
+#: ../plcopen/iec_std.csv:37
+msgid "Remainder (modulo)"
+msgstr "Ostanek (modulo)"
+
+#: ../BeremizIDE.py:1084
+#, python-format
+msgid "Remove %s node"
+msgstr "Odstrani element %s"
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr "Odstrani Podatkovni tip"
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr "Odstrani POU"
+
+#: ../dialogs/ActionBlockDialog.py:144
+msgid "Remove action"
+msgstr "Odstrani Akcijo"
+
+#: ../editors/DataTypeEditor.py:365
+msgid "Remove element"
+msgstr "Odstrani element"
+
+#: ../editors/FileManagementPanel.py:66
+msgid "Remove file from left folder"
+msgstr "Odstrani datoteko iz leve mape"
+
+#: ../editors/ResourceEditor.py:284
+msgid "Remove instance"
+msgstr "Odstrani Primerek"
+
+#: ../canfestival/NetworkEditor.py:111
+msgid "Remove slave"
+msgstr "Odstrani podrejeno napravo"
+
+#: ../editors/ResourceEditor.py:253
+msgid "Remove task"
+msgstr "Odstrani Opravilo"
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
+msgid "Remove variable"
+msgstr "Odstrani spremenljivko"
+
+#: ../IDEFrame.py:1979
+msgid "Rename"
+msgstr "Preimenuj"
+
+#: ../editors/FileManagementPanel.py:187
+msgid "Replace File"
+msgstr "Zamenjaj datoteko"
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr "Zamenjaj žico z Konektorjema."
+
+#: ../plcopen/iec_std.csv:89
+msgid "Replacement (within)"
+msgstr "Zamenjaj (znotraj)"
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Reset"
+msgstr "Nastavi na 0"
+
+#: ../editors/Viewer.py:681
+msgid "Reset Execution Order"
+msgstr "Ponastavi vrstni red izvajanja"
+
+#: ../IDEFrame.py:453
+msgid "Reset Perspective"
+msgstr "Ponastavi pogled"
+
+#: ../controls/SearchResultPanel.py:103
+msgid "Reset search result"
+msgstr "Počisti rezultate iskanja"
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
+msgid "Resources"
+msgstr "Viri"
+
+#: ../controls/VariablePanel.py:77
+msgid "Retain"
+msgstr "Obdrži v spominu"
+
+#: ../controls/VariablePanel.py:455
+msgid "Return Type:"
+msgstr "Tip rezultata:"
+
+#: ../editors/Viewer.py:582
+msgid "Right"
+msgstr "Desno"
+
+#: ../dialogs/LDPowerRailDialog.py:65
+msgid "Right PowerRail"
+msgstr "Desni napajalni vodnik"
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
+msgid "Rising Edge"
+msgstr "Pozitivna fronta"
+
+#: ../plcopen/iec_std.csv:65
+msgid "Rotate left"
+msgstr "Rotiraj na levo"
+
+#: ../plcopen/iec_std.csv:64
+msgid "Rotate right"
+msgstr "Rotiraj na desno"
+
+#: ../plcopen/iec_std.csv:17
+msgid "Rounding up/down"
+msgstr "Zaokroževanje navzgor/navzdol"
+
+#: ../ProjectController.py:1828
+msgid "Run"
+msgstr "Delovanje"
+
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr "Neuspešno generiranje C programske kode za I/O knjižnice!\n"
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr "Neuspešno generiranje C programske kode za izvajalne knjižnice!\n"
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
+msgid "SDO Client"
+msgstr "SDO Odjemalec"
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
+msgid "SDO Server"
+msgstr "SDO Strežnik"
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "SFC"
+msgstr "SFC"
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr "SFC skok v POU \"{a1}\" se sklicuje na neobstoječi SFC skok \"{a2}\""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr "SFC prehod v POU \"%s\" mora biti povezan."
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "ST"
+msgstr "ST"
+
+#: ../PLCOpenEditor.py:308
+msgid "ST files (*.st)|*.st|All files|*.*"
+msgstr "ST datoteke (*.st)|*.st|Vse datoteke|*.*"
+
+#: ../svgui/svgui.py:136
+msgid "SVG files (*.svg)|*.svg|All files|*.*"
+msgstr "SVG datoteke (*.svg)|*.svg|Vse datoteke|*.*"
+
+#: ../features.py:36
+msgid "SVGUI"
+msgstr "SVGUI"
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
+msgid "Save"
+msgstr "Shrani"
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
+msgid "Save As..."
+msgstr "Shrani kot..."
+
+#: ../BeremizIDE.py:249
+msgid "Save as"
+msgstr "Shrani kot"
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr "Pot za shranjevanje je enaka kot pot za shranjevanje projekta!! \n"
+
+#: ../dialogs/SearchInProjectDialog.py:73
+msgid "Scope"
+msgstr "Obseg iskanja"
+
+#: ../IDEFrame.py:644
+msgid "Search"
+msgstr "Išči"
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
+msgid "Search in Project"
+msgstr "Išči v projektu"
+
+#: ../dialogs/DurationEditorDialog.py:49
+msgid "Seconds:"
+msgstr "Sekunde:"
+
+#: ../IDEFrame.py:390
+msgid "Select All"
+msgstr "Izberi vse"
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
+msgid "Select a variable class:"
+msgstr "Izberi Razred spremenljivke"
+
+#: ../ProjectController.py:1293
+msgid "Select an editor:"
+msgstr "Izberi urejevalnik:"
+
+#: ../controls/PouInstanceVariablesPanel.py:292
+msgid "Select an instance"
+msgstr "Izberi Primerek"
+
+#: ../IDEFrame.py:628
+msgid "Select an object"
+msgstr "Izberi Objekt"
+
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr "Izbrana mapa že vsebuje drugi Projekt. Prepišem? \n"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Selection"
+msgstr "Izbira"
+
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr "Izbira Stekališče"
+
+#: ../dialogs/SFCDivergenceDialog.py:65
+msgid "Selection Divergence"
+msgstr "Izbira Razhajališče"
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr "Pregled storitev na voljo:"
+
+#: ../dialogs/DiscoveryDialog.py:104
+msgid "Services available:"
+msgstr "Storitve na voljo:"
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Set"
+msgstr "Nastavi na 1"
+
+#: ../plcopen/iec_std.csv:62
+msgid "Shift left"
+msgstr "Pomakni v levo"
+
+#: ../plcopen/iec_std.csv:63
+msgid "Shift right"
+msgstr "Pomakni v desno"
+
+#: ../ProjectController.py:1863
+msgid "Show IEC code generated by PLCGenerator"
+msgstr "Prikaži IEC kodo, ki jo je ustvaril PLCGenerator"
+
+#: ../canfestival/canfestival.py:407
+msgid "Show Master"
+msgstr "Prikaži nadrejeno napravo"
+
+#: ../canfestival/canfestival.py:408
+msgid "Show Master generated by config_utils"
+msgstr "Prikaži nadrejeno napravo, izdelano z config_utils"
+
+#: ../ProjectController.py:1862
+msgid "Show code"
+msgstr "Prikaži programsko kodo"
+
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr "Simultano Steklališče"
+
+#: ../dialogs/SFCDivergenceDialog.py:67
+msgid "Simultaneous Divergence"
+msgstr "Simultano Razhajališče"
+
+#: ../plcopen/iec_std.csv:27
+msgid "Sine"
+msgstr "Sinus"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Single"
+msgstr "Posamičen"
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr "Izvorna koda se ni spremenila, ne bo nove gradnje projekta.\n"
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+"Izvorni signal mora biti definiran za eno Opravilo '{a1}' v Konfiguraciji "
+"'{a2}.{a3}'."
+
+#: ../plcopen/iec_std.csv:23
+msgid "Square root (base 2)"
+msgstr "Kvadratni koren (base 2)"
+
+#: ../plcopen/definitions.py:50
+msgid "Standard function blocks"
+msgstr "Standardni funkcijski bloki"
+
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
+msgid "Start PLC"
+msgstr "Zaženi krmilnik"
+
+#: ../ProjectController.py:1074
+#, python-format
+msgid "Start build in %s\n"
+msgstr "Začni izvajati gradnjo projekta v %s\n"
+
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr "Zagnan"
+
+#: ../ProjectController.py:1633
+msgid "Starting PLC\n"
+msgstr "Krmilnik se zaganja\n"
+
+#: ../BeremizIDE.py:393
+msgid "Status ToolBar"
+msgstr "Statusna vrstica"
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
+msgid "Step"
+msgstr "Korak"
+
+#: ../ProjectController.py:1835
+msgid "Stop"
+msgstr "Ustavi"
+
+#: ../Beremiz_service.py:272
+msgid "Stop PLC"
+msgstr "Ustavi krmilnik"
+
+#: ../ProjectController.py:1836
+msgid "Stop Running PLC"
+msgstr "Ustavi delujoč krmilnik"
+
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr "Ustavljen"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Structure"
+msgstr "Struktura"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Subrange"
+msgstr "Intervalni"
+
+#: ../plcopen/iec_std.csv:35
+msgid "Subtraction"
+msgstr "Odštevanje"
+
+#: ../ProjectController.py:1113
+msgid "Successfully built.\n"
+msgstr "Uspešno izgrajeno.\n"
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr "Zamenjaj pogled"
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
+msgid "Syntax error in regular expression of pattern to search!"
+msgstr "Sintaktična napaka v izrazu vzorca za iskanje!"
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr "TYPE"
+
+#: ../plcopen/iec_std.csv:29
+msgid "Tangent"
+msgstr "Tangens"
+
+#: ../editors/ResourceEditor.py:97
+msgid "Task"
+msgstr "Opravilo"
+
+#: ../editors/ResourceEditor.py:248
+msgid "Tasks:"
+msgstr "Opravila:"
+
+#: ../controls/VariablePanel.py:91
+msgid "Temp"
+msgstr "Začasno"
+
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+"Vsa vprašanja o Beremiz/PLCOpenEditor projektu lahko postavite\n"
+"v projektni poštni seznam: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"To je glavni podporni kanal skupnosti.\n"
+"Potrebna je prijava na poštni seznam pred objavo vprašanja.\n"
+"\n"
+"Naročilo na poštni seznam skleneš na naslovu:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+
+#: ../editors/FileManagementPanel.py:186
+#, python-format
+msgid ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+msgstr ""
+"Datoteka '%s' že obstaja.\n"
+"Ali jo želiš zamenjati?"
+
+#: ../editors/LDViewer.py:893
+msgid "The group of block must be coherent!"
+msgstr "Skupina blokov mora biti skladna!"
+
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
+msgid "There are changes, do you want to save?"
+msgstr "Narejene so bile spremembe, želiš shraniti?"
+
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+"POU z imenom \"%s\" že obstaja. To lahko povzroči težave. Ali želiš "
+"nadaljevati?"
+
+#: ../IDEFrame.py:1133
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr "Težava z tiskanjem. Mogoče vaš tiskalnik ni nastavljen pravilno?"
+
+#: ../editors/LDViewer.py:902
+msgid "This option isn't available yet!"
+msgstr "Ta opcija še ni na voljo!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr "Tik-tak: %d"
+
+#: ../plcopen/iec_std.csv:40
+msgid "Time"
+msgstr "Ura"
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
+msgid "Time addition"
+msgstr "Dodajanje ure"
+
+#: ../plcopen/iec_std.csv:86
+msgid "Time concatenation"
+msgstr "Ura združevanje"
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
+msgid "Time division"
+msgstr "Ura deljenje"
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
+msgid "Time multiplication"
+msgstr "Ura množenje"
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
+msgid "Time subtraction"
+msgstr "Odštevanje časa"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
+msgid "Time-of-day addition"
+msgstr "Dodajanje današnje ure"
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
+msgid "Time-of-day subtraction"
+msgstr "Odštevanje dejanskega časa"
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr "Spremeni vrednost"
+
+#: ../editors/Viewer.py:584
+msgid "Top"
+msgstr "Zgoraj"
+
+#: ../ProjectController.py:1848
+msgid "Transfer"
+msgstr "Prenesi"
+
+#: ../ProjectController.py:1849
+msgid "Transfer PLC"
+msgstr "Prenesi na krmilnik"
+
+#: ../ProjectController.py:1802
+msgid "Transfer completed successfully.\n"
+msgstr "Uspešno zaključen prenos.\n"
+
+#: ../ProjectController.py:1805
+msgid "Transfer failed\n"
+msgstr "Prenos ni uspešen\n"
+
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
+msgid "Transition"
+msgstr "Prehod"
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+"Telo Prehoda \"%s\" mora vsebovati izhodno spremenljivko ali Tuljavo, "
+"referencirano po njenem imenu"
+
+#: ../dialogs/PouTransitionDialog.py:91
+msgid "Transition Name"
+msgstr "Ime prehoda"
+
+#: ../dialogs/PouTransitionDialog.py:60
+msgid "Transition Name:"
+msgstr "Ime prehoda:"
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr "Prehod z vsebino \"{a1}\" ni povezan z naslednjim Korakom v POU \"{a2}\""
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr "Prehod z vsebino \"{a1}\" ni povezan z prejšnjim Korakom v POU \"{a2}\""
+
+#: ../plcopen/plcopen.py:1526
+#, python-format
+msgid "Transition with name %s doesn't exist!"
+msgstr "Prehod z imenom %s ne obstaja!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Transitions"
+msgstr "Prehodi"
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr "Prevedel"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Triggering"
+msgstr "Proženje"
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr "Twisted programski paket ni na voljo."
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
+msgid "Type"
+msgstr "Tip"
+
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr "Enak tip in izpeljanke"
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
+#, python-format
+msgid "Type conflict for location \"%s\""
+msgstr "Neustrezen Tip za lokacijo \"%s\""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Type conversion"
+msgstr "Sprememba podatkovnega tipa"
+
+#: ../editors/DataTypeEditor.py:170
+msgid "Type infos:"
+msgstr "Detajlne informacije o podatkovnem tipu:"
+
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr "Enak Tip"
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
+msgid "Type:"
+msgstr "Tip:"
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
+#, python-format
+msgid "Unable to define PDO mapping for node %02x"
+msgstr "Nisem uspel ustvariti PDO preslikave za elemnent %02x"
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
+msgid "Unable to get Xenomai's %s \n"
+msgstr "Nisem uspel dobiti Xenomai's %s \n"
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr "Nedefiniran tip bloka \"{a1}\" v POU \"{a2}\""
+
+#: ../PLCGenerator.py:261
+#, python-format
+msgid "Undefined pou type \"%s\""
+msgstr "Nedefiniran tip POU \"%s\""
+
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
+msgid "Undo"
+msgstr "Razveljavi"
+
+#: ../ProjectController.py:442
+msgid "Unknown"
+msgstr "Neznano"
+
+#: ../editors/Viewer.py:437
+#, python-format
+msgid "Unknown variable \"%s\" for this POU!"
+msgstr "Neznana spremenljivka \"%s\" za ta POU!"
+
+#: ../ProjectController.py:439 ../ProjectController.py:440
+msgid "Unnamed"
+msgstr "Neimenovan"
+
+#: ../PLCControler.py:263
+#, python-format
+msgid "Unnamed%d"
+msgstr "Neimenovan%d"
+
+#: ../controls/VariablePanel.py:308
+#, python-format
+msgid "Unrecognized data size \"%s\""
+msgstr "Nerazpoznavna velikost podatkovnega tipa \"%s\""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
+msgid "User Data Types"
+msgstr "Uporabniški Podatkovni tipi"
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
+msgid "User Type"
+msgstr "Uporabniški podatkovni tip"
+
+#: ../plcopen/types_enums.py:75
+msgid "User-defined POUs"
+msgstr "Uporabniški POU-ji"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Value"
+msgstr "Vrednost"
+
+#: ../editors/DataTypeEditor.py:267
+msgid "Values:"
+msgstr "Vrednosti:"
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
+msgid "Variable"
+msgstr "Spremenljivka"
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr "Spusti spremenljivko"
+
+#: ../dialogs/FBDVariableDialog.py:68
+msgid "Variable Properties"
+msgstr "Lastnosti spremenljivke"
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
+msgid "Variable class"
+msgstr "Spremenljivka Razreda"
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
+msgid "Variable don't belong to this POU!"
+msgstr "Spremenljivka ne pripadata temu POU!"
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr "Spremenljivka:"
+
+#: ../controls/VariablePanel.py:90
+msgid "Variables"
+msgstr "Spremenljivke"
+
+#: ../controls/ProjectPropertiesPanel.py:166
+msgid "Vertical:"
+msgstr "Vertikalno:"
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr ""
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr ""
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr ""
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr ""
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr "WAMP podrejena naprava - napaka v zagonu. "
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr ""
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr "WAMP povezuje na URL : %s\n"
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr "WAMP potekel čas za vzpostavitev"
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr "WAMP povezava na '%s' ni bila uspešna.\n"
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr "WAMP uvoz - napaka :"
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr ""
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
+msgid "WXGLADE GUI"
+msgstr "WXGLADE GUI"
+
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
+msgid "Warning"
+msgstr "Opozorila"
+
+#: ../ProjectController.py:726
+msgid "Warnings in ST/IL/SFC code generator :\n"
+msgstr "Opozorila v ST/IL/SFC ustvarjalniku programske kode :\n"
+
+#: ../dialogs/SearchInProjectDialog.py:82
+msgid "Whole Project"
+msgstr "Celoten projekt"
+
+#: ../controls/ProjectPropertiesPanel.py:134
+msgid "Width:"
+msgstr "Širina:"
+
+#: ../dialogs/FindInPouDialog.py:94
+msgid "Wrap search"
+msgstr "Iskanje po celotnem dokumentu"
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr "Napisal"
+
+#: ../features.py:35
+msgid "WxGlade GUI"
+msgstr "WxGlade GUI"
+
+#: ../svgui/svgui.py:150
+msgid ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+msgstr ""
+"Nimaš dovoljenja za pisanje.\n"
+"Vseeno odprem Inkscape ?"
+
+#: ../wxglade_hmi/wxglade_hmi.py:160
+msgid ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+msgstr ""
+"Nimaš dovoljenja za pisanje.\n"
+"Vseeno odprem wxGlade ?"
+
+#: ../ProjectController.py:390
+msgid ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+msgstr ""
+"Potrebuješ pravice dostopa za delo na Projektu\n"
+"Nadaljuj delo na kopiji Projekta ?"
+
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr "Moraš izbrati blok ali skupino blokov, kjer želiš dodati Skok!"
+
+#: ../editors/LDViewer.py:677
+msgid "You must select the wire where a contact should be added!"
+msgstr "Moraš izbrati Žico, na katero želiš dodati Kontakt!"
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
+msgid "You must type a name!"
+msgstr "Prosim vnesi ime!"
+
+#: ../dialogs/ForceVariableDialog.py:209
+msgid "You must type a value!"
+msgstr "Prosim vnesi vrednost!"
+
+#: ../IDEFrame.py:440
+msgid "Zoom"
+msgstr "Povečaj"
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr "dnevi"
+
+#: ../PLCOpenEditor.py:317
+#, python-format
+msgid "error: %s\n"
+msgstr "napaka: %s\n"
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr "končal z statusom {a1} (pid {a2})\n"
+
+#: ../dialogs/PouDialog.py:36
+msgid "function"
+msgstr "funkcija"
+
+#: ../dialogs/PouDialog.py:36
+msgid "functionBlock"
+msgstr "Funkcijski blok"
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr "ure"
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr "Inštalacija matiec ni najdena\n"
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr "milisekunde"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr "minute"
+
+#: ../dialogs/PouDialog.py:36
+msgid "program"
+msgstr "program"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr "sekunde"
+
+#: ../plcopen/iec_std.csv:84
+msgid "string from the middle"
+msgstr "Niz iz sredine niza "
+
+#: ../plcopen/iec_std.csv:82
+msgid "string left of"
+msgstr "Leva stran niza od"
+
+#: ../plcopen/iec_std.csv:83
+msgid "string right of"
+msgstr "Desna stran niza od"
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr "ni posodobljenih informacij."
+
+#: ../PLCOpenEditor.py:315
+#, python-format
+msgid "warning: %s\n"
+msgstr "opozorilo: %s\n"
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr "{a1} \"{a2}\" ne more biti prilepljeno kot {a3}."
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+"{a1} XML datoteka ni zgrajena po XSD shemi v vrstici {a2}:\n"
+"{a3}"
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr "CanFestivalSlaveNode"
+
+msgid "CAN_Device"
+msgstr "CAN_Device"
+
+msgid "CAN_Baudrate"
+msgstr "CAN_Baudrate"
+
+msgid "NodeId"
+msgstr "NodeId"
+
+msgid "Sync_Align"
+msgstr "Sync_Align"
+
+msgid "Sync_Align_Ratio"
+msgstr "Sync_Align_Ratio"
+
+msgid "CanFestivalNode"
+msgstr "CanFestivalNode"
+
+msgid "Sync_TPDOs"
+msgstr "Sync_TPDOs"
+
+msgid "CanFestivalInstance"
+msgstr "CanFestival Primerek"
+
+msgid "CAN_Driver"
+msgstr "CAN_Driver"
+
+msgid "Generic"
+msgstr "Splošen"
+
+msgid "Command"
+msgstr "Ukaz"
+
+msgid "Xenomai"
+msgstr "Xenomai"
+
+msgid "XenoConfig"
+msgstr "XenoConfig"
+
+msgid "Compiler"
+msgstr "Prevajalnik"
+
+msgid "CFLAGS"
+msgstr "CFLAGS"
+
+msgid "Linker"
+msgstr "Povezovalnik"
+
+msgid "LDFLAGS"
+msgstr "LDFLAGS"
+
+msgid "Linux"
+msgstr "Linux"
+
+msgid "Win32"
+msgstr "Win32"
+
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr ""
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
+msgid "BaseParams"
+msgstr "BaseParams"
+
+msgid "IEC_Channel"
+msgstr "IEC_Channel"
+
+msgid "Enabled"
+msgstr "Omogočen"
+
+msgid "BeremizRoot"
+msgstr "BeremizRoot"
+
+msgid "TargetType"
+msgstr "TargetType"
+
+msgid "Libraries"
+msgstr "Knjižnice"
+
+msgid "URI_location"
+msgstr "URI_location"
+
+msgid "Disable_Extensions"
+msgstr "Disable_Extensions"
+
+msgid "%(codefile_name)s"
+msgstr "%(codefile_name)s"
+
+msgid "variables"
+msgstr "spremenljivke"
+
+msgid "variable"
+msgstr "spremenljivka"
+
+msgid "name"
+msgstr "ime"
+
+msgid "type"
+msgstr "type"
+
+msgid "class"
+msgstr "Razred"
+
+msgid "initial"
+msgstr "začetna"
+
+msgid "desc"
+msgstr "opis"
+
+msgid "onchange"
+msgstr "onchange"
+
+msgid "opts"
+msgstr "opts"
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr "0 - trenutni čas, 1 - naložen iz PDT"
+
+msgid "Preset datetime"
+msgstr "Trenutni datetime"
+
+msgid "Copy of IN"
+msgstr "Copy of IN"
+
+msgid "Datetime, current or relative to PDT"
+msgstr "Datetime, trenuten ali relativen trenutnemu DT"
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+"Ura realnega časa se uporablja na več načinov, kot označevanje z časovno "
+"značko, nastavljanje datuma in časa v poročilih, alarmna sporočila, itd."
+
+msgid "1 = integrate, 0 = hold"
+msgstr "1 = integriraj, 0 = ustavi"
+
+msgid "Overriding reset"
+msgstr "Blokira ponastavitev"
+
+msgid "Input variable"
+msgstr "Vhodna spremenljivka"
+
+msgid "Initial value"
+msgstr "Začetna vrednost"
+
+msgid "Sampling period"
+msgstr "Perioda vzorčenja"
+
+msgid "NOT R1"
+msgstr "Integrator deluje"
+
+msgid "Integrated output"
+msgstr "Integracijski izhod"
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr "Integracijska funkcija integrira vrednost vhoda XIN skozi čas."
+
+msgid "0 = reset"
+msgstr "0 = ponastavi"
+
+msgid "Input to be differentiated"
+msgstr "Vhod v diferencialno funkcijo"
+
+msgid "Differentiated output"
+msgstr "Diferenciran izhod"
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+"Diferencialna funkcija generira izhod XOUT proporcionalno časovni spremembi "
+"vrednosti vhoda XIN."
+
+msgid "0 - manual , 1 - automatic"
+msgstr "0 - ročni , 1 - avtomatski"
+
+msgid "Process variable"
+msgstr "Procesna spremenljivka"
+
+msgid "Set point"
+msgstr "Nastavitvena točka"
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr "Ročna nastavitev izhoda"
+
+msgid "Proportionality constant"
+msgstr "Proporcionalno ojačenje "
+
+msgid "Reset time"
+msgstr "Ponastavi čas"
+
+msgid "Derivative time constant"
+msgstr "Diferencialna časovna konstanta"
+
+msgid "PV - SP"
+msgstr "PV - SP"
+
+msgid "FB for integral term"
+msgstr "Funkcijski bloki za integral"
+
+msgid "FB for derivative term"
+msgstr "Funkcijski bloki za diferencial"
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+"Funkcijski blok PID (proportional, Integral, Derivative) ponuja standardno 3"
+" parametersko izvedbo regulatorja za zaprtozančne procese."
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr "0 - sledi X0, 1 - rampa do X1 in nato sledenje X1"
+
+msgid "Ramp duration"
+msgstr "Trajanje rampe"
+
+msgid "BUSY = 1 during ramping period"
+msgstr "BUSY = 1 med trajanjem časa rampe"
+
+msgid "Elapsed time of ramp"
+msgstr "Čas delovanja rampe"
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr ""
+"Funkcija RAMP generira rampo na izhod XOUT-REAL glede na vhodni parameter RUN\n"
+"RUN=0 - Izhod sledi vhodu X0. \n"
+"RUN=1 - Izhod gre po rampi do X1 v času TR, v  tem času je BUSY=1. Ko izhod doseže X1 ostane na tej vrednosti, BUSY gre na 0."
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+"Funkcijski blok Histereza aktivira binarni izhod,  ko je vhod XIN1(REAL) "
+"večji kot XIN2+EPS, in deaktivira binarni izhod, ko je vhod manjši od "
+"XIN2-EPS."
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr "Bistabilno vezje SR, kjer ima SET prioriteto."
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr "Bistabilno vezje RS, kjer ima RESET prioriteto."
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+"Funkcijski blok Semafor omogoča izvedbo mehanizma, kjer je dovoljen dostop "
+"do posameznega vira samo enemu programskemu elementu naenkrat."
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr "Izhod je aktiven za en cikel, ko detektira pozitivno fronto vhoda."
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr "Izhod je aktiven za en cikel, ko detektira negativno fronto vhoda."
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+"CTU - Števec navzgor šteje vsako pozitivno fronto CU in jo prepiše na izhod "
+"CV-INT. Ko pride doseže željeno vrednosti PV-INT, aktivira izhod Q dokler se"
+" ne ponastavi števec z vhodom R=1."
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+"CTD - Števec navzdol šteje vsako pozitivno fronto CD in jo prepiše na izhod "
+"CV-INT. Ko CV doseže vrednost 0, aktivira izhod Q dokler se ne ponastavi "
+"števec z vhodom LD=1, ki ponastavi vrednost števca na vrednost vhoda PV."
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+"CTUD - Števec navzgor in navzdol lahko sočasno šteje navzgor-CU ali navzdol "
+"- CD. Začetna vrednost CV se nastavi z R=1 ->CV:=0; ali LD=1 ->CV:=PV. Izhod"
+" QU je aktiven ko je CV>=PV. Izhod QD je aktiven ko je CV<=0."
+
+msgid "first input parameter"
+msgstr "prvi vhodni parameter"
+
+msgid "second input parameter"
+msgstr "drugi vhodni parameter"
+
+msgid "first output parameter"
+msgstr "prvi izhodni parameter"
+
+msgid "second output parameter"
+msgstr "drugi izhodni parameter"
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr "notranja stanja: 0-reset, 1-šteje, 2-set"
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+"Pulzni časovnik se lahko uporabi za ustvarjanje izhodnih pulzov določene "
+"časovne dolžine."
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+"Časovnik zakasnjenega vklopa se uporablja  za zakasnjeno aktiviranje izhoda,"
+" ko je vhod aktiven aktiven vsaj toliko časa kot je nastavitvena vrednost."
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
+"Časovnik zakasnjenega izklopa se uporablja za zakasnjeno deaktiviranje  "
+"izhoda, ko je izhod aktiven aktiven še za nastavitveno vrednost časa po "
+"deaktiviranem vhodu."
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/Beremiz_tr_TR.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4027 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Beremiz package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Ibrahim KILICARSLAN <ibrahimhalilkilicarslan@outlook.com>, 2018\n"
+"Language-Team: Turkish (Turkey) (https://www.transifex.com/beremiz/teams/75746/tr_TR/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: tr_TR\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
+msgid ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+msgstr ""
+"\n"
+"Beklenmeyen özel bir durum(hata) oluştu. Hata raporu kaydedildi:\n"
+"(%s)\n"
+"Bu raporu bize göndererek düzeltmemize yardımcı olun.\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"Çalışmaya devam etmek için programı yeniden başlatmanız gerekmektedir.\n"
+"\n"
+"Döndürülen hata:\n"
+
+#: ../controls/VariablePanel.py:90
+msgid "   External"
+msgstr "Harici"
+
+#: ../controls/VariablePanel.py:89
+msgid "   InOut"
+msgstr "Giriş-Çıkış"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Input"
+msgstr "Giriş"
+
+#: ../controls/VariablePanel.py:90
+msgid "   Local"
+msgstr "Yerel"
+
+#: ../controls/VariablePanel.py:89
+msgid "   Output"
+msgstr "Çıkış"
+
+#: ../controls/VariablePanel.py:91
+msgid "   Temp"
+msgstr "Geçici"
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
+#, python-format
+msgid " and %s"
+msgstr "ve %s"
+
+#: ../ProjectController.py:1182
+msgid " generation failed !\n"
+msgstr "Derleme başarısız oldu !\n"
+
+#: ../plcopen/plcopen.py:1029
+#, python-format
+msgid "\"%s\" Data Type doesn't exist !!!"
+msgstr "\"%s\" Veri türü mevcut değil !!!"
+
+#: ../plcopen/plcopen.py:1047
+#, python-format
+msgid "\"%s\" POU already exists !!!"
+msgstr "\"%s\" isminde bir program zaten var !!!"
+
+#: ../plcopen/plcopen.py:1068
+#, python-format
+msgid "\"%s\" POU doesn't exist !!!"
+msgstr "\"%s\" isminde bir program bulunamadı !!!"
+
+#: ../editors/Viewer.py:288
+#, python-format
+msgid "\"%s\" can't use itself!"
+msgstr "\"%s\" kullanamazsın!"
+
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
+#, python-format
+msgid "\"%s\" config already exists!"
+msgstr "\"%s\" adında bir konfigürasyon zaten mevcut!"
+
+#: ../plcopen/plcopen.py:531
+#, python-format
+msgid "\"%s\" configuration already exists !!!"
+msgstr "\"%s\" adında bir konfigürasyon zaten mevcut !!!"
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr "\"%s\" adında bir konfigürasyon bulunamadı !!!"
+
+#: ../IDEFrame.py:1638
+#, python-format
+msgid "\"%s\" data type already exists!"
+msgstr "\"%s\" adında veri türü zaten mevcut!"
+
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
+#, python-format
+msgid "\"%s\" element for this pou already exists!"
+msgstr "\"%s\"  öğe bu program için zaten kullanılmış!"
+
+#: ../BeremizIDE.py:928
+#, python-format
+msgid "\"%s\" folder is not a valid Beremiz project\n"
+msgstr "\"%s\" bu klasör geçerli bir Beremiz projesi değil\n"
+
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
+#, python-format
+msgid "\"%s\" is a keyword. It can't be used!"
+msgstr "\"%s\" bu bir anahtar kelimedir. Kullanamazsınız!"
+
+#: ../plcopen/plcopen.py:2836
+#, python-format
+msgid "\"%s\" is an invalid value!"
+msgstr ""
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
+msgid "\"%s\" is not a valid folder!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
+#, python-format
+msgid "\"%s\" is not a valid identifier!"
+msgstr ""
+
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr ""
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
+#, python-format
+msgid "\"%s\" pou already exists!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:62
+#, python-format
+msgid "\"%s\" step already exists!"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:566
+#, python-format
+msgid "\"%s\" value already defined!"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
+#, python-format
+msgid "\"%s\" value isn't a valid array dimension!"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
+#, python-format
+msgid ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+msgstr ""
+
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr ""
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr ""
+
+#: ../PLCControler.py:1114
+#, python-format
+msgid "%s Data Types"
+msgstr ""
+
+#: ../PLCControler.py:1097
+#, python-format
+msgid "%s POUs"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
+#, python-format
+msgid "%s Profile"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
+#, python-format
+msgid "%s body don't have instances!"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
+#, python-format
+msgid "%s body don't have text!"
+msgstr ""
+
+#: ../IDEFrame.py:388
+msgid "&Add Element"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr ""
+
+#: ../IDEFrame.py:361
+msgid "&Configuration"
+msgstr ""
+
+#: ../IDEFrame.py:350
+msgid "&Data Type"
+msgstr ""
+
+#: ../IDEFrame.py:392
+msgid "&Delete"
+msgstr ""
+
+#: ../IDEFrame.py:342
+msgid "&Display"
+msgstr ""
+
+#: ../IDEFrame.py:341
+msgid "&Edit"
+msgstr ""
+
+#: ../IDEFrame.py:340
+msgid "&File"
+msgstr ""
+
+#: ../IDEFrame.py:352
+msgid "&Function"
+msgstr ""
+
+#: ../IDEFrame.py:343
+msgid "&Help"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr ""
+
+#: ../IDEFrame.py:356
+msgid "&Program"
+msgstr ""
+
+#: ../PLCOpenEditor.py:98
+msgid "&Properties"
+msgstr ""
+
+#: ../BeremizIDE.py:244
+msgid "&Recent Projects"
+msgstr ""
+
+#: ../IDEFrame.py:358
+msgid "&Resource"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:298
+#, python-format
+msgid "(%d matches)"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
+#, python-format
+msgid ", %s"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr ""
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr ""
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr ""
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr ""
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
+#, python-format
+msgid "A POU named \"%s\" already exists!"
+msgstr ""
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:229
+msgid "A location must be selected!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
+#, python-format
+msgid "A variable with \"%s\" as name already exists in this pou!"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr ""
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
+msgid "About"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:22
+msgid "Absolute number"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
+msgid "Action"
+msgstr ""
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
+msgid "Action Block"
+msgstr ""
+
+#: ../dialogs/PouActionDialog.py:89
+msgid "Action Name"
+msgstr ""
+
+#: ../dialogs/PouActionDialog.py:56
+msgid "Action Name:"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1567
+#, python-format
+msgid "Action with name %s doesn't exist!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Actions"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:139
+msgid "Actions:"
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
+msgid "Add"
+msgstr ""
+
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
+msgid "Add Action"
+msgstr ""
+
+#: ../features.py:33
+msgid "Add C code accessing located variables synchronously"
+msgstr ""
+
+#: ../IDEFrame.py:1907
+msgid "Add Configuration"
+msgstr ""
+
+#: ../IDEFrame.py:1887
+msgid "Add DataType"
+msgstr ""
+
+#: ../editors/Viewer.py:609
+msgid "Add Divergence Branch"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:121
+msgid "Add IP"
+msgstr ""
+
+#: ../IDEFrame.py:1895
+msgid "Add POU"
+msgstr ""
+
+#: ../features.py:34
+msgid "Add Python code executed asynchronously"
+msgstr ""
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
+msgid "Add Resource"
+msgstr ""
+
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
+msgid "Add Transition"
+msgstr ""
+
+#: ../editors/Viewer.py:596
+msgid "Add Wire Segment"
+msgstr ""
+
+#: ../editors/SFCViewer.py:447
+msgid "Add a new initial step"
+msgstr ""
+
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
+msgid "Add a new jump"
+msgstr ""
+
+#: ../editors/SFCViewer.py:469
+msgid "Add a new step"
+msgstr ""
+
+#: ../features.py:35
+msgid "Add a simple WxGlade based GUI."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:143
+msgid "Add action"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:364
+msgid "Add element"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:283
+msgid "Add instance"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:110
+msgid "Add slave"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:252
+msgid "Add task"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
+msgid "Add variable"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:33
+msgid "Addition"
+msgstr ""
+
+#: ../plcopen/definitions.py:51
+msgid "Additional function blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr ""
+
+#: ../editors/Viewer.py:1720
+msgid "Alignment"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
+msgid "All"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:37
+msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+msgstr ""
+
+#: ../ProjectController.py:1670
+msgid "Already connected. Please disconnect\n"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:607
+#, python-format
+msgid "An element named \"%s\" already exists in this structure!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:31
+msgid "Arc cosine"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:30
+msgid "Arc sine"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:32
+msgid "Arc tangent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:33
+msgid "Arithmetic"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
+msgid "Array"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:39
+msgid "Assignment"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:226
+msgid "At least a variable or an expression must be selected!"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:111
+msgid "Author"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:108
+msgid "Author Name (optional):"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:80
+msgid "Backward"
+msgstr ""
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
+#, python-format
+msgid "Bad location size : %s"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
+msgid "Base Type:"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
+msgid "Base Types"
+msgstr ""
+
+#: ../BeremizIDE.py:483
+msgid "Beremiz"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:70
+msgid "Binary selection (1 of 2)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Bit-shift"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise AND"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:67
+msgid "Bitwise OR"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:68
+msgid "Bitwise XOR"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:69
+msgid "Bitwise inverting"
+msgstr ""
+
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
+msgid "Block"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:63
+msgid "Block Properties"
+msgstr ""
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr ""
+
+#: ../editors/Viewer.py:586
+msgid "Bottom"
+msgstr ""
+
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
+msgid "Browse %s values library"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:72
+msgid "Browse Locations"
+msgstr ""
+
+#: ../ProjectController.py:1815
+msgid "Build"
+msgstr ""
+
+#: ../ProjectController.py:1335
+msgid "Build directory already clean\n"
+msgstr ""
+
+#: ../ProjectController.py:1816
+msgid "Build project into build folder"
+msgstr ""
+
+#: ../ProjectController.py:1108
+msgid "C Build crashed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1105
+msgid "C Build failed.\n"
+msgstr ""
+
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr ""
+
+#: ../ProjectController.py:1186
+msgid "C code generated successfully.\n"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:199
+#, python-format
+msgid "C compilation of %s failed.\n"
+msgstr ""
+
+#: ../features.py:33
+msgid "C extension"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr ""
+
+#: ../features.py:31
+msgid "CANopen support"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
+msgid "Can only generate execution order on FBD networks!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:291
+msgid "Can only give a location to local or global variables"
+msgstr ""
+
+#: ../PLCOpenEditor.py:318
+#, python-format
+msgid "Can't generate program to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:289
+msgid "Can't give a location to a function block instance"
+msgstr ""
+
+#: ../PLCOpenEditor.py:363
+#, python-format
+msgid "Can't save project to file %s!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:339
+msgid "Can't set an initial value to a function block instance"
+msgstr ""
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr ""
+
+#: ../ConfigTreeNode.py:454
+#, python-format
+msgid "Cannot find lower free IEC channel than %d\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:139
+msgid "Cannot get PLC status - connection failed.\n"
+msgstr ""
+
+#: ../ProjectController.py:967
+msgid "Cannot open/parse VARIABLES.csv!\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
+msgid "Case sensitive"
+msgstr ""
+
+#: ../editors/Viewer.py:581
+msgid "Center"
+msgstr ""
+
+#: ../Beremiz_service.py:276
+msgid "Change IP of interface to bind"
+msgstr ""
+
+#: ../Beremiz_service.py:275
+msgid "Change Name"
+msgstr ""
+
+#: ../IDEFrame.py:1977
+msgid "Change POU Type To"
+msgstr ""
+
+#: ../Beremiz_service.py:277
+msgid "Change Port Number"
+msgstr ""
+
+#: ../Beremiz_service.py:278
+msgid "Change working directory"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Character string"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "Choose a SVG file"
+msgstr ""
+
+#: ../ProjectController.py:561
+msgid "Choose a directory to save project"
+msgstr ""
+
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
+msgid "Choose a file"
+msgstr ""
+
+#: ../BeremizIDE.py:900
+msgid "Choose a project"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
+msgid "Choose a value for %s:"
+msgstr ""
+
+#: ../Beremiz_service.py:333
+msgid "Choose a working directory "
+msgstr ""
+
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr ""
+
+#: ../ProjectController.py:468
+msgid "Chosen folder doesn't contain a program. It's not a valid project!"
+msgstr ""
+
+#: ../ProjectController.py:435
+msgid "Chosen folder isn't empty. You can't use it for a new project!"
+msgstr ""
+
+#: ../controls/VariablePanel.py:60
+msgid "Class"
+msgstr ""
+
+#: ../controls/VariablePanel.py:472
+msgid "Class Filter:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:74
+msgid "Class:"
+msgstr ""
+
+#: ../ProjectController.py:1821
+msgid "Clean"
+msgstr ""
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr ""
+
+#: ../ProjectController.py:1822
+msgid "Clean project build folder"
+msgstr ""
+
+#: ../ProjectController.py:1332
+msgid "Cleaning the build directory\n"
+msgstr ""
+
+#: ../IDEFrame.py:437
+msgid "Clear Errors"
+msgstr ""
+
+#: ../editors/Viewer.py:680
+msgid "Clear Execution Order"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr ""
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
+msgid "Close Application"
+msgstr ""
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
+msgid "Close Project"
+msgstr ""
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
+msgid "Close Tab"
+msgstr ""
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
+msgid "Coil"
+msgstr ""
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
+msgid "Comment"
+msgstr ""
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:106
+msgid "Company Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:107
+msgid "Company URL (optional):"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Comparison"
+msgstr ""
+
+#: ../ProjectController.py:756
+msgid "Compiling IEC Program into C code...\n"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:85
+msgid "Concatenation"
+msgstr ""
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr ""
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:43
+msgid "Configuration"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Configurations"
+msgstr ""
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr ""
+
+#: ../ProjectController.py:1842
+msgid "Connect"
+msgstr ""
+
+#: ../ProjectController.py:1843
+msgid "Connect to the target PLC"
+msgstr ""
+
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
+msgid "Connection"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:55
+msgid "Connection Properties"
+msgstr ""
+
+#: ../ProjectController.py:1691
+msgid "Connection canceled!\n"
+msgstr ""
+
+#: ../ProjectController.py:1714
+#, python-format
+msgid "Connection failed to %s!\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
+msgid "Connection to '%s' failed.\n"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
+msgid "Connector"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:68
+msgid "Connectors:"
+msgstr ""
+
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr ""
+
+#: ../controls/VariablePanel.py:75
+msgid "Constant"
+msgstr ""
+
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
+msgid "Contact"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:217
+msgid "Content Description (optional):"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
+msgid "Continuation"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:18
+msgid "Conversion from BCD"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:19
+msgid "Conversion to BCD"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:21
+msgid "Conversion to date"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:20
+msgid "Conversion to time-of-day"
+msgstr ""
+
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
+msgid "Copy"
+msgstr ""
+
+#: ../IDEFrame.py:1964
+msgid "Copy POU"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:68
+msgid "Copy file from left folder to right"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:67
+msgid "Copy file from right folder to left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:28
+msgid "Cosine"
+msgstr ""
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr ""
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+
+#: ../PLCControler.py:552
+msgid "Couldn't paste non-POU object."
+msgstr ""
+
+#: ../ProjectController.py:1636
+msgid "Couldn't start PLC !\n"
+msgstr ""
+
+#: ../ProjectController.py:1644
+msgid "Couldn't stop PLC !\n"
+msgstr ""
+
+#: ../svgui/svgui.py:57
+msgid "Create HMI"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:54
+msgid "Create a new POU"
+msgstr ""
+
+#: ../dialogs/PouActionDialog.py:45
+msgid "Create a new action"
+msgstr ""
+
+#: ../IDEFrame.py:166
+msgid "Create a new action block"
+msgstr ""
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
+msgid "Create a new block"
+msgstr ""
+
+#: ../IDEFrame.py:139
+msgid "Create a new branch"
+msgstr ""
+
+#: ../IDEFrame.py:133
+msgid "Create a new coil"
+msgstr ""
+
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
+msgid "Create a new comment"
+msgstr ""
+
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
+msgid "Create a new connection"
+msgstr ""
+
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
+msgid "Create a new contact"
+msgstr ""
+
+#: ../IDEFrame.py:169
+msgid "Create a new divergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:54
+msgid "Create a new divergence or convergence"
+msgstr ""
+
+#: ../IDEFrame.py:157
+msgid "Create a new initial step"
+msgstr ""
+
+#: ../IDEFrame.py:172
+msgid "Create a new jump"
+msgstr ""
+
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
+msgid "Create a new power rail"
+msgstr ""
+
+#: ../IDEFrame.py:130
+msgid "Create a new rung"
+msgstr ""
+
+#: ../IDEFrame.py:160
+msgid "Create a new step"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
+msgid "Create a new transition"
+msgstr ""
+
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
+msgid "Create a new variable"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr ""
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr ""
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
+msgid "Cut"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Cyclic"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:60
+msgid "DEPRECATED"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
+msgid "DS-301 Profile"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
+msgid "DS-302 Profile"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:39
+msgid "Data Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Data Types"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Data type conversion"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
+msgid "Date addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
+msgid "Date and time subtraction"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
+msgid "Date subtraction"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:46
+msgid "Days:"
+msgstr ""
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:144
+msgid "Debug instance"
+msgstr ""
+
+#: ../editors/Viewer.py:490
+#, python-format
+msgid "Debug: %s"
+msgstr ""
+
+#: ../ProjectController.py:1471
+#, python-format
+msgid "Debug: Unknown variable '%s'\n"
+msgstr ""
+
+#: ../ProjectController.py:1469
+#, python-format
+msgid "Debug: Unsupported type to debug '%s'\n"
+msgstr ""
+
+#: ../IDEFrame.py:660
+msgid "Debugger"
+msgstr ""
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr ""
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
+msgid "Delete"
+msgstr ""
+
+#: ../editors/Viewer.py:610
+msgid "Delete Divergence Branch"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:157
+msgid "Delete File"
+msgstr ""
+
+#: ../editors/Viewer.py:597
+msgid "Delete Wire Segment"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:44
+msgid "Delete item"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:88
+msgid "Deletion (within)"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:161
+msgid "Derivation Type:"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr ""
+
+#: ../controls/VariablePanel.py:463
+msgid "Description:"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
+msgid "Dimensions:"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:69
+msgid "Direction"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:102
+msgid "Direction:"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Directly"
+msgstr ""
+
+#: ../ProjectController.py:1855
+msgid "Disconnect"
+msgstr ""
+
+#: ../ProjectController.py:1856
+msgid "Disconnect from PLC"
+msgstr ""
+
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr ""
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
+msgid "Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:36
+msgid "Division"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:156
+#, python-format
+msgid "Do you really want to delete the file '%s'?"
+msgstr ""
+
+#: ../controls/VariablePanel.py:65
+msgid "Documentation"
+msgstr ""
+
+#: ../PLCOpenEditor.py:312
+msgid "Done"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Duration"
+msgstr ""
+
+#: ../canfestival/canfestival.py:174
+msgid "EDS files (*.eds)|*.eds|All files|*.*"
+msgstr ""
+
+#: ../editors/Viewer.py:668
+msgid "Edit Block"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:56
+msgid "Edit Contact Values"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:62
+msgid "Edit Duration"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:53
+msgid "Edit Step"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
+msgid "Edit a WxWidgets GUI with WXGlade"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:127
+msgid "Edit action block properties"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:47
+msgid "Edit array type properties"
+msgstr ""
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
+msgid "Edit comment"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:69
+msgid "Edit file"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:42
+msgid "Edit item"
+msgstr ""
+
+#: ../editors/Viewer.py:3059
+msgid "Edit jump target"
+msgstr ""
+
+#: ../ProjectController.py:1873
+msgid "Edit raw IEC code added to code generated by PLCGenerator"
+msgstr ""
+
+#: ../editors/SFCViewer.py:815
+msgid "Edit step name"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:53
+msgid "Edit transition"
+msgstr ""
+
+#: ../IDEFrame.py:632
+msgid "Editor ToolBar"
+msgstr ""
+
+#: ../ProjectController.py:1294
+msgid "Editor selection"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:360
+msgid "Elements :"
+msgstr ""
+
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr ""
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr ""
+
+#: ../Beremiz_service.py:341
+msgid "Enter a name "
+msgstr ""
+
+#: ../Beremiz_service.py:326
+msgid "Enter a port number "
+msgstr ""
+
+#: ../Beremiz_service.py:317
+msgid "Enter the IP of the interface to bind"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Enumerated"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:77
+msgid "Equal to"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
+msgid "Error"
+msgstr ""
+
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
+msgstr ""
+
+#: ../ProjectController.py:803
+#, python-format
+msgid "Error : IEC to C compiler returned %d\n"
+msgstr ""
+
+#: ../ProjectController.py:731
+#, python-format
+msgid ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+msgstr ""
+
+#: ../ConfigTreeNode.py:219
+#, python-format
+msgid "Error while saving \"%s\"\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:179
+msgid "Error: Export slave failed\n"
+msgstr ""
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:388
+msgid "Error: No Master generated\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:383
+msgid "Error: No PLC built\n"
+msgstr ""
+
+#: ../ProjectController.py:1708
+#, python-format
+msgid "Exception while connecting %s!\n"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:123
+msgid "Execution Control:"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
+msgid "Execution Order:"
+msgstr ""
+
+#: ../features.py:36
+msgid "Experimental web based HMI"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:38
+msgid "Exponent"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:26
+msgid "Exponentiation"
+msgstr ""
+
+#: ../canfestival/canfestival.py:186
+msgid "Export CanOpen slave to EDS file"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
+msgid "Export graph values to clipboard"
+msgstr ""
+
+#: ../canfestival/canfestival.py:185
+msgid "Export slave"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:94
+msgid "Expression:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "External"
+msgstr ""
+
+#: ../ProjectController.py:826
+msgid "Extracting Located Variables...\n"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "FBD"
+msgstr ""
+
+#: ../ProjectController.py:1773
+msgid "Failed : Must build before transfer.\n"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
+msgid "Falling Edge"
+msgstr ""
+
+#: ../ProjectController.py:1098
+msgid "Fatal : cannot get builder.\n"
+msgstr ""
+
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
+msgid "Field %s hasn't a valid value!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
+msgid "Fields %s haven't a valid value!"
+msgstr ""
+
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
+msgid "Find"
+msgstr ""
+
+#: ../IDEFrame.py:379
+msgid "Find Next"
+msgstr ""
+
+#: ../IDEFrame.py:381
+msgid "Find Previous"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:90
+msgid "Find position"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:58
+msgid "Find:"
+msgstr ""
+
+#: ../editors/Viewer.py:1633
+msgid "Force value"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:176
+msgid "Forcing Variable Value"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
+#, python-format
+msgid "Form isn't complete. %s must be filled!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
+msgid "Form isn't complete. Name must be filled!"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:235
+msgid "Form isn't complete. Valid block type must be selected!"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:75
+msgid "Forward"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
+msgid "Function"
+msgstr ""
+
+#: ../IDEFrame.py:354
+msgid "Function &Block"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
+msgid "Function Block"
+msgstr ""
+
+#: ../controls/VariablePanel.py:868
+msgid "Function Block Types"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Function Blocks"
+msgstr ""
+
+#: ../editors/Viewer.py:290
+msgid "Function Blocks can't be used in Functions!"
+msgstr ""
+
+#: ../PLCControler.py:1907
+#, python-format
+msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "Functions"
+msgstr ""
+
+#: ../PLCOpenEditor.py:88
+msgid "Generate Program"
+msgstr ""
+
+#: ../ProjectController.py:722
+msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Global"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
+msgid "Go to current value"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:189
+msgid "Graphics"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:75
+msgid "Greater than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:76
+msgid "Greater than or equal to"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:149
+msgid "Grid Resolution:"
+msgstr ""
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:135
+msgid "Height:"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:89
+msgid "Home Directory:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:165
+msgid "Horizontal:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:47
+msgid "Hours:"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "IL"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr ""
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
+msgid "IP is not valid!"
+msgstr ""
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
+msgid "Import SVG"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
+msgid "InOut"
+msgstr ""
+
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr ""
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:306
+#, python-format
+msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+msgstr ""
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Indicator"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr ""
+
+#: ../editors/Viewer.py:650
+msgid "Initial Step"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
+msgid "Initial Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
+msgid "Initial Value:"
+msgstr ""
+
+#: ../svgui/svgui.py:56
+msgid "Inkscape"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
+msgid "Inline"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Input"
+msgstr ""
+
+#: ../dialogs/FBDBlockDialog.py:99
+msgid "Inputs:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:87
+msgid "Insertion (into)"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1948
+#, python-format
+msgid "Instance with id %d doesn't exist!"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:279
+msgid "Instances:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:88
+msgid "Interface"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:81
+msgid "Interrupt"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Interval"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+
+#: ../PLCControler.py:1895
+msgid "Invalid plcopen element(s)!!!"
+msgstr ""
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr ""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
+#, python-format
+msgid "Invalid value \"%s\" for debug variable"
+msgstr ""
+
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
+msgid "Invalid value \"%s\" for variable grid element"
+msgstr ""
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
+#, python-format
+msgid "Invalid value \"%s\" for viewer block"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:124
+msgid ""
+"Invalid value!\n"
+"You must fill a numeric value."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr ""
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
+msgid "Jump"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "LD"
+msgstr ""
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
+#, python-format
+msgid "Ladder element with id %d is on more than one rung."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
+msgid "Language"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:206
+msgid "Language (optional):"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
+msgid "Language:"
+msgstr ""
+
+#: ../ProjectController.py:1779
+msgid "Latest build already matches current target. Transfering anyway...\n"
+msgstr ""
+
+#: ../Beremiz_service.py:281
+msgid "Launch WX GUI inspector"
+msgstr ""
+
+#: ../Beremiz_service.py:280
+msgid "Launch a live Python shell"
+msgstr ""
+
+#: ../editors/Viewer.py:580
+msgid "Left"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:64
+msgid "Left PowerRail"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:81
+msgid "Length of string"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:78
+msgid "Less than"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:79
+msgid "Less than or equal to"
+msgstr ""
+
+#: ../IDEFrame.py:652
+msgid "Library"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:73
+msgid "Limitation"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:209
+msgid "Linking :\n"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
+msgid "Local"
+msgstr ""
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr ""
+
+#: ../ProjectController.py:1685
+msgid "Local service discovery failed!\n"
+msgstr ""
+
+#: ../controls/VariablePanel.py:62
+msgid "Location"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:79
+msgid "Locations available:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:25
+msgid "Logarithm to base 10"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:102
+#, python-format
+msgid "MDNS resolution failure for '%s'\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
+msgid "Map Variable"
+msgstr ""
+
+#: ../features.py:31
+msgid "Map located variables over CANopen"
+msgstr ""
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:113
+msgid "Master"
+msgstr ""
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr ""
+
+#: ../plcopen/iec_std.csv:71
+msgid "Maximum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:246
+msgid "Maximum:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Memory"
+msgstr ""
+
+#: ../IDEFrame.py:617
+msgid "Menu ToolBar"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:51
+msgid "Microseconds:"
+msgstr ""
+
+#: ../editors/Viewer.py:585
+msgid "Middle"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:50
+msgid "Milliseconds:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:72
+msgid "Minimum"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:233
+msgid "Minimum:"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:48
+msgid "Minutes:"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:231
+msgid "Miscellaneous"
+msgstr ""
+
+#: ../features.py:32
+msgid "Modbus support"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:65
+msgid "Modifier:"
+msgstr ""
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:146
+msgid "Move action down"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:145
+msgid "Move action up"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:46
+msgid "Move down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:367
+msgid "Move element down"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:366
+msgid "Move element up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:254
+msgid "Move task up"
+msgstr ""
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
+msgid "Move the view"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:45
+msgid "Move up"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
+msgid "Move variable down"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
+msgid "Move variable up"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:74
+msgid "Multiplexer (select 1 of N)"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:34
+msgid "Multiplication"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:87
+msgid "My Computer:"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
+#: ../controls/VariablePanel.py:59
+msgid "Name"
+msgstr ""
+
+#: ../Beremiz_service.py:342
+msgid "Name must not be null!"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
+msgid "Name:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:24
+msgid "Natural logarithm"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
+msgid "Negated"
+msgstr ""
+
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr ""
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
+msgid "New"
+msgstr ""
+
+#: ../controls/CustomEditableListBox.py:43
+msgid "New item"
+msgstr ""
+
+#: ../editors/Viewer.py:553
+msgid "No Modifier"
+msgstr ""
+
+#: ../ProjectController.py:1808
+msgid "No PLC to transfer (did build succeed ?)\n"
+msgstr ""
+
+#: ../PLCGenerator.py:1678
+#, python-format
+msgid "No body defined in \"%s\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCOpenEditor.py:331
+msgid ""
+"No documentation available.\n"
+"Coming soon."
+msgstr ""
+
+#: ../PLCGenerator.py:841
+#, python-format
+msgid "No informations found for \"%s\" block"
+msgstr ""
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:175
+msgid "No search results available."
+msgstr ""
+
+#: ../svgui/svgui.py:142
+#, python-format
+msgid "No such SVG file: %s\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr ""
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+msgid "No valid value selected!"
+msgstr ""
+
+#: ../PLCGenerator.py:1676
+#, python-format
+msgid "No variable defined in \"%s\" POU"
+msgstr ""
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr ""
+
+#: ../controls/VariablePanel.py:79
+msgid "Non-Retain"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:78
+msgid "Normal"
+msgstr ""
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:80
+msgid "Not equal to"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:91
+msgid "Number of sequences:"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:22
+msgid "Numerical"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:88
+msgid "Only Elements"
+msgstr ""
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
+msgid "Open"
+msgstr ""
+
+#: ../svgui/svgui.py:151
+msgid "Open Inkscape"
+msgstr ""
+
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr ""
+
+#: ../ProjectController.py:1879
+msgid "Open a file explorer to manage project files"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
+msgid "Open wxGlade"
+msgstr ""
+
+#: ../controls/VariablePanel.py:64
+msgid "Option"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
+msgid "Options"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:109
+msgid "Organization (optional):"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
+msgid "Other Profile"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
+msgid "Output"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
+msgid "PDO Receive"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
+msgid "PDO Transmit"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:174
+msgid "PLC :\n"
+msgstr ""
+
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr ""
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr ""
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr ""
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr ""
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
+msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
+msgstr ""
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
+msgid "PLCOpenEditor"
+msgstr ""
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:109
+msgid "POU Name"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:66
+msgid "POU Name:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:111
+msgid "POU Type"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:73
+msgid "POU Type:"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr ""
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
+msgid "Page Setup"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:124
+msgid "Page Size (optional):"
+msgstr ""
+
+#: ../IDEFrame.py:2640
+#, python-format
+msgid "Page: %d"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:134
+msgid "Parent instance"
+msgstr ""
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
+msgid "Paste"
+msgstr ""
+
+#: ../IDEFrame.py:1899
+msgid "Paste POU"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:60
+msgid "Pattern to search:"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:75
+msgid "Pin number:"
+msgstr ""
+
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
+msgid "Please choose a target"
+msgstr ""
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr ""
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
+msgid "Please enter comment text"
+msgstr ""
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
+msgid "Please enter step name"
+msgstr ""
+
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
+msgid "Please enter value for a \"%s\" variable:"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be 0 <= port <= 65535!"
+msgstr ""
+
+#: ../Beremiz_service.py:327
+msgid "Port number must be an integer!"
+msgstr ""
+
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
+msgid "Power Rail"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:52
+msgid "Power Rail Properties"
+msgstr ""
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
+msgid "Preview"
+msgstr ""
+
+#: ../dialogs/BlockPreviewDialog.py:59
+msgid "Preview:"
+msgstr ""
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
+msgid "Print"
+msgstr ""
+
+#: ../IDEFrame.py:1110
+msgid "Print preview"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Priority"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:91
+msgid "Priority:"
+msgstr ""
+
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:90
+msgid "Product Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:92
+msgid "Product Release (optional):"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:91
+msgid "Product Version (required):"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
+msgid "Program"
+msgstr ""
+
+#: ../PLCOpenEditor.py:321
+msgid "Program was successfully generated!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Programs"
+msgstr ""
+
+#: ../editors/Viewer.py:285
+msgid "Programs can't be used by other POUs!"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
+msgid "Project"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:180
+#, python-format
+msgid "Project '%s':"
+msgstr ""
+
+#: ../ProjectController.py:1878
+msgid "Project Files"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:88
+msgid "Project Name (required):"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:89
+msgid "Project Version (optional):"
+msgstr ""
+
+#: ../PLCControler.py:2717
+msgid ""
+"Project file syntax error:\n"
+"\n"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
+msgid "Project properties"
+msgstr ""
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr ""
+
+#: ../plcopen/types_enums.py:77
+msgid "Properties"
+msgstr ""
+
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr ""
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr ""
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr ""
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr ""
+
+#: ../features.py:34
+msgid "Python file"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Qualifier"
+msgstr ""
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
+msgid "Quit"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
+msgid "Range:"
+msgstr ""
+
+#: ../ProjectController.py:1872
+msgid "Raw IEC code"
+msgstr ""
+
+#: ../BeremizIDE.py:1083
+#, python-format
+msgid "Really delete node '%s'?"
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
+msgid "Redo"
+msgstr ""
+
+#: ../dialogs/SFCTransitionDialog.py:76
+msgid "Reference"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
+msgid "Refresh"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:70
+msgid "Regular expression"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:99
+msgid "Regular expressions"
+msgstr ""
+
+#: ../editors/Viewer.py:1636
+msgid "Release value"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:37
+msgid "Remainder (modulo)"
+msgstr ""
+
+#: ../BeremizIDE.py:1084
+#, python-format
+msgid "Remove %s node"
+msgstr ""
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr ""
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:144
+msgid "Remove action"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:365
+msgid "Remove element"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:66
+msgid "Remove file from left folder"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:284
+msgid "Remove instance"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:111
+msgid "Remove slave"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:253
+msgid "Remove task"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
+msgid "Remove variable"
+msgstr ""
+
+#: ../IDEFrame.py:1979
+msgid "Rename"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:187
+msgid "Replace File"
+msgstr ""
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:89
+msgid "Replacement (within)"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Reset"
+msgstr ""
+
+#: ../editors/Viewer.py:681
+msgid "Reset Execution Order"
+msgstr ""
+
+#: ../IDEFrame.py:453
+msgid "Reset Perspective"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:103
+msgid "Reset search result"
+msgstr ""
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
+msgid "Resources"
+msgstr ""
+
+#: ../controls/VariablePanel.py:77
+msgid "Retain"
+msgstr ""
+
+#: ../controls/VariablePanel.py:455
+msgid "Return Type:"
+msgstr ""
+
+#: ../editors/Viewer.py:582
+msgid "Right"
+msgstr ""
+
+#: ../dialogs/LDPowerRailDialog.py:65
+msgid "Right PowerRail"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
+msgid "Rising Edge"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:65
+msgid "Rotate left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:64
+msgid "Rotate right"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:17
+msgid "Rounding up/down"
+msgstr ""
+
+#: ../ProjectController.py:1828
+msgid "Run"
+msgstr ""
+
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr ""
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
+msgid "SDO Client"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
+msgid "SDO Server"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
+msgid "SFC"
+msgstr ""
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr ""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
+msgid "ST"
+msgstr ""
+
+#: ../PLCOpenEditor.py:308
+msgid "ST files (*.st)|*.st|All files|*.*"
+msgstr ""
+
+#: ../svgui/svgui.py:136
+msgid "SVG files (*.svg)|*.svg|All files|*.*"
+msgstr ""
+
+#: ../features.py:36
+msgid "SVGUI"
+msgstr ""
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
+msgid "Save"
+msgstr ""
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
+msgid "Save As..."
+msgstr ""
+
+#: ../BeremizIDE.py:249
+msgid "Save as"
+msgstr ""
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:73
+msgid "Scope"
+msgstr ""
+
+#: ../IDEFrame.py:644
+msgid "Search"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
+msgid "Search in Project"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:49
+msgid "Seconds:"
+msgstr ""
+
+#: ../IDEFrame.py:390
+msgid "Select All"
+msgstr ""
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
+msgid "Select a variable class:"
+msgstr ""
+
+#: ../ProjectController.py:1293
+msgid "Select an editor:"
+msgstr ""
+
+#: ../controls/PouInstanceVariablesPanel.py:292
+msgid "Select an instance"
+msgstr ""
+
+#: ../IDEFrame.py:628
+msgid "Select an object"
+msgstr ""
+
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:70
+msgid "Selection"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:65
+msgid "Selection Divergence"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:104
+msgid "Services available:"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Set"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:62
+msgid "Shift left"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:63
+msgid "Shift right"
+msgstr ""
+
+#: ../ProjectController.py:1863
+msgid "Show IEC code generated by PLCGenerator"
+msgstr ""
+
+#: ../canfestival/canfestival.py:407
+msgid "Show Master"
+msgstr ""
+
+#: ../canfestival/canfestival.py:408
+msgid "Show Master generated by config_utils"
+msgstr ""
+
+#: ../ProjectController.py:1862
+msgid "Show code"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:67
+msgid "Simultaneous Divergence"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:27
+msgid "Sine"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Single"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr ""
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr ""
+
+#: ../plcopen/iec_std.csv:23
+msgid "Square root (base 2)"
+msgstr ""
+
+#: ../plcopen/definitions.py:50
+msgid "Standard function blocks"
+msgstr ""
+
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
+msgid "Start PLC"
+msgstr ""
+
+#: ../ProjectController.py:1074
+#, python-format
+msgid "Start build in %s\n"
+msgstr ""
+
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr ""
+
+#: ../ProjectController.py:1633
+msgid "Starting PLC\n"
+msgstr ""
+
+#: ../BeremizIDE.py:393
+msgid "Status ToolBar"
+msgstr ""
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
+msgid "Step"
+msgstr ""
+
+#: ../ProjectController.py:1835
+msgid "Stop"
+msgstr ""
+
+#: ../Beremiz_service.py:272
+msgid "Stop PLC"
+msgstr ""
+
+#: ../ProjectController.py:1836
+msgid "Stop Running PLC"
+msgstr ""
+
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Structure"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Subrange"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:35
+msgid "Subtraction"
+msgstr ""
+
+#: ../ProjectController.py:1113
+msgid "Successfully built.\n"
+msgstr ""
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
+msgid "Syntax error in regular expression of pattern to search!"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:29
+msgid "Tangent"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:97
+msgid "Task"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:248
+msgid "Tasks:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:91
+msgid "Temp"
+msgstr ""
+
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:186
+#, python-format
+msgid ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+msgstr ""
+
+#: ../editors/LDViewer.py:893
+msgid "The group of block must be coherent!"
+msgstr ""
+
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
+msgid "There are changes, do you want to save?"
+msgstr ""
+
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
+msgstr ""
+
+#: ../IDEFrame.py:1133
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+
+#: ../editors/LDViewer.py:902
+msgid "This option isn't available yet!"
+msgstr ""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40
+msgid "Time"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
+msgid "Time addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:86
+msgid "Time concatenation"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
+msgid "Time division"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
+msgid "Time multiplication"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
+msgid "Time subtraction"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
+msgid "Time-of-day addition"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
+msgid "Time-of-day subtraction"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr ""
+
+#: ../editors/Viewer.py:584
+msgid "Top"
+msgstr ""
+
+#: ../ProjectController.py:1848
+msgid "Transfer"
+msgstr ""
+
+#: ../ProjectController.py:1849
+msgid "Transfer PLC"
+msgstr ""
+
+#: ../ProjectController.py:1802
+msgid "Transfer completed successfully.\n"
+msgstr ""
+
+#: ../ProjectController.py:1805
+msgid "Transfer failed\n"
+msgstr ""
+
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
+msgid "Transition"
+msgstr ""
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:91
+msgid "Transition Name"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:60
+msgid "Transition Name:"
+msgstr ""
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1526
+#, python-format
+msgid "Transition with name %s doesn't exist!"
+msgstr ""
+
+#: ../plcopen/types_enums.py:76
+msgid "Transitions"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:76
+msgid "Triggering"
+msgstr ""
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
+msgid "Type"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr ""
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
+#, python-format
+msgid "Type conflict for location \"%s\""
+msgstr ""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Type conversion"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:170
+msgid "Type infos:"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
+msgid "Type:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
+#, python-format
+msgid "Unable to define PDO mapping for node %02x"
+msgstr ""
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
+msgid "Unable to get Xenomai's %s \n"
+msgstr ""
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr ""
+
+#: ../PLCGenerator.py:261
+#, python-format
+msgid "Undefined pou type \"%s\""
+msgstr ""
+
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
+msgid "Undo"
+msgstr ""
+
+#: ../ProjectController.py:442
+msgid "Unknown"
+msgstr ""
+
+#: ../editors/Viewer.py:437
+#, python-format
+msgid "Unknown variable \"%s\" for this POU!"
+msgstr ""
+
+#: ../ProjectController.py:439 ../ProjectController.py:440
+msgid "Unnamed"
+msgstr ""
+
+#: ../PLCControler.py:263
+#, python-format
+msgid "Unnamed%d"
+msgstr ""
+
+#: ../controls/VariablePanel.py:308
+#, python-format
+msgid "Unrecognized data size \"%s\""
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
+msgid "User Data Types"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
+msgid "User Type"
+msgstr ""
+
+#: ../plcopen/types_enums.py:75
+msgid "User-defined POUs"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Value"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:267
+msgid "Values:"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
+msgid "Variable"
+msgstr ""
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:68
+msgid "Variable Properties"
+msgstr ""
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
+msgid "Variable class"
+msgstr ""
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
+msgid "Variable don't belong to this POU!"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr ""
+
+#: ../controls/VariablePanel.py:90
+msgid "Variables"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:166
+msgid "Vertical:"
+msgstr ""
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr ""
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr ""
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr ""
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr ""
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr ""
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr ""
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr ""
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr ""
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr ""
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
+msgid "WXGLADE GUI"
+msgstr ""
+
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
+msgid "Warning"
+msgstr ""
+
+#: ../ProjectController.py:726
+msgid "Warnings in ST/IL/SFC code generator :\n"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:82
+msgid "Whole Project"
+msgstr ""
+
+#: ../controls/ProjectPropertiesPanel.py:134
+msgid "Width:"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:94
+msgid "Wrap search"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr ""
+
+#: ../features.py:35
+msgid "WxGlade GUI"
+msgstr ""
+
+#: ../svgui/svgui.py:150
+msgid ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:160
+msgid ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+msgstr ""
+
+#: ../ProjectController.py:390
+msgid ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+msgstr ""
+
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
+msgstr ""
+
+#: ../editors/LDViewer.py:677
+msgid "You must select the wire where a contact should be added!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
+msgid "You must type a name!"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:209
+msgid "You must type a value!"
+msgstr ""
+
+#: ../IDEFrame.py:440
+msgid "Zoom"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr ""
+
+#: ../PLCOpenEditor.py:317
+#, python-format
+msgid "error: %s\n"
+msgstr ""
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "function"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "functionBlock"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr ""
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:36
+msgid "program"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:84
+msgid "string from the middle"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:82
+msgid "string left of"
+msgstr ""
+
+#: ../plcopen/iec_std.csv:83
+msgid "string right of"
+msgstr ""
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr ""
+
+#: ../PLCOpenEditor.py:315
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr ""
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr ""
+
+msgid "CAN_Device"
+msgstr ""
+
+msgid "CAN_Baudrate"
+msgstr ""
+
+msgid "NodeId"
+msgstr ""
+
+msgid "Sync_Align"
+msgstr ""
+
+msgid "Sync_Align_Ratio"
+msgstr ""
+
+msgid "CanFestivalNode"
+msgstr ""
+
+msgid "Sync_TPDOs"
+msgstr ""
+
+msgid "CanFestivalInstance"
+msgstr ""
+
+msgid "CAN_Driver"
+msgstr ""
+
+msgid "Generic"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "Xenomai"
+msgstr ""
+
+msgid "XenoConfig"
+msgstr ""
+
+msgid "Compiler"
+msgstr ""
+
+msgid "CFLAGS"
+msgstr ""
+
+msgid "Linker"
+msgstr ""
+
+msgid "LDFLAGS"
+msgstr ""
+
+msgid "Linux"
+msgstr ""
+
+msgid "Win32"
+msgstr ""
+
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr ""
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
+msgid "BaseParams"
+msgstr ""
+
+msgid "IEC_Channel"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "BeremizRoot"
+msgstr ""
+
+msgid "TargetType"
+msgstr ""
+
+msgid "Libraries"
+msgstr ""
+
+msgid "URI_location"
+msgstr ""
+
+msgid "Disable_Extensions"
+msgstr ""
+
+msgid "%(codefile_name)s"
+msgstr ""
+
+msgid "variables"
+msgstr ""
+
+msgid "variable"
+msgstr ""
+
+msgid "name"
+msgstr ""
+
+msgid "type"
+msgstr ""
+
+msgid "class"
+msgstr ""
+
+msgid "initial"
+msgstr ""
+
+msgid "desc"
+msgstr ""
+
+msgid "onchange"
+msgstr ""
+
+msgid "opts"
+msgstr ""
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr ""
+
+msgid "Preset datetime"
+msgstr ""
+
+msgid "Copy of IN"
+msgstr ""
+
+msgid "Datetime, current or relative to PDT"
+msgstr ""
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr ""
+
+msgid "1 = integrate, 0 = hold"
+msgstr ""
+
+msgid "Overriding reset"
+msgstr ""
+
+msgid "Input variable"
+msgstr ""
+
+msgid "Initial value"
+msgstr ""
+
+msgid "Sampling period"
+msgstr ""
+
+msgid "NOT R1"
+msgstr ""
+
+msgid "Integrated output"
+msgstr ""
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr ""
+
+msgid "0 = reset"
+msgstr ""
+
+msgid "Input to be differentiated"
+msgstr ""
+
+msgid "Differentiated output"
+msgstr ""
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr ""
+
+msgid "0 - manual , 1 - automatic"
+msgstr ""
+
+msgid "Process variable"
+msgstr ""
+
+msgid "Set point"
+msgstr ""
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr ""
+
+msgid "Proportionality constant"
+msgstr ""
+
+msgid "Reset time"
+msgstr ""
+
+msgid "Derivative time constant"
+msgstr ""
+
+msgid "PV - SP"
+msgstr ""
+
+msgid "FB for integral term"
+msgstr ""
+
+msgid "FB for derivative term"
+msgstr ""
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr ""
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr ""
+
+msgid "Ramp duration"
+msgstr ""
+
+msgid "BUSY = 1 during ramping period"
+msgstr ""
+
+msgid "Elapsed time of ramp"
+msgstr ""
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr ""
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr ""
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr ""
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr ""
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr ""
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr ""
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr ""
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr ""
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr ""
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr ""
+
+msgid "first input parameter"
+msgstr ""
+
+msgid "second input parameter"
+msgstr ""
+
+msgid "first output parameter"
+msgstr ""
+
+msgid "second output parameter"
+msgstr ""
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr ""
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr ""
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr ""
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr ""
--- a/i18n/Beremiz_zh_CN.po	Sat Jun 02 11:56:01 2018 +0100
+++ b/i18n/Beremiz_zh_CN.po	Mon Jan 07 13:50:39 2019 +0100
@@ -1,47 +1,25 @@
 # SOME DESCRIPTIVE TITLE.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the Beremiz package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
+# 
+#, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+"Project-Id-Version: Beremiz\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-09-07 01:17+0200\n"
-"PO-Revision-Date: 2012-09-09 18:36+0100\n"
-"Last-Translator: Laurent BESSARD <laurent.bessard@gmail.com>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: \n"
+"POT-Creation-Date: 2018-06-15 16:39+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: yiwei Yan <523136664@qq.com>, 2017\n"
+"Language-Team: Chinese (China) (https://www.transifex.com/beremiz/teams/75746/zh_CN/)\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-
-#: ../PLCOpenEditor.py:520
-#, fuzzy
-msgid ""
-"\n"
-"An error has occurred.\n"
-"\n"
-"Click OK to save an error report.\n"
-"\n"
-"Please be kind enough to send this file to:\n"
-"edouard.tisserant@gmail.com\n"
-"\n"
-"Error:\n"
-msgstr ""
-"\n"
-"一个未处理的异常(漏洞)出现。漏洞报告存为:\n"
-"(%s)\n"
-"\n"
-"或者请将文件发送至下列邮箱:\n"
-"edouard.tisserant@gmail.com\n"
-"\n"
-"你现在必须重新启动Beremiz。\n"
-"\n"
-"回溯:\n"
-
-#: ../Beremiz.py:1071
-#, fuzzy, python-format
+"Language: zh_CN\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
 msgid ""
 "\n"
 "An unhandled exception (bug) occured. Bug report saved at :\n"
@@ -50,223 +28,171 @@
 "Please be kind enough to send this file to:\n"
 "beremiz-devel@lists.sourceforge.net\n"
 "\n"
-"You should now restart Beremiz.\n"
+"You should now restart program.\n"
 "\n"
 "Traceback:\n"
 msgstr ""
 "\n"
-"一个未处理的异常(漏洞)出现。漏洞报告存为:\n"
+"未处理的异常发生(错误) 。缺陷报告保存在:\n"
 "(%s)\n"
 "\n"
-"或者请将文件发送至下列邮箱:\n"
-"edouard.tisserant@gmail.com\n"
+"请好心地把这个文件发送到:\n"
+"beremiz-devel@lists.sourceforge.net\n"
 "\n"
-"你现在必须重新启动Beremiz。\n"
+"您现在应该重新启动程序.\n"
 "\n"
-"回溯:\n"
-
-#: ../controls/VariablePanel.py:77
+"追溯:\n"
+
+#: ../controls/VariablePanel.py:90
 msgid "   External"
 msgstr "   外部"
 
-#: ../controls/VariablePanel.py:76
+#: ../controls/VariablePanel.py:89
 msgid "   InOut"
-msgstr "   输入"
-
-#: ../controls/VariablePanel.py:76
+msgstr "   输入输出"
+
+#: ../controls/VariablePanel.py:89
 msgid "   Input"
 msgstr "   输入"
 
-#: ../controls/VariablePanel.py:77
+#: ../controls/VariablePanel.py:90
 msgid "   Local"
 msgstr "   本地"
 
-#: ../controls/VariablePanel.py:76
+#: ../controls/VariablePanel.py:89
 msgid "   Output"
 msgstr "   输出"
 
-#: ../controls/VariablePanel.py:78
+#: ../controls/VariablePanel.py:91
 msgid "   Temp"
-msgstr "   缓冲"
-
-#: ../PLCOpenEditor.py:530
-msgid " : "
-msgstr ":"
-
-#: ../dialogs/PouTransitionDialog.py:94
-#: ../dialogs/PouActionDialog.py:91
-#: ../dialogs/PouDialog.py:111
-#: ../dialogs/SFCTransitionDialog.py:144
+msgstr "临时"
+
+#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/ProjectDialog.py:74
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:122
 #, python-format
 msgid " and %s"
 msgstr "和 %s"
 
-#: ../ProjectController.py:890
+#: ../ProjectController.py:1182
 msgid " generation failed !\n"
 msgstr "生成失败!\n"
 
-#: ../plcopen/plcopen.py:1051
+#: ../plcopen/plcopen.py:1029
 #, python-format
 msgid "\"%s\" Data Type doesn't exist !!!"
 msgstr "\"%s\" 数据类型尚不存在!!!"
 
-#: ../plcopen/plcopen.py:1069
+#: ../plcopen/plcopen.py:1047
 #, python-format
 msgid "\"%s\" POU already exists !!!"
-msgstr "\"%s\"编程组织单元已经存在!!!"
-
-#: ../plcopen/plcopen.py:1090
+msgstr "\"%s\"POU已经存在!!!"
+
+#: ../plcopen/plcopen.py:1068
 #, python-format
 msgid "\"%s\" POU doesn't exist !!!"
 msgstr "\"%s\" POU不存在!!!"
 
-#: ../editors/Viewer.py:234
+#: ../editors/Viewer.py:288
 #, python-format
 msgid "\"%s\" can't use itself!"
 msgstr "\"%s\" 不能自己使用!"
 
-#: ../IDEFrame.py:1706
-#: ../IDEFrame.py:1725
+#: ../IDEFrame.py:1688 ../IDEFrame.py:1707
 #, python-format
 msgid "\"%s\" config already exists!"
 msgstr "\"%s\" 配置已存在!"
 
-#: ../plcopen/plcopen.py:315
+#: ../plcopen/plcopen.py:531
 #, python-format
 msgid "\"%s\" configuration already exists !!!"
 msgstr "\"%s\" 配置已存在!!!"
 
-#: ../IDEFrame.py:1660
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr "“ %s ” 配置不存在!!!"
+
+#: ../IDEFrame.py:1638
 #, python-format
 msgid "\"%s\" data type already exists!"
 msgstr "\"%s\" 数据类型已存在!"
 
-#: ../PLCControler.py:2040
-#: ../PLCControler.py:2044
-#, python-format
-msgid "\"%s\" element can't be pasted here!!!"
-msgstr "\"%s\" 元素不能粘贴在这里!!!"
-
-#: ../editors/TextViewer.py:305
-#: ../editors/TextViewer.py:325
-#: ../editors/Viewer.py:252
-#: ../dialogs/PouTransitionDialog.py:105
-#: ../dialogs/ConnectionDialog.py:150
-#: ../dialogs/PouActionDialog.py:102
-#: ../dialogs/FBDBlockDialog.py:162
+#: ../dialogs/PouTransitionDialog.py:112 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:425
 #, python-format
 msgid "\"%s\" element for this pou already exists!"
-msgstr "\"%s\" "
-
-#: ../Beremiz.py:894
+msgstr "\"%s\" 元素对于此POU已经存在!"
+
+#: ../BeremizIDE.py:928
 #, python-format
 msgid "\"%s\" folder is not a valid Beremiz project\n"
 msgstr "\"%s\" 文件夹不是有效的Beremiz项目\n"
 
-#: ../plcopen/structures.py:106
-#, python-format
-msgid "\"%s\" function cancelled in \"%s\" POU: No input connected"
-msgstr "\"%s\" 功能被取消 \"%s\" 在POU中:没有输入连接"
-
-#: ../controls/VariablePanel.py:656
-#: ../IDEFrame.py:1651
-#: ../editors/DataTypeEditor.py:548
-#: ../editors/DataTypeEditor.py:577
-#: ../dialogs/PouNameDialog.py:49
-#: ../dialogs/PouTransitionDialog.py:101
-#: ../dialogs/SFCStepNameDialog.py:51
-#: ../dialogs/ConnectionDialog.py:146
-#: ../dialogs/FBDVariableDialog.py:199
-#: ../dialogs/PouActionDialog.py:98
-#: ../dialogs/PouDialog.py:118
-#: ../dialogs/SFCStepDialog.py:122
-#: ../dialogs/FBDBlockDialog.py:158
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:108
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:129
+#: ../editors/ResourceEditor.py:483 ../editors/ResourceEditor.py:518
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:603
+#: ../editors/CodeFileEditor.py:774 ../controls/VariablePanel.py:787
+#: ../IDEFrame.py:1629
 #, python-format
 msgid "\"%s\" is a keyword. It can't be used!"
 msgstr "\"%s\" 是一个关键词。它不能被使用!"
 
-#: ../editors/Viewer.py:240
-#, python-format
-msgid "\"%s\" is already used by \"%s\"!"
-msgstr "\"%s\" 已被 \"%s\" 使用!"
-
-#: ../plcopen/plcopen.py:2786
+#: ../plcopen/plcopen.py:2836
 #, python-format
 msgid "\"%s\" is an invalid value!"
 msgstr "\"%s\"不是有效值!"
 
-#: ../PLCOpenEditor.py:362
-#: ../PLCOpenEditor.py:399
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
 #, python-format
 msgid "\"%s\" is not a valid folder!"
 msgstr "\"%s\"不是有效文件夹!"
 
-#: ../controls/VariablePanel.py:654
-#: ../IDEFrame.py:1649
-#: ../editors/DataTypeEditor.py:572
-#: ../dialogs/PouNameDialog.py:47
-#: ../dialogs/PouTransitionDialog.py:99
-#: ../dialogs/SFCStepNameDialog.py:49
-#: ../dialogs/ConnectionDialog.py:144
-#: ../dialogs/PouActionDialog.py:96
-#: ../dialogs/PouDialog.py:116
-#: ../dialogs/SFCStepDialog.py:120
-#: ../dialogs/FBDBlockDialog.py:156
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:106
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:127
+#: ../editors/ResourceEditor.py:481 ../editors/ResourceEditor.py:516
+#: ../editors/DataTypeEditor.py:601 ../editors/CodeFileEditor.py:772
+#: ../controls/VariablePanel.py:785 ../IDEFrame.py:1627
 #, python-format
 msgid "\"%s\" is not a valid identifier!"
 msgstr "\"%s\"不是有效标识符!"
 
-#: ../IDEFrame.py:214
-#: ../IDEFrame.py:2445
-#: ../IDEFrame.py:2464
-#, python-format
-msgid "\"%s\" is used by one or more POUs. It can't be removed!"
-msgstr "%s 正在被一个或多个POU使用。不能被删除!"
-
-#: ../controls/VariablePanel.py:311
-#: ../IDEFrame.py:1669
-#: ../editors/TextViewer.py:303
-#: ../editors/TextViewer.py:323
-#: ../editors/TextViewer.py:360
-#: ../editors/Viewer.py:250
-#: ../editors/Viewer.py:295
-#: ../editors/Viewer.py:312
-#: ../dialogs/ConnectionDialog.py:148
-#: ../dialogs/PouDialog.py:120
-#: ../dialogs/FBDBlockDialog.py:160
+#: ../IDEFrame.py:2436
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr "\"%s\"被一个或多个程序组织单元使用,你确定要继续吗? "
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:131
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:364
+#: ../IDEFrame.py:1647
 #, python-format
 msgid "\"%s\" pou already exists!"
 msgstr "\"%s\"编程组织单元已经存在!"
 
-#: ../plcopen/plcopen.py:346
-#, python-format
-msgid "\"%s\" resource already exists in \"%s\" configuration !!!"
-msgstr "\"%s\" 资源已经存在于 \"%s\" 配置中!!!"
-
-#: ../plcopen/plcopen.py:362
-#, python-format
-msgid "\"%s\" resource doesn't exist in \"%s\" configuration !!!"
-msgstr "\"%s\" 资源不存在于 \"%s\" 配置之内!!!"
-
-#: ../dialogs/SFCStepNameDialog.py:57
-#: ../dialogs/SFCStepDialog.py:128
+#: ../dialogs/SFCStepNameDialog.py:62
 #, python-format
 msgid "\"%s\" step already exists!"
 msgstr "\"%s\"步骤已经存在!"
 
-#: ../editors/DataTypeEditor.py:543
+#: ../editors/DataTypeEditor.py:566
 #, python-format
 msgid "\"%s\" value already defined!"
 msgstr "\"%s\" 值已经被定义!"
 
-#: ../editors/DataTypeEditor.py:719
-#: ../dialogs/ArrayTypeDialog.py:97
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
 #, python-format
 msgid "\"%s\" value isn't a valid array dimension!"
 msgstr "\"%s\" 值不是有效数组维数!"
 
-#: ../editors/DataTypeEditor.py:726
-#: ../dialogs/ArrayTypeDialog.py:103
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
 #, python-format
 msgid ""
 "\"%s\" value isn't a valid array dimension!\n"
@@ -275,379 +201,408 @@
 "\"%s\" 不是一个有效的数组维数值!\n"
 "右边的数值必须大于左边的数值。"
 
-#: ../PLCControler.py:793
-#, fuzzy, python-format
-msgid "%s \"%s\" can't be pasted as a %s."
-msgstr "\"%s\" 元素不能粘贴在这里!!!"
-
-#: ../PLCControler.py:1422
-#, fuzzy, python-format
+#: ../PLCGenerator.py:1133
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr "\"{a1}\" 功能 被取消在 \"{a2}\" POU:没有输入被连接"
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr "\"{a1}\" 被用在了 \"{a2}\"!"
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr "\"{a1}\" 资源已经存在于 \"{a2}\" 配置 !!!"
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr "\"{a1}\" 资源部存在于 \"{a2}\" 配置!!!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:580
+#, python-format
+msgid "%03gms"
+msgstr "%03gms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#, python-format
+msgid "%dd"
+msgstr "%dd"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:61
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#, python-format
+msgid "%dh"
+msgstr "%dh"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:60
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:573
+#, python-format
+msgid "%dm"
+msgstr "%dm"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:58
+#, python-format
+msgid "%dms"
+msgstr "%dms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:59
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:574
+#, python-format
+msgid "%ds"
+msgstr "%ds"
+
+#: ../PLCControler.py:1114
+#, python-format
 msgid "%s Data Types"
-msgstr "数据类型 "
-
-#: ../editors/GraphicViewer.py:278
-#, python-format
-msgid "%s Graphics"
-msgstr "%s 图形"
-
-#: ../PLCControler.py:1417
+msgstr "%s 数据类型"
+
+#: ../PLCControler.py:1097
 #, python-format
 msgid "%s POUs"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:42
-#: ../canfestival/NetworkEditor.py:72
+msgstr "%s POUs"
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
 #, python-format
 msgid "%s Profile"
-msgstr ""
-
-#: ../plcopen/plcopen.py:1780
-#: ../plcopen/plcopen.py:1790
-#: ../plcopen/plcopen.py:1800
-#: ../plcopen/plcopen.py:1810
-#: ../plcopen/plcopen.py:1819
+msgstr "%s Profile"
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
 #, python-format
 msgid "%s body don't have instances!"
 msgstr "%s 未包含实例!"
 
-#: ../plcopen/plcopen.py:1842
-#: ../plcopen/plcopen.py:1849
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
 #, python-format
 msgid "%s body don't have text!"
 msgstr "%s 未包含文本!"
 
-#: ../IDEFrame.py:364
-#, fuzzy
+#: ../IDEFrame.py:388
 msgid "&Add Element"
-msgstr "插入"
-
-#: ../IDEFrame.py:334
-#, fuzzy
+msgstr "&增加元素"
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr "&关闭"
+
+#: ../IDEFrame.py:361
 msgid "&Configuration"
-msgstr "配置"
-
-#: ../IDEFrame.py:325
-#, fuzzy
+msgstr "&配置"
+
+#: ../IDEFrame.py:350
 msgid "&Data Type"
-msgstr "数据类型"
-
-#: ../IDEFrame.py:368
-#, fuzzy
+msgstr "&数据类型"
+
+#: ../IDEFrame.py:392
 msgid "&Delete"
-msgstr "删除"
-
-#: ../IDEFrame.py:317
-#, fuzzy
+msgstr "&删除"
+
+#: ../IDEFrame.py:342
 msgid "&Display"
-msgstr "显示"
-
-#: ../IDEFrame.py:316
-#, fuzzy
+msgstr "&显示"
+
+#: ../IDEFrame.py:341
 msgid "&Edit"
-msgstr "编辑"
-
-#: ../IDEFrame.py:315
-#, fuzzy
+msgstr "&编辑"
+
+#: ../IDEFrame.py:340
 msgid "&File"
-msgstr "文件"
-
-#: ../IDEFrame.py:327
-#, fuzzy
+msgstr "&文件"
+
+#: ../IDEFrame.py:352
 msgid "&Function"
-msgstr "功能"
-
-#: ../IDEFrame.py:318
-#, fuzzy
+msgstr "&功能"
+
+#: ../IDEFrame.py:343
 msgid "&Help"
-msgstr "帮助"
-
-#: ../IDEFrame.py:331
-#, fuzzy
+msgstr "&帮助"
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr "&许可"
+
+#: ../IDEFrame.py:356
 msgid "&Program"
-msgstr "程序"
-
-#: ../PLCOpenEditor.py:148
-#, fuzzy
+msgstr "&程序"
+
+#: ../PLCOpenEditor.py:98
 msgid "&Properties"
-msgstr "属性"
-
-#: ../Beremiz.py:310
-#, fuzzy
+msgstr "&属性"
+
+#: ../BeremizIDE.py:244
 msgid "&Recent Projects"
-msgstr ""
-"#-#-#-#-#  Beremiz_zh_CN.po (PACKAGE VERSION)  #-#-#-#-#\n"
-"关闭项目\n"
-"#-#-#-#-#  PLCOpenEditor_zh_CN.po (PACKAGE VERSION)  #-#-#-#-#\n"
-"关闭程序"
-
-#: ../Beremiz.py:352
-#, fuzzy
+msgstr "&最近项目"
+
+#: ../IDEFrame.py:358
 msgid "&Resource"
-msgstr "资源"
-
-#: ../controls/SearchResultPanel.py:237
-#, python-format
-msgid "'%s' - %d match in project"
-msgstr ""
-
-#: ../controls/SearchResultPanel.py:239
-#, python-format
-msgid "'%s' - %d matches in project"
-msgstr ""
-
-#: ../connectors/PYRO/__init__.py:51
-#, python-format
-msgid "'%s' is located at %s\n"
-msgstr ""
-
-#: ../controls/SearchResultPanel.py:289
+msgstr "&资源"
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr "'{a1}' - {a2} 在项目中匹配"
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr "'{a1}' - {a2} 在项目中匹配"
+
+#: ../connectors/PYRO/__init__.py:98
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr "'{a1}' 位于 {a2}\n"
+
+#: ../controls/SearchResultPanel.py:298
 #, python-format
 msgid "(%d matches)"
-msgstr ""
-
-#: ../PLCOpenEditor.py:508
-#: ../PLCOpenEditor.py:510
-#: ../PLCOpenEditor.py:511
-msgid ",   "
-msgstr ","
-
-#: ../dialogs/PouTransitionDialog.py:96
-#: ../dialogs/PouActionDialog.py:93
-#: ../dialogs/PouDialog.py:113
-#: ../dialogs/SFCTransitionDialog.py:146
+msgstr "(%d 匹配)"
+
+#: ../dialogs/PouTransitionDialog.py:103 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:124
 #, python-format
 msgid ", %s"
 msgstr ", %s"
 
-#: ../PLCOpenEditor.py:506
-msgid ". "
-msgstr "。"
-
-#: ../ProjectController.py:1268
-msgid "... debugger recovered\n"
-msgstr ""
-
-#: ../IDEFrame.py:1672
-#: ../IDEFrame.py:1714
-#: ../IDEFrame.py:1733
-#: ../dialogs/PouDialog.py:122
-#, python-format
-msgid "A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?"
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr "- 选择 URI 类型 -"
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr "1d"
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr "1h"
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr "1m"
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr "1s"
+
+#: ../dialogs/PouDialog.py:133 ../IDEFrame.py:1650 ../IDEFrame.py:1696
+#: ../IDEFrame.py:1715
+#, python-format
+msgid ""
+"A POU has an element named \"%s\". This could cause a conflict. Do you wish "
+"to continue?"
 msgstr "一个编程组织单元的成员被命名为\"%s\"。这可能会产生冲突。你希望继续吗?"
 
-#: ../controls/VariablePanel.py:658
-#: ../IDEFrame.py:1684
-#: ../IDEFrame.py:1695
-#: ../dialogs/PouNameDialog.py:51
-#: ../dialogs/PouTransitionDialog.py:103
-#: ../dialogs/SFCStepNameDialog.py:53
-#: ../dialogs/PouActionDialog.py:100
-#: ../dialogs/SFCStepDialog.py:124
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:110
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:789 ../IDEFrame.py:1664 ../IDEFrame.py:1677
 #, python-format
 msgid "A POU named \"%s\" already exists!"
 msgstr "一个以\"%s\"命名的的编程组织单元已经存在!"
 
-#: ../ConfigTreeNode.py:371
-#, fuzzy, python-format
-msgid "A child named \"%s\" already exist -> \"%s\"\n"
-msgstr "分支名字 \"%s\" 已经存在 -> \"%s\"\n"
-
-#: ../dialogs/BrowseLocationsDialog.py:175
-#, fuzzy
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr "一个子命名的 \"{a1}\" 已经存在 -> \"{a2}\"\n"
+
+#: ../dialogs/BrowseLocationsDialog.py:229
 msgid "A location must be selected!"
-msgstr "至少选择一个变量或者表达式!"
-
-#: ../controls/VariablePanel.py:660
-#: ../IDEFrame.py:1686
-#: ../IDEFrame.py:1697
-#: ../dialogs/SFCStepNameDialog.py:55
-#: ../dialogs/SFCStepDialog.py:126
+msgstr "一个定位必须被选择!"
+
+#: ../editors/ResourceEditor.py:485
+msgid "A task with the same name already exists!"
+msgstr "相同名称的任务已经存在!"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:791
+#: ../IDEFrame.py:1666 ../IDEFrame.py:1679
 #, python-format
 msgid "A variable with \"%s\" as name already exists in this pou!"
 msgstr "一个以\"%s\"命名的变量在这个编程组织单元中已经存在!"
 
-#: ../Beremiz.py:362
-#: ../PLCOpenEditor.py:181
+#: ../editors/CodeFileEditor.py:778
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr "一个变量以 \"%s\" 作为名字已经存在!"
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
 msgid "About"
 msgstr "关于"
 
-#: ../Beremiz.py:931
-msgid "About Beremiz"
-msgstr "关于Beremiz"
-
-#: ../PLCOpenEditor.py:376
-msgid "About PLCOpenEditor"
-msgstr "关于PLCOpen编辑器"
-
 #: ../plcopen/iec_std.csv:22
 msgid "Absolute number"
 msgstr "绝对值"
 
-#: ../dialogs/ActionBlockDialog.py:41
-#: ../dialogs/SFCStepDialog.py:69
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
 msgid "Action"
-msgstr "行动"
-
-#: ../editors/Viewer.py:495
-#, fuzzy
+msgstr "动作"
+
+#: ../editors/Viewer.py:653 ../editors/Viewer.py:2427
 msgid "Action Block"
-msgstr "功能块"
-
-#: ../dialogs/PouActionDialog.py:81
+msgstr "动作控制功能块"
+
+#: ../dialogs/PouActionDialog.py:89
 msgid "Action Name"
-msgstr "行动名字"
-
-#: ../dialogs/PouActionDialog.py:49
+msgstr "动作名字"
+
+#: ../dialogs/PouActionDialog.py:56
 msgid "Action Name:"
-msgstr "行动名字:"
-
-#: ../plcopen/plcopen.py:1480
+msgstr "动作名字:"
+
+#: ../plcopen/plcopen.py:1567
 #, python-format
 msgid "Action with name %s doesn't exist!"
 msgstr "一个以\"%s\"命名的的行动不存在!"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:76
 msgid "Actions"
-msgstr "行动"
-
-#: ../dialogs/ActionBlockDialog.py:134
+msgstr "动作"
+
+#: ../dialogs/ActionBlockDialog.py:139
 msgid "Actions:"
-msgstr "行动:"
-
-#: ../canfestival/SlaveEditor.py:54
-#: ../canfestival/NetworkEditor.py:84
-#: ../editors/Viewer.py:527
+msgstr "动作:"
+
+#: ../editors/Viewer.py:473
+msgid "Active"
+msgstr "活动"
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:686
 msgid "Add"
 msgstr "添加"
 
-#: ../IDEFrame.py:1925
-#: ../IDEFrame.py:1956
+#: ../IDEFrame.py:1924 ../IDEFrame.py:1959
 msgid "Add Action"
-msgstr "添加行动"
-
-#: ../features.py:7
+msgstr "添加动作"
+
+#: ../features.py:33
 msgid "Add C code accessing located variables synchronously"
-msgstr ""
-
-#: ../IDEFrame.py:1908
+msgstr "同步的增加C代码访问定位的变量"
+
+#: ../IDEFrame.py:1907
 msgid "Add Configuration"
 msgstr "添加配置"
 
-#: ../IDEFrame.py:1888
+#: ../IDEFrame.py:1887
 msgid "Add DataType"
 msgstr "添加数据类型"
 
-#: ../editors/Viewer.py:453
+#: ../editors/Viewer.py:609
 msgid "Add Divergence Branch"
 msgstr "添加发散分支"
 
-#: ../dialogs/DiscoveryDialog.py:115
-#, fuzzy
+#: ../dialogs/DiscoveryDialog.py:121
 msgid "Add IP"
-msgstr "添加Pou"
-
-#: ../IDEFrame.py:1896
-#, fuzzy
+msgstr "添加 IP"
+
+#: ../IDEFrame.py:1895
 msgid "Add POU"
-msgstr "添加Pou"
-
-#: ../features.py:8
+msgstr "添加 POU"
+
+#: ../features.py:34
 msgid "Add Python code executed asynchronously"
-msgstr ""
-
-#: ../IDEFrame.py:1936
-#: ../IDEFrame.py:1982
+msgstr "添加异步执行的Python代码"
+
+#: ../IDEFrame.py:1935 ../IDEFrame.py:1985
 msgid "Add Resource"
 msgstr "添加源"
 
-#: ../IDEFrame.py:1914
-#: ../IDEFrame.py:1953
+#: ../IDEFrame.py:1913 ../IDEFrame.py:1956
 msgid "Add Transition"
 msgstr "添加跃迁"
 
-#: ../editors/Viewer.py:442
+#: ../editors/Viewer.py:596
 msgid "Add Wire Segment"
 msgstr "添加布线段"
 
-#: ../editors/SFCViewer.py:359
+#: ../editors/SFCViewer.py:447
 msgid "Add a new initial step"
 msgstr "新建一个初始步骤"
 
-#: ../editors/Viewer.py:2289
-#: ../editors/SFCViewer.py:696
+#: ../editors/Viewer.py:2791 ../editors/SFCViewer.py:784
 msgid "Add a new jump"
 msgstr "新建一个跳跃"
 
-#: ../editors/SFCViewer.py:381
+#: ../editors/SFCViewer.py:469
 msgid "Add a new step"
 msgstr "添加一个新步骤"
 
-#: ../features.py:9
+#: ../features.py:35
 msgid "Add a simple WxGlade based GUI."
-msgstr ""
-
-#: ../dialogs/ActionBlockDialog.py:138
-#, fuzzy
+msgstr "添加一个简单的基于 WxGlade的 GUI."
+
+#: ../dialogs/ActionBlockDialog.py:143
 msgid "Add action"
-msgstr "添加行动"
-
-#: ../editors/DataTypeEditor.py:345
-#, fuzzy
+msgstr "添加动作"
+
+#: ../editors/DataTypeEditor.py:364
 msgid "Add element"
-msgstr "插入"
-
-#: ../editors/ResourceEditor.py:251
-#, fuzzy
+msgstr "添加元素"
+
+#: ../editors/ResourceEditor.py:283
 msgid "Add instance"
 msgstr "添加实例"
 
-#: ../canfestival/NetworkEditor.py:86
-#, fuzzy
+#: ../canfestival/NetworkEditor.py:110
 msgid "Add slave"
-msgstr "添加实例"
-
-#: ../editors/ResourceEditor.py:222
-#, fuzzy
+msgstr "添加从站"
+
+#: ../editors/ResourceEditor.py:252
 msgid "Add task"
 msgstr "添加任务"
 
-#: ../controls/VariablePanel.py:378
-#, fuzzy
+#: ../editors/CodeFileEditor.py:654 ../controls/VariablePanel.py:481
 msgid "Add variable"
-msgstr "变量"
+msgstr "添加变量"
 
 #: ../plcopen/iec_std.csv:33
 msgid "Addition"
 msgstr "加法"
 
-#: ../plcopen/structures.py:250
+#: ../plcopen/definitions.py:51
 msgid "Additional function blocks"
 msgstr "附加功能类型"
 
-#: ../editors/Viewer.py:1395
+#: ../editors/Viewer.py:669
+msgid "Adjust Block Size"
+msgstr "调整块尺寸"
+
+#: ../editors/Viewer.py:1720
 msgid "Alignment"
 msgstr "对准"
 
-#: ../controls/VariablePanel.py:75
-#: ../dialogs/BrowseLocationsDialog.py:35
-#: ../dialogs/BrowseLocationsDialog.py:116
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:53
+#: ../dialogs/BrowseLocationsDialog.py:152
+#: ../dialogs/BrowseLocationsDialog.py:155 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:88
 msgid "All"
 msgstr "所有"
 
-#: ../editors/FileManagementPanel.py:35
-#, fuzzy
+#: ../editors/FileManagementPanel.py:37
 msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
-msgstr "ST 文件 (*.st)|*.st|所有文件|*.*"
-
-#: ../ProjectController.py:1335
+msgstr "所有文件 (*.*)|*.*|CSV 文件 (*.csv)|*.csv"
+
+#: ../ProjectController.py:1670
 msgid "Already connected. Please disconnect\n"
 msgstr "已经连接。请断开连接\n"
 
-#: ../editors/DataTypeEditor.py:587
+#: ../editors/DataTypeEditor.py:607
 #, python-format
 msgid "An element named \"%s\" already exists in this structure!"
 msgstr "一个以\"%s\"命名的元素已经在这个结构中存在!"
 
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr "相同名称的实例已经存在!"
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr "应用名称修改到所有伴随相同名称的延续"
+
 #: ../plcopen/iec_std.csv:31
 msgid "Arc cosine"
 msgstr "反余弦"
@@ -664,8 +619,8 @@
 msgid "Arithmetic"
 msgstr "运算"
 
-#: ../controls/VariablePanel.py:729
-#: ../editors/DataTypeEditor.py:52
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:872
 msgid "Array"
 msgstr "阵列的"
 
@@ -673,49 +628,37 @@
 msgid "Assignment"
 msgstr "分配"
 
-#: ../dialogs/FBDVariableDialog.py:197
+#: ../dialogs/FBDVariableDialog.py:226
 msgid "At least a variable or an expression must be selected!"
 msgstr "至少选择一个变量或者表达式!"
 
-#: ../controls/ProjectPropertiesPanel.py:99
+#: ../controls/ProjectPropertiesPanel.py:111
 msgid "Author"
 msgstr "作者"
 
-#: ../controls/ProjectPropertiesPanel.py:96
+#: ../controls/ProjectPropertiesPanel.py:108
 msgid "Author Name (optional):"
 msgstr "作者姓名(选填):"
 
-#: ../dialogs/FindInPouDialog.py:72
+#: ../dialogs/FindInPouDialog.py:80
 msgid "Backward"
-msgstr ""
-
-#: ../util/Zeroconf.py:599
-msgid "Bad domain name (circular) at "
-msgstr ""
-
-#: ../util/Zeroconf.py:602
-msgid "Bad domain name at "
-msgstr ""
-
-#: ../canfestival/config_utils.py:341
-#: ../canfestival/config_utils.py:623
+msgstr "反向"
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
 #, python-format
 msgid "Bad location size : %s"
 msgstr "不好的位置大小:%s"
 
-#: ../editors/DataTypeEditor.py:168
-#: ../editors/DataTypeEditor.py:198
-#: ../editors/DataTypeEditor.py:290
-#: ../dialogs/ArrayTypeDialog.py:55
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
 msgid "Base Type:"
 msgstr "基类型:"
 
-#: ../controls/VariablePanel.py:699
-#: ../editors/DataTypeEditor.py:617
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:830
 msgid "Base Types"
 msgstr "基类型"
 
-#: ../Beremiz.py:486
+#: ../BeremizIDE.py:483
 msgid "Beremiz"
 msgstr "Beremiz"
 
@@ -747,146 +690,173 @@
 msgid "Bitwise inverting"
 msgstr "按位“反向”"
 
-#: ../editors/Viewer.py:465
-#, fuzzy
+#: ../editors/Viewer.py:621 ../editors/Viewer.py:2440
 msgid "Block"
-msgstr "编辑块"
-
-#: ../dialogs/FBDBlockDialog.py:38
+msgstr "块"
+
+#: ../dialogs/FBDBlockDialog.py:63
 msgid "Block Properties"
 msgstr "块属性"
 
-#: ../editors/Viewer.py:434
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr "块名称"
+
+#: ../editors/Viewer.py:586
 msgid "Bottom"
 msgstr "底部"
 
-#: ../dialogs/BrowseValuesLibraryDialog.py:37
+#: ../ProjectController.py:1400
+msgid "Broken"
+msgstr "损坏"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
 #, python-format
 msgid "Browse %s values library"
-msgstr ""
-
-#: ../dialogs/BrowseLocationsDialog.py:55
-#, fuzzy
+msgstr "浏览 %s 值库"
+
+#: ../dialogs/BrowseLocationsDialog.py:72
 msgid "Browse Locations"
-msgstr "位置"
-
-#: ../ProjectController.py:1484
+msgstr "浏览定位"
+
+#: ../ProjectController.py:1815
 msgid "Build"
 msgstr "构建"
 
-#: ../ProjectController.py:1051
+#: ../ProjectController.py:1335
 msgid "Build directory already clean\n"
 msgstr "构建目录已经清除\n"
 
-#: ../ProjectController.py:1485
+#: ../ProjectController.py:1816
 msgid "Build project into build folder"
 msgstr "在构建文件夹中构建项目"
 
-#: ../ProjectController.py:910
+#: ../ProjectController.py:1108
 msgid "C Build crashed !\n"
 msgstr "C构建损坏!\n"
 
-#: ../ProjectController.py:907
+#: ../ProjectController.py:1105
 msgid "C Build failed.\n"
 msgstr "C构建失败。\n"
 
-#: ../ProjectController.py:895
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr "C 代码"
+
+#: ../ProjectController.py:1186
 msgid "C code generated successfully.\n"
 msgstr "C代码生成成功。\n"
 
-#: ../targets/toolchain_gcc.py:132
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr "C编译失败。\n"
+
+#: ../targets/toolchain_gcc.py:199
 #, python-format
 msgid "C compilation of %s failed.\n"
 msgstr " %s 的C编译失败。\n"
 
-#: ../features.py:7
-#, fuzzy
+#: ../features.py:33
 msgid "C extension"
 msgstr "C扩展"
 
-#: ../features.py:6
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr "C&redits"
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr "CANOpen 网络"
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr "CANOpen 从站"
+
+#: ../features.py:31
 msgid "CANopen support"
-msgstr ""
-
-#: ../plcopen/plcopen.py:1722
-#: ../plcopen/plcopen.py:1736
-#: ../plcopen/plcopen.py:1757
-#: ../plcopen/plcopen.py:1773
+msgstr "CANOpen 支持"
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
 msgid "Can only generate execution order on FBD networks!"
 msgstr "在功能块网络,只能生成执行命令!"
 
-#: ../controls/VariablePanel.py:256
+#: ../controls/VariablePanel.py:291
 msgid "Can only give a location to local or global variables"
 msgstr "只能影响本地或全局变量的位置"
 
-#: ../PLCOpenEditor.py:357
+#: ../PLCOpenEditor.py:318
 #, python-format
 msgid "Can't generate program to file %s!"
 msgstr "这个编程生成文件失败 %s!"
 
-#: ../controls/VariablePanel.py:254
+#: ../controls/VariablePanel.py:289
 msgid "Can't give a location to a function block instance"
 msgstr "不能影响功能块实例的位置"
 
-#: ../PLCOpenEditor.py:397
+#: ../PLCOpenEditor.py:363
 #, python-format
 msgid "Can't save project to file %s!"
 msgstr "这个项目保存为文件失败 %s!"
 
-#: ../controls/VariablePanel.py:298
-#, fuzzy
+#: ../controls/VariablePanel.py:339
 msgid "Can't set an initial value to a function block instance"
-msgstr "不能影响功能块实例的位置"
-
-#: ../ConfigTreeNode.py:470
-#, python-format
-msgid "Cannot create child %s of type %s "
-msgstr "无法新建分支 %s 类型 %s "
-
-#: ../ConfigTreeNode.py:400
+msgstr "不能设置一个初始值到一个功能块实例"
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr "不能创建类型 {a2} 的子类型 {a1} "
+
+#: ../ConfigTreeNode.py:454
 #, python-format
 msgid "Cannot find lower free IEC channel than %d\n"
 msgstr "无法找到比 %d 更低的自由的IEC通道\n"
 
-#: ../connectors/PYRO/__init__.py:92
+#: ../connectors/PYRO/__init__.py:139
 msgid "Cannot get PLC status - connection failed.\n"
 msgstr "无法获取PLC的状态 - 连接失败。\n"
 
-#: ../ProjectController.py:715
+#: ../ProjectController.py:967
 msgid "Cannot open/parse VARIABLES.csv!\n"
 msgstr "无法打开/解析 VARIABLES.csv!\n"
 
-#: ../canfestival/config_utils.py:371
-#, python-format
-msgid "Cannot set bit offset for non bool '%s' variable (ID:%d,Idx:%x,sIdx:%x))"
-msgstr "无法设定位抵消非布尔 '%s' variable (ID:%d,Idx:%x,sIdx:%x)) "
-
-#: ../dialogs/FindInPouDialog.py:81
-#: ../dialogs/SearchInProjectDialog.py:67
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid ""
+"Cannot set bit offset for non bool '{a1}' variable "
+"(ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr "不能设置位偏移对于非布尔 '{a1}' 变量 (ID:{a2},Idx:{a3},sIdx:{a4}))"
+
+#: ../ProjectController.py:1761
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr "在PLC运行时,不能传输!现在停止运行吗?"
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
 msgid "Case sensitive"
-msgstr ""
-
-#: ../editors/Viewer.py:429
+msgstr "区分大小写"
+
+#: ../editors/Viewer.py:581
 msgid "Center"
 msgstr "中"
 
-#: ../Beremiz_service.py:322
+#: ../Beremiz_service.py:276
 msgid "Change IP of interface to bind"
 msgstr "更改界面的ip用以绑定"
 
-#: ../Beremiz_service.py:321
+#: ../Beremiz_service.py:275
 msgid "Change Name"
 msgstr "更改名字"
 
-#: ../IDEFrame.py:1974
+#: ../IDEFrame.py:1977
 msgid "Change POU Type To"
 msgstr "将POU类型转换为"
 
-#: ../Beremiz_service.py:325
+#: ../Beremiz_service.py:277
 msgid "Change Port Number"
 msgstr "更改端口号"
 
-#: ../Beremiz_service.py:327
+#: ../Beremiz_service.py:278
 msgid "Change working directory"
 msgstr "更改工作目录"
 
@@ -894,124 +864,119 @@
 msgid "Character string"
 msgstr "字符串"
 
-#: ../svgui/svgui.py:92
+#: ../svgui/svgui.py:136
 msgid "Choose a SVG file"
 msgstr "选择一个SVG文件"
 
-#: ../ProjectController.py:353
-#, fuzzy
+#: ../ProjectController.py:561
 msgid "Choose a directory to save project"
-msgstr "选择一个项目"
-
-#: ../canfestival/canfestival.py:118
-#: ../PLCOpenEditor.py:313
-#: ../PLCOpenEditor.py:347
-#: ../PLCOpenEditor.py:391
+msgstr "选择一个目录保存项目"
+
+#: ../canfestival/canfestival.py:171 ../PLCOpenEditor.py:276
+#: ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
 msgid "Choose a file"
 msgstr "选择一个文件"
 
-#: ../Beremiz.py:831
-#: ../Beremiz.py:866
+#: ../BeremizIDE.py:900
 msgid "Choose a project"
 msgstr "选择一个项目"
 
-#: ../dialogs/BrowseValuesLibraryDialog.py:42
-#, fuzzy, python-format
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
 msgid "Choose a value for %s:"
-msgstr "选择一个文件"
-
-#: ../Beremiz_service.py:373
+msgstr "这对 %s选择一个值:"
+
+#: ../Beremiz_service.py:333
 msgid "Choose a working directory "
 msgstr "选择一个工作目录"
 
-#: ../ProjectController.py:281
+#: ../BeremizIDE.py:864
+msgid "Choose an empty directory for new project"
+msgstr "选择一个空白目录以保存项目"
+
+#: ../ProjectController.py:468
 msgid "Chosen folder doesn't contain a program. It's not a valid project!"
 msgstr "被选中的文件夹未包含一个程序。它不是一个有效项目!"
 
-#: ../ProjectController.py:247
+#: ../ProjectController.py:435
 msgid "Chosen folder isn't empty. You can't use it for a new project!"
 msgstr "被选中的文件夹非空。你不能用它创建一个新项目!"
 
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
+#: ../controls/VariablePanel.py:60
 msgid "Class"
 msgstr "分类"
 
-#: ../controls/VariablePanel.py:369
+#: ../controls/VariablePanel.py:472
 msgid "Class Filter:"
 msgstr "类过滤器:"
 
-#: ../dialogs/FBDVariableDialog.py:62
+#: ../dialogs/FBDVariableDialog.py:74
 msgid "Class:"
 msgstr "分类:"
 
-#: ../ProjectController.py:1488
+#: ../ProjectController.py:1821
 msgid "Clean"
 msgstr "清除"
 
-#: ../ProjectController.py:1490
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr "清楚记录信息"
+
+#: ../ProjectController.py:1822
 msgid "Clean project build folder"
 msgstr "清除项目构建目录"
 
-#: ../ProjectController.py:1048
+#: ../ProjectController.py:1332
 msgid "Cleaning the build directory\n"
 msgstr "清除构建目录\n"
 
-#: ../IDEFrame.py:411
-#, fuzzy
+#: ../IDEFrame.py:437
 msgid "Clear Errors"
-msgstr "清除错误\tCTRL+K"
-
-#: ../editors/Viewer.py:520
+msgstr "清楚错误"
+
+#: ../editors/Viewer.py:680
 msgid "Clear Execution Order"
 msgstr "清空执行命令"
 
-#: ../editors/GraphicViewer.py:125
-msgid "Clear the graph values"
-msgstr ""
-
-#: ../Beremiz.py:598
-#: ../PLCOpenEditor.py:221
-#, fuzzy
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+msgid "Close"
+msgstr "关闭"
+
+#: ../BeremizIDE.py:627 ../PLCOpenEditor.py:183
 msgid "Close Application"
-msgstr ""
-"#-#-#-#-#  Beremiz_zh_CN.po (PACKAGE VERSION)  #-#-#-#-#\n"
-"关闭应用\n"
-"#-#-#-#-#  PLCOpenEditor_zh_CN.po (PACKAGE VERSION)  #-#-#-#-#\n"
-"关闭应用程序"
-
-#: ../IDEFrame.py:1089
-#: ../Beremiz.py:319
-#: ../Beremiz.py:552
-#: ../PLCOpenEditor.py:131
-#, fuzzy
+msgstr "关闭应用"
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:566 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1040
 msgid "Close Project"
-msgstr ""
-"#-#-#-#-#  Beremiz_zh_CN.po (PACKAGE VERSION)  #-#-#-#-#\n"
-"关闭项目\n"
-"#-#-#-#-#  PLCOpenEditor_zh_CN.po (PACKAGE VERSION)  #-#-#-#-#\n"
-"关闭程序"
-
-#: ../Beremiz.py:317
-#: ../PLCOpenEditor.py:129
-#, fuzzy
+msgstr "关闭项目"
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
 msgid "Close Tab"
-msgstr "关闭当前"
-
-#: ../editors/Viewer.py:481
+msgstr "关闭标签"
+
+#: ../editors/Viewer.py:638 ../editors/Viewer.py:2448
 msgid "Coil"
-msgstr ""
-
-#: ../editors/Viewer.py:501
-#: ../editors/LDViewer.py:503
+msgstr "线圈"
+
+#: ../editors/Viewer.py:659 ../editors/LDViewer.py:517
 msgid "Comment"
 msgstr "注释"
 
-#: ../controls/ProjectPropertiesPanel.py:94
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr "社区支持"
+
+#: ../dialogs/ProjectDialog.py:65
+msgid "Company Name"
+msgstr "公司名称"
+
+#: ../controls/ProjectPropertiesPanel.py:106
 msgid "Company Name (required):"
 msgstr "公司名字(必须):"
 
-#: ../controls/ProjectPropertiesPanel.py:95
+#: ../controls/ProjectPropertiesPanel.py:107
 msgid "Company URL (optional):"
 msgstr "公司网址(选填):"
 
@@ -1019,7 +984,7 @@
 msgid "Comparison"
 msgstr "比较"
 
-#: ../ProjectController.py:538
+#: ../ProjectController.py:756
 msgid "Compiling IEC Program into C code...\n"
 msgstr "正在将IEC程序编译成C代码...\n"
 
@@ -1027,73 +992,93 @@
 msgid "Concatenation"
 msgstr "级联"
 
-#: ../dialogs/SearchInProjectDialog.py:47
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr "配置"
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr "配置变量"
+
+#: ../dialogs/SearchInProjectDialog.py:43
 msgid "Configuration"
 msgstr "配置"
 
-#: ../PLCControler.py:96
+#: ../plcopen/types_enums.py:77
 msgid "Configurations"
 msgstr "配置"
 
-#: ../ProjectController.py:1503
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:354
+msgid "Confirm or change variable name"
+msgstr "确认或变更变量名称"
+
+#: ../ProjectController.py:1842
 msgid "Connect"
 msgstr "连接"
 
-#: ../ProjectController.py:1504
+#: ../ProjectController.py:1843
 msgid "Connect to the target PLC"
 msgstr "连接到PLC目标"
 
-#: ../connectors/PYRO/__init__.py:40
-#, python-format
-msgid "Connecting to URI : %s\n"
-msgstr "连接到URI: %s!\n"
-
-#: ../editors/Viewer.py:467
-#: ../dialogs/SFCTransitionDialog.py:76
+#: ../ProjectController.py:1391
+#, python-format
+msgid "Connected to URI: %s"
+msgstr "连接到URI: %s"
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:623
+#: ../editors/Viewer.py:2441
 msgid "Connection"
 msgstr "连接"
 
-#: ../dialogs/ConnectionDialog.py:37
+#: ../dialogs/ConnectionDialog.py:55
 msgid "Connection Properties"
 msgstr "连接属性"
 
-#: ../ProjectController.py:1359
-#, fuzzy
+#: ../ProjectController.py:1691
 msgid "Connection canceled!\n"
-msgstr "连接失败 %s!\n"
-
-#: ../ProjectController.py:1384
+msgstr "取消连接!\n"
+
+#: ../ProjectController.py:1714
 #, python-format
 msgid "Connection failed to %s!\n"
 msgstr "连接失败 %s!\n"
 
-#: ../connectors/PYRO/__init__.py:63
-#, fuzzy, python-format
+#: ../connectors/PYRO/__init__.py:123 ../connectors/WAMP/__init__.py:120
+msgid "Connection lost!\n"
+msgstr "失去连接!\n"
+
+#: ../connectors/PYRO/__init__.py:110
+#, python-format
 msgid "Connection to '%s' failed.\n"
-msgstr " %s 的C编译失败。\n"
-
-#: ../dialogs/ConnectionDialog.py:56
+msgstr "连接到 '%s' 失败。\n"
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1676
 msgid "Connector"
 msgstr "连接"
 
-#: ../dialogs/SFCStepDialog.py:58
+#: ../dialogs/SFCStepDialog.py:68
 msgid "Connectors:"
 msgstr "连接:"
 
-#: ../controls/VariablePanel.py:65
+#: ../BeremizIDE.py:378
+msgid "Console"
+msgstr "控制台"
+
+#: ../controls/VariablePanel.py:75
 msgid "Constant"
 msgstr "常量"
 
-#: ../editors/Viewer.py:477
-#, fuzzy
+#: ../editors/Viewer.py:634 ../editors/Viewer.py:2444
 msgid "Contact"
-msgstr "连续"
-
-#: ../controls/ProjectPropertiesPanel.py:197
+msgstr "连接"
+
+#: ../controls/ProjectPropertiesPanel.py:217
 msgid "Content Description (optional):"
 msgstr "内容描述(选填):"
 
-#: ../dialogs/ConnectionDialog.py:61
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1677
 msgid "Continuation"
 msgstr "连续"
 
@@ -1113,197 +1098,184 @@
 msgid "Conversion to time-of-day"
 msgstr "转换为日期时间"
 
-#: ../IDEFrame.py:348
-#: ../IDEFrame.py:401
-#: ../editors/Viewer.py:536
+#: ../editors/Viewer.py:695 ../controls/LogViewer.py:713 ../IDEFrame.py:372
+#: ../IDEFrame.py:427
 msgid "Copy"
-msgstr ""
-
-#: ../IDEFrame.py:1961
+msgstr "复制"
+
+#: ../IDEFrame.py:1964
 msgid "Copy POU"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:283
+msgstr "复制POU"
+
+#: ../editors/FileManagementPanel.py:68
 msgid "Copy file from left folder to right"
-msgstr ""
-
-#: ../editors/FileManagementPanel.py:282
+msgstr "从左侧文件夹中复制文件到右侧"
+
+#: ../editors/FileManagementPanel.py:67
 msgid "Copy file from right folder to left"
-msgstr ""
+msgstr "从右侧文件夹中复制文件到左侧"
 
 #: ../plcopen/iec_std.csv:28
 msgid "Cosine"
 msgstr "余弦"
 
-#: ../ConfigTreeNode.py:582
-#, python-format
-msgid ""
-"Could not add child \"%s\", type %s :\n"
-"%s\n"
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
 msgstr ""
-"无法添加分支 \"%s\", type %s :\n"
-"%s\n"
-
-#: ../ConfigTreeNode.py:559
-#, fuzzy, python-format
-msgid ""
-"Couldn't load confnode base parameters %s :\n"
-" %s"
+"不能增加子 \"{a1}\",类型 {a2} :\n"
+"{a3}\n"
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr "不能导入旧 %s 文件。"
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
 msgstr ""
-"无法下载插件基本参数 %s :\n"
-" %s"
-
-#: ../ConfigTreeNode.py:570
-#, fuzzy, python-format
-msgid ""
-"Couldn't load confnode parameters %s :\n"
-" %s"
+"不能加载 confnode 基础参数 {a1} :\n"
+" {a2}"
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
 msgstr ""
-"无法下载插件参数  %s :\n"
-" %s"
-
-#: ../PLCControler.py:765
-#: ../PLCControler.py:802
+"不能加载 confnode 参数 {a1} :\n"
+" {a2}"
+
+#: ../PLCControler.py:552
 msgid "Couldn't paste non-POU object."
-msgstr ""
-
-#: ../ProjectController.py:1317
+msgstr "不能粘贴 非-POU 目标。"
+
+#: ../ProjectController.py:1636
 msgid "Couldn't start PLC !\n"
 msgstr "无法开始PLC!\n"
 
-#: ../ProjectController.py:1325
+#: ../ProjectController.py:1644
 msgid "Couldn't stop PLC !\n"
 msgstr "无法停止PLC!\n"
 
-#: ../ProjectController.py:1295
-#, fuzzy
-msgid "Couldn't stop debugger.\n"
-msgstr "无法开始PLC调试!\n"
-
-#: ../svgui/svgui.py:22
+#: ../svgui/svgui.py:57
 msgid "Create HMI"
-msgstr ""
-
-#: ../dialogs/PouDialog.py:43
+msgstr "新建 HMI"
+
+#: ../dialogs/PouDialog.py:54
 msgid "Create a new POU"
 msgstr "新建一个POU"
 
-#: ../dialogs/PouActionDialog.py:38
+#: ../dialogs/PouActionDialog.py:45
 msgid "Create a new action"
-msgstr "新建一个行动"
-
-#: ../IDEFrame.py:135
+msgstr "新建一个动作"
+
+#: ../IDEFrame.py:166
 msgid "Create a new action block"
-msgstr "新建一个作用块"
-
-#: ../IDEFrame.py:84
-#: ../IDEFrame.py:114
-#: ../IDEFrame.py:147
+msgstr "新建一个动作控制功能块"
+
+#: ../IDEFrame.py:115 ../IDEFrame.py:145 ../IDEFrame.py:178
 msgid "Create a new block"
 msgstr "新建一个块"
 
-#: ../IDEFrame.py:108
+#: ../IDEFrame.py:139
 msgid "Create a new branch"
 msgstr "新建一个支流"
 
-#: ../IDEFrame.py:102
+#: ../IDEFrame.py:133
 msgid "Create a new coil"
 msgstr "新建一个线圈"
 
-#: ../IDEFrame.py:78
-#: ../IDEFrame.py:93
-#: ../IDEFrame.py:123
+#: ../IDEFrame.py:109 ../IDEFrame.py:124 ../IDEFrame.py:154
 msgid "Create a new comment"
 msgstr "新建一个备注"
 
-#: ../IDEFrame.py:87
-#: ../IDEFrame.py:117
-#: ../IDEFrame.py:150
+#: ../IDEFrame.py:118 ../IDEFrame.py:148 ../IDEFrame.py:181
 msgid "Create a new connection"
 msgstr "新建一个连接"
 
-#: ../IDEFrame.py:105
-#: ../IDEFrame.py:156
+#: ../IDEFrame.py:136 ../IDEFrame.py:187
 msgid "Create a new contact"
 msgstr "新建一个接触点"
 
-#: ../IDEFrame.py:138
+#: ../IDEFrame.py:169
 msgid "Create a new divergence"
 msgstr "新建一个发散"
 
-#: ../dialogs/SFCDivergenceDialog.py:36
+#: ../dialogs/SFCDivergenceDialog.py:54
 msgid "Create a new divergence or convergence"
 msgstr "新建一个发散或者收敛"
 
-#: ../IDEFrame.py:126
+#: ../IDEFrame.py:157
 msgid "Create a new initial step"
 msgstr "新建一个初始步骤"
 
-#: ../IDEFrame.py:141
+#: ../IDEFrame.py:172
 msgid "Create a new jump"
 msgstr "新建一个跳跃"
 
-#: ../IDEFrame.py:96
-#: ../IDEFrame.py:153
+#: ../IDEFrame.py:127 ../IDEFrame.py:184
 msgid "Create a new power rail"
 msgstr "新建一个电源导轨"
 
-#: ../IDEFrame.py:99
+#: ../IDEFrame.py:130
 msgid "Create a new rung"
 msgstr "新建一个梯级"
 
-#: ../IDEFrame.py:129
+#: ../IDEFrame.py:160
 msgid "Create a new step"
 msgstr "新建一个步骤"
 
-#: ../IDEFrame.py:132
-#: ../dialogs/PouTransitionDialog.py:42
+#: ../dialogs/PouTransitionDialog.py:49 ../IDEFrame.py:163
 msgid "Create a new transition"
 msgstr "新建一个跃迁"
 
-#: ../IDEFrame.py:81
-#: ../IDEFrame.py:111
-#: ../IDEFrame.py:144
+#: ../IDEFrame.py:112 ../IDEFrame.py:142 ../IDEFrame.py:175
 msgid "Create a new variable"
 msgstr "新建一个变量"
 
-#: ../IDEFrame.py:346
-#: ../IDEFrame.py:400
-#: ../editors/Viewer.py:535
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr "关于作者"
+
+#: ../Beremiz_service.py:424
+msgid "Current working directory :"
+msgstr "当前工作目录:"
+
+#: ../editors/Viewer.py:694 ../IDEFrame.py:370 ../IDEFrame.py:426
 msgid "Cut"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:71
+msgstr "剪切"
+
+#: ../editors/ResourceEditor.py:81
 msgid "Cyclic"
-msgstr ""
-
-#: ../plcopen/iec_std.csv:42
-#: ../plcopen/iec_std.csv:44
-#: ../plcopen/iec_std.csv:46
-#: ../plcopen/iec_std.csv:50
-#: ../plcopen/iec_std.csv:52
-#: ../plcopen/iec_std.csv:54
-#: ../plcopen/iec_std.csv:56
-#: ../plcopen/iec_std.csv:58
+msgstr "循环"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
 #: ../plcopen/iec_std.csv:60
 msgid "DEPRECATED"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:50
-#: ../canfestival/NetworkEditor.py:80
+msgstr "DEPRECATED"
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
 msgid "DS-301 Profile"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:51
-#: ../canfestival/NetworkEditor.py:81
+msgstr "DS-301 配置"
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
 msgid "DS-302 Profile"
-msgstr ""
-
-#: ../dialogs/SearchInProjectDialog.py:43
+msgstr "DS-302 配置"
+
+#: ../dialogs/SearchInProjectDialog.py:39
 msgid "Data Type"
 msgstr "数据类型"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:76
 msgid "Data Types"
 msgstr "数据类型 "
 
@@ -1311,89 +1283,71 @@
 msgid "Data type conversion"
 msgstr "日期类型转换"
 
-#: ../plcopen/iec_std.csv:44
-#: ../plcopen/iec_std.csv:45
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
 msgid "Date addition"
 msgstr "日期加法"
 
-#: ../plcopen/iec_std.csv:56
-#: ../plcopen/iec_std.csv:57
-#: ../plcopen/iec_std.csv:58
-#: ../plcopen/iec_std.csv:59
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
 msgid "Date and time subtraction"
 msgstr "日期和时间减法"
 
-#: ../plcopen/iec_std.csv:50
-#: ../plcopen/iec_std.csv:51
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
 msgid "Date subtraction"
 msgstr "日期减法"
 
-#: ../dialogs/DurationEditorDialog.py:43
+#: ../dialogs/DurationEditorDialog.py:46
 msgid "Days:"
-msgstr ""
-
-#: ../ProjectController.py:1405
-msgid "Debug connect matching running PLC\n"
-msgstr ""
-
-#: ../ProjectController.py:1408
-msgid "Debug do not match PLC - stop/transfert/start to re-enable\n"
-msgstr ""
-
-#: ../controls/PouInstanceVariablesPanel.py:52
-#, fuzzy
+msgstr "日:"
+
+#: ../ProjectController.py:1729
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr "调试部匹配PLC  -  停止/传输/启动 来新启用\n"
+
+#: ../controls/PouInstanceVariablesPanel.py:144
 msgid "Debug instance"
-msgstr "删除实例"
-
-#: ../editors/Viewer.py:3222
-#, fuzzy, python-format
+msgstr "调试实例"
+
+#: ../editors/Viewer.py:490
+#, python-format
 msgid "Debug: %s"
-msgstr "调试"
-
-#: ../ProjectController.py:1122
-#, fuzzy, python-format
+msgstr "调试:%s"
+
+#: ../ProjectController.py:1471
+#, python-format
 msgid "Debug: Unknown variable '%s'\n"
-msgstr "调试 :未知变量 %s\n"
-
-#: ../ProjectController.py:1120
+msgstr "调试:未知变量 '%s'\n"
+
+#: ../ProjectController.py:1469
 #, python-format
 msgid "Debug: Unsupported type to debug '%s'\n"
-msgstr ""
-
-#: ../IDEFrame.py:608
-#, fuzzy
+msgstr "调试:不支持的类型进行调试 '%s'\n"
+
+#: ../IDEFrame.py:660
 msgid "Debugger"
-msgstr "调试"
-
-#: ../ProjectController.py:1285
-msgid "Debugger disabled\n"
-msgstr "调试器禁用\n"
-
-#: ../ProjectController.py:1297
-#, fuzzy
-msgid "Debugger stopped.\n"
-msgstr "调试器禁用\n"
-
-#: ../IDEFrame.py:1990
-#: ../Beremiz.py:958
-#: ../editors/Viewer.py:511
+msgstr "调试器"
+
+#: ../ProjectController.py:1726
+msgid "Debugger ready\n"
+msgstr "调试器准备好\n"
+
+#: ../BeremizIDE.py:1004 ../editors/Viewer.py:670 ../IDEFrame.py:1993
 msgid "Delete"
 msgstr "删除"
 
-#: ../editors/Viewer.py:454
+#: ../editors/Viewer.py:610
 msgid "Delete Divergence Branch"
 msgstr "删除发散分支"
 
-#: ../editors/FileManagementPanel.py:371
-#, fuzzy
+#: ../editors/FileManagementPanel.py:157
 msgid "Delete File"
-msgstr "删除项目"
-
-#: ../editors/Viewer.py:443
+msgstr "删除文件"
+
+#: ../editors/Viewer.py:597
 msgid "Delete Wire Segment"
 msgstr "删除布线段"
 
-#: ../controls/CustomEditableListBox.py:41
+#: ../controls/CustomEditableListBox.py:44
 msgid "Delete item"
 msgstr "删除项目"
 
@@ -1401,188 +1355,168 @@
 msgid "Deletion (within)"
 msgstr "删除"
 
-#: ../editors/DataTypeEditor.py:146
+#: ../editors/DataTypeEditor.py:161
 msgid "Derivation Type:"
 msgstr "推导类型:"
 
-#: ../plcopen/structures.py:264
-msgid ""
-"Derivative\n"
-"The derivative function block produces an output XOUT proportional to the rate of change of the input XIN."
-msgstr ""
-"导数\n"
-"导数功能块根据输入XIN的速率的变化而按比例的生产输出XOUT。"
-
-#: ../controls/VariablePanel.py:360
-#, fuzzy
+#: ../editors/CodeFileEditor.py:735
+msgid "Description"
+msgstr "描述"
+
+#: ../controls/VariablePanel.py:463
 msgid "Description:"
-msgstr "定位:"
-
-#: ../editors/DataTypeEditor.py:314
-#: ../dialogs/ArrayTypeDialog.py:61
+msgstr "描述:"
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
 msgid "Dimensions:"
 msgstr "维数:"
 
-#: ../dialogs/FindInPouDialog.py:61
-#, fuzzy
+#: ../dialogs/FindInPouDialog.py:69
 msgid "Direction"
-msgstr "直接的"
-
-#: ../dialogs/BrowseLocationsDialog.py:78
-#, fuzzy
+msgstr "方向"
+
+#: ../dialogs/BrowseLocationsDialog.py:102
 msgid "Direction:"
-msgstr "直接的"
-
-#: ../editors/DataTypeEditor.py:52
+msgstr "方向:"
+
+#: ../editors/DataTypeEditor.py:60
 msgid "Directly"
 msgstr "直接的"
 
-#: ../ProjectController.py:1512
+#: ../ProjectController.py:1855
 msgid "Disconnect"
 msgstr "断开"
 
-#: ../ProjectController.py:1514
+#: ../ProjectController.py:1856
 msgid "Disconnect from PLC"
 msgstr "从PLC断开"
 
-#: ../editors/Viewer.py:496
-#, fuzzy
+#: ../ProjectController.py:1401
+msgid "Disconnected"
+msgstr "已断开"
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2436
 msgid "Divergence"
-msgstr "选择发散"
+msgstr "偏差"
 
 #: ../plcopen/iec_std.csv:36
 msgid "Division"
 msgstr "除法"
 
-#: ../editors/FileManagementPanel.py:370
+#: ../editors/FileManagementPanel.py:156
 #, python-format
 msgid "Do you really want to delete the file '%s'?"
-msgstr ""
-
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
-#, fuzzy
+msgstr "你真的想删除这个文件 '%s' ?"
+
+#: ../controls/VariablePanel.py:65
 msgid "Documentation"
-msgstr "级联"
-
-#: ../PLCOpenEditor.py:351
+msgstr "文档"
+
+#: ../PLCOpenEditor.py:312
 msgid "Done"
 msgstr "完成"
 
-#: ../plcopen/structures.py:227
-msgid ""
-"Down-counter\n"
-"The down-counter can be used to signal when a count has reached zero, on counting down from a preset value."
-msgstr ""
-"倒计时器\n"
-"倒计时器用于当计数到达 0的时候,从当前值开始倒计时。"
-
-#: ../dialogs/ActionBlockDialog.py:37
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Duration"
 msgstr "时间"
 
-#: ../canfestival/canfestival.py:118
-#, fuzzy
+#: ../canfestival/canfestival.py:174
 msgid "EDS files (*.eds)|*.eds|All files|*.*"
-msgstr "ST 文件 (*.st)|*.st|所有文件|*.*"
-
-#: ../editors/Viewer.py:510
+msgstr "EDS 文件 (*.eds)|*.eds|All files|*.*"
+
+#: ../editors/Viewer.py:668
 msgid "Edit Block"
 msgstr "编辑块"
 
-#: ../dialogs/LDElementDialog.py:41
+#: ../dialogs/LDElementDialog.py:58
 msgid "Edit Coil Values"
 msgstr "编辑线圈值"
 
-#: ../dialogs/LDElementDialog.py:38
+#: ../dialogs/LDElementDialog.py:56
 msgid "Edit Contact Values"
 msgstr "编辑接触点值"
 
-#: ../dialogs/DurationEditorDialog.py:59
-#, fuzzy
+#: ../dialogs/DurationEditorDialog.py:62
 msgid "Edit Duration"
-msgstr "编辑跃迁"
-
-#: ../dialogs/SFCStepDialog.py:35
+msgstr "编辑期间"
+
+#: ../dialogs/SFCStepDialog.py:53
 msgid "Edit Step"
 msgstr "编辑步骤"
 
-#: ../wxglade_hmi/wxglade_hmi.py:12
+#: ../wxglade_hmi/wxglade_hmi.py:45
 msgid "Edit a WxWidgets GUI with WXGlade"
 msgstr "用 WXGlade 编辑一个 WxWidgets 用户图形界面"
 
-#: ../dialogs/ActionBlockDialog.py:122
+#: ../dialogs/ActionBlockDialog.py:127
 msgid "Edit action block properties"
 msgstr "编辑行动块属性"
 
-#: ../dialogs/ArrayTypeDialog.py:45
-#, fuzzy
+#: ../dialogs/ArrayTypeDialog.py:47
 msgid "Edit array type properties"
-msgstr "编辑行动块属性"
-
-#: ../editors/Viewer.py:2112
-#: ../editors/Viewer.py:2114
-#: ../editors/Viewer.py:2630
-#: ../editors/Viewer.py:2632
+msgstr "编辑数组类型属性"
+
+#: ../editors/Viewer.py:2660 ../editors/Viewer.py:3102
 msgid "Edit comment"
 msgstr "编辑注释"
 
-#: ../editors/FileManagementPanel.py:284
-#, fuzzy
+#: ../editors/FileManagementPanel.py:69
 msgid "Edit file"
-msgstr "编辑C文件"
-
-#: ../controls/CustomEditableListBox.py:39
+msgstr "编辑文件"
+
+#: ../controls/CustomEditableListBox.py:42
 msgid "Edit item"
 msgstr "编辑项目"
 
-#: ../editors/Viewer.py:2594
+#: ../editors/Viewer.py:3059
 msgid "Edit jump target"
 msgstr "编辑跳跃目标"
 
-#: ../ProjectController.py:1526
+#: ../ProjectController.py:1873
 msgid "Edit raw IEC code added to code generated by PLCGenerator"
 msgstr "编辑原始的IEC代码添加至PLCGenerator生成的代码"
 
-#: ../editors/SFCViewer.py:725
+#: ../editors/SFCViewer.py:815
 msgid "Edit step name"
 msgstr "编辑步骤名称"
 
-#: ../dialogs/SFCTransitionDialog.py:38
+#: ../dialogs/SFCTransitionDialog.py:53
 msgid "Edit transition"
 msgstr "编辑跃迁"
 
-#: ../IDEFrame.py:580
+#: ../IDEFrame.py:632
 msgid "Editor ToolBar"
-msgstr ""
-
-#: ../ProjectController.py:1013
-#, fuzzy
+msgstr "编辑工具栏"
+
+#: ../ProjectController.py:1294
 msgid "Editor selection"
-msgstr "编辑跃迁"
-
-#: ../editors/DataTypeEditor.py:341
+msgstr "编辑选择"
+
+#: ../editors/DataTypeEditor.py:360
 msgid "Elements :"
 msgstr "元素:"
 
-#: ../IDEFrame.py:343
-#, fuzzy
-msgid "Enable Undo/Redo"
-msgstr "启用"
-
-#: ../Beremiz_service.py:380
+#: ../ProjectController.py:1399
+msgid "Empty"
+msgstr "空的"
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr "不允许空维度。"
+
+#: ../Beremiz_service.py:341
 msgid "Enter a name "
 msgstr "输入一个名字"
 
-#: ../Beremiz_service.py:365
+#: ../Beremiz_service.py:326
 msgid "Enter a port number "
 msgstr "输入一个端口号"
 
-#: ../Beremiz_service.py:355
+#: ../Beremiz_service.py:317
 msgid "Enter the IP of the interface to bind"
 msgstr "输入界面的ip用以绑定"
 
-#: ../editors/DataTypeEditor.py:52
+#: ../editors/DataTypeEditor.py:60
 msgid "Enumerated"
 msgstr "列举的"
 
@@ -1590,69 +1524,47 @@
 msgid "Equal to"
 msgstr "等于"
 
-#: ../Beremiz_service.py:270
-#: ../Beremiz_service.py:394
-#: ../controls/VariablePanel.py:330
-#: ../controls/VariablePanel.py:678
-#: ../controls/DebugVariablePanel.py:164
-#: ../IDEFrame.py:1083
-#: ../IDEFrame.py:1672
-#: ../IDEFrame.py:1709
-#: ../IDEFrame.py:1714
-#: ../IDEFrame.py:1728
-#: ../IDEFrame.py:1733
-#: ../IDEFrame.py:2422
-#: ../Beremiz.py:1083
-#: ../PLCOpenEditor.py:358
-#: ../PLCOpenEditor.py:363
-#: ../PLCOpenEditor.py:531
-#: ../PLCOpenEditor.py:541
-#: ../editors/TextViewer.py:376
-#: ../editors/DataTypeEditor.py:543
-#: ../editors/DataTypeEditor.py:548
-#: ../editors/DataTypeEditor.py:572
-#: ../editors/DataTypeEditor.py:577
-#: ../editors/DataTypeEditor.py:587
-#: ../editors/DataTypeEditor.py:719
-#: ../editors/DataTypeEditor.py:726
-#: ../editors/Viewer.py:366
-#: ../editors/LDViewer.py:663
-#: ../editors/LDViewer.py:879
-#: ../editors/LDViewer.py:883
-#: ../editors/FileManagementPanel.py:210
-#: ../ProjectController.py:221
-#: ../dialogs/PouNameDialog.py:53
-#: ../dialogs/PouTransitionDialog.py:107
-#: ../dialogs/BrowseLocationsDialog.py:175
-#: ../dialogs/ProjectDialog.py:71
-#: ../dialogs/SFCStepNameDialog.py:59
-#: ../dialogs/ConnectionDialog.py:152
-#: ../dialogs/FBDVariableDialog.py:201
-#: ../dialogs/PouActionDialog.py:104
-#: ../dialogs/BrowseValuesLibraryDialog.py:83
-#: ../dialogs/PouDialog.py:132
-#: ../dialogs/SFCTransitionDialog.py:147
-#: ../dialogs/DurationEditorDialog.py:121
-#: ../dialogs/DurationEditorDialog.py:163
-#: ../dialogs/SearchInProjectDialog.py:157
-#: ../dialogs/SFCStepDialog.py:130
-#: ../dialogs/ArrayTypeDialog.py:97
-#: ../dialogs/ArrayTypeDialog.py:103
-#: ../dialogs/FBDBlockDialog.py:164
-#: ../dialogs/ForceVariableDialog.py:169
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:124
+#: ../dialogs/DurationEditorDialog.py:170
+#: ../dialogs/PouTransitionDialog.py:114 ../dialogs/BlockPreviewDialog.py:237
+#: ../dialogs/ProjectDialog.py:80 ../dialogs/ArrayTypeDialog.py:114
+#: ../dialogs/PouNameDialog.py:58 ../dialogs/BrowseLocationsDialog.py:229
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+#: ../dialogs/PouActionDialog.py:112 ../dialogs/PouDialog.py:143
+#: ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../editors/ResourceEditor.py:470 ../editors/Viewer.py:467
+#: ../editors/LDViewer.py:677 ../editors/LDViewer.py:893
+#: ../editors/LDViewer.py:897 ../editors/DataTypeEditor.py:566
+#: ../editors/DataTypeEditor.py:571 ../editors/DataTypeEditor.py:590
+#: ../editors/DataTypeEditor.py:759 ../editors/DataTypeEditor.py:766
+#: ../editors/TextViewer.py:390 ../editors/CodeFileEditor.py:760
+#: ../ProjectController.py:391 ../ProjectController.py:531
+#: ../ProjectController.py:538 ../controls/FolderTree.py:222
+#: ../controls/ProjectPropertiesPanel.py:306
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:173
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:431 ../controls/VariablePanel.py:773
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1036 ../IDEFrame.py:1650
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1696 ../IDEFrame.py:1710
+#: ../IDEFrame.py:1715 ../Beremiz_service.py:221
 msgid "Error"
 msgstr "错误"
 
-#: ../ProjectController.py:587
-msgid "Error : At least one configuration and one resource must be declared in PLC !\n"
+#: ../ProjectController.py:811
+msgid ""
+"Error : At least one configuration and one resource must be declared in PLC "
+"!\n"
 msgstr "错误:在PLC中,必须申明至少一个配置和一个资源!\n"
 
-#: ../ProjectController.py:579
+#: ../ProjectController.py:803
 #, python-format
 msgid "Error : IEC to C compiler returned %d\n"
 msgstr "错误:IEC到C编译器返回 %d\n"
 
-#: ../ProjectController.py:520
+#: ../ProjectController.py:731
 #, python-format
 msgid ""
 "Error in ST/IL/SFC code generator :\n"
@@ -1661,40 +1573,46 @@
 "错误在ST/IL/SFC代码生成器中:\n"
 "%s\n"
 
-#: ../ConfigTreeNode.py:182
+#: ../ConfigTreeNode.py:219
 #, python-format
 msgid "Error while saving \"%s\"\n"
 msgstr "存储时有错误 \"%s\"\n"
 
-#: ../canfestival/canfestival.py:122
+#: ../canfestival/canfestival.py:179
 msgid "Error: Export slave failed\n"
-msgstr ""
-
-#: ../canfestival/canfestival.py:270
+msgstr "错误:导出从站失败\n"
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid ""
+"Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number "
+"{a3}.\n"
+msgstr "错误: Modbus/IP 服务器 %{a1}.x 和 %{a2}.x 使用相同的端口号 {a3}.\n"
+
+#: ../canfestival/canfestival.py:388
 msgid "Error: No Master generated\n"
 msgstr "错误:没有主控生成\n"
 
-#: ../canfestival/canfestival.py:265
+#: ../canfestival/canfestival.py:383
 msgid "Error: No PLC built\n"
 msgstr "错误:没有PLC构建\n"
 
-#: ../ProjectController.py:1378
+#: ../ProjectController.py:1708
 #, python-format
 msgid "Exception while connecting %s!\n"
 msgstr "连接时存在异常 %s!\n"
 
-#: ../dialogs/FBDBlockDialog.py:95
+#: ../dialogs/FBDBlockDialog.py:123
 msgid "Execution Control:"
 msgstr "执行控制:"
 
-#: ../dialogs/FBDVariableDialog.py:76
-#: ../dialogs/FBDBlockDialog.py:87
+#: ../dialogs/FBDVariableDialog.py:84 ../dialogs/FBDBlockDialog.py:111
 msgid "Execution Order:"
 msgstr "执行命令:"
 
-#: ../features.py:10
+#: ../features.py:36
 msgid "Experimental web based HMI"
-msgstr ""
+msgstr "实验性的WEB基础的HMI"
 
 #: ../plcopen/iec_std.csv:38
 msgid "Exponent"
@@ -1704,192 +1622,167 @@
 msgid "Exponentiation"
 msgstr "幂"
 
-#: ../canfestival/canfestival.py:128
+#: ../canfestival/canfestival.py:186
 msgid "Export CanOpen slave to EDS file"
-msgstr ""
-
-#: ../editors/GraphicViewer.py:144
+msgstr "导出 CANOpen 从站到 EDS 文件"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:246
 msgid "Export graph values to clipboard"
-msgstr ""
-
-#: ../canfestival/canfestival.py:127
+msgstr "导出图形值到剪切板"
+
+#: ../canfestival/canfestival.py:185
 msgid "Export slave"
-msgstr ""
-
-#: ../dialogs/FBDVariableDialog.py:69
+msgstr "导出从站"
+
+#: ../dialogs/FBDVariableDialog.py:94
 msgid "Expression:"
 msgstr "表达式:"
 
-#: ../controls/VariablePanel.py:77
+#: ../controls/VariablePanel.py:90
 msgid "External"
 msgstr "外部的"
 
-#: ../ProjectController.py:591
+#: ../ProjectController.py:826
 msgid "Extracting Located Variables...\n"
 msgstr "正在提取位置变量......\n"
 
-#: ../controls/ProjectPropertiesPanel.py:143
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "FBD"
-msgstr "功能区块图"
-
-#: ../ProjectController.py:1445
+msgstr "功能块图"
+
+#: ../ProjectController.py:1773
 msgid "Failed : Must build before transfer.\n"
 msgstr "失败:传输之前必须构建。\n"
 
-#: ../editors/Viewer.py:405
-#: ../dialogs/LDElementDialog.py:84
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:556
 msgid "Falling Edge"
 msgstr "下降沿"
 
-#: ../plcopen/structures.py:217
-msgid ""
-"Falling edge detector\n"
-"The output produces a single pulse when a falling edge is detected."
-msgstr ""
-"下降沿检测\n"
-"当下降沿被检测到时,输出便产生一个单脉冲。"
-
-#: ../ProjectController.py:900
+#: ../ProjectController.py:1098
 msgid "Fatal : cannot get builder.\n"
 msgstr "致命错误:无法获取构建者。\n"
 
-#: ../dialogs/DurationEditorDialog.py:160
-#, fuzzy, python-format
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr "抓取 %s"
+
+#: ../dialogs/DurationEditorDialog.py:167
+#, python-format
 msgid "Field %s hasn't a valid value!"
-msgstr "\"%s\"不是有效值!"
-
-#: ../dialogs/DurationEditorDialog.py:162
-#, fuzzy, python-format
+msgstr "领域 %s 没有一个有效值!"
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
 msgid "Fields %s haven't a valid value!"
-msgstr "\"%s\"不是有效值!"
-
-#: ../editors/FileManagementPanel.py:209
-#, fuzzy, python-format
+msgstr "领域 %s 没有一个有效值!"
+
+#: ../controls/FolderTree.py:221
+#, python-format
 msgid "File '%s' already exists!"
-msgstr "\"%s\"编程组织单元已经存在!"
-
-#: ../IDEFrame.py:353
-#: ../dialogs/FindInPouDialog.py:30
-#: ../dialogs/FindInPouDialog.py:99
+msgstr "文件 '%s' 已经存在!"
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:377
 msgid "Find"
-msgstr ""
-
-#: ../IDEFrame.py:355
+msgstr "查找"
+
+#: ../IDEFrame.py:379
 msgid "Find Next"
-msgstr ""
-
-#: ../IDEFrame.py:357
+msgstr "查找下一个"
+
+#: ../IDEFrame.py:381
 msgid "Find Previous"
-msgstr ""
+msgstr "查找前一个"
 
 #: ../plcopen/iec_std.csv:90
 msgid "Find position"
-msgstr "定位"
-
-#: ../dialogs/FindInPouDialog.py:51
+msgstr "查找位置"
+
+#: ../dialogs/FindInPouDialog.py:58
 msgid "Find:"
-msgstr ""
-
-#: ../connectors/PYRO/__init__.py:125
-msgid "Force runtime reload\n"
-msgstr "强制重新运行\n"
-
-#: ../controls/DebugVariablePanel.py:295
-#: ../editors/Viewer.py:1353
+msgstr "查找:"
+
+#: ../editors/Viewer.py:1633
 msgid "Force value"
-msgstr ""
-
-#: ../dialogs/ForceVariableDialog.py:152
+msgstr "强制值"
+
+#: ../dialogs/ForceVariableDialog.py:176
 msgid "Forcing Variable Value"
-msgstr ""
-
-#: ../dialogs/PouTransitionDialog.py:97
-#: ../dialogs/ProjectDialog.py:70
-#: ../dialogs/PouActionDialog.py:94
-#: ../dialogs/PouDialog.py:114
-#: ../dialogs/SFCTransitionDialog.py:147
+msgstr "强制变量值"
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:104
+#: ../dialogs/ProjectDialog.py:79 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:125
 #, python-format
 msgid "Form isn't complete. %s must be filled!"
 msgstr "形式不完整。%s 必须被填补完整!"
 
-#: ../dialogs/ConnectionDialog.py:142
-#: ../dialogs/FBDBlockDialog.py:154
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
 msgid "Form isn't complete. Name must be filled!"
 msgstr "形式不完整。%s 名字必须填!"
 
-#: ../dialogs/SearchInProjectDialog.py:145
-#, fuzzy
-msgid "Form isn't complete. Pattern to search must be filled!"
-msgstr "形式不完整。%s 名字必须填!"
-
-#: ../dialogs/FBDBlockDialog.py:152
+#: ../dialogs/FBDBlockDialog.py:235
 msgid "Form isn't complete. Valid block type must be selected!"
 msgstr "形式不完整。%s 有效的块类型必须被选择!"
 
-#: ../dialogs/FindInPouDialog.py:67
+#: ../dialogs/FindInPouDialog.py:75
 msgid "Forward"
-msgstr ""
-
-#: ../dialogs/SearchInProjectDialog.py:44
+msgstr "向前的"
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1780
 msgid "Function"
 msgstr "功能"
 
-#: ../IDEFrame.py:329
-#, fuzzy
+#: ../IDEFrame.py:354
 msgid "Function &Block"
-msgstr "功能块"
-
-#: ../IDEFrame.py:1969
-#: ../dialogs/SearchInProjectDialog.py:45
+msgstr "功能 &块"
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1779
+#: ../IDEFrame.py:1972
 msgid "Function Block"
 msgstr "功能块"
 
-#: ../controls/VariablePanel.py:741
+#: ../controls/VariablePanel.py:868
 msgid "Function Block Types"
 msgstr "功能块类型"
 
-#: ../PLCControler.py:94
+#: ../plcopen/types_enums.py:75
 msgid "Function Blocks"
 msgstr "功能块"
 
-#: ../editors/Viewer.py:236
+#: ../editors/Viewer.py:290
 msgid "Function Blocks can't be used in Functions!"
 msgstr "功能块不能用于功能中!"
 
-#: ../editors/Viewer.py:238
-msgid "Function Blocks can't be used in Transitions!"
-msgstr "功能块不能用于跃迁中"
-
-#: ../PLCControler.py:2055
+#: ../PLCControler.py:1907
 #, python-format
 msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
 msgstr "功能块 \"%s\" 不能用于功能中!"
 
-#: ../PLCControler.py:94
+#: ../plcopen/types_enums.py:75
 msgid "Functions"
 msgstr "功能"
 
-#: ../PLCOpenEditor.py:138
-#, fuzzy
+#: ../PLCOpenEditor.py:88
 msgid "Generate Program"
-msgstr "生成程序\tCTRL+G"
-
-#: ../ProjectController.py:510
+msgstr "生成程序"
+
+#: ../ProjectController.py:722
 msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
 msgstr "生成软PLC IEC-61131 ST/IL/SFC 代码......\n"
 
-#: ../controls/VariablePanel.py:78
+#: ../controls/VariablePanel.py:91
 msgid "Global"
 msgstr "全球的"
 
-#: ../editors/GraphicViewer.py:131
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:245
 msgid "Go to current value"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:173
+msgstr "定位当前值"
+
+#: ../controls/ProjectPropertiesPanel.py:189
 msgid "Graphics"
 msgstr "图形"
 
@@ -1901,115 +1794,114 @@
 msgid "Greater than or equal to"
 msgstr "大于或等于"
 
-#: ../controls/ProjectPropertiesPanel.py:134
+#: ../controls/ProjectPropertiesPanel.py:149
 msgid "Grid Resolution:"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:120
+msgstr "栅格分辨率:"
+
+#: ../runtime/NevowServer.py:192
+msgid "HTTP interface port :"
+msgstr "HTTP 界面端口:"
+
+#: ../controls/ProjectPropertiesPanel.py:135
 msgid "Height:"
 msgstr "高度:"
 
-#: ../editors/FileManagementPanel.py:303
-#, fuzzy
+#: ../editors/FileManagementPanel.py:89
 msgid "Home Directory:"
-msgstr "直接的"
-
-#: ../controls/ProjectPropertiesPanel.py:150
+msgstr "主目录"
+
+#: ../controls/ProjectPropertiesPanel.py:165
 msgid "Horizontal:"
-msgstr ""
-
-#: ../dialogs/DurationEditorDialog.py:44
+msgstr "水平:"
+
+#: ../dialogs/DurationEditorDialog.py:47
 msgid "Hours:"
-msgstr ""
-
-#: ../plcopen/structures.py:279
-msgid ""
-"Hysteresis\n"
-"The hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2."
-msgstr ""
-"滞后\n"
-"滞后功能块提供一个被2个浮点(REAL)的差异所驱动的布尔型滞后输出,2个浮点即输入的XIN1和XIN2。"
-
-#: ../ProjectController.py:827
-msgid "IEC-61131-3 code generation failed !\n"
-msgstr "IEC-61131-3代码生成失败!\n"
-
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+msgstr "小时:"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
 msgid "IL"
-msgstr "指令集"
-
-#: ../Beremiz_service.py:356
-#: ../Beremiz_service.py:357
+msgstr "指令表编程语言"
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr "IP"
+
+#: ../Beremiz_service.py:318 ../Beremiz_service.py:320
 msgid "IP is not valid!"
-msgstr "Ip无效!"
-
-#: ../svgui/svgui.py:17
-#: ../svgui/svgui.py:18
+msgstr "IP 无效!"
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
 msgid "Import SVG"
-msgstr ""
-
-#: ../controls/VariablePanel.py:76
-#: ../dialogs/FBDVariableDialog.py:34
+msgstr "导入 SVG"
+
+#: ../dialogs/FBDVariableDialog.py:41 ../editors/Viewer.py:1662
+#: ../controls/VariablePanel.py:89
 msgid "InOut"
 msgstr "输入输出"
 
-#: ../controls/VariablePanel.py:263
-#, python-format
-msgid "Incompatible data types between \"%s\" and \"%s\""
-msgstr " \"%s\" 和  \"%s\" 数据类型不相容"
-
-#: ../controls/VariablePanel.py:274
-#, python-format
-msgid "Incompatible size of data between \"%s\" and \"%s\""
-msgstr " \"%s\" 和  \"%s\" 数据大小不相容"
-
-#: ../controls/VariablePanel.py:270
+#: ../PLCGenerator.py:1040
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr "InOut 变量 {a1} 在块 {a2} 在 POU{a3} 必须被连接."
+
+#: ../editors/Viewer.py:473
+msgid "Inactive"
+msgstr "不活动"
+
+#: ../controls/VariablePanel.py:300
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr " \"{a1}\" 和 \"{a2}\" 数据类型不相容"
+
+#: ../controls/VariablePanel.py:306
 #, python-format
 msgid "Incompatible size of data between \"%s\" and \"BOOL\""
-msgstr " \"%s\" 和  \"BOOL\" 数据类型不相容"
-
-#: ../dialogs/ActionBlockDialog.py:37
+msgstr " \"%s\" 和  \"BOOL\" 数据尺寸不相容"
+
+#: ../controls/VariablePanel.py:310
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr " \"{a1}\" 和 \"{a2}\" 数据尺寸不相容"
+
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Indicator"
 msgstr "指示器"
 
-#: ../editors/Viewer.py:492
-#, fuzzy
+#: ../editors/CodeFileEditor.py:734
+msgid "Initial"
+msgstr "初始的"
+
+#: ../editors/Viewer.py:650
 msgid "Initial Step"
-msgstr "初始值"
-
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
-#: ../editors/DataTypeEditor.py:48
+msgstr "初始的步"
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
 msgid "Initial Value"
 msgstr "初始值"
 
-#: ../editors/DataTypeEditor.py:178
-#: ../editors/DataTypeEditor.py:209
-#: ../editors/DataTypeEditor.py:265
-#: ../editors/DataTypeEditor.py:303
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
 msgid "Initial Value:"
 msgstr "初始值:"
 
-#: ../svgui/svgui.py:21
+#: ../svgui/svgui.py:56
 msgid "Inkscape"
-msgstr ""
-
-#: ../dialogs/ActionBlockDialog.py:41
-#: ../dialogs/SFCTransitionDialog.py:66
-#: ../dialogs/SFCTransitionDialog.py:137
+msgstr "Inkscape"
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr "在线"
 
-#: ../controls/VariablePanel.py:76
-#: ../dialogs/BrowseLocationsDialog.py:36
-#: ../dialogs/FBDVariableDialog.py:33
-#: ../dialogs/SFCStepDialog.py:61
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:40
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1660 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Input"
 msgstr "输入"
 
-#: ../dialogs/FBDBlockDialog.py:78
+#: ../dialogs/FBDBlockDialog.py:99
 msgid "Inputs:"
 msgstr "输入:"
 
@@ -2017,125 +1909,128 @@
 msgid "Insertion (into)"
 msgstr "插入"
 
-#: ../plcopen/plcopen.py:1833
+#: ../plcopen/plcopen.py:1948
 #, python-format
 msgid "Instance with id %d doesn't exist!"
 msgstr "有id的实例 %d 尚不存在!"
 
-#: ../editors/ResourceEditor.py:247
+#: ../editors/ResourceEditor.py:279
 msgid "Instances:"
 msgstr "实例:"
 
-#: ../plcopen/structures.py:259
-msgid ""
-"Integral\n"
-"The integral function block integrates the value of input XIN over time."
-msgstr ""
-"积分\n"
-"积分功能随着时间推移而集成输入的XIN的值。"
-
-#: ../controls/VariablePanel.py:75
+#: ../controls/VariablePanel.py:88
 msgid "Interface"
 msgstr "界面"
 
-#: ../editors/ResourceEditor.py:71
+#: ../editors/ResourceEditor.py:81
 msgid "Interrupt"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:67
+msgstr "中断"
+
+#: ../editors/ResourceEditor.py:76
 msgid "Interval"
 msgstr "区间"
 
-#: ../PLCControler.py:2032
-#: ../PLCControler.py:2070
+#: ../controls/ProjectPropertiesPanel.py:304
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+"无效的URL!\n"
+"请输入正确的URL地址."
+
+#: ../PLCControler.py:1895
 msgid "Invalid plcopen element(s)!!!"
 msgstr "无效的plcopen元素!!!"
 
-#: ../canfestival/config_utils.py:376
-#: ../canfestival/config_utils.py:637
-#, python-format
-msgid "Invalid type \"%s\"-> %d != %d  for location\"%s\""
-msgstr "无效类型 \"%s\"-> %d != %d  用于位置 \"%s\""
-
-#: ../dialogs/ForceVariableDialog.py:167
-#, fuzzy, python-format
-msgid "Invalid value \"%s\" for \"%s\" variable!"
-msgstr "无效值 \"%s\" 为调试变量"
-
-#: ../controls/DebugVariablePanel.py:153
-#: ../controls/DebugVariablePanel.py:156
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr "无效类型 \"{a1}\"-> {a2} != {a3} 对于定位 \"{a4}\""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr "无效类型 \"{a1}\"-> {a2} != {a3} 对于定位 \"{a4}\""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:139
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
 #, python-format
 msgid "Invalid value \"%s\" for debug variable"
 msgstr "无效值 \"%s\" 为调试变量"
 
-#: ../controls/VariablePanel.py:244
-#: ../controls/VariablePanel.py:247
-#, fuzzy, python-format
+#: ../controls/VariablePanel.py:279 ../controls/VariablePanel.py:282
+#, python-format
 msgid "Invalid value \"%s\" for variable grid element"
-msgstr "无效值 \"%s\" 为调试变量"
-
-#: ../editors/Viewer.py:221
-#: ../editors/Viewer.py:224
+msgstr "无效值 \"%s\" 对于变量网格元素"
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
 #, python-format
 msgid "Invalid value \"%s\" for viewer block"
 msgstr "无效值 \"%s\" 在视窗块"
 
-#: ../dialogs/DurationEditorDialog.py:121
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr "无效值 \"{a1}\" 对于 \"{a2}\" 变量!"
+
+#: ../dialogs/DurationEditorDialog.py:124
 msgid ""
 "Invalid value!\n"
 "You must fill a numeric value."
 msgstr ""
-
-#: ../editors/Viewer.py:497
+"无效值!\n"
+"你必须填入一个数字值。"
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr "是安全连接吗?"
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2425
 msgid "Jump"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:143
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+msgstr "跳转"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "LD"
 msgstr "梯级图"
 
-#: ../editors/LDViewer.py:215
-#: ../editors/LDViewer.py:231
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
 #, python-format
 msgid "Ladder element with id %d is on more than one rung."
 msgstr "有id的梯形元素 %d  不止在一个梯级上。"
 
-#: ../dialogs/PouTransitionDialog.py:86
-#: ../dialogs/PouActionDialog.py:83
-#: ../dialogs/PouDialog.py:102
+#: ../dialogs/PouTransitionDialog.py:93 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:113
 msgid "Language"
 msgstr "语言"
 
-#: ../controls/ProjectPropertiesPanel.py:186
+#: ../controls/ProjectPropertiesPanel.py:206
 msgid "Language (optional):"
 msgstr "语言(选填):"
 
-#: ../dialogs/PouTransitionDialog.py:60
-#: ../dialogs/PouActionDialog.py:56
-#: ../dialogs/PouDialog.py:71
+#: ../dialogs/PouTransitionDialog.py:67 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:81
 msgid "Language:"
 msgstr "语言:"
 
-#: ../ProjectController.py:1451
+#: ../ProjectController.py:1779
 msgid "Latest build already matches current target. Transfering anyway...\n"
 msgstr "最新构建已经与当前目标匹配。正在传输中......\n"
 
-#: ../Beremiz_service.py:324
+#: ../Beremiz_service.py:281
 msgid "Launch WX GUI inspector"
 msgstr "启动 WX GUI 检查员"
 
-#: ../Beremiz_service.py:323
+#: ../Beremiz_service.py:280
 msgid "Launch a live Python shell"
 msgstr "启动一个活的Python Shell"
 
-#: ../editors/Viewer.py:428
+#: ../editors/Viewer.py:580
 msgid "Left"
 msgstr "左"
 
-#: ../dialogs/LDPowerRailDialog.py:55
+#: ../dialogs/LDPowerRailDialog.py:64
 msgid "Left PowerRail"
 msgstr "左电源导轨"
 
@@ -2151,204 +2046,184 @@
 msgid "Less than or equal to"
 msgstr "小于或等于"
 
-#: ../IDEFrame.py:600
+#: ../IDEFrame.py:652
 msgid "Library"
-msgstr "图书馆"
+msgstr "库"
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr "许可"
 
 #: ../plcopen/iec_std.csv:73
 msgid "Limitation"
 msgstr "限制"
 
-#: ../targets/toolchain_gcc.py:142
+#: ../targets/toolchain_gcc.py:209
 msgid "Linking :\n"
 msgstr "链接:\n"
 
-#: ../controls/VariablePanel.py:77
-#: ../dialogs/DiscoveryDialog.py:110
-#, fuzzy
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:90
 msgid "Local"
-msgstr ""
-"#-#-#-#-#  Beremiz_zh_CN.po (PACKAGE VERSION)  #-#-#-#-#\n"
-"本地\n"
-"#-#-#-#-#  PLCOpenEditor_zh_CN.po (PACKAGE VERSION)  #-#-#-#-#\n"
-"位置"
-
-#: ../ProjectController.py:1353
-#, fuzzy
+msgstr "本地"
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr "本地入口"
+
+#: ../ProjectController.py:1685
 msgid "Local service discovery failed!\n"
-msgstr "服务探索"
-
-#: ../controls/VariablePanel.py:58
+msgstr "本地服务探索失败!\n"
+
+#: ../controls/VariablePanel.py:62
 msgid "Location"
 msgstr "位置"
 
-#: ../dialogs/BrowseLocationsDialog.py:61
-#, fuzzy
+#: ../dialogs/BrowseLocationsDialog.py:79
 msgid "Locations available:"
-msgstr "该选项尚未可用!"
-
-#: ../Beremiz.py:393
-msgid "Log Console"
-msgstr "控制台日志"
+msgstr "存在的定位:"
 
 #: ../plcopen/iec_std.csv:25
 msgid "Logarithm to base 10"
 msgstr "底数10的对数"
 
-#: ../connectors/PYRO/__init__.py:55
+#: ../connectors/PYRO/__init__.py:102
 #, python-format
 msgid "MDNS resolution failure for '%s'\n"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:37
-#: ../canfestival/NetworkEditor.py:67
-#, fuzzy
+msgstr "MDNS 解析度失败因为 '%s'\n"
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
 msgid "Map Variable"
-msgstr "变量"
-
-#: ../features.py:6
+msgstr "映射变量"
+
+#: ../features.py:31
 msgid "Map located variables over CANopen"
-msgstr ""
-
-#: ../canfestival/NetworkEditor.py:89
-#, fuzzy
+msgstr "通过CANopen映射位置变量"
+
+#: ../features.py:32
+msgid "Map located variables over Modbus"
+msgstr "通过Modbus定位变量"
+
+#: ../canfestival/NetworkEditor.py:113
 msgid "Master"
-msgstr "显示主控"
-
-#: ../ConfigTreeNode.py:480
-#, fuzzy, python-format
-msgid "Max count (%d) reached for this confnode of type %s "
-msgstr "最大计数 (%d) 到达"
+msgstr "主站"
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr "最大计数 ({a1}) 达到了对于类型 {a2} 这个confnode"
 
 #: ../plcopen/iec_std.csv:71
 msgid "Maximum"
 msgstr "最大值"
 
-#: ../editors/DataTypeEditor.py:232
+#: ../editors/DataTypeEditor.py:246
 msgid "Maximum:"
 msgstr "最大值:"
 
-#: ../dialogs/BrowseLocationsDialog.py:38
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Memory"
-msgstr ""
-
-#: ../IDEFrame.py:568
-#, fuzzy
+msgstr "存储"
+
+#: ../IDEFrame.py:617
 msgid "Menu ToolBar"
-msgstr "工具条"
-
-#: ../dialogs/DurationEditorDialog.py:48
+msgstr "菜单工具栏"
+
+#: ../dialogs/DurationEditorDialog.py:51
 msgid "Microseconds:"
-msgstr ""
-
-#: ../editors/Viewer.py:433
+msgstr "微秒:"
+
+#: ../editors/Viewer.py:585
 msgid "Middle"
 msgstr "中间"
 
-#: ../dialogs/DurationEditorDialog.py:47
+#: ../dialogs/DurationEditorDialog.py:50
 msgid "Milliseconds:"
-msgstr ""
+msgstr "毫秒:"
 
 #: ../plcopen/iec_std.csv:72
 msgid "Minimum"
 msgstr "最小值"
 
-#: ../editors/DataTypeEditor.py:219
+#: ../editors/DataTypeEditor.py:233
 msgid "Minimum:"
 msgstr "最小值:"
 
-#: ../dialogs/DurationEditorDialog.py:45
+#: ../dialogs/DurationEditorDialog.py:48
 msgid "Minutes:"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:210
+msgstr "分:"
+
+#: ../controls/ProjectPropertiesPanel.py:231
 msgid "Miscellaneous"
 msgstr "其他"
 
-#: ../dialogs/LDElementDialog.py:59
+#: ../features.py:32
+msgid "Modbus support"
+msgstr "Modbus 支持"
+
+#: ../dialogs/LDElementDialog.py:65
 msgid "Modifier:"
 msgstr "改动:"
 
-#: ../PLCGenerator.py:703
-#: ../PLCGenerator.py:936
-#, python-format
-msgid "More than one connector found corresponding to \"%s\" continuation in \"%s\" POU"
-msgstr "发现不止一个连接器符合 \"%s\" 延续在 \"%s\" POU中"
-
-#: ../dialogs/ActionBlockDialog.py:141
-#, fuzzy
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1269
+#, python-brace-format
+msgid ""
+"More than one connector found corresponding to \"{a1}\" continuation in "
+"\"{a2}\" POU"
+msgstr "多个连接器发现对应在 \"{a2}\" POU中 \"{a1}\" 延续"
+
+#: ../dialogs/ActionBlockDialog.py:146
 msgid "Move action down"
-msgstr "下移"
-
-#: ../dialogs/ActionBlockDialog.py:140
-#, fuzzy
+msgstr "下移动作"
+
+#: ../dialogs/ActionBlockDialog.py:145
 msgid "Move action up"
-msgstr "上移"
-
-#: ../controls/DebugVariablePanel.py:185
-#, fuzzy
-msgid "Move debug variable down"
-msgstr "未找到输出值"
-
-#: ../controls/DebugVariablePanel.py:184
-#, fuzzy
-msgid "Move debug variable up"
-msgstr "未找到输出值"
-
-#: ../controls/CustomEditableListBox.py:43
+msgstr "上移动作"
+
+#: ../controls/CustomEditableListBox.py:46
 msgid "Move down"
 msgstr "下移"
 
-#: ../editors/DataTypeEditor.py:348
-#, fuzzy
+#: ../editors/DataTypeEditor.py:367
 msgid "Move element down"
-msgstr "下移"
-
-#: ../editors/DataTypeEditor.py:347
-#, fuzzy
+msgstr "下移元素"
+
+#: ../editors/DataTypeEditor.py:366
 msgid "Move element up"
-msgstr "上移"
+msgstr "上移元素"
+
+#: ../editors/ResourceEditor.py:286
+msgid "Move instance down"
+msgstr "下移实例"
+
+#: ../editors/ResourceEditor.py:285
+msgid "Move instance up"
+msgstr "上移实例"
+
+#: ../editors/ResourceEditor.py:255
+msgid "Move task down"
+msgstr "下移任务"
 
 #: ../editors/ResourceEditor.py:254
-#, fuzzy
-msgid "Move instance down"
-msgstr "下移"
-
-#: ../editors/ResourceEditor.py:253
-#, fuzzy
-msgid "Move instance up"
-msgstr "上移"
-
-#: ../editors/ResourceEditor.py:225
-#, fuzzy
-msgid "Move task down"
-msgstr "下移"
-
-#: ../editors/ResourceEditor.py:224
-#, fuzzy
 msgid "Move task up"
-msgstr "上移"
-
-#: ../IDEFrame.py:75
-#: ../IDEFrame.py:90
-#: ../IDEFrame.py:120
-#: ../IDEFrame.py:161
+msgstr "上移任务"
+
+#: ../IDEFrame.py:106 ../IDEFrame.py:121 ../IDEFrame.py:151 ../IDEFrame.py:192
 msgid "Move the view"
-msgstr ""
-
-#: ../controls/CustomEditableListBox.py:42
+msgstr "移动视图"
+
+#: ../controls/CustomEditableListBox.py:45
 msgid "Move up"
 msgstr "上移"
 
-#: ../controls/VariablePanel.py:381
-#, fuzzy
+#: ../editors/CodeFileEditor.py:657 ../controls/VariablePanel.py:484
 msgid "Move variable down"
-msgstr "下移"
-
-#: ../controls/VariablePanel.py:380
-#, fuzzy
+msgstr "下移变量"
+
+#: ../editors/CodeFileEditor.py:656 ../controls/VariablePanel.py:483
 msgid "Move variable up"
-msgstr "上移"
+msgstr "上移变量"
 
 #: ../plcopen/iec_std.csv:74
 msgid "Multiplexer (select 1 of N)"
@@ -2358,28 +2233,26 @@
 msgid "Multiplication"
 msgstr "乘法"
 
-#: ../editors/FileManagementPanel.py:301
-#, fuzzy
+#: ../editors/FileManagementPanel.py:87
 msgid "My Computer:"
-msgstr "编译"
-
-#: ../controls/VariablePanel.py:58
+msgstr "我的计算机:"
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr "NAME"
+
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:732
 #: ../controls/VariablePanel.py:59
-#: ../editors/DataTypeEditor.py:48
-#: ../editors/ResourceEditor.py:67
-#: ../editors/ResourceEditor.py:76
 msgid "Name"
 msgstr "名字"
 
-#: ../Beremiz_service.py:381
+#: ../Beremiz_service.py:342
 msgid "Name must not be null!"
 msgstr "名称不能为空!"
 
-#: ../dialogs/ConnectionDialog.py:65
-#: ../dialogs/FBDVariableDialog.py:89
-#: ../dialogs/LDElementDialog.py:88
-#: ../dialogs/SFCStepDialog.py:51
-#: ../dialogs/FBDBlockDialog.py:70
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
 msgid "Name:"
 msgstr "名字:"
 
@@ -2387,46 +2260,46 @@
 msgid "Natural logarithm"
 msgstr "自然对数"
 
-#: ../editors/Viewer.py:403
-#: ../dialogs/LDElementDialog.py:67
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:554
 msgid "Negated"
 msgstr "否定"
 
-#: ../Beremiz.py:307
-#: ../Beremiz.py:342
-#: ../PLCOpenEditor.py:125
-#: ../PLCOpenEditor.py:167
+#: ../Beremiz_service.py:610
+msgid "Nevow Web service failed. "
+msgstr "Nevow Web 服务失败。 "
+
+#: ../Beremiz_service.py:580
+msgid "Nevow/Athena import failed :"
+msgstr "Nevow/Athena 导入失败:"
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
 msgid "New"
-msgstr ""
-
-#: ../controls/CustomEditableListBox.py:40
+msgstr "新建"
+
+#: ../controls/CustomEditableListBox.py:43
 msgid "New item"
-msgstr "建立项目"
-
-#: ../editors/Viewer.py:402
+msgstr "新建项目"
+
+#: ../editors/Viewer.py:553
 msgid "No Modifier"
 msgstr "无改动"
 
-#: ../PLCControler.py:2929
-msgid "No PLC project found"
-msgstr "未找到PLC项目"
-
-#: ../ProjectController.py:1478
+#: ../ProjectController.py:1808
 msgid "No PLC to transfer (did build succeed ?)\n"
 msgstr "没有PLC可传输(构建是否成功?)\n"
 
-#: ../PLCGenerator.py:1321
+#: ../PLCGenerator.py:1678
 #, python-format
 msgid "No body defined in \"%s\" POU"
 msgstr "在 \"%s\" POU 中没有任何东西被定义"
 
-#: ../PLCGenerator.py:722
-#: ../PLCGenerator.py:945
-#, python-format
-msgid "No connector found corresponding to \"%s\" continuation in \"%s\" POU"
-msgstr "未发现连接器符合 \"%s\" 连续在  \"%s\" POU中"
-
-#: ../PLCOpenEditor.py:370
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr "没有连接器发现对应在 \"{a2}\" POU中 \"{a1}\" 延续"
+
+#: ../PLCOpenEditor.py:331
 msgid ""
 "No documentation available.\n"
 "Coming soon."
@@ -2434,77 +2307,69 @@
 "没有文件可用。\n"
 "稍候"
 
-#: ../PLCGenerator.py:744
+#: ../PLCGenerator.py:841
 #, python-format
 msgid "No informations found for \"%s\" block"
-msgstr ""
-
-#: ../plcopen/structures.py:167
-msgid "No output variable found"
-msgstr "未找到输出值"
-
-#: ../Beremiz_service.py:394
-msgid "No running PLC"
-msgstr "没有正在运行的PLC"
-
-#: ../controls/SearchResultPanel.py:169
+msgstr "对于 \"%s\" 块没有信息发现"
+
+#: ../PLCGenerator.py:1232
+#, python-brace-format
+msgid ""
+"No output {a1} variable found in block {a2} in POU {a3}. Connection must be "
+"broken"
+msgstr "无输出{a1}变量发现在 {a3} POU的 {a2} 块。 连接必须断开"
+
+#: ../controls/SearchResultPanel.py:175
 msgid "No search results available."
-msgstr ""
-
-#: ../svgui/svgui.py:98
+msgstr "没有存在的搜索结果。"
+
+#: ../svgui/svgui.py:142
 #, python-format
 msgid "No such SVG file: %s\n"
 msgstr "没有这样的SVG文件:%s\n"
 
-#: ../canfestival/config_utils.py:632
-#, python-format
-msgid "No such index/subindex (%x,%x) (variable %s)"
-msgstr "没有这样的索引/子索引 (%x,%x) (variable %s)"
-
-#: ../canfestival/config_utils.py:361
-#, python-format
-msgid "No such index/subindex (%x,%x) in ID : %d (variable %s)"
-msgstr "没有这样的索引/子索引 (%x,%x) in ID : %d (variable %s)"
-
-#: ../dialogs/BrowseValuesLibraryDialog.py:83
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr "没有如此 标签/子标签 ({a1},{a2}) (变量 {a3})"
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr "没有如此 标签/子标签 ({a1},{a2}) 在ID : {a3} (变量 {a4})"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
 msgid "No valid value selected!"
-msgstr ""
-
-#: ../PLCGenerator.py:1319
+msgstr "没有有效的值被选择!"
+
+#: ../PLCGenerator.py:1676
 #, python-format
 msgid "No variable defined in \"%s\" POU"
 msgstr "无变量被定义在 \"%s\" POU"
 
-#: ../canfestival/SlaveEditor.py:49
-#: ../canfestival/NetworkEditor.py:79
-#, fuzzy
-msgid "Node infos"
-msgstr "类型信息:"
-
-#: ../canfestival/config_utils.py:354
-#, python-format
-msgid "Non existing node ID : %d (variable %s)"
-msgstr "不存在节点ID:%d (variable %s)"
-
-#: ../controls/VariablePanel.py:69
-#, fuzzy
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr "不存在节点 ID :{a1} (variable {a2})"
+
+#: ../controls/VariablePanel.py:79
 msgid "Non-Retain"
-msgstr "保持"
-
-#: ../dialogs/LDElementDialog.py:62
+msgstr "非保持"
+
+#: ../dialogs/LDElementDialog.py:78
 msgid "Normal"
 msgstr "正常"
 
-#: ../canfestival/config_utils.py:383
-#, python-format
-msgid "Not PDO mappable variable : '%s' (ID:%d,Idx:%x,sIdx:%x))"
-msgstr "不是PDO填图变量: '%s' (ID:%d,Idx:%x,sIdx:%x))"
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr "不是PDO可映射变量:'{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
 
 #: ../plcopen/iec_std.csv:80
 msgid "Not equal to"
 msgstr "不等于"
 
-#: ../dialogs/SFCDivergenceDialog.py:80
+#: ../dialogs/SFCDivergenceDialog.py:91
 msgid "Number of sequences:"
 msgstr "序列号:"
 
@@ -2512,520 +2377,510 @@
 msgid "Numerical"
 msgstr "数学式"
 
-#: ../plcopen/structures.py:247
-msgid ""
-"Off-delay timer\n"
-"The off-delay timer can be used to delay setting an output false, for fixed period after input goes false."
-msgstr ""
-"关闭延迟计时器\n"
-"关闭延迟计时器可用于延迟设置一个假性输出,固定期限后一个输入变成假。"
-
-#: ../plcopen/structures.py:242
-msgid ""
-"On-delay timer\n"
-"The on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true."
-msgstr ""
-"开启延迟计时器\n"
-"开启延时计时器可用于延迟设置一个真性输出,固定期限后一个输入成为真。"
-
-#: ../dialogs/SearchInProjectDialog.py:93
-#, fuzzy
+#: ../editors/CodeFileEditor.py:736
+msgid "OnChange"
+msgstr "在改变中"
+
+#: ../dialogs/SearchInProjectDialog.py:88
 msgid "Only Elements"
-msgstr "元素:"
-
-#: ../Beremiz.py:309
-#: ../Beremiz.py:343
-#: ../PLCOpenEditor.py:127
-#: ../PLCOpenEditor.py:168
+msgstr "唯一元素"
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
 msgid "Open"
-msgstr ""
-
-#: ../svgui/svgui.py:107
+msgstr "打开"
+
+#: ../svgui/svgui.py:151
 msgid "Open Inkscape"
-msgstr ""
-
-#: ../ProjectController.py:1530
+msgstr "打开 Inkscape"
+
+#: ../version.py:86
+msgid ""
+"Open Source framework for automation, implemented IEC 61131 IDE with "
+"constantly growing set of extensions and flexible PLC runtime."
+msgstr "开源自动化框架,实现不断增长的扩展集和弹性的PLC运行时的IEC 61131-3 IDE"
+
+#: ../ProjectController.py:1879
 msgid "Open a file explorer to manage project files"
-msgstr ""
-
-#: ../wxglade_hmi/wxglade_hmi.py:109
+msgstr "打开一个文件浏览器来管理项目文件"
+
+#: ../wxglade_hmi/wxglade_hmi.py:161
 msgid "Open wxGlade"
-msgstr ""
-
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
-#, fuzzy
+msgstr "打开 wxGlade"
+
+#: ../controls/VariablePanel.py:64
 msgid "Option"
-msgstr "行动"
-
-#: ../dialogs/FindInPouDialog.py:76
-#, fuzzy
+msgstr "选项"
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:737
 msgid "Options"
-msgstr "行动"
-
-#: ../controls/ProjectPropertiesPanel.py:97
+msgstr "选项"
+
+#: ../controls/ProjectPropertiesPanel.py:109
 msgid "Organization (optional):"
 msgstr "组织(选填):"
 
-#: ../canfestival/SlaveEditor.py:47
-#: ../canfestival/NetworkEditor.py:77
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
 msgid "Other Profile"
-msgstr ""
-
-#: ../controls/VariablePanel.py:76
-#: ../dialogs/BrowseLocationsDialog.py:37
-#: ../dialogs/FBDVariableDialog.py:35
-#: ../dialogs/SFCStepDialog.py:65
+msgstr "其他配置"
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1661 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:89
+#: ../controls/VariablePanel.py:317 ../controls/VariablePanel.py:380
 msgid "Output"
 msgstr "输出"
 
-#: ../canfestival/SlaveEditor.py:36
-#: ../canfestival/NetworkEditor.py:66
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
 msgid "PDO Receive"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:35
-#: ../canfestival/NetworkEditor.py:65
-#, fuzzy
+msgstr "PDO 接收"
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
 msgid "PDO Transmit"
-msgstr "添加跃迁"
-
-#: ../plcopen/structures.py:269
-msgid ""
-"PID\n"
-"The PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control."
-msgstr ""
-"PID\n"
-"PID(比例,积分,导数)功能块为闭循环控制提供经典的三阶段控制器。"
-
-#: ../targets/toolchain_gcc.py:107
+msgstr "PDO 传输"
+
+#: ../targets/toolchain_gcc.py:174
 msgid "PLC :\n"
 msgstr "PLC:\n"
 
-#: ../ProjectController.py:1096
-#: ../ProjectController.py:1398
-#, python-format
-msgid "PLC is %s\n"
-msgstr "PLC 是 %s\n"
-
-#: ../PLCOpenEditor.py:313
-#: ../PLCOpenEditor.py:391
+#: ../BeremizIDE.py:383
+msgid "PLC Log"
+msgstr "PLC 记录"
+
+#: ../ProjectController.py:1082
+msgid "PLC code generation failed !\n"
+msgstr "PLC 代码生成失败!\n"
+
+#: ../Beremiz_service.py:305
+msgid "PLC is empty or already started."
+msgstr "PLC 是空的或者已经被启动。"
+
+#: ../Beremiz_service.py:312
+msgid "PLC is not started."
+msgstr "PLC 没有被启动。"
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+"PLC语法错误在行 {a1}:\n"
+"{a2}"
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
 msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
 msgstr "PLCOpen 文件 (*.xml)|*.xml|所有文件|*.*"
 
-#: ../PLCOpenEditor.py:175
-#: ../PLCOpenEditor.py:231
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
 msgid "PLCOpenEditor"
 msgstr "PLCOpen编辑器"
 
-#: ../dialogs/PouDialog.py:98
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+"PLCOpenEditor是Beremiz项目的一部分。\n"
+"\n"
+"Beremiz是一个"
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr "端口"
+
+#: ../dialogs/PouDialog.py:109
 msgid "POU Name"
 msgstr "POU 名字"
 
-#: ../dialogs/PouDialog.py:56
+#: ../dialogs/PouDialog.py:66
 msgid "POU Name:"
 msgstr "POU 名字:"
 
-#: ../dialogs/PouDialog.py:100
+#: ../dialogs/PouDialog.py:111
 msgid "POU Type"
 msgstr "POU类型"
 
-#: ../dialogs/PouDialog.py:63
+#: ../dialogs/PouDialog.py:73
 msgid "POU Type:"
 msgstr "POU 类型:"
 
-#: ../Beremiz.py:322
-#: ../PLCOpenEditor.py:141
+#: ../connectors/PYRO/__init__.py:52
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr "PYRO 连接到 URI : %s\n"
+
+#: ../connectors/PYRO/__init__.py:68
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr "PYRO使用认证在 '%s' \n"
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
 msgid "Page Setup"
 msgstr "页面设置"
 
-#: ../controls/ProjectPropertiesPanel.py:110
+#: ../controls/ProjectPropertiesPanel.py:124
 msgid "Page Size (optional):"
 msgstr "页面大小(选填):"
 
-#: ../PLCOpenEditor.py:476
+#: ../IDEFrame.py:2640
 #, python-format
 msgid "Page: %d"
 msgstr "页:%d"
 
-#: ../controls/PouInstanceVariablesPanel.py:41
-#, fuzzy
+#: ../controls/PouInstanceVariablesPanel.py:134
 msgid "Parent instance"
-msgstr "删除实例"
-
-#: ../IDEFrame.py:350
-#: ../IDEFrame.py:402
-#: ../editors/Viewer.py:537
+msgstr "父实例"
+
+#: ../editors/Viewer.py:696 ../IDEFrame.py:374 ../IDEFrame.py:428
 msgid "Paste"
-msgstr ""
-
-#: ../IDEFrame.py:1900
-#, fuzzy
+msgstr "粘贴"
+
+#: ../IDEFrame.py:1899
 msgid "Paste POU"
-msgstr "请输入POU名"
-
-#: ../dialogs/SearchInProjectDialog.py:64
+msgstr "粘贴POU"
+
+#: ../dialogs/SearchInProjectDialog.py:60
 msgid "Pattern to search:"
-msgstr ""
-
-#: ../dialogs/LDPowerRailDialog.py:64
+msgstr "检索模式:"
+
+#: ../dialogs/LDPowerRailDialog.py:75
 msgid "Pin number:"
 msgstr "插脚数:"
 
-#: ../editors/Viewer.py:2289
-#: ../editors/Viewer.py:2594
-#: ../editors/SFCViewer.py:696
+#: ../editors/Viewer.py:2792 ../editors/Viewer.py:3060
+#: ../editors/SFCViewer.py:785
 msgid "Please choose a target"
 msgstr "请选择一个目标"
 
-#: ../editors/Viewer.py:2112
-#: ../editors/Viewer.py:2114
-#: ../editors/Viewer.py:2630
-#: ../editors/Viewer.py:2632
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr "请输入一个块名称"
+
+#: ../editors/Viewer.py:2661 ../editors/Viewer.py:3103
 msgid "Please enter comment text"
 msgstr "请输入注释文本"
 
-#: ../editors/SFCViewer.py:359
-#: ../editors/SFCViewer.py:381
-#: ../editors/SFCViewer.py:725
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
 msgid "Please enter step name"
 msgstr "请输入步骤名称"
 
-#: ../dialogs/ForceVariableDialog.py:153
-#, fuzzy, python-format
+#: ../dialogs/PouNameDialog.py:37 ../Beremiz_service.py:209
+msgid "Please enter text"
+msgstr "请输入文本"
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
 msgid "Please enter value for a \"%s\" variable:"
-msgstr "请为插件输入一个名字:"
-
-#: ../Beremiz_service.py:366
+msgstr "请输入值对于一个 \"%s\" 变量:"
+
+#: ../Beremiz_service.py:327
 msgid "Port number must be 0 <= port <= 65535!"
 msgstr "端口号必须为 0 <= 端口号 <= 65535!"
 
-#: ../Beremiz_service.py:366
+#: ../Beremiz_service.py:327
 msgid "Port number must be an integer!"
 msgstr "端口号必须是整数!"
 
-#: ../editors/GraphicViewer.py:105
-msgid "Position:"
-msgstr "定位:"
-
-#: ../editors/Viewer.py:476
-#, fuzzy
+#: ../editors/Viewer.py:633 ../editors/Viewer.py:2449
 msgid "Power Rail"
-msgstr "左电源导轨"
-
-#: ../dialogs/LDPowerRailDialog.py:36
+msgstr "电源导轨"
+
+#: ../dialogs/LDPowerRailDialog.py:52
 msgid "Power Rail Properties"
 msgstr "电源导轨属性"
 
-#: ../Beremiz.py:324
-#: ../PLCOpenEditor.py:143
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
 msgid "Preview"
 msgstr "打印预览"
 
-#: ../dialogs/SFCDivergenceDialog.py:93
-#: ../dialogs/LDPowerRailDialog.py:78
-#: ../dialogs/ConnectionDialog.py:78
-#: ../dialogs/FBDVariableDialog.py:97
-#: ../dialogs/SFCTransitionDialog.py:96
-#: ../dialogs/LDElementDialog.py:101
-#: ../dialogs/SFCStepDialog.py:79
-#: ../dialogs/FBDBlockDialog.py:103
+#: ../dialogs/BlockPreviewDialog.py:59
 msgid "Preview:"
 msgstr "预览:"
 
-#: ../Beremiz.py:326
-#: ../Beremiz.py:346
-#: ../PLCOpenEditor.py:145
-#: ../PLCOpenEditor.py:171
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
 msgid "Print"
 msgstr "打印"
 
-#: ../IDEFrame.py:1155
+#: ../IDEFrame.py:1110
 msgid "Print preview"
 msgstr "打印预览"
 
-#: ../editors/ResourceEditor.py:67
+#: ../editors/ResourceEditor.py:76
 msgid "Priority"
 msgstr "优先"
 
-#: ../dialogs/SFCTransitionDialog.py:83
+#: ../dialogs/SFCTransitionDialog.py:91
 msgid "Priority:"
 msgstr "优先:"
 
-#: ../controls/ProjectPropertiesPanel.py:80
+#: ../runtime/PLCObject.py:518
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr "故障启动PLC:错误 %d"
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Product Name"
+msgstr "产品名称"
+
+#: ../controls/ProjectPropertiesPanel.py:90
 msgid "Product Name (required):"
 msgstr "产品名字(必填):"
 
-#: ../controls/ProjectPropertiesPanel.py:82
+#: ../controls/ProjectPropertiesPanel.py:92
 msgid "Product Release (optional):"
 msgstr "产品发布(选填):"
 
-#: ../controls/ProjectPropertiesPanel.py:81
+#: ../dialogs/ProjectDialog.py:64
+msgid "Product Version"
+msgstr "产品版本"
+
+#: ../controls/ProjectPropertiesPanel.py:91
 msgid "Product Version (required):"
 msgstr "产品版本(必填):"
 
-#: ../IDEFrame.py:1972
-#: ../dialogs/SearchInProjectDialog.py:46
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1778
+#: ../IDEFrame.py:1975
 msgid "Program"
 msgstr "程序"
 
-#: ../PLCOpenEditor.py:360
+#: ../PLCOpenEditor.py:321
 msgid "Program was successfully generated!"
 msgstr "该编程成功生成文件!"
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:76
 msgid "Programs"
 msgstr "程序"
 
-#: ../editors/Viewer.py:230
+#: ../editors/Viewer.py:285
 msgid "Programs can't be used by other POUs!"
 msgstr "程序不能被其它POU使用!"
 
-#: ../controls/ProjectPropertiesPanel.py:84
-#: ../IDEFrame.py:553
+#: ../controls/ProjectPropertiesPanel.py:94 ../IDEFrame.py:601
 msgid "Project"
 msgstr "项目"
 
-#: ../controls/SearchResultPanel.py:173
-#, fuzzy, python-format
+#: ../controls/SearchResultPanel.py:180
+#, python-format
 msgid "Project '%s':"
-msgstr "项目"
-
-#: ../ProjectController.py:1529
-#, fuzzy
+msgstr "项目 '%s':"
+
+#: ../ProjectController.py:1878
 msgid "Project Files"
-msgstr "项目属性"
-
-#: ../controls/ProjectPropertiesPanel.py:78
+msgstr "项目文件"
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Project Name"
+msgstr "项目名称"
+
+#: ../controls/ProjectPropertiesPanel.py:88
 msgid "Project Name (required):"
 msgstr "项目名称(必填):"
 
-#: ../controls/ProjectPropertiesPanel.py:79
+#: ../controls/ProjectPropertiesPanel.py:89
 msgid "Project Version (optional):"
 msgstr "项目版本(选填):"
 
-#: ../PLCControler.py:2916
+#: ../PLCControler.py:2717
 msgid ""
 "Project file syntax error:\n"
 "\n"
 msgstr ""
-
-#: ../dialogs/ProjectDialog.py:32
+"项目文件语法错误:\n"
+"\n"
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
 msgid "Project properties"
 msgstr "项目属性"
 
-#: ../ConfigTreeNode.py:506
-#, fuzzy, python-format
-msgid "Project tree layout do not match confnode.xml %s!=%s "
-msgstr "项目树型布局与 plugin.xml 不匹配 %s!=%s "
-
-#: ../PLCControler.py:96
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr "项目树的布局不匹配confnode.xml {a1}!={a2} "
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr "扩展名"
+
+#: ../plcopen/types_enums.py:77
 msgid "Properties"
 msgstr "属性"
 
-#: ../plcopen/structures.py:237
-msgid ""
-"Pulse timer\n"
-"The pulse timer can be used to generate output pulses of a given time duration."
-msgstr ""
-"脉冲计时器\n"
-"脉冲计时器可用于产生给定时间限制的输出的脉冲。"
-
-#: ../features.py:8
-#, fuzzy
+#: ../Beremiz_service.py:427
+msgid "Publishing service on local network"
+msgstr "在本地网络上发布服务"
+
+#: ../connectors/PYRO/__init__.py:126
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr "Pyro异常: %s\n"
+
+#: ../Beremiz_service.py:420
+msgid "Pyro port :"
+msgstr "Pyro端口:"
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr "Python代码"
+
+#: ../features.py:34
 msgid "Python file"
-msgstr "Python代码"
-
-#: ../dialogs/ActionBlockDialog.py:37
+msgstr "Python文件"
+
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Qualifier"
 msgstr "合格验证"
 
-#: ../Beremiz_service.py:328
-#: ../Beremiz.py:329
-#: ../PLCOpenEditor.py:151
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:283
 msgid "Quit"
 msgstr "退出"
 
-#: ../plcopen/structures.py:202
-msgid ""
-"RS bistable\n"
-"The RS bistable is a latch where the Reset dominates."
-msgstr ""
-"RS双稳\n"
-"RS双稳是一个重置支配的锁存器。"
-
-#: ../plcopen/structures.py:274
-#, fuzzy
-msgid ""
-"Ramp\n"
-"The RAMP function block is modelled on example given in the standard."
-msgstr ""
-"匝道\n"
-"匝道功能块模拟给定标准的例子,但增加了一个' 阻碍 '功能。"
-
-#: ../editors/GraphicViewer.py:89
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:227
 msgid "Range:"
 msgstr "范围:"
 
-#: ../ProjectController.py:1525
+#: ../ProjectController.py:1872
 msgid "Raw IEC code"
 msgstr "原始的IEC代码"
 
-#: ../plcopen/structures.py:254
-msgid ""
-"Real time clock\n"
-"The real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on."
-msgstr ""
-"实时时钟\n"
-"实时时钟有很多用途,包括时间冲压,设置日期和批量报告日期时间,报警信息等。"
-
-#: ../Beremiz.py:1039
-#, fuzzy, python-format
+#: ../BeremizIDE.py:1083
+#, python-format
 msgid "Really delete node '%s'?"
-msgstr "确定删除插件?"
-
-#: ../IDEFrame.py:340
-#: ../IDEFrame.py:398
+msgstr "真的删除节点 '%s'吗?"
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr "范围:"
+
+#: ../IDEFrame.py:367 ../IDEFrame.py:424
 msgid "Redo"
-msgstr ""
-
-#: ../dialogs/SFCTransitionDialog.py:57
-#: ../dialogs/SFCTransitionDialog.py:135
+msgstr "重做"
+
+#: ../dialogs/SFCTransitionDialog.py:76
 msgid "Reference"
 msgstr "参照"
 
-#: ../IDEFrame.py:408
-#: ../dialogs/DiscoveryDialog.py:105
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:434
 msgid "Refresh"
 msgstr "刷新"
 
-#: ../dialogs/SearchInProjectDialog.py:73
-#, fuzzy
+#: ../dialogs/SearchInProjectDialog.py:70
 msgid "Regular expression"
-msgstr "表达式:"
-
-#: ../dialogs/FindInPouDialog.py:91
-#, fuzzy
+msgstr "正则表达式"
+
+#: ../dialogs/FindInPouDialog.py:99
 msgid "Regular expressions"
-msgstr "表达式:"
-
-#: ../controls/DebugVariablePanel.py:299
-#: ../editors/Viewer.py:1356
+msgstr "正则表达式"
+
+#: ../editors/Viewer.py:1636
 msgid "Release value"
-msgstr ""
+msgstr "释放值"
 
 #: ../plcopen/iec_std.csv:37
 msgid "Remainder (modulo)"
 msgstr "余数(模)"
 
-#: ../Beremiz.py:1040
+#: ../BeremizIDE.py:1084
 #, python-format
 msgid "Remove %s node"
-msgstr ""
-
-#: ../dialogs/ActionBlockDialog.py:139
-#, fuzzy
+msgstr "移除 %s 节点"
+
+#: ../IDEFrame.py:2445
+msgid "Remove Datatype"
+msgstr "移除数据类型"
+
+#: ../IDEFrame.py:2450
+msgid "Remove Pou"
+msgstr "移除POU"
+
+#: ../dialogs/ActionBlockDialog.py:144
 msgid "Remove action"
-msgstr "移除这个插件"
-
-#: ../controls/DebugVariablePanel.py:183
-#, fuzzy
-msgid "Remove debug variable"
-msgstr "新建一个变量"
-
-#: ../editors/DataTypeEditor.py:346
-#, fuzzy
+msgstr "移除动作"
+
+#: ../editors/DataTypeEditor.py:365
 msgid "Remove element"
-msgstr "移除这个插件"
-
-#: ../editors/FileManagementPanel.py:281
+msgstr "移除元素"
+
+#: ../editors/FileManagementPanel.py:66
 msgid "Remove file from left folder"
-msgstr ""
-
-#: ../editors/ResourceEditor.py:252
-#, fuzzy
+msgstr "从左侧目录移除文件"
+
+#: ../editors/ResourceEditor.py:284
 msgid "Remove instance"
-msgstr "删除实例"
-
-#: ../canfestival/NetworkEditor.py:87
-#, fuzzy
+msgstr "移除实例"
+
+#: ../canfestival/NetworkEditor.py:111
 msgid "Remove slave"
-msgstr "移除这个插件"
-
-#: ../editors/ResourceEditor.py:223
+msgstr "移除从站"
+
+#: ../editors/ResourceEditor.py:253
 msgid "Remove task"
-msgstr ""
-
-#: ../controls/VariablePanel.py:379
-#, fuzzy
+msgstr "移除任务"
+
+#: ../editors/CodeFileEditor.py:655 ../controls/VariablePanel.py:482
 msgid "Remove variable"
-msgstr "新建一个变量"
-
-#: ../IDEFrame.py:1976
+msgstr "移除变量"
+
+#: ../IDEFrame.py:1979
 msgid "Rename"
 msgstr "重命名"
 
-#: ../editors/FileManagementPanel.py:399
+#: ../editors/FileManagementPanel.py:187
 msgid "Replace File"
-msgstr ""
+msgstr "替换文件"
+
+#: ../editors/Viewer.py:598
+msgid "Replace Wire by connections"
+msgstr "通过连接替换Wire"
 
 #: ../plcopen/iec_std.csv:89
 msgid "Replacement (within)"
 msgstr "替换"
 
-#: ../dialogs/LDElementDialog.py:76
+#: ../dialogs/LDElementDialog.py:79
 msgid "Reset"
 msgstr "重置"
 
-#: ../editors/Viewer.py:521
+#: ../editors/Viewer.py:681
 msgid "Reset Execution Order"
 msgstr "重置执行命令"
 
-#: ../IDEFrame.py:423
+#: ../IDEFrame.py:453
 msgid "Reset Perspective"
-msgstr ""
-
-#: ../controls/SearchResultPanel.py:105
+msgstr "复位透视图"
+
+#: ../controls/SearchResultPanel.py:103
 msgid "Reset search result"
-msgstr ""
-
-#: ../editors/GraphicViewer.py:137
-msgid "Reset zoom and offset"
-msgstr ""
-
-#: ../PLCControler.py:96
+msgstr "复位搜索结果"
+
+#: ../BeremizIDE.py:1015 ../plcopen/types_enums.py:77
 msgid "Resources"
 msgstr "资源"
 
-#: ../controls/VariablePanel.py:67
+#: ../controls/VariablePanel.py:77
 msgid "Retain"
 msgstr "保持"
 
-#: ../controls/VariablePanel.py:352
+#: ../controls/VariablePanel.py:455
 msgid "Return Type:"
 msgstr "返回类型:"
 
-#: ../editors/Viewer.py:430
+#: ../editors/Viewer.py:582
 msgid "Right"
 msgstr "右"
 
-#: ../dialogs/LDPowerRailDialog.py:60
+#: ../dialogs/LDPowerRailDialog.py:65
 msgid "Right PowerRail"
 msgstr "右电源导轨"
 
-#: ../editors/Viewer.py:404
-#: ../dialogs/LDElementDialog.py:80
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:555
 msgid "Rising Edge"
 msgstr "上升沿"
 
-#: ../plcopen/structures.py:212
-msgid ""
-"Rising edge detector\n"
-"The output produces a single pulse when a rising edge is detected."
-msgstr ""
-"上升沿检测\n"
-"当上升沿被检测到时,输出便产生一个单脉冲。"
-
 #: ../plcopen/iec_std.csv:65
 msgid "Rotate left"
 msgstr "循环左移"
@@ -3038,149 +2893,138 @@
 msgid "Rounding up/down"
 msgstr "四舍五入"
 
-#: ../ProjectController.py:1493
+#: ../ProjectController.py:1828
 msgid "Run"
 msgstr "运行"
 
-#: ../ProjectController.py:841
-#: ../ProjectController.py:850
-#, fuzzy
-msgid "Runtime extensions C code generation failed !\n"
-msgstr "插件代码生成失败!\n"
-
-#: ../canfestival/SlaveEditor.py:34
-#: ../canfestival/NetworkEditor.py:64
+#: ../ProjectController.py:1127
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr "运行时IO扩展C代码生成失败!\n"
+
+#: ../ProjectController.py:1136
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr "运行时库扩展C代码生成失败!\n"
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
 msgid "SDO Client"
-msgstr ""
-
-#: ../canfestival/SlaveEditor.py:33
-#: ../canfestival/NetworkEditor.py:63
+msgstr "SDO客户端"
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
 msgid "SDO Server"
-msgstr ""
-
-#: ../controls/ProjectPropertiesPanel.py:143
-#: ../dialogs/PouDialog.py:36
+msgstr "SDO服务器"
+
+#: ../dialogs/PouDialog.py:44 ../controls/ProjectPropertiesPanel.py:158
 msgid "SFC"
-msgstr "顺序功能流程图"
-
-#: ../plcopen/structures.py:197
-msgid ""
-"SR bistable\n"
-"The SR bistable is a latch where the Set dominates."
-msgstr ""
-"SR双稳态\n"
-"SR双稳态是一个设置支配的锁存器。"
-
-#: ../dialogs/PouTransitionDialog.py:35
-#: ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+msgstr "顺序功能图"
+
+#: ../PLCGenerator.py:1433
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr "POU \"{a1}\" 中的SFC跳转 涉及不存在SFC步 \"{a2}\""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr "在POU \"%s\" 中 SFC 移动必须被连接。"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:44
 msgid "ST"
-msgstr "结构化文字"
-
-#: ../PLCOpenEditor.py:347
+msgstr "结构化文本"
+
+#: ../PLCOpenEditor.py:308
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr "ST 文件 (*.st)|*.st|所有文件|*.*"
 
-#: ../svgui/svgui.py:92
-#, fuzzy
+#: ../svgui/svgui.py:136
 msgid "SVG files (*.svg)|*.svg|All files|*.*"
-msgstr "ST 文件 (*.st)|*.st|所有文件|*.*"
-
-#: ../features.py:10
+msgstr "SVG 文件 (*.svg)|*.svg|All files|*.*"
+
+#: ../features.py:36
 msgid "SVGUI"
-msgstr ""
-
-#: ../Beremiz.py:313
-#: ../Beremiz.py:344
-#: ../PLCOpenEditor.py:134
-#: ../PLCOpenEditor.py:169
-#, fuzzy
+msgstr "SVGUI"
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
 msgid "Save"
-msgstr "保存日志"
-
-#: ../Beremiz.py:345
-#: ../PLCOpenEditor.py:136
-#: ../PLCOpenEditor.py:170
-#, fuzzy
+msgstr "保存"
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
 msgid "Save As..."
-msgstr "另存为...\tCTRL+SHIFT+S"
-
-#: ../Beremiz.py:315
-#, fuzzy
+msgstr "另存为..."
+
+#: ../BeremizIDE.py:249
 msgid "Save as"
-msgstr "保存日志"
-
-#: ../dialogs/SearchInProjectDialog.py:76
+msgstr "另存为"
+
+#: ../ProjectController.py:530
+msgid "Save path is the same as path of a project! \n"
+msgstr "保存路径和项目路径相同!\n"
+
+#: ../dialogs/SearchInProjectDialog.py:73
 msgid "Scope"
-msgstr ""
-
-#: ../IDEFrame.py:592
-#: ../dialogs/SearchInProjectDialog.py:105
+msgstr "范围"
+
+#: ../IDEFrame.py:644
 msgid "Search"
-msgstr ""
-
-#: ../IDEFrame.py:360
-#: ../IDEFrame.py:404
-#: ../dialogs/SearchInProjectDialog.py:52
-#, fuzzy
+msgstr "搜索"
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:384
+#: ../IDEFrame.py:430
 msgid "Search in Project"
-msgstr "选择一个对象"
-
-#: ../dialogs/DurationEditorDialog.py:46
+msgstr "在项目中搜索"
+
+#: ../dialogs/DurationEditorDialog.py:49
 msgid "Seconds:"
-msgstr ""
-
-#: ../IDEFrame.py:366
-#, fuzzy
+msgstr "秒:"
+
+#: ../IDEFrame.py:390
 msgid "Select All"
-msgstr "全部选中\tCTRL+A"
-
-#: ../controls/VariablePanel.py:277
-#: ../editors/TextViewer.py:330
-#: ../editors/Viewer.py:277
+msgstr "选择全部"
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
 msgid "Select a variable class:"
 msgstr "选择一个变量种类:"
 
-#: ../ProjectController.py:1013
-#, fuzzy
+#: ../ProjectController.py:1293
 msgid "Select an editor:"
-msgstr "选择一个对象"
-
-#: ../controls/PouInstanceVariablesPanel.py:197
-#, fuzzy
+msgstr "选择一个编辑:"
+
+#: ../controls/PouInstanceVariablesPanel.py:292
 msgid "Select an instance"
-msgstr "删除实例"
-
-#: ../IDEFrame.py:576
+msgstr "选择一个实例"
+
+#: ../IDEFrame.py:628
 msgid "Select an object"
 msgstr "选择一个对象"
 
+#: ../ProjectController.py:537
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr "选择的目录已经包含其他项目。覆盖?\n"
+
 #: ../plcopen/iec_std.csv:70
 msgid "Selection"
 msgstr "选择"
 
-#: ../dialogs/SFCDivergenceDialog.py:62
+#: ../dialogs/SFCDivergenceDialog.py:66
 msgid "Selection Convergence"
 msgstr "选择收敛"
 
-#: ../dialogs/SFCDivergenceDialog.py:55
+#: ../dialogs/SFCDivergenceDialog.py:65
 msgid "Selection Divergence"
 msgstr "选择发散"
 
-#: ../plcopen/structures.py:207
-msgid ""
-"Semaphore\n"
-"The semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources."
-msgstr ""
-"信号\n"
-"信号提供一个机制,使软件元素相互排斥的进入一定资源。"
-
-#: ../dialogs/DiscoveryDialog.py:84
-#, fuzzy
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr "服务探索"
+
+#: ../dialogs/DiscoveryDialog.py:104
 msgid "Services available:"
-msgstr "选择一个变量种类:"
-
-#: ../dialogs/LDElementDialog.py:72
+msgstr "存在的服务:"
+
+#: ../dialogs/LDElementDialog.py:79
 msgid "Set"
 msgstr "设置"
 
@@ -3192,27 +3036,27 @@
 msgid "Shift right"
 msgstr "右移"
 
-#: ../ProjectController.py:1519
+#: ../ProjectController.py:1863
 msgid "Show IEC code generated by PLCGenerator"
 msgstr "显示由PLCGenerator生成的IEC代码"
 
-#: ../canfestival/canfestival.py:288
+#: ../canfestival/canfestival.py:407
 msgid "Show Master"
 msgstr "显示主控"
 
-#: ../canfestival/canfestival.py:289
+#: ../canfestival/canfestival.py:408
 msgid "Show Master generated by config_utils"
 msgstr "显示由config_utils生成的主控"
 
-#: ../ProjectController.py:1517
+#: ../ProjectController.py:1862
 msgid "Show code"
 msgstr "显示代码"
 
-#: ../dialogs/SFCDivergenceDialog.py:74
+#: ../dialogs/SFCDivergenceDialog.py:68
 msgid "Simultaneous Convergence"
 msgstr "同步收敛"
 
-#: ../dialogs/SFCDivergenceDialog.py:68
+#: ../dialogs/SFCDivergenceDialog.py:67
 msgid "Simultaneous Divergence"
 msgstr "同步发散"
 
@@ -3220,64 +3064,75 @@
 msgid "Sine"
 msgstr "正弦"
 
-#: ../editors/ResourceEditor.py:67
+#: ../editors/ResourceEditor.py:76
 msgid "Single"
 msgstr "单"
 
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr "源代码没有变化,不需要构建.\n"
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid ""
+"Source signal has to be defined for single task '{a1}' in resource "
+"'{a2}.{a3}'."
+msgstr "源信号必须被定义对于一个单独任务 '{a1}' 在资源 '{a2}.{a3}'."
+
 #: ../plcopen/iec_std.csv:23
 msgid "Square root (base 2)"
 msgstr "平方根(底数2)"
 
-#: ../plcopen/structures.py:193
+#: ../plcopen/definitions.py:50
 msgid "Standard function blocks"
 msgstr "标准功能类型"
 
-#: ../Beremiz_service.py:319
-#: ../ProjectController.py:1495
+#: ../ProjectController.py:1829 ../Beremiz_service.py:271
 msgid "Start PLC"
 msgstr "开始PLC"
 
-#: ../ProjectController.py:819
+#: ../ProjectController.py:1074
 #, python-format
 msgid "Start build in %s\n"
 msgstr "开始建立 %s\n"
 
-#: ../ProjectController.py:1314
-#, fuzzy
+#: ../ProjectController.py:1397
+msgid "Started"
+msgstr "已开始"
+
+#: ../ProjectController.py:1633
 msgid "Starting PLC\n"
-msgstr "开始PLC"
-
-#: ../Beremiz.py:403
+msgstr "启动PLC\n"
+
+#: ../BeremizIDE.py:393
 msgid "Status ToolBar"
-msgstr ""
-
-#: ../editors/Viewer.py:493
-#, fuzzy
+msgstr "状态工具栏"
+
+#: ../editors/Viewer.py:651 ../editors/Viewer.py:2424
 msgid "Step"
-msgstr "编辑步骤"
-
-#: ../ProjectController.py:1498
+msgstr "步"
+
+#: ../ProjectController.py:1835
 msgid "Stop"
 msgstr "停止"
 
-#: ../Beremiz_service.py:320
+#: ../Beremiz_service.py:272
 msgid "Stop PLC"
 msgstr "停止PLC"
 
-#: ../ProjectController.py:1500
+#: ../ProjectController.py:1836
 msgid "Stop Running PLC"
 msgstr "停止运行PLC"
 
-#: ../ProjectController.py:1292
-#, fuzzy
-msgid "Stopping debugger...\n"
-msgstr "正在停止调试\n"
-
-#: ../editors/DataTypeEditor.py:52
+#: ../ProjectController.py:1398
+msgid "Stopped"
+msgstr "已停止"
+
+#: ../editors/DataTypeEditor.py:60
 msgid "Structure"
 msgstr "结构的"
 
-#: ../editors/DataTypeEditor.py:52
+#: ../editors/DataTypeEditor.py:60
 msgid "Subrange"
 msgstr "子集的"
 
@@ -3285,53 +3140,83 @@
 msgid "Subtraction"
 msgstr "减法"
 
-#: ../ProjectController.py:915
+#: ../ProjectController.py:1113
 msgid "Successfully built.\n"
-msgstr ""
-
-#: ../dialogs/SearchInProjectDialog.py:154
+msgstr "成功构建.\n"
+
+#: ../IDEFrame.py:449
+msgid "Switch perspective"
+msgstr "切换视图"
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
 msgid "Syntax error in regular expression of pattern to search!"
-msgstr ""
+msgstr "在模式搜索正则表达式语法错误!"
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr "类型"
 
 #: ../plcopen/iec_std.csv:29
 msgid "Tangent"
 msgstr "正切"
 
-#: ../editors/ResourceEditor.py:76
+#: ../editors/ResourceEditor.py:97
 msgid "Task"
 msgstr "任务 "
 
-#: ../editors/ResourceEditor.py:218
+#: ../editors/ResourceEditor.py:248
 msgid "Tasks:"
 msgstr "任务:"
 
-#: ../controls/VariablePanel.py:78
+#: ../controls/VariablePanel.py:91
 msgid "Temp"
 msgstr "缓冲"
 
-#: ../editors/FileManagementPanel.py:398
+#: ../version.py:35
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+"关于Beremiz/PLCOpenEditor的最佳问问题点\n"
+"是项目的邮件列表: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"这主要是社区支持渠道。\n"
+"发布必须订阅邮件列表。\n"
+"\n"
+"你可在这里订阅列表:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+
+#: ../editors/FileManagementPanel.py:186
 #, python-format
 msgid ""
 "The file '%s' already exist.\n"
 "Do you want to replace it?"
 msgstr ""
-
-#: ../editors/LDViewer.py:879
+"文件 '%s' 已经存在。\n"
+"你真的要替换它?"
+
+#: ../editors/LDViewer.py:893
 msgid "The group of block must be coherent!"
 msgstr "块的组必须是连贯的!"
 
-#: ../IDEFrame.py:1091
-#: ../Beremiz.py:555
+#: ../BeremizIDE.py:573 ../IDEFrame.py:1046
 msgid "There are changes, do you want to save?"
 msgstr "文件已被改动。你希望保存吗?"
 
-#: ../IDEFrame.py:1709
-#: ../IDEFrame.py:1728
-#, python-format
-msgid "There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?"
+#: ../IDEFrame.py:1691 ../IDEFrame.py:1710
+#, python-format
+msgid ""
+"There is a POU named \"%s\". This could cause a conflict. Do you wish to "
+"continue?"
 msgstr "一个编程组织单元被命名为\"%s\"。这可能会产生冲突。你希望继续吗?"
 
-#: ../IDEFrame.py:1178
+#: ../IDEFrame.py:1133
 msgid ""
 "There was a problem printing.\n"
 "Perhaps your current printer is not set correctly?"
@@ -3339,20 +3224,20 @@
 "打印出现问题。\n"
 "请检查你当前打印机设置。"
 
-#: ../editors/LDViewer.py:888
+#: ../editors/LDViewer.py:902
 msgid "This option isn't available yet!"
 msgstr "该选项尚未可用!"
 
-#: ../editors/GraphicViewer.py:278
-msgid "Tick"
-msgstr ""
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:567
+#, python-format
+msgid "Tick: %d"
+msgstr "滴答: %d"
 
 #: ../plcopen/iec_std.csv:40
 msgid "Time"
-msgstr ""
-
-#: ../plcopen/iec_std.csv:40
-#: ../plcopen/iec_std.csv:41
+msgstr "时间"
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
 msgid "Time addition"
 msgstr "时间加法"
 
@@ -3360,104 +3245,115 @@
 msgid "Time concatenation"
 msgstr "时间级联"
 
-#: ../plcopen/iec_std.csv:60
-#: ../plcopen/iec_std.csv:61
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
 msgid "Time division"
 msgstr "时间除法"
 
-#: ../plcopen/iec_std.csv:46
-#: ../plcopen/iec_std.csv:47
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
 msgid "Time multiplication"
 msgstr "时间乘法"
 
-#: ../plcopen/iec_std.csv:48
-#: ../plcopen/iec_std.csv:49
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
 msgid "Time subtraction"
 msgstr "时间减法"
 
-#: ../plcopen/iec_std.csv:42
-#: ../plcopen/iec_std.csv:43
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
 msgid "Time-of-day addition"
 msgstr "日期时间加法"
 
-#: ../plcopen/iec_std.csv:52
-#: ../plcopen/iec_std.csv:53
-#: ../plcopen/iec_std.csv:54
-#: ../plcopen/iec_std.csv:55
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
 msgid "Time-of-day subtraction"
 msgstr "日期时间减法"
 
-#: ../editors/Viewer.py:432
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr "触发值"
+
+#: ../editors/Viewer.py:584
 msgid "Top"
 msgstr "顶部"
 
-#: ../ProjectController.py:1507
+#: ../ProjectController.py:1848
 msgid "Transfer"
 msgstr "传输"
 
-#: ../ProjectController.py:1509
+#: ../ProjectController.py:1849
 msgid "Transfer PLC"
 msgstr "传输PLC"
 
-#: ../ProjectController.py:1474
+#: ../ProjectController.py:1802
 msgid "Transfer completed successfully.\n"
 msgstr "传输成功\n"
 
-#: ../ProjectController.py:1476
+#: ../ProjectController.py:1805
 msgid "Transfer failed\n"
 msgstr "传输失败\n"
 
-#: ../editors/Viewer.py:494
-#, fuzzy
+#: ../editors/Viewer.py:652 ../editors/Viewer.py:2426
+#: ../editors/Viewer.py:2453
 msgid "Transition"
-msgstr "跃迁"
-
-#: ../PLCGenerator.py:1212
-#, python-format
-msgid "Transition \"%s\" body must contain an output variable or coil referring to its name"
-msgstr ""
-
-#: ../dialogs/PouTransitionDialog.py:84
+msgstr "转换"
+
+#: ../PLCGenerator.py:1564
+#, python-format
+msgid ""
+"Transition \"%s\" body must contain an output variable or coil referring to "
+"its name"
+msgstr "转换 \"%s\" 体必须包含一个输出变量或圈指的是它的名字"
+
+#: ../dialogs/PouTransitionDialog.py:91
 msgid "Transition Name"
-msgstr "跃迁名字"
-
-#: ../dialogs/PouTransitionDialog.py:53
+msgstr "转换名字"
+
+#: ../dialogs/PouTransitionDialog.py:60
 msgid "Transition Name:"
-msgstr "跃迁名字:"
-
-#: ../PLCGenerator.py:1301
-#, python-format
-msgid "Transition with content \"%s\" not connected to a next step in \"%s\" POU"
-msgstr "跃迁的内容 \"%s\" 与后一步骤没有关联在 \"%s\" 中"
-
-#: ../PLCGenerator.py:1292
-#, python-format
-msgid "Transition with content \"%s\" not connected to a previous step in \"%s\" POU"
-msgstr "跃迁的内容 \"%s\" 与前一步骤没有关联在 \"%s\" 中"
-
-#: ../plcopen/plcopen.py:1442
+msgstr "转换名字:"
+
+#: ../PLCGenerator.py:1657
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr "转换的内容 \"{a1}\" 没有连接到下一步在 \"{a2}\" POU"
+
+#: ../PLCGenerator.py:1646
+#, python-brace-format
+msgid ""
+"Transition with content \"{a1}\" not connected to a previous step in "
+"\"{a2}\" POU"
+msgstr "转换的内容 \"{a1}\" 没有连接到前一步在 \"{a2}\" POU"
+
+#: ../plcopen/plcopen.py:1526
 #, python-format
 msgid "Transition with name %s doesn't exist!"
-msgstr "已命名的跃迁 %s 尚不存在!"
-
-#: ../PLCControler.py:95
+msgstr "已命名的转换 %s 尚不存在!"
+
+#: ../plcopen/types_enums.py:76
 msgid "Transitions"
-msgstr "跃迁"
-
-#: ../editors/ResourceEditor.py:67
+msgstr "转换"
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr "转换因为"
+
+#: ../editors/ResourceEditor.py:76
 msgid "Triggering"
-msgstr ""
-
-#: ../controls/VariablePanel.py:58
-#: ../controls/VariablePanel.py:59
-#: ../editors/DataTypeEditor.py:48
-#: ../editors/ResourceEditor.py:76
-#: ../dialogs/ActionBlockDialog.py:37
+msgstr "触发"
+
+#: ../Beremiz_service.py:490
+msgid "Twisted unavailable."
+msgstr "扭曲的不可用。"
+
+#: ../dialogs/ActionBlockDialog.py:42 ../editors/ResourceEditor.py:97
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:733
+#: ../controls/VariablePanel.py:61
 msgid "Type"
 msgstr "类型"
 
-#: ../canfestival/config_utils.py:335
-#: ../canfestival/config_utils.py:617
+#: ../dialogs/BrowseLocationsDialog.py:54
+msgid "Type and derivated"
+msgstr "类型和派生"
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
 #, python-format
 msgid "Type conflict for location \"%s\""
 msgstr "位置的冲突类型 \"%s\""
@@ -3466,263 +3362,324 @@
 msgid "Type conversion"
 msgstr "类型转换"
 
-#: ../editors/DataTypeEditor.py:155
+#: ../editors/DataTypeEditor.py:170
 msgid "Type infos:"
 msgstr "类型信息:"
 
-#: ../dialogs/SFCDivergenceDialog.py:51
-#: ../dialogs/LDPowerRailDialog.py:51
-#: ../dialogs/ConnectionDialog.py:52
-#: ../dialogs/SFCTransitionDialog.py:53
-#: ../dialogs/FBDBlockDialog.py:48
+#: ../dialogs/BrowseLocationsDialog.py:55
+msgid "Type strict"
+msgstr "严格类型"
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:111
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
 msgid "Type:"
 msgstr "类型:"
 
-#: ../canfestival/config_utils.py:455
-#: ../canfestival/config_utils.py:469
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr "URI主机:"
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr "URI端口:"
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr "URI 类型:"
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
 #, python-format
 msgid "Unable to define PDO mapping for node %02x"
-msgstr ""
-
-#: ../targets/Xenomai/__init__.py:14
-#, fuzzy, python-format
+msgstr "对于 %02x节点不能定义POU映射"
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
 msgid "Unable to get Xenomai's %s \n"
-msgstr "无法获取Xenomai的CFLAGS\n"
-
-#: ../PLCGenerator.py:865
-#: ../PLCGenerator.py:924
-#, fuzzy, python-format
-msgid "Undefined block type \"%s\" in \"%s\" POU"
-msgstr "未定义的pou类型"
-
-#: ../PLCGenerator.py:240
+msgstr "不能获得 Xenomai 的 %s \n"
+
+#: ../PLCGenerator.py:974 ../PLCGenerator.py:1252
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr "未定义块类型 \"{a1}\" 在 \"{a2}\" POU中"
+
+#: ../PLCGenerator.py:261
 #, python-format
 msgid "Undefined pou type \"%s\""
 msgstr "未定义的pou类型"
 
-#: ../IDEFrame.py:338
-#: ../IDEFrame.py:397
+#: ../IDEFrame.py:365 ../IDEFrame.py:423
 msgid "Undo"
-msgstr ""
-
-#: ../ProjectController.py:254
+msgstr "撤销"
+
+#: ../ProjectController.py:442
 msgid "Unknown"
-msgstr ""
-
-#: ../editors/Viewer.py:336
+msgstr "未知"
+
+#: ../editors/Viewer.py:437
 #, python-format
 msgid "Unknown variable \"%s\" for this POU!"
 msgstr "未知的变量 \"%s\" 这个POU!"
 
-#: ../ProjectController.py:251
-#: ../ProjectController.py:252
-#, fuzzy
+#: ../ProjectController.py:439 ../ProjectController.py:440
 msgid "Unnamed"
-msgstr "未命名%d"
-
-#: ../PLCControler.py:305
+msgstr "未命名"
+
+#: ../PLCControler.py:263
 #, python-format
 msgid "Unnamed%d"
 msgstr "未命名%d"
 
-#: ../controls/VariablePanel.py:272
+#: ../controls/VariablePanel.py:308
 #, python-format
 msgid "Unrecognized data size \"%s\""
 msgstr "无法识别数据大小 \"%s\""
 
-#: ../plcopen/structures.py:222
-msgid ""
-"Up-counter\n"
-"The up-counter can be used to signal when a count has reached a maximum value."
-msgstr ""
-"顺计时器\n"
-"当计数到达最大值时,顺计时器给出信号。"
-
-#: ../plcopen/structures.py:232
-msgid ""
-"Up-down counter\n"
-"The up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other."
-msgstr ""
-"顺逆计数器\n"
-"顺逆计数器有两个输入:CU和CD。可用于顺计时和倒计时的输入。"
-
-#: ../controls/VariablePanel.py:709
-#: ../editors/DataTypeEditor.py:623
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:841
 msgid "User Data Types"
 msgstr "用户数据类型"
 
-#: ../canfestival/SlaveEditor.py:38
-#: ../canfestival/NetworkEditor.py:68
-#, fuzzy
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
 msgid "User Type"
-msgstr "用户数据类型"
-
-#: ../PLCControler.py:94
+msgstr "用户类型"
+
+#: ../plcopen/types_enums.py:75
 msgid "User-defined POUs"
 msgstr "用户 - 定义POUs"
 
-#: ../controls/DebugVariablePanel.py:40
-#: ../dialogs/ActionBlockDialog.py:37
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Value"
 msgstr "值"
 
-#: ../editors/GraphicViewer.py:278
-msgid "Values"
-msgstr "值"
-
-#: ../editors/DataTypeEditor.py:252
+#: ../editors/DataTypeEditor.py:267
 msgid "Values:"
 msgstr "值:"
 
-#: ../controls/DebugVariablePanel.py:40
-#: ../editors/Viewer.py:466
-#: ../dialogs/ActionBlockDialog.py:41
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:622
+#: ../editors/Viewer.py:2456
 msgid "Variable"
 msgstr "变量"
 
-#: ../dialogs/FBDVariableDialog.py:47
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:355
+msgid "Variable Drop"
+msgstr "变量Drop"
+
+#: ../dialogs/FBDVariableDialog.py:68
 msgid "Variable Properties"
 msgstr "变量属性"
 
-#: ../controls/VariablePanel.py:277
-#: ../editors/TextViewer.py:330
-#: ../editors/Viewer.py:277
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:316
+#: ../controls/VariablePanel.py:379
 msgid "Variable class"
 msgstr "变量种类"
 
-#: ../editors/TextViewer.py:374
-#: ../editors/Viewer.py:338
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
 msgid "Variable don't belong to this POU!"
 msgstr "变量不属于这个POU!"
 
-#: ../controls/VariablePanel.py:77
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr "变量:"
+
+#: ../controls/VariablePanel.py:90
 msgid "Variables"
 msgstr "变量"
 
-#: ../controls/ProjectPropertiesPanel.py:151
-#, fuzzy
+#: ../controls/ProjectPropertiesPanel.py:166
 msgid "Vertical:"
-msgstr "数学式"
-
-#: ../wxglade_hmi/wxglade_hmi.py:11
+msgstr "垂直的:"
+
+#: ../runtime/WampClient.py:113
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr "WAMP 客户端连接失败 (%s) .. 重试 .."
+
+#: ../runtime/WampClient.py:117
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr "WAMP 客户端连接丢失 (%s) .. 重试 .."
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr "WAMP ID:"
+
+#: ../runtime/WampClient.py:172
+msgid "WAMP client connecting to :"
+msgstr "WAMP 客户端连接到 :"
+
+#: ../runtime/WampClient.py:148
+msgid "WAMP client connection not established!"
+msgstr "WAMP 客户端连接没有建立!"
+
+#: ../Beremiz_service.py:625
+msgid "WAMP client startup failed. "
+msgstr "WAMP客户端启动失败。"
+
+#: ../Beremiz_service.py:621
+msgid "WAMP config is incomplete."
+msgstr "WAMP 配置不完整."
+
+#: ../Beremiz_service.py:623
+msgid "WAMP config is missing."
+msgstr "WAMP 配置丢失."
+
+#: ../connectors/WAMP/__init__.py:99
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr "WAMP 连接到 URL : %s\n"
+
+#: ../connectors/WAMP/__init__.py:140
+msgid "WAMP connection timeout"
+msgstr "WAMP连接超时"
+
+#: ../connectors/WAMP/__init__.py:158
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr "WAMP 连接到 '%s' 失败。\n"
+
+#: ../Beremiz_service.py:595
+msgid "WAMP import failed :"
+msgstr "WAMP导入失败:"
+
+#: ../runtime/WampClient.py:126
+msgid "WAMP load error: "
+msgstr "WAMP 加载错误: "
+
+#: ../runtime/WampClient.py:108
+msgid "WAMP session left"
+msgstr "WAMP 会话残留"
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
 msgid "WXGLADE GUI"
 msgstr "WXGLADE 用户图形界面"
 
-#: ../ProjectController.py:1276
-msgid "Waiting debugger to recover...\n"
-msgstr ""
-
-#: ../editors/LDViewer.py:888
-#: ../dialogs/PouDialog.py:126
+#: ../runtime/WampClient.py:137
+msgid "Wamp secret load error:"
+msgstr "Wamp 加密加载错误:"
+
+#: ../dialogs/PouDialog.py:137 ../editors/LDViewer.py:902
 msgid "Warning"
 msgstr "警告"
 
-#: ../ProjectController.py:515
+#: ../ProjectController.py:726
 msgid "Warnings in ST/IL/SFC code generator :\n"
 msgstr "警告在ST/IL/SFC代码生成器中:\n"
 
-#: ../dialogs/SearchInProjectDialog.py:85
-#, fuzzy
+#: ../dialogs/SearchInProjectDialog.py:82
 msgid "Whole Project"
-msgstr ""
-"#-#-#-#-#  Beremiz_zh_CN.po (PACKAGE VERSION)  #-#-#-#-#\n"
-"关闭项目\n"
-"#-#-#-#-#  PLCOpenEditor_zh_CN.po (PACKAGE VERSION)  #-#-#-#-#\n"
-"关闭程序"
-
-#: ../controls/ProjectPropertiesPanel.py:119
+msgstr "整个项目"
+
+#: ../controls/ProjectPropertiesPanel.py:134
 msgid "Width:"
 msgstr "宽度:"
 
-#: ../dialogs/FindInPouDialog.py:86
+#: ../dialogs/FindInPouDialog.py:94
 msgid "Wrap search"
-msgstr ""
-
-#: ../features.py:9
+msgstr "包搜索"
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr "出自"
+
+#: ../features.py:35
 msgid "WxGlade GUI"
-msgstr ""
-
-#: ../svgui/svgui.py:106
+msgstr "WxGlade GUI"
+
+#: ../svgui/svgui.py:150
 msgid ""
 "You don't have write permissions.\n"
 "Open Inkscape anyway ?"
 msgstr ""
-
-#: ../wxglade_hmi/wxglade_hmi.py:108
+"你没有写入的许可。\n"
+"无论如何都打开Inkscape?"
+
+#: ../wxglade_hmi/wxglade_hmi.py:160
 msgid ""
 "You don't have write permissions.\n"
 "Open wxGlade anyway ?"
 msgstr ""
-
-#: ../ProjectController.py:220
+"你没有写入的许可。\n"
+"无论如何都打开wxGlade?"
+
+#: ../ProjectController.py:390
 msgid ""
 "You must have permission to work on the project\n"
 "Work on a project copy ?"
 msgstr ""
-
-#: ../editors/LDViewer.py:883
-msgid "You must select the block or group of blocks around which a branch should be added!"
+"你必须有在此项目上工作的许可\n"
+"在项目的一个拷贝上工作?"
+
+#: ../editors/LDViewer.py:897
+msgid ""
+"You must select the block or group of blocks around which a branch should be"
+" added!"
 msgstr "你必须选择一个块或块的组围绕着需被添加的分支!"
 
-#: ../editors/LDViewer.py:663
+#: ../editors/LDViewer.py:677
 msgid "You must select the wire where a contact should be added!"
 msgstr "你必须选择一条线连接需被添加的接触点!"
 
-#: ../dialogs/PouNameDialog.py:45
-#: ../dialogs/SFCStepNameDialog.py:47
-#: ../dialogs/SFCStepDialog.py:118
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
 msgid "You must type a name!"
 msgstr "你必须输入一个名字!"
 
-#: ../dialogs/ForceVariableDialog.py:165
-#, fuzzy
+#: ../dialogs/ForceVariableDialog.py:209
 msgid "You must type a value!"
-msgstr "你必须输入一个名字!"
-
-#: ../IDEFrame.py:414
+msgstr "你必须输入一个值!"
+
+#: ../IDEFrame.py:440
 msgid "Zoom"
 msgstr "显示比例"
 
-#: ../editors/GraphicViewer.py:97
-#, fuzzy
-msgid "Zoom:"
-msgstr "显示比例"
-
-#: ../PLCOpenEditor.py:356
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "days"
+msgstr "日"
+
+#: ../PLCOpenEditor.py:317
 #, python-format
 msgid "error: %s\n"
 msgstr "错误:%s\n"
 
-#: ../util/ProcessLogger.py:161
-#, python-format
-msgid "exited with status %s (pid %s)\n"
-msgstr "退出并保持现状 %s (pid %s)\n"
-
-#: ../PLCOpenEditor.py:508
-#: ../PLCOpenEditor.py:510
-msgid "file : "
-msgstr "文件:"
-
-#: ../dialogs/PouDialog.py:31
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr "退出伴随状态 {a1} (pid {a2})\n"
+
+#: ../dialogs/PouDialog.py:36
 msgid "function"
 msgstr "功能"
 
-#: ../PLCOpenEditor.py:511
-msgid "function : "
-msgstr "功能:"
-
-#: ../dialogs/PouDialog.py:31
+#: ../dialogs/PouDialog.py:36
 msgid "functionBlock"
 msgstr "功能块"
 
-#: ../PLCOpenEditor.py:511
-msgid "line : "
-msgstr "在线:"
-
-#: ../dialogs/PouDialog.py:31
+#: ../dialogs/DurationEditorDialog.py:158
+msgid "hours"
+msgstr "小时"
+
+#: ../ProjectController.py:753
+msgid "matiec installation is not found\n"
+msgstr "matiec安装没有发现\n"
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "milliseconds"
+msgstr "毫秒"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "minutes"
+msgstr "分"
+
+#: ../dialogs/PouDialog.py:36
 msgid "program"
 msgstr "程序"
 
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "seconds"
+msgstr "秒"
+
 #: ../plcopen/iec_std.csv:84
 msgid "string from the middle"
 msgstr "从中间取字符串"
@@ -3735,11 +3692,29 @@
 msgid "string right of"
 msgstr "从右取字符串"
 
-#: ../PLCOpenEditor.py:354
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr "更新信息不存在"
+
+#: ../PLCOpenEditor.py:315
 #, python-format
 msgid "warning: %s\n"
 msgstr "警告:%s\n"
 
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr "{a1} \"{a2}\" 不能被粘贴作为一个 {a3}."
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+"{a1} XML文件没有遵循XSD schema在行 {a2}:\n"
+"{a3}"
+
 #: Extra XSD strings
 msgid "CanFestivalSlaveNode"
 msgstr "CanFestival从节点"
@@ -3771,18 +3746,102 @@
 msgid "CAN_Driver"
 msgstr "CAN_驱动"
 
-msgid "Debug_mode"
-msgstr "调试_模式"
-
-msgid "CExtension"
-msgstr "C扩展"
+msgid "Generic"
+msgstr "一般的"
+
+msgid "Command"
+msgstr "命令"
+
+msgid "Xenomai"
+msgstr "Xenomai"
+
+msgid "XenoConfig"
+msgstr "XenoConfig"
+
+msgid "Compiler"
+msgstr "编译"
 
 msgid "CFLAGS"
 msgstr "CFLAGS"
 
+msgid "Linker"
+msgstr "链接 "
+
 msgid "LDFLAGS"
 msgstr "LDFLAGS"
 
+msgid "Linux"
+msgstr "Linux"
+
+msgid "Win32"
+msgstr "Win32"
+
+msgid "ModbusRequest"
+msgstr "Modbus请求"
+
+msgid "SlaveID"
+msgstr "从站ID"
+
+msgid "Nr_of_Channels"
+msgstr "通道号"
+
+msgid "Start_Address"
+msgstr "起始地址"
+
+msgid "Timeout_in_ms"
+msgstr "超时 ms单位"
+
+msgid "MemoryArea"
+msgstr "存储区域"
+
+msgid "MemoryAreaType"
+msgstr "存储区域类型"
+
+msgid "ModbusTCPclient"
+msgstr "ModubsTCP客户端"
+
+msgid "Remote_IP_Address"
+msgstr "远程IP地址"
+
+msgid "Remote_Port_Number"
+msgstr "远程端口号"
+
+msgid "Invocation_Rate_in_ms"
+msgstr "调用率ms单位"
+
+msgid "ModbusServerNode"
+msgstr "Modbus服务器节点"
+
+msgid "Local_IP_Address"
+msgstr "本地IP地址"
+
+msgid "Local_Port_Number"
+msgstr "本地端口号"
+
+msgid "ModbusRTUclient"
+msgstr "ModbusRTC客户端"
+
+msgid "Serial_Port"
+msgstr "串行端口"
+
+msgid "Baud_Rate"
+msgstr "波特率"
+
+msgid "Parity"
+msgstr "奇偶校验"
+
+msgid "Stop_Bits"
+msgstr "停止位"
+
+msgid "ModbusRTUslave"
+msgstr "ModbusRTU从站"
+
+msgid "ModbusRoot"
+msgstr "Modbus根"
+
+msgid "MaxRemoteTCPclients"
+msgstr "最大远程TCP客户端"
+
 msgid "BaseParams"
 msgstr "基本参照 "
 
@@ -3792,412 +3851,221 @@
 msgid "Enabled"
 msgstr "启用"
 
-msgid "Linux"
-msgstr "Linux"
-
-msgid "Compiler"
-msgstr "编译"
-
-msgid "Linker"
-msgstr "链接 "
-
-msgid "Win32"
-msgstr "Win32"
-
-msgid "Xenomai"
-msgstr "Xenomai"
-
-msgid "XenoConfig"
-msgstr "XenoConfig"
-
 msgid "BeremizRoot"
 msgstr "Beremiz根"
 
 msgid "TargetType"
 msgstr "目标类型"
 
-#, fuzzy
 msgid "Libraries"
-msgstr "图书馆"
+msgstr "库"
 
 msgid "URI_location"
 msgstr "URI_位置"
 
-#, fuzzy
 msgid "Disable_Extensions"
-msgstr "C扩展"
-
-#~ msgid "#EXCEPTION : "
-#~ msgstr "#异常:"
-
-#~ msgid "A child with IEC channel %d already exist -> %d\n"
-#~ msgstr "一个IEC通道的分支 %d 已经存在 -> %d\n"
-
-#~ msgid "Add Plugin"
-#~ msgstr "添加插件"
-
-#~ msgid "Add a sub plugin"
-#~ msgstr "添加一个子插件"
-
-#~ msgid "Append "
-#~ msgstr "追加"
-
-#~ msgid "Beremiz\tF1"
-#~ msgstr "Beremiz\tF1"
-
-#~ msgid "Broken"
-#~ msgstr "损坏"
-
-#~ msgid "Build\tCTRL+R"
-#~ msgstr "建立\tCTRL+R"
-
-#~ msgid "Can't find module for target %s!\n"
-#~ msgstr "无法为目标找到模型 %s!\n"
-
-#~ msgid "Cancel"
-#~ msgstr "取消"
-
-#~ msgid "Cannot compare latest build to target. Please build.\n"
-#~ msgstr "无法与目标比较最新的建立。\n"
-
-#~ msgid "Debug Thread couldn't be killed"
-#~ msgstr "调试线程不能结束"
-
-#~ msgid "Debug data not coherent %d != %d\n"
-#~ msgstr "调试不和谐的数据 %d != %d\n"
-
-#~ msgid "Debug error idx : %d, expected_idx %d, type : %s"
-#~ msgstr "调试错误 idx : %d, expected_idx %d, 类型 : %s"
-
-#~ msgid "Delete Plugin"
-#~ msgstr "删除插件"
-
-#~ msgid "Delete this plugin"
-#~ msgstr "删除这个插件"
-
-#~ msgid "Dirty"
-#~ msgstr "变质"
-
-#~ msgid "Disconnected"
-#~ msgstr "已断开"
-
-#~ msgid "Do you want to continue?"
-#~ msgstr "你希望继续吗?"
-
-#~ msgid "ERROR"
-#~ msgstr "错误"
-
-#~ msgid "Edit CanOpen Network with NetworkEdit"
-#~ msgstr "用网络编辑器编辑CanOpen网络"
-
-#~ msgid "Edit PLC"
-#~ msgstr "编辑PLC"
-
-#~ msgid "Edit PLC\tCTRL+R"
-#~ msgstr "编辑PLC\tCTRL+R"
-
-#~ msgid "Edit PLC program with PLCOpenEditor"
-#~ msgstr "使用PLCOpen编辑器编辑PLC程序"
-
-#~ msgid "Edit network"
-#~ msgstr "编辑网络"
-
-#~ msgid "Empty"
-#~ msgstr "空的"
-
-#~ msgid "Enable/Disable this plugin"
-#~ msgstr "激活/禁用这个插件"
-
-#~ msgid "Generating plugins C code\n"
-#~ msgstr "生成C代码插件\n"
-
-#~ msgid "Latest build does not match with target, please transfer.\n"
-#~ msgstr "最新构建与目标不匹配,请传输。\n"
-
-#~ msgid "Latest build matches target, no transfer needed.\n"
-#~ msgstr "最新构建与目标匹配,不需要传输。\n"
-
-#~ msgid "My IP is :"
-#~ msgstr "我的IP是:"
-
-#~ msgid "New\tCTRL+N"
-#~ msgstr "新建\tCTRL+N"
-
-#~ msgid "NewPLC (%s)"
-#~ msgstr "新的PLC(%s)"
-
-#~ msgid "OK"
-#~ msgstr "确定"
-
-#~ msgid "Open\tCTRL+O"
-#~ msgstr "打开\tCTRL+O"
-
-#~ msgid "Please stop PLC to close"
-#~ msgstr "请停止PLC以便关闭"
-
-#~ msgid "Plugin : "
-#~ msgstr "插件:"
-
-#~ msgid "Problem %s PLC"
-#~ msgstr "问题  %s PLC"
-
-#~ msgid "Project not created"
-#~ msgstr "项目未创建"
-
-#~ msgid "Publish service on local network"
-#~ msgstr "在本地网络发布服务"
-
-#~ msgid "PythonThreadProc interrupted"
-#~ msgstr "Python线程处理被中断"
-
-#~ msgid "Question"
-#~ msgstr "问题"
-
-#~ msgid "Quit\tCTRL+Q"
-#~ msgstr "退出\tCTRL+Q"
-
-#~ msgid "Save\tCTRL+S"
-#~ msgstr "保存\tCTRL+S"
-
-#~ msgid "Save changes ?"
-#~ msgstr "保存修改?"
-
-#~ msgid "Simulate"
-#~ msgstr "模拟"
-
-#~ msgid "Start PLC (debug mode)"
-#~ msgstr "开始PLC(调试模式)"
-
-#~ msgid "Started"
-#~ msgstr "已开始"
-
-#~ msgid "Starting PLC (debug mode)\n"
-#~ msgstr "正在开始PLC(调试模式)\n"
-
-#~ msgid "Stopped"
-#~ msgstr "已停止"
-
-#~ msgid "The daemon runs on port :"
-#~ msgstr "守护进程在端口运行:"
-
-#~ msgid "The object's uri is :"
-#~ msgstr "对象的uri是:"
-
-#~ msgid "The working directory :"
-#~ msgstr "工作目录:"
-
-#~ msgid "Unable to get Xenomai's LDFLAGS\n"
-#~ msgstr "无法获取Xenomai的LDFLAGS\n"
-
-#~ msgid "Write Python runtime code, for use with python_eval FBs"
-#~ msgstr "编辑Python运行时间代码,与python_eval FBs一起使用"
-
-#~ msgid "Wrong URI, please check it !\n"
-#~ msgstr "错误的URI,请检查!\n"
-
-#~ msgid "You are about to overwrite that file\n"
-#~ msgstr "你即将要覆盖该文件\n"
-
-#~ msgid "loading"
-#~ msgstr "载入"
-
-#~ msgid "starting"
-#~ msgstr "正在开始"
-
-#~ msgid "Enable_Plugins"
-#~ msgstr "启用_插件"
-
-#~ msgid "Rtai"
-#~ msgstr "Rtai"
-
-#~ msgid "rtai_config"
-#~ msgstr "rtai_config"
-
-#~ msgid ""
-#~ "\n"
-#~ "An error has occurred.\n"
-#~ "\n"
-#~ "Click OK to save an error report.\n"
-#~ "\n"
-#~ "Please contact LOLITech at:\n"
-#~ "+33 (0)3 29 57 60 42\n"
-#~ "bugs_PLCOpenEditor@lolitech.fr\n"
-#~ "\n"
-#~ "\n"
-#~ "Error:\n"
-#~ msgstr ""
-#~ "\n"
-#~ "一个错误发生了。\n"
-#~ "\n"
-#~ "点击确定以保存一个错误报告。\n"
-#~ "\n"
-#~ "edouard.tisserant@gmail.com\n"
-#~ "\n"
-#~ "\n"
-#~ "错误:\n"
-
-#~ msgid " (Debug)"
-#~ msgstr " (调试)"
-
-#~ msgid "Add a new data type"
-#~ msgstr "添加一个新的数据类型"
-
-#~ msgid "Add new configuration"
-#~ msgstr "添加新配置"
-
-#~ msgid "Add new resource"
-#~ msgstr "添加新源"
-
-#~ msgid "Block Types"
-#~ msgstr "块类型"
-
-#~ msgid "CSV Log"
-#~ msgstr "逗号分隔值文件日志"
-
-#~ msgid "Close\tCTRL+Q"
-#~ msgstr "关闭\tCTRL+Q"
-
-#~ msgid "Copy\tCTRL+C"
-#~ msgstr "复制\tCTRL+C"
-
-#~ msgid "Create a new POU from"
-#~ msgstr "新建一个POU从"
-
-#~ msgid "Cut\tCTRL+X"
-#~ msgstr "剪切\tCTRL+X"
-
-#~ msgid "Delete Task"
-#~ msgstr "删除任务"
-
-#~ msgid "Graphic Panel"
-#~ msgstr "图形面板"
-
-#~ msgid "Instances"
-#~ msgstr "实例"
-
-#~ msgid "Invalid value \"%s\" for location"
-#~ msgstr "因地点而无效\"%s\""
-
-#~ msgid "No"
-#~ msgstr "否"
-
-#~ msgid "PLCOpenEditor\tF1"
-#~ msgstr "PLCOpen编辑器\tF1"
-
-#~ msgid "Paste\tCTRL+V"
-#~ msgstr "粘贴\tCTRL+V"
-
-#~ msgid "Please enter configuration name"
-#~ msgstr "请输入配置名"
-
-#~ msgid "Please enter data type name"
-#~ msgstr "请输入数据类型名"
-
-#~ msgid "Please enter resource name"
-#~ msgstr "请输入源名"
-
-#~ msgid "Please enter text"
-#~ msgstr "请输入文本"
-
-#~ msgid "Redo\tCTRL+Y"
-#~ msgstr "重做\tCTRL+Y"
-
-#~ msgid "Refresh\tCTRL+R"
-#~ msgstr "重新载入\tCTRL+R"
-
-#~ msgid "Scaling:"
-#~ msgstr "比例:"
-
-#~ msgid "Types"
-#~ msgstr "类型"
-
-#~ msgid "Undo\tCTRL+Z"
-#~ msgstr "撤消\tCTRL+Z"
-
-#~ msgid "X Scale:"
-#~ msgstr "X 坐标:"
-
-#~ msgid "Y Scale:"
-#~ msgstr "Y 坐标:"
-
-#~ msgid "Yes"
-#~ msgstr "是"
-
-#~ msgid "#define %s beremiz%s\n"
-#~ msgstr "#定义 %s beremiz%s\n"
-
-#~ msgid "/* Beremiz c_ext plugin user variables definition */\n"
-#~ msgstr "/* Beremiz c_ext 插件的用户变量定义  */\n"
-
-#~ msgid "/* Beremiz plugin functions */\n"
-#~ msgstr "/* Beremiz插件功能 */\n"
-
-#~ msgid ""
-#~ "/* Code generated by Beremiz c_ext plugin */\n"
-#~ "\n"
-#~ msgstr ""
-#~ "/* 代码由Beremiz c_ext插件生成 */\n"
-#~ "\n"
-
-#~ msgid "/* User includes */\n"
-#~ msgstr "/* 用户包含 */\n"
-
-#~ msgid "/* User internal user variables and routines */\n"
-#~ msgstr "/* 用户内部用户变量和例程 */\n"
-
-#~ msgid "/* User variables reference */\n"
-#~ msgstr "/* 用户变量参照 */\n"
-
-#~ msgid "Choose a XML file"
-#~ msgstr "选择一个XML文件"
-
-#~ msgid "No corresponding output variable found on SVGUI Block \"%s\""
-#~ msgstr "没有相应的输出变量"
-
-#~ msgid "No such XML file: %s\n"
-#~ msgstr "没有这样的XML文件:%s\n"
-
-#~ msgid "Shortcuts created."
-#~ msgstr "快捷方式已被建立。"
-
-#~ msgid "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
-#~ msgstr "<?xml 版本=\"1.0\" 编码=\"UTF-8\"?>\n"
-
-#~ msgid "A pou with \"%s\" for name exists!"
-#~ msgstr "一个以\"%s\"命名的的编程组织单元已经存在!"
-
-#~ msgid ""
-#~ "A variable is defined with \"%s\" as name. It can generate a conflict. Do "
-#~ "you wish to continue?"
-#~ msgstr "一个变量被定义 \"%s\" 为名称。它会导致冲突。你希望继续吗?"
-
-#~ msgid "A variable with \"%s\" as name exists in this pou!"
-#~ msgstr "一个以\"%s\"命名的变量在这个编程组织单元中已经存在!"
-
-#~ msgid "A variable with \"%s\" as name exists!"
-#~ msgstr "一个以\"%s\"命名的变量已经存在!"
-
-#~ msgid "Create A New POU From"
-#~ msgstr "新建一个POU从"
-
-#~ msgid "Create a new project"
-#~ msgstr "新建一个项目"
-
-#~ msgid "Printing"
-#~ msgstr "打印"
-
-#~ msgid ""
-#~ "Ratio monitor\n"
-#~ "The ratio_monitor function block checks that one process value PV1 is "
-#~ "always a given ratio (defined by input RATIO) of a second process value "
-#~ "PV2."
-#~ msgstr ""
-#~ "比监视器\n"
-#~ "比监视器功能块检查一个步骤值PV1总是被比较于(被输入的比定义)第二个步骤"
-#~ "值。"
-
-#~ msgid "ValueError"
-#~ msgstr "值错误"
-
-#~ msgid "You can't paste the element in buffer here!"
-#~ msgstr "你不能在这缓冲区中粘贴元素!"
+msgstr "禁止_扩展"
+
+msgid "%(codefile_name)s"
+msgstr "%(codefile_name)s"
+
+msgid "variables"
+msgstr "变量"
+
+msgid "variable"
+msgstr "变量"
+
+msgid "name"
+msgstr "名字"
+
+msgid "type"
+msgstr "类型"
+
+msgid "class"
+msgstr "类"
+
+msgid "initial"
+msgstr "初始的"
+
+msgid "desc"
+msgstr "降序(desc)"
+
+msgid "onchange"
+msgstr "事件(onchange)"
+
+msgid "opts"
+msgstr "挑选(opts)"
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr "0 - 当前时间, 1 - 从PDT下载时间"
+
+msgid "Preset datetime"
+msgstr "当前日期"
+
+msgid "Copy of IN"
+msgstr "IN的复制"
+
+msgid "Datetime, current or relative to PDT"
+msgstr "日期时间,当前的或者PDT相对的"
+
+msgid ""
+"The real time clock has many uses including time stamping, setting dates and"
+" times of day in batch reports, in alarm messages and so on."
+msgstr "实时时钟大量用于包含时间戳,设置在批处理报告,报警信息等中的日期和日中的时间,"
+
+msgid "1 = integrate, 0 = hold"
+msgstr "1 = 积分, 0 = 保持"
+
+msgid "Overriding reset"
+msgstr "压倒一切的复位"
+
+msgid "Input variable"
+msgstr "输入变量"
+
+msgid "Initial value"
+msgstr "初始值"
+
+msgid "Sampling period"
+msgstr "采样周期"
+
+msgid "NOT R1"
+msgstr "NOT R1"
+
+msgid "Integrated output"
+msgstr "积分输出"
+
+msgid ""
+"The integral function block integrates the value of input XIN over time."
+msgstr "积分功能块集成了一段时间输入XIN的值"
+
+msgid "0 = reset"
+msgstr "0 = 复位"
+
+msgid "Input to be differentiated"
+msgstr "微分输入"
+
+msgid "Differentiated output"
+msgstr "微分输出"
+
+msgid ""
+"The derivative function block produces an output XOUT proportional to the "
+"rate of change of the input XIN."
+msgstr "微分功能块处理一个输出XOUT 比例于输入XIN的变化率."
+
+msgid "0 - manual , 1 - automatic"
+msgstr "0 - 手动, 1 - 自动"
+
+msgid "Process variable"
+msgstr "过程变量"
+
+msgid "Set point"
+msgstr "设置点"
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr "手动输出调节 - 通常来自中转站"
+
+msgid "Proportionality constant"
+msgstr "比例常数"
+
+msgid "Reset time"
+msgstr "复位时间"
+
+msgid "Derivative time constant"
+msgstr "微分时间常数"
+
+msgid "PV - SP"
+msgstr "PV - SP"
+
+msgid "FB for integral term"
+msgstr "积分项的FB"
+
+msgid "FB for derivative term"
+msgstr "微分项的FB"
+
+msgid ""
+"The PID (proportional, Integral, Derivative) function block provides the "
+"classical three term controller for closed loop control."
+msgstr "PID(比例,积分,微分)功能块提供经典的三项控制器,实现闭环控制。"
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr "0 - 追踪X0, 1 - 斜坡/追踪X1"
+
+msgid "Ramp duration"
+msgstr "斜坡时间"
+
+msgid "BUSY = 1 during ramping period"
+msgstr "BUSY = 1 在加速期"
+
+msgid "Elapsed time of ramp"
+msgstr "斜坡经过时间"
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr "(RAMP)斜坡功能块是根据标准中给出的示例建模的。"
+
+msgid ""
+"The hysteresis function block provides a hysteresis boolean output driven by"
+" the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr "迟滞功能块提供一个两个差异的浮点(实数)输入XIN1和XIN2驱动的迟滞布尔输出。"
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr "SR双稳态是一个置位有限锁存器"
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr "RS双稳态是一个复位优先锁存器"
+
+msgid ""
+"The semaphore provides a mechanism to allow software elements mutually "
+"exclusive access to certain resources."
+msgstr "信号量提供一种机制,允许软件元素互斥排他的访问某一资源。"
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr "当检测到一个上升沿时,输出产生一个单独的脉冲。"
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr "当检测到下降沿时,输出产生一个单独的脉冲。"
+
+msgid ""
+"The up-counter can be used to signal when a count has reached a maximum "
+"value."
+msgstr "当计数值达到最大值时,加计数器能被用来产生信号。"
+
+msgid ""
+"The down-counter can be used to signal when a count has reached zero, on "
+"counting down from a preset value."
+msgstr "当计数值从一个预设值减到0,减计数器能被用来产生信号。"
+
+msgid ""
+"The up-down counter has two inputs CU and CD. It can be used to both count "
+"up on one input and down on the other."
+msgstr "加减计数器有2个输入CU和CD,能被用来同时在一个输入上加计数在另一个上减计数。"
+
+msgid "first input parameter"
+msgstr "第一个输入参数"
+
+msgid "second input parameter"
+msgstr "第二个输入参数"
+
+msgid "first output parameter"
+msgstr "第一个输出参数"
+
+msgid "second output parameter"
+msgstr "第二个输出参数"
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr "内部状态:0-复位, 1-计数,2-设置"
+
+msgid ""
+"The pulse timer can be used to generate output pulses of a given time "
+"duration."
+msgstr "脉冲定时器能够被用来产生给定持续时间的输出脉冲"
+
+msgid ""
+"The on-delay timer can be used to delay setting an output true, for fixed "
+"period after an input becomes true."
+msgstr "接通延迟定时器能被用来延迟设置一个输出为TRUE,当输入为TRUE时,经过固定的时间,"
+
+msgid ""
+"The off-delay timer can be used to delay setting an output false, for fixed "
+"period after input goes false."
+msgstr "断开延迟定时器能被用来延迟设置一个输出为FALSE,当输入到FALSE后经过一个固定的时间。"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/Makefile	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,27 @@
+all:
+	@echo "Please specify target 'source_list', 'template' or 'locales'"
+
+template:
+	@echo To generate translation template message.pot file:
+	python mki18n.py -p --domain=Beremiz
+
+locales:
+	@echo "Generate .mo files for all languages:"
+	python mki18n.py -m --moTarget=../locale --domain=Beremiz
+
+
+source_list:
+	echo @To "Generate list with source files: app.fil:"
+	find .. -name "*.py" -exec grep -q '_(' {} ';' -print -o -name "*XSD*" -print -o -name "*.csv" -print | grep -v '/build/' | grep -v '/pyjs/' > app.fil
+	echo "../plcopen/Additional_Function_Blocks.xml" >> app.fil
+	echo "../plcopen/Standard_Function_Blocks.xml"   >> app.fil
+
+transifex_init:
+	tx init --skipsetup
+
+transifex_pull:
+	tx pull --all
+	find . -name '*.po' -exec sed -i 's/charset=CHARSET/charset=UTF-8/' {} \;
+
+
+.PHONY: all, template, locales, source_list
--- a/i18n/README	Sat Jun 02 11:56:01 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-To generate message.pot file:
-
-	python mki18n.py -p --domain=Beremiz
-	
-To generate .mo files for all languages:
-
-	python mki18n.py -m --moTarget=../locale --domain=Beremiz
-
-
-To generate app.fil:
-	
-    find .. -name "*.py" -exec grep -q '_(' {} ';' -print -o -name "*XSD*" -print -o -name "*.csv" -print | grep -v '/build/' | grep -v '/pyjs/' > app.fil
--- a/i18n/app.fil	Sat Jun 02 11:56:01 2018 +0100
+++ b/i18n/app.fil	Mon Jan 07 13:50:39 2019 +0100
@@ -2,6 +2,7 @@
 ../canfestival/SlaveEditor.py
 ../canfestival/config_utils.py
 ../canfestival/NetworkEditor.py
+../BeremizIDE.py
 ../dialogs/LDElementDialog.py
 ../dialogs/ForceVariableDialog.py
 ../dialogs/SearchInProjectDialog.py
@@ -20,6 +21,7 @@
 ../dialogs/ArrayTypeDialog.py
 ../dialogs/PouNameDialog.py
 ../dialogs/BrowseLocationsDialog.py
+../dialogs/CommentEditDialog.py
 ../dialogs/FBDBlockDialog.py
 ../dialogs/ConnectionDialog.py
 ../dialogs/BrowseValuesLibraryDialog.py
@@ -34,15 +36,22 @@
 ../graphics/LD_Objects.py
 ../graphics/SFC_Objects.py
 ../graphics/GraphicCommons.py
+../bacnet/BacnetSlaveEditor.py
+../bacnet/bacnet.py
+../bacnet/ede_files/template_ObjTypes.csv
+../bacnet/ede_files/template_Units.csv
+../bacnet/ede_files/template_EDE.csv
+../bacnet/ede_files/template_StateTexts.csv
 ../connectors/PYRO/__init__.py
+../connectors/PYRO/dialog.py
 ../connectors/__init__.py
 ../connectors/WAMP/__init__.py
+../connectors/WAMP/dialog.py
 ../targets/Generic/XSD
 ../targets/XSD_toolchain_makefile
 ../targets/Xenomai/__init__.py
 ../targets/Xenomai/XSD
 ../targets/XSD_toolchain_gcc
-../targets/PLC/XSD
 ../targets/__init__.py
 ../targets/toolchain_gcc.py
 ../targets/toolchain_makefile.py
@@ -53,7 +62,18 @@
 ../py_ext/PythonEditor.py
 ../py_ext/PythonFileCTNMixin.py
 ../wxglade_hmi/wxglade_hmi.py
+../modbus/modbus.py
+../etherlab/EthercatCIA402Slave.py
+../etherlab/EtherCATManagementEditor.py
+../etherlab/CommonEtherCATFunction.py
+../etherlab/EthercatSlave.py
+../etherlab/etherlab.py
+../etherlab/EthercatCFileGenerator.py
+../etherlab/ConfigEditor.py
+../etherlab/EthercatMaster.py
 ../runtime/NevowServer.py
+../runtime/WampClient.py
+../runtime/PlcStatus.py
 ../runtime/PLCObject.py
 ../runtime/ServicePublisher.py
 ../ConfigTreeNode.py
@@ -75,7 +95,9 @@
 ../controls/SearchResultPanel.py
 ../controls/PouInstanceVariablesPanel.py
 ../controls/CustomTable.py
+../controls/EnhancedStatusBar.py
 ../controls/LibraryPanel.py
+../controls/UriLocationEditor.py
 ../controls/CustomToolTip.py
 ../controls/LogViewer.py
 ../controls/FolderTree.py
@@ -91,6 +113,7 @@
 ../controls/CustomStyledTextCtrl.py
 ../controls/VariablePanel.py
 ../controls/CustomGrid.py
+../controls/CustomIntCtrl.py
 ../controls/CustomTree.py
 ../controls/CustomEditableListBox.py
 ../CodeFileTreeNode.py
@@ -102,19 +125,26 @@
 ../version.py
 ../POULibrary.py
 ../util/MiniTextControler.py
-../util/Zeroconf.py
+../util/ExceptionHandler.py
 ../util/misc.py
 ../util/ProcessLogger.py
 ../features.py
 ../svgui/svgui.py
 ../svgui/svgui_server.py
 ../svgui/svguilib.py
+../plcopen/InstancesPathCollector.py
+../plcopen/types_enums.py
+../plcopen/InstanceTagnameCollector.py
+../plcopen/BlockInstanceCollector.py
 ../plcopen/iec_std.csv
 ../plcopen/structures.py
+../plcopen/XSLTModelQuery.py
+../plcopen/POUVariablesCollector.py
+../plcopen/VariableInfoCollector.py
 ../plcopen/plcopen.py
 ../plcopen/definitions.py
 ../IDEFrame.py
 ../PLCGenerator.py
 ../Beremiz_service.py
 ../plcopen/Additional_Function_Blocks.xml
-../plcopen/Standard_Function_Blocks.xml
\ No newline at end of file
+../plcopen/Standard_Function_Blocks.xml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/i18n/messages.po	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4728 @@
+# English translations for Beremiz package.
+# Copyright (C) 2018 THE Beremiz'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Beremiz package.
+# Automatically generated, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Beremiz\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-03 14:20+0300\n"
+"PO-Revision-Date: 2018-10-03 14:20+0300\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: en_US\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../util/ExceptionHandler.py:58
+#, python-format
+msgid ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+msgstr ""
+"\n"
+"An unhandled exception (bug) occured. Bug report saved at :\n"
+"(%s)\n"
+"\n"
+"Please be kind enough to send this file to:\n"
+"beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"You should now restart program.\n"
+"\n"
+"Traceback:\n"
+
+#: ../controls/VariablePanel.py:87
+msgid "   External"
+msgstr "   External"
+
+#: ../controls/VariablePanel.py:86
+msgid "   InOut"
+msgstr "   InOut"
+
+#: ../controls/VariablePanel.py:86
+msgid "   Input"
+msgstr "   Input"
+
+#: ../controls/VariablePanel.py:87
+msgid "   Local"
+msgstr "   Local"
+
+#: ../controls/VariablePanel.py:86
+msgid "   Output"
+msgstr "   Output"
+
+#: ../controls/VariablePanel.py:88
+msgid "   Temp"
+msgstr "   Temp"
+
+#: ../etherlab/etherlab.py:301
+#, python-format
+msgid " (rev. %s)"
+msgstr " (rev. %s)"
+
+#: ../etherlab/CommonEtherCATFunction.py:1599
+msgid " Warning..."
+msgstr " Warning..."
+
+#: ../dialogs/PouTransitionDialog.py:100 ../dialogs/ProjectDialog.py:72
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:157
+#, python-format
+msgid " and %s"
+msgstr " and %s"
+
+#: ../ProjectController.py:1236
+msgid " generation failed !\n"
+msgstr " generation failed !\n"
+
+#: ../plcopen/plcopen.py:1029
+#, python-format
+msgid "\"%s\" Data Type doesn't exist !!!"
+msgstr "\"%s\" Data Type doesn't exist !!!"
+
+#: ../plcopen/plcopen.py:1047
+#, python-format
+msgid "\"%s\" POU already exists !!!"
+msgstr "\"%s\" POU already exists !!!"
+
+#: ../plcopen/plcopen.py:1068
+#, python-format
+msgid "\"%s\" POU doesn't exist !!!"
+msgstr "\"%s\" POU doesn't exist !!!"
+
+#: ../editors/Viewer.py:288
+#, python-format
+msgid "\"%s\" can't use itself!"
+msgstr "\"%s\" can't use itself!"
+
+#: ../IDEFrame.py:1705 ../IDEFrame.py:1724
+#, python-format
+msgid "\"%s\" config already exists!"
+msgstr "\"%s\" config already exists!"
+
+#: ../plcopen/plcopen.py:531
+#, python-format
+msgid "\"%s\" configuration already exists !!!"
+msgstr "\"%s\" configuration already exists !!!"
+
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr "\"%s\" configuration doesn't exist !!!"
+
+#: ../IDEFrame.py:1655
+#, python-format
+msgid "\"%s\" data type already exists!"
+msgstr "\"%s\" data type already exists!"
+
+#: ../dialogs/PouTransitionDialog.py:111 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:424
+#, python-format
+msgid "\"%s\" element for this pou already exists!"
+msgstr "\"%s\" element for this pou already exists!"
+
+#: ../BeremizIDE.py:925
+#, python-format
+msgid "\"%s\" folder is not a valid Beremiz project\n"
+msgstr "\"%s\" folder is not a valid Beremiz project\n"
+
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:107
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:164
+#: ../etherlab/ConfigEditor.py:973 ../editors/ResourceEditor.py:481
+#: ../editors/ResourceEditor.py:518 ../editors/DataTypeEditor.py:571
+#: ../editors/DataTypeEditor.py:603 ../editors/CodeFileEditor.py:793
+#: ../controls/VariablePanel.py:798 ../IDEFrame.py:1646
+#, python-format
+msgid "\"%s\" is a keyword. It can't be used!"
+msgstr "\"%s\" is a keyword. It can't be used!"
+
+#: ../plcopen/plcopen.py:2836
+#, python-format
+msgid "\"%s\" is an invalid value!"
+msgstr "\"%s\" is an invalid value!"
+
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
+#, python-format
+msgid "\"%s\" is not a valid folder!"
+msgstr "\"%s\" is not a valid folder!"
+
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:105
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:162
+#: ../etherlab/ConfigEditor.py:971 ../editors/ResourceEditor.py:479
+#: ../editors/ResourceEditor.py:516 ../editors/DataTypeEditor.py:601
+#: ../editors/CodeFileEditor.py:791 ../controls/VariablePanel.py:796
+#: ../IDEFrame.py:1644
+#, python-format
+msgid "\"%s\" is not a valid identifier!"
+msgstr "\"%s\" is not a valid identifier!"
+
+#: ../IDEFrame.py:2454
+#, python-format
+msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
+msgstr "\"%s\" is used by one or more POUs. Do you wish to continue?"
+
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:166
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:363
+#: ../IDEFrame.py:1664
+#, python-format
+msgid "\"%s\" pou already exists!"
+msgstr "\"%s\" pou already exists!"
+
+#: ../dialogs/SFCStepNameDialog.py:62
+#, python-format
+msgid "\"%s\" step already exists!"
+msgstr "\"%s\" step already exists!"
+
+#: ../editors/DataTypeEditor.py:566
+#, python-format
+msgid "\"%s\" value already defined!"
+msgstr "\"%s\" value already defined!"
+
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
+#, python-format
+msgid "\"%s\" value isn't a valid array dimension!"
+msgstr "\"%s\" value isn't a valid array dimension!"
+
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
+#, python-format
+msgid ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+msgstr ""
+"\"%s\" value isn't a valid array dimension!\n"
+"Right value must be greater than left value."
+
+#: ../PLCGenerator.py:1182
+#, python-brace-format
+msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+msgstr "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
+
+#: ../editors/Viewer.py:292
+#, python-brace-format
+msgid "\"{a1}\" is already used by \"{a2}\"!"
+msgstr "\"{a1}\" is already used by \"{a2}\"!"
+
+#: ../plcopen/plcopen.py:557
+#, python-brace-format
+msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+msgstr "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
+
+#: ../plcopen/plcopen.py:577
+#, python-brace-format
+msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+msgstr "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:559
+#, python-format
+msgid "%03gms"
+msgstr "%03gms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:550
+#, python-format
+msgid "%dd"
+msgstr "%dd"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:189
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:551
+#, python-format
+msgid "%dh"
+msgstr "%dh"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:188
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:552
+#, python-format
+msgid "%dm"
+msgstr "%dm"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:186
+#, python-format
+msgid "%dms"
+msgstr "%dms"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:187
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:553
+#, python-format
+msgid "%ds"
+msgstr "%ds"
+
+#: ../PLCControler.py:1114
+#, python-format
+msgid "%s Data Types"
+msgstr "%s Data Types"
+
+#: ../PLCControler.py:1097
+#, python-format
+msgid "%s POUs"
+msgstr "%s POUs"
+
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
+#, python-format
+msgid "%s Profile"
+msgstr "%s Profile"
+
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
+#, python-format
+msgid "%s body don't have instances!"
+msgstr "%s body don't have instances!"
+
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
+#, python-format
+msgid "%s body don't have text!"
+msgstr "%s body don't have text!"
+
+#: ../etherlab/ConfigEditor.py:856
+#, python-format
+msgid "%s's nodes"
+msgstr "%s's nodes"
+
+#: ../IDEFrame.py:391
+msgid "&Add Element"
+msgstr "&Add Element"
+
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
+msgid "&Close"
+msgstr "&Close"
+
+#: ../IDEFrame.py:364
+msgid "&Configuration"
+msgstr "&Configuration"
+
+#: ../IDEFrame.py:353
+msgid "&Data Type"
+msgstr "&Data Type"
+
+#: ../IDEFrame.py:395
+msgid "&Delete"
+msgstr "&Delete"
+
+#: ../IDEFrame.py:345
+msgid "&Display"
+msgstr "&Display"
+
+#: ../IDEFrame.py:344
+msgid "&Edit"
+msgstr "&Edit"
+
+#: ../IDEFrame.py:343
+msgid "&File"
+msgstr "&File"
+
+#: ../IDEFrame.py:355
+msgid "&Function"
+msgstr "&Function"
+
+#: ../IDEFrame.py:346
+msgid "&Help"
+msgstr "&Help"
+
+#: ../dialogs/AboutDialog.py:70
+msgid "&License"
+msgstr "&License"
+
+#: ../IDEFrame.py:359
+msgid "&Program"
+msgstr "&Program"
+
+#: ../PLCOpenEditor.py:98
+msgid "&Properties"
+msgstr "&Properties"
+
+#: ../BeremizIDE.py:244
+msgid "&Recent Projects"
+msgstr "&Recent Projects"
+
+#: ../IDEFrame.py:361
+msgid "&Resource"
+msgstr "&Resource"
+
+#: ../etherlab/ConfigEditor.py:450
+msgid "'Read from' and 'Write to' variables types are not compatible"
+msgstr "'Read from' and 'Write to' variables types are not compatible"
+
+#: ../controls/SearchResultPanel.py:247
+#, python-brace-format
+msgid "'{a1}' - {a2} match in project"
+msgstr "'{a1}' - {a2} match in project"
+
+#: ../controls/SearchResultPanel.py:249
+#, python-brace-format
+msgid "'{a1}' - {a2} matches in project"
+msgstr "'{a1}' - {a2} matches in project"
+
+#: ../connectors/PYRO/__init__.py:99
+#, python-brace-format
+msgid "'{a1}' is located at {a2}\n"
+msgstr "'{a1}' is located at {a2}\n"
+
+#: ../controls/SearchResultPanel.py:298
+#, python-format
+msgid "(%d matches)"
+msgstr "(%d matches)"
+
+#: ../dialogs/PouTransitionDialog.py:102 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:159
+#, python-format
+msgid ", %s"
+msgstr ", %s"
+
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr "- Select URI type -"
+
+#: ../controls/LogViewer.py:287
+msgid "1d"
+msgstr "1d"
+
+#: ../controls/LogViewer.py:288
+msgid "1h"
+msgstr "1h"
+
+#: ../controls/LogViewer.py:289
+msgid "1m"
+msgstr "1m"
+
+#: ../controls/LogViewer.py:290
+msgid "1s"
+msgstr "1s"
+
+#: ../dialogs/PouDialog.py:168 ../IDEFrame.py:1667 ../IDEFrame.py:1713
+#: ../IDEFrame.py:1732
+#, python-format
+msgid "A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?"
+msgstr "A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?"
+
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:109
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:800 ../IDEFrame.py:1681 ../IDEFrame.py:1694
+#, python-format
+msgid "A POU named \"%s\" already exists!"
+msgstr "A POU named \"%s\" already exists!"
+
+#: ../ConfigTreeNode.py:424
+#, python-brace-format
+msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+msgstr "A child named \"{a1}\" already exists -> \"{a2}\"\n"
+
+#: ../dialogs/BrowseLocationsDialog.py:228
+msgid "A location must be selected!"
+msgstr "A location must be selected!"
+
+#: ../editors/ResourceEditor.py:483
+msgid "A task with the same name already exists!"
+msgstr "A task with the same name already exists!"
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:802
+#: ../IDEFrame.py:1683 ../IDEFrame.py:1696
+#, python-format
+msgid "A variable with \"%s\" as name already exists in this pou!"
+msgstr "A variable with \"%s\" as name already exists in this pou!"
+
+#: ../editors/CodeFileEditor.py:797
+#, python-format
+msgid "A variable with \"%s\" as name already exists!"
+msgstr "A variable with \"%s\" as name already exists!"
+
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
+msgid "About"
+msgstr "About"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Absolute number"
+msgstr "Absolute number"
+
+#: ../etherlab/ConfigEditor.py:48
+msgid "Access"
+msgstr "Access"
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
+msgid "Action"
+msgstr "Action"
+
+#: ../editors/Viewer.py:656 ../editors/Viewer.py:2429
+msgid "Action Block"
+msgstr "Action Block"
+
+#: ../dialogs/PouActionDialog.py:89
+msgid "Action Name"
+msgstr "Action Name"
+
+#: ../dialogs/PouActionDialog.py:56
+msgid "Action Name:"
+msgstr "Action Name:"
+
+#: ../plcopen/plcopen.py:1567
+#, python-format
+msgid "Action with name %s doesn't exist!"
+msgstr "Action with name %s doesn't exist!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Actions"
+msgstr "Actions"
+
+#: ../dialogs/ActionBlockDialog.py:139
+msgid "Actions:"
+msgstr "Actions:"
+
+#: ../editors/Viewer.py:484
+msgid "Active"
+msgstr "Active"
+
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:998 ../editors/Viewer.py:689
+msgid "Add"
+msgstr "Add"
+
+#: ../IDEFrame.py:1941 ../IDEFrame.py:1976
+msgid "Add Action"
+msgstr "Add Action"
+
+#: ../features.py:22
+msgid "Add C code accessing located variables synchronously"
+msgstr "Add C code accessing located variables synchronously"
+
+#: ../IDEFrame.py:1924
+msgid "Add Configuration"
+msgstr "Add Configuration"
+
+#: ../IDEFrame.py:1904
+msgid "Add DataType"
+msgstr "Add DataType"
+
+#: ../editors/Viewer.py:612
+msgid "Add Divergence Branch"
+msgstr "Add Divergence Branch"
+
+#: ../etherlab/EthercatMaster.py:297
+msgid "Add Ethercat Slave"
+msgstr "Add Ethercat Slave"
+
+#: ../etherlab/EthercatMaster.py:297
+msgid "Add Ethercat Slave to Master"
+msgstr "Add Ethercat Slave to Master"
+
+#: ../dialogs/DiscoveryDialog.py:121
+msgid "Add IP"
+msgstr "Add IP"
+
+#: ../IDEFrame.py:1912
+msgid "Add POU"
+msgstr "Add POU"
+
+#: ../features.py:23
+msgid "Add Python code executed asynchronously"
+msgstr "Add Python code executed asynchronously"
+
+#: ../IDEFrame.py:1952 ../IDEFrame.py:2002
+msgid "Add Resource"
+msgstr "Add Resource"
+
+#: ../IDEFrame.py:1930 ../IDEFrame.py:1973
+msgid "Add Transition"
+msgstr "Add Transition"
+
+#: ../editors/Viewer.py:599
+msgid "Add Wire Segment"
+msgstr "Add Wire Segment"
+
+#: ../editors/SFCViewer.py:447
+msgid "Add a new initial step"
+msgstr "Add a new initial step"
+
+#: ../editors/Viewer.py:2790 ../editors/SFCViewer.py:784
+msgid "Add a new jump"
+msgstr "Add a new jump"
+
+#: ../editors/SFCViewer.py:469
+msgid "Add a new step"
+msgstr "Add a new step"
+
+#: ../features.py:24
+msgid "Add a simple WxGlade based GUI."
+msgstr "Add a simple WxGlade based GUI."
+
+#: ../dialogs/ActionBlockDialog.py:143
+msgid "Add action"
+msgstr "Add action"
+
+#: ../editors/DataTypeEditor.py:364
+msgid "Add element"
+msgstr "Add element"
+
+#: ../etherlab/ConfigEditor.py:1388
+msgid "Add file from ESI files database"
+msgstr "Add file from ESI files database"
+
+#: ../etherlab/ConfigEditor.py:1360
+msgid "Add file to project"
+msgstr "Add file to project"
+
+#: ../editors/ResourceEditor.py:281
+msgid "Add instance"
+msgstr "Add instance"
+
+#: ../etherlab/ConfigEditor.py:652
+msgid "Add process variable"
+msgstr "Add process variable"
+
+#: ../canfestival/NetworkEditor.py:110
+msgid "Add slave"
+msgstr "Add slave"
+
+#: ../etherlab/ConfigEditor.py:679
+msgid "Add startup service variable"
+msgstr "Add startup service variable"
+
+#: ../editors/ResourceEditor.py:250
+msgid "Add task"
+msgstr "Add task"
+
+#: ../bacnet/BacnetSlaveEditor.py:811 ../editors/CodeFileEditor.py:672
+#: ../controls/VariablePanel.py:483
+msgid "Add variable"
+msgstr "Add variable"
+
+#: ../etherlab/etherlab.py:186
+msgid ""
+"Adding a PDO not defined in default configuration\n"
+"for mapping needed location variables\n"
+"(1 if possible)"
+msgstr ""
+"Adding a PDO not defined in default configuration\n"
+"for mapping needed location variables\n"
+"(1 if possible)"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Addition"
+msgstr "Addition"
+
+#: ../plcopen/definitions.py:51
+msgid "Additional function blocks"
+msgstr "Additional function blocks"
+
+#: ../editors/Viewer.py:672
+msgid "Adjust Block Size"
+msgstr "Adjust Block Size"
+
+#: ../editors/Viewer.py:1722
+msgid "Alignment"
+msgstr "Alignment"
+
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:50
+#: ../dialogs/BrowseLocationsDialog.py:151
+#: ../dialogs/BrowseLocationsDialog.py:154 ../etherlab/ConfigEditor.py:65
+#: ../etherlab/ConfigEditor.py:853 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:85
+msgid "All"
+msgstr "All"
+
+#: ../editors/FileManagementPanel.py:51
+msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+msgstr "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
+
+#: ../ProjectController.py:1752
+msgid "Already connected. Please disconnect\n"
+msgstr "Already connected. Please disconnect\n"
+
+#: ../editors/DataTypeEditor.py:607
+#, python-format
+msgid "An element named \"%s\" already exists in this structure!"
+msgstr "An element named \"%s\" already exists in this structure!"
+
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr "An instance with the same name already exists!"
+
+#: ../etherlab/ConfigEditor.py:975
+#, python-format
+msgid "An variable named \"%s\" already exists!"
+msgstr "An variable named \"%s\" already exists!"
+
+#: ../bacnet/BacnetSlaveEditor.py:935
+msgid "Analog Input Objects"
+msgstr "Analog Input Objects"
+
+#: ../bacnet/BacnetSlaveEditor.py:934
+msgid "Analog Output Objects"
+msgstr "Analog Output Objects"
+
+#: ../bacnet/BacnetSlaveEditor.py:933
+msgid "Analog Value Objects"
+msgstr "Analog Value Objects"
+
+#: ../dialogs/ConnectionDialog.py:103
+msgid "Apply name modification to all continuations with the same name"
+msgstr "Apply name modification to all continuations with the same name"
+
+#: ../plcopen/iec_std.csv:31
+msgid "Arc cosine"
+msgstr "Arc cosine"
+
+#: ../plcopen/iec_std.csv:30
+msgid "Arc sine"
+msgstr "Arc sine"
+
+#: ../plcopen/iec_std.csv:32
+msgid "Arc tangent"
+msgstr "Arc tangent"
+
+#: ../plcopen/iec_std.csv:33
+msgid "Arithmetic"
+msgstr "Arithmetic"
+
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:883
+msgid "Array"
+msgstr "Array"
+
+#: ../plcopen/iec_std.csv:39
+msgid "Assignment"
+msgstr "Assignment"
+
+#: ../dialogs/FBDVariableDialog.py:227
+msgid "At least a variable or an expression must be selected!"
+msgstr "At least a variable or an expression must be selected!"
+
+#: ../controls/ProjectPropertiesPanel.py:113
+msgid "Author"
+msgstr "Author"
+
+#: ../controls/ProjectPropertiesPanel.py:110
+msgid "Author Name (optional):"
+msgstr "Author Name (optional):"
+
+#: ../etherlab/EthercatCIA402Slave.py:125
+msgid "Axis Pos"
+msgstr "Axis Pos"
+
+#: ../etherlab/EthercatCIA402Slave.py:118
+msgid "Axis Ref"
+msgstr "Axis Ref"
+
+#: ../dialogs/FindInPouDialog.py:80
+msgid "Backward"
+msgstr "Backward"
+
+#: ../features.py:19
+msgid "Bacnet support"
+msgstr "Bacnet support"
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
+#, python-format
+msgid "Bad location size : %s"
+msgstr "Bad location size : %s"
+
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
+msgid "Base Type:"
+msgstr "Base Type:"
+
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:841
+msgid "Base Types"
+msgstr "Base Types"
+
+#: ../BeremizIDE.py:479
+msgid "Beremiz"
+msgstr "Beremiz"
+
+#: ../runtime/NevowServer.py:201
+msgid "Beremiz Runtime Settings"
+msgstr "Beremiz Runtime Settings"
+
+#: ../bacnet/BacnetSlaveEditor.py:938
+msgid "Binary Input Objects"
+msgstr "Binary Input Objects"
+
+#: ../bacnet/BacnetSlaveEditor.py:937
+msgid "Binary Output Objects"
+msgstr "Binary Output Objects"
+
+#: ../bacnet/BacnetSlaveEditor.py:936
+msgid "Binary Value Objects"
+msgstr "Binary Value Objects"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Binary selection (1 of 2)"
+msgstr "Binary selection (1 of 2)"
+
+#: ../plcopen/iec_std.csv:62
+msgid "Bit-shift"
+msgstr "Bit-shift"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise"
+msgstr "Bitwise"
+
+#: ../plcopen/iec_std.csv:66
+msgid "Bitwise AND"
+msgstr "Bitwise AND"
+
+#: ../plcopen/iec_std.csv:67
+msgid "Bitwise OR"
+msgstr "Bitwise OR"
+
+#: ../plcopen/iec_std.csv:68
+msgid "Bitwise XOR"
+msgstr "Bitwise XOR"
+
+#: ../plcopen/iec_std.csv:69
+msgid "Bitwise inverting"
+msgstr "Bitwise inverting"
+
+#: ../editors/Viewer.py:624 ../editors/Viewer.py:2442
+msgid "Block"
+msgstr "Block"
+
+#: ../dialogs/FBDBlockDialog.py:63
+msgid "Block Properties"
+msgstr "Block Properties"
+
+#: ../editors/TextViewer.py:260
+msgid "Block name"
+msgstr "Block name"
+
+#: ../editors/Viewer.py:589
+msgid "Bottom"
+msgstr "Bottom"
+
+#: ../runtime/PlcStatus.py:11
+msgid "Broken"
+msgstr "Broken"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
+#, python-format
+msgid "Browse %s values library"
+msgstr "Browse %s values library"
+
+#: ../dialogs/BrowseLocationsDialog.py:69
+msgid "Browse Locations"
+msgstr "Browse Locations"
+
+#: ../ProjectController.py:1898
+msgid "Build"
+msgstr "Build"
+
+#: ../ProjectController.py:1397
+msgid "Build directory already clean\n"
+msgstr "Build directory already clean\n"
+
+#: ../ProjectController.py:1899
+msgid "Build project into build folder"
+msgstr "Build project into build folder"
+
+#: ../ProjectController.py:1155
+msgid "C Build crashed !\n"
+msgstr "C Build crashed !\n"
+
+#: ../ProjectController.py:1152
+msgid "C Build failed.\n"
+msgstr "C Build failed.\n"
+
+#: ../c_ext/CFileEditor.py:66
+msgid "C code"
+msgstr "C code"
+
+#: ../ProjectController.py:1240
+msgid "C code generated successfully.\n"
+msgstr "C code generated successfully.\n"
+
+#: ../targets/toolchain_makefile.py:126
+msgid "C compilation failed.\n"
+msgstr "C compilation failed.\n"
+
+#: ../targets/toolchain_gcc.py:199
+#, python-format
+msgid "C compilation of %s failed.\n"
+msgstr "C compilation of %s failed.\n"
+
+#: ../features.py:22
+msgid "C extension"
+msgstr "C extension"
+
+#: ../dialogs/AboutDialog.py:69
+msgid "C&redits"
+msgstr "C&redits"
+
+#: ../canfestival/NetworkEditor.py:58
+msgid "CANOpen network"
+msgstr "CANOpen network"
+
+#: ../canfestival/SlaveEditor.py:48
+msgid "CANOpen slave"
+msgstr "CANOpen slave"
+
+#: ../features.py:18
+msgid "CANopen support"
+msgstr "CANopen support"
+
+#: ../etherlab/ConfigEditor.py:858
+msgid "CIA402 nodes"
+msgstr "CIA402 nodes"
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
+msgid "Can only generate execution order on FBD networks!"
+msgstr "Can only generate execution order on FBD networks!"
+
+#: ../controls/VariablePanel.py:290
+msgid "Can only give a location to local or global variables"
+msgstr "Can only give a location to local or global variables"
+
+#: ../PLCOpenEditor.py:318
+#, python-format
+msgid "Can't generate program to file %s!"
+msgstr "Can't generate program to file %s!"
+
+#: ../controls/VariablePanel.py:288
+msgid "Can't give a location to a function block instance"
+msgstr "Can't give a location to a function block instance"
+
+#: ../PLCOpenEditor.py:363
+#, python-format
+msgid "Can't save project to file %s!"
+msgstr "Can't save project to file %s!"
+
+#: ../controls/VariablePanel.py:338
+msgid "Can't set an initial value to a function block instance"
+msgstr "Can't set an initial value to a function block instance"
+
+#: ../ConfigTreeNode.py:532
+#, python-brace-format
+msgid "Cannot create child {a1} of type {a2} "
+msgstr "Cannot create child {a1} of type {a2} "
+
+#: ../ConfigTreeNode.py:454
+#, python-format
+msgid "Cannot find lower free IEC channel than %d\n"
+msgstr "Cannot find lower free IEC channel than %d\n"
+
+#: ../connectors/PYRO/__init__.py:140
+msgid "Cannot get PLC status - connection failed.\n"
+msgstr "Cannot get PLC status - connection failed.\n"
+
+#: ../ProjectController.py:1013
+msgid "Cannot open/parse VARIABLES.csv!\n"
+msgstr "Cannot open/parse VARIABLES.csv!\n"
+
+#: ../canfestival/config_utils.py:400
+#, python-brace-format
+msgid "Cannot set bit offset for non bool '{a1}' variable (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr "Cannot set bit offset for non bool '{a1}' variable (ID:{a2},Idx:{a3},sIdx:{a4}))"
+
+#: ../ProjectController.py:1842
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr "Cannot transfer while PLC is running. Stop it now?"
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
+msgid "Case sensitive"
+msgstr "Case sensitive"
+
+#: ../editors/Viewer.py:584
+msgid "Center"
+msgstr "Center"
+
+#: ../Beremiz_service.py:289
+msgid "Change IP of interface to bind"
+msgstr "Change IP of interface to bind"
+
+#: ../Beremiz_service.py:288
+msgid "Change Name"
+msgstr "Change Name"
+
+#: ../IDEFrame.py:1994
+msgid "Change POU Type To"
+msgstr "Change POU Type To"
+
+#: ../Beremiz_service.py:290
+msgid "Change Port Number"
+msgstr "Change Port Number"
+
+#: ../Beremiz_service.py:291
+msgid "Change working directory"
+msgstr "Change working directory"
+
+#: ../plcopen/iec_std.csv:81
+msgid "Character string"
+msgstr "Character string"
+
+#: ../svgui/svgui.py:136
+msgid "Choose a SVG file"
+msgstr "Choose a SVG file"
+
+#: ../etherlab/EtherCATManagementEditor.py:911
+#: ../etherlab/EtherCATManagementEditor.py:1306
+msgid "Choose a binary file"
+msgstr "Choose a binary file"
+
+#: ../ProjectController.py:582
+msgid "Choose a directory to save project"
+msgstr "Choose a directory to save project"
+
+#: ../canfestival/canfestival.py:171 ../bacnet/bacnet.py:434
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
+msgid "Choose a file"
+msgstr "Choose a file"
+
+#: ../BeremizIDE.py:897
+msgid "Choose a project"
+msgstr "Choose a project"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
+#, python-format
+msgid "Choose a value for %s:"
+msgstr "Choose a value for %s:"
+
+#: ../Beremiz_service.py:346
+msgid "Choose a working directory "
+msgstr "Choose a working directory "
+
+#: ../etherlab/ConfigEditor.py:1234
+msgid "Choose an XML file"
+msgstr "Choose an XML file"
+
+#: ../BeremizIDE.py:861
+msgid "Choose an empty directory for new project"
+msgstr "Choose an empty directory for new project"
+
+#: ../ProjectController.py:483
+msgid "Chosen folder doesn't contain a program. It's not a valid project!"
+msgstr "Chosen folder doesn't contain a program. It's not a valid project!"
+
+#: ../ProjectController.py:450
+msgid "Chosen folder isn't empty. You can't use it for a new project!"
+msgstr "Chosen folder isn't empty. You can't use it for a new project!"
+
+#: ../controls/VariablePanel.py:60
+msgid "Class"
+msgstr "Class"
+
+#: ../controls/VariablePanel.py:474
+msgid "Class Filter:"
+msgstr "Class Filter:"
+
+#: ../dialogs/FBDVariableDialog.py:75
+msgid "Class:"
+msgstr "Class:"
+
+#: ../ProjectController.py:1904
+msgid "Clean"
+msgstr "Clean"
+
+#: ../controls/LogViewer.py:327
+msgid "Clean log messages"
+msgstr "Clean log messages"
+
+#: ../ProjectController.py:1905
+msgid "Clean project build folder"
+msgstr "Clean project build folder"
+
+#: ../ProjectController.py:1394
+msgid "Cleaning the build directory\n"
+msgstr "Cleaning the build directory\n"
+
+#: ../IDEFrame.py:439
+msgid "Clear Errors"
+msgstr "Clear Errors"
+
+#: ../editors/Viewer.py:683
+msgid "Clear Execution Order"
+msgstr "Clear Execution Order"
+
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+#: ../etherlab/ConfigEditor.py:1361
+msgid "Close"
+msgstr "Close"
+
+#: ../BeremizIDE.py:623 ../PLCOpenEditor.py:183
+msgid "Close Application"
+msgstr "Close Application"
+
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:562 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1053
+msgid "Close Project"
+msgstr "Close Project"
+
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
+msgid "Close Tab"
+msgstr "Close Tab"
+
+#: ../editors/Viewer.py:641 ../editors/Viewer.py:2450
+msgid "Coil"
+msgstr "Coil"
+
+#: ../editors/Viewer.py:662 ../editors/LDViewer.py:517
+msgid "Comment"
+msgstr "Comment"
+
+#: ../etherlab/ConfigEditor.py:66
+msgid "Communication Parameters"
+msgstr "Communication Parameters"
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr "Community support"
+
+#: ../dialogs/ProjectDialog.py:63
+msgid "Company Name"
+msgstr "Company Name"
+
+#: ../controls/ProjectPropertiesPanel.py:108
+msgid "Company Name (required):"
+msgstr "Company Name (required):"
+
+#: ../controls/ProjectPropertiesPanel.py:109
+msgid "Company URL (optional):"
+msgstr "Company URL (optional):"
+
+#: ../plcopen/iec_std.csv:75
+msgid "Comparison"
+msgstr "Comparison"
+
+#: ../ProjectController.py:787
+msgid "Compiling IEC Program into C code...\n"
+msgstr "Compiling IEC Program into C code...\n"
+
+#: ../plcopen/iec_std.csv:85
+msgid "Concatenation"
+msgstr "Concatenation"
+
+#: ../editors/ConfTreeNodeEditor.py:241
+msgid "Config"
+msgstr "Config"
+
+#: ../editors/ProjectNodeEditor.py:39
+msgid "Config variables"
+msgstr "Config variables"
+
+#: ../dialogs/SearchInProjectDialog.py:43
+msgid "Configuration"
+msgstr "Configuration"
+
+#: ../plcopen/types_enums.py:77
+msgid "Configurations"
+msgstr "Configurations"
+
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:353
+msgid "Confirm or change variable name"
+msgstr "Confirm or change variable name"
+
+#: ../ProjectController.py:1925
+msgid "Connect"
+msgstr "Connect"
+
+#: ../ProjectController.py:1926
+msgid "Connect to the target PLC"
+msgstr "Connect to the target PLC"
+
+#: ../ProjectController.py:1469
+#, python-format
+msgid "Connected to URI: %s"
+msgstr "Connected to URI: %s"
+
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:626
+#: ../editors/Viewer.py:2443
+msgid "Connection"
+msgstr "Connection"
+
+#: ../dialogs/ConnectionDialog.py:55
+msgid "Connection Properties"
+msgstr "Connection Properties"
+
+#: ../ProjectController.py:1773
+msgid "Connection canceled!\n"
+msgstr "Connection canceled!\n"
+
+#: ../ProjectController.py:1797
+#, python-format
+msgid "Connection failed to %s!\n"
+msgstr "Connection failed to %s!\n"
+
+#: ../connectors/PYRO/__init__.py:124 ../connectors/WAMP/__init__.py:121
+msgid "Connection lost!\n"
+msgstr "Connection lost!\n"
+
+#: ../connectors/PYRO/__init__.py:111
+#, python-format
+msgid "Connection to '%s' failed.\n"
+msgstr "Connection to '%s' failed.\n"
+
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1678
+msgid "Connector"
+msgstr "Connector"
+
+#: ../dialogs/SFCStepDialog.py:68
+msgid "Connectors:"
+msgstr "Connectors:"
+
+#: ../BeremizIDE.py:374
+msgid "Console"
+msgstr "Console"
+
+#: ../controls/VariablePanel.py:75
+msgid "Constant"
+msgstr "Constant"
+
+#: ../editors/Viewer.py:637 ../editors/Viewer.py:2446
+msgid "Contact"
+msgstr "Contact"
+
+#: ../controls/ProjectPropertiesPanel.py:219
+msgid "Content Description (optional):"
+msgstr "Content Description (optional):"
+
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1679
+msgid "Continuation"
+msgstr "Continuation"
+
+#: ../etherlab/EtherCATManagementEditor.py:37
+msgid "Control Byte"
+msgstr "Control Byte"
+
+#: ../plcopen/iec_std.csv:18
+msgid "Conversion from BCD"
+msgstr "Conversion from BCD"
+
+#: ../plcopen/iec_std.csv:19
+msgid "Conversion to BCD"
+msgstr "Conversion to BCD"
+
+#: ../plcopen/iec_std.csv:21
+msgid "Conversion to date"
+msgstr "Conversion to date"
+
+#: ../plcopen/iec_std.csv:20
+msgid "Conversion to time-of-day"
+msgstr "Conversion to time-of-day"
+
+#: ../editors/Viewer.py:698 ../controls/LogViewer.py:713 ../IDEFrame.py:375
+#: ../IDEFrame.py:428
+msgid "Copy"
+msgstr "Copy"
+
+#: ../IDEFrame.py:1981
+msgid "Copy POU"
+msgstr "Copy POU"
+
+#: ../editors/FileManagementPanel.py:67
+msgid "Copy file from left folder to right"
+msgstr "Copy file from left folder to right"
+
+#: ../editors/FileManagementPanel.py:66
+msgid "Copy file from right folder to left"
+msgstr "Copy file from right folder to left"
+
+#: ../plcopen/iec_std.csv:28
+msgid "Cosine"
+msgstr "Cosine"
+
+#: ../ConfigTreeNode.py:660
+#, python-brace-format
+msgid ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+msgstr ""
+"Could not add child \"{a1}\", type {a2} :\n"
+"{a3}\n"
+
+#: ../py_ext/PythonFileCTNMixin.py:81
+#, python-format
+msgid "Couldn't import old %s file."
+msgstr "Couldn't import old %s file."
+
+#: ../etherlab/EthercatMaster.py:258
+#, python-format
+msgid "Couldn't load %s network configuration file."
+msgstr "Couldn't load %s network configuration file."
+
+#: ../etherlab/EthercatMaster.py:279
+#, python-format
+msgid "Couldn't load %s network process variables file."
+msgstr "Couldn't load %s network process variables file."
+
+#: ../ConfigTreeNode.py:630
+#, python-brace-format
+msgid ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Couldn't load confnode base parameters {a1} :\n"
+" {a2}"
+
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
+#, python-brace-format
+msgid ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+msgstr ""
+"Couldn't load confnode parameters {a1} :\n"
+" {a2}"
+
+#: ../etherlab/etherlab.py:264
+#, python-brace-format
+msgid ""
+"Couldn't load {a1} XML file:\n"
+"{a2}"
+msgstr ""
+"Couldn't load {a1} XML file:\n"
+"{a2}"
+
+#: ../PLCControler.py:552
+msgid "Couldn't paste non-POU object."
+msgstr "Couldn't paste non-POU object."
+
+#: ../ProjectController.py:1717
+msgid "Couldn't start PLC !\n"
+msgstr "Couldn't start PLC !\n"
+
+#: ../ProjectController.py:1725
+msgid "Couldn't stop PLC !\n"
+msgstr "Couldn't stop PLC !\n"
+
+#: ../svgui/svgui.py:57
+msgid "Create HMI"
+msgstr "Create HMI"
+
+#: ../dialogs/PouDialog.py:48
+msgid "Create a new POU"
+msgstr "Create a new POU"
+
+#: ../dialogs/PouActionDialog.py:42
+msgid "Create a new action"
+msgstr "Create a new action"
+
+#: ../IDEFrame.py:313
+msgid "Create a new action block"
+msgstr "Create a new action block"
+
+#: ../IDEFrame.py:262 ../IDEFrame.py:292 ../IDEFrame.py:325
+msgid "Create a new block"
+msgstr "Create a new block"
+
+#: ../IDEFrame.py:286
+msgid "Create a new branch"
+msgstr "Create a new branch"
+
+#: ../IDEFrame.py:280
+msgid "Create a new coil"
+msgstr "Create a new coil"
+
+#: ../IDEFrame.py:256 ../IDEFrame.py:271 ../IDEFrame.py:301
+msgid "Create a new comment"
+msgstr "Create a new comment"
+
+#: ../IDEFrame.py:265 ../IDEFrame.py:295 ../IDEFrame.py:328
+msgid "Create a new connection"
+msgstr "Create a new connection"
+
+#: ../IDEFrame.py:283 ../IDEFrame.py:334
+msgid "Create a new contact"
+msgstr "Create a new contact"
+
+#: ../IDEFrame.py:316
+msgid "Create a new divergence"
+msgstr "Create a new divergence"
+
+#: ../dialogs/SFCDivergenceDialog.py:54
+msgid "Create a new divergence or convergence"
+msgstr "Create a new divergence or convergence"
+
+#: ../IDEFrame.py:304
+msgid "Create a new initial step"
+msgstr "Create a new initial step"
+
+#: ../IDEFrame.py:319
+msgid "Create a new jump"
+msgstr "Create a new jump"
+
+#: ../IDEFrame.py:274 ../IDEFrame.py:331
+msgid "Create a new power rail"
+msgstr "Create a new power rail"
+
+#: ../IDEFrame.py:277
+msgid "Create a new rung"
+msgstr "Create a new rung"
+
+#: ../IDEFrame.py:307
+msgid "Create a new step"
+msgstr "Create a new step"
+
+#: ../dialogs/PouTransitionDialog.py:45 ../IDEFrame.py:310
+msgid "Create a new transition"
+msgstr "Create a new transition"
+
+#: ../IDEFrame.py:259 ../IDEFrame.py:289 ../IDEFrame.py:322
+msgid "Create a new variable"
+msgstr "Create a new variable"
+
+#: ../etherlab/etherlab.py:183
+msgid "Creating new PDO"
+msgstr "Creating new PDO"
+
+#: ../dialogs/AboutDialog.py:109
+msgid "Credits"
+msgstr "Credits"
+
+#: ../runtime/WampClient.py:400
+msgid "Current status"
+msgstr "Current status"
+
+#: ../Beremiz_service.py:437
+msgid "Current working directory :"
+msgstr "Current working directory :"
+
+#: ../runtime/WampClient.py:161
+msgid "Custom protocol options failed :"
+msgstr "Custom protocol options failed :"
+
+#: ../editors/Viewer.py:697 ../IDEFrame.py:373 ../IDEFrame.py:427
+msgid "Cut"
+msgstr "Cut"
+
+#: ../editors/ResourceEditor.py:81
+msgid "Cyclic"
+msgstr "Cyclic"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:44
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:50
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:54
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:58
+#: ../plcopen/iec_std.csv:60
+msgid "DEPRECATED"
+msgstr "DEPRECATED"
+
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
+msgid "DS-301 Profile"
+msgstr "DS-301 Profile"
+
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
+msgid "DS-302 Profile"
+msgstr "DS-302 Profile"
+
+#: ../dialogs/SearchInProjectDialog.py:39
+msgid "Data Type"
+msgstr "Data Type"
+
+#: ../plcopen/types_enums.py:76
+msgid "Data Types"
+msgstr "Data Types"
+
+#: ../plcopen/iec_std.csv:16
+msgid "Data type conversion"
+msgstr "Data type conversion"
+
+#: ../plcopen/iec_std.csv:44 ../plcopen/iec_std.csv:45
+msgid "Date addition"
+msgstr "Date addition"
+
+#: ../plcopen/iec_std.csv:56 ../plcopen/iec_std.csv:57
+#: ../plcopen/iec_std.csv:58 ../plcopen/iec_std.csv:59
+msgid "Date and time subtraction"
+msgstr "Date and time subtraction"
+
+#: ../plcopen/iec_std.csv:50 ../plcopen/iec_std.csv:51
+msgid "Date subtraction"
+msgstr "Date subtraction"
+
+#: ../dialogs/DurationEditorDialog.py:57
+msgid "Days:"
+msgstr "Days:"
+
+#: ../ProjectController.py:1809
+msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
+msgstr "Debug does not match PLC - stop/transfert/start to re-enable\n"
+
+#: ../controls/PouInstanceVariablesPanel.py:144
+msgid "Debug instance"
+msgstr "Debug instance"
+
+#: ../editors/Viewer.py:493
+#, python-format
+msgid "Debug: %s"
+msgstr "Debug: %s"
+
+#: ../ProjectController.py:1548
+#, python-format
+msgid "Debug: Unknown variable '%s'\n"
+msgstr "Debug: Unknown variable '%s'\n"
+
+#: ../ProjectController.py:1545
+#, python-format
+msgid "Debug: Unsupported type to debug '%s'\n"
+msgstr "Debug: Unsupported type to debug '%s'\n"
+
+#: ../IDEFrame.py:666
+msgid "Debugger"
+msgstr "Debugger"
+
+#: ../ProjectController.py:1805
+msgid "Debugger ready\n"
+msgstr "Debugger ready\n"
+
+#: ../etherlab/EtherCATManagementEditor.py:37
+msgid "Default Size"
+msgstr "Default Size"
+
+#: ../etherlab/EthercatCFileGenerator.py:174
+#, python-format
+msgid "Definition conflict for location \"%s\""
+msgstr "Definition conflict for location \"%s\""
+
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:673 ../IDEFrame.py:2010
+msgid "Delete"
+msgstr "Delete"
+
+#: ../editors/Viewer.py:613
+msgid "Delete Divergence Branch"
+msgstr "Delete Divergence Branch"
+
+#: ../etherlab/ConfigEditor.py:1261 ../editors/FileManagementPanel.py:156
+msgid "Delete File"
+msgstr "Delete File"
+
+#: ../editors/Viewer.py:600
+msgid "Delete Wire Segment"
+msgstr "Delete Wire Segment"
+
+#: ../controls/CustomEditableListBox.py:44
+msgid "Delete item"
+msgstr "Delete item"
+
+#: ../plcopen/iec_std.csv:88
+msgid "Deletion (within)"
+msgstr "Deletion (within)"
+
+#: ../editors/DataTypeEditor.py:161
+msgid "Derivation Type:"
+msgstr "Derivation Type:"
+
+#: ../etherlab/ConfigEditor.py:346 ../etherlab/ConfigEditor.py:465
+#: ../editors/CodeFileEditor.py:754
+msgid "Description"
+msgstr "Description"
+
+#: ../controls/VariablePanel.py:465
+msgid "Description:"
+msgstr "Description:"
+
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
+msgid "Dimensions:"
+msgstr "Dimensions:"
+
+#: ../dialogs/FindInPouDialog.py:69
+msgid "Direction"
+msgstr "Direction"
+
+#: ../dialogs/BrowseLocationsDialog.py:101
+msgid "Direction:"
+msgstr "Direction:"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Directly"
+msgstr "Directly"
+
+#: ../ProjectController.py:1938
+msgid "Disconnect"
+msgstr "Disconnect"
+
+#: ../ProjectController.py:1939
+msgid "Disconnect from PLC"
+msgstr "Disconnect from PLC"
+
+#: ../runtime/PlcStatus.py:14
+msgid "Disconnected"
+msgstr "Disconnected"
+
+#: ../editors/Viewer.py:657 ../editors/Viewer.py:2438
+msgid "Divergence"
+msgstr "Divergence"
+
+#: ../plcopen/iec_std.csv:36
+msgid "Division"
+msgstr "Division"
+
+#: ../etherlab/ConfigEditor.py:1260 ../editors/FileManagementPanel.py:155
+#, python-format
+msgid "Do you really want to delete the file '%s'?"
+msgstr "Do you really want to delete the file '%s'?"
+
+#: ../controls/VariablePanel.py:65
+msgid "Documentation"
+msgstr "Documentation"
+
+#: ../PLCOpenEditor.py:312
+msgid "Done"
+msgstr "Done"
+
+#: ../runtime/WampClient.py:384
+msgid "Download"
+msgstr "Download"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Duration"
+msgstr "Duration"
+
+#: ../bacnet/bacnet.py:437
+msgid "EDE files (*_EDE.csv)|*_EDE.csv|All files|*.*"
+msgstr "EDE files (*_EDE.csv)|*_EDE.csv|All files|*.*"
+
+#: ../canfestival/canfestival.py:174
+msgid "EDS files (*.eds)|*.eds|All files|*.*"
+msgstr "EDS files (*.eds)|*.eds|All files|*.*"
+
+#: ../etherlab/ConfigEditor.py:1342
+msgid "ESI Files Database management"
+msgstr "ESI Files Database management"
+
+#: ../etherlab/ConfigEditor.py:1109
+msgid "ESI Files:"
+msgstr "ESI Files:"
+
+#: ../editors/Viewer.py:671
+msgid "Edit Block"
+msgstr "Edit Block"
+
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr "Edit Coil Values"
+
+#: ../dialogs/LDElementDialog.py:56
+msgid "Edit Contact Values"
+msgstr "Edit Contact Values"
+
+#: ../dialogs/DurationEditorDialog.py:54
+msgid "Edit Duration"
+msgstr "Edit Duration"
+
+#: ../dialogs/SFCStepDialog.py:53
+msgid "Edit Step"
+msgstr "Edit Step"
+
+#: ../wxglade_hmi/wxglade_hmi.py:45
+msgid "Edit a WxWidgets GUI with WXGlade"
+msgstr "Edit a WxWidgets GUI with WXGlade"
+
+#: ../dialogs/ActionBlockDialog.py:127
+msgid "Edit action block properties"
+msgstr "Edit action block properties"
+
+#: ../dialogs/ArrayTypeDialog.py:47
+msgid "Edit array type properties"
+msgstr "Edit array type properties"
+
+#: ../dialogs/CommentEditDialog.py:53
+msgid "Edit comment"
+msgstr "Edit comment"
+
+#: ../editors/FileManagementPanel.py:68
+msgid "Edit file"
+msgstr "Edit file"
+
+#: ../controls/CustomEditableListBox.py:42
+msgid "Edit item"
+msgstr "Edit item"
+
+#: ../editors/Viewer.py:3058
+msgid "Edit jump target"
+msgstr "Edit jump target"
+
+#: ../ProjectController.py:1956
+msgid "Edit raw IEC code added to code generated by PLCGenerator"
+msgstr "Edit raw IEC code added to code generated by PLCGenerator"
+
+#: ../editors/SFCViewer.py:815
+msgid "Edit step name"
+msgstr "Edit step name"
+
+#: ../dialogs/SFCTransitionDialog.py:53
+msgid "Edit transition"
+msgstr "Edit transition"
+
+#: ../IDEFrame.py:638
+msgid "Editor ToolBar"
+msgstr "Editor ToolBar"
+
+#: ../ProjectController.py:1355
+msgid "Editor selection"
+msgstr "Editor selection"
+
+#: ../editors/DataTypeEditor.py:360
+msgid "Elements :"
+msgstr "Elements :"
+
+#: ../runtime/PlcStatus.py:15
+msgid "Empty"
+msgstr "Empty"
+
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr "Empty dimension isn't allowed."
+
+#: ../etherlab/EtherCATManagementEditor.py:37
+msgid "Enable"
+msgstr "Enable"
+
+#: ../runtime/WampClient.py:410
+msgid "Enable WAMP connection"
+msgstr "Enable WAMP connection"
+
+#: ../Beremiz_service.py:354
+msgid "Enter a name "
+msgstr "Enter a name "
+
+#: ../Beremiz_service.py:339
+msgid "Enter a port number "
+msgstr "Enter a port number "
+
+#: ../etherlab/EtherCATManagementEditor.py:627
+msgid "Enter hex or dec value (if enter dec value, it automatically conversed hex value)"
+msgstr "Enter hex or dec value (if enter dec value, it automatically conversed hex value)"
+
+#: ../etherlab/EtherCATManagementEditor.py:1964
+msgid "Enter hex(0xnnnn) or dec(n) value"
+msgstr "Enter hex(0xnnnn) or dec(n) value"
+
+#: ../Beremiz_service.py:330
+msgid "Enter the IP of the interface to bind"
+msgstr "Enter the IP of the interface to bind"
+
+#: ../etherlab/ConfigEditor.py:502
+msgid "Entry can't be write through SDO"
+msgstr "Entry can't be write through SDO"
+
+#: ../etherlab/EthercatCFileGenerator.py:569
+#, python-brace-format
+msgid "Entry index 0x{a1:.4x}, subindex 0x{a2:.2x} not mapped for device {a3}"
+msgstr "Entry index 0x{a1:.4x}, subindex 0x{a2:.2x} not mapped for device {a3}"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Enumerated"
+msgstr "Enumerated"
+
+#: ../plcopen/iec_std.csv:77
+msgid "Equal to"
+msgstr "Equal to"
+
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:125
+#: ../dialogs/DurationEditorDialog.py:172 ../dialogs/PouTransitionDialog.py:113
+#: ../dialogs/BlockPreviewDialog.py:237 ../dialogs/ProjectDialog.py:78
+#: ../dialogs/ArrayTypeDialog.py:114 ../dialogs/PouNameDialog.py:58
+#: ../dialogs/BrowseLocationsDialog.py:228
+#: ../dialogs/BrowseValuesLibraryDialog.py:87 ../dialogs/PouActionDialog.py:112
+#: ../dialogs/PouDialog.py:178 ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../etherlab/ConfigEditor.py:458 ../etherlab/ConfigEditor.py:510
+#: ../etherlab/ConfigEditor.py:981 ../etherlab/ConfigEditor.py:1047
+#: ../etherlab/ConfigEditor.py:1246 ../etherlab/ConfigEditor.py:1314
+#: ../etherlab/EthercatMaster.py:463 ../editors/ResourceEditor.py:468
+#: ../editors/Viewer.py:467 ../editors/LDViewer.py:677
+#: ../editors/LDViewer.py:893 ../editors/LDViewer.py:897
+#: ../editors/DataTypeEditor.py:566 ../editors/DataTypeEditor.py:571
+#: ../editors/DataTypeEditor.py:590 ../editors/DataTypeEditor.py:759
+#: ../editors/DataTypeEditor.py:766 ../editors/TextViewer.py:390
+#: ../editors/CodeFileEditor.py:779 ../ProjectController.py:404
+#: ../ProjectController.py:548 ../ProjectController.py:557
+#: ../controls/FolderTree.py:222 ../controls/ProjectPropertiesPanel.py:308
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:163
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:430 ../controls/VariablePanel.py:784
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1049 ../IDEFrame.py:1667
+#: ../IDEFrame.py:1708 ../IDEFrame.py:1713 ../IDEFrame.py:1727
+#: ../IDEFrame.py:1732 ../Beremiz_service.py:234
+msgid "Error"
+msgstr "Error"
+
+#: ../ProjectController.py:848
+msgid "Error : At least one configuration and one resource must be declared in PLC !\n"
+msgstr "Error : At least one configuration and one resource must be declared in PLC !\n"
+
+#: ../ProjectController.py:838
+#, python-format
+msgid "Error : IEC to C compiler returned %d\n"
+msgstr "Error : IEC to C compiler returned %d\n"
+
+#: ../ProjectController.py:762
+#, python-format
+msgid ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+msgstr ""
+"Error in ST/IL/SFC code generator :\n"
+"%s\n"
+
+#: ../ConfigTreeNode.py:219
+#, python-format
+msgid "Error while saving \"%s\"\n"
+msgstr "Error while saving \"%s\"\n"
+
+#: ../bacnet/bacnet.py:581
+#, python-brace-format
+msgid "Error: BACnet server '{a1}.x: {a2}' contains objects with duplicate object identifiers.\n"
+msgstr "Error: BACnet server '{a1}.x: {a2}' contains objects with duplicate object identifiers.\n"
+
+#: ../bacnet/bacnet.py:573
+#, python-brace-format
+msgid "Error: BACnet server '{a1}.x:{a2}' contains objects with duplicate object names.\n"
+msgstr "Error: BACnet server '{a1}.x:{a2}' contains objects with duplicate object names.\n"
+
+#: ../canfestival/canfestival.py:179 ../bacnet/bacnet.py:444
+msgid "Error: Export slave failed\n"
+msgstr "Error: Export slave failed\n"
+
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid "Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number {a3}.\n"
+msgstr "Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number {a3}.\n"
+
+#: ../canfestival/canfestival.py:388
+msgid "Error: No Master generated\n"
+msgstr "Error: No Master generated\n"
+
+#: ../canfestival/canfestival.py:383
+msgid "Error: No PLC built\n"
+msgstr "Error: No PLC built\n"
+
+#: ../etherlab/ConfigEditor.py:269
+msgid "EtherCAT Management"
+msgstr "EtherCAT Management"
+
+#: ../features.py:20
+msgid "EtherCAT master"
+msgstr "EtherCAT master"
+
+#: ../etherlab/EthercatMaster.py:302
+msgid "Ethercat Slave Type"
+msgstr "Ethercat Slave Type"
+
+#: ../etherlab/ConfigEditor.py:267
+msgid "Ethercat node"
+msgstr "Ethercat node"
+
+#: ../ProjectController.py:1791
+#, python-format
+msgid "Exception while connecting %s!\n"
+msgstr "Exception while connecting %s!\n"
+
+#: ../dialogs/FBDBlockDialog.py:123
+msgid "Execution Control:"
+msgstr "Execution Control:"
+
+#: ../dialogs/FBDVariableDialog.py:85 ../dialogs/FBDBlockDialog.py:111
+msgid "Execution Order:"
+msgstr "Execution Order:"
+
+#: ../features.py:25
+msgid "Experimental web based HMI"
+msgstr "Experimental web based HMI"
+
+#: ../plcopen/iec_std.csv:38
+msgid "Exponent"
+msgstr "Exponent"
+
+#: ../plcopen/iec_std.csv:26
+msgid "Exponentiation"
+msgstr "Exponentiation"
+
+#: ../bacnet/bacnet.py:156
+msgid "Export BACnet slave to EDE file"
+msgstr "Export BACnet slave to EDE file"
+
+#: ../canfestival/canfestival.py:186
+msgid "Export CanOpen slave to EDS file"
+msgstr "Export CanOpen slave to EDS file"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:243
+msgid "Export graph values to clipboard"
+msgstr "Export graph values to clipboard"
+
+#: ../canfestival/canfestival.py:185 ../bacnet/bacnet.py:155
+msgid "Export slave"
+msgstr "Export slave"
+
+#: ../dialogs/FBDVariableDialog.py:95
+msgid "Expression:"
+msgstr "Expression:"
+
+#: ../controls/VariablePanel.py:87
+msgid "External"
+msgstr "External"
+
+#: ../ProjectController.py:866
+msgid "Extracting Located Variables...\n"
+msgstr "Extracting Located Variables...\n"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:128 ../controls/ProjectPropertiesPanel.py:161
+msgid "FBD"
+msgstr "FBD"
+
+#: ../ProjectController.py:1855
+msgid "Failed : Must build before transfer.\n"
+msgstr "Failed : Must build before transfer.\n"
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:559
+msgid "Falling Edge"
+msgstr "Falling Edge"
+
+#: ../ProjectController.py:1145
+msgid "Fatal : cannot get builder.\n"
+msgstr "Fatal : cannot get builder.\n"
+
+#: ../Beremiz.py:160
+#, python-format
+msgid "Fetching %s"
+msgstr "Fetching %s"
+
+#: ../dialogs/DurationEditorDialog.py:169
+#, python-format
+msgid "Field %s hasn't a valid value!"
+msgstr "Field %s hasn't a valid value!"
+
+#: ../dialogs/DurationEditorDialog.py:171
+#, python-format
+msgid "Fields %s haven't a valid value!"
+msgstr "Fields %s haven't a valid value!"
+
+#: ../controls/FolderTree.py:221
+#, python-format
+msgid "File '%s' already exists!"
+msgstr "File '%s' already exists!"
+
+#: ../runtime/WampClient.py:407
+msgid "File containing secret for that ID"
+msgstr "File containing secret for that ID"
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:380
+msgid "Find"
+msgstr "Find"
+
+#: ../IDEFrame.py:382
+msgid "Find Next"
+msgstr "Find Next"
+
+#: ../IDEFrame.py:384
+msgid "Find Previous"
+msgstr "Find Previous"
+
+#: ../plcopen/iec_std.csv:90
+msgid "Find position"
+msgstr "Find position"
+
+#: ../dialogs/FindInPouDialog.py:58
+msgid "Find:"
+msgstr "Find:"
+
+#: ../editors/Viewer.py:1635
+msgid "Force value"
+msgstr "Force value"
+
+#: ../dialogs/ForceVariableDialog.py:176
+msgid "Forcing Variable Value"
+msgstr "Forcing Variable Value"
+
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:103
+#: ../dialogs/ProjectDialog.py:77 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:160
+#, python-format
+msgid "Form isn't complete. %s must be filled!"
+msgstr "Form isn't complete. %s must be filled!"
+
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
+msgid "Form isn't complete. Name must be filled!"
+msgstr "Form isn't complete. Name must be filled!"
+
+#: ../dialogs/FBDBlockDialog.py:235
+msgid "Form isn't complete. Valid block type must be selected!"
+msgstr "Form isn't complete. Valid block type must be selected!"
+
+#: ../dialogs/FindInPouDialog.py:75
+msgid "Forward"
+msgstr "Forward"
+
+#: ../IDEFrame.py:455
+msgid "Full screen"
+msgstr "Full screen"
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1797
+msgid "Function"
+msgstr "Function"
+
+#: ../IDEFrame.py:357
+msgid "Function &Block"
+msgstr "Function &Block"
+
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1796
+#: ../IDEFrame.py:1989
+msgid "Function Block"
+msgstr "Function Block"
+
+#: ../controls/VariablePanel.py:879
+msgid "Function Block Types"
+msgstr "Function Block Types"
+
+#: ../plcopen/types_enums.py:75
+msgid "Function Blocks"
+msgstr "Function Blocks"
+
+#: ../editors/Viewer.py:290
+msgid "Function Blocks can't be used in Functions!"
+msgstr "Function Blocks can't be used in Functions!"
+
+#: ../PLCControler.py:1907
+#, python-format
+msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+msgstr "FunctionBlock \"%s\" can't be pasted in a Function!!!"
+
+#: ../plcopen/types_enums.py:75
+msgid "Functions"
+msgstr "Functions"
+
+#: ../PLCOpenEditor.py:88
+msgid "Generate Program"
+msgstr "Generate Program"
+
+#: ../ProjectController.py:750
+msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+msgstr "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
+
+#: ../controls/VariablePanel.py:88
+msgid "Global"
+msgstr "Global"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:242
+msgid "Go to current value"
+msgstr "Go to current value"
+
+#: ../controls/ProjectPropertiesPanel.py:192
+msgid "Graphics"
+msgstr "Graphics"
+
+#: ../plcopen/iec_std.csv:75
+msgid "Greater than"
+msgstr "Greater than"
+
+#: ../plcopen/iec_std.csv:76
+msgid "Greater than or equal to"
+msgstr "Greater than or equal to"
+
+#: ../controls/ProjectPropertiesPanel.py:152
+msgid "Grid Resolution:"
+msgstr "Grid Resolution:"
+
+#: ../runtime/NevowServer.py:313
+msgid "HTTP interface port :"
+msgstr "HTTP interface port :"
+
+#: ../controls/ProjectPropertiesPanel.py:138
+msgid "Height:"
+msgstr "Height:"
+
+#: ../editors/FileManagementPanel.py:88
+msgid "Home Directory:"
+msgstr "Home Directory:"
+
+#: ../controls/ProjectPropertiesPanel.py:168
+msgid "Horizontal:"
+msgstr "Horizontal:"
+
+#: ../dialogs/DurationEditorDialog.py:58
+msgid "Hours:"
+msgstr "Hours:"
+
+#: ../runtime/WampClient.py:404
+msgid "ID"
+msgstr "ID"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:128
+msgid "IL"
+msgstr "IL"
+
+#: ../dialogs/DiscoveryDialog.py:91
+msgid "IP"
+msgstr "IP"
+
+#: ../Beremiz_service.py:331 ../Beremiz_service.py:333
+msgid "IP is not valid!"
+msgstr "IP is not valid!"
+
+#: ../etherlab/ConfigEditor.py:1387
+msgid "Import ESI file"
+msgstr "Import ESI file"
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
+msgid "Import SVG"
+msgstr "Import SVG"
+
+#: ../etherlab/ConfigEditor.py:1352
+msgid "Import file to ESI files database"
+msgstr "Import file to ESI files database"
+
+#: ../dialogs/FBDVariableDialog.py:64 ../editors/Viewer.py:1664
+#: ../controls/VariablePanel.py:86
+msgid "InOut"
+msgstr "InOut"
+
+#: ../PLCGenerator.py:1089
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+
+#: ../editors/Viewer.py:484
+msgid "Inactive"
+msgstr "Inactive"
+
+#: ../controls/VariablePanel.py:299
+#, python-brace-format
+msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
+msgstr "Incompatible data types between \"{a1}\" and \"{a2}\""
+
+#: ../controls/VariablePanel.py:305
+#, python-format
+msgid "Incompatible size of data between \"%s\" and \"BOOL\""
+msgstr "Incompatible size of data between \"%s\" and \"BOOL\""
+
+#: ../controls/VariablePanel.py:309
+#, python-brace-format
+msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
+msgstr "Incompatible size of data between \"{a1}\" and \"{a2}\""
+
+#: ../etherlab/ConfigEditor.py:48 ../etherlab/ConfigEditor.py:465
+msgid "Index"
+msgstr "Index"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Indicator"
+msgstr "Indicator"
+
+#: ../editors/CodeFileEditor.py:753
+msgid "Initial"
+msgstr "Initial"
+
+#: ../editors/Viewer.py:653
+msgid "Initial Step"
+msgstr "Initial Step"
+
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
+msgid "Initial Value"
+msgstr "Initial Value"
+
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
+msgid "Initial Value:"
+msgstr "Initial Value:"
+
+#: ../etherlab/EthercatCIA402Slave.py:119
+msgid "Initiate Drag'n drop of Axis ref located variable"
+msgstr "Initiate Drag'n drop of Axis ref located variable"
+
+#: ../etherlab/EthercatCIA402Slave.py:126
+msgid "Initiate Drag'n drop of Network position located variable"
+msgstr "Initiate Drag'n drop of Network position located variable"
+
+#: ../svgui/svgui.py:56
+msgid "Inkscape"
+msgstr "Inkscape"
+
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
+msgid "Inline"
+msgstr "Inline"
+
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:63
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1662 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:86
+#: ../controls/VariablePanel.py:316 ../controls/VariablePanel.py:379
+msgid "Input"
+msgstr "Input"
+
+#: ../dialogs/FBDBlockDialog.py:99
+msgid "Inputs:"
+msgstr "Inputs:"
+
+#: ../plcopen/iec_std.csv:87
+msgid "Insertion (into)"
+msgstr "Insertion (into)"
+
+#: ../plcopen/plcopen.py:1948
+#, python-format
+msgid "Instance with id %d doesn't exist!"
+msgstr "Instance with id %d doesn't exist!"
+
+#: ../editors/ResourceEditor.py:277
+msgid "Instances:"
+msgstr "Instances:"
+
+#: ../controls/VariablePanel.py:85
+msgid "Interface"
+msgstr "Interface"
+
+#: ../editors/ResourceEditor.py:81
+msgid "Interrupt"
+msgstr "Interrupt"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Interval"
+msgstr "Interval"
+
+#: ../controls/ProjectPropertiesPanel.py:306
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+
+#: ../PLCControler.py:1895
+msgid "Invalid plcopen element(s)!!!"
+msgstr "Invalid plcopen element(s)!!!"
+
+#: ../canfestival/config_utils.py:407
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+
+#: ../canfestival/config_utils.py:689
+#, python-brace-format
+msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+msgstr "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:129
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
+#, python-format
+msgid "Invalid value \"%s\" for debug variable"
+msgstr "Invalid value \"%s\" for debug variable"
+
+#: ../etherlab/ConfigEditor.py:418 ../etherlab/ConfigEditor.py:421
+#: ../etherlab/ConfigEditor.py:452
+#, python-format
+msgid "Invalid value \"%s\" for process variable"
+msgstr "Invalid value \"%s\" for process variable"
+
+#: ../etherlab/ConfigEditor.py:480 ../etherlab/ConfigEditor.py:483
+#: ../etherlab/ConfigEditor.py:504
+#, python-format
+msgid "Invalid value \"%s\" for startup command"
+msgstr "Invalid value \"%s\" for startup command"
+
+#: ../controls/VariablePanel.py:278 ../controls/VariablePanel.py:281
+#, python-format
+msgid "Invalid value \"%s\" for variable grid element"
+msgstr "Invalid value \"%s\" for variable grid element"
+
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
+#, python-format
+msgid "Invalid value \"%s\" for viewer block"
+msgstr "Invalid value \"%s\" for viewer block"
+
+#: ../dialogs/ForceVariableDialog.py:211
+#, python-brace-format
+msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
+msgstr "Invalid value \"{a1}\" for \"{a2}\" variable!"
+
+#: ../etherlab/CommonEtherCATFunction.py:31
+#, python-format
+msgid "Invalid value for HexDecValue \"%s\""
+msgstr "Invalid value for HexDecValue \"%s\""
+
+#: ../dialogs/DurationEditorDialog.py:125
+msgid ""
+"Invalid value!\n"
+"You must fill a numeric value."
+msgstr ""
+"Invalid value!\n"
+"You must fill a numeric value."
+
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr "Is connection secure?"
+
+#: ../editors/Viewer.py:658 ../editors/Viewer.py:2427
+msgid "Jump"
+msgstr "Jump"
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:128 ../controls/ProjectPropertiesPanel.py:161
+msgid "LD"
+msgstr "LD"
+
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
+#, python-format
+msgid "Ladder element with id %d is on more than one rung."
+msgstr "Ladder element with id %d is on more than one rung."
+
+#: ../dialogs/PouTransitionDialog.py:92 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:148
+msgid "Language"
+msgstr "Language"
+
+#: ../controls/ProjectPropertiesPanel.py:208
+msgid "Language (optional):"
+msgstr "Language (optional):"
+
+#: ../dialogs/PouTransitionDialog.py:66 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:79
+msgid "Language:"
+msgstr "Language:"
+
+#: ../ProjectController.py:1861
+msgid "Latest build already matches current target. Transfering anyway...\n"
+msgstr "Latest build already matches current target. Transfering anyway...\n"
+
+#: ../Beremiz_service.py:294
+msgid "Launch WX GUI inspector"
+msgstr "Launch WX GUI inspector"
+
+#: ../Beremiz_service.py:293
+msgid "Launch a live Python shell"
+msgstr "Launch a live Python shell"
+
+#: ../editors/Viewer.py:583
+msgid "Left"
+msgstr "Left"
+
+#: ../dialogs/LDPowerRailDialog.py:64
+msgid "Left PowerRail"
+msgstr "Left PowerRail"
+
+#: ../plcopen/iec_std.csv:81
+msgid "Length of string"
+msgstr "Length of string"
+
+#: ../plcopen/iec_std.csv:78
+msgid "Less than"
+msgstr "Less than"
+
+#: ../plcopen/iec_std.csv:79
+msgid "Less than or equal to"
+msgstr "Less than or equal to"
+
+#: ../IDEFrame.py:658
+msgid "Library"
+msgstr "Library"
+
+#: ../dialogs/AboutDialog.py:145
+msgid "License"
+msgstr "License"
+
+#: ../plcopen/iec_std.csv:73
+msgid "Limitation"
+msgstr "Limitation"
+
+#: ../targets/toolchain_gcc.py:209
+msgid "Linking :\n"
+msgstr "Linking :\n"
+
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:87
+msgid "Local"
+msgstr "Local"
+
+#: ../canfestival/canfestival.py:359
+msgid "Local entries"
+msgstr "Local entries"
+
+#: ../ProjectController.py:1767
+msgid "Local service discovery failed!\n"
+msgstr "Local service discovery failed!\n"
+
+#: ../controls/VariablePanel.py:62
+msgid "Location"
+msgstr "Location"
+
+#: ../dialogs/BrowseLocationsDialog.py:78
+msgid "Locations available:"
+msgstr "Locations available:"
+
+#: ../runtime/NevowServer.py:175
+msgid "Log message level"
+msgstr "Log message level"
+
+#: ../plcopen/iec_std.csv:25
+msgid "Logarithm to base 10"
+msgstr "Logarithm to base 10"
+
+#: ../connectors/PYRO/__init__.py:103
+#, python-format
+msgid "MDNS resolution failure for '%s'\n"
+msgstr "MDNS resolution failure for '%s'\n"
+
+#: ../etherlab/ConfigEditor.py:67
+msgid "Manufacturer Specific"
+msgstr "Manufacturer Specific"
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
+msgid "Map Variable"
+msgstr "Map Variable"
+
+#: ../features.py:19
+msgid "Map located variables over Bacnet"
+msgstr "Map located variables over Bacnet"
+
+#: ../features.py:18
+msgid "Map located variables over CANopen"
+msgstr "Map located variables over CANopen"
+
+#: ../features.py:20
+msgid "Map located variables over EtherCAT"
+msgstr "Map located variables over EtherCAT"
+
+#: ../features.py:21
+msgid "Map located variables over Modbus"
+msgstr "Map located variables over Modbus"
+
+#: ../canfestival/NetworkEditor.py:113
+msgid "Master"
+msgstr "Master"
+
+#: ../etherlab/ConfigEditor.py:613
+msgid "Master State"
+msgstr "Master State"
+
+#: ../ConfigTreeNode.py:544
+#, python-brace-format
+msgid "Max count ({a1}) reached for this confnode of type {a2} "
+msgstr "Max count ({a1}) reached for this confnode of type {a2} "
+
+#: ../etherlab/etherlab.py:173
+msgid "Max entries by PDO"
+msgstr "Max entries by PDO"
+
+#: ../etherlab/etherlab.py:176
+msgid ""
+"Maximal number of entries mapped in a PDO\n"
+"including empty entries used for PDO alignment"
+msgstr ""
+"Maximal number of entries mapped in a PDO\n"
+"including empty entries used for PDO alignment"
+
+#: ../plcopen/iec_std.csv:71
+msgid "Maximum"
+msgstr "Maximum"
+
+#: ../editors/DataTypeEditor.py:246
+msgid "Maximum:"
+msgstr "Maximum:"
+
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:316 ../controls/VariablePanel.py:379
+msgid "Memory"
+msgstr "Memory"
+
+#: ../IDEFrame.py:623
+msgid "Menu ToolBar"
+msgstr "Menu ToolBar"
+
+#: ../runtime/NevowServer.py:176
+msgid "Message text"
+msgstr "Message text"
+
+#: ../dialogs/DurationEditorDialog.py:62
+msgid "Microseconds:"
+msgstr "Microseconds:"
+
+#: ../editors/Viewer.py:588
+msgid "Middle"
+msgstr "Middle"
+
+#: ../dialogs/DurationEditorDialog.py:61
+msgid "Milliseconds:"
+msgstr "Milliseconds:"
+
+#: ../etherlab/etherlab.py:167
+msgid "Minimal size in bits between 2 pdo entries"
+msgstr "Minimal size in bits between 2 pdo entries"
+
+#: ../plcopen/iec_std.csv:72
+msgid "Minimum"
+msgstr "Minimum"
+
+#: ../editors/DataTypeEditor.py:233
+msgid "Minimum:"
+msgstr "Minimum:"
+
+#: ../dialogs/DurationEditorDialog.py:59
+msgid "Minutes:"
+msgstr "Minutes:"
+
+#: ../etherlab/etherlab.py:238 ../controls/ProjectPropertiesPanel.py:233
+msgid "Miscellaneous"
+msgstr "Miscellaneous"
+
+#: ../features.py:21
+msgid "Modbus support"
+msgstr "Modbus support"
+
+#: ../dialogs/LDElementDialog.py:65
+msgid "Modifier:"
+msgstr "Modifier:"
+
+#: ../etherlab/ConfigEditor.py:1313
+#, python-format
+msgid "Module %s must be an integer!"
+msgstr "Module %s must be an integer!"
+
+#: ../etherlab/ConfigEditor.py:1376
+msgid "Modules Library"
+msgstr "Modules Library"
+
+#: ../etherlab/ConfigEditor.py:1145
+msgid "Modules library:"
+msgstr "Modules library:"
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1318
+#, python-brace-format
+msgid "More than one connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr "More than one connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+
+#: ../dialogs/ActionBlockDialog.py:146
+msgid "Move action down"
+msgstr "Move action down"
+
+#: ../dialogs/ActionBlockDialog.py:145
+msgid "Move action up"
+msgstr "Move action up"
+
+#: ../controls/CustomEditableListBox.py:46
+msgid "Move down"
+msgstr "Move down"
+
+#: ../editors/DataTypeEditor.py:367
+msgid "Move element down"
+msgstr "Move element down"
+
+#: ../editors/DataTypeEditor.py:366
+msgid "Move element up"
+msgstr "Move element up"
+
+#: ../editors/ResourceEditor.py:284
+msgid "Move instance down"
+msgstr "Move instance down"
+
+#: ../editors/ResourceEditor.py:283
+msgid "Move instance up"
+msgstr "Move instance up"
+
+#: ../etherlab/ConfigEditor.py:655
+msgid "Move process variable down"
+msgstr "Move process variable down"
+
+#: ../etherlab/ConfigEditor.py:654
+msgid "Move process variable up"
+msgstr "Move process variable up"
+
+#: ../editors/ResourceEditor.py:253
+msgid "Move task down"
+msgstr "Move task down"
+
+#: ../editors/ResourceEditor.py:252
+msgid "Move task up"
+msgstr "Move task up"
+
+#: ../IDEFrame.py:253 ../IDEFrame.py:268 ../IDEFrame.py:298 ../IDEFrame.py:339
+msgid "Move the view"
+msgstr "Move the view"
+
+#: ../controls/CustomEditableListBox.py:45
+msgid "Move up"
+msgstr "Move up"
+
+#: ../bacnet/BacnetSlaveEditor.py:814 ../editors/CodeFileEditor.py:675
+#: ../controls/VariablePanel.py:486
+msgid "Move variable down"
+msgstr "Move variable down"
+
+#: ../bacnet/BacnetSlaveEditor.py:813 ../editors/CodeFileEditor.py:674
+#: ../controls/VariablePanel.py:485
+msgid "Move variable up"
+msgstr "Move variable up"
+
+#: ../bacnet/BacnetSlaveEditor.py:941
+msgid "Multi-State Input Objects"
+msgstr "Multi-State Input Objects"
+
+#: ../bacnet/BacnetSlaveEditor.py:940
+msgid "Multi-State Output Objects"
+msgstr "Multi-State Output Objects"
+
+#: ../bacnet/BacnetSlaveEditor.py:939
+msgid "Multi-State Value Objects"
+msgstr "Multi-State Value Objects"
+
+#: ../plcopen/iec_std.csv:74
+msgid "Multiplexer (select 1 of N)"
+msgstr "Multiplexer (select 1 of N)"
+
+#: ../plcopen/iec_std.csv:34
+msgid "Multiplication"
+msgstr "Multiplication"
+
+#: ../editors/FileManagementPanel.py:86
+msgid "My Computer:"
+msgstr "My Computer:"
+
+#: ../dialogs/DiscoveryDialog.py:89
+msgid "NAME"
+msgstr "NAME"
+
+#: ../etherlab/EtherCATManagementEditor.py:37 ../etherlab/ConfigEditor.py:48
+#: ../etherlab/ConfigEditor.py:343 ../etherlab/ConfigEditor.py:1167
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:94
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:751
+#: ../controls/VariablePanel.py:59
+msgid "Name"
+msgstr "Name"
+
+#: ../Beremiz_service.py:355
+msgid "Name must not be null!"
+msgstr "Name must not be null!"
+
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
+msgid "Name:"
+msgstr "Name:"
+
+#: ../plcopen/iec_std.csv:24
+msgid "Natural logarithm"
+msgstr "Natural logarithm"
+
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:557
+msgid "Negated"
+msgstr "Negated"
+
+#: ../etherlab/ConfigEditor.py:612
+msgid "Network"
+msgstr "Network"
+
+#: ../Beremiz_service.py:620
+msgid "Nevow Web service failed. "
+msgstr "Nevow Web service failed. "
+
+#: ../Beremiz_service.py:596
+msgid "Nevow/Athena import failed :"
+msgstr "Nevow/Athena import failed :"
+
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
+msgid "New"
+msgstr "New"
+
+#: ../controls/CustomEditableListBox.py:43
+msgid "New item"
+msgstr "New item"
+
+#: ../editors/Viewer.py:556
+msgid "No Modifier"
+msgstr "No Modifier"
+
+#: ../ProjectController.py:1891
+msgid "No PLC to transfer (did build succeed ?)\n"
+msgstr "No PLC to transfer (did build succeed ?)\n"
+
+#: ../etherlab/EthercatCFileGenerator.py:504
+#, python-format
+msgid "No Sync manager defined for %s!"
+msgstr "No Sync manager defined for %s!"
+
+#: ../PLCGenerator.py:1727
+#, python-format
+msgid "No body defined in \"%s\" POU"
+msgstr "No body defined in \"%s\" POU"
+
+#: ../etherlab/CommonEtherCATFunction.py:1581
+msgid "No connected slaves"
+msgstr "No connected slaves"
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1330
+#, python-brace-format
+msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+msgstr "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
+
+#: ../PLCOpenEditor.py:331
+msgid ""
+"No documentation available.\n"
+"Coming soon."
+msgstr ""
+"No documentation available.\n"
+"Coming soon."
+
+#: ../PLCGenerator.py:841
+#, python-format
+msgid "No informations found for \"%s\" block"
+msgstr "No informations found for \"%s\" block"
+
+#: ../etherlab/EthercatCFileGenerator.py:224
+#, python-format
+msgid "No informations found for device %s!"
+msgstr "No informations found for device %s!"
+
+#: ../etherlab/EthercatCFileGenerator.py:515
+#, python-format
+msgid "No more free PDO index available for %s!"
+msgstr "No more free PDO index available for %s!"
+
+#: ../PLCGenerator.py:1281
+#, python-brace-format
+msgid "No output {a1} variable found in block {a2} in POU {a3}. Connection must be broken"
+msgstr "No output {a1} variable found in block {a2} in POU {a3}. Connection must be broken"
+
+#: ../controls/SearchResultPanel.py:175
+msgid "No search results available."
+msgstr "No search results available."
+
+#: ../etherlab/ConfigEditor.py:1029
+#, python-format
+msgid "No slave defined at position %d!"
+msgstr "No slave defined at position %d!"
+
+#: ../svgui/svgui.py:142
+#, python-format
+msgid "No such SVG file: %s\n"
+msgstr "No such SVG file: %s\n"
+
+#: ../etherlab/ConfigEditor.py:1245
+#, python-format
+msgid "No such XML file: %s\n"
+msgstr "No such XML file: %s\n"
+
+#: ../canfestival/config_utils.py:682
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
+msgstr "No such index/subindex ({a1},{a2}) (variable {a3})"
+
+#: ../canfestival/config_utils.py:387
+#, python-brace-format
+msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+msgstr "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
+
+#: ../etherlab/EthercatCFileGenerator.py:438
+#, python-format
+msgid "No sync manager available for %s pdo!"
+msgstr "No sync manager available for %s pdo!"
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
+msgid "No valid value selected!"
+msgstr "No valid value selected!"
+
+#: ../PLCGenerator.py:1725
+#, python-format
+msgid "No variable defined in \"%s\" POU"
+msgstr "No variable defined in \"%s\" POU"
+
+#: ../etherlab/ConfigEditor.py:606
+#, python-format
+msgid "Node Position: %d"
+msgstr "Node Position: %d"
+
+#: ../etherlab/ConfigEditor.py:697
+msgid "Node filter:"
+msgstr "Node filter:"
+
+#: ../etherlab/ConfigEditor.py:717
+msgid "Nodes variables filter:"
+msgstr "Nodes variables filter:"
+
+#: ../canfestival/config_utils.py:379
+#, python-brace-format
+msgid "Non existing node ID : {a1} (variable {a2})"
+msgstr "Non existing node ID : {a1} (variable {a2})"
+
+#: ../controls/VariablePanel.py:79
+msgid "Non-Retain"
+msgstr "Non-Retain"
+
+#: ../dialogs/LDElementDialog.py:78
+msgid "Normal"
+msgstr "Normal"
+
+#: ../canfestival/config_utils.py:426
+#, python-brace-format
+msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+msgstr "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
+
+#: ../plcopen/iec_std.csv:80
+msgid "Not equal to"
+msgstr "Not equal to"
+
+#: ../etherlab/EtherCATManagementEditor.py:361
+msgid "Now Uploading..."
+msgstr "Now Uploading..."
+
+#: ../dialogs/SFCDivergenceDialog.py:91
+msgid "Number of sequences:"
+msgstr "Number of sequences:"
+
+#: ../plcopen/iec_std.csv:22
+msgid "Numerical"
+msgstr "Numerical"
+
+#: ../bacnet/BacnetSlaveEditor.py:808
+msgid "Object Properties:"
+msgstr "Object Properties:"
+
+#: ../editors/CodeFileEditor.py:755
+msgid "OnChange"
+msgstr "OnChange"
+
+#: ../dialogs/SearchInProjectDialog.py:88
+msgid "Only Elements"
+msgstr "Only Elements"
+
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
+msgid "Open"
+msgstr "Open"
+
+#: ../svgui/svgui.py:151
+msgid "Open Inkscape"
+msgstr "Open Inkscape"
+
+#: ../version.py:88
+msgid "Open Source framework for automation, implemented IEC 61131 IDE with constantly growing set of extensions and flexible PLC runtime."
+msgstr "Open Source framework for automation, implemented IEC 61131 IDE with constantly growing set of extensions and flexible PLC runtime."
+
+#: ../ProjectController.py:1962
+msgid "Open a file explorer to manage project files"
+msgstr "Open a file explorer to manage project files"
+
+#: ../wxglade_hmi/wxglade_hmi.py:176
+msgid "Open wxGlade"
+msgstr "Open wxGlade"
+
+#: ../controls/VariablePanel.py:64
+msgid "Option"
+msgstr "Option"
+
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:756
+msgid "Options"
+msgstr "Options"
+
+#: ../controls/ProjectPropertiesPanel.py:111
+msgid "Organization (optional):"
+msgstr "Organization (optional):"
+
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
+msgid "Other Profile"
+msgstr "Other Profile"
+
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:65
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1663 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:86
+#: ../controls/VariablePanel.py:316 ../controls/VariablePanel.py:379
+msgid "Output"
+msgstr "Output"
+
+#: ../etherlab/EthercatCFileGenerator.py:170
+#, python-brace-format
+msgid "Output variables can't be defined with different locations ({a1} and {a2})"
+msgstr "Output variables can't be defined with different locations ({a1} and {a2})"
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
+msgid "PDO Receive"
+msgstr "PDO Receive"
+
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
+msgid "PDO Transmit"
+msgstr "PDO Transmit"
+
+#: ../etherlab/etherlab.py:164
+msgid "PDO alignment"
+msgstr "PDO alignment"
+
+#: ../targets/toolchain_gcc.py:174
+msgid "PLC :\n"
+msgstr "PLC :\n"
+
+#: ../BeremizIDE.py:379
+msgid "PLC Log"
+msgstr "PLC Log"
+
+#: ../ProjectController.py:1129
+msgid "PLC code generation failed !\n"
+msgstr "PLC code generation failed !\n"
+
+#: ../etherlab/EtherCATManagementEditor.py:250
+msgid "PLC is Not Started"
+msgstr "PLC is Not Started"
+
+#: ../Beremiz_service.py:318
+msgid "PLC is empty or already started."
+msgstr "PLC is empty or already started."
+
+#: ../Beremiz_service.py:325
+msgid "PLC is not started."
+msgstr "PLC is not started."
+
+#: ../etherlab/EtherCATManagementEditor.py:2160
+#: ../etherlab/CommonEtherCATFunction.py:1589
+msgid "PLC not connected!"
+msgstr "PLC not connected!"
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
+#, python-brace-format
+msgid ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+msgstr ""
+"PLC syntax error at line {a1}:\n"
+"{a2}"
+
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
+msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
+msgstr "PLCOpen files (*.xml)|*.xml|All files|*.*"
+
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
+msgid "PLCOpenEditor"
+msgstr "PLCOpenEditor"
+
+#: ../PLCOpenEditor.py:339
+msgid ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+msgstr ""
+"PLCOpenEditor is part of Beremiz project.\n"
+"\n"
+"Beremiz is an "
+
+#: ../dialogs/DiscoveryDialog.py:92
+msgid "PORT"
+msgstr "PORT"
+
+#: ../dialogs/PouDialog.py:144
+msgid "POU Name"
+msgstr "POU Name"
+
+#: ../dialogs/PouDialog.py:64
+msgid "POU Name:"
+msgstr "POU Name:"
+
+#: ../dialogs/PouDialog.py:146
+msgid "POU Type"
+msgstr "POU Type"
+
+#: ../dialogs/PouDialog.py:71
+msgid "POU Type:"
+msgstr "POU Type:"
+
+#: ../connectors/PYRO/__init__.py:53
+#, python-format
+msgid "PYRO connecting to URI : %s\n"
+msgstr "PYRO connecting to URI : %s\n"
+
+#: ../connectors/PYRO/__init__.py:69
+#, python-format
+msgid "PYRO using certificates in '%s' \n"
+msgstr "PYRO using certificates in '%s' \n"
+
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
+msgid "Page Setup"
+msgstr "Page Setup"
+
+#: ../controls/ProjectPropertiesPanel.py:127
+msgid "Page Size (optional):"
+msgstr "Page Size (optional):"
+
+#: ../IDEFrame.py:2660
+#, python-format
+msgid "Page: %d"
+msgstr "Page: %d"
+
+#: ../controls/PouInstanceVariablesPanel.py:134
+msgid "Parent instance"
+msgstr "Parent instance"
+
+#: ../editors/Viewer.py:699 ../IDEFrame.py:377 ../IDEFrame.py:429
+msgid "Paste"
+msgstr "Paste"
+
+#: ../IDEFrame.py:1916
+msgid "Paste POU"
+msgstr "Paste POU"
+
+#: ../dialogs/SearchInProjectDialog.py:60
+msgid "Pattern to search:"
+msgstr "Pattern to search:"
+
+#: ../dialogs/LDPowerRailDialog.py:75
+msgid "Pin number:"
+msgstr "Pin number:"
+
+#: ../runtime/NevowServer.py:163
+msgid "Platform"
+msgstr "Platform"
+
+#: ../editors/Viewer.py:2791 ../editors/Viewer.py:3059
+#: ../editors/SFCViewer.py:785
+msgid "Please choose a target"
+msgstr "Please choose a target"
+
+#: ../editors/TextViewer.py:260
+msgid "Please enter a block name"
+msgstr "Please enter a block name"
+
+#: ../dialogs/CommentEditDialog.py:52
+msgid "Please enter comment text"
+msgstr "Please enter comment text"
+
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
+msgid "Please enter step name"
+msgstr "Please enter step name"
+
+#: ../dialogs/SFCStepNameDialog.py:37 ../dialogs/PouNameDialog.py:37
+#: ../Beremiz_service.py:222
+msgid "Please enter text"
+msgstr "Please enter text"
+
+#: ../dialogs/ForceVariableDialog.py:177
+#, python-format
+msgid "Please enter value for a \"%s\" variable:"
+msgstr "Please enter value for a \"%s\" variable:"
+
+#: ../Beremiz_service.py:340
+msgid "Port number must be 0 <= port <= 65535!"
+msgstr "Port number must be 0 <= port <= 65535!"
+
+#: ../Beremiz_service.py:340
+msgid "Port number must be an integer!"
+msgstr "Port number must be an integer!"
+
+#: ../etherlab/ConfigEditor.py:47 ../etherlab/ConfigEditor.py:465
+msgid "Position"
+msgstr "Position"
+
+#: ../editors/Viewer.py:636 ../editors/Viewer.py:2451
+msgid "Power Rail"
+msgstr "Power Rail"
+
+#: ../dialogs/LDPowerRailDialog.py:52
+msgid "Power Rail Properties"
+msgstr "Power Rail Properties"
+
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
+msgid "Preview"
+msgstr "Preview"
+
+#: ../dialogs/BlockPreviewDialog.py:59
+msgid "Preview:"
+msgstr "Preview:"
+
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
+msgid "Print"
+msgstr "Print"
+
+#: ../IDEFrame.py:1123
+msgid "Print preview"
+msgstr "Print preview"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Priority"
+msgstr "Priority"
+
+#: ../dialogs/SFCTransitionDialog.py:91
+msgid "Priority:"
+msgstr "Priority:"
+
+#: ../runtime/PLCObject.py:523
+#, python-format
+msgid "Problem starting PLC : error %d"
+msgstr "Problem starting PLC : error %d"
+
+#: ../etherlab/ConfigEditor.py:647
+msgid "Process variables mapped between nodes:"
+msgstr "Process variables mapped between nodes:"
+
+#: ../dialogs/ProjectDialog.py:61
+msgid "Product Name"
+msgstr "Product Name"
+
+#: ../controls/ProjectPropertiesPanel.py:91
+msgid "Product Name (required):"
+msgstr "Product Name (required):"
+
+#: ../controls/ProjectPropertiesPanel.py:93
+msgid "Product Release (optional):"
+msgstr "Product Release (optional):"
+
+#: ../dialogs/ProjectDialog.py:62
+msgid "Product Version"
+msgstr "Product Version"
+
+#: ../controls/ProjectPropertiesPanel.py:92
+msgid "Product Version (required):"
+msgstr "Product Version (required):"
+
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1795
+#: ../IDEFrame.py:1992
+msgid "Program"
+msgstr "Program"
+
+#: ../PLCOpenEditor.py:321
+msgid "Program was successfully generated!"
+msgstr "Program was successfully generated!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Programs"
+msgstr "Programs"
+
+#: ../editors/Viewer.py:285
+msgid "Programs can't be used by other POUs!"
+msgstr "Programs can't be used by other POUs!"
+
+#: ../controls/ProjectPropertiesPanel.py:95 ../IDEFrame.py:607
+msgid "Project"
+msgstr "Project"
+
+#: ../controls/SearchResultPanel.py:180
+#, python-format
+msgid "Project '%s':"
+msgstr "Project '%s':"
+
+#: ../ProjectController.py:1961
+msgid "Project Files"
+msgstr "Project Files"
+
+#: ../dialogs/ProjectDialog.py:60
+msgid "Project Name"
+msgstr "Project Name"
+
+#: ../controls/ProjectPropertiesPanel.py:89
+msgid "Project Name (required):"
+msgstr "Project Name (required):"
+
+#: ../controls/ProjectPropertiesPanel.py:90
+msgid "Project Version (optional):"
+msgstr "Project Version (optional):"
+
+#: ../PLCControler.py:2717
+msgid ""
+"Project file syntax error:\n"
+"\n"
+msgstr ""
+"Project file syntax error:\n"
+"\n"
+
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
+msgid "Project properties"
+msgstr "Project properties"
+
+#: ../ConfigTreeNode.py:571
+#, python-brace-format
+msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
+msgstr "Project tree layout do not match confnode.xml {a1}!={a2} "
+
+#: ../dialogs/ConnectionDialog.py:101
+msgid "Propagate Name"
+msgstr "Propagate Name"
+
+#: ../plcopen/types_enums.py:77
+msgid "Properties"
+msgstr "Properties"
+
+#: ../Beremiz_service.py:440
+msgid "Publishing service on local network"
+msgstr "Publishing service on local network"
+
+#: ../connectors/PYRO/__init__.py:127
+#, python-format
+msgid "Pyro exception: %s\n"
+msgstr "Pyro exception: %s\n"
+
+#: ../Beremiz_service.py:433
+msgid "Pyro port :"
+msgstr "Pyro port :"
+
+#: ../py_ext/PythonEditor.py:84
+msgid "Python code"
+msgstr "Python code"
+
+#: ../features.py:23
+msgid "Python file"
+msgstr "Python file"
+
+#: ../dialogs/ActionBlockDialog.py:42
+msgid "Qualifier"
+msgstr "Qualifier"
+
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:296
+msgid "Quit"
+msgstr "Quit"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:224
+msgid "Range:"
+msgstr "Range:"
+
+#: ../ProjectController.py:1955
+msgid "Raw IEC code"
+msgstr "Raw IEC code"
+
+#: ../etherlab/ConfigEditor.py:344
+msgid "Read from (nodeid, index, subindex)"
+msgstr "Read from (nodeid, index, subindex)"
+
+#: ../BeremizIDE.py:1080
+#, python-format
+msgid "Really delete node '%s'?"
+msgstr "Really delete node '%s'?"
+
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr "Realm:"
+
+#: ../IDEFrame.py:370 ../IDEFrame.py:425
+msgid "Redo"
+msgstr "Redo"
+
+#: ../dialogs/SFCTransitionDialog.py:76
+msgid "Reference"
+msgstr "Reference"
+
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:436
+msgid "Refresh"
+msgstr "Refresh"
+
+#: ../etherlab/EtherCATManagementEditor.py:1965
+msgid "Register Modify Dialog"
+msgstr "Register Modify Dialog"
+
+#: ../dialogs/SearchInProjectDialog.py:70
+msgid "Regular expression"
+msgstr "Regular expression"
+
+#: ../dialogs/FindInPouDialog.py:99
+msgid "Regular expressions"
+msgstr "Regular expressions"
+
+#: ../editors/Viewer.py:1638
+msgid "Release value"
+msgstr "Release value"
+
+#: ../plcopen/iec_std.csv:37
+msgid "Remainder (modulo)"
+msgstr "Remainder (modulo)"
+
+#: ../BeremizIDE.py:1081
+#, python-format
+msgid "Remove %s node"
+msgstr "Remove %s node"
+
+#: ../IDEFrame.py:2463
+msgid "Remove Datatype"
+msgstr "Remove Datatype"
+
+#: ../IDEFrame.py:2468
+msgid "Remove Pou"
+msgstr "Remove Pou"
+
+#: ../dialogs/ActionBlockDialog.py:144
+msgid "Remove action"
+msgstr "Remove action"
+
+#: ../editors/DataTypeEditor.py:365
+msgid "Remove element"
+msgstr "Remove element"
+
+#: ../etherlab/ConfigEditor.py:1353
+msgid "Remove file from database"
+msgstr "Remove file from database"
+
+#: ../editors/FileManagementPanel.py:65
+msgid "Remove file from left folder"
+msgstr "Remove file from left folder"
+
+#: ../etherlab/ConfigEditor.py:1389
+msgid "Remove file from library"
+msgstr "Remove file from library"
+
+#: ../editors/ResourceEditor.py:282
+msgid "Remove instance"
+msgstr "Remove instance"
+
+#: ../etherlab/ConfigEditor.py:653
+msgid "Remove process variable"
+msgstr "Remove process variable"
+
+#: ../canfestival/NetworkEditor.py:111
+msgid "Remove slave"
+msgstr "Remove slave"
+
+#: ../etherlab/ConfigEditor.py:680
+msgid "Remove startup service variable"
+msgstr "Remove startup service variable"
+
+#: ../editors/ResourceEditor.py:251
+msgid "Remove task"
+msgstr "Remove task"
+
+#: ../bacnet/BacnetSlaveEditor.py:812 ../editors/CodeFileEditor.py:673
+#: ../controls/VariablePanel.py:484
+msgid "Remove variable"
+msgstr "Remove variable"
+
+#: ../IDEFrame.py:1996
+msgid "Rename"
+msgstr "Rename"
+
+#: ../editors/FileManagementPanel.py:186
+msgid "Replace File"
+msgstr "Replace File"
+
+#: ../editors/Viewer.py:601
+msgid "Replace Wire by connections"
+msgstr "Replace Wire by connections"
+
+#: ../plcopen/iec_std.csv:89
+msgid "Replacement (within)"
+msgstr "Replacement (within)"
+
+#: ../dialogs/LDElementDialog.py:79
+msgid "Reset"
+msgstr "Reset"
+
+#: ../editors/Viewer.py:684
+msgid "Reset Execution Order"
+msgstr "Reset Execution Order"
+
+#: ../IDEFrame.py:459
+msgid "Reset Perspective"
+msgstr "Reset Perspective"
+
+#: ../controls/SearchResultPanel.py:103
+msgid "Reset search result"
+msgstr "Reset search result"
+
+#: ../BeremizIDE.py:1012 ../plcopen/types_enums.py:77
+msgid "Resources"
+msgstr "Resources"
+
+#: ../controls/VariablePanel.py:77
+msgid "Retain"
+msgstr "Retain"
+
+#: ../controls/VariablePanel.py:457
+msgid "Return Type:"
+msgstr "Return Type:"
+
+#: ../editors/Viewer.py:585
+msgid "Right"
+msgstr "Right"
+
+#: ../dialogs/LDPowerRailDialog.py:65
+msgid "Right PowerRail"
+msgstr "Right PowerRail"
+
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:558
+msgid "Rising Edge"
+msgstr "Rising Edge"
+
+#: ../plcopen/iec_std.csv:65
+msgid "Rotate left"
+msgstr "Rotate left"
+
+#: ../plcopen/iec_std.csv:64
+msgid "Rotate right"
+msgstr "Rotate right"
+
+#: ../plcopen/iec_std.csv:17
+msgid "Rounding up/down"
+msgstr "Rounding up/down"
+
+#: ../ProjectController.py:1911
+msgid "Run"
+msgstr "Run"
+
+#: ../ProjectController.py:1175
+msgid "Runtime IO extensions C code generation failed !\n"
+msgstr "Runtime IO extensions C code generation failed !\n"
+
+#: ../ProjectController.py:1186
+msgid "Runtime library extensions C code generation failed !\n"
+msgstr "Runtime library extensions C code generation failed !\n"
+
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
+msgid "SDO Client"
+msgstr "SDO Client"
+
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
+msgid "SDO Server"
+msgstr "SDO Server"
+
+#: ../dialogs/PouDialog.py:128 ../controls/ProjectPropertiesPanel.py:161
+msgid "SFC"
+msgstr "SFC"
+
+#: ../PLCGenerator.py:1482
+#, python-brace-format
+msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+msgstr "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
+
+#: ../PLCGenerator.py:780
+#, python-format
+msgid "SFC transition in POU \"%s\" must be connected."
+msgstr "SFC transition in POU \"%s\" must be connected."
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:128
+msgid "ST"
+msgstr "ST"
+
+#: ../PLCOpenEditor.py:308
+msgid "ST files (*.st)|*.st|All files|*.*"
+msgstr "ST files (*.st)|*.st|All files|*.*"
+
+#: ../svgui/svgui.py:136
+msgid "SVG files (*.svg)|*.svg|All files|*.*"
+msgstr "SVG files (*.svg)|*.svg|All files|*.*"
+
+#: ../features.py:25
+msgid "SVGUI"
+msgstr "SVGUI"
+
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
+msgid "Save"
+msgstr "Save"
+
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
+msgid "Save As..."
+msgstr "Save As..."
+
+#: ../BeremizIDE.py:249
+msgid "Save as"
+msgstr "Save as"
+
+#: ../etherlab/EtherCATManagementEditor.py:941
+#: ../etherlab/EtherCATManagementEditor.py:1289
+msgid "Save as..."
+msgstr "Save as..."
+
+#: ../ProjectController.py:546
+msgid "Save path is the same as path of a project! \n"
+msgstr "Save path is the same as path of a project! \n"
+
+#: ../etherlab/EthercatMaster.py:455 ../etherlab/EthercatMaster.py:764
+#: ../etherlab/EthercatMaster.py:765
+msgid "Scan Network"
+msgstr "Scan Network"
+
+#: ../dialogs/SearchInProjectDialog.py:73
+msgid "Scope"
+msgstr "Scope"
+
+#: ../IDEFrame.py:650
+msgid "Search"
+msgstr "Search"
+
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:387 ../IDEFrame.py:431
+msgid "Search in Project"
+msgstr "Search in Project"
+
+#: ../dialogs/DurationEditorDialog.py:60
+msgid "Seconds:"
+msgstr "Seconds:"
+
+#: ../IDEFrame.py:393
+msgid "Select All"
+msgstr "Select All"
+
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:314
+#: ../controls/VariablePanel.py:377
+msgid "Select a variable class:"
+msgstr "Select a variable class:"
+
+#: ../ProjectController.py:1354
+msgid "Select an editor:"
+msgstr "Select an editor:"
+
+#: ../controls/PouInstanceVariablesPanel.py:292
+msgid "Select an instance"
+msgstr "Select an instance"
+
+#: ../IDEFrame.py:634
+msgid "Select an object"
+msgstr "Select an object"
+
+#: ../ProjectController.py:555
+msgid "Selected directory already contains another project. Overwrite? \n"
+msgstr "Selected directory already contains another project. Overwrite? \n"
+
+#: ../plcopen/iec_std.csv:70
+msgid "Selection"
+msgstr "Selection"
+
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr "Selection Convergence"
+
+#: ../dialogs/SFCDivergenceDialog.py:65
+msgid "Selection Divergence"
+msgstr "Selection Divergence"
+
+#: ../runtime/NevowServer.py:182
+msgid "Send"
+msgstr "Send"
+
+#: ../runtime/NevowServer.py:181
+msgid "Send a message to the log"
+msgstr "Send a message to the log"
+
+#: ../dialogs/DiscoveryDialog.py:135
+msgid "Service Discovery"
+msgstr "Service Discovery"
+
+#: ../dialogs/DiscoveryDialog.py:104
+msgid "Services available:"
+msgstr "Services available:"
+
+#: ../dialogs/LDElementDialog.py:79 ../runtime/WampClient.py:434
+msgid "Set"
+msgstr "Set"
+
+#: ../plcopen/iec_std.csv:62
+msgid "Shift left"
+msgstr "Shift left"
+
+#: ../plcopen/iec_std.csv:63
+msgid "Shift right"
+msgstr "Shift right"
+
+#: ../ProjectController.py:1946
+msgid "Show IEC code generated by PLCGenerator"
+msgstr "Show IEC code generated by PLCGenerator"
+
+#: ../canfestival/canfestival.py:407
+msgid "Show Master"
+msgstr "Show Master"
+
+#: ../canfestival/canfestival.py:408
+msgid "Show Master generated by config_utils"
+msgstr "Show Master generated by config_utils"
+
+#: ../ProjectController.py:1945
+msgid "Show code"
+msgstr "Show code"
+
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr "Simultaneous Convergence"
+
+#: ../dialogs/SFCDivergenceDialog.py:67
+msgid "Simultaneous Divergence"
+msgstr "Simultaneous Divergence"
+
+#: ../plcopen/iec_std.csv:27
+msgid "Sine"
+msgstr "Sine"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Single"
+msgstr "Single"
+
+#: ../etherlab/EtherCATManagementEditor.py:361
+msgid "Slave SDO Monitoring"
+msgstr "Slave SDO Monitoring"
+
+#: ../etherlab/ConfigEditor.py:135
+msgid "Slave entries"
+msgstr "Slave entries"
+
+#: ../targets/toolchain_makefile.py:130
+msgid "Source didn't change, no build.\n"
+msgstr "Source didn't change, no build.\n"
+
+#: ../PLCGenerator.py:404
+#, python-brace-format
+msgid "Source signal has to be defined for single task '{a1}' in resource '{a2}.{a3}'."
+msgstr "Source signal has to be defined for single task '{a1}' in resource '{a2}.{a3}'."
+
+#: ../plcopen/iec_std.csv:23
+msgid "Square root (base 2)"
+msgstr "Square root (base 2)"
+
+#: ../plcopen/definitions.py:50
+msgid "Standard function blocks"
+msgstr "Standard function blocks"
+
+#: ../etherlab/ConfigEditor.py:68
+msgid "Standardized Device Profile"
+msgstr "Standardized Device Profile"
+
+#: ../etherlab/EtherCATManagementEditor.py:37
+msgid "Start Address"
+msgstr "Start Address"
+
+#: ../ProjectController.py:1912 ../Beremiz_service.py:284
+msgid "Start PLC"
+msgstr "Start PLC"
+
+#: ../ProjectController.py:1121
+#, python-format
+msgid "Start build in %s\n"
+msgstr "Start build in %s\n"
+
+#: ../runtime/PlcStatus.py:12
+msgid "Started"
+msgstr "Started"
+
+#: ../ProjectController.py:1714
+msgid "Starting PLC\n"
+msgstr "Starting PLC\n"
+
+#: ../etherlab/ConfigEditor.py:674
+msgid "Startup service variables assignments:"
+msgstr "Startup service variables assignments:"
+
+#: ../BeremizIDE.py:389
+msgid "Status ToolBar"
+msgstr "Status ToolBar"
+
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2426
+msgid "Step"
+msgstr "Step"
+
+#: ../ProjectController.py:1918
+msgid "Stop"
+msgstr "Stop"
+
+#: ../Beremiz_service.py:285
+msgid "Stop PLC"
+msgstr "Stop PLC"
+
+#: ../ProjectController.py:1919
+msgid "Stop Running PLC"
+msgstr "Stop Running PLC"
+
+#: ../runtime/PlcStatus.py:13
+msgid "Stopped"
+msgstr "Stopped"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Structure"
+msgstr "Structure"
+
+#: ../etherlab/ConfigEditor.py:48
+msgid "SubIndex"
+msgstr "SubIndex"
+
+#: ../etherlab/ConfigEditor.py:465
+msgid "Subindex"
+msgstr "Subindex"
+
+#: ../editors/DataTypeEditor.py:60
+msgid "Subrange"
+msgstr "Subrange"
+
+#: ../plcopen/iec_std.csv:35
+msgid "Subtraction"
+msgstr "Subtraction"
+
+#: ../ProjectController.py:1160
+msgid "Successfully built.\n"
+msgstr "Successfully built.\n"
+
+#: ../IDEFrame.py:451
+msgid "Switch perspective"
+msgstr "Switch perspective"
+
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
+msgid "Syntax error in regular expression of pattern to search!"
+msgstr "Syntax error in regular expression of pattern to search!"
+
+#: ../dialogs/DiscoveryDialog.py:90
+msgid "TYPE"
+msgstr "TYPE"
+
+#: ../plcopen/iec_std.csv:29
+msgid "Tangent"
+msgstr "Tangent"
+
+#: ../editors/ResourceEditor.py:94
+msgid "Task"
+msgstr "Task"
+
+#: ../editors/ResourceEditor.py:246
+msgid "Tasks:"
+msgstr "Tasks:"
+
+#: ../controls/VariablePanel.py:88
+msgid "Temp"
+msgstr "Temp"
+
+#: ../version.py:37
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+
+#: ../etherlab/EthercatMaster.py:454
+msgid ""
+"The current network configuration will be deleted.\n"
+"Do you want to continue?"
+msgstr ""
+"The current network configuration will be deleted.\n"
+"Do you want to continue?"
+
+#: ../editors/FileManagementPanel.py:185
+#, python-format
+msgid ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+msgstr ""
+"The file '%s' already exist.\n"
+"Do you want to replace it?"
+
+#: ../etherlab/EtherCATManagementEditor.py:928
+#: ../etherlab/EtherCATManagementEditor.py:1320
+msgid "The file does not exist!"
+msgstr "The file does not exist!"
+
+#: ../editors/LDViewer.py:893
+msgid "The group of block must be coherent!"
+msgstr "The group of block must be coherent!"
+
+#: ../BeremizIDE.py:569 ../IDEFrame.py:1059
+msgid "There are changes, do you want to save?"
+msgstr "There are changes, do you want to save?"
+
+#: ../IDEFrame.py:1708 ../IDEFrame.py:1727
+#, python-format
+msgid "There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?"
+msgstr "There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?"
+
+#: ../IDEFrame.py:1146
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+
+#: ../editors/LDViewer.py:902
+msgid "This option isn't available yet!"
+msgstr "This option isn't available yet!"
+
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:546
+#, python-format
+msgid "Tick: %d"
+msgstr "Tick: %d"
+
+#: ../plcopen/iec_std.csv:40
+msgid "Time"
+msgstr "Time"
+
+#: ../plcopen/iec_std.csv:40 ../plcopen/iec_std.csv:41
+msgid "Time addition"
+msgstr "Time addition"
+
+#: ../plcopen/iec_std.csv:86
+msgid "Time concatenation"
+msgstr "Time concatenation"
+
+#: ../plcopen/iec_std.csv:60 ../plcopen/iec_std.csv:61
+msgid "Time division"
+msgstr "Time division"
+
+#: ../plcopen/iec_std.csv:46 ../plcopen/iec_std.csv:47
+msgid "Time multiplication"
+msgstr "Time multiplication"
+
+#: ../plcopen/iec_std.csv:48 ../plcopen/iec_std.csv:49
+msgid "Time subtraction"
+msgstr "Time subtraction"
+
+#: ../plcopen/iec_std.csv:42 ../plcopen/iec_std.csv:43
+msgid "Time-of-day addition"
+msgstr "Time-of-day addition"
+
+#: ../plcopen/iec_std.csv:52 ../plcopen/iec_std.csv:53
+#: ../plcopen/iec_std.csv:54 ../plcopen/iec_std.csv:55
+msgid "Time-of-day subtraction"
+msgstr "Time-of-day subtraction"
+
+#: ../IDEFrame.py:432
+msgid "Toggle fullscreen mode"
+msgstr "Toggle fullscreen mode"
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr "Toggle value"
+
+#: ../editors/Viewer.py:587
+msgid "Top"
+msgstr "Top"
+
+#: ../ProjectController.py:1931
+msgid "Transfer"
+msgstr "Transfer"
+
+#: ../ProjectController.py:1932
+msgid "Transfer PLC"
+msgstr "Transfer PLC"
+
+#: ../ProjectController.py:1884
+msgid "Transfer completed successfully.\n"
+msgstr "Transfer completed successfully.\n"
+
+#: ../ProjectController.py:1887
+msgid "Transfer failed\n"
+msgstr "Transfer failed\n"
+
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2428 ../editors/Viewer.py:2455
+msgid "Transition"
+msgstr "Transition"
+
+#: ../PLCGenerator.py:1613
+#, python-format
+msgid "Transition \"%s\" body must contain an output variable or coil referring to its name"
+msgstr "Transition \"%s\" body must contain an output variable or coil referring to its name"
+
+#: ../dialogs/PouTransitionDialog.py:90
+msgid "Transition Name"
+msgstr "Transition Name"
+
+#: ../dialogs/PouTransitionDialog.py:59
+msgid "Transition Name:"
+msgstr "Transition Name:"
+
+#: ../PLCGenerator.py:1706
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+msgstr "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
+
+#: ../PLCGenerator.py:1695
+#, python-brace-format
+msgid "Transition with content \"{a1}\" not connected to a previous step in \"{a2}\" POU"
+msgstr "Transition with content \"{a1}\" not connected to a previous step in \"{a2}\" POU"
+
+#: ../plcopen/plcopen.py:1526
+#, python-format
+msgid "Transition with name %s doesn't exist!"
+msgstr "Transition with name %s doesn't exist!"
+
+#: ../plcopen/types_enums.py:76
+msgid "Transitions"
+msgstr "Transitions"
+
+#: ../dialogs/AboutDialog.py:127
+msgid "Translated by"
+msgstr "Translated by"
+
+#: ../editors/ResourceEditor.py:76
+msgid "Triggering"
+msgstr "Triggering"
+
+#: ../Beremiz_service.py:503
+msgid "Twisted unavailable."
+msgstr "Twisted unavailable."
+
+#: ../dialogs/ActionBlockDialog.py:42 ../etherlab/ConfigEditor.py:48
+#: ../editors/ResourceEditor.py:94 ../editors/DataTypeEditor.py:55
+#: ../editors/CodeFileEditor.py:752 ../controls/VariablePanel.py:61
+msgid "Type"
+msgstr "Type"
+
+#: ../dialogs/BrowseLocationsDialog.py:51
+msgid "Type and derivated"
+msgstr "Type and derivated"
+
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
+#, python-format
+msgid "Type conflict for location \"%s\""
+msgstr "Type conflict for location \"%s\""
+
+#: ../plcopen/iec_std.csv:16
+msgid "Type conversion"
+msgstr "Type conversion"
+
+#: ../editors/DataTypeEditor.py:170
+msgid "Type infos:"
+msgstr "Type infos:"
+
+#: ../etherlab/EthercatCFileGenerator.py:76
+#, python-format
+msgid "Type of location \"%s\" not yet supported!"
+msgstr "Type of location \"%s\" not yet supported!"
+
+#: ../dialogs/BrowseLocationsDialog.py:52
+msgid "Type strict"
+msgstr "Type strict"
+
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:110
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
+msgid "Type:"
+msgstr "Type:"
+
+#: ../runtime/WampClient.py:129
+msgid "TypeError register option: {}"
+msgstr "TypeError register option: {}"
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr "URI host:"
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr "URI port:"
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr "URI type:"
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
+#, python-format
+msgid "Unable to define PDO mapping for node %02x"
+msgstr "Unable to define PDO mapping for node %02x"
+
+#: ../targets/Xenomai/__init__.py:43
+#, python-format
+msgid "Unable to get Xenomai's %s \n"
+msgstr "Unable to get Xenomai's %s \n"
+
+#: ../bacnet/bacnet.py:430
+#, python-format
+msgid "Unable to load file \"%s\"!"
+msgstr "Unable to load file \"%s\"!"
+
+#: ../bacnet/bacnet.py:420
+#, python-format
+msgid "Unable to save to file \"%s\"!"
+msgstr "Unable to save to file \"%s\"!"
+
+#: ../PLCGenerator.py:1023 ../PLCGenerator.py:1301
+#, python-brace-format
+msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
+msgstr "Undefined block type \"{a1}\" in \"{a2}\" POU"
+
+#: ../PLCGenerator.py:261
+#, python-format
+msgid "Undefined pou type \"%s\""
+msgstr "Undefined pou type \"%s\""
+
+#: ../IDEFrame.py:368 ../IDEFrame.py:424
+msgid "Undo"
+msgstr "Undo"
+
+#: ../ProjectController.py:457
+msgid "Unknown"
+msgstr "Unknown"
+
+#: ../etherlab/EthercatCFileGenerator.py:470
+#, python-brace-format
+msgid "Unknown entry index 0x{a1:.4x}, subindex 0x{a2:.2x} for device {a3}"
+msgstr "Unknown entry index 0x{a1:.4x}, subindex 0x{a2:.2x} for device {a3}"
+
+#: ../editors/Viewer.py:437
+#, python-format
+msgid "Unknown variable \"%s\" for this POU!"
+msgstr "Unknown variable \"%s\" for this POU!"
+
+#: ../ProjectController.py:454 ../ProjectController.py:455
+msgid "Unnamed"
+msgstr "Unnamed"
+
+#: ../PLCControler.py:263
+#, python-format
+msgid "Unnamed%d"
+msgstr "Unnamed%d"
+
+#: ../controls/VariablePanel.py:307
+#, python-format
+msgid "Unrecognized data size \"%s\""
+msgstr "Unrecognized data size \"%s\""
+
+#: ../etherlab/EtherCATManagementEditor.py:2080
+msgid "Update"
+msgstr "Update"
+
+#: ../runtime/WampClient.py:380
+msgid "Upload:"
+msgstr "Upload:"
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:852
+msgid "User Data Types"
+msgstr "User Data Types"
+
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
+msgid "User Type"
+msgstr "User Type"
+
+#: ../plcopen/types_enums.py:75
+msgid "User-defined POUs"
+msgstr "User-defined POUs"
+
+#: ../dialogs/ActionBlockDialog.py:42 ../etherlab/ConfigEditor.py:465
+msgid "Value"
+msgstr "Value"
+
+#: ../editors/DataTypeEditor.py:267
+msgid "Values:"
+msgstr "Values:"
+
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:625
+#: ../editors/Viewer.py:2458
+msgid "Variable"
+msgstr "Variable"
+
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:354
+msgid "Variable Drop"
+msgstr "Variable Drop"
+
+#: ../etherlab/ConfigEditor.py:70
+#, python-format
+msgid "Variable Index: #x%4.4X"
+msgstr "Variable Index: #x%4.4X"
+
+#: ../dialogs/FBDVariableDialog.py:58
+msgid "Variable Properties"
+msgstr "Variable Properties"
+
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
+msgid "Variable class"
+msgstr "Variable class"
+
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
+msgid "Variable don't belong to this POU!"
+msgstr "Variable don't belong to this POU!"
+
+#: ../etherlab/ConfigEditor.py:280
+msgid "Variable entries:"
+msgstr "Variable entries:"
+
+#: ../dialogs/LDElementDialog.py:92
+msgid "Variable:"
+msgstr "Variable:"
+
+#: ../controls/VariablePanel.py:87
+msgid "Variables"
+msgstr "Variables"
+
+#: ../controls/ProjectPropertiesPanel.py:169
+msgid "Vertical:"
+msgstr "Vertical:"
+
+#: ../runtime/WampClient.py:170
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr "WAMP Client connection failed (%s) .. retrying .."
+
+#: ../runtime/WampClient.py:179
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr "WAMP Client connection lost (%s) .. retrying .."
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr "WAMP ID:"
+
+#: ../runtime/WampClient.py:413
+msgid "WAMP Server URL"
+msgstr "WAMP Server URL"
+
+#: ../runtime/WampClient.py:276
+msgid "WAMP authentication has no secret configured"
+msgstr "WAMP authentication has no secret configured"
+
+#: ../runtime/WampClient.py:304
+msgid "WAMP client can not connect to :"
+msgstr "WAMP client can not connect to :"
+
+#: ../runtime/WampClient.py:301
+msgid "WAMP client connecting to :"
+msgstr "WAMP client connecting to :"
+
+#: ../Beremiz_service.py:628
+msgid "WAMP client startup failed. "
+msgstr "WAMP client startup failed. "
+
+#: ../runtime/WampClient.py:206
+msgid "WAMP configuration error : missing '{}' parameter."
+msgstr "WAMP configuration error : missing '{}' parameter."
+
+#: ../runtime/WampClient.py:192
+msgid "WAMP configuration error:"
+msgstr "WAMP configuration error:"
+
+#: ../connectors/WAMP/__init__.py:100
+#, python-format
+msgid "WAMP connecting to URL : %s\n"
+msgstr "WAMP connecting to URL : %s\n"
+
+#: ../connectors/WAMP/__init__.py:141
+msgid "WAMP connection timeout"
+msgstr "WAMP connection timeout"
+
+#: ../connectors/WAMP/__init__.py:159
+#, python-format
+msgid "WAMP connection to '%s' failed.\n"
+msgstr "WAMP connection to '%s' failed.\n"
+
+#: ../runtime/WampClient.py:280
+msgid "WAMP deactivated in configuration"
+msgstr "WAMP deactivated in configuration"
+
+#: ../Beremiz_service.py:605
+msgid "WAMP import failed :"
+msgstr "WAMP import failed :"
+
+#: ../runtime/WampClient.py:241
+msgid "WAMP secret empty"
+msgstr "WAMP secret empty"
+
+#: ../runtime/WampClient.py:139
+#, python-format
+msgid "WAMP session joined (%s) by:"
+msgstr "WAMP session joined (%s) by:"
+
+#: ../runtime/WampClient.py:146
+msgid "WAMP session left"
+msgstr "WAMP session left"
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
+msgid "WXGLADE GUI"
+msgstr "WXGLADE GUI"
+
+#: ../runtime/WampClient.py:432
+msgid "Wamp Settings"
+msgstr "Wamp Settings"
+
+#: ../dialogs/PouDialog.py:172 ../editors/LDViewer.py:902
+msgid "Warning"
+msgstr "Warning"
+
+#: ../etherlab/EthercatCFileGenerator.py:405
+#: ../etherlab/EthercatCFileGenerator.py:571
+msgid "Warning: "
+msgstr "Warning: "
+
+#: ../wxglade_hmi/wxglade_hmi.py:166
+msgid "Warning: WxGlade HMI has no object with name identical to extension name, and no python code is provided in start section to create object.\n"
+msgstr "Warning: WxGlade HMI has no object with name identical to extension name, and no python code is provided in start section to create object.\n"
+
+#: ../ProjectController.py:756
+msgid "Warnings in ST/IL/SFC code generator :\n"
+msgstr "Warnings in ST/IL/SFC code generator :\n"
+
+#: ../dialogs/SearchInProjectDialog.py:82
+msgid "Whole Project"
+msgstr "Whole Project"
+
+#: ../controls/ProjectPropertiesPanel.py:137
+msgid "Width:"
+msgstr "Width:"
+
+#: ../dialogs/FindInPouDialog.py:94
+msgid "Wrap search"
+msgstr "Wrap search"
+
+#: ../etherlab/ConfigEditor.py:345
+msgid "Write to (nodeid, index, subindex)"
+msgstr "Write to (nodeid, index, subindex)"
+
+#: ../dialogs/AboutDialog.py:126
+msgid "Written by"
+msgstr "Written by"
+
+#: ../etherlab/EthercatCFileGenerator.py:409
+#: ../etherlab/EthercatCFileGenerator.py:499
+#, python-format
+msgid "Wrong direction for location \"%s\"!"
+msgstr "Wrong direction for location \"%s\"!"
+
+#: ../etherlab/EthercatCFileGenerator.py:400
+#: ../etherlab/EthercatCFileGenerator.py:487
+#, python-format
+msgid "Wrong type for location \"%s\"!"
+msgstr "Wrong type for location \"%s\"!"
+
+#: ../features.py:24
+msgid "WxGlade GUI"
+msgstr "WxGlade GUI"
+
+#: ../etherlab/ConfigEditor.py:1236
+msgid "XML files (*.xml)|*.xml|All files|*.*"
+msgstr "XML files (*.xml)|*.xml|All files|*.*"
+
+#: ../etherlab/EtherCATManagementEditor.py:652
+msgid "You can input only hex, dec value"
+msgstr "You can input only hex, dec value"
+
+#: ../etherlab/EtherCATManagementEditor.py:1999
+msgid "You can't modify it. This register is read-only or it's not connected."
+msgstr "You can't modify it. This register is read-only or it's not connected."
+
+#: ../etherlab/EtherCATManagementEditor.py:648
+msgid "You cannot SDO download this state"
+msgstr "You cannot SDO download this state"
+
+#: ../svgui/svgui.py:150
+msgid ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+msgstr ""
+"You don't have write permissions.\n"
+"Open Inkscape anyway ?"
+
+#: ../wxglade_hmi/wxglade_hmi.py:175
+msgid ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+msgstr ""
+"You don't have write permissions.\n"
+"Open wxGlade anyway ?"
+
+#: ../etherlab/EtherCATManagementEditor.py:2002
+msgid "You entered wrong value. You can enter dec or hex value only."
+msgstr "You entered wrong value. You can enter dec or hex value only."
+
+#: ../ProjectController.py:403
+msgid ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+msgstr ""
+"You must have permission to work on the project\n"
+"Work on a project copy ?"
+
+#: ../editors/LDViewer.py:897
+msgid "You must select the block or group of blocks around which a branch should be added!"
+msgstr "You must select the block or group of blocks around which a branch should be added!"
+
+#: ../editors/LDViewer.py:677
+msgid "You must select the wire where a contact should be added!"
+msgstr "You must select the wire where a contact should be added!"
+
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
+msgid "You must type a name!"
+msgstr "You must type a name!"
+
+#: ../dialogs/ForceVariableDialog.py:209
+msgid "You must type a value!"
+msgstr "You must type a value!"
+
+#: ../IDEFrame.py:442
+msgid "Zoom"
+msgstr "Zoom"
+
+#: ../etherlab/EtherCATManagementEditor.py:911
+#: ../etherlab/EtherCATManagementEditor.py:1307
+msgid "bin files (*.bin)|*.bin"
+msgstr "bin files (*.bin)|*.bin"
+
+#: ../etherlab/EtherCATManagementEditor.py:942
+#: ../etherlab/EtherCATManagementEditor.py:1290
+msgid "bin files (*.bin)|*.bin|All files|*.*"
+msgstr "bin files (*.bin)|*.bin|All files|*.*"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "days"
+msgstr "days"
+
+#: ../PLCOpenEditor.py:317
+#, python-format
+msgid "error: %s\n"
+msgstr "error: %s\n"
+
+#: ../util/ProcessLogger.py:178
+#, python-brace-format
+msgid "exited with status {a1} (pid {a2})\n"
+msgstr "exited with status {a1} (pid {a2})\n"
+
+#: ../dialogs/PouDialog.py:110
+msgid "function"
+msgstr "function"
+
+#: ../dialogs/PouDialog.py:110
+msgid "functionBlock"
+msgstr "functionBlock"
+
+#: ../dialogs/DurationEditorDialog.py:159
+msgid "hours"
+msgstr "hours"
+
+#: ../ProjectController.py:784
+msgid "matiec installation is not found\n"
+msgstr "matiec installation is not found\n"
+
+#: ../dialogs/DurationEditorDialog.py:162
+msgid "microseconds"
+msgstr "microseconds"
+
+#: ../dialogs/DurationEditorDialog.py:161
+msgid "milliseconds"
+msgstr "milliseconds"
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "minutes"
+msgstr "minutes"
+
+#: ../dialogs/PouDialog.py:110
+msgid "program"
+msgstr "program"
+
+#: ../dialogs/DurationEditorDialog.py:160
+msgid "seconds"
+msgstr "seconds"
+
+#: ../plcopen/iec_std.csv:84
+msgid "string from the middle"
+msgstr "string from the middle"
+
+#: ../plcopen/iec_std.csv:82
+msgid "string left of"
+msgstr "string left of"
+
+#: ../plcopen/iec_std.csv:83
+msgid "string right of"
+msgstr "string right of"
+
+#: ../etherlab/EtherCATManagementEditor.py:323
+msgid "update"
+msgstr "update"
+
+#: ../Beremiz.py:167
+msgid "update info unavailable."
+msgstr "update info unavailable."
+
+#: ../PLCOpenEditor.py:315
+#, python-format
+msgid "warning: %s\n"
+msgstr "warning: %s\n"
+
+#: ../PLCControler.py:576
+#, python-brace-format
+msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
+msgstr "{a1} \"{a2}\" can't be pasted as a {a3}."
+
+#: ../ConfigTreeNode.py:58
+#, python-brace-format
+msgid ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+msgstr ""
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
+"{a3}"
+
+#: Extra XSD strings
+msgid "CanFestivalSlaveNode"
+msgstr "CanFestivalSlaveNode"
+
+msgid "CAN_Device"
+msgstr "CAN_Device"
+
+msgid "CAN_Baudrate"
+msgstr "CAN_Baudrate"
+
+msgid "NodeId"
+msgstr "NodeId"
+
+msgid "Sync_Align"
+msgstr "Sync_Align"
+
+msgid "Sync_Align_Ratio"
+msgstr "Sync_Align_Ratio"
+
+msgid "CanFestivalNode"
+msgstr "CanFestivalNode"
+
+msgid "Sync_TPDOs"
+msgstr "Sync_TPDOs"
+
+msgid "CanFestivalInstance"
+msgstr "CanFestivalInstance"
+
+msgid "CAN_Driver"
+msgstr "CAN_Driver"
+
+msgid "BACnetServerNode"
+msgstr "BACnetServerNode"
+
+msgid "Network_Interface"
+msgstr "Network_Interface"
+
+msgid "UDP_Port_Number"
+msgstr "UDP_Port_Number"
+
+msgid "BACnet_Communication_Control_Password"
+msgstr "BACnet_Communication_Control_Password"
+
+msgid "BACnet_Device_ID"
+msgstr "BACnet_Device_ID"
+
+msgid "BACnet_Device_Name"
+msgstr "BACnet_Device_Name"
+
+msgid "BACnet_Device_Location"
+msgstr "BACnet_Device_Location"
+
+msgid "BACnet_Device_Description"
+msgstr "BACnet_Device_Description"
+
+msgid "BACnet_Device_Application_Software_Version"
+msgstr "BACnet_Device_Application_Software_Version"
+
+msgid "Generic"
+msgstr "Generic"
+
+msgid "Command"
+msgstr "Command"
+
+msgid "Xenomai"
+msgstr "Xenomai"
+
+msgid "XenoConfig"
+msgstr "XenoConfig"
+
+msgid "Compiler"
+msgstr "Compiler"
+
+msgid "CFLAGS"
+msgstr "CFLAGS"
+
+msgid "Linker"
+msgstr "Linker"
+
+msgid "LDFLAGS"
+msgstr "LDFLAGS"
+
+msgid "Linux"
+msgstr "Linux"
+
+msgid "Win32"
+msgstr "Win32"
+
+msgid "ModbusRequest"
+msgstr "ModbusRequest"
+
+msgid "SlaveID"
+msgstr "SlaveID"
+
+msgid "Nr_of_Channels"
+msgstr "Nr_of_Channels"
+
+msgid "Start_Address"
+msgstr "Start_Address"
+
+msgid "Timeout_in_ms"
+msgstr "Timeout_in_ms"
+
+msgid "MemoryArea"
+msgstr "MemoryArea"
+
+msgid "MemoryAreaType"
+msgstr "MemoryAreaType"
+
+msgid "ModbusTCPclient"
+msgstr "ModbusTCPclient"
+
+msgid "Remote_IP_Address"
+msgstr "Remote_IP_Address"
+
+msgid "Remote_Port_Number"
+msgstr "Remote_Port_Number"
+
+msgid "Invocation_Rate_in_ms"
+msgstr "Invocation_Rate_in_ms"
+
+msgid "ModbusServerNode"
+msgstr "ModbusServerNode"
+
+msgid "Local_IP_Address"
+msgstr "Local_IP_Address"
+
+msgid "Local_Port_Number"
+msgstr "Local_Port_Number"
+
+msgid "ModbusRTUclient"
+msgstr "ModbusRTUclient"
+
+msgid "Serial_Port"
+msgstr "Serial_Port"
+
+msgid "Baud_Rate"
+msgstr "Baud_Rate"
+
+msgid "Parity"
+msgstr "Parity"
+
+msgid "Stop_Bits"
+msgstr "Stop_Bits"
+
+msgid "ModbusRTUslave"
+msgstr "ModbusRTUslave"
+
+msgid "ModbusRoot"
+msgstr "ModbusRoot"
+
+msgid "MaxRemoteTCPclients"
+msgstr "MaxRemoteTCPclients"
+
+msgid "CIA402SlaveParams"
+msgstr "CIA402SlaveParams"
+
+msgid "Enable%s"
+msgstr "Enable%s"
+
+msgid "ProcessVariables"
+msgstr "ProcessVariables"
+
+msgid "variable"
+msgstr "variable"
+
+msgid "ReadFrom"
+msgstr "ReadFrom"
+
+msgid "WriteTo"
+msgstr "WriteTo"
+
+msgid "BaseParams"
+msgstr "BaseParams"
+
+msgid "IEC_Channel"
+msgstr "IEC_Channel"
+
+msgid "Enabled"
+msgstr "Enabled"
+
+msgid "BeremizRoot"
+msgstr "BeremizRoot"
+
+msgid "TargetType"
+msgstr "TargetType"
+
+msgid "Libraries"
+msgstr "Libraries"
+
+msgid "URI_location"
+msgstr "URI_location"
+
+msgid "Disable_Extensions"
+msgstr "Disable_Extensions"
+
+msgid "%(codefile_name)s"
+msgstr "%(codefile_name)s"
+
+msgid "variables"
+msgstr "variables"
+
+msgid "name"
+msgstr "name"
+
+msgid "type"
+msgstr "type"
+
+msgid "class"
+msgstr "class"
+
+msgid "initial"
+msgstr "initial"
+
+msgid "desc"
+msgstr "desc"
+
+msgid "onchange"
+msgstr "onchange"
+
+msgid "opts"
+msgstr "opts"
+
+#: Extra TC6 documentation strings
+msgid "0 - current time, 1 - load time from PDT"
+msgstr "0 - current time, 1 - load time from PDT"
+
+msgid "Preset datetime"
+msgstr "Preset datetime"
+
+msgid "Copy of IN"
+msgstr "Copy of IN"
+
+msgid "Datetime, current or relative to PDT"
+msgstr "Datetime, current or relative to PDT"
+
+msgid "The real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on."
+msgstr "The real time clock has many uses including time stamping, setting dates and times of day in batch reports, in alarm messages and so on."
+
+msgid "1 = integrate, 0 = hold"
+msgstr "1 = integrate, 0 = hold"
+
+msgid "Overriding reset"
+msgstr "Overriding reset"
+
+msgid "Input variable"
+msgstr "Input variable"
+
+msgid "Initial value"
+msgstr "Initial value"
+
+msgid "Sampling period"
+msgstr "Sampling period"
+
+msgid "NOT R1"
+msgstr "NOT R1"
+
+msgid "Integrated output"
+msgstr "Integrated output"
+
+msgid "The integral function block integrates the value of input XIN over time."
+msgstr "The integral function block integrates the value of input XIN over time."
+
+msgid "0 = reset"
+msgstr "0 = reset"
+
+msgid "Input to be differentiated"
+msgstr "Input to be differentiated"
+
+msgid "Differentiated output"
+msgstr "Differentiated output"
+
+msgid "The derivative function block produces an output XOUT proportional to the rate of change of the input XIN."
+msgstr "The derivative function block produces an output XOUT proportional to the rate of change of the input XIN."
+
+msgid "0 - manual , 1 - automatic"
+msgstr "0 - manual , 1 - automatic"
+
+msgid "Process variable"
+msgstr "Process variable"
+
+msgid "Set point"
+msgstr "Set point"
+
+msgid "Manual output adjustment - Typically from transfer station"
+msgstr "Manual output adjustment - Typically from transfer station"
+
+msgid "Proportionality constant"
+msgstr "Proportionality constant"
+
+msgid "Reset time"
+msgstr "Reset time"
+
+msgid "Derivative time constant"
+msgstr "Derivative time constant"
+
+msgid "PV - SP"
+msgstr "PV - SP"
+
+msgid "FB for integral term"
+msgstr "FB for integral term"
+
+msgid "FB for derivative term"
+msgstr "FB for derivative term"
+
+msgid "The PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control."
+msgstr "The PID (proportional, Integral, Derivative) function block provides the classical three term controller for closed loop control."
+
+msgid "0 - track X0, 1 - ramp to/track X1"
+msgstr "0 - track X0, 1 - ramp to/track X1"
+
+msgid "Ramp duration"
+msgstr "Ramp duration"
+
+msgid "BUSY = 1 during ramping period"
+msgstr "BUSY = 1 during ramping period"
+
+msgid "Elapsed time of ramp"
+msgstr "Elapsed time of ramp"
+
+msgid "The RAMP function block is modelled on example given in the standard."
+msgstr "The RAMP function block is modelled on example given in the standard."
+
+msgid "The hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2."
+msgstr "The hysteresis function block provides a hysteresis boolean output driven by the difference of two floating point (REAL) inputs XIN1 and XIN2."
+
+msgid "The SR bistable is a latch where the Set dominates."
+msgstr "The SR bistable is a latch where the Set dominates."
+
+msgid "The RS bistable is a latch where the Reset dominates."
+msgstr "The RS bistable is a latch where the Reset dominates."
+
+msgid "The semaphore provides a mechanism to allow software elements mutually exclusive access to certain resources."
+msgstr "The semaphore provides a mechanism to allow software elements mutually exclusive access to certain resources."
+
+msgid "The output produces a single pulse when a rising edge is detected."
+msgstr "The output produces a single pulse when a rising edge is detected."
+
+msgid "The output produces a single pulse when a falling edge is detected."
+msgstr "The output produces a single pulse when a falling edge is detected."
+
+msgid "The up-counter can be used to signal when a count has reached a maximum value."
+msgstr "The up-counter can be used to signal when a count has reached a maximum value."
+
+msgid "The down-counter can be used to signal when a count has reached zero, on counting down from a preset value."
+msgstr "The down-counter can be used to signal when a count has reached zero, on counting down from a preset value."
+
+msgid "The up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other."
+msgstr "The up-down counter has two inputs CU and CD. It can be used to both count up on one input and down on the other."
+
+msgid "first input parameter"
+msgstr "first input parameter"
+
+msgid "second input parameter"
+msgstr "second input parameter"
+
+msgid "first output parameter"
+msgstr "first output parameter"
+
+msgid "second output parameter"
+msgstr "second output parameter"
+
+msgid "internal state: 0-reset, 1-counting, 2-set"
+msgstr "internal state: 0-reset, 1-counting, 2-set"
+
+msgid "The pulse timer can be used to generate output pulses of a given time duration."
+msgstr "The pulse timer can be used to generate output pulses of a given time duration."
+
+msgid "The on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true."
+msgstr "The on-delay timer can be used to delay setting an output true, for fixed period after an input becomes true."
+
+msgid "The off-delay timer can be used to delay setting an output false, for fixed period after input goes false."
+msgstr "The off-delay timer can be used to delay setting an output false, for fixed period after input goes false."
--- a/i18n/messages.pot	Sat Jun 02 11:56:01 2018 +0100
+++ b/i18n/messages.pot	Mon Jan 07 13:50:39 2019 +0100
@@ -1,14 +1,14 @@
 # SOME DESCRIPTIVE TITLE.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
+# This file is distributed under the same license as the Beremiz package.
 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+"Project-Id-Version: Beremiz\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-01-12 14:39+0300\n"
+"POT-Creation-Date: 2018-10-03 14:20+0300\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,7 +17,7 @@
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../PLCOpenEditor.py:408 ../Beremiz.py:1191
+#: ../util/ExceptionHandler.py:58
 #, python-format
 msgid ""
 "\n"
@@ -32,356 +32,378 @@
 "Traceback:\n"
 msgstr ""
 
-#: ../controls/VariablePanel.py:72
+#: ../controls/VariablePanel.py:87
 msgid "   External"
 msgstr ""
 
-#: ../controls/VariablePanel.py:71
+#: ../controls/VariablePanel.py:86
 msgid "   InOut"
 msgstr ""
 
-#: ../controls/VariablePanel.py:71
+#: ../controls/VariablePanel.py:86
 msgid "   Input"
 msgstr ""
 
-#: ../controls/VariablePanel.py:72
+#: ../controls/VariablePanel.py:87
 msgid "   Local"
 msgstr ""
 
-#: ../controls/VariablePanel.py:71
+#: ../controls/VariablePanel.py:86
 msgid "   Output"
 msgstr ""
 
-#: ../controls/VariablePanel.py:73
+#: ../controls/VariablePanel.py:88
 msgid "   Temp"
 msgstr ""
 
-#: ../dialogs/PouTransitionDialog.py:99 ../dialogs/ProjectDialog.py:66
-#: ../dialogs/PouActionDialog.py:91 ../dialogs/PouDialog.py:113
+#: ../etherlab/etherlab.py:301
+#, python-format
+msgid " (rev. %s)"
+msgstr ""
+
+#: ../etherlab/CommonEtherCATFunction.py:1599
+msgid " Warning..."
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:100 ../dialogs/ProjectDialog.py:72
+#: ../dialogs/PouActionDialog.py:99 ../dialogs/PouDialog.py:157
 #, python-format
 msgid " and %s"
 msgstr ""
 
-#: ../ProjectController.py:1089
+#: ../ProjectController.py:1236
 msgid " generation failed !\n"
 msgstr ""
 
-#: ../plcopen/plcopen.py:881
+#: ../plcopen/plcopen.py:1029
 #, python-format
 msgid "\"%s\" Data Type doesn't exist !!!"
 msgstr ""
 
-#: ../plcopen/plcopen.py:899
+#: ../plcopen/plcopen.py:1047
 #, python-format
 msgid "\"%s\" POU already exists !!!"
 msgstr ""
 
-#: ../plcopen/plcopen.py:920
+#: ../plcopen/plcopen.py:1068
 #, python-format
 msgid "\"%s\" POU doesn't exist !!!"
 msgstr ""
 
-#: ../editors/Viewer.py:246
+#: ../editors/Viewer.py:288
 #, python-format
 msgid "\"%s\" can't use itself!"
 msgstr ""
 
-#: ../IDEFrame.py:1652 ../IDEFrame.py:1671
+#: ../IDEFrame.py:1705 ../IDEFrame.py:1724
 #, python-format
 msgid "\"%s\" config already exists!"
 msgstr ""
 
-#: ../plcopen/plcopen.py:467
+#: ../plcopen/plcopen.py:531
 #, python-format
 msgid "\"%s\" configuration already exists !!!"
 msgstr ""
 
-#: ../IDEFrame.py:1602
+#: ../plcopen/plcopen.py:540
+#, python-format
+msgid "\"%s\" configuration doesn't exist !!!"
+msgstr ""
+
+#: ../IDEFrame.py:1655
 #, python-format
 msgid "\"%s\" data type already exists!"
 msgstr ""
 
-#: ../dialogs/PouTransitionDialog.py:110 ../dialogs/BlockPreviewDialog.py:219
-#: ../dialogs/PouActionDialog.py:102 ../editors/Viewer.py:262
-#: ../editors/Viewer.py:330 ../editors/Viewer.py:354 ../editors/Viewer.py:374
-#: ../editors/TextViewer.py:272 ../editors/TextViewer.py:301
-#: ../controls/VariablePanel.py:396
+#: ../dialogs/PouTransitionDialog.py:111 ../dialogs/BlockPreviewDialog.py:220
+#: ../dialogs/PouActionDialog.py:110 ../editors/Viewer.py:304
+#: ../editors/Viewer.py:374 ../editors/Viewer.py:398 ../editors/Viewer.py:418
+#: ../editors/TextViewer.py:270 ../editors/TextViewer.py:299
+#: ../controls/VariablePanel.py:424
 #, python-format
 msgid "\"%s\" element for this pou already exists!"
 msgstr ""
 
-#: ../Beremiz.py:994
+#: ../BeremizIDE.py:925
 #, python-format
 msgid "\"%s\" folder is not a valid Beremiz project\n"
 msgstr ""
 
-#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouTransitionDialog.py:106
-#: ../dialogs/BlockPreviewDialog.py:207 ../dialogs/PouNameDialog.py:50
-#: ../dialogs/PouActionDialog.py:98 ../dialogs/PouDialog.py:120
-#: ../editors/DataTypeEditor.py:555 ../editors/DataTypeEditor.py:584
-#: ../editors/CodeFileEditor.py:770 ../controls/VariablePanel.py:751
-#: ../IDEFrame.py:1593
+#: ../dialogs/SFCStepNameDialog.py:56 ../dialogs/PouTransitionDialog.py:107
+#: ../dialogs/BlockPreviewDialog.py:209 ../dialogs/PouNameDialog.py:54
+#: ../dialogs/PouActionDialog.py:106 ../dialogs/PouDialog.py:164
+#: ../etherlab/ConfigEditor.py:973 ../editors/ResourceEditor.py:481
+#: ../editors/ResourceEditor.py:518 ../editors/DataTypeEditor.py:571
+#: ../editors/DataTypeEditor.py:603 ../editors/CodeFileEditor.py:793
+#: ../controls/VariablePanel.py:798 ../IDEFrame.py:1646
 #, python-format
 msgid "\"%s\" is a keyword. It can't be used!"
 msgstr ""
 
-#: ../plcopen/plcopen.py:2412
+#: ../plcopen/plcopen.py:2836
 #, python-format
 msgid "\"%s\" is an invalid value!"
 msgstr ""
 
-#: ../PLCOpenEditor.py:339 ../PLCOpenEditor.py:381
+#: ../PLCOpenEditor.py:323 ../PLCOpenEditor.py:365
 #, python-format
 msgid "\"%s\" is not a valid folder!"
 msgstr ""
 
-#: ../dialogs/SFCStepNameDialog.py:50 ../dialogs/PouTransitionDialog.py:104
-#: ../dialogs/BlockPreviewDialog.py:203 ../dialogs/PouNameDialog.py:48
-#: ../dialogs/PouActionDialog.py:96 ../dialogs/PouDialog.py:118
-#: ../editors/DataTypeEditor.py:579 ../editors/CodeFileEditor.py:768
-#: ../controls/VariablePanel.py:749 ../IDEFrame.py:1591
+#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:105
+#: ../dialogs/BlockPreviewDialog.py:205 ../dialogs/PouNameDialog.py:52
+#: ../dialogs/PouActionDialog.py:104 ../dialogs/PouDialog.py:162
+#: ../etherlab/ConfigEditor.py:971 ../editors/ResourceEditor.py:479
+#: ../editors/ResourceEditor.py:516 ../editors/DataTypeEditor.py:601
+#: ../editors/CodeFileEditor.py:791 ../controls/VariablePanel.py:796
+#: ../IDEFrame.py:1644
 #, python-format
 msgid "\"%s\" is not a valid identifier!"
 msgstr ""
 
-#: ../IDEFrame.py:2396
+#: ../IDEFrame.py:2454
 #, python-format
 msgid "\"%s\" is used by one or more POUs. Do you wish to continue?"
 msgstr ""
 
-#: ../dialogs/BlockPreviewDialog.py:211 ../dialogs/PouDialog.py:122
-#: ../editors/Viewer.py:260 ../editors/Viewer.py:315 ../editors/Viewer.py:345
-#: ../editors/Viewer.py:367 ../editors/TextViewer.py:270
-#: ../editors/TextViewer.py:299 ../editors/TextViewer.py:350
-#: ../editors/TextViewer.py:373 ../controls/VariablePanel.py:338
-#: ../IDEFrame.py:1611
+#: ../dialogs/BlockPreviewDialog.py:213 ../dialogs/PouDialog.py:166
+#: ../editors/Viewer.py:302 ../editors/Viewer.py:359 ../editors/Viewer.py:389
+#: ../editors/Viewer.py:411 ../editors/TextViewer.py:268
+#: ../editors/TextViewer.py:297 ../editors/TextViewer.py:351
+#: ../editors/TextViewer.py:374 ../controls/VariablePanel.py:363
+#: ../IDEFrame.py:1664
 #, python-format
 msgid "\"%s\" pou already exists!"
 msgstr ""
 
-#: ../dialogs/SFCStepNameDialog.py:58
+#: ../dialogs/SFCStepNameDialog.py:62
 #, python-format
 msgid "\"%s\" step already exists!"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:550
+#: ../editors/DataTypeEditor.py:566
 #, python-format
 msgid "\"%s\" value already defined!"
 msgstr ""
 
-#: ../dialogs/ArrayTypeDialog.py:97 ../editors/DataTypeEditor.py:745
+#: ../dialogs/ArrayTypeDialog.py:105 ../editors/DataTypeEditor.py:759
 #, python-format
 msgid "\"%s\" value isn't a valid array dimension!"
 msgstr ""
 
-#: ../dialogs/ArrayTypeDialog.py:103 ../editors/DataTypeEditor.py:752
+#: ../dialogs/ArrayTypeDialog.py:109 ../editors/DataTypeEditor.py:766
 #, python-format
 msgid ""
 "\"%s\" value isn't a valid array dimension!\n"
 "Right value must be greater than left value."
 msgstr ""
 
-#: ../PLCGenerator.py:1101
+#: ../PLCGenerator.py:1182
 #, python-brace-format
 msgid "\"{a1}\" function cancelled in \"{a2}\" POU: No input connected"
 msgstr ""
 
-#: ../editors/Viewer.py:250
+#: ../editors/Viewer.py:292
 #, python-brace-format
 msgid "\"{a1}\" is already used by \"{a2}\"!"
 msgstr ""
 
-#: ../plcopen/plcopen.py:491
+#: ../plcopen/plcopen.py:557
 #, python-brace-format
 msgid "\"{a1}\" resource already exists in \"{a2}\" configuration !!!"
 msgstr ""
 
-#: ../plcopen/plcopen.py:509
+#: ../plcopen/plcopen.py:577
 #, python-brace-format
 msgid "\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!"
 msgstr ""
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:578
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:559
 #, python-format
 msgid "%03gms"
 msgstr ""
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:569
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:550
 #, python-format
 msgid "%dd"
 msgstr ""
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:56
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:570
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:189
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:551
 #, python-format
 msgid "%dh"
 msgstr ""
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:55
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:571
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:188
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:552
 #, python-format
 msgid "%dm"
 msgstr ""
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:53
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:186
 #, python-format
 msgid "%dms"
 msgstr ""
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:54
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:572
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:187
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:553
 #, python-format
 msgid "%ds"
 msgstr ""
 
-#: ../PLCControler.py:1531
+#: ../PLCControler.py:1114
 #, python-format
 msgid "%s Data Types"
 msgstr ""
 
-#: ../PLCControler.py:1514
+#: ../PLCControler.py:1097
 #, python-format
 msgid "%s POUs"
 msgstr ""
 
-#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:90
+#: ../canfestival/SlaveEditor.py:73 ../canfestival/NetworkEditor.py:97
 #, python-format
 msgid "%s Profile"
 msgstr ""
 
-#: ../plcopen/plcopen.py:1645 ../plcopen/plcopen.py:1652
-#: ../plcopen/plcopen.py:1664 ../plcopen/plcopen.py:1672
-#: ../plcopen/plcopen.py:1682
+#: ../plcopen/plcopen.py:1901 ../plcopen/plcopen.py:1908
+#: ../plcopen/plcopen.py:1921 ../plcopen/plcopen.py:1929
+#: ../plcopen/plcopen.py:1939 ../plcopen/plcopen.py:1950
 #, python-format
 msgid "%s body don't have instances!"
 msgstr ""
 
-#: ../plcopen/plcopen.py:1700 ../plcopen/plcopen.py:1707
-#: ../plcopen/plcopen.py:1714
+#: ../plcopen/plcopen.py:1957 ../plcopen/plcopen.py:1964
+#: ../plcopen/plcopen.py:1971
 #, python-format
 msgid "%s body don't have text!"
 msgstr ""
 
-#: ../IDEFrame.py:386
+#: ../etherlab/ConfigEditor.py:856
+#, python-format
+msgid "%s's nodes"
+msgstr ""
+
+#: ../IDEFrame.py:391
 msgid "&Add Element"
 msgstr ""
 
-#: ../dialogs/AboutDialog.py:65 ../dialogs/AboutDialog.py:113
-#: ../dialogs/AboutDialog.py:150
+#: ../dialogs/AboutDialog.py:71 ../dialogs/AboutDialog.py:117
+#: ../dialogs/AboutDialog.py:152
 msgid "&Close"
 msgstr ""
 
-#: ../IDEFrame.py:356
+#: ../IDEFrame.py:364
 msgid "&Configuration"
 msgstr ""
 
+#: ../IDEFrame.py:353
+msgid "&Data Type"
+msgstr ""
+
+#: ../IDEFrame.py:395
+msgid "&Delete"
+msgstr ""
+
 #: ../IDEFrame.py:345
-msgid "&Data Type"
-msgstr ""
-
-#: ../IDEFrame.py:390
-msgid "&Delete"
-msgstr ""
-
-#: ../IDEFrame.py:337
 msgid "&Display"
 msgstr ""
 
-#: ../IDEFrame.py:336
+#: ../IDEFrame.py:344
 msgid "&Edit"
 msgstr ""
 
-#: ../IDEFrame.py:335
+#: ../IDEFrame.py:343
 msgid "&File"
 msgstr ""
 
-#: ../IDEFrame.py:347
+#: ../IDEFrame.py:355
 msgid "&Function"
 msgstr ""
 
-#: ../IDEFrame.py:338
+#: ../IDEFrame.py:346
 msgid "&Help"
 msgstr ""
 
-#: ../dialogs/AboutDialog.py:64
+#: ../dialogs/AboutDialog.py:70
 msgid "&License"
 msgstr ""
 
-#: ../IDEFrame.py:351
+#: ../IDEFrame.py:359
 msgid "&Program"
 msgstr ""
 
-#: ../PLCOpenEditor.py:125
+#: ../PLCOpenEditor.py:98
 msgid "&Properties"
 msgstr ""
 
-#: ../Beremiz.py:324
+#: ../BeremizIDE.py:244
 msgid "&Recent Projects"
 msgstr ""
 
-#: ../IDEFrame.py:353
+#: ../IDEFrame.py:361
 msgid "&Resource"
 msgstr ""
 
-#: ../controls/SearchResultPanel.py:239
+#: ../etherlab/ConfigEditor.py:450
+msgid "'Read from' and 'Write to' variables types are not compatible"
+msgstr ""
+
+#: ../controls/SearchResultPanel.py:247
 #, python-brace-format
 msgid "'{a1}' - {a2} match in project"
 msgstr ""
 
-#: ../controls/SearchResultPanel.py:241
+#: ../controls/SearchResultPanel.py:249
 #, python-brace-format
 msgid "'{a1}' - {a2} matches in project"
 msgstr ""
 
-#: ../connectors/PYRO/__init__.py:90
+#: ../connectors/PYRO/__init__.py:99
 #, python-brace-format
 msgid "'{a1}' is located at {a2}\n"
 msgstr ""
 
-#: ../controls/SearchResultPanel.py:291
+#: ../controls/SearchResultPanel.py:298
 #, python-format
 msgid "(%d matches)"
 msgstr ""
 
-#: ../PLCOpenEditor.py:396 ../PLCOpenEditor.py:398 ../PLCOpenEditor.py:399
-msgid ",   "
-msgstr ""
-
-#: ../dialogs/PouTransitionDialog.py:101 ../dialogs/PouActionDialog.py:93
-#: ../dialogs/PouDialog.py:115
+#: ../dialogs/PouTransitionDialog.py:102 ../dialogs/PouActionDialog.py:101
+#: ../dialogs/PouDialog.py:159
 #, python-format
 msgid ", %s"
 msgstr ""
 
-#: ../PLCOpenEditor.py:394
-msgid ". "
-msgstr ""
-
-#: ../controls/LogViewer.py:279
+#: ../controls/UriLocationEditor.py:49
+msgid "- Select URI type -"
+msgstr ""
+
+#: ../controls/LogViewer.py:287
 msgid "1d"
 msgstr ""
 
-#: ../controls/LogViewer.py:280
+#: ../controls/LogViewer.py:288
 msgid "1h"
 msgstr ""
 
-#: ../controls/LogViewer.py:281
+#: ../controls/LogViewer.py:289
 msgid "1m"
 msgstr ""
 
-#: ../controls/LogViewer.py:282
+#: ../controls/LogViewer.py:290
 msgid "1s"
 msgstr ""
 
-#: ../dialogs/PouDialog.py:124 ../IDEFrame.py:1614 ../IDEFrame.py:1660
-#: ../IDEFrame.py:1679
+#: ../dialogs/PouDialog.py:168 ../IDEFrame.py:1667 ../IDEFrame.py:1713
+#: ../IDEFrame.py:1732
 #, python-format
 msgid "A POU has an element named \"%s\". This could cause a conflict. Do you wish to continue?"
 msgstr ""
 
-#: ../dialogs/SFCStepNameDialog.py:54 ../dialogs/PouTransitionDialog.py:108
-#: ../dialogs/PouNameDialog.py:52 ../dialogs/PouActionDialog.py:100
-#: ../controls/VariablePanel.py:753 ../IDEFrame.py:1628 ../IDEFrame.py:1641
+#: ../dialogs/SFCStepNameDialog.py:58 ../dialogs/PouTransitionDialog.py:109
+#: ../dialogs/PouNameDialog.py:56 ../dialogs/PouActionDialog.py:108
+#: ../controls/VariablePanel.py:800 ../IDEFrame.py:1681 ../IDEFrame.py:1694
 #, python-format
 msgid "A POU named \"%s\" already exists!"
 msgstr ""
@@ -391,22 +413,26 @@
 msgid "A child named \"{a1}\" already exists -> \"{a2}\"\n"
 msgstr ""
 
-#: ../dialogs/BrowseLocationsDialog.py:216
+#: ../dialogs/BrowseLocationsDialog.py:228
 msgid "A location must be selected!"
 msgstr ""
 
-#: ../dialogs/SFCStepNameDialog.py:56 ../controls/VariablePanel.py:755
-#: ../IDEFrame.py:1630 ../IDEFrame.py:1643
+#: ../editors/ResourceEditor.py:483
+msgid "A task with the same name already exists!"
+msgstr ""
+
+#: ../dialogs/SFCStepNameDialog.py:60 ../controls/VariablePanel.py:802
+#: ../IDEFrame.py:1683 ../IDEFrame.py:1696
 #, python-format
 msgid "A variable with \"%s\" as name already exists in this pou!"
 msgstr ""
 
-#: ../editors/CodeFileEditor.py:774
+#: ../editors/CodeFileEditor.py:797
 #, python-format
 msgid "A variable with \"%s\" as name already exists!"
 msgstr ""
 
-#: ../dialogs/AboutDialog.py:40 ../PLCOpenEditor.py:158 ../Beremiz.py:381
+#: ../BeremizIDE.py:311 ../dialogs/AboutDialog.py:46 ../PLCOpenEditor.py:142
 msgid "About"
 msgstr ""
 
@@ -414,166 +440,224 @@
 msgid "Absolute number"
 msgstr ""
 
-#: ../dialogs/SFCStepDialog.py:72 ../dialogs/ActionBlockDialog.py:42
+#: ../etherlab/ConfigEditor.py:48
+msgid "Access"
+msgstr ""
+
+#: ../dialogs/SFCStepDialog.py:75 ../dialogs/ActionBlockDialog.py:47
 msgid "Action"
 msgstr ""
 
-#: ../editors/Viewer.py:555 ../editors/Viewer.py:2345
+#: ../editors/Viewer.py:656 ../editors/Viewer.py:2429
 msgid "Action Block"
 msgstr ""
 
-#: ../dialogs/PouActionDialog.py:81
+#: ../dialogs/PouActionDialog.py:89
 msgid "Action Name"
 msgstr ""
 
-#: ../dialogs/PouActionDialog.py:49
+#: ../dialogs/PouActionDialog.py:56
 msgid "Action Name:"
 msgstr ""
 
-#: ../plcopen/plcopen.py:1359
+#: ../plcopen/plcopen.py:1567
 #, python-format
 msgid "Action with name %s doesn't exist!"
 msgstr ""
 
-#: ../PLCControler.py:96
+#: ../plcopen/types_enums.py:76
 msgid "Actions"
 msgstr ""
 
-#: ../dialogs/ActionBlockDialog.py:133
+#: ../dialogs/ActionBlockDialog.py:139
 msgid "Actions:"
 msgstr ""
 
-#: ../editors/Viewer.py:1100
+#: ../editors/Viewer.py:484
 msgid "Active"
 msgstr ""
 
-#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:101
-#: ../editors/Viewer.py:588 ../Beremiz.py:1060
+#: ../canfestival/SlaveEditor.py:84 ../canfestival/NetworkEditor.py:108
+#: ../BeremizIDE.py:998 ../editors/Viewer.py:689
 msgid "Add"
 msgstr ""
 
-#: ../IDEFrame.py:1890 ../IDEFrame.py:1925
+#: ../IDEFrame.py:1941 ../IDEFrame.py:1976
 msgid "Add Action"
 msgstr ""
 
-#: ../features.py:32
+#: ../features.py:22
 msgid "Add C code accessing located variables synchronously"
 msgstr ""
 
-#: ../IDEFrame.py:1873
+#: ../IDEFrame.py:1924
 msgid "Add Configuration"
 msgstr ""
 
-#: ../IDEFrame.py:1853
+#: ../IDEFrame.py:1904
 msgid "Add DataType"
 msgstr ""
 
-#: ../editors/Viewer.py:513
+#: ../editors/Viewer.py:612
 msgid "Add Divergence Branch"
 msgstr ""
 
-#: ../dialogs/DiscoveryDialog.py:116
+#: ../etherlab/EthercatMaster.py:297
+msgid "Add Ethercat Slave"
+msgstr ""
+
+#: ../etherlab/EthercatMaster.py:297
+msgid "Add Ethercat Slave to Master"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:121
 msgid "Add IP"
 msgstr ""
 
-#: ../IDEFrame.py:1861
+#: ../IDEFrame.py:1912
 msgid "Add POU"
 msgstr ""
 
-#: ../features.py:33
+#: ../features.py:23
 msgid "Add Python code executed asynchronously"
 msgstr ""
 
-#: ../IDEFrame.py:1901 ../IDEFrame.py:1951
+#: ../IDEFrame.py:1952 ../IDEFrame.py:2002
 msgid "Add Resource"
 msgstr ""
 
-#: ../IDEFrame.py:1879 ../IDEFrame.py:1922
+#: ../IDEFrame.py:1930 ../IDEFrame.py:1973
 msgid "Add Transition"
 msgstr ""
 
-#: ../editors/Viewer.py:500
+#: ../editors/Viewer.py:599
 msgid "Add Wire Segment"
 msgstr ""
 
-#: ../editors/SFCViewer.py:433
+#: ../editors/SFCViewer.py:447
 msgid "Add a new initial step"
 msgstr ""
 
-#: ../editors/Viewer.py:2706 ../editors/SFCViewer.py:770
+#: ../editors/Viewer.py:2790 ../editors/SFCViewer.py:784
 msgid "Add a new jump"
 msgstr ""
 
-#: ../editors/SFCViewer.py:455
+#: ../editors/SFCViewer.py:469
 msgid "Add a new step"
 msgstr ""
 
-#: ../features.py:34
+#: ../features.py:24
 msgid "Add a simple WxGlade based GUI."
 msgstr ""
 
-#: ../dialogs/ActionBlockDialog.py:137
+#: ../dialogs/ActionBlockDialog.py:143
 msgid "Add action"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:352
+#: ../editors/DataTypeEditor.py:364
 msgid "Add element"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:268
+#: ../etherlab/ConfigEditor.py:1388
+msgid "Add file from ESI files database"
+msgstr ""
+
+#: ../etherlab/ConfigEditor.py:1360
+msgid "Add file to project"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:281
 msgid "Add instance"
 msgstr ""
 
-#: ../canfestival/NetworkEditor.py:103
+#: ../etherlab/ConfigEditor.py:652
+msgid "Add process variable"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:110
 msgid "Add slave"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:239
+#: ../etherlab/ConfigEditor.py:679
+msgid "Add startup service variable"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:250
 msgid "Add task"
 msgstr ""
 
-#: ../editors/CodeFileEditor.py:658 ../controls/VariablePanel.py:450
+#: ../bacnet/BacnetSlaveEditor.py:811 ../editors/CodeFileEditor.py:672
+#: ../controls/VariablePanel.py:483
 msgid "Add variable"
 msgstr ""
 
+#: ../etherlab/etherlab.py:186
+msgid ""
+"Adding a PDO not defined in default configuration\n"
+"for mapping needed location variables\n"
+"(1 if possible)"
+msgstr ""
+
 #: ../plcopen/iec_std.csv:33
 msgid "Addition"
 msgstr ""
 
-#: ../plcopen/definitions.py:47
+#: ../plcopen/definitions.py:51
 msgid "Additional function blocks"
 msgstr ""
 
-#: ../editors/Viewer.py:571
+#: ../editors/Viewer.py:672
 msgid "Adjust Block Size"
 msgstr ""
 
-#: ../editors/Viewer.py:1637
+#: ../editors/Viewer.py:1722
 msgid "Alignment"
 msgstr ""
 
-#: ../dialogs/BrowseLocationsDialog.py:39
-#: ../dialogs/BrowseLocationsDialog.py:47
-#: ../dialogs/BrowseLocationsDialog.py:140
-#: ../dialogs/BrowseLocationsDialog.py:143 ../controls/LogViewer.py:298
-#: ../controls/VariablePanel.py:70
+#: ../dialogs/BrowseLocationsDialog.py:42
+#: ../dialogs/BrowseLocationsDialog.py:50
+#: ../dialogs/BrowseLocationsDialog.py:151
+#: ../dialogs/BrowseLocationsDialog.py:154 ../etherlab/ConfigEditor.py:65
+#: ../etherlab/ConfigEditor.py:853 ../controls/LogViewer.py:307
+#: ../controls/VariablePanel.py:85
 msgid "All"
 msgstr ""
 
-#: ../editors/FileManagementPanel.py:35
+#: ../editors/FileManagementPanel.py:51
 msgid "All files (*.*)|*.*|CSV files (*.csv)|*.csv"
 msgstr ""
 
-#: ../ProjectController.py:1623
+#: ../ProjectController.py:1752
 msgid "Already connected. Please disconnect\n"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:594
+#: ../editors/DataTypeEditor.py:607
 #, python-format
 msgid "An element named \"%s\" already exists in this structure!"
 msgstr ""
 
-#: ../dialogs/ConnectionDialog.py:96
+#: ../editors/ResourceEditor.py:520
+msgid "An instance with the same name already exists!"
+msgstr ""
+
+#: ../etherlab/ConfigEditor.py:975
+#, python-format
+msgid "An variable named \"%s\" already exists!"
+msgstr ""
+
+#: ../bacnet/BacnetSlaveEditor.py:935
+msgid "Analog Input Objects"
+msgstr ""
+
+#: ../bacnet/BacnetSlaveEditor.py:934
+msgid "Analog Output Objects"
+msgstr ""
+
+#: ../bacnet/BacnetSlaveEditor.py:933
+msgid "Analog Value Objects"
+msgstr ""
+
+#: ../dialogs/ConnectionDialog.py:103
 msgid "Apply name modification to all continuations with the same name"
 msgstr ""
 
@@ -593,8 +677,8 @@
 msgid "Arithmetic"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:54 ../editors/DataTypeEditor.py:635
-#: ../controls/VariablePanel.py:829
+#: ../editors/DataTypeEditor.py:60 ../editors/DataTypeEditor.py:649
+#: ../controls/VariablePanel.py:883
 msgid "Array"
 msgstr ""
 
@@ -602,48 +686,68 @@
 msgid "Assignment"
 msgstr ""
 
-#: ../dialogs/FBDVariableDialog.py:217
+#: ../dialogs/FBDVariableDialog.py:227
 msgid "At least a variable or an expression must be selected!"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:99
+#: ../controls/ProjectPropertiesPanel.py:113
 msgid "Author"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:96
+#: ../controls/ProjectPropertiesPanel.py:110
 msgid "Author Name (optional):"
 msgstr ""
 
-#: ../dialogs/FindInPouDialog.py:79
+#: ../etherlab/EthercatCIA402Slave.py:125
+msgid "Axis Pos"
+msgstr ""
+
+#: ../etherlab/EthercatCIA402Slave.py:118
+msgid "Axis Ref"
+msgstr ""
+
+#: ../dialogs/FindInPouDialog.py:80
 msgid "Backward"
 msgstr ""
 
-#: ../util/Zeroconf.py:599
-msgid "Bad domain name (circular) at "
-msgstr ""
-
-#: ../util/Zeroconf.py:602
-msgid "Bad domain name at "
-msgstr ""
-
-#: ../canfestival/config_utils.py:342 ../canfestival/config_utils.py:630
+#: ../features.py:19
+msgid "Bacnet support"
+msgstr ""
+
+#: ../canfestival/config_utils.py:365 ../canfestival/config_utils.py:672
 #, python-format
 msgid "Bad location size : %s"
 msgstr ""
 
-#: ../dialogs/ArrayTypeDialog.py:55 ../editors/DataTypeEditor.py:175
-#: ../editors/DataTypeEditor.py:205 ../editors/DataTypeEditor.py:297
+#: ../dialogs/ArrayTypeDialog.py:57 ../editors/DataTypeEditor.py:183
+#: ../editors/DataTypeEditor.py:213 ../editors/DataTypeEditor.py:307
 msgid "Base Type:"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:625 ../controls/VariablePanel.py:787
+#: ../editors/DataTypeEditor.py:639 ../controls/VariablePanel.py:841
 msgid "Base Types"
 msgstr ""
 
-#: ../Beremiz.py:553
+#: ../BeremizIDE.py:479
 msgid "Beremiz"
 msgstr ""
 
+#: ../runtime/NevowServer.py:201
+msgid "Beremiz Runtime Settings"
+msgstr ""
+
+#: ../bacnet/BacnetSlaveEditor.py:938
+msgid "Binary Input Objects"
+msgstr ""
+
+#: ../bacnet/BacnetSlaveEditor.py:937
+msgid "Binary Output Objects"
+msgstr ""
+
+#: ../bacnet/BacnetSlaveEditor.py:936
+msgid "Binary Value Objects"
+msgstr ""
+
 #: ../plcopen/iec_std.csv:70
 msgid "Binary selection (1 of 2)"
 msgstr ""
@@ -672,120 +776,124 @@
 msgid "Bitwise inverting"
 msgstr ""
 
-#: ../editors/Viewer.py:525 ../editors/Viewer.py:2358
+#: ../editors/Viewer.py:624 ../editors/Viewer.py:2442
 msgid "Block"
 msgstr ""
 
-#: ../dialogs/FBDBlockDialog.py:59
+#: ../dialogs/FBDBlockDialog.py:63
 msgid "Block Properties"
 msgstr ""
 
-#: ../editors/TextViewer.py:262
+#: ../editors/TextViewer.py:260
 msgid "Block name"
 msgstr ""
 
-#: ../editors/Viewer.py:491
+#: ../editors/Viewer.py:589
 msgid "Bottom"
 msgstr ""
 
-#: ../ProjectController.py:1301
+#: ../runtime/PlcStatus.py:11
 msgid "Broken"
 msgstr ""
 
-#: ../dialogs/BrowseValuesLibraryDialog.py:37
+#: ../dialogs/BrowseValuesLibraryDialog.py:40
 #, python-format
 msgid "Browse %s values library"
 msgstr ""
 
-#: ../dialogs/BrowseLocationsDialog.py:65
+#: ../dialogs/BrowseLocationsDialog.py:69
 msgid "Browse Locations"
 msgstr ""
 
-#: ../ProjectController.py:1769
+#: ../ProjectController.py:1898
 msgid "Build"
 msgstr ""
 
-#: ../ProjectController.py:1235
+#: ../ProjectController.py:1397
 msgid "Build directory already clean\n"
 msgstr ""
 
-#: ../ProjectController.py:1770
+#: ../ProjectController.py:1899
 msgid "Build project into build folder"
 msgstr ""
 
-#: ../ProjectController.py:1018
+#: ../ProjectController.py:1155
 msgid "C Build crashed !\n"
 msgstr ""
 
-#: ../ProjectController.py:1015
+#: ../ProjectController.py:1152
 msgid "C Build failed.\n"
 msgstr ""
 
-#: ../c_ext/CFileEditor.py:63
+#: ../c_ext/CFileEditor.py:66
 msgid "C code"
 msgstr ""
 
-#: ../ProjectController.py:1093
+#: ../ProjectController.py:1240
 msgid "C code generated successfully.\n"
 msgstr ""
 
-#: ../targets/toolchain_makefile.py:122
+#: ../targets/toolchain_makefile.py:126
 msgid "C compilation failed.\n"
 msgstr ""
 
-#: ../targets/toolchain_gcc.py:156
+#: ../targets/toolchain_gcc.py:199
 #, python-format
 msgid "C compilation of %s failed.\n"
 msgstr ""
 
-#: ../features.py:32
+#: ../features.py:22
 msgid "C extension"
 msgstr ""
 
-#: ../dialogs/AboutDialog.py:63
+#: ../dialogs/AboutDialog.py:69
 msgid "C&redits"
 msgstr ""
 
-#: ../canfestival/NetworkEditor.py:52
+#: ../canfestival/NetworkEditor.py:58
 msgid "CANOpen network"
 msgstr ""
 
-#: ../canfestival/SlaveEditor.py:44
+#: ../canfestival/SlaveEditor.py:48
 msgid "CANOpen slave"
 msgstr ""
 
-#: ../features.py:31
+#: ../features.py:18
 msgid "CANopen support"
 msgstr ""
 
-#: ../plcopen/plcopen.py:1584 ../plcopen/plcopen.py:1598
-#: ../plcopen/plcopen.py:1622 ../plcopen/plcopen.py:1638
+#: ../etherlab/ConfigEditor.py:858
+msgid "CIA402 nodes"
+msgstr ""
+
+#: ../plcopen/plcopen.py:1839 ../plcopen/plcopen.py:1853
+#: ../plcopen/plcopen.py:1878 ../plcopen/plcopen.py:1894
 msgid "Can only generate execution order on FBD networks!"
 msgstr ""
 
-#: ../controls/VariablePanel.py:267
+#: ../controls/VariablePanel.py:290
 msgid "Can only give a location to local or global variables"
 msgstr ""
 
-#: ../PLCOpenEditor.py:334
+#: ../PLCOpenEditor.py:318
 #, python-format
 msgid "Can't generate program to file %s!"
 msgstr ""
 
-#: ../controls/VariablePanel.py:265
+#: ../controls/VariablePanel.py:288
 msgid "Can't give a location to a function block instance"
 msgstr ""
 
-#: ../PLCOpenEditor.py:379
+#: ../PLCOpenEditor.py:363
 #, python-format
 msgid "Can't save project to file %s!"
 msgstr ""
 
-#: ../controls/VariablePanel.py:313
+#: ../controls/VariablePanel.py:338
 msgid "Can't set an initial value to a function block instance"
 msgstr ""
 
-#: ../ConfigTreeNode.py:529
+#: ../ConfigTreeNode.py:532
 #, python-brace-format
 msgid "Cannot create child {a1} of type {a2} "
 msgstr ""
@@ -795,44 +903,48 @@
 msgid "Cannot find lower free IEC channel than %d\n"
 msgstr ""
 
-#: ../connectors/PYRO/__init__.py:131
+#: ../connectors/PYRO/__init__.py:140
 msgid "Cannot get PLC status - connection failed.\n"
 msgstr ""
 
-#: ../ProjectController.py:881
+#: ../ProjectController.py:1013
 msgid "Cannot open/parse VARIABLES.csv!\n"
 msgstr ""
 
-#: ../canfestival/config_utils.py:374
+#: ../canfestival/config_utils.py:400
 #, python-brace-format
 msgid "Cannot set bit offset for non bool '{a1}' variable (ID:{a2},Idx:{a3},sIdx:{a4}))"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:59 ../dialogs/FindInPouDialog.py:88
+#: ../ProjectController.py:1842
+msgid "Cannot transfer while PLC is running. Stop it now?"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:63 ../dialogs/FindInPouDialog.py:89
 msgid "Case sensitive"
 msgstr ""
 
-#: ../editors/Viewer.py:486
+#: ../editors/Viewer.py:584
 msgid "Center"
 msgstr ""
 
-#: ../Beremiz_service.py:266
+#: ../Beremiz_service.py:289
 msgid "Change IP of interface to bind"
 msgstr ""
 
-#: ../Beremiz_service.py:265
+#: ../Beremiz_service.py:288
 msgid "Change Name"
 msgstr ""
 
-#: ../IDEFrame.py:1943
+#: ../IDEFrame.py:1994
 msgid "Change POU Type To"
 msgstr ""
 
-#: ../Beremiz_service.py:267
+#: ../Beremiz_service.py:290
 msgid "Change Port Number"
 msgstr ""
 
-#: ../Beremiz_service.py:268
+#: ../Beremiz_service.py:291
 msgid "Change working directory"
 msgstr ""
 
@@ -840,110 +952,133 @@
 msgid "Character string"
 msgstr ""
 
-#: ../svgui/svgui.py:125
+#: ../svgui/svgui.py:136
 msgid "Choose a SVG file"
 msgstr ""
 
-#: ../ProjectController.py:451
+#: ../etherlab/EtherCATManagementEditor.py:911
+#: ../etherlab/EtherCATManagementEditor.py:1306
+msgid "Choose a binary file"
+msgstr ""
+
+#: ../ProjectController.py:582
 msgid "Choose a directory to save project"
 msgstr ""
 
-#: ../canfestival/canfestival.py:160 ../PLCOpenEditor.py:292
-#: ../PLCOpenEditor.py:324 ../PLCOpenEditor.py:373
+#: ../canfestival/canfestival.py:171 ../bacnet/bacnet.py:434
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:308 ../PLCOpenEditor.py:357
 msgid "Choose a file"
 msgstr ""
 
-#: ../Beremiz.py:931 ../Beremiz.py:966
+#: ../BeremizIDE.py:897
 msgid "Choose a project"
 msgstr ""
 
-#: ../dialogs/BrowseValuesLibraryDialog.py:42
+#: ../dialogs/BrowseValuesLibraryDialog.py:43
 #, python-format
 msgid "Choose a value for %s:"
 msgstr ""
 
-#: ../Beremiz_service.py:323
+#: ../Beremiz_service.py:346
 msgid "Choose a working directory "
 msgstr ""
 
-#: ../ProjectController.py:358
+#: ../etherlab/ConfigEditor.py:1234
+msgid "Choose an XML file"
+msgstr ""
+
+#: ../BeremizIDE.py:861
+msgid "Choose an empty directory for new project"
+msgstr ""
+
+#: ../ProjectController.py:483
 msgid "Chosen folder doesn't contain a program. It's not a valid project!"
 msgstr ""
 
-#: ../ProjectController.py:325
+#: ../ProjectController.py:450
 msgid "Chosen folder isn't empty. You can't use it for a new project!"
 msgstr ""
 
-#: ../controls/VariablePanel.py:53 ../controls/VariablePanel.py:54
+#: ../controls/VariablePanel.py:60
 msgid "Class"
 msgstr ""
 
-#: ../controls/VariablePanel.py:441
+#: ../controls/VariablePanel.py:474
 msgid "Class Filter:"
 msgstr ""
 
-#: ../dialogs/FBDVariableDialog.py:69
+#: ../dialogs/FBDVariableDialog.py:75
 msgid "Class:"
 msgstr ""
 
-#: ../ProjectController.py:1773
+#: ../ProjectController.py:1904
 msgid "Clean"
 msgstr ""
 
-#: ../controls/LogViewer.py:318
+#: ../controls/LogViewer.py:327
 msgid "Clean log messages"
 msgstr ""
 
-#: ../ProjectController.py:1775
+#: ../ProjectController.py:1905
 msgid "Clean project build folder"
 msgstr ""
 
-#: ../ProjectController.py:1232
+#: ../ProjectController.py:1394
 msgid "Cleaning the build directory\n"
 msgstr ""
 
-#: ../IDEFrame.py:435
+#: ../IDEFrame.py:439
 msgid "Clear Errors"
 msgstr ""
 
-#: ../editors/Viewer.py:582
+#: ../editors/Viewer.py:683
 msgid "Clear Execution Order"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:105 ../dialogs/FindInPouDialog.py:111
+#: ../dialogs/SearchInProjectDialog.py:107 ../dialogs/FindInPouDialog.py:112
+#: ../etherlab/ConfigEditor.py:1361
 msgid "Close"
 msgstr ""
 
-#: ../PLCOpenEditor.py:199 ../Beremiz.py:693
+#: ../BeremizIDE.py:623 ../PLCOpenEditor.py:183
 msgid "Close Application"
 msgstr ""
 
-#: ../PLCOpenEditor.py:108 ../Beremiz.py:333 ../Beremiz.py:637
-#: ../IDEFrame.py:1009
+#: ../BeremizIDE.py:253 ../BeremizIDE.py:562 ../PLCOpenEditor.py:81
+#: ../IDEFrame.py:1053
 msgid "Close Project"
 msgstr ""
 
-#: ../PLCOpenEditor.py:106 ../Beremiz.py:331
+#: ../BeremizIDE.py:251 ../PLCOpenEditor.py:79
 msgid "Close Tab"
 msgstr ""
 
-#: ../editors/Viewer.py:541 ../editors/Viewer.py:2366
+#: ../editors/Viewer.py:641 ../editors/Viewer.py:2450
 msgid "Coil"
 msgstr ""
 
-#: ../editors/Viewer.py:561 ../editors/LDViewer.py:506
+#: ../editors/Viewer.py:662 ../editors/LDViewer.py:517
 msgid "Comment"
 msgstr ""
 
-#: ../dialogs/ProjectDialog.py:57
+#: ../etherlab/ConfigEditor.py:66
+msgid "Communication Parameters"
+msgstr ""
+
+#: ../BeremizIDE.py:303 ../BeremizIDE.py:307 ../PLCOpenEditor.py:134
+#: ../PLCOpenEditor.py:138
+msgid "Community support"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:63
 msgid "Company Name"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:94
+#: ../controls/ProjectPropertiesPanel.py:108
 msgid "Company Name (required):"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:95
+#: ../controls/ProjectPropertiesPanel.py:109
 msgid "Company URL (optional):"
 msgstr ""
 
@@ -951,7 +1086,7 @@
 msgid "Comparison"
 msgstr ""
 
-#: ../ProjectController.py:672
+#: ../ProjectController.py:787
 msgid "Compiling IEC Program into C code...\n"
 msgstr ""
 
@@ -959,96 +1094,100 @@
 msgid "Concatenation"
 msgstr ""
 
-#: ../editors/ConfTreeNodeEditor.py:229
+#: ../editors/ConfTreeNodeEditor.py:241
 msgid "Config"
 msgstr ""
 
-#: ../editors/ProjectNodeEditor.py:36
+#: ../editors/ProjectNodeEditor.py:39
 msgid "Config variables"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:39
+#: ../dialogs/SearchInProjectDialog.py:43
 msgid "Configuration"
 msgstr ""
 
-#: ../PLCControler.py:97
+#: ../plcopen/types_enums.py:77
 msgid "Configurations"
 msgstr ""
 
-#: ../editors/Viewer.py:307 ../editors/Viewer.py:337 ../editors/Viewer.py:359
-#: ../editors/TextViewer.py:291 ../editors/TextViewer.py:342
-#: ../editors/TextViewer.py:365 ../controls/VariablePanel.py:328
+#: ../editors/Viewer.py:351 ../editors/Viewer.py:381 ../editors/Viewer.py:403
+#: ../editors/TextViewer.py:289 ../editors/TextViewer.py:343
+#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:353
 msgid "Confirm or change variable name"
 msgstr ""
 
-#: ../ProjectController.py:1788
+#: ../ProjectController.py:1925
 msgid "Connect"
 msgstr ""
 
-#: ../ProjectController.py:1789
+#: ../ProjectController.py:1926
 msgid "Connect to the target PLC"
 msgstr ""
 
-#: ../ProjectController.py:1292
+#: ../ProjectController.py:1469
 #, python-format
 msgid "Connected to URI: %s"
 msgstr ""
 
-#: ../dialogs/SFCTransitionDialog.py:76 ../editors/Viewer.py:527
-#: ../editors/Viewer.py:2359
+#: ../dialogs/SFCTransitionDialog.py:78 ../editors/Viewer.py:626
+#: ../editors/Viewer.py:2443
 msgid "Connection"
 msgstr ""
 
-#: ../dialogs/ConnectionDialog.py:52
+#: ../dialogs/ConnectionDialog.py:55
 msgid "Connection Properties"
 msgstr ""
 
-#: ../ProjectController.py:1647
+#: ../ProjectController.py:1773
 msgid "Connection canceled!\n"
 msgstr ""
 
-#: ../ProjectController.py:1672
+#: ../ProjectController.py:1797
 #, python-format
 msgid "Connection failed to %s!\n"
 msgstr ""
 
-#: ../connectors/PYRO/__init__.py:115 ../connectors/WAMP/__init__.py:111
+#: ../connectors/PYRO/__init__.py:124 ../connectors/WAMP/__init__.py:121
 msgid "Connection lost!\n"
 msgstr ""
 
-#: ../connectors/PYRO/__init__.py:102
+#: ../connectors/PYRO/__init__.py:111
 #, python-format
 msgid "Connection to '%s' failed.\n"
 msgstr ""
 
-#: ../dialogs/ConnectionDialog.py:64 ../editors/Viewer.py:1594
+#: ../dialogs/ConnectionDialog.py:67 ../editors/Viewer.py:1678
 msgid "Connector"
 msgstr ""
 
-#: ../dialogs/SFCStepDialog.py:65
+#: ../dialogs/SFCStepDialog.py:68
 msgid "Connectors:"
 msgstr ""
 
-#: ../Beremiz.py:448
+#: ../BeremizIDE.py:374
 msgid "Console"
 msgstr ""
 
-#: ../controls/VariablePanel.py:60
+#: ../controls/VariablePanel.py:75
 msgid "Constant"
 msgstr ""
 
-#: ../editors/Viewer.py:537 ../editors/Viewer.py:2362
+#: ../editors/Viewer.py:637 ../editors/Viewer.py:2446
 msgid "Contact"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:197
+#: ../controls/ProjectPropertiesPanel.py:219
 msgid "Content Description (optional):"
 msgstr ""
 
-#: ../dialogs/ConnectionDialog.py:65 ../editors/Viewer.py:1595
+#: ../dialogs/ConnectionDialog.py:68 ../editors/Viewer.py:1679
 msgid "Continuation"
 msgstr ""
 
+#: ../etherlab/EtherCATManagementEditor.py:37
+msgid "Control Byte"
+msgstr ""
+
 #: ../plcopen/iec_std.csv:18
 msgid "Conversion from BCD"
 msgstr ""
@@ -1065,20 +1204,20 @@
 msgid "Conversion to time-of-day"
 msgstr ""
 
-#: ../editors/Viewer.py:597 ../controls/LogViewer.py:693 ../IDEFrame.py:370
-#: ../IDEFrame.py:425
+#: ../editors/Viewer.py:698 ../controls/LogViewer.py:713 ../IDEFrame.py:375
+#: ../IDEFrame.py:428
 msgid "Copy"
 msgstr ""
 
-#: ../IDEFrame.py:1930
+#: ../IDEFrame.py:1981
 msgid "Copy POU"
 msgstr ""
 
-#: ../editors/FileManagementPanel.py:65
+#: ../editors/FileManagementPanel.py:67
 msgid "Copy file from left folder to right"
 msgstr ""
 
-#: ../editors/FileManagementPanel.py:64
+#: ../editors/FileManagementPanel.py:66
 msgid "Copy file from right folder to left"
 msgstr ""
 
@@ -1086,137 +1225,162 @@
 msgid "Cosine"
 msgstr ""
 
-#: ../ConfigTreeNode.py:656
+#: ../ConfigTreeNode.py:660
 #, python-brace-format
 msgid ""
 "Could not add child \"{a1}\", type {a2} :\n"
 "{a3}\n"
 msgstr ""
 
-#: ../py_ext/PythonFileCTNMixin.py:77
+#: ../py_ext/PythonFileCTNMixin.py:81
 #, python-format
 msgid "Couldn't import old %s file."
 msgstr ""
 
-#: ../ConfigTreeNode.py:626
+#: ../etherlab/EthercatMaster.py:258
+#, python-format
+msgid "Couldn't load %s network configuration file."
+msgstr ""
+
+#: ../etherlab/EthercatMaster.py:279
+#, python-format
+msgid "Couldn't load %s network process variables file."
+msgstr ""
+
+#: ../ConfigTreeNode.py:630
 #, python-brace-format
 msgid ""
 "Couldn't load confnode base parameters {a1} :\n"
 " {a2}"
 msgstr ""
 
-#: ../ConfigTreeNode.py:643 ../CodeFileTreeNode.py:124
+#: ../ConfigTreeNode.py:647 ../CodeFileTreeNode.py:127
 #, python-brace-format
 msgid ""
 "Couldn't load confnode parameters {a1} :\n"
 " {a2}"
 msgstr ""
 
-#: ../PLCControler.py:946
+#: ../etherlab/etherlab.py:264
+#, python-brace-format
+msgid ""
+"Couldn't load {a1} XML file:\n"
+"{a2}"
+msgstr ""
+
+#: ../PLCControler.py:552
 msgid "Couldn't paste non-POU object."
 msgstr ""
 
-#: ../ProjectController.py:1589
+#: ../ProjectController.py:1717
 msgid "Couldn't start PLC !\n"
 msgstr ""
 
-#: ../ProjectController.py:1597
+#: ../ProjectController.py:1725
 msgid "Couldn't stop PLC !\n"
 msgstr ""
 
-#: ../ProjectController.py:1561
-msgid "Couldn't stop debugger.\n"
-msgstr ""
-
-#: ../svgui/svgui.py:47
+#: ../svgui/svgui.py:57
 msgid "Create HMI"
 msgstr ""
 
-#: ../dialogs/PouDialog.py:45
+#: ../dialogs/PouDialog.py:48
 msgid "Create a new POU"
 msgstr ""
 
-#: ../dialogs/PouActionDialog.py:38
+#: ../dialogs/PouActionDialog.py:42
 msgid "Create a new action"
 msgstr ""
 
-#: ../IDEFrame.py:159
+#: ../IDEFrame.py:313
 msgid "Create a new action block"
 msgstr ""
 
-#: ../IDEFrame.py:108 ../IDEFrame.py:138 ../IDEFrame.py:171
+#: ../IDEFrame.py:262 ../IDEFrame.py:292 ../IDEFrame.py:325
 msgid "Create a new block"
 msgstr ""
 
-#: ../IDEFrame.py:132
+#: ../IDEFrame.py:286
 msgid "Create a new branch"
 msgstr ""
 
-#: ../IDEFrame.py:126
+#: ../IDEFrame.py:280
 msgid "Create a new coil"
 msgstr ""
 
-#: ../IDEFrame.py:102 ../IDEFrame.py:117 ../IDEFrame.py:147
+#: ../IDEFrame.py:256 ../IDEFrame.py:271 ../IDEFrame.py:301
 msgid "Create a new comment"
 msgstr ""
 
-#: ../IDEFrame.py:111 ../IDEFrame.py:141 ../IDEFrame.py:174
+#: ../IDEFrame.py:265 ../IDEFrame.py:295 ../IDEFrame.py:328
 msgid "Create a new connection"
 msgstr ""
 
-#: ../IDEFrame.py:129 ../IDEFrame.py:180
+#: ../IDEFrame.py:283 ../IDEFrame.py:334
 msgid "Create a new contact"
 msgstr ""
 
-#: ../IDEFrame.py:162
+#: ../IDEFrame.py:316
 msgid "Create a new divergence"
 msgstr ""
 
-#: ../dialogs/SFCDivergenceDialog.py:53
+#: ../dialogs/SFCDivergenceDialog.py:54
 msgid "Create a new divergence or convergence"
 msgstr ""
 
-#: ../IDEFrame.py:150
+#: ../IDEFrame.py:304
 msgid "Create a new initial step"
 msgstr ""
 
-#: ../IDEFrame.py:165
+#: ../IDEFrame.py:319
 msgid "Create a new jump"
 msgstr ""
 
-#: ../IDEFrame.py:120 ../IDEFrame.py:177
+#: ../IDEFrame.py:274 ../IDEFrame.py:331
 msgid "Create a new power rail"
 msgstr ""
 
-#: ../IDEFrame.py:123
+#: ../IDEFrame.py:277
 msgid "Create a new rung"
 msgstr ""
 
-#: ../IDEFrame.py:153
+#: ../IDEFrame.py:307
 msgid "Create a new step"
 msgstr ""
 
-#: ../dialogs/PouTransitionDialog.py:47 ../IDEFrame.py:156
+#: ../dialogs/PouTransitionDialog.py:45 ../IDEFrame.py:310
 msgid "Create a new transition"
 msgstr ""
 
-#: ../IDEFrame.py:105 ../IDEFrame.py:135 ../IDEFrame.py:168
+#: ../IDEFrame.py:259 ../IDEFrame.py:289 ../IDEFrame.py:322
 msgid "Create a new variable"
 msgstr ""
 
-#: ../dialogs/AboutDialog.py:105
+#: ../etherlab/etherlab.py:183
+msgid "Creating new PDO"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:109
 msgid "Credits"
 msgstr ""
 
-#: ../Beremiz_service.py:432
+#: ../runtime/WampClient.py:400
+msgid "Current status"
+msgstr ""
+
+#: ../Beremiz_service.py:437
 msgid "Current working directory :"
 msgstr ""
 
-#: ../editors/Viewer.py:596 ../IDEFrame.py:368 ../IDEFrame.py:424
+#: ../runtime/WampClient.py:161
+msgid "Custom protocol options failed :"
+msgstr ""
+
+#: ../editors/Viewer.py:697 ../IDEFrame.py:373 ../IDEFrame.py:427
 msgid "Cut"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:72
+#: ../editors/ResourceEditor.py:81
 msgid "Cyclic"
 msgstr ""
 
@@ -1228,19 +1392,19 @@
 msgid "DEPRECATED"
 msgstr ""
 
-#: ../canfestival/SlaveEditor.py:76 ../canfestival/NetworkEditor.py:97
+#: ../canfestival/SlaveEditor.py:80 ../canfestival/NetworkEditor.py:104
 msgid "DS-301 Profile"
 msgstr ""
 
-#: ../canfestival/SlaveEditor.py:77 ../canfestival/NetworkEditor.py:98
+#: ../canfestival/SlaveEditor.py:81 ../canfestival/NetworkEditor.py:105
 msgid "DS-302 Profile"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:35
+#: ../dialogs/SearchInProjectDialog.py:39
 msgid "Data Type"
 msgstr ""
 
-#: ../PLCControler.py:96
+#: ../plcopen/types_enums.py:76
 msgid "Data Types"
 msgstr ""
 
@@ -1261,66 +1425,67 @@
 msgid "Date subtraction"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:43
+#: ../dialogs/DurationEditorDialog.py:57
 msgid "Days:"
 msgstr ""
 
-#: ../ProjectController.py:1694
+#: ../ProjectController.py:1809
 msgid "Debug does not match PLC - stop/transfert/start to re-enable\n"
 msgstr ""
 
-#: ../controls/PouInstanceVariablesPanel.py:134
+#: ../controls/PouInstanceVariablesPanel.py:144
 msgid "Debug instance"
 msgstr ""
 
-#: ../editors/Viewer.py:1117 ../editors/Viewer.py:3653
+#: ../editors/Viewer.py:493
 #, python-format
 msgid "Debug: %s"
 msgstr ""
 
-#: ../ProjectController.py:1350
+#: ../ProjectController.py:1548
 #, python-format
 msgid "Debug: Unknown variable '%s'\n"
 msgstr ""
 
-#: ../ProjectController.py:1348
+#: ../ProjectController.py:1545
 #, python-format
 msgid "Debug: Unsupported type to debug '%s'\n"
 msgstr ""
 
-#: ../IDEFrame.py:639
+#: ../IDEFrame.py:666
 msgid "Debugger"
 msgstr ""
 
-#: ../ProjectController.py:1530
-msgid "Debugger disabled\n"
-msgstr ""
-
-#: ../ProjectController.py:1691
+#: ../ProjectController.py:1805
 msgid "Debugger ready\n"
 msgstr ""
 
-#: ../ProjectController.py:1563
-msgid "Debugger stopped.\n"
-msgstr ""
-
-#: ../editors/Viewer.py:572 ../Beremiz.py:1064 ../IDEFrame.py:1959
+#: ../etherlab/EtherCATManagementEditor.py:37
+msgid "Default Size"
+msgstr ""
+
+#: ../etherlab/EthercatCFileGenerator.py:174
+#, python-format
+msgid "Definition conflict for location \"%s\""
+msgstr ""
+
+#: ../BeremizIDE.py:1001 ../editors/Viewer.py:673 ../IDEFrame.py:2010
 msgid "Delete"
 msgstr ""
 
-#: ../editors/Viewer.py:514
+#: ../editors/Viewer.py:613
 msgid "Delete Divergence Branch"
 msgstr ""
 
-#: ../editors/FileManagementPanel.py:153
+#: ../etherlab/ConfigEditor.py:1261 ../editors/FileManagementPanel.py:156
 msgid "Delete File"
 msgstr ""
 
-#: ../editors/Viewer.py:501
+#: ../editors/Viewer.py:600
 msgid "Delete Wire Segment"
 msgstr ""
 
-#: ../controls/CustomEditableListBox.py:41
+#: ../controls/CustomEditableListBox.py:44
 msgid "Delete item"
 msgstr ""
 
@@ -1328,43 +1493,48 @@
 msgid "Deletion (within)"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:153
+#: ../editors/DataTypeEditor.py:161
 msgid "Derivation Type:"
 msgstr ""
 
-#: ../controls/VariablePanel.py:432
+#: ../etherlab/ConfigEditor.py:346 ../etherlab/ConfigEditor.py:465
+#: ../editors/CodeFileEditor.py:754
+msgid "Description"
+msgstr ""
+
+#: ../controls/VariablePanel.py:465
 msgid "Description:"
 msgstr ""
 
-#: ../dialogs/ArrayTypeDialog.py:61 ../editors/DataTypeEditor.py:321
+#: ../dialogs/ArrayTypeDialog.py:63 ../editors/DataTypeEditor.py:332
 msgid "Dimensions:"
 msgstr ""
 
-#: ../dialogs/FindInPouDialog.py:68
+#: ../dialogs/FindInPouDialog.py:69
 msgid "Direction"
 msgstr ""
 
-#: ../dialogs/BrowseLocationsDialog.py:90
+#: ../dialogs/BrowseLocationsDialog.py:101
 msgid "Direction:"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:54
+#: ../editors/DataTypeEditor.py:60
 msgid "Directly"
 msgstr ""
 
-#: ../ProjectController.py:1797
+#: ../ProjectController.py:1938
 msgid "Disconnect"
 msgstr ""
 
-#: ../ProjectController.py:1799
+#: ../ProjectController.py:1939
 msgid "Disconnect from PLC"
 msgstr ""
 
-#: ../ProjectController.py:1302
+#: ../runtime/PlcStatus.py:14
 msgid "Disconnected"
 msgstr ""
 
-#: ../editors/Viewer.py:556 ../editors/Viewer.py:2354
+#: ../editors/Viewer.py:657 ../editors/Viewer.py:2438
 msgid "Divergence"
 msgstr ""
 
@@ -1372,120 +1542,161 @@
 msgid "Division"
 msgstr ""
 
-#: ../editors/FileManagementPanel.py:152
+#: ../etherlab/ConfigEditor.py:1260 ../editors/FileManagementPanel.py:155
 #, python-format
 msgid "Do you really want to delete the file '%s'?"
 msgstr ""
 
-#: ../controls/VariablePanel.py:53 ../controls/VariablePanel.py:54
+#: ../controls/VariablePanel.py:65
 msgid "Documentation"
 msgstr ""
 
-#: ../PLCOpenEditor.py:328
+#: ../PLCOpenEditor.py:312
 msgid "Done"
 msgstr ""
 
-#: ../dialogs/ActionBlockDialog.py:38
+#: ../runtime/WampClient.py:384
+msgid "Download"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Duration"
 msgstr ""
 
-#: ../canfestival/canfestival.py:163
+#: ../bacnet/bacnet.py:437
+msgid "EDE files (*_EDE.csv)|*_EDE.csv|All files|*.*"
+msgstr ""
+
+#: ../canfestival/canfestival.py:174
 msgid "EDS files (*.eds)|*.eds|All files|*.*"
 msgstr ""
 
-#: ../editors/Viewer.py:570
+#: ../etherlab/ConfigEditor.py:1342
+msgid "ESI Files Database management"
+msgstr ""
+
+#: ../etherlab/ConfigEditor.py:1109
+msgid "ESI Files:"
+msgstr ""
+
+#: ../editors/Viewer.py:671
 msgid "Edit Block"
 msgstr ""
 
+#: ../dialogs/LDElementDialog.py:58
+msgid "Edit Coil Values"
+msgstr ""
+
 #: ../dialogs/LDElementDialog.py:56
-msgid "Edit Coil Values"
-msgstr ""
-
-#: ../dialogs/LDElementDialog.py:54
 msgid "Edit Contact Values"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:59
+#: ../dialogs/DurationEditorDialog.py:54
 msgid "Edit Duration"
 msgstr ""
 
-#: ../dialogs/SFCStepDialog.py:50
+#: ../dialogs/SFCStepDialog.py:53
 msgid "Edit Step"
 msgstr ""
 
-#: ../wxglade_hmi/wxglade_hmi.py:36
+#: ../wxglade_hmi/wxglade_hmi.py:45
 msgid "Edit a WxWidgets GUI with WXGlade"
 msgstr ""
 
-#: ../dialogs/ActionBlockDialog.py:121
+#: ../dialogs/ActionBlockDialog.py:127
 msgid "Edit action block properties"
 msgstr ""
 
-#: ../dialogs/ArrayTypeDialog.py:45
+#: ../dialogs/ArrayTypeDialog.py:47
 msgid "Edit array type properties"
 msgstr ""
 
-#: ../editors/Viewer.py:2575 ../editors/Viewer.py:3004
+#: ../dialogs/CommentEditDialog.py:53
 msgid "Edit comment"
 msgstr ""
 
-#: ../editors/FileManagementPanel.py:66
+#: ../editors/FileManagementPanel.py:68
 msgid "Edit file"
 msgstr ""
 
-#: ../controls/CustomEditableListBox.py:39
+#: ../controls/CustomEditableListBox.py:42
 msgid "Edit item"
 msgstr ""
 
-#: ../editors/Viewer.py:2963
+#: ../editors/Viewer.py:3058
 msgid "Edit jump target"
 msgstr ""
 
-#: ../ProjectController.py:1811
+#: ../ProjectController.py:1956
 msgid "Edit raw IEC code added to code generated by PLCGenerator"
 msgstr ""
 
-#: ../editors/SFCViewer.py:799
+#: ../editors/SFCViewer.py:815
 msgid "Edit step name"
 msgstr ""
 
-#: ../dialogs/SFCTransitionDialog.py:51
+#: ../dialogs/SFCTransitionDialog.py:53
 msgid "Edit transition"
 msgstr ""
 
-#: ../IDEFrame.py:611
+#: ../IDEFrame.py:638
 msgid "Editor ToolBar"
 msgstr ""
 
-#: ../ProjectController.py:1195
+#: ../ProjectController.py:1355
 msgid "Editor selection"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:348
+#: ../editors/DataTypeEditor.py:360
 msgid "Elements :"
 msgstr ""
 
-#: ../ProjectController.py:1300
+#: ../runtime/PlcStatus.py:15
 msgid "Empty"
 msgstr ""
 
-#: ../IDEFrame.py:365
-msgid "Enable Undo/Redo"
-msgstr ""
-
-#: ../Beremiz_service.py:331
+#: ../dialogs/ArrayTypeDialog.py:100
+msgid "Empty dimension isn't allowed."
+msgstr ""
+
+#: ../etherlab/EtherCATManagementEditor.py:37
+msgid "Enable"
+msgstr ""
+
+#: ../runtime/WampClient.py:410
+msgid "Enable WAMP connection"
+msgstr ""
+
+#: ../Beremiz_service.py:354
 msgid "Enter a name "
 msgstr ""
 
-#: ../Beremiz_service.py:316
+#: ../Beremiz_service.py:339
 msgid "Enter a port number "
 msgstr ""
 
-#: ../Beremiz_service.py:307
+#: ../etherlab/EtherCATManagementEditor.py:627
+msgid "Enter hex or dec value (if enter dec value, it automatically conversed hex value)"
+msgstr ""
+
+#: ../etherlab/EtherCATManagementEditor.py:1964
+msgid "Enter hex(0xnnnn) or dec(n) value"
+msgstr ""
+
+#: ../Beremiz_service.py:330
 msgid "Enter the IP of the interface to bind"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:54
+#: ../etherlab/ConfigEditor.py:502
+msgid "Entry can't be write through SDO"
+msgstr ""
+
+#: ../etherlab/EthercatCFileGenerator.py:569
+#, python-brace-format
+msgid "Entry index 0x{a1:.4x}, subindex 0x{a2:.2x} not mapped for device {a3}"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
 msgid "Enumerated"
 msgstr ""
 
@@ -1493,81 +1704,115 @@
 msgid "Equal to"
 msgstr ""
 
-#: ../dialogs/ForceVariableDialog.py:179
-#: ../dialogs/SearchInProjectDialog.py:168 ../dialogs/SFCStepNameDialog.py:60
-#: ../dialogs/DurationEditorDialog.py:121
-#: ../dialogs/DurationEditorDialog.py:163 ../dialogs/PouTransitionDialog.py:112
-#: ../dialogs/BlockPreviewDialog.py:236 ../dialogs/ProjectDialog.py:71
-#: ../dialogs/ArrayTypeDialog.py:97 ../dialogs/ArrayTypeDialog.py:103
-#: ../dialogs/PouNameDialog.py:54 ../dialogs/BrowseLocationsDialog.py:216
-#: ../dialogs/BrowseValuesLibraryDialog.py:83 ../dialogs/PouActionDialog.py:104
-#: ../dialogs/PouDialog.py:134 ../PLCOpenEditor.py:335 ../PLCOpenEditor.py:340
-#: ../PLCOpenEditor.py:420 ../PLCOpenEditor.py:430 ../editors/Viewer.py:423
-#: ../editors/LDViewer.py:666 ../editors/LDViewer.py:882
-#: ../editors/LDViewer.py:886 ../editors/DataTypeEditor.py:550
-#: ../editors/DataTypeEditor.py:555 ../editors/DataTypeEditor.py:579
-#: ../editors/DataTypeEditor.py:584 ../editors/DataTypeEditor.py:594
-#: ../editors/DataTypeEditor.py:745 ../editors/DataTypeEditor.py:752
-#: ../editors/TextViewer.py:389 ../editors/CodeFileEditor.py:783
-#: ../ProjectController.py:293 ../ProjectController.py:421
-#: ../ProjectController.py:428 ../controls/FolderTree.py:217
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:166
-#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:137
-#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:231
-#: ../controls/VariablePanel.py:402 ../controls/VariablePanel.py:772
-#: ../Beremiz.py:1203 ../IDEFrame.py:1003 ../IDEFrame.py:1614
-#: ../IDEFrame.py:1655 ../IDEFrame.py:1660 ../IDEFrame.py:1674
-#: ../IDEFrame.py:1679 ../Beremiz_service.py:211
+#: ../dialogs/ForceVariableDialog.py:213
+#: ../dialogs/SearchInProjectDialog.py:172 ../dialogs/SFCStepNameDialog.py:64
+#: ../dialogs/DurationEditorDialog.py:125
+#: ../dialogs/DurationEditorDialog.py:172 ../dialogs/PouTransitionDialog.py:113
+#: ../dialogs/BlockPreviewDialog.py:237 ../dialogs/ProjectDialog.py:78
+#: ../dialogs/ArrayTypeDialog.py:114 ../dialogs/PouNameDialog.py:58
+#: ../dialogs/BrowseLocationsDialog.py:228
+#: ../dialogs/BrowseValuesLibraryDialog.py:87 ../dialogs/PouActionDialog.py:112
+#: ../dialogs/PouDialog.py:178 ../PLCOpenEditor.py:319 ../PLCOpenEditor.py:324
+#: ../etherlab/ConfigEditor.py:458 ../etherlab/ConfigEditor.py:510
+#: ../etherlab/ConfigEditor.py:981 ../etherlab/ConfigEditor.py:1047
+#: ../etherlab/ConfigEditor.py:1246 ../etherlab/ConfigEditor.py:1314
+#: ../etherlab/EthercatMaster.py:463 ../editors/ResourceEditor.py:468
+#: ../editors/Viewer.py:467 ../editors/LDViewer.py:677
+#: ../editors/LDViewer.py:893 ../editors/LDViewer.py:897
+#: ../editors/DataTypeEditor.py:566 ../editors/DataTypeEditor.py:571
+#: ../editors/DataTypeEditor.py:590 ../editors/DataTypeEditor.py:759
+#: ../editors/DataTypeEditor.py:766 ../editors/TextViewer.py:390
+#: ../editors/CodeFileEditor.py:779 ../ProjectController.py:404
+#: ../ProjectController.py:548 ../ProjectController.py:557
+#: ../controls/FolderTree.py:222 ../controls/ProjectPropertiesPanel.py:308
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:163
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:138
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:227
+#: ../controls/VariablePanel.py:430 ../controls/VariablePanel.py:784
+#: ../util/ExceptionHandler.py:70 ../IDEFrame.py:1049 ../IDEFrame.py:1667
+#: ../IDEFrame.py:1708 ../IDEFrame.py:1713 ../IDEFrame.py:1727
+#: ../IDEFrame.py:1732 ../Beremiz_service.py:234
 msgid "Error"
 msgstr ""
 
-#: ../ProjectController.py:727
+#: ../ProjectController.py:848
 msgid "Error : At least one configuration and one resource must be declared in PLC !\n"
 msgstr ""
 
-#: ../ProjectController.py:719
+#: ../ProjectController.py:838
 #, python-format
 msgid "Error : IEC to C compiler returned %d\n"
 msgstr ""
 
-#: ../ProjectController.py:621
+#: ../ProjectController.py:762
 #, python-format
 msgid ""
 "Error in ST/IL/SFC code generator :\n"
 "%s\n"
 msgstr ""
 
-#: ../ConfigTreeNode.py:216
+#: ../ConfigTreeNode.py:219
 #, python-format
 msgid "Error while saving \"%s\"\n"
 msgstr ""
 
-#: ../canfestival/canfestival.py:168
+#: ../bacnet/bacnet.py:581
+#, python-brace-format
+msgid "Error: BACnet server '{a1}.x: {a2}' contains objects with duplicate object identifiers.\n"
+msgstr ""
+
+#: ../bacnet/bacnet.py:573
+#, python-brace-format
+msgid "Error: BACnet server '{a1}.x:{a2}' contains objects with duplicate object names.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:179 ../bacnet/bacnet.py:444
 msgid "Error: Export slave failed\n"
 msgstr ""
 
-#: ../canfestival/canfestival.py:369
+#: ../modbus/modbus.py:601
+#, python-brace-format
+msgid "Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number {a3}.\n"
+msgstr ""
+
+#: ../canfestival/canfestival.py:388
 msgid "Error: No Master generated\n"
 msgstr ""
 
-#: ../canfestival/canfestival.py:364
+#: ../canfestival/canfestival.py:383
 msgid "Error: No PLC built\n"
 msgstr ""
 
-#: ../ProjectController.py:1666
+#: ../etherlab/ConfigEditor.py:269
+msgid "EtherCAT Management"
+msgstr ""
+
+#: ../features.py:20
+msgid "EtherCAT master"
+msgstr ""
+
+#: ../etherlab/EthercatMaster.py:302
+msgid "Ethercat Slave Type"
+msgstr ""
+
+#: ../etherlab/ConfigEditor.py:267
+msgid "Ethercat node"
+msgstr ""
+
+#: ../ProjectController.py:1791
 #, python-format
 msgid "Exception while connecting %s!\n"
 msgstr ""
 
-#: ../dialogs/FBDBlockDialog.py:117
+#: ../dialogs/FBDBlockDialog.py:123
 msgid "Execution Control:"
 msgstr ""
 
-#: ../dialogs/FBDVariableDialog.py:79 ../dialogs/FBDBlockDialog.py:105
+#: ../dialogs/FBDVariableDialog.py:85 ../dialogs/FBDBlockDialog.py:111
 msgid "Execution Order:"
 msgstr ""
 
-#: ../features.py:35
+#: ../features.py:25
 msgid "Experimental web based HMI"
 msgstr ""
 
@@ -1579,7 +1824,11 @@
 msgid "Exponentiation"
 msgstr ""
 
-#: ../canfestival/canfestival.py:174
+#: ../bacnet/bacnet.py:156
+msgid "Export BACnet slave to EDE file"
+msgstr ""
+
+#: ../canfestival/canfestival.py:186
 msgid "Export CanOpen slave to EDS file"
 msgstr ""
 
@@ -1587,69 +1836,73 @@
 msgid "Export graph values to clipboard"
 msgstr ""
 
-#: ../canfestival/canfestival.py:173
+#: ../canfestival/canfestival.py:185 ../bacnet/bacnet.py:155
 msgid "Export slave"
 msgstr ""
 
-#: ../dialogs/FBDVariableDialog.py:89
+#: ../dialogs/FBDVariableDialog.py:95
 msgid "Expression:"
 msgstr ""
 
-#: ../controls/VariablePanel.py:72
+#: ../controls/VariablePanel.py:87
 msgid "External"
 msgstr ""
 
-#: ../ProjectController.py:740
+#: ../ProjectController.py:866
 msgid "Extracting Located Variables...\n"
 msgstr ""
 
-#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36 ../controls/ProjectPropertiesPanel.py:143
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:128 ../controls/ProjectPropertiesPanel.py:161
 msgid "FBD"
 msgstr ""
 
-#: ../ProjectController.py:1729
+#: ../ProjectController.py:1855
 msgid "Failed : Must build before transfer.\n"
 msgstr ""
 
-#: ../dialogs/LDElementDialog.py:77 ../editors/Viewer.py:462
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:559
 msgid "Falling Edge"
 msgstr ""
 
-#: ../ProjectController.py:1008
+#: ../ProjectController.py:1145
 msgid "Fatal : cannot get builder.\n"
 msgstr ""
 
-#: ../Beremiz.py:118
+#: ../Beremiz.py:160
 #, python-format
 msgid "Fetching %s"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:160
+#: ../dialogs/DurationEditorDialog.py:169
 #, python-format
 msgid "Field %s hasn't a valid value!"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:162
+#: ../dialogs/DurationEditorDialog.py:171
 #, python-format
 msgid "Fields %s haven't a valid value!"
 msgstr ""
 
-#: ../controls/FolderTree.py:216
+#: ../controls/FolderTree.py:221
 #, python-format
 msgid "File '%s' already exists!"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:100 ../dialogs/FindInPouDialog.py:36
-#: ../dialogs/FindInPouDialog.py:106 ../IDEFrame.py:375
+#: ../runtime/WampClient.py:407
+msgid "File containing secret for that ID"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:102 ../dialogs/FindInPouDialog.py:40
+#: ../dialogs/FindInPouDialog.py:107 ../IDEFrame.py:380
 msgid "Find"
 msgstr ""
 
-#: ../IDEFrame.py:377
+#: ../IDEFrame.py:382
 msgid "Find Next"
 msgstr ""
 
-#: ../IDEFrame.py:379
+#: ../IDEFrame.py:384
 msgid "Find Previous"
 msgstr ""
 
@@ -1657,85 +1910,85 @@
 msgid "Find position"
 msgstr ""
 
-#: ../dialogs/FindInPouDialog.py:57
+#: ../dialogs/FindInPouDialog.py:58
 msgid "Find:"
 msgstr ""
 
-#: ../connectors/PYRO/__init__.py:163
-msgid "Force runtime reload\n"
-msgstr ""
-
-#: ../editors/Viewer.py:1553
+#: ../editors/Viewer.py:1635
 msgid "Force value"
 msgstr ""
 
-#: ../dialogs/ForceVariableDialog.py:162
+#: ../dialogs/ForceVariableDialog.py:176
 msgid "Forcing Variable Value"
 msgstr ""
 
-#: ../dialogs/SFCTransitionDialog.py:179 ../dialogs/PouTransitionDialog.py:102
-#: ../dialogs/ProjectDialog.py:70 ../dialogs/PouActionDialog.py:94
-#: ../dialogs/PouDialog.py:116
+#: ../dialogs/SFCTransitionDialog.py:184 ../dialogs/PouTransitionDialog.py:103
+#: ../dialogs/ProjectDialog.py:77 ../dialogs/PouActionDialog.py:102
+#: ../dialogs/PouDialog.py:160
 #, python-format
 msgid "Form isn't complete. %s must be filled!"
 msgstr ""
 
-#: ../dialogs/SFCStepDialog.py:144 ../dialogs/FBDBlockDialog.py:232
-#: ../dialogs/ConnectionDialog.py:160
+#: ../dialogs/SFCStepDialog.py:150 ../dialogs/FBDBlockDialog.py:239
+#: ../dialogs/ConnectionDialog.py:166
 msgid "Form isn't complete. Name must be filled!"
 msgstr ""
 
-#: ../dialogs/FBDBlockDialog.py:228
+#: ../dialogs/FBDBlockDialog.py:235
 msgid "Form isn't complete. Valid block type must be selected!"
 msgstr ""
 
-#: ../dialogs/FindInPouDialog.py:74
+#: ../dialogs/FindInPouDialog.py:75
 msgid "Forward"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:36 ../IDEFrame.py:1746
+#: ../IDEFrame.py:455
+msgid "Full screen"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:40 ../IDEFrame.py:1797
 msgid "Function"
 msgstr ""
 
-#: ../IDEFrame.py:349
+#: ../IDEFrame.py:357
 msgid "Function &Block"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:37 ../IDEFrame.py:1745
-#: ../IDEFrame.py:1938
+#: ../dialogs/SearchInProjectDialog.py:41 ../IDEFrame.py:1796
+#: ../IDEFrame.py:1989
 msgid "Function Block"
 msgstr ""
 
-#: ../controls/VariablePanel.py:825
+#: ../controls/VariablePanel.py:879
 msgid "Function Block Types"
 msgstr ""
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:75
 msgid "Function Blocks"
 msgstr ""
 
-#: ../editors/Viewer.py:248
+#: ../editors/Viewer.py:290
 msgid "Function Blocks can't be used in Functions!"
 msgstr ""
 
-#: ../PLCControler.py:2337
+#: ../PLCControler.py:1907
 #, python-format
 msgid "FunctionBlock \"%s\" can't be pasted in a Function!!!"
 msgstr ""
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:75
 msgid "Functions"
 msgstr ""
 
-#: ../PLCOpenEditor.py:115
+#: ../PLCOpenEditor.py:88
 msgid "Generate Program"
 msgstr ""
 
-#: ../ProjectController.py:612
+#: ../ProjectController.py:750
 msgid "Generating SoftPLC IEC-61131 ST/IL/SFC code...\n"
 msgstr ""
 
-#: ../controls/VariablePanel.py:73
+#: ../controls/VariablePanel.py:88
 msgid "Global"
 msgstr ""
 
@@ -1743,7 +1996,7 @@
 msgid "Go to current value"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:173
+#: ../controls/ProjectPropertiesPanel.py:192
 msgid "Graphics"
 msgstr ""
 
@@ -1755,105 +2008,138 @@
 msgid "Greater than or equal to"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:134
+#: ../controls/ProjectPropertiesPanel.py:152
 msgid "Grid Resolution:"
 msgstr ""
 
-#: ../runtime/NevowServer.py:181
+#: ../runtime/NevowServer.py:313
 msgid "HTTP interface port :"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:120
+#: ../controls/ProjectPropertiesPanel.py:138
 msgid "Height:"
 msgstr ""
 
-#: ../editors/FileManagementPanel.py:85
+#: ../editors/FileManagementPanel.py:88
 msgid "Home Directory:"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:150
+#: ../controls/ProjectPropertiesPanel.py:168
 msgid "Horizontal:"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:44
+#: ../dialogs/DurationEditorDialog.py:58
 msgid "Hours:"
 msgstr ""
 
-#: ../dialogs/PouActionDialog.py:31 ../dialogs/PouDialog.py:36
+#: ../runtime/WampClient.py:404
+msgid "ID"
+msgstr ""
+
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:128
 msgid "IL"
 msgstr ""
 
-#: ../dialogs/DiscoveryDialog.py:94
+#: ../dialogs/DiscoveryDialog.py:91
 msgid "IP"
 msgstr ""
 
-#: ../Beremiz_service.py:308 ../Beremiz_service.py:309
+#: ../Beremiz_service.py:331 ../Beremiz_service.py:333
 msgid "IP is not valid!"
 msgstr ""
 
-#: ../svgui/svgui.py:42 ../svgui/svgui.py:43
+#: ../etherlab/ConfigEditor.py:1387
+msgid "Import ESI file"
+msgstr ""
+
+#: ../svgui/svgui.py:50 ../svgui/svgui.py:51
 msgid "Import SVG"
 msgstr ""
 
-#: ../dialogs/FBDVariableDialog.py:38 ../editors/Viewer.py:1580
-#: ../controls/VariablePanel.py:71
+#: ../etherlab/ConfigEditor.py:1352
+msgid "Import file to ESI files database"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:64 ../editors/Viewer.py:1664
+#: ../controls/VariablePanel.py:86
 msgid "InOut"
 msgstr ""
 
-#: ../editors/Viewer.py:1100
+#: ../PLCGenerator.py:1089
+#, python-brace-format
+msgid "InOut variable {a1} in block {a2} in POU {a3} must be connected."
+msgstr ""
+
+#: ../editors/Viewer.py:484
 msgid "Inactive"
 msgstr ""
 
-#: ../controls/VariablePanel.py:276
+#: ../controls/VariablePanel.py:299
 #, python-brace-format
 msgid "Incompatible data types between \"{a1}\" and \"{a2}\""
 msgstr ""
 
-#: ../controls/VariablePanel.py:282
+#: ../controls/VariablePanel.py:305
 #, python-format
 msgid "Incompatible size of data between \"%s\" and \"BOOL\""
 msgstr ""
 
-#: ../controls/VariablePanel.py:286
+#: ../controls/VariablePanel.py:309
 #, python-brace-format
 msgid "Incompatible size of data between \"{a1}\" and \"{a2}\""
 msgstr ""
 
-#: ../dialogs/ActionBlockDialog.py:38
+#: ../etherlab/ConfigEditor.py:48 ../etherlab/ConfigEditor.py:465
+msgid "Index"
+msgstr ""
+
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Indicator"
 msgstr ""
 
-#: ../editors/Viewer.py:552
+#: ../editors/CodeFileEditor.py:753
+msgid "Initial"
+msgstr ""
+
+#: ../editors/Viewer.py:653
 msgid "Initial Step"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:50 ../controls/VariablePanel.py:53
-#: ../controls/VariablePanel.py:54
+#: ../editors/DataTypeEditor.py:55 ../controls/VariablePanel.py:63
 msgid "Initial Value"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:185 ../editors/DataTypeEditor.py:216
-#: ../editors/DataTypeEditor.py:272 ../editors/DataTypeEditor.py:310
+#: ../editors/DataTypeEditor.py:193 ../editors/DataTypeEditor.py:224
+#: ../editors/DataTypeEditor.py:281 ../editors/DataTypeEditor.py:320
 msgid "Initial Value:"
 msgstr ""
 
-#: ../svgui/svgui.py:46
+#: ../etherlab/EthercatCIA402Slave.py:119
+msgid "Initiate Drag'n drop of Axis ref located variable"
+msgstr ""
+
+#: ../etherlab/EthercatCIA402Slave.py:126
+msgid "Initiate Drag'n drop of Network position located variable"
+msgstr ""
+
+#: ../svgui/svgui.py:56
 msgid "Inkscape"
 msgstr ""
 
-#: ../dialogs/SFCTransitionDialog.py:75 ../dialogs/ActionBlockDialog.py:42
+#: ../dialogs/SFCTransitionDialog.py:77 ../dialogs/ActionBlockDialog.py:47
 msgid "Inline"
 msgstr ""
 
-#: ../dialogs/SFCStepDialog.py:70 ../dialogs/FBDVariableDialog.py:37
-#: ../dialogs/BrowseLocationsDialog.py:40 ../editors/Viewer.py:289
-#: ../editors/Viewer.py:1578 ../editors/TextViewer.py:307
-#: ../controls/LocationCellEditor.py:98 ../controls/VariablePanel.py:71
-#: ../controls/VariablePanel.py:291 ../controls/VariablePanel.py:351
+#: ../dialogs/SFCStepDialog.py:73 ../dialogs/FBDVariableDialog.py:63
+#: ../dialogs/BrowseLocationsDialog.py:43 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1662 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:86
+#: ../controls/VariablePanel.py:316 ../controls/VariablePanel.py:379
 msgid "Input"
 msgstr ""
 
-#: ../dialogs/FBDBlockDialog.py:93
+#: ../dialogs/FBDBlockDialog.py:99
 msgid "Inputs:"
 msgstr ""
 
@@ -1861,114 +2147,141 @@
 msgid "Insertion (into)"
 msgstr ""
 
-#: ../plcopen/plcopen.py:1691
+#: ../plcopen/plcopen.py:1948
 #, python-format
 msgid "Instance with id %d doesn't exist!"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:264
+#: ../editors/ResourceEditor.py:277
 msgid "Instances:"
 msgstr ""
 
-#: ../controls/VariablePanel.py:70
+#: ../controls/VariablePanel.py:85
 msgid "Interface"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:72
+#: ../editors/ResourceEditor.py:81
 msgid "Interrupt"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:68
+#: ../editors/ResourceEditor.py:76
 msgid "Interval"
 msgstr ""
 
-#: ../PLCControler.py:2325
+#: ../controls/ProjectPropertiesPanel.py:306
+msgid ""
+"Invalid URL!\n"
+"Please enter correct URL address."
+msgstr ""
+
+#: ../PLCControler.py:1895
 msgid "Invalid plcopen element(s)!!!"
 msgstr ""
 
-#: ../canfestival/config_utils.py:381
+#: ../canfestival/config_utils.py:407
 #, python-brace-format
-msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location\"{a4}\""
-msgstr ""
-
-#: ../canfestival/config_utils.py:645
+msgid "Invalid type \"{a1}\"-> {a2} != {a3}  for location \"{a4}\""
+msgstr ""
+
+#: ../canfestival/config_utils.py:689
 #, python-brace-format
 msgid "Invalid type \"{a1}\"-> {a2} != {a3} for location \"{a4}\""
 msgstr ""
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:132
-#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:92
-#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:166
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:129
+#: ../controls/DebugVariablePanel/DebugVariableTextViewer.py:93
+#: ../controls/DebugVariablePanel/DebugVariableGraphicViewer.py:162
 #, python-format
 msgid "Invalid value \"%s\" for debug variable"
 msgstr ""
 
-#: ../controls/VariablePanel.py:255 ../controls/VariablePanel.py:258
+#: ../etherlab/ConfigEditor.py:418 ../etherlab/ConfigEditor.py:421
+#: ../etherlab/ConfigEditor.py:452
+#, python-format
+msgid "Invalid value \"%s\" for process variable"
+msgstr ""
+
+#: ../etherlab/ConfigEditor.py:480 ../etherlab/ConfigEditor.py:483
+#: ../etherlab/ConfigEditor.py:504
+#, python-format
+msgid "Invalid value \"%s\" for startup command"
+msgstr ""
+
+#: ../controls/VariablePanel.py:278 ../controls/VariablePanel.py:281
 #, python-format
 msgid "Invalid value \"%s\" for variable grid element"
 msgstr ""
 
-#: ../editors/Viewer.py:233 ../editors/Viewer.py:236
+#: ../editors/Viewer.py:276 ../editors/Viewer.py:279
 #, python-format
 msgid "Invalid value \"%s\" for viewer block"
 msgstr ""
 
-#: ../dialogs/ForceVariableDialog.py:177
+#: ../dialogs/ForceVariableDialog.py:211
 #, python-brace-format
 msgid "Invalid value \"{a1}\" for \"{a2}\" variable!"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:121
+#: ../etherlab/CommonEtherCATFunction.py:31
+#, python-format
+msgid "Invalid value for HexDecValue \"%s\""
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:125
 msgid ""
 "Invalid value!\n"
 "You must fill a numeric value."
 msgstr ""
 
-#: ../editors/Viewer.py:557 ../editors/Viewer.py:2343
+#: ../connectors/WAMP/dialog.py:38
+msgid "Is connection secure?"
+msgstr ""
+
+#: ../editors/Viewer.py:658 ../editors/Viewer.py:2427
 msgid "Jump"
 msgstr ""
 
-#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36 ../controls/ProjectPropertiesPanel.py:143
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:128 ../controls/ProjectPropertiesPanel.py:161
 msgid "LD"
 msgstr ""
 
-#: ../editors/LDViewer.py:215 ../editors/LDViewer.py:231
+#: ../editors/LDViewer.py:221 ../editors/LDViewer.py:240
 #, python-format
 msgid "Ladder element with id %d is on more than one rung."
 msgstr ""
 
-#: ../dialogs/PouTransitionDialog.py:91 ../dialogs/PouActionDialog.py:83
-#: ../dialogs/PouDialog.py:104
+#: ../dialogs/PouTransitionDialog.py:92 ../dialogs/PouActionDialog.py:91
+#: ../dialogs/PouDialog.py:148
 msgid "Language"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:186
+#: ../controls/ProjectPropertiesPanel.py:208
 msgid "Language (optional):"
 msgstr ""
 
-#: ../dialogs/PouTransitionDialog.py:65 ../dialogs/PouActionDialog.py:56
-#: ../dialogs/PouDialog.py:73
+#: ../dialogs/PouTransitionDialog.py:66 ../dialogs/PouActionDialog.py:63
+#: ../dialogs/PouDialog.py:79
 msgid "Language:"
 msgstr ""
 
-#: ../ProjectController.py:1735
+#: ../ProjectController.py:1861
 msgid "Latest build already matches current target. Transfering anyway...\n"
 msgstr ""
 
-#: ../Beremiz_service.py:271
+#: ../Beremiz_service.py:294
 msgid "Launch WX GUI inspector"
 msgstr ""
 
-#: ../Beremiz_service.py:270
+#: ../Beremiz_service.py:293
 msgid "Launch a live Python shell"
 msgstr ""
 
-#: ../editors/Viewer.py:485
+#: ../editors/Viewer.py:583
 msgid "Left"
 msgstr ""
 
-#: ../dialogs/LDPowerRailDialog.py:62
+#: ../dialogs/LDPowerRailDialog.py:64
 msgid "Left PowerRail"
 msgstr ""
 
@@ -1984,11 +2297,11 @@
 msgid "Less than or equal to"
 msgstr ""
 
-#: ../IDEFrame.py:631
+#: ../IDEFrame.py:658
 msgid "Library"
 msgstr ""
 
-#: ../dialogs/AboutDialog.py:143
+#: ../dialogs/AboutDialog.py:145
 msgid "License"
 msgstr ""
 
@@ -1996,163 +2309,244 @@
 msgid "Limitation"
 msgstr ""
 
-#: ../targets/toolchain_gcc.py:166
+#: ../targets/toolchain_gcc.py:209
 msgid "Linking :\n"
 msgstr ""
 
-#: ../dialogs/DiscoveryDialog.py:111 ../controls/VariablePanel.py:72
+#: ../dialogs/DiscoveryDialog.py:115 ../controls/VariablePanel.py:87
 msgid "Local"
 msgstr ""
 
-#: ../canfestival/canfestival.py:346
+#: ../canfestival/canfestival.py:359
 msgid "Local entries"
 msgstr ""
 
-#: ../ProjectController.py:1641
+#: ../ProjectController.py:1767
 msgid "Local service discovery failed!\n"
 msgstr ""
 
-#: ../controls/VariablePanel.py:53
+#: ../controls/VariablePanel.py:62
 msgid "Location"
 msgstr ""
 
-#: ../dialogs/BrowseLocationsDialog.py:72
+#: ../dialogs/BrowseLocationsDialog.py:78
 msgid "Locations available:"
 msgstr ""
 
+#: ../runtime/NevowServer.py:175
+msgid "Log message level"
+msgstr ""
+
 #: ../plcopen/iec_std.csv:25
 msgid "Logarithm to base 10"
 msgstr ""
 
-#: ../connectors/PYRO/__init__.py:94
+#: ../connectors/PYRO/__init__.py:103
 #, python-format
 msgid "MDNS resolution failure for '%s'\n"
 msgstr ""
 
-#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:85
+#: ../etherlab/ConfigEditor.py:67
+msgid "Manufacturer Specific"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:68 ../canfestival/NetworkEditor.py:92
 msgid "Map Variable"
 msgstr ""
 
-#: ../features.py:31
+#: ../features.py:19
+msgid "Map located variables over Bacnet"
+msgstr ""
+
+#: ../features.py:18
 msgid "Map located variables over CANopen"
 msgstr ""
 
-#: ../canfestival/NetworkEditor.py:106
+#: ../features.py:20
+msgid "Map located variables over EtherCAT"
+msgstr ""
+
+#: ../features.py:21
+msgid "Map located variables over Modbus"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:113
 msgid "Master"
 msgstr ""
 
-#: ../ConfigTreeNode.py:539
+#: ../etherlab/ConfigEditor.py:613
+msgid "Master State"
+msgstr ""
+
+#: ../ConfigTreeNode.py:544
 #, python-brace-format
 msgid "Max count ({a1}) reached for this confnode of type {a2} "
 msgstr ""
 
+#: ../etherlab/etherlab.py:173
+msgid "Max entries by PDO"
+msgstr ""
+
+#: ../etherlab/etherlab.py:176
+msgid ""
+"Maximal number of entries mapped in a PDO\n"
+"including empty entries used for PDO alignment"
+msgstr ""
+
 #: ../plcopen/iec_std.csv:71
 msgid "Maximum"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:239
+#: ../editors/DataTypeEditor.py:246
 msgid "Maximum:"
 msgstr ""
 
-#: ../dialogs/BrowseLocationsDialog.py:42 ../editors/Viewer.py:289
-#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:98
-#: ../controls/VariablePanel.py:291 ../controls/VariablePanel.py:351
+#: ../dialogs/BrowseLocationsDialog.py:45 ../editors/Viewer.py:333
+#: ../editors/TextViewer.py:307 ../controls/LocationCellEditor.py:103
+#: ../controls/VariablePanel.py:316 ../controls/VariablePanel.py:379
 msgid "Memory"
 msgstr ""
 
-#: ../IDEFrame.py:599
+#: ../IDEFrame.py:623
 msgid "Menu ToolBar"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:48
+#: ../runtime/NevowServer.py:176
+msgid "Message text"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:62
 msgid "Microseconds:"
 msgstr ""
 
-#: ../editors/Viewer.py:490
+#: ../editors/Viewer.py:588
 msgid "Middle"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:47
+#: ../dialogs/DurationEditorDialog.py:61
 msgid "Milliseconds:"
 msgstr ""
 
+#: ../etherlab/etherlab.py:167
+msgid "Minimal size in bits between 2 pdo entries"
+msgstr ""
+
 #: ../plcopen/iec_std.csv:72
 msgid "Minimum"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:226
+#: ../editors/DataTypeEditor.py:233
 msgid "Minimum:"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:45
+#: ../dialogs/DurationEditorDialog.py:59
 msgid "Minutes:"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:210
+#: ../etherlab/etherlab.py:238 ../controls/ProjectPropertiesPanel.py:233
 msgid "Miscellaneous"
 msgstr ""
 
-#: ../dialogs/LDElementDialog.py:63
+#: ../features.py:21
+msgid "Modbus support"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:65
 msgid "Modifier:"
 msgstr ""
 
-#: ../PLCGenerator.py:786 ../PLCGenerator.py:1230
+#: ../etherlab/ConfigEditor.py:1313
+#, python-format
+msgid "Module %s must be an integer!"
+msgstr ""
+
+#: ../etherlab/ConfigEditor.py:1376
+msgid "Modules Library"
+msgstr ""
+
+#: ../etherlab/ConfigEditor.py:1145
+msgid "Modules library:"
+msgstr ""
+
+#: ../PLCGenerator.py:795 ../PLCGenerator.py:1318
 #, python-brace-format
 msgid "More than one connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
 msgstr ""
 
-#: ../dialogs/ActionBlockDialog.py:140
+#: ../dialogs/ActionBlockDialog.py:146
 msgid "Move action down"
 msgstr ""
 
-#: ../dialogs/ActionBlockDialog.py:139
+#: ../dialogs/ActionBlockDialog.py:145
 msgid "Move action up"
 msgstr ""
 
-#: ../controls/CustomEditableListBox.py:43
+#: ../controls/CustomEditableListBox.py:46
 msgid "Move down"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:355
+#: ../editors/DataTypeEditor.py:367
 msgid "Move element down"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:354
+#: ../editors/DataTypeEditor.py:366
 msgid "Move element up"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:271
+#: ../editors/ResourceEditor.py:284
 msgid "Move instance down"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:270
+#: ../editors/ResourceEditor.py:283
 msgid "Move instance up"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:242
+#: ../etherlab/ConfigEditor.py:655
+msgid "Move process variable down"
+msgstr ""
+
+#: ../etherlab/ConfigEditor.py:654
+msgid "Move process variable up"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:253
 msgid "Move task down"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:241
+#: ../editors/ResourceEditor.py:252
 msgid "Move task up"
 msgstr ""
 
-#: ../IDEFrame.py:99 ../IDEFrame.py:114 ../IDEFrame.py:144 ../IDEFrame.py:185
+#: ../IDEFrame.py:253 ../IDEFrame.py:268 ../IDEFrame.py:298 ../IDEFrame.py:339
 msgid "Move the view"
 msgstr ""
 
-#: ../controls/CustomEditableListBox.py:42
+#: ../controls/CustomEditableListBox.py:45
 msgid "Move up"
 msgstr ""
 
-#: ../editors/CodeFileEditor.py:661 ../controls/VariablePanel.py:453
+#: ../bacnet/BacnetSlaveEditor.py:814 ../editors/CodeFileEditor.py:675
+#: ../controls/VariablePanel.py:486
 msgid "Move variable down"
 msgstr ""
 
-#: ../editors/CodeFileEditor.py:660 ../controls/VariablePanel.py:452
+#: ../bacnet/BacnetSlaveEditor.py:813 ../editors/CodeFileEditor.py:674
+#: ../controls/VariablePanel.py:485
 msgid "Move variable up"
 msgstr ""
 
+#: ../bacnet/BacnetSlaveEditor.py:941
+msgid "Multi-State Input Objects"
+msgstr ""
+
+#: ../bacnet/BacnetSlaveEditor.py:940
+msgid "Multi-State Output Objects"
+msgstr ""
+
+#: ../bacnet/BacnetSlaveEditor.py:939
+msgid "Multi-State Value Objects"
+msgstr ""
+
 #: ../plcopen/iec_std.csv:74
 msgid "Multiplexer (select 1 of N)"
 msgstr ""
@@ -2161,26 +2555,28 @@
 msgid "Multiplication"
 msgstr ""
 
-#: ../editors/FileManagementPanel.py:83
+#: ../editors/FileManagementPanel.py:86
 msgid "My Computer:"
 msgstr ""
 
-#: ../dialogs/DiscoveryDialog.py:92
+#: ../dialogs/DiscoveryDialog.py:89
 msgid "NAME"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:68 ../editors/ResourceEditor.py:83
-#: ../editors/DataTypeEditor.py:50 ../controls/VariablePanel.py:53
-#: ../controls/VariablePanel.py:54
+#: ../etherlab/EtherCATManagementEditor.py:37 ../etherlab/ConfigEditor.py:48
+#: ../etherlab/ConfigEditor.py:343 ../etherlab/ConfigEditor.py:1167
+#: ../editors/ResourceEditor.py:76 ../editors/ResourceEditor.py:94
+#: ../editors/DataTypeEditor.py:55 ../editors/CodeFileEditor.py:751
+#: ../controls/VariablePanel.py:59
 msgid "Name"
 msgstr ""
 
-#: ../Beremiz_service.py:332
+#: ../Beremiz_service.py:355
 msgid "Name must not be null!"
 msgstr ""
 
-#: ../dialogs/SFCStepDialog.py:56 ../dialogs/FBDBlockDialog.py:83
-#: ../dialogs/ConnectionDialog.py:75
+#: ../dialogs/SFCStepDialog.py:59 ../dialogs/FBDBlockDialog.py:89
+#: ../dialogs/ConnectionDialog.py:78
 msgid "Name:"
 msgstr ""
 
@@ -2188,103 +2584,154 @@
 msgid "Natural logarithm"
 msgstr ""
 
-#: ../dialogs/LDElementDialog.py:75 ../editors/Viewer.py:460
+#: ../dialogs/LDElementDialog.py:78 ../editors/Viewer.py:557
 msgid "Negated"
 msgstr ""
 
-#: ../Beremiz_service.py:578
+#: ../etherlab/ConfigEditor.py:612
+msgid "Network"
+msgstr ""
+
+#: ../Beremiz_service.py:620
 msgid "Nevow Web service failed. "
 msgstr ""
 
-#: ../Beremiz_service.py:554
+#: ../Beremiz_service.py:596
 msgid "Nevow/Athena import failed :"
 msgstr ""
 
-#: ../PLCOpenEditor.py:102 ../PLCOpenEditor.py:144 ../Beremiz.py:321
-#: ../Beremiz.py:356
+#: ../BeremizIDE.py:241 ../BeremizIDE.py:276 ../PLCOpenEditor.py:75
+#: ../PLCOpenEditor.py:117
 msgid "New"
 msgstr ""
 
-#: ../controls/CustomEditableListBox.py:40
+#: ../controls/CustomEditableListBox.py:43
 msgid "New item"
 msgstr ""
 
-#: ../editors/Viewer.py:459
+#: ../editors/Viewer.py:556
 msgid "No Modifier"
 msgstr ""
 
-#: ../ProjectController.py:1763
+#: ../ProjectController.py:1891
 msgid "No PLC to transfer (did build succeed ?)\n"
 msgstr ""
 
-#: ../PLCGenerator.py:1631
+#: ../etherlab/EthercatCFileGenerator.py:504
+#, python-format
+msgid "No Sync manager defined for %s!"
+msgstr ""
+
+#: ../PLCGenerator.py:1727
 #, python-format
 msgid "No body defined in \"%s\" POU"
 msgstr ""
 
-#: ../PLCGenerator.py:806 ../PLCGenerator.py:1241
+#: ../etherlab/CommonEtherCATFunction.py:1581
+msgid "No connected slaves"
+msgstr ""
+
+#: ../PLCGenerator.py:816 ../PLCGenerator.py:1330
 #, python-brace-format
 msgid "No connector found corresponding to \"{a1}\" continuation in \"{a2}\" POU"
 msgstr ""
 
-#: ../PLCOpenEditor.py:347
+#: ../PLCOpenEditor.py:331
 msgid ""
 "No documentation available.\n"
 "Coming soon."
 msgstr ""
 
-#: ../PLCGenerator.py:829
+#: ../PLCGenerator.py:841
 #, python-format
 msgid "No informations found for \"%s\" block"
 msgstr ""
 
-#: ../PLCGenerator.py:1194
+#: ../etherlab/EthercatCFileGenerator.py:224
+#, python-format
+msgid "No informations found for device %s!"
+msgstr ""
+
+#: ../etherlab/EthercatCFileGenerator.py:515
+#, python-format
+msgid "No more free PDO index available for %s!"
+msgstr ""
+
+#: ../PLCGenerator.py:1281
 #, python-brace-format
 msgid "No output {a1} variable found in block {a2} in POU {a3}. Connection must be broken"
 msgstr ""
 
-#: ../controls/SearchResultPanel.py:169
+#: ../controls/SearchResultPanel.py:175
 msgid "No search results available."
 msgstr ""
 
-#: ../svgui/svgui.py:131
+#: ../etherlab/ConfigEditor.py:1029
+#, python-format
+msgid "No slave defined at position %d!"
+msgstr ""
+
+#: ../svgui/svgui.py:142
 #, python-format
 msgid "No such SVG file: %s\n"
 msgstr ""
 
-#: ../canfestival/config_utils.py:639
+#: ../etherlab/ConfigEditor.py:1245
+#, python-format
+msgid "No such XML file: %s\n"
+msgstr ""
+
+#: ../canfestival/config_utils.py:682
 #, python-brace-format
 msgid "No such index/subindex ({a1},{a2}) (variable {a3})"
 msgstr ""
 
-#: ../canfestival/config_utils.py:362
+#: ../canfestival/config_utils.py:387
 #, python-brace-format
 msgid "No such index/subindex ({a1},{a2}) in ID : {a3} (variable {a4})"
 msgstr ""
 
-#: ../dialogs/BrowseValuesLibraryDialog.py:83
+#: ../etherlab/EthercatCFileGenerator.py:438
+#, python-format
+msgid "No sync manager available for %s pdo!"
+msgstr ""
+
+#: ../dialogs/BrowseValuesLibraryDialog.py:87
 msgid "No valid value selected!"
 msgstr ""
 
-#: ../PLCGenerator.py:1629
+#: ../PLCGenerator.py:1725
 #, python-format
 msgid "No variable defined in \"%s\" POU"
 msgstr ""
 
-#: ../canfestival/config_utils.py:355
+#: ../etherlab/ConfigEditor.py:606
+#, python-format
+msgid "Node Position: %d"
+msgstr ""
+
+#: ../etherlab/ConfigEditor.py:697
+msgid "Node filter:"
+msgstr ""
+
+#: ../etherlab/ConfigEditor.py:717
+msgid "Nodes variables filter:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:379
 #, python-brace-format
 msgid "Non existing node ID : {a1} (variable {a2})"
 msgstr ""
 
-#: ../controls/VariablePanel.py:64
+#: ../controls/VariablePanel.py:79
 msgid "Non-Retain"
 msgstr ""
 
-#: ../dialogs/LDElementDialog.py:75
+#: ../dialogs/LDElementDialog.py:78
 msgid "Normal"
 msgstr ""
 
-#: ../canfestival/config_utils.py:389
+#: ../canfestival/config_utils.py:426
 #, python-brace-format
 msgid "Not PDO mappable variable : '{a1}' (ID:{a2},Idx:{a3},sIdx:{a4}))"
 msgstr ""
@@ -2293,7 +2740,11 @@
 msgid "Not equal to"
 msgstr ""
 
-#: ../dialogs/SFCDivergenceDialog.py:89
+#: ../etherlab/EtherCATManagementEditor.py:361
+msgid "Now Uploading..."
+msgstr ""
+
+#: ../dialogs/SFCDivergenceDialog.py:91
 msgid "Number of sequences:"
 msgstr ""
 
@@ -2301,323 +2752,362 @@
 msgid "Numerical"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:86
+#: ../bacnet/BacnetSlaveEditor.py:808
+msgid "Object Properties:"
+msgstr ""
+
+#: ../editors/CodeFileEditor.py:755
+msgid "OnChange"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:88
 msgid "Only Elements"
 msgstr ""
 
-#: ../PLCOpenEditor.py:104 ../PLCOpenEditor.py:145 ../Beremiz.py:323
-#: ../Beremiz.py:357
+#: ../BeremizIDE.py:243 ../BeremizIDE.py:277 ../PLCOpenEditor.py:77
+#: ../PLCOpenEditor.py:118
 msgid "Open"
 msgstr ""
 
-#: ../svgui/svgui.py:140
+#: ../svgui/svgui.py:151
 msgid "Open Inkscape"
 msgstr ""
 
-#: ../version.py:66
+#: ../version.py:88
 msgid "Open Source framework for automation, implemented IEC 61131 IDE with constantly growing set of extensions and flexible PLC runtime."
 msgstr ""
 
-#: ../ProjectController.py:1815
+#: ../ProjectController.py:1962
 msgid "Open a file explorer to manage project files"
 msgstr ""
 
-#: ../wxglade_hmi/wxglade_hmi.py:138
+#: ../wxglade_hmi/wxglade_hmi.py:176
 msgid "Open wxGlade"
 msgstr ""
 
-#: ../controls/VariablePanel.py:53 ../controls/VariablePanel.py:54
+#: ../controls/VariablePanel.py:64
 msgid "Option"
 msgstr ""
 
-#: ../dialogs/FindInPouDialog.py:83
+#: ../dialogs/FindInPouDialog.py:84 ../editors/CodeFileEditor.py:756
 msgid "Options"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:97
+#: ../controls/ProjectPropertiesPanel.py:111
 msgid "Organization (optional):"
 msgstr ""
 
-#: ../canfestival/SlaveEditor.py:74 ../canfestival/NetworkEditor.py:95
+#: ../canfestival/SlaveEditor.py:78 ../canfestival/NetworkEditor.py:102
 msgid "Other Profile"
 msgstr ""
 
-#: ../dialogs/SFCStepDialog.py:71 ../dialogs/FBDVariableDialog.py:39
-#: ../dialogs/BrowseLocationsDialog.py:41 ../editors/Viewer.py:289
-#: ../editors/Viewer.py:1579 ../editors/TextViewer.py:307
-#: ../controls/LocationCellEditor.py:98 ../controls/VariablePanel.py:71
-#: ../controls/VariablePanel.py:291 ../controls/VariablePanel.py:351
+#: ../dialogs/SFCStepDialog.py:74 ../dialogs/FBDVariableDialog.py:65
+#: ../dialogs/BrowseLocationsDialog.py:44 ../editors/Viewer.py:333
+#: ../editors/Viewer.py:1663 ../editors/TextViewer.py:307
+#: ../controls/LocationCellEditor.py:103 ../controls/VariablePanel.py:86
+#: ../controls/VariablePanel.py:316 ../controls/VariablePanel.py:379
 msgid "Output"
 msgstr ""
 
-#: ../canfestival/SlaveEditor.py:63 ../canfestival/NetworkEditor.py:84
+#: ../etherlab/EthercatCFileGenerator.py:170
+#, python-brace-format
+msgid "Output variables can't be defined with different locations ({a1} and {a2})"
+msgstr ""
+
+#: ../canfestival/SlaveEditor.py:67 ../canfestival/NetworkEditor.py:91
 msgid "PDO Receive"
 msgstr ""
 
-#: ../canfestival/SlaveEditor.py:62 ../canfestival/NetworkEditor.py:83
+#: ../canfestival/SlaveEditor.py:66 ../canfestival/NetworkEditor.py:90
 msgid "PDO Transmit"
 msgstr ""
 
-#: ../targets/toolchain_gcc.py:131
+#: ../etherlab/etherlab.py:164
+msgid "PDO alignment"
+msgstr ""
+
+#: ../targets/toolchain_gcc.py:174
 msgid "PLC :\n"
 msgstr ""
 
-#: ../Beremiz.py:453
+#: ../BeremizIDE.py:379
 msgid "PLC Log"
 msgstr ""
 
-#: ../ProjectController.py:992
+#: ../ProjectController.py:1129
 msgid "PLC code generation failed !\n"
 msgstr ""
 
-#: ../Beremiz_service.py:295
+#: ../etherlab/EtherCATManagementEditor.py:250
+msgid "PLC is Not Started"
+msgstr ""
+
+#: ../Beremiz_service.py:318
 msgid "PLC is empty or already started."
 msgstr ""
 
-#: ../Beremiz_service.py:302
+#: ../Beremiz_service.py:325
 msgid "PLC is not started."
 msgstr ""
 
-#: ../PLCOpenEditor.py:196 ../PLCOpenEditor.py:309
+#: ../etherlab/EtherCATManagementEditor.py:2160
+#: ../etherlab/CommonEtherCATFunction.py:1589
+msgid "PLC not connected!"
+msgstr ""
+
+#: ../PLCOpenEditor.py:180 ../PLCOpenEditor.py:293
 #, python-brace-format
 msgid ""
 "PLC syntax error at line {a1}:\n"
 "{a2}"
 msgstr ""
 
-#: ../PLCOpenEditor.py:292 ../PLCOpenEditor.py:373
+#: ../PLCOpenEditor.py:276 ../PLCOpenEditor.py:357
 msgid "PLCOpen files (*.xml)|*.xml|All files|*.*"
 msgstr ""
 
-#: ../PLCOpenEditor.py:152 ../PLCOpenEditor.py:209
+#: ../PLCOpenEditor.py:125 ../PLCOpenEditor.py:193
 msgid "PLCOpenEditor"
 msgstr ""
 
-#: ../PLCOpenEditor.py:355
+#: ../PLCOpenEditor.py:339
 msgid ""
 "PLCOpenEditor is part of Beremiz project.\n"
 "\n"
 "Beremiz is an "
 msgstr ""
 
-#: ../dialogs/DiscoveryDialog.py:95
+#: ../dialogs/DiscoveryDialog.py:92
 msgid "PORT"
 msgstr ""
 
-#: ../dialogs/PouDialog.py:100
+#: ../dialogs/PouDialog.py:144
 msgid "POU Name"
 msgstr ""
 
-#: ../dialogs/PouDialog.py:58
+#: ../dialogs/PouDialog.py:64
 msgid "POU Name:"
 msgstr ""
 
-#: ../dialogs/PouDialog.py:102
+#: ../dialogs/PouDialog.py:146
 msgid "POU Type"
 msgstr ""
 
-#: ../dialogs/PouDialog.py:65
+#: ../dialogs/PouDialog.py:71
 msgid "POU Type:"
 msgstr ""
 
-#: ../connectors/PYRO/__init__.py:45
+#: ../connectors/PYRO/__init__.py:53
 #, python-format
 msgid "PYRO connecting to URI : %s\n"
 msgstr ""
 
-#: ../connectors/PYRO/__init__.py:61
+#: ../connectors/PYRO/__init__.py:69
 #, python-format
 msgid "PYRO using certificates in '%s' \n"
 msgstr ""
 
-#: ../PLCOpenEditor.py:118 ../Beremiz.py:336
+#: ../BeremizIDE.py:256 ../PLCOpenEditor.py:91
 msgid "Page Setup"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:110
+#: ../controls/ProjectPropertiesPanel.py:127
 msgid "Page Size (optional):"
 msgstr ""
 
-#: ../IDEFrame.py:2599
+#: ../IDEFrame.py:2660
 #, python-format
 msgid "Page: %d"
 msgstr ""
 
-#: ../controls/PouInstanceVariablesPanel.py:124
+#: ../controls/PouInstanceVariablesPanel.py:134
 msgid "Parent instance"
 msgstr ""
 
-#: ../editors/Viewer.py:598 ../IDEFrame.py:372 ../IDEFrame.py:426
+#: ../editors/Viewer.py:699 ../IDEFrame.py:377 ../IDEFrame.py:429
 msgid "Paste"
 msgstr ""
 
-#: ../IDEFrame.py:1865
+#: ../IDEFrame.py:1916
 msgid "Paste POU"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:56
+#: ../dialogs/SearchInProjectDialog.py:60
 msgid "Pattern to search:"
 msgstr ""
 
-#: ../dialogs/LDPowerRailDialog.py:73
+#: ../dialogs/LDPowerRailDialog.py:75
 msgid "Pin number:"
 msgstr ""
 
-#: ../editors/Viewer.py:2706 ../editors/Viewer.py:2963
-#: ../editors/SFCViewer.py:770
+#: ../runtime/NevowServer.py:163
+msgid "Platform"
+msgstr ""
+
+#: ../editors/Viewer.py:2791 ../editors/Viewer.py:3059
+#: ../editors/SFCViewer.py:785
 msgid "Please choose a target"
 msgstr ""
 
-#: ../editors/TextViewer.py:262
+#: ../editors/TextViewer.py:260
 msgid "Please enter a block name"
 msgstr ""
 
-#: ../editors/Viewer.py:2576 ../editors/Viewer.py:3005
+#: ../dialogs/CommentEditDialog.py:52
 msgid "Please enter comment text"
 msgstr ""
 
-#: ../editors/SFCViewer.py:433 ../editors/SFCViewer.py:455
-#: ../editors/SFCViewer.py:799
+#: ../editors/SFCViewer.py:447 ../editors/SFCViewer.py:469
+#: ../editors/SFCViewer.py:815
 msgid "Please enter step name"
 msgstr ""
 
-#: ../Beremiz_service.py:194
+#: ../dialogs/SFCStepNameDialog.py:37 ../dialogs/PouNameDialog.py:37
+#: ../Beremiz_service.py:222
 msgid "Please enter text"
 msgstr ""
 
-#: ../dialogs/ForceVariableDialog.py:163
+#: ../dialogs/ForceVariableDialog.py:177
 #, python-format
 msgid "Please enter value for a \"%s\" variable:"
 msgstr ""
 
-#: ../Beremiz_service.py:317
+#: ../Beremiz_service.py:340
 msgid "Port number must be 0 <= port <= 65535!"
 msgstr ""
 
-#: ../Beremiz_service.py:317
+#: ../Beremiz_service.py:340
 msgid "Port number must be an integer!"
 msgstr ""
 
-#: ../editors/Viewer.py:536 ../editors/Viewer.py:2367
+#: ../etherlab/ConfigEditor.py:47 ../etherlab/ConfigEditor.py:465
+msgid "Position"
+msgstr ""
+
+#: ../editors/Viewer.py:636 ../editors/Viewer.py:2451
 msgid "Power Rail"
 msgstr ""
 
-#: ../dialogs/LDPowerRailDialog.py:50
+#: ../dialogs/LDPowerRailDialog.py:52
 msgid "Power Rail Properties"
 msgstr ""
 
-#: ../PLCOpenEditor.py:120 ../Beremiz.py:338
+#: ../BeremizIDE.py:258 ../PLCOpenEditor.py:93
 msgid "Preview"
 msgstr ""
 
-#: ../dialogs/BlockPreviewDialog.py:57
+#: ../dialogs/BlockPreviewDialog.py:59
 msgid "Preview:"
 msgstr ""
 
-#: ../PLCOpenEditor.py:122 ../PLCOpenEditor.py:148 ../Beremiz.py:340
-#: ../Beremiz.py:360
+#: ../BeremizIDE.py:260 ../BeremizIDE.py:280 ../PLCOpenEditor.py:95
+#: ../PLCOpenEditor.py:121
 msgid "Print"
 msgstr ""
 
-#: ../IDEFrame.py:1075
+#: ../IDEFrame.py:1123
 msgid "Print preview"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:68
+#: ../editors/ResourceEditor.py:76
 msgid "Priority"
 msgstr ""
 
-#: ../dialogs/SFCTransitionDialog.py:89
+#: ../dialogs/SFCTransitionDialog.py:91
 msgid "Priority:"
 msgstr ""
 
-#: ../runtime/PLCObject.py:370
+#: ../runtime/PLCObject.py:523
 #, python-format
 msgid "Problem starting PLC : error %d"
 msgstr ""
 
-#: ../dialogs/ProjectDialog.py:55
+#: ../etherlab/ConfigEditor.py:647
+msgid "Process variables mapped between nodes:"
+msgstr ""
+
+#: ../dialogs/ProjectDialog.py:61
 msgid "Product Name"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:80
+#: ../controls/ProjectPropertiesPanel.py:91
 msgid "Product Name (required):"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:82
+#: ../controls/ProjectPropertiesPanel.py:93
 msgid "Product Release (optional):"
 msgstr ""
 
-#: ../dialogs/ProjectDialog.py:56
+#: ../dialogs/ProjectDialog.py:62
 msgid "Product Version"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:81
+#: ../controls/ProjectPropertiesPanel.py:92
 msgid "Product Version (required):"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:38 ../IDEFrame.py:1744
-#: ../IDEFrame.py:1941
+#: ../dialogs/SearchInProjectDialog.py:42 ../IDEFrame.py:1795
+#: ../IDEFrame.py:1992
 msgid "Program"
 msgstr ""
 
-#: ../PLCOpenEditor.py:337
+#: ../PLCOpenEditor.py:321
 msgid "Program was successfully generated!"
 msgstr ""
 
-#: ../PLCControler.py:96
+#: ../plcopen/types_enums.py:76
 msgid "Programs"
 msgstr ""
 
-#: ../editors/Viewer.py:242
+#: ../editors/Viewer.py:285
 msgid "Programs can't be used by other POUs!"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:84 ../IDEFrame.py:584
+#: ../controls/ProjectPropertiesPanel.py:95 ../IDEFrame.py:607
 msgid "Project"
 msgstr ""
 
-#: ../controls/SearchResultPanel.py:173
+#: ../controls/SearchResultPanel.py:180
 #, python-format
 msgid "Project '%s':"
 msgstr ""
 
-#: ../ProjectController.py:1814
+#: ../ProjectController.py:1961
 msgid "Project Files"
 msgstr ""
 
-#: ../dialogs/ProjectDialog.py:54
+#: ../dialogs/ProjectDialog.py:60
 msgid "Project Name"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:78
+#: ../controls/ProjectPropertiesPanel.py:89
 msgid "Project Name (required):"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:79
+#: ../controls/ProjectPropertiesPanel.py:90
 msgid "Project Version (optional):"
 msgstr ""
 
-#: ../PLCControler.py:3158
+#: ../PLCControler.py:2717
 msgid ""
 "Project file syntax error:\n"
 "\n"
 msgstr ""
 
-#: ../dialogs/ProjectDialog.py:32 ../editors/ProjectNodeEditor.py:37
+#: ../dialogs/ProjectDialog.py:36 ../editors/ProjectNodeEditor.py:40
 msgid "Project properties"
 msgstr ""
 
-#: ../ConfigTreeNode.py:566
+#: ../ConfigTreeNode.py:571
 #, python-brace-format
 msgid "Project tree layout do not match confnode.xml {a1}!={a2} "
 msgstr ""
 
-#: ../dialogs/ConnectionDialog.py:94
+#: ../dialogs/ConnectionDialog.py:101
 msgid "Propagate Name"
 msgstr ""
 
-#: ../PLCControler.py:97
+#: ../plcopen/types_enums.py:77
 msgid "Properties"
 msgstr ""
 
@@ -2625,69 +3115,77 @@
 msgid "Publishing service on local network"
 msgstr ""
 
-#: ../connectors/PYRO/__init__.py:118
+#: ../connectors/PYRO/__init__.py:127
 #, python-format
 msgid "Pyro exception: %s\n"
 msgstr ""
 
-#: ../Beremiz_service.py:427
-msgid "Pyro object's uri :"
-msgstr ""
-
-#: ../Beremiz_service.py:426
+#: ../Beremiz_service.py:433
 msgid "Pyro port :"
 msgstr ""
 
-#: ../py_ext/PythonEditor.py:81
+#: ../py_ext/PythonEditor.py:84
 msgid "Python code"
 msgstr ""
 
-#: ../features.py:33
+#: ../features.py:23
 msgid "Python file"
 msgstr ""
 
-#: ../dialogs/ActionBlockDialog.py:38
+#: ../dialogs/ActionBlockDialog.py:42
 msgid "Qualifier"
 msgstr ""
 
-#: ../PLCOpenEditor.py:128 ../Beremiz.py:343 ../Beremiz_service.py:273
+#: ../BeremizIDE.py:263 ../PLCOpenEditor.py:101 ../Beremiz_service.py:296
 msgid "Quit"
 msgstr ""
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:225
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:224
 msgid "Range:"
 msgstr ""
 
-#: ../ProjectController.py:1810
+#: ../ProjectController.py:1955
 msgid "Raw IEC code"
 msgstr ""
 
-#: ../Beremiz.py:1143
+#: ../etherlab/ConfigEditor.py:344
+msgid "Read from (nodeid, index, subindex)"
+msgstr ""
+
+#: ../BeremizIDE.py:1080
 #, python-format
 msgid "Really delete node '%s'?"
 msgstr ""
 
-#: ../IDEFrame.py:362 ../IDEFrame.py:422
+#: ../connectors/WAMP/dialog.py:50
+msgid "Realm:"
+msgstr ""
+
+#: ../IDEFrame.py:370 ../IDEFrame.py:425
 msgid "Redo"
 msgstr ""
 
-#: ../dialogs/SFCTransitionDialog.py:74
+#: ../dialogs/SFCTransitionDialog.py:76
 msgid "Reference"
 msgstr ""
 
-#: ../dialogs/DiscoveryDialog.py:106 ../IDEFrame.py:432
+#: ../dialogs/DiscoveryDialog.py:109 ../IDEFrame.py:436
 msgid "Refresh"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:66
+#: ../etherlab/EtherCATManagementEditor.py:1965
+msgid "Register Modify Dialog"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:70
 msgid "Regular expression"
 msgstr ""
 
-#: ../dialogs/FindInPouDialog.py:98
+#: ../dialogs/FindInPouDialog.py:99
 msgid "Regular expressions"
 msgstr ""
 
-#: ../editors/Viewer.py:1556
+#: ../editors/Viewer.py:1638
 msgid "Release value"
 msgstr ""
 
@@ -2695,56 +3193,73 @@
 msgid "Remainder (modulo)"
 msgstr ""
 
-#: ../Beremiz.py:1144
+#: ../BeremizIDE.py:1081
 #, python-format
 msgid "Remove %s node"
 msgstr ""
 
-#: ../IDEFrame.py:2405
+#: ../IDEFrame.py:2463
 msgid "Remove Datatype"
 msgstr ""
 
-#: ../IDEFrame.py:2410
+#: ../IDEFrame.py:2468
 msgid "Remove Pou"
 msgstr ""
 
-#: ../dialogs/ActionBlockDialog.py:138
+#: ../dialogs/ActionBlockDialog.py:144
 msgid "Remove action"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:353
+#: ../editors/DataTypeEditor.py:365
 msgid "Remove element"
 msgstr ""
 
-#: ../editors/FileManagementPanel.py:63
+#: ../etherlab/ConfigEditor.py:1353
+msgid "Remove file from database"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:65
 msgid "Remove file from left folder"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:269
+#: ../etherlab/ConfigEditor.py:1389
+msgid "Remove file from library"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:282
 msgid "Remove instance"
 msgstr ""
 
-#: ../canfestival/NetworkEditor.py:104
+#: ../etherlab/ConfigEditor.py:653
+msgid "Remove process variable"
+msgstr ""
+
+#: ../canfestival/NetworkEditor.py:111
 msgid "Remove slave"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:240
+#: ../etherlab/ConfigEditor.py:680
+msgid "Remove startup service variable"
+msgstr ""
+
+#: ../editors/ResourceEditor.py:251
 msgid "Remove task"
 msgstr ""
 
-#: ../editors/CodeFileEditor.py:659 ../controls/VariablePanel.py:451
+#: ../bacnet/BacnetSlaveEditor.py:812 ../editors/CodeFileEditor.py:673
+#: ../controls/VariablePanel.py:484
 msgid "Remove variable"
 msgstr ""
 
-#: ../IDEFrame.py:1945
+#: ../IDEFrame.py:1996
 msgid "Rename"
 msgstr ""
 
-#: ../editors/FileManagementPanel.py:181
+#: ../editors/FileManagementPanel.py:186
 msgid "Replace File"
 msgstr ""
 
-#: ../editors/Viewer.py:502
+#: ../editors/Viewer.py:601
 msgid "Replace Wire by connections"
 msgstr ""
 
@@ -2752,43 +3267,43 @@
 msgid "Replacement (within)"
 msgstr ""
 
-#: ../dialogs/LDElementDialog.py:76
+#: ../dialogs/LDElementDialog.py:79
 msgid "Reset"
 msgstr ""
 
-#: ../editors/Viewer.py:583
+#: ../editors/Viewer.py:684
 msgid "Reset Execution Order"
 msgstr ""
 
-#: ../IDEFrame.py:451
+#: ../IDEFrame.py:459
 msgid "Reset Perspective"
 msgstr ""
 
-#: ../controls/SearchResultPanel.py:105
+#: ../controls/SearchResultPanel.py:103
 msgid "Reset search result"
 msgstr ""
 
-#: ../PLCControler.py:97 ../Beremiz.py:1075
+#: ../BeremizIDE.py:1012 ../plcopen/types_enums.py:77
 msgid "Resources"
 msgstr ""
 
-#: ../controls/VariablePanel.py:62
+#: ../controls/VariablePanel.py:77
 msgid "Retain"
 msgstr ""
 
-#: ../controls/VariablePanel.py:424
+#: ../controls/VariablePanel.py:457
 msgid "Return Type:"
 msgstr ""
 
-#: ../editors/Viewer.py:487
+#: ../editors/Viewer.py:585
 msgid "Right"
 msgstr ""
 
-#: ../dialogs/LDPowerRailDialog.py:63
+#: ../dialogs/LDPowerRailDialog.py:65
 msgid "Right PowerRail"
 msgstr ""
 
-#: ../dialogs/LDElementDialog.py:77 ../editors/Viewer.py:461
+#: ../dialogs/LDElementDialog.py:80 ../editors/Viewer.py:558
 msgid "Rising Edge"
 msgstr ""
 
@@ -2804,113 +3319,123 @@
 msgid "Rounding up/down"
 msgstr ""
 
-#: ../ProjectController.py:1778
+#: ../ProjectController.py:1911
 msgid "Run"
 msgstr ""
 
-#: ../ProjectController.py:1037
+#: ../ProjectController.py:1175
 msgid "Runtime IO extensions C code generation failed !\n"
 msgstr ""
 
-#: ../ProjectController.py:1046
+#: ../ProjectController.py:1186
 msgid "Runtime library extensions C code generation failed !\n"
 msgstr ""
 
-#: ../canfestival/SlaveEditor.py:61 ../canfestival/NetworkEditor.py:82
+#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:89
 msgid "SDO Client"
 msgstr ""
 
-#: ../canfestival/SlaveEditor.py:60 ../canfestival/NetworkEditor.py:81
+#: ../canfestival/SlaveEditor.py:64 ../canfestival/NetworkEditor.py:88
 msgid "SDO Server"
 msgstr ""
 
-#: ../dialogs/PouDialog.py:36 ../controls/ProjectPropertiesPanel.py:143
+#: ../dialogs/PouDialog.py:128 ../controls/ProjectPropertiesPanel.py:161
 msgid "SFC"
 msgstr ""
 
-#: ../PLCGenerator.py:1392
+#: ../PLCGenerator.py:1482
 #, python-brace-format
 msgid "SFC jump in pou \"{a1}\" refers to non-existent SFC step \"{a2}\""
 msgstr ""
 
-#: ../PLCGenerator.py:773
+#: ../PLCGenerator.py:780
 #, python-format
 msgid "SFC transition in POU \"%s\" must be connected."
 msgstr ""
 
-#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:31
-#: ../dialogs/PouDialog.py:36
+#: ../dialogs/PouTransitionDialog.py:40 ../dialogs/PouActionDialog.py:36
+#: ../dialogs/PouDialog.py:128
 msgid "ST"
 msgstr ""
 
-#: ../PLCOpenEditor.py:324
+#: ../PLCOpenEditor.py:308
 msgid "ST files (*.st)|*.st|All files|*.*"
 msgstr ""
 
-#: ../svgui/svgui.py:125
+#: ../svgui/svgui.py:136
 msgid "SVG files (*.svg)|*.svg|All files|*.*"
 msgstr ""
 
-#: ../features.py:35
+#: ../features.py:25
 msgid "SVGUI"
 msgstr ""
 
-#: ../PLCOpenEditor.py:111 ../PLCOpenEditor.py:146 ../Beremiz.py:327
-#: ../Beremiz.py:358
+#: ../BeremizIDE.py:247 ../BeremizIDE.py:278 ../PLCOpenEditor.py:84
+#: ../PLCOpenEditor.py:119
 msgid "Save"
 msgstr ""
 
-#: ../PLCOpenEditor.py:113 ../PLCOpenEditor.py:147 ../Beremiz.py:359
+#: ../BeremizIDE.py:279 ../PLCOpenEditor.py:86 ../PLCOpenEditor.py:120
 msgid "Save As..."
 msgstr ""
 
-#: ../Beremiz.py:329
+#: ../BeremizIDE.py:249
 msgid "Save as"
 msgstr ""
 
-#: ../ProjectController.py:420
+#: ../etherlab/EtherCATManagementEditor.py:941
+#: ../etherlab/EtherCATManagementEditor.py:1289
+msgid "Save as..."
+msgstr ""
+
+#: ../ProjectController.py:546
 msgid "Save path is the same as path of a project! \n"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:69
+#: ../etherlab/EthercatMaster.py:455 ../etherlab/EthercatMaster.py:764
+#: ../etherlab/EthercatMaster.py:765
+msgid "Scan Network"
+msgstr ""
+
+#: ../dialogs/SearchInProjectDialog.py:73
 msgid "Scope"
 msgstr ""
 
-#: ../IDEFrame.py:623
+#: ../IDEFrame.py:650
 msgid "Search"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:44 ../IDEFrame.py:382 ../IDEFrame.py:428
+#: ../dialogs/SearchInProjectDialog.py:49 ../IDEFrame.py:387 ../IDEFrame.py:431
 msgid "Search in Project"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:46
+#: ../dialogs/DurationEditorDialog.py:60
 msgid "Seconds:"
 msgstr ""
 
-#: ../IDEFrame.py:388
+#: ../IDEFrame.py:393
 msgid "Select All"
 msgstr ""
 
-#: ../editors/Viewer.py:288 ../editors/TextViewer.py:306
-#: ../controls/LocationCellEditor.py:97 ../controls/VariablePanel.py:290
-#: ../controls/VariablePanel.py:350
+#: ../editors/Viewer.py:331 ../editors/TextViewer.py:305
+#: ../controls/LocationCellEditor.py:101 ../controls/VariablePanel.py:314
+#: ../controls/VariablePanel.py:377
 msgid "Select a variable class:"
 msgstr ""
 
-#: ../ProjectController.py:1195
+#: ../ProjectController.py:1354
 msgid "Select an editor:"
 msgstr ""
 
-#: ../controls/PouInstanceVariablesPanel.py:276
+#: ../controls/PouInstanceVariablesPanel.py:292
 msgid "Select an instance"
 msgstr ""
 
-#: ../IDEFrame.py:607
+#: ../IDEFrame.py:634
 msgid "Select an object"
 msgstr ""
 
-#: ../ProjectController.py:427
+#: ../ProjectController.py:555
 msgid "Selected directory already contains another project. Overwrite? \n"
 msgstr ""
 
@@ -2918,23 +3443,31 @@
 msgid "Selection"
 msgstr ""
 
+#: ../dialogs/SFCDivergenceDialog.py:66
+msgid "Selection Convergence"
+msgstr ""
+
 #: ../dialogs/SFCDivergenceDialog.py:65
-msgid "Selection Convergence"
-msgstr ""
-
-#: ../dialogs/SFCDivergenceDialog.py:64
 msgid "Selection Divergence"
 msgstr ""
 
-#: ../dialogs/DiscoveryDialog.py:82
+#: ../runtime/NevowServer.py:182
+msgid "Send"
+msgstr ""
+
+#: ../runtime/NevowServer.py:181
+msgid "Send a message to the log"
+msgstr ""
+
+#: ../dialogs/DiscoveryDialog.py:135
 msgid "Service Discovery"
 msgstr ""
 
-#: ../dialogs/DiscoveryDialog.py:85
+#: ../dialogs/DiscoveryDialog.py:104
 msgid "Services available:"
 msgstr ""
 
-#: ../dialogs/LDElementDialog.py:76
+#: ../dialogs/LDElementDialog.py:79 ../runtime/WampClient.py:434
 msgid "Set"
 msgstr ""
 
@@ -2946,27 +3479,27 @@
 msgid "Shift right"
 msgstr ""
 
-#: ../ProjectController.py:1804
+#: ../ProjectController.py:1946
 msgid "Show IEC code generated by PLCGenerator"
 msgstr ""
 
-#: ../canfestival/canfestival.py:387
+#: ../canfestival/canfestival.py:407
 msgid "Show Master"
 msgstr ""
 
-#: ../canfestival/canfestival.py:388
+#: ../canfestival/canfestival.py:408
 msgid "Show Master generated by config_utils"
 msgstr ""
 
-#: ../ProjectController.py:1802
+#: ../ProjectController.py:1945
 msgid "Show code"
 msgstr ""
 
+#: ../dialogs/SFCDivergenceDialog.py:68
+msgid "Simultaneous Convergence"
+msgstr ""
+
 #: ../dialogs/SFCDivergenceDialog.py:67
-msgid "Simultaneous Convergence"
-msgstr ""
-
-#: ../dialogs/SFCDivergenceDialog.py:66
 msgid "Simultaneous Divergence"
 msgstr ""
 
@@ -2974,15 +3507,23 @@
 msgid "Sine"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:68
+#: ../editors/ResourceEditor.py:76
 msgid "Single"
 msgstr ""
 
-#: ../targets/toolchain_makefile.py:126
+#: ../etherlab/EtherCATManagementEditor.py:361
+msgid "Slave SDO Monitoring"
+msgstr ""
+
+#: ../etherlab/ConfigEditor.py:135
+msgid "Slave entries"
+msgstr ""
+
+#: ../targets/toolchain_makefile.py:130
 msgid "Source didn't change, no build.\n"
 msgstr ""
 
-#: ../PLCGenerator.py:397
+#: ../PLCGenerator.py:404
 #, python-brace-format
 msgid "Source signal has to be defined for single task '{a1}' in resource '{a2}.{a3}'."
 msgstr ""
@@ -2991,60 +3532,76 @@
 msgid "Square root (base 2)"
 msgstr ""
 
-#: ../plcopen/definitions.py:46
+#: ../plcopen/definitions.py:50
 msgid "Standard function blocks"
 msgstr ""
 
-#: ../ProjectController.py:1780 ../Beremiz_service.py:261
+#: ../etherlab/ConfigEditor.py:68
+msgid "Standardized Device Profile"
+msgstr ""
+
+#: ../etherlab/EtherCATManagementEditor.py:37
+msgid "Start Address"
+msgstr ""
+
+#: ../ProjectController.py:1912 ../Beremiz_service.py:284
 msgid "Start PLC"
 msgstr ""
 
-#: ../ProjectController.py:984
+#: ../ProjectController.py:1121
 #, python-format
 msgid "Start build in %s\n"
 msgstr ""
 
-#: ../ProjectController.py:1298
+#: ../runtime/PlcStatus.py:12
 msgid "Started"
 msgstr ""
 
-#: ../ProjectController.py:1586
+#: ../ProjectController.py:1714
 msgid "Starting PLC\n"
 msgstr ""
 
-#: ../Beremiz.py:463
+#: ../etherlab/ConfigEditor.py:674
+msgid "Startup service variables assignments:"
+msgstr ""
+
+#: ../BeremizIDE.py:389
 msgid "Status ToolBar"
 msgstr ""
 
-#: ../editors/Viewer.py:553 ../editors/Viewer.py:2342
+#: ../editors/Viewer.py:654 ../editors/Viewer.py:2426
 msgid "Step"
 msgstr ""
 
-#: ../ProjectController.py:1783
+#: ../ProjectController.py:1918
 msgid "Stop"
 msgstr ""
 
-#: ../Beremiz_service.py:262
+#: ../Beremiz_service.py:285
 msgid "Stop PLC"
 msgstr ""
 
-#: ../ProjectController.py:1785
+#: ../ProjectController.py:1919
 msgid "Stop Running PLC"
 msgstr ""
 
-#: ../ProjectController.py:1299
+#: ../runtime/PlcStatus.py:13
 msgid "Stopped"
 msgstr ""
 
-#: ../ProjectController.py:1558
-msgid "Stopping debugger...\n"
-msgstr ""
-
-#: ../editors/DataTypeEditor.py:54
+#: ../editors/DataTypeEditor.py:60
 msgid "Structure"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:54
+#: ../etherlab/ConfigEditor.py:48
+msgid "SubIndex"
+msgstr ""
+
+#: ../etherlab/ConfigEditor.py:465
+msgid "Subindex"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:60
 msgid "Subrange"
 msgstr ""
 
@@ -3052,19 +3609,19 @@
 msgid "Subtraction"
 msgstr ""
 
-#: ../ProjectController.py:1023
+#: ../ProjectController.py:1160
 msgid "Successfully built.\n"
 msgstr ""
 
-#: ../IDEFrame.py:447
+#: ../IDEFrame.py:451
 msgid "Switch perspective"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:165 ../dialogs/FindInPouDialog.py:172
+#: ../dialogs/SearchInProjectDialog.py:169 ../dialogs/FindInPouDialog.py:118
 msgid "Syntax error in regular expression of pattern to search!"
 msgstr ""
 
-#: ../dialogs/DiscoveryDialog.py:93
+#: ../dialogs/DiscoveryDialog.py:90
 msgid "TYPE"
 msgstr ""
 
@@ -3072,49 +3629,72 @@
 msgid "Tangent"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:83
+#: ../editors/ResourceEditor.py:94
 msgid "Task"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:235
+#: ../editors/ResourceEditor.py:246
 msgid "Tasks:"
 msgstr ""
 
-#: ../controls/VariablePanel.py:73
+#: ../controls/VariablePanel.py:88
 msgid "Temp"
 msgstr ""
 
-#: ../editors/FileManagementPanel.py:180
+#: ../version.py:37
+msgid ""
+"The best place to ask questions about Beremiz/PLCOpenEditor\n"
+"is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+"\n"
+"This is the main community support channel.\n"
+"For posting it is required to be subscribed to the mailing list.\n"
+"\n"
+"You can subscribe to the list here:\n"
+"https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+msgstr ""
+
+#: ../etherlab/EthercatMaster.py:454
+msgid ""
+"The current network configuration will be deleted.\n"
+"Do you want to continue?"
+msgstr ""
+
+#: ../editors/FileManagementPanel.py:185
 #, python-format
 msgid ""
 "The file '%s' already exist.\n"
 "Do you want to replace it?"
 msgstr ""
 
-#: ../editors/LDViewer.py:882
+#: ../etherlab/EtherCATManagementEditor.py:928
+#: ../etherlab/EtherCATManagementEditor.py:1320
+msgid "The file does not exist!"
+msgstr ""
+
+#: ../editors/LDViewer.py:893
 msgid "The group of block must be coherent!"
 msgstr ""
 
-#: ../Beremiz.py:640 ../IDEFrame.py:1011
+#: ../BeremizIDE.py:569 ../IDEFrame.py:1059
 msgid "There are changes, do you want to save?"
 msgstr ""
 
-#: ../IDEFrame.py:1655 ../IDEFrame.py:1674
+#: ../IDEFrame.py:1708 ../IDEFrame.py:1727
 #, python-format
 msgid "There is a POU named \"%s\". This could cause a conflict. Do you wish to continue?"
 msgstr ""
 
-#: ../IDEFrame.py:1098
+#: ../IDEFrame.py:1146
 msgid ""
 "There was a problem printing.\n"
 "Perhaps your current printer is not set correctly?"
 msgstr ""
 
-#: ../editors/LDViewer.py:891
+#: ../editors/LDViewer.py:902
 msgid "This option isn't available yet!"
 msgstr ""
 
-#: ../controls/DebugVariablePanel/DebugVariablePanel.py:565
+#: ../controls/DebugVariablePanel/DebugVariablePanel.py:546
 #, python-format
 msgid "Tick: %d"
 msgstr ""
@@ -3152,85 +3732,93 @@
 msgid "Time-of-day subtraction"
 msgstr ""
 
-#: ../editors/Viewer.py:489
+#: ../IDEFrame.py:432
+msgid "Toggle fullscreen mode"
+msgstr ""
+
+#: ../dialogs/ForceVariableDialog.py:188
+msgid "Toggle value"
+msgstr ""
+
+#: ../editors/Viewer.py:587
 msgid "Top"
 msgstr ""
 
-#: ../ProjectController.py:1792
+#: ../ProjectController.py:1931
 msgid "Transfer"
 msgstr ""
 
-#: ../ProjectController.py:1794
+#: ../ProjectController.py:1932
 msgid "Transfer PLC"
 msgstr ""
 
-#: ../ProjectController.py:1758
+#: ../ProjectController.py:1884
 msgid "Transfer completed successfully.\n"
 msgstr ""
 
-#: ../ProjectController.py:1760
+#: ../ProjectController.py:1887
 msgid "Transfer failed\n"
 msgstr ""
 
-#: ../editors/Viewer.py:554 ../editors/Viewer.py:2344 ../editors/Viewer.py:2371
+#: ../editors/Viewer.py:655 ../editors/Viewer.py:2428 ../editors/Viewer.py:2455
 msgid "Transition"
 msgstr ""
 
-#: ../PLCGenerator.py:1518
+#: ../PLCGenerator.py:1613
 #, python-format
 msgid "Transition \"%s\" body must contain an output variable or coil referring to its name"
 msgstr ""
 
-#: ../dialogs/PouTransitionDialog.py:89
+#: ../dialogs/PouTransitionDialog.py:90
 msgid "Transition Name"
 msgstr ""
 
-#: ../dialogs/PouTransitionDialog.py:58
+#: ../dialogs/PouTransitionDialog.py:59
 msgid "Transition Name:"
 msgstr ""
 
-#: ../PLCGenerator.py:1609
+#: ../PLCGenerator.py:1706
 #, python-brace-format
 msgid "Transition with content \"{a1}\" not connected to a next step in \"{a2}\" POU"
 msgstr ""
 
-#: ../PLCGenerator.py:1598
+#: ../PLCGenerator.py:1695
 #, python-brace-format
 msgid "Transition with content \"{a1}\" not connected to a previous step in \"{a2}\" POU"
 msgstr ""
 
-#: ../plcopen/plcopen.py:1318
+#: ../plcopen/plcopen.py:1526
 #, python-format
 msgid "Transition with name %s doesn't exist!"
 msgstr ""
 
-#: ../PLCControler.py:96
+#: ../plcopen/types_enums.py:76
 msgid "Transitions"
 msgstr ""
 
-#: ../dialogs/AboutDialog.py:123
+#: ../dialogs/AboutDialog.py:127
 msgid "Translated by"
 msgstr ""
 
-#: ../editors/ResourceEditor.py:68
+#: ../editors/ResourceEditor.py:76
 msgid "Triggering"
 msgstr ""
 
-#: ../Beremiz_service.py:476
+#: ../Beremiz_service.py:503
 msgid "Twisted unavailable."
 msgstr ""
 
-#: ../dialogs/ActionBlockDialog.py:38 ../editors/ResourceEditor.py:83
-#: ../editors/DataTypeEditor.py:50 ../controls/VariablePanel.py:53
-#: ../controls/VariablePanel.py:54
+#: ../dialogs/ActionBlockDialog.py:42 ../etherlab/ConfigEditor.py:48
+#: ../editors/ResourceEditor.py:94 ../editors/DataTypeEditor.py:55
+#: ../editors/CodeFileEditor.py:752 ../controls/VariablePanel.py:61
 msgid "Type"
 msgstr ""
 
-#: ../dialogs/BrowseLocationsDialog.py:48
+#: ../dialogs/BrowseLocationsDialog.py:51
 msgid "Type and derivated"
 msgstr ""
 
-#: ../canfestival/config_utils.py:336 ../canfestival/config_utils.py:624
+#: ../canfestival/config_utils.py:359 ../canfestival/config_utils.py:666
 #, python-format
 msgid "Type conflict for location \"%s\""
 msgstr ""
@@ -3239,267 +3827,430 @@
 msgid "Type conversion"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:162
+#: ../editors/DataTypeEditor.py:170
 msgid "Type infos:"
 msgstr ""
 
-#: ../dialogs/BrowseLocationsDialog.py:49
+#: ../etherlab/EthercatCFileGenerator.py:76
+#, python-format
+msgid "Type of location \"%s\" not yet supported!"
+msgstr ""
+
+#: ../dialogs/BrowseLocationsDialog.py:52
 msgid "Type strict"
 msgstr ""
 
-#: ../dialogs/SFCDivergenceDialog.py:59 ../dialogs/SFCTransitionDialog.py:57
-#: ../dialogs/LDPowerRailDialog.py:56 ../dialogs/BrowseLocationsDialog.py:99
-#: ../dialogs/FBDBlockDialog.py:65 ../dialogs/ConnectionDialog.py:58
+#: ../dialogs/SFCDivergenceDialog.py:60 ../dialogs/SFCTransitionDialog.py:59
+#: ../dialogs/LDPowerRailDialog.py:58 ../dialogs/BrowseLocationsDialog.py:110
+#: ../dialogs/FBDBlockDialog.py:69 ../dialogs/ConnectionDialog.py:61
 msgid "Type:"
 msgstr ""
 
-#: ../canfestival/config_utils.py:462 ../canfestival/config_utils.py:476
+#: ../runtime/WampClient.py:129
+msgid "TypeError register option: {}"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:39 ../connectors/WAMP/dialog.py:42
+msgid "URI host:"
+msgstr ""
+
+#: ../connectors/PYRO/dialog.py:43 ../connectors/WAMP/dialog.py:46
+msgid "URI port:"
+msgstr ""
+
+#: ../controls/UriLocationEditor.py:35
+msgid "URI type:"
+msgstr ""
+
+#: ../canfestival/config_utils.py:500 ../canfestival/config_utils.py:515
 #, python-format
 msgid "Unable to define PDO mapping for node %02x"
 msgstr ""
 
-#: ../targets/Xenomai/__init__.py:39
+#: ../targets/Xenomai/__init__.py:43
 #, python-format
 msgid "Unable to get Xenomai's %s \n"
 msgstr ""
 
-#: ../PLCGenerator.py:961 ../PLCGenerator.py:1214
+#: ../bacnet/bacnet.py:430
+#, python-format
+msgid "Unable to load file \"%s\"!"
+msgstr ""
+
+#: ../bacnet/bacnet.py:420
+#, python-format
+msgid "Unable to save to file \"%s\"!"
+msgstr ""
+
+#: ../PLCGenerator.py:1023 ../PLCGenerator.py:1301
 #, python-brace-format
 msgid "Undefined block type \"{a1}\" in \"{a2}\" POU"
 msgstr ""
 
-#: ../PLCGenerator.py:254
+#: ../PLCGenerator.py:261
 #, python-format
 msgid "Undefined pou type \"%s\""
 msgstr ""
 
-#: ../IDEFrame.py:360 ../IDEFrame.py:421
+#: ../IDEFrame.py:368 ../IDEFrame.py:424
 msgid "Undo"
 msgstr ""
 
-#: ../ProjectController.py:332
+#: ../ProjectController.py:457
 msgid "Unknown"
 msgstr ""
 
-#: ../editors/Viewer.py:393
+#: ../etherlab/EthercatCFileGenerator.py:470
+#, python-brace-format
+msgid "Unknown entry index 0x{a1:.4x}, subindex 0x{a2:.2x} for device {a3}"
+msgstr ""
+
+#: ../editors/Viewer.py:437
 #, python-format
 msgid "Unknown variable \"%s\" for this POU!"
 msgstr ""
 
-#: ../ProjectController.py:329 ../ProjectController.py:330
+#: ../ProjectController.py:454 ../ProjectController.py:455
 msgid "Unnamed"
 msgstr ""
 
-#: ../PLCControler.py:636
+#: ../PLCControler.py:263
 #, python-format
 msgid "Unnamed%d"
 msgstr ""
 
-#: ../controls/VariablePanel.py:284
+#: ../controls/VariablePanel.py:307
 #, python-format
 msgid "Unrecognized data size \"%s\""
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:632 ../controls/VariablePanel.py:798
+#: ../etherlab/EtherCATManagementEditor.py:2080
+msgid "Update"
+msgstr ""
+
+#: ../runtime/WampClient.py:380
+msgid "Upload:"
+msgstr ""
+
+#: ../editors/DataTypeEditor.py:646 ../controls/VariablePanel.py:852
 msgid "User Data Types"
 msgstr ""
 
-#: ../canfestival/SlaveEditor.py:65 ../canfestival/NetworkEditor.py:86
+#: ../canfestival/SlaveEditor.py:69 ../canfestival/NetworkEditor.py:93
 msgid "User Type"
 msgstr ""
 
-#: ../PLCControler.py:95
+#: ../plcopen/types_enums.py:75
 msgid "User-defined POUs"
 msgstr ""
 
-#: ../dialogs/ActionBlockDialog.py:38
+#: ../dialogs/ActionBlockDialog.py:42 ../etherlab/ConfigEditor.py:465
 msgid "Value"
 msgstr ""
 
-#: ../editors/DataTypeEditor.py:259
+#: ../editors/DataTypeEditor.py:267
 msgid "Values:"
 msgstr ""
 
-#: ../dialogs/ActionBlockDialog.py:42 ../editors/Viewer.py:526
-#: ../editors/Viewer.py:2374
+#: ../dialogs/ActionBlockDialog.py:47 ../editors/Viewer.py:625
+#: ../editors/Viewer.py:2458
 msgid "Variable"
 msgstr ""
 
-#: ../editors/Viewer.py:308 ../editors/Viewer.py:338 ../editors/Viewer.py:360
-#: ../editors/TextViewer.py:292 ../editors/TextViewer.py:343
-#: ../editors/TextViewer.py:366 ../controls/VariablePanel.py:329
+#: ../editors/Viewer.py:352 ../editors/Viewer.py:382 ../editors/Viewer.py:404
+#: ../editors/TextViewer.py:290 ../editors/TextViewer.py:344
+#: ../editors/TextViewer.py:367 ../controls/VariablePanel.py:354
 msgid "Variable Drop"
 msgstr ""
 
-#: ../dialogs/FBDVariableDialog.py:63
+#: ../etherlab/ConfigEditor.py:70
+#, python-format
+msgid "Variable Index: #x%4.4X"
+msgstr ""
+
+#: ../dialogs/FBDVariableDialog.py:58
 msgid "Variable Properties"
 msgstr ""
 
-#: ../editors/Viewer.py:288 ../editors/TextViewer.py:306
-#: ../controls/LocationCellEditor.py:97 ../controls/VariablePanel.py:290
-#: ../controls/VariablePanel.py:350
+#: ../editors/Viewer.py:332 ../editors/TextViewer.py:306
+#: ../controls/LocationCellEditor.py:102 ../controls/VariablePanel.py:315
+#: ../controls/VariablePanel.py:378
 msgid "Variable class"
 msgstr ""
 
-#: ../editors/Viewer.py:395 ../editors/TextViewer.py:387
+#: ../editors/Viewer.py:439 ../editors/TextViewer.py:388
 msgid "Variable don't belong to this POU!"
 msgstr ""
 
-#: ../dialogs/LDElementDialog.py:89
+#: ../etherlab/ConfigEditor.py:280
+msgid "Variable entries:"
+msgstr ""
+
+#: ../dialogs/LDElementDialog.py:92
 msgid "Variable:"
 msgstr ""
 
-#: ../controls/VariablePanel.py:72
+#: ../controls/VariablePanel.py:87
 msgid "Variables"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:151
+#: ../controls/ProjectPropertiesPanel.py:169
 msgid "Vertical:"
 msgstr ""
 
-#: ../Beremiz_service.py:586
+#: ../runtime/WampClient.py:170
+#, python-format
+msgid "WAMP Client connection failed (%s) .. retrying .."
+msgstr ""
+
+#: ../runtime/WampClient.py:179
+#, python-format
+msgid "WAMP Client connection lost (%s) .. retrying .."
+msgstr ""
+
+#: ../connectors/WAMP/dialog.py:54
+msgid "WAMP ID:"
+msgstr ""
+
+#: ../runtime/WampClient.py:413
+msgid "WAMP Server URL"
+msgstr ""
+
+#: ../runtime/WampClient.py:276
+msgid "WAMP authentication has no secret configured"
+msgstr ""
+
+#: ../runtime/WampClient.py:304
+msgid "WAMP client can not connect to :"
+msgstr ""
+
+#: ../runtime/WampClient.py:301
+msgid "WAMP client connecting to :"
+msgstr ""
+
+#: ../Beremiz_service.py:628
 msgid "WAMP client startup failed. "
 msgstr ""
 
-#: ../connectors/WAMP/__init__.py:91
+#: ../runtime/WampClient.py:206
+msgid "WAMP configuration error : missing '{}' parameter."
+msgstr ""
+
+#: ../runtime/WampClient.py:192
+msgid "WAMP configuration error:"
+msgstr ""
+
+#: ../connectors/WAMP/__init__.py:100
 #, python-format
 msgid "WAMP connecting to URL : %s\n"
 msgstr ""
 
-#: ../connectors/WAMP/__init__.py:131
+#: ../connectors/WAMP/__init__.py:141
 msgid "WAMP connection timeout"
 msgstr ""
 
-#: ../connectors/WAMP/__init__.py:150
+#: ../connectors/WAMP/__init__.py:159
 #, python-format
 msgid "WAMP connection to '%s' failed.\n"
 msgstr ""
 
-#: ../Beremiz_service.py:562
+#: ../runtime/WampClient.py:280
+msgid "WAMP deactivated in configuration"
+msgstr ""
+
+#: ../Beremiz_service.py:605
 msgid "WAMP import failed :"
 msgstr ""
 
-#: ../wxglade_hmi/wxglade_hmi.py:35
+#: ../runtime/WampClient.py:241
+msgid "WAMP secret empty"
+msgstr ""
+
+#: ../runtime/WampClient.py:139
+#, python-format
+msgid "WAMP session joined (%s) by:"
+msgstr ""
+
+#: ../runtime/WampClient.py:146
+msgid "WAMP session left"
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:44
 msgid "WXGLADE GUI"
 msgstr ""
 
-#: ../dialogs/PouDialog.py:128 ../editors/LDViewer.py:891
+#: ../runtime/WampClient.py:432
+msgid "Wamp Settings"
+msgstr ""
+
+#: ../dialogs/PouDialog.py:172 ../editors/LDViewer.py:902
 msgid "Warning"
 msgstr ""
 
-#: ../ProjectController.py:616
+#: ../etherlab/EthercatCFileGenerator.py:405
+#: ../etherlab/EthercatCFileGenerator.py:571
+msgid "Warning: "
+msgstr ""
+
+#: ../wxglade_hmi/wxglade_hmi.py:166
+msgid "Warning: WxGlade HMI has no object with name identical to extension name, and no python code is provided in start section to create object.\n"
+msgstr ""
+
+#: ../ProjectController.py:756
 msgid "Warnings in ST/IL/SFC code generator :\n"
 msgstr ""
 
-#: ../dialogs/SearchInProjectDialog.py:78
+#: ../dialogs/SearchInProjectDialog.py:82
 msgid "Whole Project"
 msgstr ""
 
-#: ../controls/ProjectPropertiesPanel.py:119
+#: ../controls/ProjectPropertiesPanel.py:137
 msgid "Width:"
 msgstr ""
 
-#: ../dialogs/FindInPouDialog.py:93
+#: ../dialogs/FindInPouDialog.py:94
 msgid "Wrap search"
 msgstr ""
 
-#: ../dialogs/AboutDialog.py:122
+#: ../etherlab/ConfigEditor.py:345
+msgid "Write to (nodeid, index, subindex)"
+msgstr ""
+
+#: ../dialogs/AboutDialog.py:126
 msgid "Written by"
 msgstr ""
 
-#: ../features.py:34
+#: ../etherlab/EthercatCFileGenerator.py:409
+#: ../etherlab/EthercatCFileGenerator.py:499
+#, python-format
+msgid "Wrong direction for location \"%s\"!"
+msgstr ""
+
+#: ../etherlab/EthercatCFileGenerator.py:400
+#: ../etherlab/EthercatCFileGenerator.py:487
+#, python-format
+msgid "Wrong type for location \"%s\"!"
+msgstr ""
+
+#: ../features.py:24
 msgid "WxGlade GUI"
 msgstr ""
 
-#: ../svgui/svgui.py:139
+#: ../etherlab/ConfigEditor.py:1236
+msgid "XML files (*.xml)|*.xml|All files|*.*"
+msgstr ""
+
+#: ../etherlab/EtherCATManagementEditor.py:652
+msgid "You can input only hex, dec value"
+msgstr ""
+
+#: ../etherlab/EtherCATManagementEditor.py:1999
+msgid "You can't modify it. This register is read-only or it's not connected."
+msgstr ""
+
+#: ../etherlab/EtherCATManagementEditor.py:648
+msgid "You cannot SDO download this state"
+msgstr ""
+
+#: ../svgui/svgui.py:150
 msgid ""
 "You don't have write permissions.\n"
 "Open Inkscape anyway ?"
 msgstr ""
 
-#: ../wxglade_hmi/wxglade_hmi.py:137
+#: ../wxglade_hmi/wxglade_hmi.py:175
 msgid ""
 "You don't have write permissions.\n"
 "Open wxGlade anyway ?"
 msgstr ""
 
-#: ../ProjectController.py:292
+#: ../etherlab/EtherCATManagementEditor.py:2002
+msgid "You entered wrong value. You can enter dec or hex value only."
+msgstr ""
+
+#: ../ProjectController.py:403
 msgid ""
 "You must have permission to work on the project\n"
 "Work on a project copy ?"
 msgstr ""
 
-#: ../editors/LDViewer.py:886
+#: ../editors/LDViewer.py:897
 msgid "You must select the block or group of blocks around which a branch should be added!"
 msgstr ""
 
-#: ../editors/LDViewer.py:666
+#: ../editors/LDViewer.py:677
 msgid "You must select the wire where a contact should be added!"
 msgstr ""
 
-#: ../dialogs/SFCStepNameDialog.py:48 ../dialogs/PouNameDialog.py:46
+#: ../dialogs/SFCStepNameDialog.py:52 ../dialogs/PouNameDialog.py:50
 msgid "You must type a name!"
 msgstr ""
 
-#: ../dialogs/ForceVariableDialog.py:175
+#: ../dialogs/ForceVariableDialog.py:209
 msgid "You must type a value!"
 msgstr ""
 
-#: ../IDEFrame.py:438
+#: ../IDEFrame.py:442
 msgid "Zoom"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:151
+#: ../etherlab/EtherCATManagementEditor.py:911
+#: ../etherlab/EtherCATManagementEditor.py:1307
+msgid "bin files (*.bin)|*.bin"
+msgstr ""
+
+#: ../etherlab/EtherCATManagementEditor.py:942
+#: ../etherlab/EtherCATManagementEditor.py:1290
+msgid "bin files (*.bin)|*.bin|All files|*.*"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:159
 msgid "days"
 msgstr ""
 
-#: ../PLCOpenEditor.py:333
+#: ../PLCOpenEditor.py:317
 #, python-format
 msgid "error: %s\n"
 msgstr ""
 
-#: ../util/ProcessLogger.py:169
+#: ../util/ProcessLogger.py:178
 #, python-brace-format
 msgid "exited with status {a1} (pid {a2})\n"
 msgstr ""
 
-#: ../PLCOpenEditor.py:396 ../PLCOpenEditor.py:398
-msgid "file : "
-msgstr ""
-
-#: ../dialogs/PouDialog.py:31
+#: ../dialogs/PouDialog.py:110
 msgid "function"
 msgstr ""
 
-#: ../PLCOpenEditor.py:399
-msgid "function : "
-msgstr ""
-
-#: ../dialogs/PouDialog.py:31
+#: ../dialogs/PouDialog.py:110
 msgid "functionBlock"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:151
+#: ../dialogs/DurationEditorDialog.py:159
 msgid "hours"
 msgstr ""
 
-#: ../PLCOpenEditor.py:399
-msgid "line : "
-msgstr ""
-
-#: ../dialogs/DurationEditorDialog.py:153
+#: ../ProjectController.py:784
+msgid "matiec installation is not found\n"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:162
+msgid "microseconds"
+msgstr ""
+
+#: ../dialogs/DurationEditorDialog.py:161
 msgid "milliseconds"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:152
+#: ../dialogs/DurationEditorDialog.py:160
 msgid "minutes"
 msgstr ""
 
-#: ../dialogs/PouDialog.py:31
+#: ../dialogs/PouDialog.py:110
 msgid "program"
 msgstr ""
 
-#: ../dialogs/DurationEditorDialog.py:152
+#: ../dialogs/DurationEditorDialog.py:160
 msgid "seconds"
 msgstr ""
 
@@ -3515,24 +4266,28 @@
 msgid "string right of"
 msgstr ""
 
-#: ../Beremiz.py:126
+#: ../etherlab/EtherCATManagementEditor.py:323
+msgid "update"
+msgstr ""
+
+#: ../Beremiz.py:167
 msgid "update info unavailable."
 msgstr ""
 
-#: ../PLCOpenEditor.py:331
+#: ../PLCOpenEditor.py:315
 #, python-format
 msgid "warning: %s\n"
 msgstr ""
 
-#: ../PLCControler.py:970
+#: ../PLCControler.py:576
 #, python-brace-format
 msgid "{a1} \"{a2}\" can't be pasted as a {a3}."
 msgstr ""
 
-#: ../ConfigTreeNode.py:56
+#: ../ConfigTreeNode.py:58
 #, python-brace-format
 msgid ""
-"{a1} XML file doesn't follow XSD schema at line %{a2}:\n"
+"{a1} XML file doesn't follow XSD schema at line {a2}:\n"
 "{a3}"
 msgstr ""
 
@@ -3569,6 +4324,33 @@
 msgid "CAN_Driver"
 msgstr ""
 
+msgid "BACnetServerNode"
+msgstr ""
+
+msgid "Network_Interface"
+msgstr ""
+
+msgid "UDP_Port_Number"
+msgstr ""
+
+msgid "BACnet_Communication_Control_Password"
+msgstr ""
+
+msgid "BACnet_Device_ID"
+msgstr ""
+
+msgid "BACnet_Device_Name"
+msgstr ""
+
+msgid "BACnet_Device_Location"
+msgstr ""
+
+msgid "BACnet_Device_Description"
+msgstr ""
+
+msgid "BACnet_Device_Application_Software_Version"
+msgstr ""
+
 msgid "Generic"
 msgstr ""
 
@@ -3593,15 +4375,96 @@
 msgid "LDFLAGS"
 msgstr ""
 
-msgid "PLC"
-msgstr ""
-
 msgid "Linux"
 msgstr ""
 
 msgid "Win32"
 msgstr ""
 
+msgid "ModbusRequest"
+msgstr ""
+
+msgid "SlaveID"
+msgstr ""
+
+msgid "Nr_of_Channels"
+msgstr ""
+
+msgid "Start_Address"
+msgstr ""
+
+msgid "Timeout_in_ms"
+msgstr ""
+
+msgid "MemoryArea"
+msgstr ""
+
+msgid "MemoryAreaType"
+msgstr ""
+
+msgid "ModbusTCPclient"
+msgstr ""
+
+msgid "Remote_IP_Address"
+msgstr ""
+
+msgid "Remote_Port_Number"
+msgstr ""
+
+msgid "Invocation_Rate_in_ms"
+msgstr ""
+
+msgid "ModbusServerNode"
+msgstr ""
+
+msgid "Local_IP_Address"
+msgstr ""
+
+msgid "Local_Port_Number"
+msgstr ""
+
+msgid "ModbusRTUclient"
+msgstr ""
+
+msgid "Serial_Port"
+msgstr ""
+
+msgid "Baud_Rate"
+msgstr ""
+
+msgid "Parity"
+msgstr ""
+
+msgid "Stop_Bits"
+msgstr ""
+
+msgid "ModbusRTUslave"
+msgstr ""
+
+msgid "ModbusRoot"
+msgstr ""
+
+msgid "MaxRemoteTCPclients"
+msgstr ""
+
+msgid "CIA402SlaveParams"
+msgstr ""
+
+msgid "Enable%s"
+msgstr ""
+
+msgid "ProcessVariables"
+msgstr ""
+
+msgid "variable"
+msgstr ""
+
+msgid "ReadFrom"
+msgstr ""
+
+msgid "WriteTo"
+msgstr ""
+
 msgid "BaseParams"
 msgstr ""
 
@@ -3632,9 +4495,6 @@
 msgid "variables"
 msgstr ""
 
-msgid "variable"
-msgstr ""
-
 msgid "name"
 msgstr ""
 
@@ -3767,7 +4627,7 @@
 msgid "The RS bistable is a latch where the Reset dominates."
 msgstr ""
 
-msgid "The semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources."
+msgid "The semaphore provides a mechanism to allow software elements mutually exclusive access to certain resources."
 msgstr ""
 
 msgid "The output produces a single pulse when a rising edge is detected."
--- a/i18n/mki18n.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/i18n/mki18n.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,498 +1,525 @@
-#! /usr/bin/env python
-# -*- coding: iso-8859-1 -*-
-# 
-#   PYTHON MODULE:     MKI18N.PY
-#                      =========
-# 
-#   Abstract:         Make Internationalization (i18n) files for an application.
-# 
-#   Copyright Pierre Rouleau. 2003. Released to public domain.
-# 
-#   Last update: Saturday, November 8, 2003. @ 15:55:18.
-# 
-#   File: ROUP2003N01::C:/dev/python/mki18n.py
-# 
-#   RCS $Header: //software/official/MKS/MKS_SI/TV_NT/dev/Python/rcs/mki18n.py 1.5 2003/11/05 19:40:04 PRouleau Exp $
-# 
-#   Update history:
-# 
-#   - File created: Saturday, June 7, 2003. by Pierre Rouleau
-#   - 10/06/03 rcs : RCS Revision 1.1  2003/06/10 10:06:12  PRouleau
-#   - 10/06/03 rcs : RCS Initial revision
-#   - 23/08/03 rcs : RCS Revision 1.2  2003/06/10 10:54:27  PRouleau
-#   - 23/08/03 P.R.: [code:fix] : The strings encoded in this file are encode in iso-8859-1 format.  Added the encoding
-#                    notification to Python to comply with Python's 2.3 PEP 263.
-#   - 23/08/03 P.R.: [feature:new] : Added the '-e' switch which is used to force the creation of the empty English .mo file.
-#   - 22/10/03 P.R.: [code] : incorporated utility functions in here to make script self sufficient.
-#   - 05/11/03 rcs : RCS Revision 1.4  2003/10/22 06:39:31  PRouleau
-#   - 05/11/03 P.R.: [code:fix] : included the unixpath() in this file.
-#   - 08/11/03 rcs : RCS Revision 1.5  2003/11/05 19:40:04  PRouleau
-# 
-#   RCS $Log: $
-# 
-# 
-# -----------------------------------------------------------------------------
-"""                                
-mki18n allows you to internationalize your software.  You can use it to 
-create the GNU .po files (Portable Object) and the compiled .mo files
-(Machine Object).
-
-mki18n module can be used from the command line or from within a script (see 
-the Usage at the end of this page).
-
-    Table of Contents
-    -----------------
-    
-    makePO()             -- Build the Portable Object file for the application --
-    catPO()              -- Concatenate one or several PO files with the application domain files. --
-    makeMO()             -- Compile the Portable Object files into the Machine Object stored in the right location. --
-    printUsage           -- Displays how to use this script from the command line --
-
-    Scriptexecution      -- Runs when invoked from the command line --
-
-
-NOTE:  this module uses GNU gettext utilities.
-
-You can get the gettext tools from the following sites:
-
-   - `GNU FTP site for gettetx`_ where several versions (0.10.40, 0.11.2, 0.11.5 and 0.12.1) are available.
-     Note  that you need to use `GNU libiconv`_ to use this. Get it from the `GNU
-     libiconv  ftp site`_ and get version 1.9.1 or later. Get the Windows .ZIP
-     files and install the packages inside c:/gnu. All binaries will be stored
-     inside  c:/gnu/bin.  Just  put c:/gnu/bin inside your PATH. You will need
-     the following files: 
-
-      - `gettext-runtime-0.12.1.bin.woe32.zip`_ 
-      - `gettext-tools-0.12.1.bin.woe32.zip`_
-      - `libiconv-1.9.1.bin.woe32.zip`_ 
-
-
-.. _GNU libiconv:                            http://www.gnu.org/software/libiconv/
-.. _GNU libiconv ftp site:                   http://www.ibiblio.org/pub/gnu/libiconv/
-.. _gettext-runtime-0.12.1.bin.woe32.zip:    ftp://ftp.gnu.org/gnu/gettext/gettext-runtime-0.12.1.bin.woe32.zip           
-.. _gettext-tools-0.12.1.bin.woe32.zip:      ftp://ftp.gnu.org/gnu/gettext/gettext-tools-0.12.1.bin.woe32.zip 
-.. _libiconv-1.9.1.bin.woe32.zip:            http://www.ibiblio.org/pub/gnu/libiconv/libiconv-1.9.1.bin.woe32.zip
-
-"""
-# -----------------------------------------------------------------------------
-# Module Import
-# -------------
-# 
-import os
-import sys
-import wx
-import re
-
-# -----------------------------------------------------------------------------
-# Global variables
-# ----------------
-#
-
-__author__ = "Pierre Rouleau"
-__version__= "$Revision: 1.5 $"
-
-# -----------------------------------------------------------------------------
-
-def getlanguageDict():
-    languageDict = {}
-
-    if wx.VERSION >= (3, 0, 0):
-        app = wx.App()
-    else:
-        app = wx.PySimpleApp()
-
-    for lang in [x for x in dir(wx) if x.startswith("LANGUAGE")]:
-        i = wx.Locale(wx.LANGUAGE_DEFAULT).GetLanguageInfo(getattr(wx, lang))
-        if i:
-            languageDict[i.CanonicalName] = i.Description
-
-    return languageDict
-
-
-
-def processCustomFiles(filein, fileout, regexp, prefix = ''):
-    appfil_file = open(filein, 'r')
-    messages_file = open(fileout, 'r')
-    messages = messages_file.read()
-    messages_file.close()
-    messages_file = open(fileout, 'a')
-    messages_file.write('\n')
-    messages_file.write('#: %s\n' % prefix)
-    messages_file.write('\n')
-
-    words_found = {}
-    for filepath in appfil_file.xreadlines():
-        code_file = open(filepath.strip(), 'r')
-        for match in regexp.finditer(code_file.read()):
-            word = match.group(1)
-            if not words_found.get(word, False) and messages.find("msgid \"%s\"\nmsgstr \"\"" % word) == -1:
-                words_found[word] = True
-                messages_file.write('\n')
-                messages_file.write("msgid \"%s\"\n"%word)
-                messages_file.write("msgstr \"\"\n")
-        code_file.close()
-
-    messages_file.close()
-    appfil_file.close()
-
-
-# -----------------------------------------------------------------------------
-# m a k e P O ( )         -- Build the Portable Object file for the application --
-# ^^^^^^^^^^^^^^^
-#
-def makePO(applicationDirectoryPath,  applicationDomain=None, verbose=0) :
-    """Build the Portable Object Template file for the application.
-
-    makePO builds the .pot file for the application stored inside 
-    a specified directory by running xgettext for all application source 
-    files.  It finds the name of all files by looking for a file called 'app.fil'. 
-    If this file does not exists, makePo raises an IOError exception.
-    By default the application domain (the application
-    name) is the same as the directory name but it can be overridden by the
-    'applicationDomain' argument.
-
-    makePO always creates a new file called messages.pot.  If it finds files 
-    of the form app_xx.po where 'app' is the application name and 'xx' is one 
-    of the ISO 639 two-letter language codes, makePO resynchronizes those 
-    files with the latest extracted strings (now contained in messages.pot). 
-    This process updates all line location number in the language-specific
-    .po files and may also create new entries for translation (or comment out 
-    some).  The .po file is not changed, instead a new file is created with 
-    the .new extension appended to the name of the .po file.
-
-    By default the function does not display what it is doing.  Set the 
-    verbose argument to 1 to force it to print its commands.
-    """
-
-    if applicationDomain is None:
-        applicationName = fileBaseOf(applicationDirectoryPath,withPath=0)
-    else:
-        applicationName = applicationDomain
-    currentDir = os.getcwd()
-    os.chdir(applicationDirectoryPath)
-    filelist = 'app.fil'
-    if not os.path.exists(filelist):
-        raise IOError(2,'No module file: ' % filelist)
-
-    fileout = 'messages.pot'
-    # Steps:                                  
-    #  Use xgettext to parse all application modules
-    #  The following switches are used:
-    #  
-    #   -s                          : sort output by string content (easier to use when we need to merge several .po files)
-    #   --files-from=app.fil        : The list of files is taken from the file: app.fil
-    #   --output=                   : specifies the name of the output file (using a .pot extension)
-    cmd = 'xgettext -s --no-wrap --language=Python --files-from=' + filelist + ' --output=' + fileout
-    if verbose: print cmd
-    os.system(cmd)                                                
-
-    XSD_STRING_MODEL = re.compile("<xsd\:(?:element|attribute) name=\"([^\"]*)\"[^\>]*\>")
-    processCustomFiles(filelist, fileout, XSD_STRING_MODEL, 'Extra XSD strings')
-
-    XML_TC6_STRING_MODEL = re.compile("<documentation>\s*<xhtml\:p><!\[CDATA\[([^\]]*)\]\]></xhtml\:p>\s*</documentation>", re.MULTILINE | re.DOTALL)
-    processCustomFiles(filelist, fileout, XML_TC6_STRING_MODEL, 'Extra TC6 documentation strings')    
-
-    languageDict = getlanguageDict()
-
-    for langCode in languageDict.keys():
-        if langCode == 'en':
-            pass
-        else:
-            langPOfileName = "%s_%s.po" % (applicationName , langCode)
-            if os.path.exists(langPOfileName):
-                cmd = 'msgmerge -s --no-wrap "%s" %s > "%s.new"' % (langPOfileName, fileout, langPOfileName)
-                if verbose: print cmd
-                os.system(cmd)
-    os.chdir(currentDir)
-
-# -----------------------------------------------------------------------------
-# c a t P O ( )         -- Concatenate one or several PO files with the application domain files. --
-# ^^^^^^^^^^^^^
-#
-def catPO(applicationDirectoryPath, listOf_extraPo, applicationDomain=None, targetDir=None, verbose=0) :
-    """Concatenate one or several PO files with the application domain files.
-    """
-
-    if applicationDomain is None:
-        applicationName = fileBaseOf(applicationDirectoryPath,withPath=0)
-    else:
-        applicationName = applicationDomain
-    currentDir = os.getcwd()
-    os.chdir(applicationDirectoryPath)
-
-    languageDict = getlanguageDict()
-
-    for langCode in languageDict.keys():
-        if langCode == 'en':
-            pass
-        else:
-            langPOfileName = "%s_%s.po" % (applicationName , langCode)
-            if os.path.exists(langPOfileName):
-                fileList = ''
-                for fileName in listOf_extraPo:
-                    fileList += ("%s_%s.po " % (fileName,langCode))
-                cmd = "msgcat -s --no-wrap %s %s > %s.cat" % (langPOfileName, fileList, langPOfileName)
-                if verbose: print cmd
-                os.system(cmd)
-                if targetDir is None:
-                    pass
-                else:
-                    mo_targetDir = "%s/%s/LC_MESSAGES" % (targetDir,langCode)
-                    cmd = "msgfmt --output-file=%s/%s.mo %s_%s.po.cat" % (mo_targetDir,applicationName,applicationName,langCode)
-                    if verbose: print cmd
-                    os.system(cmd)
-    os.chdir(currentDir)
-
-# -----------------------------------------------------------------------------
-# m a k e M O ( )         -- Compile the Portable Object files into the Machine Object stored in the right location. --
-# ^^^^^^^^^^^^^^^
-# 
-def makeMO(applicationDirectoryPath,targetDir='./locale',applicationDomain=None, verbose=0, forceEnglish=0) :
-    """Compile the Portable Object files into the Machine Object stored in the right location.
-
-    makeMO converts all translated language-specific PO files located inside 
-    the  application directory into the binary .MO files stored inside the 
-    LC_MESSAGES sub-directory for the found locale files.
-
-    makeMO searches for all files that have a name of the form 'app_xx.po' 
-    inside the application directory specified by the first argument.  The 
-    'app' is the application domain name (that can be specified by the 
-    applicationDomain argument or is taken from the directory name). The 'xx' 
-    corresponds to one of the ISO 639 two-letter language codes.
-
-    makeMo stores the resulting files inside a sub-directory of `targetDir`
-    called xx/LC_MESSAGES where 'xx' corresponds to the 2-letter language
-    code.
-    """
-    if targetDir is None:
-        targetDir = './locale'
-    if verbose:
-        print "Target directory for .mo files is: %s" % targetDir
-
-    if applicationDomain is None:
-        applicationName = fileBaseOf(applicationDirectoryPath,withPath=0)
-    else:
-        applicationName = applicationDomain
-    currentDir = os.getcwd()
-    os.chdir(applicationDirectoryPath)
-
-    languageDict = getlanguageDict()
-
-    for langCode in languageDict.keys():
-        if (langCode == 'en') and (forceEnglish==0):
-            pass
-        else:
-            langPOfileName = "%s_%s.po" % (applicationName , langCode)
-            if os.path.exists(langPOfileName):
-                mo_targetDir = "%s/%s/LC_MESSAGES" % (targetDir,langCode)
-                if not os.path.exists(mo_targetDir):
-                    mkdir(mo_targetDir)
-                cmd = 'msgfmt --output-file="%s/%s.mo" "%s_%s.po"' % (mo_targetDir,applicationName,applicationName,langCode)
-                if verbose: print cmd
-                os.system(cmd)
-    os.chdir(currentDir)
-   
-# -----------------------------------------------------------------------------
-# p r i n t U s a g e         -- Displays how to use this script from the command line --
-# ^^^^^^^^^^^^^^^^^^^
-#
-def printUsage(errorMsg=None) :
-    """Displays how to use this script from the command line."""
-    print """
-    ##################################################################################
-    #   mki18n :   Make internationalization files.                                  #
-    #              Uses the GNU gettext system to create PO (Portable Object) files  #
-    #              from source code, coimpile PO into MO (Machine Object) files.     #
-    #              Supports C,C++,Python source files.                               #
-    #                                                                                #
-    #   Usage: mki18n {OPTION} [appDirPath]                                          #
-    #                                                                                #
-    #   Options:                                                                     #
-    #     -e               : When -m is used, forces English .mo file creation       #
-    #     -h               : prints this help                                        #
-    #     -m               : make MO from existing PO files                          #
-    #     -p               : make PO, update PO files: Creates a new messages.pot    #
-    #                        file. Creates a dom_xx.po.new for every existing        #
-    #                        language specific .po file. ('xx' stands for the ISO639 #
-    #                        two-letter language code and 'dom' stands for the       #
-    #                        application domain name).  mki18n requires that you     #
-    #                        write a 'app.fil' file  which contains the list of all  #
-    #                        source code to parse.                                   #
-    #     -v               : verbose (prints comments while running)                 #
-    #     --domain=appName : specifies the application domain name.  By default      #
-    #                        the directory name is used.                             #
-    #     --moTarget=dir : specifies the directory where .mo files are stored.       #
-    #                      If not specified, the target is './locale'                #
-    #                                                                                #
-    #   You must specify one of the -p or -m option to perform the work.  You can    #
-    #   specify the path of the target application.  If you leave it out mki18n      #
-    #   will use the current directory as the application main directory.            #        
-    #                                                                                #
-    ##################################################################################"""
-    if errorMsg:
-        print "\n   ERROR: %s" % errorMsg
-
-# -----------------------------------------------------------------------------
-# f i l e B a s e O f ( )         -- Return base name of filename --
-# ^^^^^^^^^^^^^^^^^^^^^^^
-# 
-def fileBaseOf(filename,withPath=0) :
-   """fileBaseOf(filename,withPath) ---> string
-
-   Return base name of filename.  The returned string never includes the extension.
-   Use os.path.basename() to return the basename with the extension.  The 
-   second argument is optional.  If specified and if set to 'true' (non zero) 
-   the string returned contains the full path of the file name.  Otherwise the 
-   path is excluded.
-
-   [Example]
-   >>> fn = 'd:/dev/telepath/tvapp/code/test.html'
-   >>> fileBaseOf(fn)
-   'test'
-   >>> fileBaseOf(fn)
-   'test'
-   >>> fileBaseOf(fn,1)
-   'd:/dev/telepath/tvapp/code/test'
-   >>> fileBaseOf(fn,0)
-   'test'
-   >>> fn = 'abcdef'
-   >>> fileBaseOf(fn)
-   'abcdef'
-   >>> fileBaseOf(fn,1)
-   'abcdef'
-   >>> fn = "abcdef."
-   >>> fileBaseOf(fn)
-   'abcdef'
-   >>> fileBaseOf(fn,1)
-   'abcdef'
-   """            
-   pos = filename.rfind('.')             
-   if pos > 0:
-      filename = filename[:pos]
-   if withPath:
-      return filename
-   else:
-      return os.path.basename(filename)
-# -----------------------------------------------------------------------------
-# m k d i r ( )         -- Create a directory (and possibly the entire tree) --
-# ^^^^^^^^^^^^^
-# 
-def mkdir(directory) :
-   """Create a directory (and possibly the entire tree).
-
-   The os.mkdir() will fail to create a directory if one of the
-   directory in the specified path does not exist.  mkdir()
-   solves this problem.  It creates every intermediate directory
-   required to create the final path. Under Unix, the function 
-   only supports forward slash separator, but under Windows and MacOS
-   the function supports the forward slash and the OS separator (backslash
-   under windows).
-   """ 
-
-   # translate the path separators
-   directory = unixpath(directory)
-   # build a list of all directory elements
-   aList = filter(lambda x: len(x)>0, directory.split('/'))
-   theLen = len(aList)                     
-   # if the first element is a Windows-style disk drive
-   # concatenate it with the first directory
-   if aList[0].endswith(':'):
-      if theLen > 1:
-         aList[1] = aList[0] + '/' + aList[1]
-         del aList[0]      
-         theLen -= 1         
-   # if the original directory starts at root,
-   # make sure the first element of the list 
-   # starts at root too
-   if directory[0] == '/':     
-      aList[0] = '/' + aList[0]
-   # Now iterate through the list, check if the 
-   # directory exists and if not create it
-   theDir = ''
-   for i in range(theLen):
-      theDir += aList[i]
-      if not os.path.exists(theDir):
-         os.mkdir(theDir)
-      theDir += '/'   
-      
-# -----------------------------------------------------------------------------
-# u n i x p a t h ( )         -- Return a path name that contains Unix separator. --
-# ^^^^^^^^^^^^^^^^^^^
-# 
-def unixpath(thePath) :
-   r"""Return a path name that contains Unix separator.
-
-   [Example]
-   >>> unixpath(r"d:\test")
-   'd:/test'
-   >>> unixpath("d:/test/file.txt")
-   'd:/test/file.txt'
-   >>> 
-   """
-   thePath = os.path.normpath(thePath)
-   if os.sep == '/':
-      return thePath
-   else:
-      return thePath.replace(os.sep,'/')
-
-# ----------------------------------------------------------------------------- 
-
-# S c r i p t   e x e c u t i o n               -- Runs when invoked from the command line --
-# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-# 
-if __name__ == "__main__":
-    import getopt     # command line parsing
-    argc = len(sys.argv)
-    if argc == 1:
-        printUsage('Missing argument: specify at least one of -m or -p (or both).')
-        sys.exit(1)
-    # If there is some arguments, parse the command line
-    validOptions     = "ehmpv"
-    validLongOptions = ['domain=', 'moTarget=']             
-    option = {}
-    option['forceEnglish'] = 0
-    option['mo'] = 0
-    option['po'] = 0        
-    option['verbose'] = 0
-    option['domain'] = None
-    option['moTarget'] = None
-    try:
-        optionList,pargs = getopt.getopt(sys.argv[1:],validOptions,validLongOptions)
-    except getopt.GetoptError, e:
-        printUsage(e[0])
-        sys.exit(1)       
-    for (opt,val) in optionList:
-        if  (opt == '-h'):    
-            printUsage()
-            sys.exit(0) 
-        elif (opt == '-e'):         option['forceEnglish'] = 1
-        elif (opt == '-m'):         option['mo'] = 1
-        elif (opt == '-p'):         option['po'] = 1
-        elif (opt == '-v'):         option['verbose'] = 1
-        elif (opt == '--domain'):   option['domain'] = val
-        elif (opt == '--moTarget'): option['moTarget'] = val
-    if len(pargs) == 0:
-        appDirPath = os.getcwd()
-        if option['verbose']:
-            print "No project directory given. Using current one:  %s" % appDirPath
-    elif len(pargs) == 1:
-        appDirPath = pargs[0]
-    else:
-        printUsage('Too many arguments (%u).  Use double quotes if you have space in directory name' % len(pargs))
-        sys.exit(1)
-    if option['domain'] is None:
-        # If no domain specified, use the name of the target directory
-        option['domain'] = fileBaseOf(appDirPath)
-    if option['verbose']:
-        print "Application domain used is: '%s'" % option['domain']
-    if option['po']:
-        try:
-            makePO(appDirPath,option['domain'],option['verbose'])
-        except IOError, e:
-            printUsage(e[1] + '\n   You must write a file app.fil that contains the list of all files to parse.')
-    if option['mo']:
-        makeMO(appDirPath,option['moTarget'],option['domain'],option['verbose'],option['forceEnglish'])
-    sys.exit(1)            
-            
-
-# -----------------------------------------------------------------------------
+#! /usr/bin/env python
+# -*- coding: iso-8859-1 -*-
+#
+#   PYTHON MODULE:     MKI18N.PY
+#                      =========
+#
+#   Abstract:         Make Internationalization (i18n) files for an application.
+#
+#   Copyright Pierre Rouleau. 2003. Released to public domain.
+#
+#   Last update: Saturday, November 8, 2003. @ 15:55:18.
+#
+#   File: ROUP2003N01::C:/dev/python/mki18n.py
+#
+#   RCS $Header: //software/official/MKS/MKS_SI/TV_NT/dev/Python/rcs/mki18n.py 1.5 2003/11/05 19:40:04 PRouleau Exp $
+#
+#   Update history:
+#
+#   - File created: Saturday, June 7, 2003. by Pierre Rouleau
+#   - 10/06/03 rcs : RCS Revision 1.1  2003/06/10 10:06:12  PRouleau
+#   - 10/06/03 rcs : RCS Initial revision
+#   - 23/08/03 rcs : RCS Revision 1.2  2003/06/10 10:54:27  PRouleau
+#   - 23/08/03 P.R.: [code:fix] : The strings encoded in this file are encode in iso-8859-1 format.  Added the encoding
+#                    notification to Python to comply with Python's 2.3 PEP 263.
+#   - 23/08/03 P.R.: [feature:new] : Added the '-e' switch which is used to force the creation of the empty English .mo file.
+#   - 22/10/03 P.R.: [code] : incorporated utility functions in here to make script self sufficient.
+#   - 05/11/03 rcs : RCS Revision 1.4  2003/10/22 06:39:31  PRouleau
+#   - 05/11/03 P.R.: [code:fix] : included the unixpath() in this file.
+#   - 08/11/03 rcs : RCS Revision 1.5  2003/11/05 19:40:04  PRouleau
+#
+#   RCS $Log: $
+#
+#
+# -----------------------------------------------------------------------------
+"""
+mki18n allows you to internationalize your software.  You can use it to
+create the GNU .po files (Portable Object) and the compiled .mo files
+(Machine Object).
+
+mki18n module can be used from the command line or from within a script (see
+the Usage at the end of this page).
+
+    Table of Contents
+    -----------------
+
+    makePO()             -- Build the Portable Object file for the application --
+    catPO()              -- Concatenate one or several PO files with the application domain files. --
+    makeMO()             -- Compile the Portable Object files into the Machine Object stored in the right location. --
+    printUsage           -- Displays how to use this script from the command line --
+
+    Scriptexecution      -- Runs when invoked from the command line --
+
+
+NOTE:  this module uses GNU gettext utilities.
+
+You can get the gettext tools from the following sites:
+
+   - `GNU FTP site for gettetx`_ where several versions (0.10.40, 0.11.2, 0.11.5 and 0.12.1) are available.
+     Note  that you need to use `GNU libiconv`_ to use this. Get it from the `GNU
+     libiconv  ftp site`_ and get version 1.9.1 or later. Get the Windows .ZIP
+     files and install the packages inside c:/gnu. All binaries will be stored
+     inside  c:/gnu/bin.  Just  put c:/gnu/bin inside your PATH. You will need
+     the following files:
+
+      - `gettext-runtime-0.12.1.bin.woe32.zip`_
+      - `gettext-tools-0.12.1.bin.woe32.zip`_
+      - `libiconv-1.9.1.bin.woe32.zip`_
+
+
+.. _GNU libiconv:                            http://www.gnu.org/software/libiconv/
+.. _GNU libiconv ftp site:                   http://www.ibiblio.org/pub/gnu/libiconv/
+.. _gettext-runtime-0.12.1.bin.woe32.zip:    ftp://ftp.gnu.org/gnu/gettext/gettext-runtime-0.12.1.bin.woe32.zip
+.. _gettext-tools-0.12.1.bin.woe32.zip:      ftp://ftp.gnu.org/gnu/gettext/gettext-tools-0.12.1.bin.woe32.zip
+.. _libiconv-1.9.1.bin.woe32.zip:            http://www.ibiblio.org/pub/gnu/libiconv/libiconv-1.9.1.bin.woe32.zip
+
+"""
+# -----------------------------------------------------------------------------
+# Module Import
+# -------------
+#
+
+from __future__ import absolute_import
+from __future__ import print_function
+import os
+import sys
+import re
+from builtins import str as text
+import wx
+
+
+# -----------------------------------------------------------------------------
+# Global variables
+# ----------------
+#
+
+__author__ = "Pierre Rouleau"
+__version__ = "$Revision: 1.5 $"
+
+# -----------------------------------------------------------------------------
+
+
+def getSupportedLanguageDict(appname):
+    """
+    Returns dictionary with languages already supported
+    by given application
+
+    param: appname:
+        name of application
+    """
+    languageDict = {}
+    ext = '.po'
+    files = [x for x in os.listdir('.')
+             if x.startswith(appname) and x.endswith(ext)]
+
+    langs = [x.split(appname + '_')[1].split(ext)[0] for x in files]
+    for lang in langs:
+        languageDict[lang] = lang
+
+    return languageDict
+
+
+def getlanguageDict():
+    languageDict = {}
+    getSupportedLanguageDict('Beremiz')
+    if wx.VERSION >= (3, 0, 0):
+        _app = wx.App()
+    else:
+        _app = wx.PySimpleApp()
+
+    for lang in [x for x in dir(wx) if x.startswith("LANGUAGE")]:
+        i = wx.Locale(wx.LANGUAGE_DEFAULT).GetLanguageInfo(getattr(wx, lang))
+        if i:
+            languageDict[i.CanonicalName] = i.Description
+
+    return languageDict
+
+
+def verbosePrint(verbose, str):
+    if verbose:
+        print(str)
+
+
+def processCustomFiles(filein, fileout, regexp, prefix=''):
+    appfil_file = open(filein, 'r')
+    messages_file = open(fileout, 'r')
+    messages = messages_file.read()
+    messages_file.close()
+    messages_file = open(fileout, 'a')
+    messages_file.write('\n')
+    messages_file.write('#: %s\n' % prefix)
+    messages_file.write('\n')
+
+    words_found = {}
+    for filepath in appfil_file.readlines():
+        code_file = open(filepath.strip(), 'r')
+        for match in regexp.finditer(code_file.read()):
+            word = match.group(1)
+            if not words_found.get(word, False) and messages.find("msgid \"%s\"\nmsgstr \"\"" % word) == -1:
+                words_found[word] = True
+                messages_file.write('\n')
+                messages_file.write("msgid \"%s\"\n" % word)
+                messages_file.write("msgstr \"\"\n")
+        code_file.close()
+
+    messages_file.close()
+    appfil_file.close()
+
+
+# -----------------------------------------------------------------------------
+# m a k e P O ( )         -- Build the Portable Object file for the application --
+# ^^^^^^^^^^^^^^^
+#
+def makePO(applicationDirectoryPath,  applicationDomain=None, verbose=0):
+    """Build the Portable Object Template file for the application.
+
+    makePO builds the .pot file for the application stored inside
+    a specified directory by running xgettext for all application source
+    files.  It finds the name of all files by looking for a file called 'app.fil'.
+    If this file does not exists, makePo raises an IOError exception.
+    By default the application domain (the application
+    name) is the same as the directory name but it can be overridden by the
+    'applicationDomain' argument.
+
+    makePO always creates a new file called messages.pot.  If it finds files
+    of the form app_xx.po where 'app' is the application name and 'xx' is one
+    of the ISO 639 two-letter language codes, makePO resynchronizes those
+    files with the latest extracted strings (now contained in messages.pot).
+    This process updates all line location number in the language-specific
+    .po files and may also create new entries for translation (or comment out
+    some).  The .po file is not changed, instead a new file is created with
+    the .new extension appended to the name of the .po file.
+
+    By default the function does not display what it is doing.  Set the
+    verbose argument to 1 to force it to print its commands.
+    """
+
+    if applicationDomain is None:
+        applicationName = fileBaseOf(applicationDirectoryPath, withPath=0)
+    else:
+        applicationName = applicationDomain
+    currentDir = os.getcwd()
+    os.chdir(applicationDirectoryPath)
+    filelist = 'app.fil'
+    if not os.path.exists(filelist):
+        raise IOError(2, 'No module file: %s' % filelist)
+
+    fileout = 'messages.pot'
+    # Steps:
+    #  Use xgettext to parse all application modules
+    #  The following switches are used:
+    #
+    #   -s                          : sort output by string content (easier to use when we need to merge several .po files)
+    #   --files-from=app.fil        : The list of files is taken from the file: app.fil
+    #   --output=                   : specifies the name of the output file (using a .pot extension)
+    cmd = 'xgettext -s --no-wrap --language=Python --files-from=' + filelist + ' --output=' + fileout + ' --package-name ' + applicationName
+    verbosePrint(verbose, cmd)
+    os.system(cmd)
+
+    XSD_STRING_MODEL = re.compile(r"<xsd\:(?:element|attribute) name=\"([^\"]*)\"[^\>]*\>")
+    processCustomFiles(filelist, fileout, XSD_STRING_MODEL, 'Extra XSD strings')
+
+    XML_TC6_STRING_MODEL = re.compile(r"<documentation>\s*<xhtml\:p><!\[CDATA\[([^\]]*)\]\]></xhtml\:p>\s*</documentation>", re.MULTILINE | re.DOTALL)
+    processCustomFiles(filelist, fileout, XML_TC6_STRING_MODEL, 'Extra TC6 documentation strings')
+
+    # generate messages.po
+    cmd = 'msginit --no-wrap --no-translator -i %s -l en_US.UTF-8 -o messages.po' % (fileout)
+    verbosePrint(verbose, cmd)
+    os.system(cmd)
+
+    languageDict = getSupportedLanguageDict(applicationName)
+
+    for langCode in languageDict.keys():
+        if langCode == 'en':
+            pass
+        else:
+            langPOfileName = "%s_%s.po" % (applicationName, langCode)
+            if os.path.exists(langPOfileName):
+                cmd = 'msgmerge -s --no-wrap "%s" %s > "%s.new"' % (langPOfileName, fileout, langPOfileName)
+                verbosePrint(verbose, cmd)
+                os.system(cmd)
+    os.chdir(currentDir)
+
+
+def catPO(applicationDirectoryPath, listOf_extraPo, applicationDomain=None, targetDir=None, verbose=0):
+    """Concatenate one or several PO files with the application domain files.
+    """
+
+    if applicationDomain is None:
+        applicationName = fileBaseOf(applicationDirectoryPath, withPath=0)
+    else:
+        applicationName = applicationDomain
+    currentDir = os.getcwd()
+    os.chdir(applicationDirectoryPath)
+
+    languageDict = getSupportedLanguageDict(applicationName)
+
+    for langCode in languageDict.keys():
+        if langCode == 'en':
+            pass
+        else:
+            langPOfileName = "%s_%s.po" % (applicationName, langCode)
+            if os.path.exists(langPOfileName):
+                fileList = ''
+                for fileName in listOf_extraPo:
+                    fileList += ("%s_%s.po " % (fileName, langCode))
+                cmd = "msgcat -s --no-wrap %s %s > %s.cat" % (langPOfileName, fileList, langPOfileName)
+                verbosePrint(verbose, cmd)
+                os.system(cmd)
+                if targetDir is None:
+                    pass
+                else:
+                    mo_targetDir = "%s/%s/LC_MESSAGES" % (targetDir, langCode)
+                    cmd = "msgfmt --output-file=%s/%s.mo %s_%s.po.cat" % (mo_targetDir, applicationName, applicationName, langCode)
+                    verbosePrint(verbose, cmd)
+                    os.system(cmd)
+    os.chdir(currentDir)
+
+
+def makeMO(applicationDirectoryPath, targetDir='./locale', applicationDomain=None, verbose=0, forceEnglish=0):
+    """Compile the Portable Object files into the Machine Object stored in the right location.
+
+    makeMO converts all translated language-specific PO files located inside
+    the  application directory into the binary .MO files stored inside the
+    LC_MESSAGES sub-directory for the found locale files.
+
+    makeMO searches for all files that have a name of the form 'app_xx.po'
+    inside the application directory specified by the first argument.  The
+    'app' is the application domain name (that can be specified by the
+    applicationDomain argument or is taken from the directory name). The 'xx'
+    corresponds to one of the ISO 639 two-letter language codes.
+
+    makeMo stores the resulting files inside a sub-directory of `targetDir`
+    called xx/LC_MESSAGES where 'xx' corresponds to the 2-letter language
+    code.
+    """
+
+    if targetDir is None:
+        targetDir = './locale'
+
+    verbosePrint(verbose, "Target directory for .mo files is: %s" % targetDir)
+
+    if applicationDomain is None:
+        applicationName = fileBaseOf(applicationDirectoryPath, withPath=0)
+    else:
+        applicationName = applicationDomain
+    currentDir = os.getcwd()
+    os.chdir(applicationDirectoryPath)
+
+    languageDict = getSupportedLanguageDict(applicationName)
+
+    for langCode in languageDict.keys():
+        if (langCode == 'en') and (forceEnglish == 0):
+            pass
+        else:
+            langPOfileName = "%s_%s.po" % (applicationName, langCode)
+            if os.path.exists(langPOfileName):
+                mo_targetDir = "%s/%s/LC_MESSAGES" % (targetDir, langCode)
+                if not os.path.exists(mo_targetDir):
+                    mkdir(mo_targetDir)
+                cmd = 'msgfmt --output-file="%s/%s.mo" "%s_%s.po"' % (mo_targetDir, applicationName, applicationName, langCode)
+                verbosePrint(verbose, cmd)
+                os.system(cmd)
+    os.chdir(currentDir)
+
+
+def printUsage(errorMsg=None):
+    """Displays how to use this script from the command line."""
+    print("""
+    ##################################################################################
+    #   mki18n :   Make internationalization files.                                  #
+    #              Uses the GNU gettext system to create PO (Portable Object) files  #
+    #              from source code, coimpile PO into MO (Machine Object) files.     #
+    #              Supports C,C++,Python source files.                               #
+    #                                                                                #
+    #   Usage: mki18n {OPTION} [appDirPath]                                          #
+    #                                                                                #
+    #   Options:                                                                     #
+    #     -e               : When -m is used, forces English .mo file creation       #
+    #     -h               : prints this help                                        #
+    #     -m               : make MO from existing PO files                          #
+    #     -p               : make PO, update PO files: Creates a new messages.pot    #
+    #                        file. Creates a dom_xx.po.new for every existing        #
+    #                        language specific .po file. ('xx' stands for the ISO639 #
+    #                        two-letter language code and 'dom' stands for the       #
+    #                        application domain name).  mki18n requires that you     #
+    #                        write a 'app.fil' file  which contains the list of all  #
+    #                        source code to parse.                                   #
+    #     -v               : verbose (prints comments while running)                 #
+    #     --domain=appName : specifies the application domain name.  By default      #
+    #                        the directory name is used.                             #
+    #     --moTarget=dir : specifies the directory where .mo files are stored.       #
+    #                      If not specified, the target is './locale'                #
+    #                                                                                #
+    #   You must specify one of the -p or -m option to perform the work.  You can    #
+    #   specify the path of the target application.  If you leave it out mki18n      #
+    #   will use the current directory as the application main directory.            #
+    #                                                                                #
+    ##################################################################################""")
+    if errorMsg:
+        print("\n   ERROR: %s" % errorMsg)
+
+
+def fileBaseOf(filename, withPath=0):
+    """fileBaseOf(filename,withPath) ---> string
+
+    Return base name of filename.  The returned string never includes the extension.
+    Use os.path.basename() to return the basename with the extension.  The
+    second argument is optional.  If specified and if set to 'true' (non zero)
+    the string returned contains the full path of the file name.  Otherwise the
+    path is excluded.
+
+    [Example]
+    >>> fn = 'd:/dev/telepath/tvapp/code/test.html'
+    >>> fileBaseOf(fn)
+    'test'
+    >>> fileBaseOf(fn)
+    'test'
+    >>> fileBaseOf(fn,1)
+    'd:/dev/telepath/tvapp/code/test'
+    >>> fileBaseOf(fn,0)
+    'test'
+    >>> fn = 'abcdef'
+    >>> fileBaseOf(fn)
+    'abcdef'
+    >>> fileBaseOf(fn,1)
+    'abcdef'
+    >>> fn = "abcdef."
+    >>> fileBaseOf(fn)
+    'abcdef'
+    >>> fileBaseOf(fn,1)
+    'abcdef'
+    """
+    pos = filename.rfind('.')
+    if pos > 0:
+        filename = filename[:pos]
+    if withPath:
+        return filename
+    else:
+        return os.path.basename(filename)
+
+
+def mkdir(directory):
+    """Create a directory (and possibly the entire tree).
+
+    The os.mkdir() will fail to create a directory if one of the
+    directory in the specified path does not exist.  mkdir()
+    solves this problem.  It creates every intermediate directory
+    required to create the final path. Under Unix, the function
+    only supports forward slash separator, but under Windows and MacOS
+    the function supports the forward slash and the OS separator (backslash
+    under windows).
+    """
+
+    # translate the path separators
+    directory = unixpath(directory)
+    # build a list of all directory elements
+    aList = filter(lambda x: len(x) > 0, directory.split('/'))
+    theLen = len(aList)
+    # if the first element is a Windows-style disk drive
+    # concatenate it with the first directory
+    if aList[0].endswith(':'):
+        if theLen > 1:
+            aList[1] = aList[0] + '/' + aList[1]
+            del aList[0]
+            theLen -= 1
+    # if the original directory starts at root,
+    # make sure the first element of the list
+    # starts at root too
+    if directory[0] == '/':
+        aList[0] = '/' + aList[0]
+    # Now iterate through the list, check if the
+    # directory exists and if not create it
+    theDir = ''
+    for i in range(theLen):
+        theDir += aList[i]
+        if not os.path.exists(theDir):
+            os.mkdir(theDir)
+        theDir += '/'
+
+
+def unixpath(thePath):
+    r"""Return a path name that contains Unix separator.
+
+    [Example]
+    >>> unixpath(r"d:\test")
+    'd:/test'
+    >>> unixpath("d:/test/file.txt")
+    'd:/test/file.txt'
+    >>>
+    """
+    thePath = os.path.normpath(thePath)
+    if os.sep == '/':
+        return thePath
+    else:
+        return thePath.replace(os.sep, '/')
+
+
+# -----------------------------------------------------------------------------
+
+# S c r i p t   e x e c u t i o n               -- Runs when invoked from the command line --
+# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+#
+if __name__ == "__main__":
+    # command line parsing
+    import getopt    # pylint: disable=wrong-import-order,wrong-import-position
+    argc = len(sys.argv)
+    if argc == 1:
+        printUsage('Missing argument: specify at least one of -m or -p (or both).')
+        sys.exit(1)
+    # If there is some arguments, parse the command line
+    validOptions = "ehmpv"
+    validLongOptions = ['domain=', 'moTarget=']
+    option = {}
+    option['forceEnglish'] = 0
+    option['mo'] = 0
+    option['po'] = 0
+    option['verbose'] = 0
+    option['domain'] = None
+    option['moTarget'] = None
+    optionKey = {
+        '-e':         'forceEnglish',
+        '-m':         'mo',
+        '-p':         'po',
+        '-v':         'verbose',
+        '--domain':   'domain',
+        '--moTarget': 'moTarget',
+    }
+    exit_code = 1
+    try:
+        optionList, pargs = getopt.getopt(sys.argv[1:], validOptions, validLongOptions)
+    except getopt.GetoptError as e:
+        printUsage(e)
+        sys.exit(1)
+    for (opt, val) in optionList:
+        if opt == '-h':
+            printUsage()
+            sys.exit(0)
+        option[optionKey[opt]] = 1 if val == '' else val
+    if len(pargs) == 0:
+        appDirPath = os.getcwd()
+        if option['verbose']:
+            print("No project directory given. Using current one:  %s" % appDirPath)
+    elif len(pargs) == 1:
+        appDirPath = pargs[0]
+    else:
+        printUsage('Too many arguments (%u).  Use double quotes if you have space in directory name' % len(pargs))
+        sys.exit(1)
+    if option['domain'] is None:
+        # If no domain specified, use the name of the target directory
+        option['domain'] = fileBaseOf(appDirPath)
+    if option['verbose']:
+        print("Application domain used is: '%s'" % option['domain'])
+    if option['po']:
+        try:
+            makePO(appDirPath, option['domain'], option['verbose'])
+            exit_code = 0
+        except IOError as e:
+            printUsage(text(e) + '\n   You must write a file app.fil that contains the list of all files to parse.')
+    if option['mo']:
+        makeMO(appDirPath, option['moTarget'], option['domain'], option['verbose'], option['forceEnglish'])
+        exit_code = 0
+    sys.exit(exit_code)
+
+
+# -----------------------------------------------------------------------------
Binary file images/Build.png has changed
Binary file images/IDManager.png has changed
Binary file images/brz.ico has changed
Binary file images/fullscreen.png has changed
--- a/images/genicons.sh	Sat Jun 02 11:56:01 2018 +0100
+++ b/images/genicons.sh	Mon Jan 07 13:50:39 2019 +0100
@@ -1,18 +1,25 @@
-#!/bin/bash
+#!/bin/sh
 
 INKSCAPE=inkscape
 
-for i in `cat icons.svg |grep -o -e '%%[^%]*%%'|sed 's/%//g'` 
-do
- if [ $i.png -nt icons.svg ]; then
- 	echo "Skip $i"
- else
-	rm  -f $i.png
-	echo "$INKSCAPE" icons.svg -z -e $i.png -i $i
-	"$INKSCAPE" icons.svg -z -e $i.png -i $i
- fi
+for fname in `ls *.svg`; do
+    for i in `cat $fname |grep -o -e '%%[^%]*%%'|sed 's/%//g'` 
+    do
+        if [ $i.png -nt $fname ]; then
+ 	    echo "Skip $i"
+        else
+	    rm  -f $i.png
+	    echo "$INKSCAPE" $fname -z -e $i.png -i $i
+	    "$INKSCAPE" $fname -z -e $i.png -i $i
+        fi
+    done
 done
 
-cp ico24.png brz.png
-convert ico*.png brz.ico
+cp ico024.png brz.png
+convert -compress none ico*.png brz.ico
 rm -f ico*.png
+
+
+convert -compress none poeico*.png poe.ico
+rm -f poeico*.png
+
--- a/images/icons.svg	Sat Jun 02 11:56:01 2018 +0100
+++ b/images/icons.svg	Mon Jan 07 13:50:39 2019 +0100
@@ -31,8 +31,8 @@
     </rdf:RDF>
   </metadata>
   <sodipodi:namedview
-     inkscape:window-height="1043"
-     inkscape:window-width="1920"
+     inkscape:window-height="874"
+     inkscape:window-width="1600"
      inkscape:pageshadow="2"
      inkscape:pageopacity="0"
      guidetolerance="10.0"
@@ -43,15 +43,17 @@
      pagecolor="#ffffff"
      id="base"
      showgrid="false"
-     inkscape:zoom="1"
-     inkscape:cx="618.65047"
-     inkscape:cy="-188.15697"
+     inkscape:zoom="16"
+     inkscape:cx="754.13513"
+     inkscape:cy="907.03479"
      inkscape:window-x="0"
-     inkscape:window-y="0"
+     inkscape:window-y="24"
      inkscape:current-layer="svg2"
      showguides="true"
      inkscape:guide-bbox="true"
-     inkscape:window-maximized="1">
+     inkscape:window-maximized="1"
+     inkscape:measure-start="904.956,703.964"
+     inkscape:measure-end="930.144,704.058">
     <inkscape:grid
        type="xygrid"
        id="grid16717"
@@ -63,6 +65,47 @@
   <defs
      id="defs4">
     <linearGradient
+       inkscape:collect="always"
+       id="linearGradient16168">
+      <stop
+         style="stop-color:#469837;stop-opacity:0"
+         offset="0"
+         id="stop16164" />
+      <stop
+         style="stop-color:#469837;stop-opacity:1"
+         offset="1"
+         id="stop16166" />
+    </linearGradient>
+    <linearGradient
+       x1="18.031"
+       y1="16.408001"
+       gradientTransform="matrix(0.29669,0,0,0.35207,1.8805,2.1186)"
+       x2="20.055"
+       gradientUnits="userSpaceOnUse"
+       y2="24.628"
+       id="linearGradient2929-8">
+      <stop
+         offset="0"
+         style="stop-color:#fff;stop-opacity:.2"
+         id="stop28221" />
+      <stop
+         offset="1"
+         style="stop-color:#fff;stop-opacity:0"
+         id="stop28223" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient28187-2">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop28178" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop28183" />
+    </linearGradient>
+    <linearGradient
        id="linearGradient47318">
       <stop
          id="stop47320"
@@ -11768,18 +11811,6 @@
              id="stop87"
              style="stop-color:#001b7b;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop89"
-             style="stop-color:#0053BD"
-             offset="0" />
-          <midPointStop
-             id="midPointStop91"
-             style="stop-color:#0053BD"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop93"
-             style="stop-color:#00008D"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="214.27441"
@@ -11796,18 +11827,6 @@
              id="stop102"
              style="stop-color:#3c5cb2;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop104"
-             style="stop-color:#0066CC"
-             offset="0" />
-          <midPointStop
-             id="midPointStop106"
-             style="stop-color:#0066CC"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop108"
-             style="stop-color:#0053BD"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="112.50049"
@@ -11828,26 +11847,6 @@
              id="stop149"
              style="stop-color:#003399;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop151"
-             style="stop-color:#0099FF"
-             offset="0" />
-          <midPointStop
-             id="midPointStop153"
-             style="stop-color:#0099FF"
-             offset="0.25" />
-          <midPointStop
-             id="midPointStop155"
-             style="stop-color:#B0D9FF"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop157"
-             style="stop-color:#B0D9FF"
-             offset="0.75" />
-          <midPointStop
-             id="midPointStop159"
-             style="stop-color:#003399"
-             offset="1" />
         </linearGradient>
         <radialGradient
            cx="-1.36621"
@@ -11873,34 +11872,6 @@
              id="stop172"
              style="stop-color:#0068c6;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop174"
-             style="stop-color:#FFFFFF"
-             offset="0" />
-          <midPointStop
-             id="midPointStop176"
-             style="stop-color:#FFFFFF"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop178"
-             style="stop-color:#0083D7"
-             offset="0.45" />
-          <midPointStop
-             id="midPointStop180"
-             style="stop-color:#0083D7"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop182"
-             style="stop-color:#0053BD"
-             offset="0.75" />
-          <midPointStop
-             id="midPointStop184"
-             style="stop-color:#0053BD"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop186"
-             style="stop-color:#0066CC"
-             offset="1" />
         </radialGradient>
         <linearGradient
            x1="112.49854"
@@ -11917,18 +11888,6 @@
              id="stop195"
              style="stop-color:#0093dd;stop-opacity:0"
              offset="1" />
-          <midPointStop
-             id="midPointStop197"
-             style="stop-color:#FFFFFF"
-             offset="0" />
-          <midPointStop
-             id="midPointStop199"
-             style="stop-color:#FFFFFF"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop201"
-             style="stop-color:#000000"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="87.310547"
@@ -11938,20 +11897,7 @@
            id="XMLID_3_"
            xlink:href="#linearGradient1556"
            gradientUnits="userSpaceOnUse"
-           spreadMethod="pad">
-          <midPointStop
-             id="midPointStop226"
-             style="stop-color:#003399"
-             offset="0.00562" />
-          <midPointStop
-             id="midPointStop228"
-             style="stop-color:#003399"
-             offset="0.25" />
-          <midPointStop
-             id="midPointStop230"
-             style="stop-color:#57ADFF"
-             offset="1" />
-        </linearGradient>
+           spreadMethod="pad" />
         <linearGradient
            x1="94.524902"
            y1="133.65625"
@@ -11979,18 +11925,6 @@
              id="stop247"
              style="stop-color:#ccebff;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop249"
-             style="stop-color:#FFFFFF"
-             offset="0" />
-          <midPointStop
-             id="midPointStop251"
-             style="stop-color:#FFFFFF"
-             offset="0.75" />
-          <midPointStop
-             id="midPointStop253"
-             style="stop-color:#CCEBFF"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="126.8584"
@@ -12000,20 +11934,7 @@
            id="XMLID_5_"
            xlink:href="#linearGradient2186"
            gradientUnits="userSpaceOnUse"
-           spreadMethod="pad">
-          <midPointStop
-             id="midPointStop264"
-             style="stop-color:#57ADFF"
-             offset="0" />
-          <midPointStop
-             id="midPointStop266"
-             style="stop-color:#57ADFF"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop268"
-             style="stop-color:#003399"
-             offset="1" />
-        </linearGradient>
+           spreadMethod="pad" />
         <linearGradient
            x1="116.01855"
            y1="112.93164"
@@ -12029,18 +11950,6 @@
              id="stop52218"
              style="stop-color:#a4cdec;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop287"
-             style="stop-color:#FFFFFF"
-             offset="0.45" />
-          <midPointStop
-             id="midPointStop289"
-             style="stop-color:#FFFFFF"
-             offset="0.75" />
-          <midPointStop
-             id="midPointStop291"
-             style="stop-color:#D4EEFF"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="92.049637"
@@ -27128,26 +27037,6 @@
              id="stop88"
              style="stop-color:#ffb300;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop90"
-             style="stop-color:#FFA700"
-             offset="0" />
-          <midPointStop
-             id="midPointStop92"
-             style="stop-color:#FFA700"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop94"
-             style="stop-color:#FFFF00"
-             offset="0.691" />
-          <midPointStop
-             id="midPointStop96"
-             style="stop-color:#FFFF00"
-             offset="0.7952" />
-          <midPointStop
-             id="midPointStop98"
-             style="stop-color:#FFB300"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="88.601097"
@@ -27177,18 +27066,6 @@
              id="stop115"
              style="stop-color:#ffd700;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop117"
-             style="stop-color:#FFFFFF"
-             offset="0.0056" />
-          <midPointStop
-             id="midPointStop119"
-             style="stop-color:#FFFFFF"
-             offset="0.5311" />
-          <midPointStop
-             id="midPointStop121"
-             style="stop-color:#FFD700"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="98.653801"
@@ -27230,26 +27107,6 @@
              id="stop142"
              style="stop-color:#ffb300;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop144"
-             style="stop-color:#FFA700"
-             offset="0" />
-          <midPointStop
-             id="midPointStop146"
-             style="stop-color:#FFA700"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop148"
-             style="stop-color:#FFFF00"
-             offset="0.691" />
-          <midPointStop
-             id="midPointStop150"
-             style="stop-color:#FFFF00"
-             offset="0.7952" />
-          <midPointStop
-             id="midPointStop152"
-             style="stop-color:#FFB300"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="98.563004"
@@ -27260,20 +27117,7 @@
            xlink:href="#linearGradient18210"
            gradientUnits="userSpaceOnUse"
            gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)"
-           spreadMethod="pad">
-          <midPointStop
-             id="midPointStop171"
-             style="stop-color:#FFFFFF"
-             offset="0.0056" />
-          <midPointStop
-             id="midPointStop173"
-             style="stop-color:#FFFFFF"
-             offset="0.5311" />
-          <midPointStop
-             id="midPointStop175"
-             style="stop-color:#FFD700"
-             offset="1" />
-        </linearGradient>
+           spreadMethod="pad" />
         <linearGradient
            x1="98.563004"
            y1="28.5513"
@@ -30567,18 +30411,6 @@
                id="stop2592"
                style="stop-color:#001b7b;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop2593"
-               style="stop-color:#0053BD"
-               offset="0" />
-            <midPointStop
-               id="midPointStop2594"
-               style="stop-color:#0053BD"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop2595"
-               style="stop-color:#00008D"
-               offset="1" />
           </linearGradient>
           <linearGradient
              x1="214.27441"
@@ -30595,18 +30427,6 @@
                id="stop2598"
                style="stop-color:#3c5cb2;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop2599"
-               style="stop-color:#0066CC"
-               offset="0" />
-            <midPointStop
-               id="midPointStop2600"
-               style="stop-color:#0066CC"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop2601"
-               style="stop-color:#0053BD"
-               offset="1" />
           </linearGradient>
           <linearGradient
              x1="112.50049"
@@ -30627,26 +30447,6 @@
                id="stop2605"
                style="stop-color:#003399;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop2606"
-               style="stop-color:#0099FF"
-               offset="0" />
-            <midPointStop
-               id="midPointStop2607"
-               style="stop-color:#0099FF"
-               offset="0.25" />
-            <midPointStop
-               id="midPointStop2608"
-               style="stop-color:#B0D9FF"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop2609"
-               style="stop-color:#B0D9FF"
-               offset="0.75" />
-            <midPointStop
-               id="midPointStop2610"
-               style="stop-color:#003399"
-               offset="1" />
           </linearGradient>
           <radialGradient
              cx="-1.36621"
@@ -30672,34 +30472,6 @@
                id="stop2615"
                style="stop-color:#0068c6;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop2616"
-               style="stop-color:#FFFFFF"
-               offset="0" />
-            <midPointStop
-               id="midPointStop2617"
-               style="stop-color:#FFFFFF"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop2618"
-               style="stop-color:#0083D7"
-               offset="0.45" />
-            <midPointStop
-               id="midPointStop2619"
-               style="stop-color:#0083D7"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop2620"
-               style="stop-color:#0053BD"
-               offset="0.75" />
-            <midPointStop
-               id="midPointStop2621"
-               style="stop-color:#0053BD"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop2622"
-               style="stop-color:#0066CC"
-               offset="1" />
           </radialGradient>
           <linearGradient
              x1="112.49854"
@@ -30716,18 +30488,6 @@
                id="stop2625"
                style="stop-color:#0093dd;stop-opacity:0"
                offset="1" />
-            <midPointStop
-               id="midPointStop2626"
-               style="stop-color:#FFFFFF"
-               offset="0" />
-            <midPointStop
-               id="midPointStop2627"
-               style="stop-color:#FFFFFF"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop2628"
-               style="stop-color:#000000"
-               offset="1" />
           </linearGradient>
           <linearGradient
              x1="87.310547"
@@ -30737,20 +30497,7 @@
              id="linearGradient7174"
              xlink:href="#linearGradient1556"
              gradientUnits="userSpaceOnUse"
-             spreadMethod="pad">
-            <midPointStop
-               id="midPointStop2630"
-               style="stop-color:#003399"
-               offset="0.00562" />
-            <midPointStop
-               id="midPointStop2631"
-               style="stop-color:#003399"
-               offset="0.25" />
-            <midPointStop
-               id="midPointStop2632"
-               style="stop-color:#57ADFF"
-               offset="1" />
-          </linearGradient>
+             spreadMethod="pad" />
           <linearGradient
              x1="94.524902"
              y1="133.65625"
@@ -30778,18 +30525,6 @@
                id="stop2638"
                style="stop-color:#ccebff;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop2639"
-               style="stop-color:#FFFFFF"
-               offset="0" />
-            <midPointStop
-               id="midPointStop2640"
-               style="stop-color:#FFFFFF"
-               offset="0.75" />
-            <midPointStop
-               id="midPointStop2641"
-               style="stop-color:#CCEBFF"
-               offset="1" />
           </linearGradient>
           <linearGradient
              x1="126.8584"
@@ -30799,20 +30534,7 @@
              id="linearGradient2642"
              xlink:href="#linearGradient2186"
              gradientUnits="userSpaceOnUse"
-             spreadMethod="pad">
-            <midPointStop
-               id="midPointStop2643"
-               style="stop-color:#57ADFF"
-               offset="0" />
-            <midPointStop
-               id="midPointStop2644"
-               style="stop-color:#57ADFF"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop2645"
-               style="stop-color:#003399"
-               offset="1" />
-          </linearGradient>
+             spreadMethod="pad" />
           <linearGradient
              x1="116.01855"
              y1="112.93164"
@@ -30828,18 +30550,6 @@
                id="stop7193"
                style="stop-color:#a4cdec;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop2649"
-               style="stop-color:#FFFFFF"
-               offset="0.45" />
-            <midPointStop
-               id="midPointStop2650"
-               style="stop-color:#FFFFFF"
-               offset="0.75" />
-            <midPointStop
-               id="midPointStop2651"
-               style="stop-color:#D4EEFF"
-               offset="1" />
           </linearGradient>
           <linearGradient
              x1="92.049637"
@@ -45773,26 +45483,6 @@
                id="stop11309"
                style="stop-color:#ffb300;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop11310"
-               style="stop-color:#FFA700"
-               offset="0" />
-            <midPointStop
-               id="midPointStop11311"
-               style="stop-color:#FFA700"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop11312"
-               style="stop-color:#FFFF00"
-               offset="0.691" />
-            <midPointStop
-               id="midPointStop11313"
-               style="stop-color:#FFFF00"
-               offset="0.7952" />
-            <midPointStop
-               id="midPointStop11314"
-               style="stop-color:#FFB300"
-               offset="1" />
           </linearGradient>
           <linearGradient
              x1="88.601097"
@@ -45822,18 +45512,6 @@
                id="stop11320"
                style="stop-color:#ffd700;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop11321"
-               style="stop-color:#FFFFFF"
-               offset="0.0056" />
-            <midPointStop
-               id="midPointStop11322"
-               style="stop-color:#FFFFFF"
-               offset="0.5311" />
-            <midPointStop
-               id="midPointStop11323"
-               style="stop-color:#FFD700"
-               offset="1" />
           </linearGradient>
           <linearGradient
              x1="98.653801"
@@ -45875,26 +45553,6 @@
                id="stop11332"
                style="stop-color:#ffb300;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop11333"
-               style="stop-color:#FFA700"
-               offset="0" />
-            <midPointStop
-               id="midPointStop11334"
-               style="stop-color:#FFA700"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop11335"
-               style="stop-color:#FFFF00"
-               offset="0.691" />
-            <midPointStop
-               id="midPointStop11336"
-               style="stop-color:#FFFF00"
-               offset="0.7952" />
-            <midPointStop
-               id="midPointStop11337"
-               style="stop-color:#FFB300"
-               offset="1" />
           </linearGradient>
           <linearGradient
              x1="98.563004"
@@ -45905,20 +45563,7 @@
              xlink:href="#linearGradient20002"
              gradientUnits="userSpaceOnUse"
              gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)"
-             spreadMethod="pad">
-            <midPointStop
-               id="midPointStop11339"
-               style="stop-color:#FFFFFF"
-               offset="0.0056" />
-            <midPointStop
-               id="midPointStop11340"
-               style="stop-color:#FFFFFF"
-               offset="0.5311" />
-            <midPointStop
-               id="midPointStop11341"
-               style="stop-color:#FFD700"
-               offset="1" />
-          </linearGradient>
+             spreadMethod="pad" />
           <linearGradient
              x1="98.563004"
              y1="28.5513"
@@ -46209,18 +45854,6 @@
                id="stop11393"
                style="stop-color:#001b7b;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop11394"
-               style="stop-color:#0053BD"
-               offset="0" />
-            <midPointStop
-               id="midPointStop11395"
-               style="stop-color:#0053BD"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop11396"
-               style="stop-color:#00008D"
-               offset="1" />
           </linearGradient>
           <linearGradient
              x1="214.27441"
@@ -46237,18 +45870,6 @@
                id="stop11399"
                style="stop-color:#3c5cb2;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop11400"
-               style="stop-color:#0066CC"
-               offset="0" />
-            <midPointStop
-               id="midPointStop11401"
-               style="stop-color:#0066CC"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop11402"
-               style="stop-color:#0053BD"
-               offset="1" />
           </linearGradient>
           <linearGradient
              x1="112.50049"
@@ -46269,26 +45890,6 @@
                id="stop11406"
                style="stop-color:#003399;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop11407"
-               style="stop-color:#0099FF"
-               offset="0" />
-            <midPointStop
-               id="midPointStop11408"
-               style="stop-color:#0099FF"
-               offset="0.25" />
-            <midPointStop
-               id="midPointStop11409"
-               style="stop-color:#B0D9FF"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop11410"
-               style="stop-color:#B0D9FF"
-               offset="0.75" />
-            <midPointStop
-               id="midPointStop11411"
-               style="stop-color:#003399"
-               offset="1" />
           </linearGradient>
           <radialGradient
              cx="-1.36621"
@@ -46314,34 +45915,6 @@
                id="stop11416"
                style="stop-color:#0068c6;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop11417"
-               style="stop-color:#FFFFFF"
-               offset="0" />
-            <midPointStop
-               id="midPointStop11418"
-               style="stop-color:#FFFFFF"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop11419"
-               style="stop-color:#0083D7"
-               offset="0.45" />
-            <midPointStop
-               id="midPointStop11420"
-               style="stop-color:#0083D7"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop11421"
-               style="stop-color:#0053BD"
-               offset="0.75" />
-            <midPointStop
-               id="midPointStop11422"
-               style="stop-color:#0053BD"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop11423"
-               style="stop-color:#0066CC"
-               offset="1" />
           </radialGradient>
           <linearGradient
              x1="112.49854"
@@ -46358,18 +45931,6 @@
                id="stop11426"
                style="stop-color:#0093dd;stop-opacity:0"
                offset="1" />
-            <midPointStop
-               id="midPointStop11427"
-               style="stop-color:#FFFFFF"
-               offset="0" />
-            <midPointStop
-               id="midPointStop11428"
-               style="stop-color:#FFFFFF"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop11429"
-               style="stop-color:#000000"
-               offset="1" />
           </linearGradient>
           <linearGradient
              x1="87.310547"
@@ -46379,20 +45940,7 @@
              id="linearGradient11430"
              xlink:href="#linearGradient1556"
              gradientUnits="userSpaceOnUse"
-             spreadMethod="pad">
-            <midPointStop
-               id="midPointStop11431"
-               style="stop-color:#003399"
-               offset="0.00562" />
-            <midPointStop
-               id="midPointStop11432"
-               style="stop-color:#003399"
-               offset="0.25" />
-            <midPointStop
-               id="midPointStop11433"
-               style="stop-color:#57ADFF"
-               offset="1" />
-          </linearGradient>
+             spreadMethod="pad" />
           <linearGradient
              x1="94.524902"
              y1="133.65625"
@@ -46420,18 +45968,6 @@
                id="stop11439"
                style="stop-color:#ccebff;stop-opacity:1"
                offset="1" />
-            <midPointStop
-               id="midPointStop11440"
-               style="stop-color:#FFFFFF"
-               offset="0" />
-            <midPointStop
-               id="midPointStop11441"
-               style="stop-color:#FFFFFF"
-               offset="0.75" />
-            <midPointStop
-               id="midPointStop11442"
-               style="stop-color:#CCEBFF"
-               offset="1" />
           </linearGradient>
           <linearGradient
              x1="126.8584"
@@ -46441,20 +45977,7 @@
              id="linearGradient11443"
              xlink:href="#linearGradient2186"
              gradientUnits="userSpaceOnUse"
-             spreadMethod="pad">
-            <midPointStop
-               id="midPointStop11444"
-               style="stop-color:#57ADFF"
-               offset="0" />
-            <midPointStop
-               id="midPointStop11445"
-               style="stop-color:#57ADFF"
-               offset="0.5" />
-            <midPointStop
-               id="midPointStop11446"
-               style="stop-color:#003399"
-               offset="1" />
-          </linearGradient>
+             spreadMethod="pad" />
           <linearGradient
              x1="116.01855"
              y1="112.93164"
@@ -46463,20 +45986,7 @@
              id="linearGradient11447"
              xlink:href="#linearGradient2503"
              gradientUnits="userSpaceOnUse"
-             spreadMethod="pad">
-            <midPointStop
-               id="midPointStop11448"
-               style="stop-color:#FFFFFF"
-               offset="0.45" />
-            <midPointStop
-               id="midPointStop11449"
-               style="stop-color:#FFFFFF"
-               offset="0.75" />
-            <midPointStop
-               id="midPointStop11450"
-               style="stop-color:#D4EEFF"
-               offset="1" />
-          </linearGradient>
+             spreadMethod="pad" />
           <linearGradient
              x1="92.049637"
              y1="109.93223"
@@ -47662,18 +47172,6 @@
              id="stop38146"
              style="stop-color:#001b7b;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop38148"
-             style="stop-color:#0053BD"
-             offset="0" />
-          <midPointStop
-             id="midPointStop38150"
-             style="stop-color:#0053BD"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop38152"
-             style="stop-color:#00008D"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="214.27441"
@@ -47690,18 +47188,6 @@
              id="stop38158"
              style="stop-color:#3c5cb2;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop38160"
-             style="stop-color:#0066CC"
-             offset="0" />
-          <midPointStop
-             id="midPointStop38162"
-             style="stop-color:#0066CC"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop38164"
-             style="stop-color:#0053BD"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="112.50049"
@@ -47722,26 +47208,6 @@
              id="stop38172"
              style="stop-color:#003399;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop38174"
-             style="stop-color:#0099FF"
-             offset="0" />
-          <midPointStop
-             id="midPointStop38176"
-             style="stop-color:#0099FF"
-             offset="0.25" />
-          <midPointStop
-             id="midPointStop38178"
-             style="stop-color:#B0D9FF"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop38180"
-             style="stop-color:#B0D9FF"
-             offset="0.75" />
-          <midPointStop
-             id="midPointStop38182"
-             style="stop-color:#003399"
-             offset="1" />
         </linearGradient>
         <radialGradient
            cx="-1.36621"
@@ -47767,34 +47233,6 @@
              id="stop38192"
              style="stop-color:#0068c6;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop38194"
-             style="stop-color:#FFFFFF"
-             offset="0" />
-          <midPointStop
-             id="midPointStop38196"
-             style="stop-color:#FFFFFF"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop38198"
-             style="stop-color:#0083D7"
-             offset="0.45" />
-          <midPointStop
-             id="midPointStop38200"
-             style="stop-color:#0083D7"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop38202"
-             style="stop-color:#0053BD"
-             offset="0.75" />
-          <midPointStop
-             id="midPointStop38204"
-             style="stop-color:#0053BD"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop38206"
-             style="stop-color:#0066CC"
-             offset="1" />
         </radialGradient>
         <linearGradient
            x1="112.49854"
@@ -47811,18 +47249,6 @@
              id="stop38212"
              style="stop-color:#0093dd;stop-opacity:0"
              offset="1" />
-          <midPointStop
-             id="midPointStop38214"
-             style="stop-color:#FFFFFF"
-             offset="0" />
-          <midPointStop
-             id="midPointStop38216"
-             style="stop-color:#FFFFFF"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop38218"
-             style="stop-color:#000000"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="87.310547"
@@ -47832,20 +47258,7 @@
            id="linearGradient38220"
            xlink:href="#linearGradient1556"
            gradientUnits="userSpaceOnUse"
-           spreadMethod="pad">
-          <midPointStop
-             id="midPointStop38222"
-             style="stop-color:#003399"
-             offset="0.00562" />
-          <midPointStop
-             id="midPointStop38224"
-             style="stop-color:#003399"
-             offset="0.25" />
-          <midPointStop
-             id="midPointStop38226"
-             style="stop-color:#57ADFF"
-             offset="1" />
-        </linearGradient>
+           spreadMethod="pad" />
         <linearGradient
            x1="94.524902"
            y1="133.65625"
@@ -47873,18 +47286,6 @@
              id="stop38238"
              style="stop-color:#ccebff;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop38240"
-             style="stop-color:#FFFFFF"
-             offset="0" />
-          <midPointStop
-             id="midPointStop38242"
-             style="stop-color:#FFFFFF"
-             offset="0.75" />
-          <midPointStop
-             id="midPointStop38244"
-             style="stop-color:#CCEBFF"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="126.8584"
@@ -47894,20 +47295,7 @@
            id="linearGradient38246"
            xlink:href="#linearGradient2186"
            gradientUnits="userSpaceOnUse"
-           spreadMethod="pad">
-          <midPointStop
-             id="midPointStop38248"
-             style="stop-color:#57ADFF"
-             offset="0" />
-          <midPointStop
-             id="midPointStop38250"
-             style="stop-color:#57ADFF"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop38252"
-             style="stop-color:#003399"
-             offset="1" />
-        </linearGradient>
+           spreadMethod="pad" />
         <linearGradient
            x1="116.01855"
            y1="112.93164"
@@ -47923,18 +47311,6 @@
              id="stop38258"
              style="stop-color:#a4cdec;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop38260"
-             style="stop-color:#FFFFFF"
-             offset="0.45" />
-          <midPointStop
-             id="midPointStop38262"
-             style="stop-color:#FFFFFF"
-             offset="0.75" />
-          <midPointStop
-             id="midPointStop38264"
-             style="stop-color:#D4EEFF"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="92.049637"
@@ -63055,26 +62431,6 @@
              id="stop43616"
              style="stop-color:#ffb300;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop43618"
-             style="stop-color:#FFA700"
-             offset="0" />
-          <midPointStop
-             id="midPointStop43620"
-             style="stop-color:#FFA700"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop43622"
-             style="stop-color:#FFFF00"
-             offset="0.691" />
-          <midPointStop
-             id="midPointStop43624"
-             style="stop-color:#FFFF00"
-             offset="0.7952" />
-          <midPointStop
-             id="midPointStop43626"
-             style="stop-color:#FFB300"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="88.601097"
@@ -63104,18 +62460,6 @@
              id="stop43638"
              style="stop-color:#ffd700;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop43640"
-             style="stop-color:#FFFFFF"
-             offset="0.0056" />
-          <midPointStop
-             id="midPointStop43642"
-             style="stop-color:#FFFFFF"
-             offset="0.5311" />
-          <midPointStop
-             id="midPointStop43644"
-             style="stop-color:#FFD700"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="98.653801"
@@ -63157,26 +62501,6 @@
              id="stop43662"
              style="stop-color:#ffb300;stop-opacity:1"
              offset="1" />
-          <midPointStop
-             id="midPointStop43664"
-             style="stop-color:#FFA700"
-             offset="0" />
-          <midPointStop
-             id="midPointStop43666"
-             style="stop-color:#FFA700"
-             offset="0.5" />
-          <midPointStop
-             id="midPointStop43668"
-             style="stop-color:#FFFF00"
-             offset="0.691" />
-          <midPointStop
-             id="midPointStop43670"
-             style="stop-color:#FFFF00"
-             offset="0.7952" />
-          <midPointStop
-             id="midPointStop43672"
-             style="stop-color:#FFB300"
-             offset="1" />
         </linearGradient>
         <linearGradient
            x1="98.563004"
@@ -63187,20 +62511,7 @@
            xlink:href="#linearGradient18210"
            gradientUnits="userSpaceOnUse"
            gradientTransform="matrix(0.9999,-1.38e-2,1.38e-2,0.9999,-9.362,7.5474)"
-           spreadMethod="pad">
-          <midPointStop
-             id="midPointStop43676"
-             style="stop-color:#FFFFFF"
-             offset="0.0056" />
-          <midPointStop
-             id="midPointStop43678"
-             style="stop-color:#FFFFFF"
-             offset="0.5311" />
-          <midPointStop
-             id="midPointStop43680"
-             style="stop-color:#FFD700"
-             offset="1" />
-        </linearGradient>
+           spreadMethod="pad" />
         <linearGradient
            x1="98.563004"
            y1="28.5513"
@@ -67573,26 +66884,6 @@
            id="stop28538"
            style="stop-color:#ffb300;stop-opacity:1"
            offset="1" />
-        <midPointStop
-           offset="0"
-           style="stop-color:#FFA700"
-           id="midPointStop28540" />
-        <midPointStop
-           offset="0.5"
-           style="stop-color:#FFA700"
-           id="midPointStop28542" />
-        <midPointStop
-           offset="0.691"
-           style="stop-color:#FFFF00"
-           id="midPointStop28544" />
-        <midPointStop
-           offset="0.7952"
-           style="stop-color:#FFFF00"
-           id="midPointStop28546" />
-        <midPointStop
-           offset="1"
-           style="stop-color:#FFB300"
-           id="midPointStop28548" />
       </linearGradient>
       <linearGradient
          x1="88.601097"
@@ -67622,18 +66913,6 @@
            id="stop28560"
            style="stop-color:#ffd700;stop-opacity:1"
            offset="1" />
-        <midPointStop
-           offset="0.0056"
-           style="stop-color:#FFFFFF"
-           id="midPointStop28562" />
-        <midPointStop
-           offset="0.5311"
-           style="stop-color:#FFFFFF"
-           id="midPointStop28564" />
-        <midPointStop
-           offset="1"
-           style="stop-color:#FFD700"
-           id="midPointStop28566" />
       </linearGradient>
       <linearGradient
          x1="98.653801"
@@ -67675,26 +66954,6 @@
            id="stop28583"
            style="stop-color:#ffb300;stop-opacity:1"
            offset="1" />
-        <midPointStop
-           offset="0"
-           style="stop-color:#FFA700"
-           id="midPointStop28585" />
-        <midPointStop
-           offset="0.5"
-           style="stop-color:#FFA700"
-           id="midPointStop28587" />
-        <midPointStop
-           offset="0.691"
-           style="stop-color:#FFFF00"
-           id="midPointStop28589" />
-        <midPointStop
-           offset="0.7952"
-           style="stop-color:#FFFF00"
-           id="midPointStop28591" />
-        <midPointStop
-           offset="1"
-           style="stop-color:#FFB300"
-           id="midPointStop28593" />
       </linearGradient>
       <linearGradient
          x1="98.563004"
@@ -67712,18 +66971,6 @@
            id="stop169"
            style="stop-color:#ffffff;stop-opacity:0.00549451"
            offset="1" />
-        <midPointStop
-           offset="0.0056"
-           style="stop-color:#FFFFFF"
-           id="midPointStop28599" />
-        <midPointStop
-           offset="0.5311"
-           style="stop-color:#FFFFFF"
-           id="midPointStop28601" />
-        <midPointStop
-           offset="1"
-           style="stop-color:#FFD700"
-           id="midPointStop28603" />
       </linearGradient>
       <linearGradient
          x1="98.563004"
@@ -87549,7 +86796,7 @@
          offset="1" />
     </linearGradient>
     <linearGradient
-       id="linearGradient2929-8"
+       id="linearGradient2929-8-0"
        y2="24.628"
        gradientUnits="userSpaceOnUse"
        x2="20.055"
@@ -88101,6 +87348,100 @@
          stdDeviation="10.172821"
          id="feGaussianBlur23088" />
     </filter>
+    <radialGradient
+       id="radialGradient2553-7-9"
+       gradientUnits="userSpaceOnUse"
+       cy="8.5608997"
+       cx="7.8186002"
+       gradientTransform="matrix(1.69,0,0,1.0436,-5.449,0.96175)"
+       r="11.268">
+      <stop
+         id="stop2612-6-3"
+         style="stop-color:#f0c178"
+         offset="0" />
+      <stop
+         id="stop2614-0-6"
+         style="stop-color:#e18941"
+         offset=".5" />
+      <stop
+         id="stop2616-1-0"
+         style="stop-color:#ec4f18"
+         offset="1" />
+    </radialGradient>
+    <radialGradient
+       id="radialGradient2550-1"
+       gradientUnits="userSpaceOnUse"
+       cy="5.5927"
+       cx="4.02"
+       gradientTransform="matrix(-0.016802,1.3943,-1.7966,-0.021651,14.152,2.1566)"
+       r="10.273">
+      <stop
+         id="stop3754-8"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop3760-7"
+         style="stop-color:#fff"
+         offset=".84754" />
+      <stop
+         id="stop3756-9"
+         style="stop-color:#fff;stop-opacity:0"
+         offset="1" />
+    </radialGradient>
+    <linearGradient
+       id="linearGradient3262-6-3"
+       y2="16"
+       gradientUnits="userSpaceOnUse"
+       x2="25"
+       gradientTransform="translate(-17.058)"
+       x1="25">
+      <stop
+         id="stop3311-5-7"
+         style="stop-color:#f6f6f6"
+         offset="0" />
+      <stop
+         id="stop3313-9-5"
+         style="stop-color:#ccc"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3264-0-2"
+       y2="16.004999"
+       gradientUnits="userSpaceOnUse"
+       x2="21"
+       gradientTransform="translate(-17.058)"
+       x1="21">
+      <stop
+         id="stop3399-0-2"
+         style="stop-color:#aaa"
+         offset="0" />
+      <stop
+         id="stop3401-5-8"
+         style="stop-color:#8c8c8c"
+         offset="1" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient28187-2"
+       id="radialGradient28189"
+       cx="111.7265"
+       cy="111.7265"
+       fx="111.7265"
+       fy="111.7265"
+       r="111.6605"
+       gradientTransform="matrix(1,0,0,1.0005911,0,-0.06603901)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient16168"
+       id="radialGradient16170"
+       cx="111.7265"
+       cy="111.7265"
+       fx="111.7265"
+       fy="111.7265"
+       r="111.6605"
+       gradientTransform="matrix(0.95160132,-0.01357563,0.01391374,0.97645493,3.8528826,4.1473681)"
+       gradientUnits="userSpaceOnUse" />
   </defs>
   <g
      id="g19063"
@@ -88275,8 +87616,7 @@
     </g>
   </g>
   <text
-     sodipodi:linespacing="125%"
-     style="font-size:12.76095104px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      xml:space="preserve"
      id="text2713"
      y="181.52583"
@@ -88284,7 +87624,8 @@
        y="181.52583"
        x="33.295933"
        id="tspan16193"
-       sodipodi:role="line">%% Build Clean editPLC HMIEditor ImportFile ManageFolder ImportDEF ImportSVG NetworkEdit ShowMaster ExportSlave Run ShowIECcode Stop Unknown %%</tspan></text>
+       sodipodi:role="line"
+       style="font-size:12.76095104px;line-height:1.25">%% Build Clean editPLC HMIEditor ImportFile ManageFolder ImportDEF ImportSVG NetworkEdit ShowMaster ExportSlave Run ShowIECcode Stop Unknown %%</tspan></text>
   <rect
      style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
      id="Unknown"
@@ -88343,10 +87684,10 @@
        height="2.4448969"
        width="12.22449" />
     <text
-       style="font-size:1.14302945px;font-style:normal;font-weight:normal;fill:#333333;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;font-size:1.14302945px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#333333;fill-opacity:1;stroke:none"
        xml:space="preserve"
        id="text17374"
-       transform="matrix(0.987138,-0.1598702,0.1598702,0.987138,0,0)"
+       transform="rotate(-9.1993627)"
        y="272.39679"
        x="-1114.1569"><tspan
          style="font-size:1.57370079px"
@@ -88359,20 +87700,20 @@
        d="m -1053.1533,448.8911 -0.044,0.005 c 0,8.7e-4 0,0.002 -0.01,0.003 l -2.5764,0.41802 c -9e-4,-10e-6 0,-10e-6 0,0 l -0.044,0.008 c -0.077,0.0142 -0.1299,0.0861 -0.1202,0.16393 l 0.01,0.0437 c 9e-4,0.002 0,0.004 0,0.005 l 0.3579,2.19389 0,0.0383 c 0.01,0.0404 0.027,0.0768 0.06,0.10053 0.033,0.0238 0.074,0.0329 0.1146,0.0251 l 0.044,-0.008 2.5764,-0.41801 0.035,-0.003 c 0.039,-0.005 0.075,-0.0253 0.099,-0.0566 0.024,-0.0313 0.035,-0.0709 0.03,-0.1101 l -0.01,-0.0437 c 10e-5,-0.002 10e-5,-0.004 0,-0.005 l -0.1448,-0.9098 1.3032,-0.21037 0.6448,3.99162 c 0.01,0.0394 0.029,0.0744 0.062,0.097 0.033,0.0226 0.074,0.031 0.1128,0.0232 l 0.087,-0.0164 c 0.01,-0.002 0.017,-0.005 0.025,-0.008 l 0,0 1.8606,-0.30054 0.1448,0.89887 c 0,0.002 0,0.004 0,0.005 l 0.01,0.041 c 0.015,0.0761 0.087,0.12733 0.1639,0.11748 l 0.044,-0.005 c 0,-8.8e-4 0,-0.002 0.01,-0.003 l 4.2348,-0.68576 c 9e-4,1e-5 0,1e-5 0,0 l 0.044,-0.008 c 0.077,-0.0142 0.1299,-0.0861 0.1202,-0.16392 l -0.01,-0.0437 c -9e-4,-0.002 0,-0.004 0,-0.005 l -0.3525,-2.1693 c 0,-9.1e-4 0,-0.002 0,-0.003 l -0.01,-0.0437 c -0.015,-0.0797 -0.092,-0.13215 -0.1721,-0.11748 l -0.044,0.008 -4.2321,0.68576 -0.038,0.003 c -0.039,0.005 -0.075,0.0253 -0.099,0.0566 -0.024,0.0313 -0.035,0.0709 -0.029,0.1101 l 0.01,0.0437 c 9e-4,0.002 0,0.004 0,0.005 l 0.1448,0.89613 -1.7459,0.27868 -0.6475,-3.98616 c -0.013,-0.0807 -0.089,-0.13573 -0.1694,-0.12295 l -0.085,0.0137 c -0.012,0.002 -0.024,0.006 -0.035,0.0109 0,8.7e-4 0,0.002 -0.01,0.003 l -1.4126,0.22677 -0.1448,-0.90707 c -9e-4,-9.2e-4 0,-0.002 0,-0.003 l -0.01,-0.0437 c -0.014,-0.0772 -0.086,-0.1299 -0.1639,-0.12022 z m -0.1721,0.41529 0.2923,1.81959 -2.2021,0.35517 -0.2923,-1.81959 2.2021,-0.35517 z m 8.7154,2.8414 0.2869,1.795 -3.855,0.62293 -0.2869,-1.79501 3.855,-0.62292 z"
        inkscape:connector-curvature="0" />
     <text
-       style="font-size:1.51333988px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;font-size:1.51333988px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"
        id="text19318"
-       transform="matrix(0.987138,-0.1598702,0.1598702,0.987138,0,0)"
+       transform="rotate(-9.1993627)"
        y="276.60452"
        x="-1113.516"><tspan
          id="tspan19320"
          y="276.60452"
          x="-1113.516">IN</tspan></text>
     <text
-       style="font-size:1.51333988px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;font-size:1.51333988px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"
        id="text19324"
-       transform="matrix(0.987138,-0.1598702,0.1598702,0.987138,0,0)"
+       transform="rotate(-9.1993627)"
        y="280.78931"
        x="-1107.0702"><tspan
          id="tspan19326"
@@ -88517,8 +87858,7 @@
           </g>
         </g>
         <text
-           sodipodi:linespacing="125%"
-           style="font-size:23.17712593px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Nimbus Mono L"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:23.17712593px;line-height:0%;font-family:'Nimbus Mono L';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
            xml:space="preserve"
            id="text5103"
            transform="matrix(0.9283219,0.3717759,-1.4068749,0.5137849,0,0)"
@@ -88595,8 +87935,7 @@
           </g>
         </g>
         <text
-           sodipodi:linespacing="125%"
-           style="font-size:16.01663589px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999946px;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Nimbus Mono L"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.01663589px;line-height:0%;font-family:'Nimbus Mono L';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999946px;marker:none"
            xml:space="preserve"
            id="text8228"
            transform="matrix(0.9225601,-0.385853,1.2237141,0.5721321,0,0)"
@@ -88673,8 +88012,7 @@
           </g>
         </g>
         <text
-           sodipodi:linespacing="125%"
-           style="font-size:16.01663589px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999946px;marker:none;visibility:visible;display:inline;overflow:visible;font-family:Nimbus Mono L"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16.01663589px;line-height:0%;font-family:'Nimbus Mono L';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999946px;marker:none"
            xml:space="preserve"
            id="text8323"
            transform="matrix(0.9225601,-0.385853,1.2237141,0.5721321,0,0)"
@@ -88715,7 +88053,7 @@
      transform="matrix(1.6473499,0,0,1.6473499,1002.9234,183.57576)"
      id="flowRoot29856"
      xml:space="preserve"
-     style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19976);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Andale Mono"><flowRegion
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0.01%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19976);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><flowRegion
        id="flowRegion29858"
        style="fill:url(#linearGradient34169);fill-opacity:1;stroke:url(#linearGradient30904)"><rect
          width="382.57648"
@@ -88723,9 +88061,9 @@
          x="-85.494621"
          y="2.3818817"
          id="rect29860"
-         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient34167);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Andale Mono" /></flowRegion><flowPara
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:125%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient34167);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></flowRegion><flowPara
        id="flowPara29862"
-       style="fill:url(#linearGradient19974);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none">ST</flowPara></flowRoot>  <g
+       style="font-size:12px;line-height:1.25;fill:url(#linearGradient19974);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">ST</flowPara></flowRoot>  <g
      transform="matrix(0.07159976,0,0,0.07159976,865.18029,195.95335)"
      id="g2248">
     <path
@@ -88846,8 +88184,7 @@
            transform="scale(0.8717267,1.1471486)"
            id="text3168"
            xml:space="preserve"
-           style="font-size:126.07830811px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
-           sodipodi:linespacing="125%"><tspan
+           style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:126.07830811px;line-height:0%;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none"><tspan
              x="160.73796"
              y="355.54837"
              id="tspan3170">STOP</tspan></text>
@@ -88925,35 +88262,32 @@
        transform="matrix(0.08604141,0,0,0.08604141,-1059.9338,502.14288)"
        id="g74019">
       <text
-         sodipodi:linespacing="125%"
          x="-13.388169"
          y="239.68744"
          transform="scale(0.9460798,1.0569933)"
          id="text10478"
          xml:space="preserve"
-         style="font-size:184.97383118px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"><tspan
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:184.97383118px;line-height:0%;font-family:'Bitstream Vera Sans Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"><tspan
            x="-13.388169"
            y="239.68744"
            id="tspan10480">D</tspan></text>
       <text
-         sodipodi:linespacing="125%"
          x="80.957664"
          y="239.68744"
          transform="scale(0.9460798,1.0569933)"
          id="text10482"
          xml:space="preserve"
-         style="font-size:184.97383118px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"><tspan
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:184.97383118px;line-height:0%;font-family:'Bitstream Vera Sans Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"><tspan
            x="80.957664"
            y="239.68744"
            id="tspan10484">E</tspan></text>
       <text
-         sodipodi:linespacing="125%"
          x="170.1553"
          y="239.68744"
          transform="scale(0.9460798,1.0569933)"
          id="text10486"
          xml:space="preserve"
-         style="font-size:184.97383118px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans Mono"><tspan
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:184.97383118px;line-height:0%;font-family:'Bitstream Vera Sans Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"><tspan
            x="170.1553"
            y="239.68744"
            id="tspan10488">F</tspan></text>
@@ -89094,8 +88428,7 @@
      height="24"
      width="24" />
   <text
-     sodipodi:linespacing="125%"
-     style="font-size:12.76000023px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      xml:space="preserve"
      id="text34203"
      y="424.36218"
@@ -89103,7 +88436,8 @@
        y="424.36218"
        x="20"
        id="tspan16197"
-       sodipodi:role="line">%% Add Delete Disabled Enabled HideVars IECCDown IECCUp Maximize Minimize minus plus ShowVars LeftCopy RightCopy%%</tspan></text>
+       sodipodi:role="line"
+       style="font-size:12.76000023px;line-height:1.25">%% Add Delete Disabled Enabled HideVars IECCDown IECCUp Maximize Minimize minus plus ShowVars LeftCopy RightCopy%%</tspan></text>
   <g
      id="g21181"
      transform="matrix(1.0031449,0,0,1.0031449,797.89799,82.2456)" />
@@ -89274,8 +88608,7 @@
              y="258.79065"
              id="text27339"
              xml:space="preserve"
-             style="font-size:4.3936758px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19193);fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
-             sodipodi:linespacing="125%"><tspan
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.3936758px;line-height:0%;font-family:'Courier New';-inkscape-font-specification:'Courier New Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19193);fill-opacity:1;stroke:none"><tspan
                x="349.45224"
                y="258.79065"
                id="tspan27341"
@@ -89289,8 +88622,7 @@
                y="241.54065"
                id="text27323"
                xml:space="preserve"
-               style="font-size:4.3936758px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19195);fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
-               sodipodi:linespacing="80.000001%"><tspan
+               style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.3936758px;line-height:0%;font-family:'Courier New';-inkscape-font-specification:'Courier New Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19195);fill-opacity:1;stroke:none"><tspan
                  x="341.82724"
                  y="241.54065"
                  id="tspan27363"
@@ -89316,8 +88648,7 @@
                y="241.54065"
                id="text27373"
                xml:space="preserve"
-               style="font-size:4.3936758px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19197);fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
-               sodipodi:linespacing="80.000001%"><tspan
+               style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.3936758px;line-height:0%;font-family:'Courier New';-inkscape-font-specification:'Courier New Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19197);fill-opacity:1;stroke:none"><tspan
                  x="350.93945"
                  y="241.54065"
                  id="tspan27381"
@@ -89343,8 +88674,7 @@
                y="241.54065"
                id="text27458"
                xml:space="preserve"
-               style="font-size:4.3936758px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19199);fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
-               sodipodi:linespacing="80.000001%"><tspan
+               style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.3936758px;line-height:0%;font-family:'Courier New';-inkscape-font-specification:'Courier New Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19199);fill-opacity:1;stroke:none"><tspan
                  x="352.48117"
                  y="241.54065"
                  id="tspan27466"
@@ -89398,8 +88728,7 @@
              y="258.79065"
              id="text28186"
              xml:space="preserve"
-             style="font-size:4.3936758px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19209);fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
-             sodipodi:linespacing="125%"><tspan
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.3936758px;line-height:0%;font-family:'Courier New';-inkscape-font-specification:'Courier New Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19209);fill-opacity:1;stroke:none"><tspan
                x="349.45224"
                y="258.79065"
                id="tspan28188"
@@ -89413,8 +88742,7 @@
                y="241.54065"
                id="text28192"
                xml:space="preserve"
-               style="font-size:4.3936758px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19211);fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
-               sodipodi:linespacing="80.000001%"><tspan
+               style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.3936758px;line-height:0%;font-family:'Courier New';-inkscape-font-specification:'Courier New Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19211);fill-opacity:1;stroke:none"><tspan
                  x="341.82724"
                  y="241.54065"
                  id="tspan28194"
@@ -89440,8 +88768,7 @@
                y="241.54065"
                id="text28204"
                xml:space="preserve"
-               style="font-size:4.3936758px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19213);fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
-               sodipodi:linespacing="80.000001%"><tspan
+               style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.3936758px;line-height:0%;font-family:'Courier New';-inkscape-font-specification:'Courier New Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19213);fill-opacity:1;stroke:none"><tspan
                  x="350.93945"
                  y="241.54065"
                  id="tspan28206"
@@ -89467,8 +88794,7 @@
                y="241.54065"
                id="text28216"
                xml:space="preserve"
-               style="font-size:4.3936758px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:80.00000119%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19215);fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
-               sodipodi:linespacing="80.000001%"><tspan
+               style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.3936758px;line-height:0%;font-family:'Courier New';-inkscape-font-specification:'Courier New Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19215);fill-opacity:1;stroke:none"><tspan
                  x="352.48117"
                  y="241.54065"
                  id="tspan28218"
@@ -89855,8 +89181,7 @@
        style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.07859244px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
   </g>
   <text
-     sodipodi:linespacing="125%"
-     style="font-size:12.76000023px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
      xml:space="preserve"
      id="text60407"
      y="257.44528"
@@ -89864,7 +89189,8 @@
        y="257.44528"
        x="170.27524"
        id="tspan16195"
-       sodipodi:role="line">%% Compiler TargetType %%</tspan></text>
+       sodipodi:role="line"
+       style="font-size:12.76000023px;line-height:1.25">%% Compiler TargetType %%</tspan></text>
   <rect
      style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
      id="Compiler"
@@ -89982,7 +89308,7 @@
        cx="0" />
   </g>
   <text
-     style="font-size:20px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+     style="font-style:normal;font-weight:normal;font-size:20px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
      xml:space="preserve"
      id="text18377"
      y="134.61037"
@@ -89994,7 +89320,7 @@
        y="159.61037"
        x="42.860386">Methods</tspan></text>
   <text
-     style="font-size:20px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+     style="font-style:normal;font-weight:normal;font-size:20px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
      xml:space="preserve"
      id="text18383"
      y="254.61035"
@@ -90006,7 +89332,7 @@
        y="279.61035"
        x="43.489288">Params</tspan></text>
   <text
-     style="font-size:20px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     style="font-style:normal;font-weight:normal;font-size:20px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none"
      xml:space="preserve"
      id="text18389"
      y="393.61218"
@@ -90015,7 +89341,7 @@
        y="393.61218"
        x="37.5">Buttons</tspan></text>
   <text
-     style="font-size:40.12579727px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+     style="font-style:normal;font-weight:normal;font-size:40.12579727px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
      xml:space="preserve"
      id="text18397"
      y="54.610374"
@@ -90026,11 +89352,11 @@
        x="371.85562">Beremiz icons</tspan></text>
   <g
      id="g18993"
-     transform="translate(1165.0472,-113.94633)">
+     transform="translate(1165.0472,106.05367)">
     <path
-       style="fill:url(#linearGradient8148);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       style="display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient8148);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
        id="splash"
-       d="m -1031,857.23823 476,0 0,299.99997 -476,0 0,-299.99997 z"
+       d="m -1031,857.23823 h 476 v 299.99997 h -476 z"
        inkscape:connector-curvature="0" />
     <g
        id="g17803"
@@ -90043,42 +89369,42 @@
          id="g7269"
          transform="translate(0,89.910633)">
         <path
-           style="font-size:314.89779663px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter17760);enable-background:accumulate;font-family:Arial Black"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:314.89779663px;line-height:125%;font-family:'Arial Black';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;filter:url(#filter17760);enable-background:accumulate"
            id="path17845"
-           d="m -1470.2813,1725.0291 c -56.0138,0.054 -112.0828,20.5177 -156.0937,61.5937 -85.0794,79.4058 -95.9453,209.1111 -29.5938,301.1563 l 9.7813,69.3437 0.9062,6.4375 5.125,-4 30.5938,-23.9687 c 87.5525,67.3697 213.0935,63.1007 295.9375,-14.2188 18.4642,-17.2329 33.4323,-36.8343 44.875,-57.9062 6.4003,0.736 13.3613,1.0937 20.875,1.0937 24.9087,0 44.0178,-3.5634 57.3437,-10.6875 13.3257,-7.1242 24.6943,-18.8804 34.125,-35.2812 l -61.6562,-5.6875 c -3.8953,4.9202 -7.5237,8.3649 -10.9063,10.3125 -5.5355,3.0752 -11.381,4.5937 -17.5312,4.5937 -2.2646,0 -4.435,-0.18 -6.5,-0.5625 3.5746,-10.6475 6.37,-21.5105 8.3437,-32.5 l 91.8125,0 0,-7.0625 c -10e-5,-21.5262 -3.5522,-39.0091 -10.625,-52.4375 -7.0731,-13.4281 -17.3756,-23.6769 -30.9062,-30.75 -13.3838,-6.9958 -31.5824,-10.5176 -54.5938,-10.5937 -7.0146,-25.9757 -18.6908,-50.9762 -35.0625,-73.6875 l -9.7812,-69.3438 -0.9063,-6.4375 -5.125,4 -30.5937,23.9688 c -41.0402,-31.5796 -90.4197,-47.4228 -139.8438,-47.375 z m 228.125,206.2187 c 6.3617,0.8346 11.6486,3.3459 15.875,7.5313 5.279,5.2278 8.5511,13.9044 9.7813,26 l -24.7813,0 c 0.5248,-11.1718 0.225,-22.3843 -0.875,-33.5313 z m 118.9731,-33.6623 58.582,0 0,26.754 c 5.6377,-11.583 11.4549,-19.5528 17.4516,-23.9095 5.9965,-4.3563 13.4025,-6.5346 22.2182,-6.5347 9.2253,1e-4 19.3222,2.8703 30.2904,8.6104 l -19.3736,44.5901 c -7.3805,-3.0751 -13.2233,-4.6127 -17.5285,-4.6128 -8.2005,10e-5 -14.5559,3.3828 -19.066,10.1481 -6.458,9.5331 -9.6869,27.3691 -9.6868,53.508 l 0,54.7381 -62.8873,0 0,-163.2917 z m 320.2793,97.1755 -125.46709,0 c 1.12748,10.0456 3.84388,17.5285 8.14921,22.4487 6.04775,7.073 13.94069,10.6094 23.67883,10.6094 6.15024,0 11.99306,-1.5376 17.5285,-4.6128 3.38256,-1.9476 7.02151,-5.3815 10.91686,-10.3018 l 61.65724,5.6891 c -9.43072,16.4009 -20.80885,28.1634 -34.13443,35.2876 -13.3259,7.1241 -32.44322,10.6862 -57.35199,10.6862 -21.62881,0 -38.64475,-3.0495 -51.04789,-9.1486 -12.40324,-6.0991 -22.67944,-15.7859 -30.82862,-29.0604 -8.14922,-13.2745 -12.22382,-28.881 -12.22382,-46.8195 0,-25.5239 8.17483,-46.1788 24.52452,-61.9648 16.34962,-15.7857 38.9265,-23.6787 67.7307,-23.6788 23.3712,1e-4 41.82222,3.5366 55.35313,10.6093 13.53059,7.0731 23.83241,17.3236 30.9055,30.7517 7.0727,13.4284 10.60915,30.9056 10.60935,52.4318 l 0,7.0729 z m -63.6561,-29.983 c -1.23021,-12.0956 -4.48476,-20.7573 -9.76368,-25.9852 -5.27917,-5.2277 -12.22393,-7.8416 -20.8343,-7.8417 -9.94316,10e-5 -17.88735,3.9466 -23.8326,11.8394 -3.79279,4.9204 -6.20167,12.2496 -7.22666,21.9875 l 61.65724,0 z m 93.17774,-67.1925 58.4283,0 0,23.8326 c 8.40539,-9.9429 16.88773,-17.0158 25.44706,-21.2187 8.55912,-4.2026 18.88657,-6.304 30.98238,-6.3041 13.01809,1e-4 23.31991,2.3065 30.90549,6.9191 7.58526,4.6129 13.78685,11.4808 18.6048,20.6037 9.84037,-10.6605 18.80962,-17.9128 26.90778,-21.7569 8.09773,-3.8438 18.09204,-5.7658 29.98294,-5.7659 17.52823,1e-4 31.21274,5.2023 41.05357,15.6065 9.84026,10.4044 14.76054,26.6772 14.76083,48.8184 l 0,102.557 -62.73354,0 0,-93.024 c -2.3e-4,-7.3803 -1.43531,-12.8644 -4.30524,-16.4522 -4.20297,-5.6377 -9.43076,-8.4566 -15.68339,-8.4567 -7.38062,10e-5 -13.32595,2.6652 -17.83601,7.9954 -4.51044,5.3304 -6.76557,13.8897 -6.76538,25.6777 l 0,84.2598 -62.73355,0 0,-89.9488 c -1.2e-4,-7.1753 -0.41015,-12.0444 -1.23007,-14.6071 -1.3327,-4.1001 -3.63907,-7.4059 -6.91914,-9.9174 -3.2803,-2.5113 -7.12426,-3.767 -11.5319,-3.7671 -7.1755,10e-5 -13.06958,2.7165 -17.68225,8.1492 -4.61284,5.4329 -6.91922,14.3509 -6.91914,26.754 l 0,83.3372 -62.73354,0 0,-163.2917 z m 316.74293,-62.1185 62.57978,0 0,42.5911 -62.57978,0 0,-42.5911 z m 0,62.1185 62.57978,0 0,163.2917 -62.57978,0 0,-163.2917 z m 95.79168,0 151.45231,0 0,36.5945 -82.41466,83.9523 87.48869,0 0,42.7449 -162.67669,0 0,-40.5923 78.10941,-79.9545 -71.95906,0 0,-42.7449 z"
+           d="m -1470.2813,1725.0291 c -56.0138,0.054 -112.0828,20.5177 -156.0937,61.5937 -85.0794,79.4058 -95.9453,209.1111 -29.5938,301.1563 l 9.7813,69.3437 0.9062,6.4375 5.125,-4 30.5938,-23.9687 c 87.5525,67.3697 213.0935,63.1007 295.9375,-14.2188 18.4642,-17.2329 33.4323,-36.8343 44.875,-57.9062 6.4003,0.736 13.3613,1.0937 20.875,1.0937 24.9087,0 44.0178,-3.5634 57.3437,-10.6875 13.3257,-7.1242 24.6943,-18.8804 34.125,-35.2812 l -61.6562,-5.6875 c -3.8953,4.9202 -7.5237,8.3649 -10.9063,10.3125 -5.5355,3.0752 -11.381,4.5937 -17.5312,4.5937 -2.2646,0 -4.435,-0.18 -6.5,-0.5625 3.5746,-10.6475 6.37,-21.5105 8.3437,-32.5 h 91.8125 v -7.0625 c -10e-5,-21.5262 -3.5522,-39.0091 -10.625,-52.4375 -7.0731,-13.4281 -17.3756,-23.6769 -30.9062,-30.75 -13.3838,-6.9958 -31.5824,-10.5176 -54.5938,-10.5937 -7.0146,-25.9757 -18.6908,-50.9762 -35.0625,-73.6875 l -9.7812,-69.3438 -0.9063,-6.4375 -5.125,4 -30.5937,23.9688 c -41.0402,-31.5796 -90.4197,-47.4228 -139.8438,-47.375 z m 228.125,206.2187 c 6.3617,0.8346 11.6486,3.3459 15.875,7.5313 5.279,5.2278 8.5511,13.9044 9.7813,26 h -24.7813 c 0.5248,-11.1718 0.225,-22.3843 -0.875,-33.5313 z m 118.9731,-33.6623 h 58.582 v 26.754 c 5.6377,-11.583 11.4549,-19.5528 17.4516,-23.9095 5.9965,-4.3563 13.4025,-6.5346 22.2182,-6.5347 9.2253,1e-4 19.3222,2.8703 30.2904,8.6104 l -19.3736,44.5901 c -7.3805,-3.0751 -13.2233,-4.6127 -17.5285,-4.6128 -8.2005,10e-5 -14.5559,3.3828 -19.066,10.1481 -6.458,9.5331 -9.6869,27.3691 -9.6868,53.508 v 54.7381 h -62.8873 z m 320.2793,97.1755 h -125.46709 c 1.12748,10.0456 3.84388,17.5285 8.14921,22.4487 6.04775,7.073 13.94069,10.6094 23.67883,10.6094 6.15024,0 11.99306,-1.5376 17.5285,-4.6128 3.38256,-1.9476 7.02151,-5.3815 10.91686,-10.3018 l 61.65724,5.6891 c -9.43072,16.4009 -20.80885,28.1634 -34.13443,35.2876 -13.3259,7.1241 -32.44322,10.6862 -57.35199,10.6862 -21.62881,0 -38.64475,-3.0495 -51.04789,-9.1486 -12.40324,-6.0991 -22.67944,-15.7859 -30.82862,-29.0604 -8.14922,-13.2745 -12.22382,-28.881 -12.22382,-46.8195 0,-25.5239 8.17483,-46.1788 24.52452,-61.9648 16.34962,-15.7857 38.9265,-23.6787 67.7307,-23.6788 23.3712,1e-4 41.82222,3.5366 55.35313,10.6093 13.53059,7.0731 23.83241,17.3236 30.9055,30.7517 7.0727,13.4284 10.60915,30.9056 10.60935,52.4318 z m -63.6561,-29.983 c -1.23021,-12.0956 -4.48476,-20.7573 -9.76368,-25.9852 -5.27917,-5.2277 -12.22393,-7.8416 -20.8343,-7.8417 -9.94316,10e-5 -17.88735,3.9466 -23.8326,11.8394 -3.79279,4.9204 -6.20167,12.2496 -7.22666,21.9875 z m 93.17774,-67.1925 h 58.4283 v 23.8326 c 8.40539,-9.9429 16.88773,-17.0158 25.44706,-21.2187 8.55912,-4.2026 18.88657,-6.304 30.98238,-6.3041 13.01809,1e-4 23.31991,2.3065 30.90549,6.9191 7.58526,4.6129 13.78685,11.4808 18.6048,20.6037 9.84037,-10.6605 18.80962,-17.9128 26.90778,-21.7569 8.09773,-3.8438 18.09204,-5.7658 29.98294,-5.7659 17.52823,1e-4 31.21274,5.2023 41.05357,15.6065 9.84026,10.4044 14.76054,26.6772 14.76083,48.8184 v 102.557 h -62.73354 v -93.024 c -2.3e-4,-7.3803 -1.43531,-12.8644 -4.30524,-16.4522 -4.20297,-5.6377 -9.43076,-8.4566 -15.68339,-8.4567 -7.38062,10e-5 -13.32595,2.6652 -17.83601,7.9954 -4.51044,5.3304 -6.76557,13.8897 -6.76538,25.6777 v 84.2598 h -62.73355 v -89.9488 c -1.2e-4,-7.1753 -0.41015,-12.0444 -1.23007,-14.6071 -1.3327,-4.1001 -3.63907,-7.4059 -6.91914,-9.9174 -3.2803,-2.5113 -7.12426,-3.767 -11.5319,-3.7671 -7.1755,10e-5 -13.06958,2.7165 -17.68225,8.1492 -4.61284,5.4329 -6.91922,14.3509 -6.91914,26.754 v 83.3372 h -62.73354 z m 316.74293,-62.1185 h 62.57978 v 42.5911 h -62.57978 z m 0,62.1185 h 62.57978 v 163.2917 h -62.57978 z m 95.79168,0 h 151.45231 v 36.5945 l -82.41466,83.9523 h 87.48869 v 42.7449 H -366.998 v -40.5923 l 78.10941,-79.9545 h -71.95906 z"
            inkscape:connector-curvature="0" />
         <path
-           style="fill:#d19f34;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           style="display:inline;overflow:visible;visibility:visible;fill:#d19f34;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;enable-background:accumulate"
            id="use16735"
            d="m -1336.1632,1788.2263 c 0,0 56.3913,141.5671 -147.8368,147.7737 -204.2612,6.2076 -147.8368,147.7737 -147.8368,147.7737 -37.8479,-37.8317 -61.2676,-90.0855 -61.2676,-147.7737 0,-57.6882 23.4197,-109.942 61.2676,-147.7737 37.8479,-37.8318 90.124,-61.2415 147.8368,-61.2415 57.7128,0 109.9889,23.4097 147.8368,61.2415 z"
            inkscape:connector-curvature="0" />
         <path
-           style="fill:#469837;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           style="display:inline;overflow:visible;visibility:visible;fill:#469837;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;enable-background:accumulate"
            id="use16737"
            d="m -1631.8368,2083.7737 c 0,0 -56.3913,-141.5671 147.8368,-147.7737 204.2612,-6.2076 147.8368,-147.7737 147.8368,-147.7737 37.8479,37.8317 61.2676,90.0855 61.2676,147.7737 0,57.6882 -23.4197,109.942 -61.2676,147.7737 -37.8479,37.8318 -90.124,61.2415 -147.8368,61.2415 -57.7128,0 -109.9889,-23.4097 -147.8368,-61.2415 z"
            inkscape:connector-curvature="0" />
         <path
-           style="fill:none;stroke:#4c4c4c;stroke-width:49.86504364;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#4c4c4c;stroke-width:49.86504364;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
            id="path16739"
            transform="matrix(0.8023362,0,0,0.8019941,-2094.2929,1769.2301)"
-           d="m 1021.2642,207.94408 c 0,143.9361 -116.68326,260.61936 -260.61936,260.61936 -143.9361,0 -260.61936,-116.68326 -260.61936,-260.61936 0,-143.936098 116.68326,-260.61936 260.61936,-260.61936 143.9361,0 260.61936,116.683262 260.61936,260.61936 l 0,0 z"
+           d="m 1021.2642,207.94408 c 0,143.9361 -116.68326,260.61936 -260.61936,260.61936 -143.9361,0 -260.61936,-116.68326 -260.61936,-260.61936 0,-143.936098 116.68326,-260.61936 260.61936,-260.61936 143.9361,0 260.61936,116.683262 260.61936,260.61936 z"
            inkscape:connector-curvature="0" />
         <path
-           style="font-size:306.80871582px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Arial Black"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:306.80871582px;line-height:125%;font-family:'Arial Black';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;enable-background:accumulate"
            id="path16741"
-           d="m -1577.2331,1825.1726 127.038,0 c 21.1728,2e-4 37.4271,5.2435 48.7628,15.7299 11.3353,10.4868 17.0031,23.4703 17.0033,38.9503 -2e-4,12.9836 -4.045,24.1194 -12.1345,33.4074 -5.3933,6.1923 -13.2833,11.086 -23.6698,14.6813 15.7797,3.7953 27.3898,10.312 34.8306,19.5501 7.4402,9.2383 11.1605,20.8485 11.1607,34.8306 -2e-4,11.3855 -2.6468,21.6224 -7.9399,30.7108 -5.2934,9.0884 -12.5342,16.2792 -21.7223,21.5725 -5.6929,3.2958 -14.2819,5.6927 -25.7671,7.1908 -15.2807,1.9975 -25.4177,2.9962 -30.4112,2.9962 l -117.1506,0 0,-219.6199 z m 68.4627,86.1401 29.5124,0 c 10.5863,10e-5 17.9519,-1.8225 22.0968,-5.468 4.1445,-3.6452 6.2169,-8.9135 6.217,-15.8049 -1e-4,-6.3916 -2.0725,-11.3853 -6.217,-14.9809 -4.1449,-3.5952 -11.3607,-5.3929 -21.6474,-5.3931 l -29.9618,0 0,41.6469 z m 0,86.29 34.6059,0 c 11.6849,0 19.9244,-2.0723 24.7184,-6.2171 4.7938,-4.1447 7.1907,-9.7126 7.1909,-16.7037 -2e-4,-6.4916 -2.3722,-11.71 -7.116,-15.655 -4.7441,-3.9449 -13.0584,-5.9174 -24.9432,-5.9175 l -34.456,0 0,44.4933 z"
+           d="m -1577.2331,1825.1726 h 127.038 c 21.1728,2e-4 37.4271,5.2435 48.7628,15.7299 11.3353,10.4868 17.0031,23.4703 17.0033,38.9503 -2e-4,12.9836 -4.045,24.1194 -12.1345,33.4074 -5.3933,6.1923 -13.2833,11.086 -23.6698,14.6813 15.7797,3.7953 27.3898,10.312 34.8306,19.5501 7.4402,9.2383 11.1605,20.8485 11.1607,34.8306 -2e-4,11.3855 -2.6468,21.6224 -7.9399,30.7108 -5.2934,9.0884 -12.5342,16.2792 -21.7223,21.5725 -5.6929,3.2958 -14.2819,5.6927 -25.7671,7.1908 -15.2807,1.9975 -25.4177,2.9962 -30.4112,2.9962 h -117.1506 z m 68.4627,86.1401 h 29.5124 c 10.5863,10e-5 17.9519,-1.8225 22.0968,-5.468 4.1445,-3.6452 6.2169,-8.9135 6.217,-15.8049 -1e-4,-6.3916 -2.0725,-11.3853 -6.217,-14.9809 -4.1449,-3.5952 -11.3607,-5.3929 -21.6474,-5.3931 h -29.9618 z m 0,86.29 h 34.6059 c 11.6849,0 19.9244,-2.0723 24.7184,-6.2171 4.7938,-4.1447 7.1907,-9.7126 7.1909,-16.7037 -2e-4,-6.4916 -2.3722,-11.71 -7.116,-15.655 -4.7441,-3.9449 -13.0584,-5.9174 -24.9432,-5.9175 h -34.456 z"
            inkscape:connector-curvature="0" />
         <g
            id="use16745"
            mask="url(#mask6467)"
-           transform="matrix(-1,0,0,-1,-1127.9999,1532)">
+           transform="rotate(180,-563.99995,766)">
           <path
-             style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6447);enable-background:accumulate"
+             style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;filter:url(#filter6447);enable-background:accumulate"
              id="use6863"
              d="m 507.8125,-566.84375 c -7.54052,0.31127 -14.32442,4.87714 -17.4375,11.84375 -3.32061,7.43106 -1.79456,16.12851 3.84375,22 71.38742,76.4228 67.29917,195.79932 -9.15625,267.15625 C 418.92868,-204.1201 321.00173,-198.52349 249.15625,-248 l 26.65625,-20.875 5.125,-4 -6.03125,-2.40625 -105.9375,-42.59375 -6,-2.4375 0.90625,6.4375 15.9375,113 0.90625,6.4375 5.125,-4 30.59375,-23.96875 c 87.55252,67.36975 213.09347,63.10079 295.9375,-14.21875 92.27769,-86.12407 97.25455,-231.41793 11.09375,-323.65625 -3.63563,-4.00109 -8.72059,-6.38195 -14.125,-6.5625 -0.50858,-0.0174 -1.02855,-0.0208 -1.53125,0 z"
              inkscape:connector-curvature="0" />
           <path
-             style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:49.86504364;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+             style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:49.86504364;marker:none;enable-background:accumulate"
              id="use6865"
              d="m 507.8125,-566.84375 c -7.54052,0.31127 -14.32442,4.87714 -17.4375,11.84375 -3.32061,7.43106 -1.79456,16.12851 3.84375,22 71.38742,76.4228 67.29917,195.79932 -9.15625,267.15625 C 418.92868,-204.1201 321.00173,-198.52349 249.15625,-248 l 26.65625,-20.875 5.125,-4 -6.03125,-2.40625 -105.9375,-42.59375 -6,-2.4375 0.90625,6.4375 15.9375,113 0.90625,6.4375 5.125,-4 30.59375,-23.96875 c 87.55252,67.36975 213.09347,63.10079 295.9375,-14.21875 92.27769,-86.12407 97.25455,-231.41793 11.09375,-323.65625 -3.63563,-4.00109 -8.72059,-6.38195 -14.125,-6.5625 -0.50858,-0.0174 -1.02855,-0.0208 -1.53125,0 z"
              inkscape:connector-curvature="0" />
@@ -90088,23 +89414,23 @@
            mask="url(#mask6467)"
            transform="translate(-1839.8676,2340.0508)">
           <path
-             style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6447);enable-background:accumulate"
+             style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;filter:url(#filter6447);enable-background:accumulate"
              id="path7287"
              d="m 507.8125,-566.84375 c -7.54052,0.31127 -14.32442,4.87714 -17.4375,11.84375 -3.32061,7.43106 -1.79456,16.12851 3.84375,22 71.38742,76.4228 67.29917,195.79932 -9.15625,267.15625 C 418.92868,-204.1201 321.00173,-198.52349 249.15625,-248 l 26.65625,-20.875 5.125,-4 -6.03125,-2.40625 -105.9375,-42.59375 -6,-2.4375 0.90625,6.4375 15.9375,113 0.90625,6.4375 5.125,-4 30.59375,-23.96875 c 87.55252,67.36975 213.09347,63.10079 295.9375,-14.21875 92.27769,-86.12407 97.25455,-231.41793 11.09375,-323.65625 -3.63563,-4.00109 -8.72059,-6.38195 -14.125,-6.5625 -0.50858,-0.0174 -1.02855,-0.0208 -1.53125,0 z"
              inkscape:connector-curvature="0" />
           <path
-             style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:49.86504364;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+             style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:49.86504364;marker:none;enable-background:accumulate"
              id="path7289"
              d="m 507.8125,-566.84375 c -7.54052,0.31127 -14.32442,4.87714 -17.4375,11.84375 -3.32061,7.43106 -1.79456,16.12851 3.84375,22 71.38742,76.4228 67.29917,195.79932 -9.15625,267.15625 C 418.92868,-204.1201 321.00173,-198.52349 249.15625,-248 l 26.65625,-20.875 5.125,-4 -6.03125,-2.40625 -105.9375,-42.59375 -6,-2.4375 0.90625,6.4375 15.9375,113 0.90625,6.4375 5.125,-4 30.59375,-23.96875 c 87.55252,67.36975 213.09347,63.10079 295.9375,-14.21875 92.27769,-86.12407 97.25455,-231.41793 11.09375,-323.65625 -3.63563,-4.00109 -8.72059,-6.38195 -14.125,-6.5625 -0.50858,-0.0174 -1.02855,-0.0208 -1.53125,0 z"
              inkscape:connector-curvature="0" />
         </g>
         <path
-           style="font-size:314.89779663px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#dadada;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Arial Black"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:314.89779663px;line-height:125%;font-family:'Arial Black';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#dadada;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10.43299961;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
            id="text16729"
-           d="m -1166.8587,1976.761 -125.4671,0 c 1.1275,10.0456 3.8439,17.5285 8.1492,22.4487 6.0478,7.073 13.9407,10.6094 23.6789,10.6094 6.1502,0 11.993,-1.5376 17.5285,-4.6128 3.3825,-1.9476 7.0215,-5.3815 10.9168,-10.3018 l 61.6573,5.6891 c -9.4307,16.4009 -20.8089,28.1634 -34.1345,35.2876 -13.3259,7.1241 -32.4432,10.6862 -57.3519,10.6862 -21.6289,0 -38.6448,-3.0495 -51.0479,-9.1486 -12.4033,-6.0991 -22.6795,-15.7859 -30.8286,-29.0604 -8.1493,-13.2745 -12.2239,-28.881 -12.2239,-46.8195 0,-25.5239 8.1749,-46.1788 24.5245,-61.9648 16.3497,-15.7857 38.9265,-23.6787 67.7307,-23.6788 23.3712,1e-4 41.8223,3.5366 55.3532,10.6093 13.5306,7.0731 23.8324,17.3236 30.9055,30.7517 7.0727,13.4284 10.6091,30.9056 10.6093,52.4318 l 0,7.0729 z m -63.6561,-29.983 c -1.2302,-12.0956 -4.4847,-20.7573 -9.7637,-25.9852 -5.2791,-5.2277 -12.2239,-7.8416 -20.8343,-7.8417 -9.9431,10e-5 -17.8873,3.9466 -23.8325,11.8394 -3.7928,4.9204 -6.2017,12.2496 -7.2267,21.9875 l 61.6572,0 z m 93.3316,-67.1925 58.582,0 0,26.754 c 5.6377,-11.583 11.4549,-19.5528 17.4516,-23.9095 5.9965,-4.3563 13.4025,-6.5346 22.2182,-6.5347 9.2253,1e-4 19.3222,2.8703 30.2904,8.6104 l -19.3736,44.5901 c -7.3805,-3.0751 -13.2233,-4.6127 -17.5285,-4.6128 -8.2005,10e-5 -14.5559,3.3828 -19.066,10.1481 -6.458,9.5331 -9.6869,27.3691 -9.6868,53.508 l 0,54.7381 -62.8873,0 0,-163.2917 z m 320.2793,97.1755 -125.46709,0 c 1.12748,10.0456 3.84388,17.5285 8.14921,22.4487 6.04775,7.073 13.94069,10.6094 23.67883,10.6094 6.15024,0 11.99306,-1.5376 17.5285,-4.6128 3.38256,-1.9476 7.02151,-5.3815 10.91686,-10.3018 l 61.65724,5.6891 c -9.43072,16.4009 -20.80885,28.1634 -34.13443,35.2876 -13.3259,7.1241 -32.44322,10.6862 -57.35199,10.6862 -21.62881,0 -38.64475,-3.0495 -51.04789,-9.1486 -12.40324,-6.0991 -22.67944,-15.7859 -30.82862,-29.0604 -8.14922,-13.2745 -12.22382,-28.881 -12.22382,-46.8195 0,-25.5239 8.17483,-46.1788 24.52452,-61.9648 16.34962,-15.7857 38.9265,-23.6787 67.7307,-23.6788 23.3712,1e-4 41.82222,3.5366 55.35313,10.6093 13.53059,7.0731 23.83241,17.3236 30.9055,30.7517 7.0727,13.4284 10.60915,30.9056 10.60935,52.4318 l 0,7.0729 z m -63.6561,-29.983 c -1.23021,-12.0956 -4.48476,-20.7573 -9.76368,-25.9852 -5.27917,-5.2277 -12.22393,-7.8416 -20.8343,-7.8417 -9.94316,10e-5 -17.88735,3.9466 -23.8326,11.8394 -3.79279,4.9204 -6.20167,12.2496 -7.22666,21.9875 l 61.65724,0 z m 93.17774,-67.1925 58.4283,0 0,23.8326 c 8.40539,-9.9429 16.88773,-17.0158 25.44706,-21.2187 8.55912,-4.2026 18.88657,-6.304 30.98238,-6.3041 13.01809,1e-4 23.31991,2.3065 30.90549,6.9191 7.58526,4.6129 13.78685,11.4808 18.6048,20.6037 9.84037,-10.6605 18.80962,-17.9128 26.90778,-21.7569 8.09773,-3.8438 18.09204,-5.7658 29.98294,-5.7659 17.52823,1e-4 31.21274,5.2023 41.05357,15.6065 9.84026,10.4044 14.76054,26.6772 14.76083,48.8184 l 0,102.557 -62.73354,0 0,-93.024 c -2.3e-4,-7.3803 -1.43531,-12.8644 -4.30524,-16.4522 -4.20297,-5.6377 -9.43076,-8.4566 -15.68339,-8.4567 -7.38062,10e-5 -13.32595,2.6652 -17.83601,7.9954 -4.51044,5.3304 -6.76557,13.8897 -6.76538,25.6777 l 0,84.2598 -62.73355,0 0,-89.9488 c -1.2e-4,-7.1753 -0.41015,-12.0444 -1.23007,-14.6071 -1.3327,-4.1001 -3.63907,-7.4059 -6.91914,-9.9174 -3.2803,-2.5113 -7.12426,-3.767 -11.5319,-3.7671 -7.1755,10e-5 -13.06958,2.7165 -17.68225,8.1492 -4.61284,5.4329 -6.91922,14.3509 -6.91914,26.754 l 0,83.3372 -62.73354,0 0,-163.2917 z m 316.74293,-62.1185 62.57978,0 0,42.5911 -62.57978,0 0,-42.5911 z m 0,62.1185 62.57978,0 0,163.2917 -62.57978,0 0,-163.2917 z m 95.79168,0 151.45231,0 0,36.5945 -82.41466,83.9523 87.48869,0 0,42.7449 -162.67669,0 0,-40.5923 78.10941,-79.9545 -71.95906,0 0,-42.7449 z"
+           d="m -1166.8587,1976.761 h -125.4671 c 1.1275,10.0456 3.8439,17.5285 8.1492,22.4487 6.0478,7.073 13.9407,10.6094 23.6789,10.6094 6.1502,0 11.993,-1.5376 17.5285,-4.6128 3.3825,-1.9476 7.0215,-5.3815 10.9168,-10.3018 l 61.6573,5.6891 c -9.4307,16.4009 -20.8089,28.1634 -34.1345,35.2876 -13.3259,7.1241 -32.4432,10.6862 -57.3519,10.6862 -21.6289,0 -38.6448,-3.0495 -51.0479,-9.1486 -12.4033,-6.0991 -22.6795,-15.7859 -30.8286,-29.0604 -8.1493,-13.2745 -12.2239,-28.881 -12.2239,-46.8195 0,-25.5239 8.1749,-46.1788 24.5245,-61.9648 16.3497,-15.7857 38.9265,-23.6787 67.7307,-23.6788 23.3712,1e-4 41.8223,3.5366 55.3532,10.6093 13.5306,7.0731 23.8324,17.3236 30.9055,30.7517 7.0727,13.4284 10.6091,30.9056 10.6093,52.4318 z m -63.6561,-29.983 c -1.2302,-12.0956 -4.4847,-20.7573 -9.7637,-25.9852 -5.2791,-5.2277 -12.2239,-7.8416 -20.8343,-7.8417 -9.9431,10e-5 -17.8873,3.9466 -23.8325,11.8394 -3.7928,4.9204 -6.2017,12.2496 -7.2267,21.9875 z m 93.3316,-67.1925 h 58.582 v 26.754 c 5.6377,-11.583 11.4549,-19.5528 17.4516,-23.9095 5.9965,-4.3563 13.4025,-6.5346 22.2182,-6.5347 9.2253,1e-4 19.3222,2.8703 30.2904,8.6104 l -19.3736,44.5901 c -7.3805,-3.0751 -13.2233,-4.6127 -17.5285,-4.6128 -8.2005,10e-5 -14.5559,3.3828 -19.066,10.1481 -6.458,9.5331 -9.6869,27.3691 -9.6868,53.508 v 54.7381 h -62.8873 z m 320.2793,97.1755 h -125.46709 c 1.12748,10.0456 3.84388,17.5285 8.14921,22.4487 6.04775,7.073 13.94069,10.6094 23.67883,10.6094 6.15024,0 11.99306,-1.5376 17.5285,-4.6128 3.38256,-1.9476 7.02151,-5.3815 10.91686,-10.3018 l 61.65724,5.6891 c -9.43072,16.4009 -20.80885,28.1634 -34.13443,35.2876 -13.3259,7.1241 -32.44322,10.6862 -57.35199,10.6862 -21.62881,0 -38.64475,-3.0495 -51.04789,-9.1486 -12.40324,-6.0991 -22.67944,-15.7859 -30.82862,-29.0604 -8.14922,-13.2745 -12.22382,-28.881 -12.22382,-46.8195 0,-25.5239 8.17483,-46.1788 24.52452,-61.9648 16.34962,-15.7857 38.9265,-23.6787 67.7307,-23.6788 23.3712,1e-4 41.82222,3.5366 55.35313,10.6093 13.53059,7.0731 23.83241,17.3236 30.9055,30.7517 7.0727,13.4284 10.60915,30.9056 10.60935,52.4318 z m -63.6561,-29.983 c -1.23021,-12.0956 -4.48476,-20.7573 -9.76368,-25.9852 -5.27917,-5.2277 -12.22393,-7.8416 -20.8343,-7.8417 -9.94316,10e-5 -17.88735,3.9466 -23.8326,11.8394 -3.79279,4.9204 -6.20167,12.2496 -7.22666,21.9875 z m 93.17774,-67.1925 h 58.4283 v 23.8326 c 8.40539,-9.9429 16.88773,-17.0158 25.44706,-21.2187 8.55912,-4.2026 18.88657,-6.304 30.98238,-6.3041 13.01809,1e-4 23.31991,2.3065 30.90549,6.9191 7.58526,4.6129 13.78685,11.4808 18.6048,20.6037 9.84037,-10.6605 18.80962,-17.9128 26.90778,-21.7569 8.09773,-3.8438 18.09204,-5.7658 29.98294,-5.7659 17.52823,1e-4 31.21274,5.2023 41.05357,15.6065 9.84026,10.4044 14.76054,26.6772 14.76083,48.8184 v 102.557 h -62.73354 v -93.024 c -2.3e-4,-7.3803 -1.43531,-12.8644 -4.30524,-16.4522 -4.20297,-5.6377 -9.43076,-8.4566 -15.68339,-8.4567 -7.38062,10e-5 -13.32595,2.6652 -17.83601,7.9954 -4.51044,5.3304 -6.76557,13.8897 -6.76538,25.6777 v 84.2598 h -62.73355 v -89.9488 c -1.2e-4,-7.1753 -0.41015,-12.0444 -1.23007,-14.6071 -1.3327,-4.1001 -3.63907,-7.4059 -6.91914,-9.9174 -3.2803,-2.5113 -7.12426,-3.767 -11.5319,-3.7671 -7.1755,10e-5 -13.06958,2.7165 -17.68225,8.1492 -4.61284,5.4329 -6.91922,14.3509 -6.91914,26.754 v 83.3372 h -62.73354 z m 316.74293,-62.1185 h 62.57978 v 42.5911 h -62.57978 z m 0,62.1185 h 62.57978 v 163.2917 h -62.57978 z m 95.79168,0 h 151.45231 v 36.5945 l -82.41466,83.9523 h 87.48869 v 42.7449 H -380.998 v -40.5923 l 78.10941,-79.9545 h -71.95906 z"
            inkscape:connector-curvature="0" />
         <text
-           style="font-size:71.35877228px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+           style="font-style:normal;font-weight:normal;font-size:71.35877228px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
            xml:space="preserve"
            id="text3172"
            y="2147.7705"
@@ -90116,19 +89442,57 @@
     </g>
   </g>
   <text
-     style="font-size:51.04000092px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     style="font-style:normal;font-weight:normal;font-size:51.04000092px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none"
      xml:space="preserve"
      id="text18989"
-     y="727.85242"
+     y="947.85242"
      x="176.98375"><tspan
        id="tspan18991"
-       y="727.85242"
+       y="947.85242"
        x="176.98375"
        style="font-size:51.04000092px">%% splash %%</tspan></text>
   <g
      style="display:inline"
      id="g19354"
-     transform="matrix(0.2686638,0,0,0.2686638,514.93573,-19.29882)">
+     transform="matrix(0.2686638,0,0,0.2686638,840.9357,0.70118)">
+    <g
+       id="g15279"
+       transform="matrix(5.3333328,0,0,5.3333328,4891.23,-8701.5809)">
+      <rect
+         style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
+         id="ico256"
+         y="2013.0917"
+         x="-1492.3632"
+         height="178.66196"
+         width="178.66196" />
+      <use
+         xlink:href="#g19358"
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         id="use15277"
+         transform="translate(223.29672,0.68429344)" />
+    </g>
+    <g
+       transform="matrix(1.3333332,0,0,1.3333332,-7.7929066,-671.71591)"
+       id="g15276">
+      <rect
+         width="178.66196"
+         height="178.66196"
+         x="-1492.3632"
+         y="2013.0917"
+         id="ico64"
+         style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:0;marker:none;enable-background:accumulate" />
+      <use
+         transform="translate(223.29672,0.68429344)"
+         id="use15274"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622"
+         xlink:href="#g19358" />
+    </g>
     <g
        id="g19356"
        mask="url(#mask6467)"
@@ -90137,55 +89501,64 @@
        id="g19358"
        transform="matrix(0.3669311,0,0,0.3669311,-1086.1197,1386.8468)">
       <path
-         style="font-size:314.89779663px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter19931);enable-background:accumulate;font-family:Arial Black"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:314.89779663px;line-height:125%;font-family:'Arial Black';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;overflow:visible;visibility:visible;opacity:0.5;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;filter:url(#filter19931);enable-background:accumulate"
          id="path19360"
-         d="m -1253,2027.2478 c -3.5746,10.6475 -4.3073,15.1469 -15.75,36.2188 -11.4427,21.0719 -26.4108,40.6733 -44.875,57.9062 -82.844,77.3195 -208.385,81.5885 -295.9375,14.2188 l -30.5938,23.9687 -5.125,4 -0.9062,-6.4375 -9.7813,-69.3437 c -66.3515,-92.0452 -55.4856,-221.7505 29.5938,-301.1563 44.0109,-41.076 100.0799,-61.5397 156.0937,-61.5937 49.4241,-0.048 98.8036,15.7954 139.8438,47.375 l 30.5937,-23.9688 5.125,-4 0.9063,6.4375 9.7812,69.3438 c 16.3717,22.7113 28.0479,47.7118 35.0625,73.6875 7.0146,25.9757 5.7125,26.1967 6.8125,37.3437 1.1,11.147 1.3998,22.3595 0.875,33.5313 -0.5248,11.1718 -1.4013,18.9792 -3.375,29.9687 -1.9737,10.9895 -4.7691,21.8525 -8.3437,32.5 z" />
+         d="m -1253,2027.2478 c -3.5746,10.6475 -4.3073,15.1469 -15.75,36.2188 -11.4427,21.0719 -26.4108,40.6733 -44.875,57.9062 -82.844,77.3195 -208.385,81.5885 -295.9375,14.2188 l -30.5938,23.9687 -5.125,4 -0.9062,-6.4375 -9.7813,-69.3437 c -66.3515,-92.0452 -55.4856,-221.7505 29.5938,-301.1563 44.0109,-41.076 100.0799,-61.5397 156.0937,-61.5937 49.4241,-0.048 98.8036,15.7954 139.8438,47.375 l 30.5937,-23.9688 5.125,-4 0.9063,6.4375 9.7812,69.3438 c 16.3717,22.7113 28.0479,47.7118 35.0625,73.6875 7.0146,25.9757 5.7125,26.1967 6.8125,37.3437 1.1,11.147 1.3998,22.3595 0.875,33.5313 -0.5248,11.1718 -1.4013,18.9792 -3.375,29.9687 -1.9737,10.9895 -4.7691,21.8525 -8.3437,32.5 z"
+         inkscape:connector-curvature="0" />
       <path
-         style="fill:#d19f34;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         style="display:inline;overflow:visible;visibility:visible;fill:#d19f34;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;enable-background:accumulate"
          id="path19362"
-         d="m -1336.1632,1788.2263 c 0,0 56.3913,141.5671 -147.8368,147.7737 -204.2612,6.2076 -147.8368,147.7737 -147.8368,147.7737 -37.8479,-37.8317 -61.2676,-90.0855 -61.2676,-147.7737 0,-57.6882 23.4197,-109.942 61.2676,-147.7737 37.8479,-37.8318 90.124,-61.2415 147.8368,-61.2415 57.7128,0 109.9889,23.4097 147.8368,61.2415 z" />
+         d="m -1336.1632,1788.2263 c 0,0 56.3913,141.5671 -147.8368,147.7737 -204.2612,6.2076 -147.8368,147.7737 -147.8368,147.7737 -37.8479,-37.8317 -61.2676,-90.0855 -61.2676,-147.7737 0,-57.6882 23.4197,-109.942 61.2676,-147.7737 37.8479,-37.8318 90.124,-61.2415 147.8368,-61.2415 57.7128,0 109.9889,23.4097 147.8368,61.2415 z"
+         inkscape:connector-curvature="0" />
       <path
-         style="fill:#469837;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         style="display:inline;overflow:visible;visibility:visible;fill:#469837;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;enable-background:accumulate"
          id="path19364"
-         d="m -1631.8368,2083.7737 c 0,0 -56.3913,-141.5671 147.8368,-147.7737 204.2612,-6.2076 147.8368,-147.7737 147.8368,-147.7737 37.8479,37.8317 61.2676,90.0855 61.2676,147.7737 0,57.6882 -23.4197,109.942 -61.2676,147.7737 -37.8479,37.8318 -90.124,61.2415 -147.8368,61.2415 -57.7128,0 -109.9889,-23.4097 -147.8368,-61.2415 z" />
+         d="m -1631.8368,2083.7737 c 0,0 -56.3913,-141.5671 147.8368,-147.7737 204.2612,-6.2076 147.8368,-147.7737 147.8368,-147.7737 37.8479,37.8317 61.2676,90.0855 61.2676,147.7737 0,57.6882 -23.4197,109.942 -61.2676,147.7737 -37.8479,37.8318 -90.124,61.2415 -147.8368,61.2415 -57.7128,0 -109.9889,-23.4097 -147.8368,-61.2415 z"
+         inkscape:connector-curvature="0" />
       <path
-         style="fill:none;stroke:#4c4c4c;stroke-width:49.86504364;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10.43299961;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#4c4c4c;stroke-width:49.86504364;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
          id="path19366"
          transform="matrix(0.8023362,0,0,0.8019941,-2094.2929,1769.2301)"
-         d="m 1021.2642,207.94408 c 0,143.9361 -116.68326,260.61936 -260.61936,260.61936 -143.9361,0 -260.61936,-116.68326 -260.61936,-260.61936 0,-143.936098 116.68326,-260.61936 260.61936,-260.61936 143.9361,0 260.61936,116.683262 260.61936,260.61936 l 0,0 z" />
+         d="m 1021.2642,207.94408 c 0,143.9361 -116.68326,260.61936 -260.61936,260.61936 -143.9361,0 -260.61936,-116.68326 -260.61936,-260.61936 0,-143.936098 116.68326,-260.61936 260.61936,-260.61936 143.9361,0 260.61936,116.683262 260.61936,260.61936 z"
+         inkscape:connector-curvature="0" />
       <path
-         style="font-size:306.80871582px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Arial Black"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:306.80871582px;line-height:125%;font-family:'Arial Black';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;enable-background:accumulate"
          id="path19368"
-         d="m -1577.2331,1825.1726 127.038,0 c 21.1728,2e-4 37.4271,5.2435 48.7628,15.7299 11.3353,10.4868 17.0031,23.4703 17.0033,38.9503 -2e-4,12.9836 -4.045,24.1194 -12.1345,33.4074 -5.3933,6.1923 -13.2833,11.086 -23.6698,14.6813 15.7797,3.7953 27.3898,10.312 34.8306,19.5501 7.4402,9.2383 11.1605,20.8485 11.1607,34.8306 -2e-4,11.3855 -2.6468,21.6224 -7.9399,30.7108 -5.2934,9.0884 -12.5342,16.2792 -21.7223,21.5725 -5.6929,3.2958 -14.2819,5.6927 -25.7671,7.1908 -15.2807,1.9975 -25.4177,2.9962 -30.4112,2.9962 l -117.1506,0 0,-219.6199 z m 68.4627,86.1401 29.5124,0 c 10.5863,10e-5 17.9519,-1.8225 22.0968,-5.468 4.1445,-3.6452 6.2169,-8.9135 6.217,-15.8049 -1e-4,-6.3916 -2.0725,-11.3853 -6.217,-14.9809 -4.1449,-3.5952 -11.3607,-5.3929 -21.6474,-5.3931 l -29.9618,0 0,41.6469 z m 0,86.29 34.6059,0 c 11.6849,0 19.9244,-2.0723 24.7184,-6.2171 4.7938,-4.1447 7.1907,-9.7126 7.1909,-16.7037 -2e-4,-6.4916 -2.3722,-11.71 -7.116,-15.655 -4.7441,-3.9449 -13.0584,-5.9174 -24.9432,-5.9175 l -34.456,0 0,44.4933 z" />
+         d="m -1577.2331,1825.1726 h 127.038 c 21.1728,2e-4 37.4271,5.2435 48.7628,15.7299 11.3353,10.4868 17.0031,23.4703 17.0033,38.9503 -2e-4,12.9836 -4.045,24.1194 -12.1345,33.4074 -5.3933,6.1923 -13.2833,11.086 -23.6698,14.6813 15.7797,3.7953 27.3898,10.312 34.8306,19.5501 7.4402,9.2383 11.1605,20.8485 11.1607,34.8306 -2e-4,11.3855 -2.6468,21.6224 -7.9399,30.7108 -5.2934,9.0884 -12.5342,16.2792 -21.7223,21.5725 -5.6929,3.2958 -14.2819,5.6927 -25.7671,7.1908 -15.2807,1.9975 -25.4177,2.9962 -30.4112,2.9962 h -117.1506 z m 68.4627,86.1401 h 29.5124 c 10.5863,10e-5 17.9519,-1.8225 22.0968,-5.468 4.1445,-3.6452 6.2169,-8.9135 6.217,-15.8049 -1e-4,-6.3916 -2.0725,-11.3853 -6.217,-14.9809 -4.1449,-3.5952 -11.3607,-5.3929 -21.6474,-5.3931 h -29.9618 z m 0,86.29 h 34.6059 c 11.6849,0 19.9244,-2.0723 24.7184,-6.2171 4.7938,-4.1447 7.1907,-9.7126 7.1909,-16.7037 -2e-4,-6.4916 -2.3722,-11.71 -7.116,-15.655 -4.7441,-3.9449 -13.0584,-5.9174 -24.9432,-5.9175 h -34.456 z"
+         inkscape:connector-curvature="0" />
       <g
          id="g19370"
          mask="url(#mask6467)"
-         transform="matrix(-1,0,0,-1,-1127.9999,1532)">
+         transform="rotate(180,-563.99995,766)">
         <path
-           style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6447);enable-background:accumulate"
+           style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;filter:url(#filter6447);enable-background:accumulate"
            id="path19372"
-           d="m 507.8125,-566.84375 c -7.54052,0.31127 -14.32442,4.87714 -17.4375,11.84375 -3.32061,7.43106 -1.79456,16.12851 3.84375,22 71.38742,76.4228 67.29917,195.79932 -9.15625,267.15625 C 418.92868,-204.1201 321.00173,-198.52349 249.15625,-248 l 26.65625,-20.875 5.125,-4 -6.03125,-2.40625 -105.9375,-42.59375 -6,-2.4375 0.90625,6.4375 15.9375,113 0.90625,6.4375 5.125,-4 30.59375,-23.96875 c 87.55252,67.36975 213.09347,63.10079 295.9375,-14.21875 92.27769,-86.12407 97.25455,-231.41793 11.09375,-323.65625 -3.63563,-4.00109 -8.72059,-6.38195 -14.125,-6.5625 -0.50858,-0.0174 -1.02855,-0.0208 -1.53125,0 z" />
+           d="m 507.8125,-566.84375 c -7.54052,0.31127 -14.32442,4.87714 -17.4375,11.84375 -3.32061,7.43106 -1.79456,16.12851 3.84375,22 71.38742,76.4228 67.29917,195.79932 -9.15625,267.15625 C 418.92868,-204.1201 321.00173,-198.52349 249.15625,-248 l 26.65625,-20.875 5.125,-4 -6.03125,-2.40625 -105.9375,-42.59375 -6,-2.4375 0.90625,6.4375 15.9375,113 0.90625,6.4375 5.125,-4 30.59375,-23.96875 c 87.55252,67.36975 213.09347,63.10079 295.9375,-14.21875 92.27769,-86.12407 97.25455,-231.41793 11.09375,-323.65625 -3.63563,-4.00109 -8.72059,-6.38195 -14.125,-6.5625 -0.50858,-0.0174 -1.02855,-0.0208 -1.53125,0 z"
+           inkscape:connector-curvature="0" />
         <path
-           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:49.86504364;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:49.86504364;marker:none;enable-background:accumulate"
            id="path19374"
-           d="m 507.8125,-566.84375 c -7.54052,0.31127 -14.32442,4.87714 -17.4375,11.84375 -3.32061,7.43106 -1.79456,16.12851 3.84375,22 71.38742,76.4228 67.29917,195.79932 -9.15625,267.15625 C 418.92868,-204.1201 321.00173,-198.52349 249.15625,-248 l 26.65625,-20.875 5.125,-4 -6.03125,-2.40625 -105.9375,-42.59375 -6,-2.4375 0.90625,6.4375 15.9375,113 0.90625,6.4375 5.125,-4 30.59375,-23.96875 c 87.55252,67.36975 213.09347,63.10079 295.9375,-14.21875 92.27769,-86.12407 97.25455,-231.41793 11.09375,-323.65625 -3.63563,-4.00109 -8.72059,-6.38195 -14.125,-6.5625 -0.50858,-0.0174 -1.02855,-0.0208 -1.53125,0 z" />
+           d="m 507.8125,-566.84375 c -7.54052,0.31127 -14.32442,4.87714 -17.4375,11.84375 -3.32061,7.43106 -1.79456,16.12851 3.84375,22 71.38742,76.4228 67.29917,195.79932 -9.15625,267.15625 C 418.92868,-204.1201 321.00173,-198.52349 249.15625,-248 l 26.65625,-20.875 5.125,-4 -6.03125,-2.40625 -105.9375,-42.59375 -6,-2.4375 0.90625,6.4375 15.9375,113 0.90625,6.4375 5.125,-4 30.59375,-23.96875 c 87.55252,67.36975 213.09347,63.10079 295.9375,-14.21875 92.27769,-86.12407 97.25455,-231.41793 11.09375,-323.65625 -3.63563,-4.00109 -8.72059,-6.38195 -14.125,-6.5625 -0.50858,-0.0174 -1.02855,-0.0208 -1.53125,0 z"
+           inkscape:connector-curvature="0" />
       </g>
       <g
          id="g19376"
          mask="url(#mask6467)"
          transform="translate(-1839.8676,2340.0508)">
         <path
-           style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6447);enable-background:accumulate"
+           style="display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;filter:url(#filter6447);enable-background:accumulate"
            id="path19378"
-           d="m 507.8125,-566.84375 c -7.54052,0.31127 -14.32442,4.87714 -17.4375,11.84375 -3.32061,7.43106 -1.79456,16.12851 3.84375,22 71.38742,76.4228 67.29917,195.79932 -9.15625,267.15625 C 418.92868,-204.1201 321.00173,-198.52349 249.15625,-248 l 26.65625,-20.875 5.125,-4 -6.03125,-2.40625 -105.9375,-42.59375 -6,-2.4375 0.90625,6.4375 15.9375,113 0.90625,6.4375 5.125,-4 30.59375,-23.96875 c 87.55252,67.36975 213.09347,63.10079 295.9375,-14.21875 92.27769,-86.12407 97.25455,-231.41793 11.09375,-323.65625 -3.63563,-4.00109 -8.72059,-6.38195 -14.125,-6.5625 -0.50858,-0.0174 -1.02855,-0.0208 -1.53125,0 z" />
+           d="m 507.8125,-566.84375 c -7.54052,0.31127 -14.32442,4.87714 -17.4375,11.84375 -3.32061,7.43106 -1.79456,16.12851 3.84375,22 71.38742,76.4228 67.29917,195.79932 -9.15625,267.15625 C 418.92868,-204.1201 321.00173,-198.52349 249.15625,-248 l 26.65625,-20.875 5.125,-4 -6.03125,-2.40625 -105.9375,-42.59375 -6,-2.4375 0.90625,6.4375 15.9375,113 0.90625,6.4375 5.125,-4 30.59375,-23.96875 c 87.55252,67.36975 213.09347,63.10079 295.9375,-14.21875 92.27769,-86.12407 97.25455,-231.41793 11.09375,-323.65625 -3.63563,-4.00109 -8.72059,-6.38195 -14.125,-6.5625 -0.50858,-0.0174 -1.02855,-0.0208 -1.53125,0 z"
+           inkscape:connector-curvature="0" />
         <path
-           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:49.86504364;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+           style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:49.86504364;marker:none;enable-background:accumulate"
            id="path19380"
-           d="m 507.8125,-566.84375 c -7.54052,0.31127 -14.32442,4.87714 -17.4375,11.84375 -3.32061,7.43106 -1.79456,16.12851 3.84375,22 71.38742,76.4228 67.29917,195.79932 -9.15625,267.15625 C 418.92868,-204.1201 321.00173,-198.52349 249.15625,-248 l 26.65625,-20.875 5.125,-4 -6.03125,-2.40625 -105.9375,-42.59375 -6,-2.4375 0.90625,6.4375 15.9375,113 0.90625,6.4375 5.125,-4 30.59375,-23.96875 c 87.55252,67.36975 213.09347,63.10079 295.9375,-14.21875 92.27769,-86.12407 97.25455,-231.41793 11.09375,-323.65625 -3.63563,-4.00109 -8.72059,-6.38195 -14.125,-6.5625 -0.50858,-0.0174 -1.02855,-0.0208 -1.53125,0 z" />
+           d="m 507.8125,-566.84375 c -7.54052,0.31127 -14.32442,4.87714 -17.4375,11.84375 -3.32061,7.43106 -1.79456,16.12851 3.84375,22 71.38742,76.4228 67.29917,195.79932 -9.15625,267.15625 C 418.92868,-204.1201 321.00173,-198.52349 249.15625,-248 l 26.65625,-20.875 5.125,-4 -6.03125,-2.40625 -105.9375,-42.59375 -6,-2.4375 0.90625,6.4375 15.9375,113 0.90625,6.4375 5.125,-4 30.59375,-23.96875 c 87.55252,67.36975 213.09347,63.10079 295.9375,-14.21875 92.27769,-86.12407 97.25455,-231.41793 11.09375,-323.65625 -3.63563,-4.00109 -8.72059,-6.38195 -14.125,-6.5625 -0.50858,-0.0174 -1.02855,-0.0208 -1.53125,0 z"
+           inkscape:connector-curvature="0" />
       </g>
     </g>
     <rect
-       style="fill:none;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
        id="ico48"
        y="2012.4073"
        x="-1715.66"
@@ -90195,7 +89568,7 @@
        id="g19973"
        transform="matrix(0.5,0,0,0.5,-593.54387,1095.1925)">
       <rect
-         style="fill:none;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
          id="ico24"
          y="2013.0917"
          x="-1492.3632"
@@ -90214,7 +89587,7 @@
        id="g19977"
        transform="matrix(0.6666666,0,0,0.6666666,-493.70173,729.90034)">
       <rect
-         style="fill:none;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
          id="ico32"
          y="2013.0917"
          x="-1492.3632"
@@ -90238,7 +89611,7 @@
          x="-1492.3632"
          y="2013.0917"
          id="ico16"
-         style="fill:none;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+         style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:0;marker:none;enable-background:accumulate" />
       <use
          transform="translate(223.29672,0.68429344)"
          id="use17025"
@@ -90250,14 +89623,14 @@
     </g>
   </g>
   <text
-     style="font-size:13.88476658px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     style="font-style:normal;font-weight:normal;font-size:13.88476658px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none"
      xml:space="preserve"
      id="text19983"
-     y="509.33417"
-     x="26.008392"><tspan
+     y="525.09155"
+     x="91.550484"><tspan
        id="tspan19985"
-       y="509.33417"
-       x="26.008392">%% ico48 ico24 ico32 ico16 icoplay24 icostop24 %%</tspan></text>
+       y="525.09155"
+       x="91.550484">%% ico256                                 ico064    ico048  ico032 ico024 ico016 icoplay24 icostop24 %%</tspan></text>
   <g
      transform="translate(1050.009,-193.72536)"
      id="g17590">
@@ -90490,7 +89863,7 @@
     </g>
     <text
        xml:space="preserve"
-       style="font-size:10.49618816px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-903.8222"
        y="392.43793"
        id="text7261"
@@ -90498,10 +89871,11 @@
          sodipodi:role="line"
          id="tspan7263"
          x="-903.8222"
-         y="392.43793">100</tspan></text>
+         y="392.43793"
+         style="font-size:10.49618816px;line-height:1.25">100</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:10.49618816px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-850.90784"
        y="370.95535"
        id="text7265"
@@ -90509,10 +89883,11 @@
          sodipodi:role="line"
          id="tspan7267"
          x="-850.90784"
-         y="370.95535">200</tspan></text>
+         y="370.95535"
+         style="font-size:10.49618816px;line-height:1.25">200</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:10.49618816px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-793.92377"
        y="392.13516"
        id="text7269"
@@ -90520,10 +89895,11 @@
          sodipodi:role="line"
          id="tspan7271"
          x="-793.92377"
-         y="392.13516">300</tspan></text>
+         y="392.13516"
+         style="font-size:10.49618816px;line-height:1.25">300</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:10.49618816px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-777.50763"
        y="438.86819"
        id="text7273"
@@ -90531,10 +89907,11 @@
          sodipodi:role="line"
          id="tspan7275"
          x="-777.50763"
-         y="438.86819">400</tspan></text>
+         y="438.86819"
+         style="font-size:10.49618816px;line-height:1.25">400</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:10.49618816px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-909.64709"
        y="439.1181"
        id="text7277"
@@ -90542,7 +89919,8 @@
          sodipodi:role="line"
          id="tspan7279"
          x="-909.64709"
-         y="439.1181">0</tspan></text>
+         y="439.1181"
+         style="font-size:10.49618816px;line-height:1.25">0</tspan></text>
     <path
        style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline"
        d="m -890.18653,431.39368 -3.78125,2.25 -3.625,2.15625 3.78125,2.28125 3.59375,2.15625 0,-3.40625 48.3125,0 1,0 0,-2 -1,0 -48.3125,0 0.0312,-3.4375 z"
@@ -90564,12 +89942,13 @@
      y="121.52582"
      id="text16266"
      xml:space="preserve"
-     style="font-size:12.76095104px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
-     sodipodi:linespacing="125%"><tspan
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     sodipodi:linespacing="0%"><tspan
        sodipodi:role="line"
        id="tspan16268"
        x="73.295929"
-       y="121.52582">%% editIECrawcode editWXGLADE editPYTHONcode EditCfile Transfer Connect Disconnect Debug %%</tspan></text>
+       y="121.52582"
+       style="font-size:12.76095104px;line-height:1.25">%% editIECrawcode editWXGLADE editPYTHONcode EditCfile Transfer Connect Disconnect Debug IDManager %%</tspan></text>
   <rect
      width="24"
      height="24"
@@ -90585,7 +89964,7 @@
        transform="matrix(1.6473499,0,0,1.6473499,800.92342,263.57576)"
        id="flowRoot19870"
        xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20064);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Andale Mono"><flowRegion
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0.01%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20064);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><flowRegion
          id="flowRegion19872"
          style="fill:url(#linearGradient19880);fill-opacity:1;stroke:url(#linearGradient19882)"><rect
            width="382.57648"
@@ -90593,9 +89972,9 @@
            x="-85.494621"
            y="2.3818817"
            id="rect19874"
-           style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19878);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Andale Mono" /></flowRegion><flowPara
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:125%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient19878);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></flowRegion><flowPara
          id="flowPara19876"
-         style="fill:url(#linearGradient20062);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">ST</flowPara></flowRoot>    <g
+         style="font-size:12px;line-height:1.25;fill:url(#linearGradient20062);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">ST</flowPara></flowRoot>    <g
        id="g1917"
        transform="matrix(0.181771,-4.0153553e-3,5.9117061e-3,0.1804431,680.18691,229.08403)"
        style="fill:#7f755d;fill-opacity:1">
@@ -90800,19 +90179,19 @@
      transform="translate(-230.13257,-140)"
      id="g20864">
     <flowRoot
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20956);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Andale Mono"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0.01%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20956);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
        xml:space="preserve"
        id="flowRoot20866"
        transform="matrix(1.6473499,0,0,1.6473499,800.92342,263.57576)"><flowRegion
          style="fill:url(#linearGradient20950);fill-opacity:1;stroke:url(#linearGradient20952)"
          id="flowRegion20868"><rect
-           style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20948);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Andale Mono"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:125%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20948);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
            id="rect20870"
            y="2.3818817"
            x="-85.494621"
            height="232.12506"
            width="382.57648" /></flowRegion><flowPara
-         style="fill:url(#linearGradient20954);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         style="font-size:12px;line-height:1.25;fill:url(#linearGradient20954);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          id="flowPara20872">C</flowPara></flowRoot>    <g
        style="fill:#7f755d;fill-opacity:1"
        transform="matrix(0.181771,-4.0153553e-3,5.9117061e-3,0.1804431,680.18691,229.08403)"
@@ -91011,7 +90390,7 @@
      y="473.61218"
      id="text16382"
      xml:space="preserve"
-     style="font-size:20px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"><tspan
+     style="font-style:normal;font-weight:normal;font-size:20px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><tspan
        x="37.5"
        y="473.61218"
        id="tspan16384">Icons</tspan></text>
@@ -91079,10 +90458,10 @@
      d="M 684.14211,134.18201 L 683.44846,134.37119 L 684.09481,136.75167 C 683.55664,136.88976 683.034,137.15037 682.61293,137.57144 C 682.58031,137.60404 682.56503,137.64813 682.53409,137.68179 C 681.78169,137.61864 681.00589,137.70771 680.24821,137.94979 L 679.60186,135.53777 L 678.90819,135.72696 L 679.5861,138.20203 C 678.90904,138.50465 678.25523,138.92751 677.67856,139.47899 L 675.51876,138.13898 L 675.15618,138.7538 L 677.18983,139.99922 C 676.46851,140.85118 675.98679,141.84216 675.771,142.83687 L 673.56394,142.23781 L 673.37475,142.93146 L 675.67641,143.56206 C 675.54986,144.9582 675.92466,146.33767 676.82724,147.39291 L 684.37857,139.84157 L 684.88305,140.34605 L 677.33172,147.89738 C 678.2984,148.72357 679.54404,149.1165 680.81574,149.07974 L 681.28869,150.84539 L 681.98234,150.65621 L 681.54092,149.01668 C 682.59832,148.85042 683.66579,148.38127 684.58351,147.64515 L 685.46634,149.06397 L 686.08117,148.70138 L 685.13529,147.15642 C 685.82639,146.46532 686.32697,145.65819 686.64871,144.82323 L 688.49319,145.31195 L 688.68237,144.6183 L 686.86941,144.1296 C 687.03506,143.48333 687.09629,142.82751 687.04282,142.19052 C 687.07648,142.15959 687.12057,142.14431 687.15319,142.11171 C 687.57426,141.69063 687.83486,141.16798 687.97296,140.6298 L 690.35344,141.27617 L 690.54262,140.58251 L 688.08331,139.92038 C 688.10481,139.07152 687.80055,138.21881 687.15319,137.57144 C 686.50581,136.92407 685.6531,136.61982 684.80424,136.64131 L 684.14211,134.18201 z"
      id="path16411" />
   <rect
-     style="fill:none;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
      id="icoplay24"
-     y="571.36218"
-     x="155"
+     y="591.36218"
+     x="655"
      height="24"
      width="24"
      inkscape:label="#rect16422" />
@@ -91094,17 +90473,18 @@
      y="0"
      x="0"
      id="use16424"
-     transform="matrix(0.1343319,0,0,0.1343319,385.45598,301.13309)" />
+     transform="matrix(0.1343319,0,0,0.1343319,885.45598,321.13309)" />
   <path
-     style="fill:#0fff09;fill-opacity:1;fill-rule:evenodd;stroke:#1d0000;stroke-width:0.30481818;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-     d="m 166.0806,583.80447 10.83519,5.4176 -10.83519,5.41759 0,-10.83519 z"
+     style="fill:#0fff09;fill-opacity:1;fill-rule:evenodd;stroke:#1d0000;stroke-width:0.30481818;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     d="m 666.0806,603.80447 10.83519,5.4176 -10.83519,5.41759 z"
      id="rect16426"
-     sodipodi:nodetypes="cccc" />
+     sodipodi:nodetypes="cccc"
+     inkscape:connector-curvature="0" />
   <rect
-     style="fill:none;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+     style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:0;marker:none;enable-background:accumulate"
      id="icostop24"
-     y="602.36218"
-     x="155"
+     y="622.36218"
+     x="655"
      height="24"
      width="24"
      inkscape:label="#rect17199" />
@@ -91116,14 +90496,14 @@
      y="0"
      x="0"
      id="use17201"
-     transform="matrix(0.1343319,0,0,0.1343319,385.45598,332.13309)" />
+     transform="matrix(0.1343319,0,0,0.1343319,885.45598,352.13309)" />
   <rect
-     style="fill:#ff0009;fill-opacity:1;stroke:#000000;stroke-width:0.31892911;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+     style="fill:#ff0009;fill-opacity:1;stroke:#000000;stroke-width:0.31892911;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
      id="rect17210"
      width="10.821424"
      height="10.821424"
-     x="166.58469"
-     y="614.71997" />
+     x="666.58472"
+     y="634.71997" />
   <rect
      inkscape:label="#rect16270"
      style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
@@ -91136,19 +90516,19 @@
      transform="translate(-330.13257,-140)"
      id="g16441">
     <flowRoot
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient16533);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Andale Mono"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0.01%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient16533);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
        xml:space="preserve"
        id="flowRoot16443"
        transform="matrix(1.6473499,0,0,1.6473499,800.92342,263.57576)"><flowRegion
          style="fill:url(#linearGradient16527);fill-opacity:1;stroke:url(#linearGradient16529)"
          id="flowRegion16445"><rect
-           style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient16525);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Andale Mono"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:125%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient16525);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
            id="rect16447"
            y="2.3818817"
            x="-85.494621"
            height="232.12506"
            width="382.57648" /></flowRegion><flowPara
-         style="fill:url(#linearGradient16531);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+         style="font-size:12px;line-height:1.25;fill:url(#linearGradient16531);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          id="flowPara16449">Py</flowPara></flowRoot>    <g
        style="fill:#7f755d;fill-opacity:1"
        transform="matrix(0.181771,-4.0153553e-3,5.9117061e-3,0.1804431,680.18691,229.08403)"
@@ -91357,7 +90737,7 @@
        transform="matrix(1.6473499,0,0,1.6473499,800.92342,263.57576)"
        id="flowRoot16492"
        xml:space="preserve"
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient16582);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Andale Mono"><flowRegion
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0.01%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient16582);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"><flowRegion
          id="flowRegion16494"
          style="fill:url(#linearGradient16576);fill-opacity:1;stroke:url(#linearGradient16578)"><rect
            width="382.57648"
@@ -91365,9 +90745,9 @@
            x="-85.494621"
            y="2.3818817"
            id="rect16496"
-           style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient16574);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Andale Mono" /></flowRegion><flowPara
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:125%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient16574);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /></flowRegion><flowPara
          id="flowPara16498"
-         style="fill:url(#linearGradient16580);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Wx</flowPara></flowRoot>    <g
+         style="font-size:12px;line-height:1.25;fill:url(#linearGradient16580);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">Wx</flowPara></flowRoot>    <g
        id="g16500"
        transform="matrix(0.181771,-4.0153553e-3,5.9117061e-3,0.1804431,680.18691,229.08403)"
        style="fill:#7f755d;fill-opacity:1">
@@ -91644,8 +91024,7 @@
          transform="matrix(0.9283218,0.3717759,-1.4068753,0.5137849,0,0)"
          id="text16585"
          xml:space="preserve"
-         style="font-size:1.71082616px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Nimbus Mono L"
-         sodipodi:linespacing="125%"><tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.71082616px;line-height:0%;font-family:'Nimbus Mono L';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"><tspan
            x="310.24417"
            y="957.45349"
            id="tspan16587">Master</tspan></text>
@@ -91763,8 +91142,7 @@
          sodipodi:nodetypes="cccsssccsssccccsssccsssccccsssccssscccsssccssscccsssccssscccsssccsssccccssssccssssccsssccssscccccsssccsssccccsssccssscccccsssccssscsssssccsssccccssscccccssscccccssssccssssccsssccsssccccssssssszssssssccsssssssccsssssssccccsssccssscsssssccsssccccssscccccssscccccssssccssssccsssccsssccccssssssssssssssccsssssssccssssssscccccsssccsssccccccccsssccsssccccccssssccssssccsssccssscccsssssssccsssssssccsssssssccssssssscccssssccssssccsssccssscccccsssccsssccccssssccccssccccsssssssssssssssssccsssssssssssssssssssssssssssssssssssssc"
          inkscape:connector-curvature="0" />
       <text
-         sodipodi:linespacing="125%"
-         style="font-size:4.3936758px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient46901);fill-opacity:1;stroke:none;font-family:Courier New;-inkscape-font-specification:Courier New Bold"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:4.3936758px;line-height:0%;font-family:'Courier New';-inkscape-font-specification:'Courier New Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient46901);fill-opacity:1;stroke:none"
          xml:space="preserve"
          id="text46886"
          y="258.79065"
@@ -91827,31 +91205,34 @@
   <flowRoot
      xml:space="preserve"
      id="flowRoot17359"
-     style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:40px;line-height:125%;letter-spacing:0px;word-spacing:0px"><flowRegion
-       id="flowRegion17361"><rect
+     style="font-style:normal;font-weight:normal;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
+       id="flowRegion17361"
+       style="font-family:sans-serif"><rect
          id="rect17363"
          width="1.2381572"
          height="42.097343"
          x="39.001949"
-         y="314.42053" /></flowRegion><flowPara
-       id="flowPara17365" /></flowRoot>  <text
-     style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         y="314.42053"
+         style="font-family:sans-serif" /></flowRegion><flowPara
+       id="flowPara17365"
+       style="font-size:40px;line-height:1.25;font-family:sans-serif"> </flowPara></flowRoot>  <text
+     style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none"
      xml:space="preserve"
      id="text18383-9"
      y="316.49597"
-     x="31.605389"
-     sodipodi:linespacing="125%"><tspan
+     x="31.605389"><tspan
        sodipodi:role="line"
        id="tspan18181"
        x="31.605389"
-       y="316.49597">Plugin</tspan><tspan
+       y="316.49597"
+       style="font-size:20px;line-height:1.25">Plugin</tspan><tspan
        sodipodi:role="line"
        id="tspan18183"
        x="31.605389"
-       y="341.49597">Tabs icons</tspan></text>
+       y="341.49597"
+       style="font-size:20px;line-height:1.25">Tabs icons</tspan></text>
   <text
-     sodipodi:linespacing="125%"
-     style="font-size:12.76000023px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      xml:space="preserve"
      id="text60407-6"
      y="318.55981"
@@ -91859,7 +91240,8 @@
        y="318.55981"
        x="166.52481"
        id="tspan16195-0"
-       sodipodi:role="line">%% Extension Cfile Pyfile wxGlade SVGUI FOLDER FILE %%</tspan></text>
+       sodipodi:role="line"
+       style="font-size:12.76000023px;line-height:1.25">%% Extension Cfile Pyfile wxGlade SVGUI FOLDER FILE %%</tspan></text>
   <use
      style="display:inline"
      inkscape:label="#use3839"
@@ -91888,19 +91270,19 @@
      transform="matrix(0.48337242,0,0,0.48337242,-50.19489,193.05406)"
      id="g20864-0">
     <flowRoot
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20956-0);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Andale Mono"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0.01%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20956-0);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
        xml:space="preserve"
        id="flowRoot20866-6"
        transform="matrix(1.6473499,0,0,1.6473499,800.92342,263.57576)"><flowRegion
          style="fill:url(#linearGradient20950-0);fill-opacity:1;stroke:url(#linearGradient20952-0)"
          id="flowRegion20868-2"><rect
-           style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20948-9);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Andale Mono"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:125%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20948-9);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
            id="rect20870-8"
            y="2.3818817"
            x="-85.494621"
            height="232.12506"
            width="382.57648" /></flowRegion><flowPara
-         style="fill:url(#linearGradient20954-8);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         style="font-size:12px;line-height:1.25;fill:url(#linearGradient20954-8);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          id="flowPara20872-9">C</flowPara></flowRoot>    <g
        style="fill:#7f755d;fill-opacity:1"
        transform="matrix(0.181771,-0.00401536,0.00591171,0.1804431,680.18691,229.08403)"
@@ -92148,19 +91530,19 @@
      transform="matrix(0.48337242,0,0,0.48337242,-16.622911,193.05511)"
      id="g20864-0-1">
     <flowRoot
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20956-0-4);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Andale Mono"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0.01%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20956-0-4);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
        xml:space="preserve"
        id="flowRoot20866-6-1"
        transform="matrix(1.6473499,0,0,1.6473499,800.92342,263.57576)"><flowRegion
          style="fill:url(#linearGradient20950-0-9);fill-opacity:1;stroke:url(#linearGradient20952-0-3)"
          id="flowRegion20868-2-3"><rect
-           style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20948-9-2);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Andale Mono"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:125%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20948-9-2);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
            id="rect20870-8-5"
            y="2.3818817"
            x="-85.494621"
            height="232.12506"
            width="382.57648" /></flowRegion><flowPara
-         style="fill:url(#linearGradient20954-8-1);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         style="font-size:12px;line-height:1.25;fill:url(#linearGradient20954-8-1);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          id="flowPara20872-9-1">Py</flowPara></flowRoot>    <g
        style="fill:#7f755d;fill-opacity:1"
        transform="matrix(0.181771,-0.00401536,0.00591171,0.1804431,680.18691,229.08403)"
@@ -92427,19 +91809,19 @@
      transform="matrix(0.48337242,0,0,0.48337242,34.703335,192.63005)"
      id="g20864-0-1-3">
     <flowRoot
-       style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20956-0-4-6);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Andale Mono"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0.01%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20956-0-4-6);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
        xml:space="preserve"
        id="flowRoot20866-6-1-0"
        transform="matrix(1.6473499,0,0,1.6473499,800.92342,263.57576)"><flowRegion
          style="fill:url(#linearGradient20950-0-9-0);fill-opacity:1;stroke:url(#linearGradient20952-0-3-3)"
          id="flowRegion20868-2-3-9"><rect
-           style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20948-9-2-8);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Andale Mono"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:125%;font-family:'Andale Mono';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient20948-9-2-8);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
            id="rect20870-8-5-2"
            y="2.3818817"
            x="-85.494621"
            height="232.12506"
            width="382.57648" /></flowRegion><flowPara
-         style="fill:url(#linearGradient20954-8-1-9);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         style="font-size:12px;line-height:1.25;fill:url(#linearGradient20954-8-1-9);fill-opacity:1;stroke:#547c1b;stroke-width:0.1061436;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
          id="flowPara20872-9-1-0">Wx</flowPara></flowRoot>    <g
        style="fill:#7f755d;fill-opacity:1"
        transform="matrix(0.181771,-0.00401536,0.00591171,0.1804431,680.18691,229.08403)"
@@ -92909,8 +92291,7 @@
          transform="matrix(0.92832176,0.37177589,-1.4068753,0.51378489,0,0)"
          id="text16585-3"
          xml:space="preserve"
-         style="font-size:1.71082616px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Nimbus Mono L"
-         sodipodi:linespacing="125%"><tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:1.71082616px;line-height:0%;font-family:'Nimbus Mono L';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"><tspan
            x="310.64246"
            y="957.40741"
            id="tspan16587-3"
@@ -93297,7 +92678,7 @@
     </g>
   </g>
   <text
-     style="font-size:20px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     style="font-style:normal;font-weight:normal;font-size:20px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none"
      xml:space="preserve"
      id="text18383-2"
      y="261.38077"
@@ -93306,8 +92687,7 @@
        y="261.38077"
        x="394.60934">Tree icons</tspan></text>
   <text
-     sodipodi:linespacing="125%"
-     style="font-size:12.76000023px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      xml:space="preserve"
      id="text60407-68"
      y="253.14807"
@@ -93315,7 +92695,8 @@
        y="253.14807"
        x="518.62115"
        id="tspan16195-3"
-       sodipodi:role="line">%% tree_drive tree_folder tree_file %%</tspan></text>
+       sodipodi:role="line"
+       style="font-size:12.76000023px;line-height:1.25">%% tree_drive tree_folder tree_file %%</tspan></text>
   <g
      transform="translate(711.12206,260.10161)"
      id="layer1-3">
@@ -93409,7 +92790,7 @@
     <path
        inkscape:connector-curvature="0"
        id="path2509-8"
-       style="fill:url(#linearGradient2929-8);fill-rule:evenodd"
+       style="fill:url(#linearGradient2929-8-0);fill-rule:evenodd"
        d="M 2.8355,4 C 2.37891,4 2.00106,4.44838 2.00106,4.9902 v 5.6331 c 0.00175,0.10077 0.044034,0.21567 0.11126,0.28606 0.067223,0.07039 0.15315,0.10008 0.25033,0.08802 0.00309,9.4e-5 0.00618,9.4e-5 0.00927,0 l 13.351,-2.5081 c 0.1548,-0.028972 0.27598,-0.18812 0.27815,-0.37407 v -3.1246 c 0,-0.54182 -0.37785,-0.9902 -0.83444,-0.9902 h -12.331 z" />
     <path
        inkscape:connector-curvature="0"
@@ -93650,7 +93031,7 @@
      inkscape:connector-curvature="0"
      sodipodi:nodetypes="ccccccccccccccccccccccccccccc" />
   <text
-     style="font-size:20px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+     style="font-style:normal;font-weight:normal;font-size:20px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none"
      xml:space="preserve"
      id="text18383-2-5"
      y="379.81824"
@@ -93659,8 +93040,7 @@
        y="379.81824"
        x="170.02246">Log levels icons</tspan></text>
   <text
-     sodipodi:linespacing="125%"
-     style="font-size:12.76000023px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
      xml:space="preserve"
      id="text60407-68-0"
      y="360.20483"
@@ -93668,7 +93048,8 @@
        y="360.20483"
        x="365.61026"
        id="tspan16195-3-3"
-       sodipodi:role="line">%% LOG_CRITICAL LOG_WARNING LOG_INFO LOG_DEBUG %%</tspan></text>
+       sodipodi:role="line"
+       style="font-size:12.76000023px;line-height:1.25">%% LOG_CRITICAL LOG_WARNING LOG_INFO LOG_DEBUG %%</tspan></text>
   <rect
      style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
      id="LOG_CRITICAL"
@@ -93732,16 +93113,16 @@
      transform="matrix(0.6666672,0,0,0.6666672,205.3694,127.93464)" />
   <text
      xml:space="preserve"
-     style="font-size:12.4041214px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+     style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
      x="441.56531"
      y="451.09576"
      id="text19292"
-     sodipodi:linespacing="125%"
      transform="scale(1.191303,0.839417)"><tspan
        sodipodi:role="line"
        id="tspan19294"
        x="441.56531"
-       y="451.09576">!</tspan></text>
+       y="451.09576"
+       style="font-size:12.4041214px;line-height:1.25;font-family:sans-serif">!</tspan></text>
   <path
      sodipodi:type="arc"
      style="color:#000000;fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
@@ -93754,16 +93135,16 @@
      transform="matrix(1.2040688,0,0,1.2040688,111.7401,-83.717008)" />
   <text
      xml:space="preserve"
-     style="font-size:15.56442642px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans"
+     style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none"
      x="475.99768"
      y="488.26718"
      id="text19314"
-     sodipodi:linespacing="125%"
      transform="scale(1.2919212,0.77404101)"><tspan
        sodipodi:role="line"
        id="tspan19316"
        x="475.99768"
-       y="488.26718">i</tspan></text>
+       y="488.26718"
+       style="font-size:15.56442642px;line-height:1.25;font-family:sans-serif">i</tspan></text>
   <rect
      style="color:#000000;fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:#c8c8c8;stroke-width:0.66666722;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
      id="rect19318"
@@ -93778,17 +93159,17 @@
      inkscape:connector-curvature="0"
      sodipodi:nodetypes="cccccc" />
   <text
-     style="font-style:normal;font-weight:normal;font-size:51.04000092px;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none"
+     style="font-style:normal;font-weight:normal;font-size:51.04000092px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none"
      xml:space="preserve"
      id="text18989-5"
-     y="1168.443"
+     y="1388.443"
      x="94.936478"><tspan
        id="tspan18991-9"
-       y="1168.443"
+       y="1388.443"
        x="94.936478"
        style="font-size:51.04000092px">%% about_brz_logo %%</tspan></text>
   <g
-     transform="matrix(0.2224431,0,0,0.2224431,608.34301,805.59922)"
+     transform="matrix(0.2224431,0,0,0.2224431,608.34301,1025.5992)"
      id="about_brz_logo"
      inkscape:label="#g17803-0">
     <g
@@ -93800,7 +93181,7 @@
        id="g7269-3">
       <path
          inkscape:connector-curvature="0"
-         d="m -1470.2813,1725.0291 c -56.0138,0.054 -112.0828,20.5177 -156.0937,61.5937 -85.0794,79.4058 -95.9453,209.1111 -29.5938,301.1563 l 9.7813,69.3437 0.9062,6.4375 5.125,-4 30.5938,-23.9687 c 87.5525,67.3697 213.0935,63.1007 295.9375,-14.2188 18.4642,-17.2329 33.4323,-36.8343 44.875,-57.9062 6.4003,0.736 13.3613,1.0937 20.875,1.0937 24.9087,0 44.0178,-3.5634 57.3437,-10.6875 13.3257,-7.1242 24.6943,-18.8804 34.125,-35.2812 l -61.6562,-5.6875 c -3.8953,4.9202 -7.5237,8.3649 -10.9063,10.3125 -5.5355,3.0752 -11.381,4.5937 -17.5312,4.5937 -2.2646,0 -4.435,-0.18 -6.5,-0.5625 3.5746,-10.6475 6.37,-21.5105 8.3437,-32.5 l 91.8125,0 0,-7.0625 c -10e-5,-21.5262 -3.5522,-39.0091 -10.625,-52.4375 -7.0731,-13.4281 -17.3756,-23.6769 -30.9062,-30.75 -13.3838,-6.9958 -31.5824,-10.5176 -54.5938,-10.5937 -7.0146,-25.9757 -18.6908,-50.9762 -35.0625,-73.6875 l -9.7812,-69.3438 -0.9063,-6.4375 -5.125,4 -30.5937,23.9688 c -41.0402,-31.5796 -90.4197,-47.4228 -139.8438,-47.375 z m 228.125,206.2187 c 6.3617,0.8346 11.6486,3.3459 15.875,7.5313 5.279,5.2278 8.5511,13.9044 9.7813,26 l -24.7813,0 c 0.5248,-11.1718 0.225,-22.3843 -0.875,-33.5313 z m 118.9731,-33.6623 58.582,0 0,26.754 c 5.6377,-11.583 11.4549,-19.5528 17.4516,-23.9095 5.9965,-4.3563 13.4025,-6.5346 22.2182,-6.5347 9.2253,1e-4 19.3222,2.8703 30.2904,8.6104 l -19.3736,44.5901 c -7.3805,-3.0751 -13.2233,-4.6127 -17.5285,-4.6128 -8.2005,10e-5 -14.5559,3.3828 -19.066,10.1481 -6.458,9.5331 -9.6869,27.3691 -9.6868,53.508 l 0,54.7381 -62.8873,0 0,-163.2917 z m 320.2793,97.1755 -125.46709,0 c 1.12748,10.0456 3.84388,17.5285 8.14921,22.4487 6.04775,7.073 13.94069,10.6094 23.67883,10.6094 6.15024,0 11.99306,-1.5376 17.5285,-4.6128 3.38256,-1.9476 7.02151,-5.3815 10.91686,-10.3018 l 61.65724,5.6891 c -9.43072,16.4009 -20.80885,28.1634 -34.13443,35.2876 -13.3259,7.1241 -32.44322,10.6862 -57.35199,10.6862 -21.62881,0 -38.64475,-3.0495 -51.04789,-9.1486 -12.40324,-6.0991 -22.67944,-15.7859 -30.82862,-29.0604 -8.14922,-13.2745 -12.22382,-28.881 -12.22382,-46.8195 0,-25.5239 8.17483,-46.1788 24.52452,-61.9648 16.34962,-15.7857 38.9265,-23.6787 67.7307,-23.6788 23.3712,1e-4 41.82222,3.5366 55.35313,10.6093 13.53059,7.0731 23.83241,17.3236 30.9055,30.7517 7.0727,13.4284 10.60915,30.9056 10.60935,52.4318 l 0,7.0729 z m -63.6561,-29.983 c -1.23021,-12.0956 -4.48476,-20.7573 -9.76368,-25.9852 -5.27917,-5.2277 -12.22393,-7.8416 -20.8343,-7.8417 -9.94316,10e-5 -17.88735,3.9466 -23.8326,11.8394 -3.79279,4.9204 -6.20167,12.2496 -7.22666,21.9875 l 61.65724,0 z m 93.17774,-67.1925 58.4283,0 0,23.8326 c 8.40539,-9.9429 16.88773,-17.0158 25.44706,-21.2187 8.55912,-4.2026 18.88657,-6.304 30.98238,-6.3041 13.01809,1e-4 23.31991,2.3065 30.90549,6.9191 7.58526,4.6129 13.78685,11.4808 18.6048,20.6037 9.84037,-10.6605 18.80962,-17.9128 26.90778,-21.7569 8.09773,-3.8438 18.09204,-5.7658 29.98294,-5.7659 17.52823,1e-4 31.21274,5.2023 41.05357,15.6065 9.84026,10.4044 14.76054,26.6772 14.76083,48.8184 l 0,102.557 -62.73354,0 0,-93.024 c -2.3e-4,-7.3803 -1.43531,-12.8644 -4.30524,-16.4522 -4.20297,-5.6377 -9.43076,-8.4566 -15.68339,-8.4567 -7.38062,10e-5 -13.32595,2.6652 -17.83601,7.9954 -4.51044,5.3304 -6.76557,13.8897 -6.76538,25.6777 l 0,84.2598 -62.73355,0 0,-89.9488 c -1.2e-4,-7.1753 -0.41015,-12.0444 -1.23007,-14.6071 -1.3327,-4.1001 -3.63907,-7.4059 -6.91914,-9.9174 -3.2803,-2.5113 -7.12426,-3.767 -11.5319,-3.7671 -7.1755,10e-5 -13.06958,2.7165 -17.68225,8.1492 -4.61284,5.4329 -6.91922,14.3509 -6.91914,26.754 l 0,83.3372 -62.73354,0 0,-163.2917 z m 316.74293,-62.1185 62.57978,0 0,42.5911 -62.57978,0 0,-42.5911 z m 0,62.1185 62.57978,0 0,163.2917 -62.57978,0 0,-163.2917 z m 95.79168,0 151.45231,0 0,36.5945 -82.41466,83.9523 87.48869,0 0,42.7449 -162.67669,0 0,-40.5923 78.10941,-79.9545 -71.95906,0 0,-42.7449 z"
+         d="m -1470.2813,1725.0291 c -56.0138,0.054 -112.0828,20.5177 -156.0937,61.5937 -85.0794,79.4058 -95.9453,209.1111 -29.5938,301.1563 l 9.7813,69.3437 0.9062,6.4375 5.125,-4 30.5938,-23.9687 c 87.5525,67.3697 213.0935,63.1007 295.9375,-14.2188 18.4642,-17.2329 33.4323,-36.8343 44.875,-57.9062 6.4003,0.736 13.3613,1.0937 20.875,1.0937 24.9087,0 44.0178,-3.5634 57.3437,-10.6875 13.3257,-7.1242 24.6943,-18.8804 34.125,-35.2812 l -61.6562,-5.6875 c -3.8953,4.9202 -7.5237,8.3649 -10.9063,10.3125 -5.5355,3.0752 -11.381,4.5937 -17.5312,4.5937 -2.2646,0 -4.435,-0.18 -6.5,-0.5625 3.5746,-10.6475 6.37,-21.5105 8.3437,-32.5 h 91.8125 v -7.0625 c -10e-5,-21.5262 -3.5522,-39.0091 -10.625,-52.4375 -7.0731,-13.4281 -17.3756,-23.6769 -30.9062,-30.75 -13.3838,-6.9958 -31.5824,-10.5176 -54.5938,-10.5937 -7.0146,-25.9757 -18.6908,-50.9762 -35.0625,-73.6875 l -9.7812,-69.3438 -0.9063,-6.4375 -5.125,4 -30.5937,23.9688 c -41.0402,-31.5796 -90.4197,-47.4228 -139.8438,-47.375 z m 228.125,206.2187 c 6.3617,0.8346 11.6486,3.3459 15.875,7.5313 5.279,5.2278 8.5511,13.9044 9.7813,26 h -24.7813 c 0.5248,-11.1718 0.225,-22.3843 -0.875,-33.5313 z m 118.9731,-33.6623 h 58.582 v 26.754 c 5.6377,-11.583 11.4549,-19.5528 17.4516,-23.9095 5.9965,-4.3563 13.4025,-6.5346 22.2182,-6.5347 9.2253,1e-4 19.3222,2.8703 30.2904,8.6104 l -19.3736,44.5901 c -7.3805,-3.0751 -13.2233,-4.6127 -17.5285,-4.6128 -8.2005,10e-5 -14.5559,3.3828 -19.066,10.1481 -6.458,9.5331 -9.6869,27.3691 -9.6868,53.508 v 54.7381 h -62.8873 z m 320.2793,97.1755 h -125.46709 c 1.12748,10.0456 3.84388,17.5285 8.14921,22.4487 6.04775,7.073 13.94069,10.6094 23.67883,10.6094 6.15024,0 11.99306,-1.5376 17.5285,-4.6128 3.38256,-1.9476 7.02151,-5.3815 10.91686,-10.3018 l 61.65724,5.6891 c -9.43072,16.4009 -20.80885,28.1634 -34.13443,35.2876 -13.3259,7.1241 -32.44322,10.6862 -57.35199,10.6862 -21.62881,0 -38.64475,-3.0495 -51.04789,-9.1486 -12.40324,-6.0991 -22.67944,-15.7859 -30.82862,-29.0604 -8.14922,-13.2745 -12.22382,-28.881 -12.22382,-46.8195 0,-25.5239 8.17483,-46.1788 24.52452,-61.9648 16.34962,-15.7857 38.9265,-23.6787 67.7307,-23.6788 23.3712,1e-4 41.82222,3.5366 55.35313,10.6093 13.53059,7.0731 23.83241,17.3236 30.9055,30.7517 7.0727,13.4284 10.60915,30.9056 10.60935,52.4318 z m -63.6561,-29.983 c -1.23021,-12.0956 -4.48476,-20.7573 -9.76368,-25.9852 -5.27917,-5.2277 -12.22393,-7.8416 -20.8343,-7.8417 -9.94316,10e-5 -17.88735,3.9466 -23.8326,11.8394 -3.79279,4.9204 -6.20167,12.2496 -7.22666,21.9875 z m 93.17774,-67.1925 h 58.4283 v 23.8326 c 8.40539,-9.9429 16.88773,-17.0158 25.44706,-21.2187 8.55912,-4.2026 18.88657,-6.304 30.98238,-6.3041 13.01809,1e-4 23.31991,2.3065 30.90549,6.9191 7.58526,4.6129 13.78685,11.4808 18.6048,20.6037 9.84037,-10.6605 18.80962,-17.9128 26.90778,-21.7569 8.09773,-3.8438 18.09204,-5.7658 29.98294,-5.7659 17.52823,1e-4 31.21274,5.2023 41.05357,15.6065 9.84026,10.4044 14.76054,26.6772 14.76083,48.8184 v 102.557 h -62.73354 v -93.024 c -2.3e-4,-7.3803 -1.43531,-12.8644 -4.30524,-16.4522 -4.20297,-5.6377 -9.43076,-8.4566 -15.68339,-8.4567 -7.38062,10e-5 -13.32595,2.6652 -17.83601,7.9954 -4.51044,5.3304 -6.76557,13.8897 -6.76538,25.6777 v 84.2598 h -62.73355 v -89.9488 c -1.2e-4,-7.1753 -0.41015,-12.0444 -1.23007,-14.6071 -1.3327,-4.1001 -3.63907,-7.4059 -6.91914,-9.9174 -3.2803,-2.5113 -7.12426,-3.767 -11.5319,-3.7671 -7.1755,10e-5 -13.06958,2.7165 -17.68225,8.1492 -4.61284,5.4329 -6.91922,14.3509 -6.91914,26.754 v 83.3372 h -62.73354 z m 316.74293,-62.1185 h 62.57978 v 42.5911 h -62.57978 z m 0,62.1185 h 62.57978 v 163.2917 h -62.57978 z m 95.79168,0 h 151.45231 v 36.5945 l -82.41466,83.9523 h 87.48869 v 42.7449 H -366.998 v -40.5923 l 78.10941,-79.9545 h -71.95906 z"
          id="path17845-6"
          style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:314.89779663px;line-height:125%;font-family:'Arial Black';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;filter:url(#filter17760-6-7);enable-background:accumulate" />
       <path
@@ -93815,17 +93196,17 @@
          style="display:inline;overflow:visible;visibility:visible;fill:#469837;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;enable-background:accumulate" />
       <path
          inkscape:connector-curvature="0"
-         d="m 1021.2642,207.94408 c 0,143.9361 -116.68326,260.61936 -260.61936,260.61936 -143.9361,0 -260.61936,-116.68326 -260.61936,-260.61936 0,-143.936098 116.68326,-260.61936 260.61936,-260.61936 143.9361,0 260.61936,116.683262 260.61936,260.61936 l 0,0 z"
+         d="m 1021.2642,207.94408 c 0,143.9361 -116.68326,260.61936 -260.61936,260.61936 -143.9361,0 -260.61936,-116.68326 -260.61936,-260.61936 0,-143.936098 116.68326,-260.61936 260.61936,-260.61936 143.9361,0 260.61936,116.683262 260.61936,260.61936 z"
          transform="matrix(0.8023362,0,0,0.8019941,-2094.2929,1769.2301)"
          id="path16739-2"
          style="display:inline;overflow:visible;visibility:visible;fill:none;stroke:#4c4c4c;stroke-width:49.86504364;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
       <path
          inkscape:connector-curvature="0"
-         d="m -1577.2331,1825.1726 127.038,0 c 21.1728,2e-4 37.4271,5.2435 48.7628,15.7299 11.3353,10.4868 17.0031,23.4703 17.0033,38.9503 -2e-4,12.9836 -4.045,24.1194 -12.1345,33.4074 -5.3933,6.1923 -13.2833,11.086 -23.6698,14.6813 15.7797,3.7953 27.3898,10.312 34.8306,19.5501 7.4402,9.2383 11.1605,20.8485 11.1607,34.8306 -2e-4,11.3855 -2.6468,21.6224 -7.9399,30.7108 -5.2934,9.0884 -12.5342,16.2792 -21.7223,21.5725 -5.6929,3.2958 -14.2819,5.6927 -25.7671,7.1908 -15.2807,1.9975 -25.4177,2.9962 -30.4112,2.9962 l -117.1506,0 0,-219.6199 z m 68.4627,86.1401 29.5124,0 c 10.5863,10e-5 17.9519,-1.8225 22.0968,-5.468 4.1445,-3.6452 6.2169,-8.9135 6.217,-15.8049 -1e-4,-6.3916 -2.0725,-11.3853 -6.217,-14.9809 -4.1449,-3.5952 -11.3607,-5.3929 -21.6474,-5.3931 l -29.9618,0 0,41.6469 z m 0,86.29 34.6059,0 c 11.6849,0 19.9244,-2.0723 24.7184,-6.2171 4.7938,-4.1447 7.1907,-9.7126 7.1909,-16.7037 -2e-4,-6.4916 -2.3722,-11.71 -7.116,-15.655 -4.7441,-3.9449 -13.0584,-5.9174 -24.9432,-5.9175 l -34.456,0 0,44.4933 z"
+         d="m -1577.2331,1825.1726 h 127.038 c 21.1728,2e-4 37.4271,5.2435 48.7628,15.7299 11.3353,10.4868 17.0031,23.4703 17.0033,38.9503 -2e-4,12.9836 -4.045,24.1194 -12.1345,33.4074 -5.3933,6.1923 -13.2833,11.086 -23.6698,14.6813 15.7797,3.7953 27.3898,10.312 34.8306,19.5501 7.4402,9.2383 11.1605,20.8485 11.1607,34.8306 -2e-4,11.3855 -2.6468,21.6224 -7.9399,30.7108 -5.2934,9.0884 -12.5342,16.2792 -21.7223,21.5725 -5.6929,3.2958 -14.2819,5.6927 -25.7671,7.1908 -15.2807,1.9975 -25.4177,2.9962 -30.4112,2.9962 h -117.1506 z m 68.4627,86.1401 h 29.5124 c 10.5863,10e-5 17.9519,-1.8225 22.0968,-5.468 4.1445,-3.6452 6.2169,-8.9135 6.217,-15.8049 -1e-4,-6.3916 -2.0725,-11.3853 -6.217,-14.9809 -4.1449,-3.5952 -11.3607,-5.3929 -21.6474,-5.3931 h -29.9618 z m 0,86.29 h 34.6059 c 11.6849,0 19.9244,-2.0723 24.7184,-6.2171 4.7938,-4.1447 7.1907,-9.7126 7.1909,-16.7037 -2e-4,-6.4916 -2.3722,-11.71 -7.116,-15.655 -4.7441,-3.9449 -13.0584,-5.9174 -24.9432,-5.9175 h -34.456 z"
          id="path16741-6"
-         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:306.80871582px;line-height:125%;font-family:'Arial Black';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;enable-background:accumulate" />
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:306.80871582px;line-height:125%;font-family:'Arial Black';text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:40;marker:none;enable-background:accumulate" />
       <g
-         transform="matrix(-1,0,0,-1,-1127.9999,1532)"
+         transform="rotate(180,-563.99995,766)"
          mask="url(#mask6467-7-2)"
          id="use16745-1">
         <path
@@ -93856,7 +93237,7 @@
       </g>
       <path
          inkscape:connector-curvature="0"
-         d="m -1166.8587,1976.761 -125.4671,0 c 1.1275,10.0456 3.8439,17.5285 8.1492,22.4487 6.0478,7.073 13.9407,10.6094 23.6789,10.6094 6.1502,0 11.993,-1.5376 17.5285,-4.6128 3.3825,-1.9476 7.0215,-5.3815 10.9168,-10.3018 l 61.6573,5.6891 c -9.4307,16.4009 -20.8089,28.1634 -34.1345,35.2876 -13.3259,7.1241 -32.4432,10.6862 -57.3519,10.6862 -21.6289,0 -38.6448,-3.0495 -51.0479,-9.1486 -12.4033,-6.0991 -22.6795,-15.7859 -30.8286,-29.0604 -8.1493,-13.2745 -12.2239,-28.881 -12.2239,-46.8195 0,-25.5239 8.1749,-46.1788 24.5245,-61.9648 16.3497,-15.7857 38.9265,-23.6787 67.7307,-23.6788 23.3712,1e-4 41.8223,3.5366 55.3532,10.6093 13.5306,7.0731 23.8324,17.3236 30.9055,30.7517 7.0727,13.4284 10.6091,30.9056 10.6093,52.4318 l 0,7.0729 z m -63.6561,-29.983 c -1.2302,-12.0956 -4.4847,-20.7573 -9.7637,-25.9852 -5.2791,-5.2277 -12.2239,-7.8416 -20.8343,-7.8417 -9.9431,10e-5 -17.8873,3.9466 -23.8325,11.8394 -3.7928,4.9204 -6.2017,12.2496 -7.2267,21.9875 l 61.6572,0 z m 93.3316,-67.1925 58.582,0 0,26.754 c 5.6377,-11.583 11.4549,-19.5528 17.4516,-23.9095 5.9965,-4.3563 13.4025,-6.5346 22.2182,-6.5347 9.2253,1e-4 19.3222,2.8703 30.2904,8.6104 l -19.3736,44.5901 c -7.3805,-3.0751 -13.2233,-4.6127 -17.5285,-4.6128 -8.2005,10e-5 -14.5559,3.3828 -19.066,10.1481 -6.458,9.5331 -9.6869,27.3691 -9.6868,53.508 l 0,54.7381 -62.8873,0 0,-163.2917 z m 320.2793,97.1755 -125.46709,0 c 1.12748,10.0456 3.84388,17.5285 8.14921,22.4487 6.04775,7.073 13.94069,10.6094 23.67883,10.6094 6.15024,0 11.99306,-1.5376 17.5285,-4.6128 3.38256,-1.9476 7.02151,-5.3815 10.91686,-10.3018 l 61.65724,5.6891 c -9.43072,16.4009 -20.80885,28.1634 -34.13443,35.2876 -13.3259,7.1241 -32.44322,10.6862 -57.35199,10.6862 -21.62881,0 -38.64475,-3.0495 -51.04789,-9.1486 -12.40324,-6.0991 -22.67944,-15.7859 -30.82862,-29.0604 -8.14922,-13.2745 -12.22382,-28.881 -12.22382,-46.8195 0,-25.5239 8.17483,-46.1788 24.52452,-61.9648 16.34962,-15.7857 38.9265,-23.6787 67.7307,-23.6788 23.3712,1e-4 41.82222,3.5366 55.35313,10.6093 13.53059,7.0731 23.83241,17.3236 30.9055,30.7517 7.0727,13.4284 10.60915,30.9056 10.60935,52.4318 l 0,7.0729 z m -63.6561,-29.983 c -1.23021,-12.0956 -4.48476,-20.7573 -9.76368,-25.9852 -5.27917,-5.2277 -12.22393,-7.8416 -20.8343,-7.8417 -9.94316,10e-5 -17.88735,3.9466 -23.8326,11.8394 -3.79279,4.9204 -6.20167,12.2496 -7.22666,21.9875 l 61.65724,0 z m 93.17774,-67.1925 58.4283,0 0,23.8326 c 8.40539,-9.9429 16.88773,-17.0158 25.44706,-21.2187 8.55912,-4.2026 18.88657,-6.304 30.98238,-6.3041 13.01809,1e-4 23.31991,2.3065 30.90549,6.9191 7.58526,4.6129 13.78685,11.4808 18.6048,20.6037 9.84037,-10.6605 18.80962,-17.9128 26.90778,-21.7569 8.09773,-3.8438 18.09204,-5.7658 29.98294,-5.7659 17.52823,1e-4 31.21274,5.2023 41.05357,15.6065 9.84026,10.4044 14.76054,26.6772 14.76083,48.8184 l 0,102.557 -62.73354,0 0,-93.024 c -2.3e-4,-7.3803 -1.43531,-12.8644 -4.30524,-16.4522 -4.20297,-5.6377 -9.43076,-8.4566 -15.68339,-8.4567 -7.38062,10e-5 -13.32595,2.6652 -17.83601,7.9954 -4.51044,5.3304 -6.76557,13.8897 -6.76538,25.6777 l 0,84.2598 -62.73355,0 0,-89.9488 c -1.2e-4,-7.1753 -0.41015,-12.0444 -1.23007,-14.6071 -1.3327,-4.1001 -3.63907,-7.4059 -6.91914,-9.9174 -3.2803,-2.5113 -7.12426,-3.767 -11.5319,-3.7671 -7.1755,10e-5 -13.06958,2.7165 -17.68225,8.1492 -4.61284,5.4329 -6.91922,14.3509 -6.91914,26.754 l 0,83.3372 -62.73354,0 0,-163.2917 z m 316.74293,-62.1185 62.57978,0 0,42.5911 -62.57978,0 0,-42.5911 z m 0,62.1185 62.57978,0 0,163.2917 -62.57978,0 0,-163.2917 z m 95.79168,0 151.45231,0 0,36.5945 -82.41466,83.9523 87.48869,0 0,42.7449 -162.67669,0 0,-40.5923 78.10941,-79.9545 -71.95906,0 0,-42.7449 z"
+         d="m -1166.8587,1976.761 h -125.4671 c 1.1275,10.0456 3.8439,17.5285 8.1492,22.4487 6.0478,7.073 13.9407,10.6094 23.6789,10.6094 6.1502,0 11.993,-1.5376 17.5285,-4.6128 3.3825,-1.9476 7.0215,-5.3815 10.9168,-10.3018 l 61.6573,5.6891 c -9.4307,16.4009 -20.8089,28.1634 -34.1345,35.2876 -13.3259,7.1241 -32.4432,10.6862 -57.3519,10.6862 -21.6289,0 -38.6448,-3.0495 -51.0479,-9.1486 -12.4033,-6.0991 -22.6795,-15.7859 -30.8286,-29.0604 -8.1493,-13.2745 -12.2239,-28.881 -12.2239,-46.8195 0,-25.5239 8.1749,-46.1788 24.5245,-61.9648 16.3497,-15.7857 38.9265,-23.6787 67.7307,-23.6788 23.3712,1e-4 41.8223,3.5366 55.3532,10.6093 13.5306,7.0731 23.8324,17.3236 30.9055,30.7517 7.0727,13.4284 10.6091,30.9056 10.6093,52.4318 z m -63.6561,-29.983 c -1.2302,-12.0956 -4.4847,-20.7573 -9.7637,-25.9852 -5.2791,-5.2277 -12.2239,-7.8416 -20.8343,-7.8417 -9.9431,10e-5 -17.8873,3.9466 -23.8325,11.8394 -3.7928,4.9204 -6.2017,12.2496 -7.2267,21.9875 z m 93.3316,-67.1925 h 58.582 v 26.754 c 5.6377,-11.583 11.4549,-19.5528 17.4516,-23.9095 5.9965,-4.3563 13.4025,-6.5346 22.2182,-6.5347 9.2253,1e-4 19.3222,2.8703 30.2904,8.6104 l -19.3736,44.5901 c -7.3805,-3.0751 -13.2233,-4.6127 -17.5285,-4.6128 -8.2005,10e-5 -14.5559,3.3828 -19.066,10.1481 -6.458,9.5331 -9.6869,27.3691 -9.6868,53.508 v 54.7381 h -62.8873 z m 320.2793,97.1755 h -125.46709 c 1.12748,10.0456 3.84388,17.5285 8.14921,22.4487 6.04775,7.073 13.94069,10.6094 23.67883,10.6094 6.15024,0 11.99306,-1.5376 17.5285,-4.6128 3.38256,-1.9476 7.02151,-5.3815 10.91686,-10.3018 l 61.65724,5.6891 c -9.43072,16.4009 -20.80885,28.1634 -34.13443,35.2876 -13.3259,7.1241 -32.44322,10.6862 -57.35199,10.6862 -21.62881,0 -38.64475,-3.0495 -51.04789,-9.1486 -12.40324,-6.0991 -22.67944,-15.7859 -30.82862,-29.0604 -8.14922,-13.2745 -12.22382,-28.881 -12.22382,-46.8195 0,-25.5239 8.17483,-46.1788 24.52452,-61.9648 16.34962,-15.7857 38.9265,-23.6787 67.7307,-23.6788 23.3712,1e-4 41.82222,3.5366 55.35313,10.6093 13.53059,7.0731 23.83241,17.3236 30.9055,30.7517 7.0727,13.4284 10.60915,30.9056 10.60935,52.4318 z m -63.6561,-29.983 c -1.23021,-12.0956 -4.48476,-20.7573 -9.76368,-25.9852 -5.27917,-5.2277 -12.22393,-7.8416 -20.8343,-7.8417 -9.94316,10e-5 -17.88735,3.9466 -23.8326,11.8394 -3.79279,4.9204 -6.20167,12.2496 -7.22666,21.9875 z m 93.17774,-67.1925 h 58.4283 v 23.8326 c 8.40539,-9.9429 16.88773,-17.0158 25.44706,-21.2187 8.55912,-4.2026 18.88657,-6.304 30.98238,-6.3041 13.01809,1e-4 23.31991,2.3065 30.90549,6.9191 7.58526,4.6129 13.78685,11.4808 18.6048,20.6037 9.84037,-10.6605 18.80962,-17.9128 26.90778,-21.7569 8.09773,-3.8438 18.09204,-5.7658 29.98294,-5.7659 17.52823,1e-4 31.21274,5.2023 41.05357,15.6065 9.84026,10.4044 14.76054,26.6772 14.76083,48.8184 v 102.557 h -62.73354 v -93.024 c -2.3e-4,-7.3803 -1.43531,-12.8644 -4.30524,-16.4522 -4.20297,-5.6377 -9.43076,-8.4566 -15.68339,-8.4567 -7.38062,10e-5 -13.32595,2.6652 -17.83601,7.9954 -4.51044,5.3304 -6.76557,13.8897 -6.76538,25.6777 v 84.2598 h -62.73355 v -89.9488 c -1.2e-4,-7.1753 -0.41015,-12.0444 -1.23007,-14.6071 -1.3327,-4.1001 -3.63907,-7.4059 -6.91914,-9.9174 -3.2803,-2.5113 -7.12426,-3.767 -11.5319,-3.7671 -7.1755,10e-5 -13.06958,2.7165 -17.68225,8.1492 -4.61284,5.4329 -6.91922,14.3509 -6.91914,26.754 v 83.3372 h -62.73354 z m 316.74293,-62.1185 h 62.57978 v 42.5911 h -62.57978 z m 0,62.1185 h 62.57978 v 163.2917 h -62.57978 z m 95.79168,0 h 151.45231 v 36.5945 l -82.41466,83.9523 h 87.48869 v 42.7449 H -380.998 v -40.5923 l 78.10941,-79.9545 h -71.95906 z"
          id="text16729-2"
          style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:314.89779663px;line-height:125%;font-family:'Arial Black';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#dadada;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10.43299961;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
       <text
@@ -93864,10 +93245,108 @@
          y="2147.7705"
          id="text3172-3"
          xml:space="preserve"
-         style="font-style:normal;font-weight:normal;font-size:71.35877228px;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"><tspan
+         style="font-style:normal;font-weight:normal;font-size:71.35877228px;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"><tspan
            x="-1259.6362"
            y="2147.7705"
            id="tspan3174-7">Free Software for Automation </tspan></text>
     </g>
   </g>
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21921" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21923" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21925" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21927" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21929" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21931" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21933" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21935" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21937" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21939" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21941" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21943" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21945" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21947" />
+  <g
+     transform="translate(960.38982,282.02716)"
+     id="g21949" />
+  <g
+     transform="matrix(0.10746862,0,0,0.10740514,888.79666,364.22053)"
+     id="fullscreen">
+    <path
+       inkscape:connector-curvature="0"
+       style="opacity:1;fill:url(#radialGradient16170);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-opacity:0"
+       d="M 55.391,29.571 66.976,18.603 C 74.717,10.987 72.715,2.396 62.515,0.009 H 13.448 C 5.313,0.304 -0.131,2.762 0.138,13.516 L 0.066,62.637 c 2.065,10.128 9.136,12.104 15.733,4.398 L 28.823,54.726 69.988,95.873 c 3.576,3.567 9.377,3.576 12.944,0.018 L 95.867,82.956 c 3.567,-3.558 3.558,-9.368 -0.009,-12.935 0,0 -40.467,-40.45 -40.467,-40.45 z m 27.291,98.313 c -3.549,-3.558 -9.341,-3.558 -12.899,0.018 l -41.04,41.004 -12.989,-12.291 c -6.57,-7.688 -13.623,-5.712 -15.688,4.38 L 0.146,210 c -0.259,10.691 5.149,13.176 13.275,13.453 h 48.951 c 10.155,-2.405 12.157,-10.959 4.443,-18.531 L 55.266,193.989 95.582,153.655 c 3.558,-3.558 3.567,-9.35 0.009,-12.89 -10e-4,0 -12.909,-12.881 -12.909,-12.881 z M 140.76,95.882 c 3.549,3.558 9.35,3.549 12.908,-0.018 l 41.049,-41.147 12.989,12.309 c 6.552,7.706 13.605,5.73 15.67,-4.398 L 223.304,13.507 C 223.564,2.753 218.137,0.295 210.031,0 h -48.987 c -10.164,2.396 -12.113,10.986 -4.398,18.594 l 11.567,10.977 -40.343,40.432 c -3.558,3.567 -3.558,9.377 0,12.935 0,0 12.89,12.944 12.89,12.944 z m 66.982,60.724 -12.953,12.291 -40.906,-41.004 c -3.558,-3.576 -9.341,-3.576 -12.872,-0.018 l -12.863,12.881 c -3.54,3.54 -3.531,9.333 0.018,12.89 l 40.199,40.316 -11.54,10.951 c -7.679,7.589 -5.712,16.153 4.416,18.531 h 48.835 c 8.09,-0.277 13.525,-2.762 13.239,-13.453 l 0.072,-49.005 c -2.067,-10.084 -9.102,-12.059 -15.645,-4.38 z"
+       id="path21917" />
+  </g>
+  <text
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';-inkscape-font-specification:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+     xml:space="preserve"
+     id="text60407-68-3"
+     y="358.51169"
+     x="843.89581"><tspan
+       y="358.51169"
+       x="843.89581"
+       id="tspan16195-3-6"
+       sodipodi:role="line"
+       style="font-size:12.76000023px;line-height:1.25">%% fullscreen %%</tspan></text>
+  <rect
+     width="24"
+     height="24"
+     x="730"
+     y="131.36218"
+     id="IDManager"
+     style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
+     inkscape:label="#rect16270" />
+  <g
+     id="g19473"
+     transform="matrix(1.3198788,0,0,1.3198788,-237.35005,-42.92225)"
+     style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3d993d;fill-opacity:1;fill-rule:nonzero;stroke:#3d993d;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate">
+    <rect
+       y="140.41789"
+       x="736.44702"
+       height="8.1489973"
+       width="11.106004"
+       id="rect18652"
+       style="fill:#3d993d;fill-opacity:1;fill-rule:nonzero;stroke:#3d993d;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-opacity:1;color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;stroke-dashoffset:0;marker:none;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3d993d;fill-opacity:1;fill-rule:nonzero;stroke:#3d993d;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10.43299961;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate;marker:none;filter-blend-mode:normal;filter-gaussianBlur-deviation:0"
+       d="m 741.99023,134.18555 c -1.03169,0.0327 -2.08009,0.38311 -2.90625,1.11328 -0.82615,0.73017 -1.38416,1.85745 -1.41796,3.20898 l -0.002,0.0117 0,2.03516 2,0 0,-1.99805 c 0.0216,-0.86174 0.3173,-1.38252 0.74414,-1.75976 0.42684,-0.37725 1.03088,-0.59378 1.64649,-0.61329 0.61561,-0.0195 1.21879,0.1637 1.62304,0.47461 0.40425,0.31092 0.64912,0.70425 0.65821,1.37305 l 0,2.66211 2,0 0,-2.68359 0,-0.006 c -0.0168,-1.23751 -0.60543,-2.28823 -1.43946,-2.92969 -0.83402,-0.64146 -1.87455,-0.92136 -2.90625,-0.88867 z"
+       id="path18654"
+       inkscape:connector-curvature="0" />
+  </g>
+  <rect
+     inkscape:label="#rect16270"
+     style="display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#6e6e6e;stroke-width:0.1;marker:none;enable-background:accumulate;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+     id="rect19460"
+     y="131.36218"
+     x="730"
+     height="24"
+     width="24" />
 </svg>
--- a/images/plcopen_icons.svg	Sat Jun 02 11:56:01 2018 +0100
+++ b/images/plcopen_icons.svg	Mon Jan 07 13:50:39 2019 +0100
@@ -2,6 +2,7 @@
 <!-- Created with Inkscape (http://www.inkscape.org/) -->
 
 <svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:cc="http://creativecommons.org/ns#"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
@@ -14,7 +15,7 @@
    height="16"
    id="svg2"
    sodipodi:version="0.32"
-   inkscape:version="0.48.3.1 r9886"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
    sodipodi:modified="TRUE"
    version="1.0"
    inkscape:export-filename="/taf/Pim/workspace_laurent/plcopeneditor/Images/SFC.png"
@@ -25,6 +26,52 @@
   <defs
      id="defs4">
     <linearGradient
+       id="linearGradient6110"
+       inkscape:collect="always">
+      <stop
+         id="stop6106"
+         offset="0"
+         style="stop-color:#c0cfe3;stop-opacity:1;" />
+      <stop
+         id="stop6108"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6024">
+      <stop
+         style="stop-color:#c0cfe3;stop-opacity:1;"
+         offset="0"
+         id="stop6020" />
+      <stop
+         style="stop-color:#c0cfe3;stop-opacity:0;"
+         offset="1"
+         id="stop6022" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5846"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop5844" />
+    </linearGradient>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lstart"
+       style="overflow:visible"
+       inkscape:isstock="true">
+      <path
+         id="path3959"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#0070ba;stroke-width:1pt;stroke-opacity:1;fill:#0070ba;fill-opacity:1"
+         transform="scale(0.8) translate(12.5,0)" />
+    </marker>
+    <linearGradient
        id="linearGradient4327">
       <stop
          style="stop-color:#0000ff;stop-opacity:1;"
@@ -11426,6 +11473,75 @@
          style="stop-color:#fff;stop-opacity:.70588"
          offset="1" />
     </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6024"
+       id="linearGradient6026"
+       x1="-104.62865"
+       y1="370.74438"
+       x2="-105.04643"
+       y2="386.76367"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6110"
+       id="linearGradient6068"
+       gradientUnits="userSpaceOnUse"
+       x1="-104.62865"
+       y1="370.74438"
+       x2="-105.04643"
+       y2="386.76367"
+       spreadMethod="pad" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6110"
+       id="linearGradient3850"
+       gradientUnits="userSpaceOnUse"
+       x1="-104.62865"
+       y1="370.74438"
+       x2="-105.04643"
+       y2="386.76367"
+       spreadMethod="pad" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6110"
+       id="linearGradient3937"
+       gradientUnits="userSpaceOnUse"
+       x1="-104.62865"
+       y1="370.74438"
+       x2="-105.04643"
+       y2="386.76367"
+       spreadMethod="pad" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6110"
+       id="linearGradient3980"
+       gradientUnits="userSpaceOnUse"
+       x1="-104.62865"
+       y1="370.74438"
+       x2="-105.04643"
+       y2="386.76367"
+       spreadMethod="pad" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6110"
+       id="linearGradient4023"
+       gradientUnits="userSpaceOnUse"
+       x1="-104.62865"
+       y1="370.74438"
+       x2="-105.04643"
+       y2="386.76367"
+       spreadMethod="pad" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6110"
+       id="linearGradient4065"
+       gradientUnits="userSpaceOnUse"
+       x1="-104.62865"
+       y1="370.74438"
+       x2="-105.04643"
+       y2="386.76367"
+       spreadMethod="pad" />
   </defs>
   <sodipodi:namedview
      id="base"
@@ -11434,9 +11550,9 @@
      borderopacity="1.0"
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
-     inkscape:zoom="7.9999995"
-     inkscape:cx="103.60893"
-     inkscape:cy="-243.21864"
+     inkscape:zoom="1"
+     inkscape:cx="-77.542359"
+     inkscape:cy="-262.16111"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      width="16px"
@@ -11447,9 +11563,9 @@
      showguides="true"
      inkscape:guide-bbox="true"
      inkscape:window-width="1920"
-     inkscape:window-height="1056"
+     inkscape:window-height="1136"
      inkscape:window-x="0"
-     inkscape:window-y="24"
+     inkscape:window-y="27"
      inkscape:window-maximized="1"
      inkscape:snap-global="false">
     <inkscape:grid
@@ -11669,26 +11785,27 @@
        id="rect2486" />
     <text
        xml:space="preserve"
-       style="font-size:5px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none"
        x="8"
        y="-14"
        id="text2432"><tspan
          sodipodi:role="line"
          id="tspan2434"
          x="8"
-         y="-14">%% ST IL FBD LD SFC FUNCTION FUNCTIONBLOCK PROJECT TRANSITION ACTION CONFIGURATION RESOURCE DATATYPE DATATYPES PROGRAM TRANSITIONS ACTIONS CONFIGURATIONS RESOURCES GRAPH%%</tspan></text>
+         y="-14"
+         style="font-size:5px;line-height:1.25">%% ST IL FBD LD SFC FUNCTION FUNCTIONBLOCK PROJECT TRANSITION ACTION CONFIGURATION RESOURCE DATATYPE DATATYPES PROGRAM TRANSITIONS ACTIONS CONFIGURATIONS RESOURCES GRAPH%%</tspan></text>
     <text
-       sodipodi:linespacing="100%"
        id="text2443"
        y="24"
        x="102"
-       style="font-size:6.9483304px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Script MT Bold;-inkscape-font-specification:'Script MT Bold, Bold'"
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Script MT Bold';-inkscape-font-specification:'Script MT Bold, Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        xml:space="preserve"><tspan
          dx="0 0 -0.72712123 -0.55745977"
          y="24"
          x="102"
          id="tspan2445"
-         sodipodi:role="line">f(x)</tspan></text>
+         sodipodi:role="line"
+         style="font-size:6.94832993px;line-height:1">f(x)</tspan></text>
     <path
        id="path2456"
        style="display:inline;font-size:6.94833039999999970px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Script MT Bold;-inkscape-font-specification:'Script MT Bold, Bold'"
@@ -11707,7 +11824,7 @@
        id="text2438" />
     <text
        xml:space="preserve"
-       style="display:inline;font-size:10.35983276000000000px;font-style:normal;font-weight:normal;fill:#d19f34;fill-opacity:1;stroke:none;stroke-width:0.33726069px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;opacity:1;color:#000000;fill-rule:nonzero;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;visibility:visible;overflow:visible;enable-background:accumulate"
+       style="color:#000000;font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;overflow:visible;visibility:visible;opacity:1;fill:#d19f34;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.33726069px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;enable-background:accumulate"
        x="1.3590535"
        y="11.606757"
        id="text3137"
@@ -11715,7 +11832,8 @@
          sodipodi:role="line"
          id="tspan3139"
          x="1.3590535"
-         y="11.606757">ST</tspan></text>
+         y="11.606757"
+         style="font-size:10.35983276px;line-height:1.25">ST</tspan></text>
     <path
        style="display:inline;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;marker:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;overflow:visible"
        d="M 43,3 L 43,4 L 42,4 L 42,5 L 43,5 L 43,7 L 47,7 L 47,5 L 48,5 L 48,10 L 47,10 L 47,9 L 43,9 L 43,10 L 42,10 L 42,11 L 43,11 L 43,13 L 47,13 L 47,11 L 49,11 L 49,8 L 50,8 L 50,10 L 54,10 L 54,6 L 50,6 L 50,7 L 49,7 L 49,4 L 47,4 L 47,3 L 43,3 z M 44,4 L 46,4 L 46,6 L 44,6 L 44,4 z M 51,7 L 53,7 L 53,9 L 51,9 L 51,7 z M 44,10 L 46,10 L 46,12 L 44,12 L 44,10 z"
@@ -11741,7 +11859,7 @@
        sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccc" />
     <text
        xml:space="preserve"
-       style="display:inline;font-size:10.82976246000000000px;font-style:normal;font-weight:normal;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        x="23.256508"
        y="11.842409"
        id="text4114"
@@ -11749,7 +11867,8 @@
          sodipodi:role="line"
          id="tspan4116"
          x="23.256508"
-         y="11.842409">IL</tspan></text>
+         y="11.842409"
+         style="font-size:10.82976246px;line-height:1.25">IL</tspan></text>
     <path
        style="opacity:1;fill:#ff8700;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.33726069px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
        d="M 126,23 C 124.896,23 124,23.896 124,25 C 124,26.104 124.896,27 126,27 C 127.104,27 128,26.104 128,25 C 128,23.896 127.104,23 126,23 z M 126,24 C 126.552,24 127,24.448 127,25 C 127,25.552 126.552,26 126,26 C 125.448,26 125,25.552 125,25 C 125,24.448 125.448,24 126,24 z"
@@ -11813,16 +11932,16 @@
          style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
       <text
          transform="scale(1.0096698,0.9904228)"
-         sodipodi:linespacing="125%"
          id="text6441"
          y="8.0773582"
          x="6.9329596"
-         style="font-size:6.94388676px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            y="8.0773582"
            x="6.9329596"
            id="tspan6443"
-           sodipodi:role="line">FB</tspan></text>
+           sodipodi:role="line"
+           style="font-size:6.94388723px;line-height:1.25">FB</tspan></text>
     </g>
     <g
        id="g3283"
@@ -11873,15 +11992,15 @@
        inkscape:export-ydpi="90" />
     <text
        xml:space="preserve"
-       style="font-size:6.87738276px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        x="-217.91504"
        y="98.013641"
-       id="text3311"
-       sodipodi:linespacing="125%"><tspan
+       id="text3311"><tspan
          sodipodi:role="line"
          id="tspan7478"
          x="-217.91504"
-         y="98.013641">VAR</tspan></text>
+         y="98.013641"
+         style="font-size:6.87738323px;line-height:1.25">VAR</tspan></text>
     <path
        style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
        d="M -198,106 L -198,107 L -204,107 L -204,106 L -198,106 z"
@@ -11931,16 +12050,16 @@
          id="path3337" />
       <text
          transform="scale(1.0345959,0.9665609)"
-         sodipodi:linespacing="125%"
          id="text3339"
          y="18.622726"
          x="1.425997"
-         style="font-size:6.97013092px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            id="tspan1988"
            y="18.622726"
            x="1.425997"
-           sodipodi:role="line">CMT</tspan></text>
+           sodipodi:role="line"
+           style="font-size:6.97013092px;line-height:1.25">CMT</tspan></text>
     </g>
     <g
        id="g3359"
@@ -11961,16 +12080,16 @@
          d="M 0,6 L 0,19 L 21,18.955806 L 21,12.955806 L 24,13 L 24,12 L 21,11.955806 L 21,5.955806 L 0,6 z M 1,7 L 20,6.955806 L 20,17.955806 L 1,18 L 1,7 z"
          style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
       <text
-         sodipodi:linespacing="125%"
          id="text3365"
          y="15.104307"
          x="8.3926907"
-         style="font-size:6.87738276px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            y="15.104307"
            x="8.3926907"
            id="tspan3367"
-           sodipodi:role="line">C</tspan></text>
+           sodipodi:role="line"
+           style="font-size:6.87738323px;line-height:1.25">C</tspan></text>
       <path
          sodipodi:nodetypes="ccc"
          id="path1949"
@@ -11994,16 +12113,16 @@
          d="M 17,9 L 17,22 L 19,22 L 19,16 L 24,16 L 24,15 L 19,15 L 19,9 L 17,9 z"
          style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
       <text
-         sodipodi:linespacing="125%"
          id="text3387"
          y="7.013639"
          x="3.8336635"
-         style="font-size:6.87738276px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            y="7.013639"
            x="3.8336635"
            id="tspan3389"
-           sodipodi:role="line">VAR</tspan></text>
+           sodipodi:role="line"
+           style="font-size:6.87738323px;line-height:1.25">VAR</tspan></text>
       <path
          inkscape:export-ydpi="90"
          inkscape:export-xdpi="90"
@@ -12052,16 +12171,16 @@
          sodipodi:nodetypes="cccccccccccccccccccccccc" />
       <text
          transform="scale(0.9459506,1.0571376)"
-         sodipodi:linespacing="125%"
          id="text3429"
          y="12.225685"
          x="3.270576"
-         style="font-size:5.06194162px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            y="12.225685"
            x="3.270576"
            id="tspan3431"
-           sodipodi:role="line">START</tspan></text>
+           sodipodi:role="line"
+           style="font-size:5.0619421px;line-height:1.25">START</tspan></text>
     </g>
     <g
        id="g3445"
@@ -12069,16 +12188,16 @@
        transform="translate(97,92)">
       <text
          transform="scale(1.00967,0.990423)"
-         sodipodi:linespacing="125%"
          id="text3447"
          y="15.189672"
          x="14.255835"
-         style="font-size:6.94388819px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            y="15.189672"
            x="14.255835"
            id="tspan3449"
-           sodipodi:role="line">JP</tspan></text>
+           sodipodi:role="line"
+           style="font-size:6.94388819px;line-height:1.25">JP</tspan></text>
       <path
          sodipodi:nodetypes="cccccccc"
          id="path1941"
@@ -12140,16 +12259,16 @@
          d="M 0,9 L 0,22 L 2,22 L 2,16 L 6,16 L 6,15 L 2,15 L 2,9 L 0,9 z"
          style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
       <text
-         sodipodi:linespacing="125%"
          id="text3497"
          y="7.013639"
          x="4.143023"
-         style="font-size:6.87738276px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            y="7.013639"
            x="4.143023"
            id="tspan3499"
-           sodipodi:role="line">VAR</tspan></text>
+           sodipodi:role="line"
+           style="font-size:6.87738323px;line-height:1.25">VAR</tspan></text>
       <path
          inkscape:export-ydpi="90"
          inkscape:export-xdpi="90"
@@ -12162,7 +12281,7 @@
          sodipodi:end="3.8497933"
          sodipodi:start="2.4295312"
          transform="matrix(3.333333,0,0,1.666667,-10.63542,-12)"
-         d="M 5.5467128,19.440281 C 4.8199153,17.756163 4.8175085,15.262611 5.5410496,13.572893"
+         d="m 5.5467128,19.440281 a 2.25,4.5 0 0 1 -0.00566,-5.867388"
          sodipodi:ry="4.5"
          sodipodi:rx="2.25"
          sodipodi:cy="16.5"
@@ -12175,7 +12294,7 @@
          sodipodi:end="3.8497933"
          sodipodi:start="2.4295312"
          transform="matrix(-3.333333,0,0,1.666667,34.63541,-12)"
-         d="M 5.5467128,19.440281 C 4.8199153,17.756163 4.8175085,15.262611 5.5410496,13.572893"
+         d="m 5.5467128,19.440281 a 2.25,4.5 0 0 1 -0.00566,-5.867388"
          sodipodi:ry="4.5"
          sodipodi:rx="2.25"
          sodipodi:cy="16.5"
@@ -12215,16 +12334,16 @@
          style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
       <text
          transform="scale(0.942584,1.060914)"
-         sodipodi:linespacing="125%"
          id="text3545"
          y="13.696054"
          x="4.9849925"
-         style="font-size:5.08002424px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            id="tspan1952"
            y="13.696054"
            x="4.9849925"
-           sodipodi:role="line">STEP</tspan></text>
+           sodipodi:role="line"
+           style="font-size:5.08002377px;line-height:1.25">STEP</tspan></text>
     </g>
     <g
        id="g3559"
@@ -12239,16 +12358,16 @@
          style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
       <text
          transform="scale(0.8804132,1.1358303)"
-         sodipodi:linespacing="125%"
          id="text3563"
          y="14.086612"
          x="20.444946"
-         style="font-size:8.45267773px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            id="tspan3565"
            y="14.086612"
            x="20.444946"
-           sodipodi:role="line">T</tspan></text>
+           sodipodi:role="line"
+           style="font-size:8.45267773px;line-height:1.25">T</tspan></text>
     </g>
     <g
        id="g3579"
@@ -12269,16 +12388,16 @@
          d="M 0,6 L 0,19 L 21,18.955806 L 21,12.955806 L 24,12.955806 L 24,11.955806 L 21,11.955806 L 21,5.955806 L 0,6 z M 1,7 L 20,6.955806 L 20,17.955806 L 1,18 L 1,7 z"
          style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
       <text
-         sodipodi:linespacing="125%"
          id="text3585"
          y="15.013638"
          x="2.2035112"
-         style="font-size:6.87738276px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            y="15.013638"
            x="2.2035112"
            id="tspan3587"
-           sodipodi:role="line">VAR</tspan></text>
+           sodipodi:role="line"
+           style="font-size:6.87738323px;line-height:1.25">VAR</tspan></text>
     </g>
     <g
        id="g3600"
@@ -12286,7 +12405,7 @@
        transform="translate(-142,91)">
       <path
          transform="matrix(1.25,0,0,1.265625,0,9.9375)"
-         d="M 4,2 C 4,3.1045695 3.1045695,4 2,4 0.8954305,4 0,3.1045695 0,2 0,0.8954305 0.8954305,0 2,0 3.1045695,0 4,0.8954305 4,2 z"
+         d="M 4,2 A 2,2 0 0 1 2,4 2,2 0 0 1 0,2 2,2 0 0 1 2,0 2,2 0 0 1 4,2 Z"
          sodipodi:ry="2"
          sodipodi:rx="2"
          sodipodi:cy="2"
@@ -12296,7 +12415,7 @@
          sodipodi:type="arc" />
       <path
          transform="matrix(1.25,0,0,1.25,19,18.996094)"
-         d="M 4,2 C 4,3.1045695 3.1045695,4 2,4 0.8954305,4 0,3.1045695 0,2 0,0.8954305 0.8954305,0 2,0 3.1045695,0 4,0.8954305 4,2 z"
+         d="M 4,2 A 2,2 0 0 1 2,4 2,2 0 0 1 0,2 2,2 0 0 1 2,0 2,2 0 0 1 4,2 Z"
          sodipodi:ry="2"
          sodipodi:rx="2"
          sodipodi:cy="2"
@@ -12320,174 +12439,191 @@
        inkscape:label="#rect3636" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        x="-275"
        y="81"
        id="text3638"><tspan
          sodipodi:role="line"
          id="tspan3640"
          x="-275"
-         y="81">%%add_powerrail%%</tspan></text>
+         y="81"
+         style="font-size:4.49727678px;line-height:1.25">%%add_powerrail%%</tspan></text>
     <text
        id="text3659"
        y="88"
        x="-227"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        xml:space="preserve"><tspan
          y="88"
          x="-227"
          id="tspan3661"
-         sodipodi:role="line">%%add_coil%%</tspan></text>
+         sodipodi:role="line"
+         style="font-size:4.49727678px;line-height:1.25">%%add_coil%%</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        x="-190"
        y="81"
        id="text3663"><tspan
          sodipodi:role="line"
          id="tspan3665"
          x="-190"
-         y="81">%%add_step%%</tspan></text>
+         y="81"
+         style="font-size:4.49727678px;line-height:1.25">%%add_step%%</tspan></text>
     <text
        id="text3669"
        y="87"
        x="-150"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        xml:space="preserve"><tspan
          y="87"
          x="-150"
          id="tspan3671"
-         sodipodi:role="line">%%add_wire%%</tspan></text>
+         sodipodi:role="line"
+         style="font-size:4.49727678px;line-height:1.25">%%add_wire%%</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        x="-110"
        y="81"
        id="text3675"><tspan
          sodipodi:role="line"
          id="tspan3677"
          x="-110"
-         y="81">%%add_divergence%%</tspan></text>
+         y="81"
+         style="font-size:4.49727678px;line-height:1.25">%%add_divergence%%</tspan></text>
     <text
        id="text3681"
        y="87"
        x="-70"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        xml:space="preserve"><tspan
          y="87"
          x="-70"
          id="tspan3683"
-         sodipodi:role="line">%%add_action%%</tspan></text>
+         sodipodi:role="line"
+         style="font-size:4.49727678px;line-height:1.25">%%add_action%%</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        x="-30"
        y="81"
        id="text3687"><tspan
          sodipodi:role="line"
          id="tspan3689"
          x="-30"
-         y="81">%%add_connection%%</tspan></text>
+         y="81"
+         style="font-size:4.49727678px;line-height:1.25">%%add_connection%%</tspan></text>
     <text
        id="text3693"
        y="87"
        x="10"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        xml:space="preserve"><tspan
          y="87"
          x="10"
          id="tspan3695"
-         sodipodi:role="line">%%add_block%%</tspan></text>
+         sodipodi:role="line"
+         style="font-size:4.49727678px;line-height:1.25">%%add_block%%</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        x="50"
        y="81"
        id="text3699"><tspan
          sodipodi:role="line"
          id="tspan3701"
          x="50"
-         y="81">%%add_initial_step%%</tspan></text>
+         y="81"
+         style="font-size:4.49727678px;line-height:1.25">%%add_initial_step%%</tspan></text>
     <text
        id="text3705"
        y="87"
        x="90"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        xml:space="preserve"><tspan
          y="87"
          x="90"
          id="tspan3707"
-         sodipodi:role="line">%%add_jump%%</tspan></text>
+         sodipodi:role="line"
+         style="font-size:4.49727678px;line-height:1.25">%%add_jump%%</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        x="130"
        y="81"
        id="text3711"><tspan
          sodipodi:role="line"
          id="tspan3713"
          x="130"
-         y="81">%%add_variable%%</tspan></text>
+         y="81"
+         style="font-size:4.49727678px;line-height:1.25">%%add_variable%%</tspan></text>
     <text
        id="text3717"
        y="87"
        x="170"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        xml:space="preserve"><tspan
          y="87"
          x="170"
          id="tspan3719"
-         sodipodi:role="line">%%add_contact%%</tspan></text>
+         sodipodi:role="line"
+         style="font-size:4.49727678px;line-height:1.25">%%add_contact%%</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        x="210"
        y="81"
        id="text3723"><tspan
          sodipodi:role="line"
          id="tspan3725"
          x="210"
-         y="81">%%add_branch%%</tspan></text>
+         y="81"
+         style="font-size:4.49727678px;line-height:1.25">%%add_branch%%</tspan></text>
     <text
        id="text3729"
        y="87"
        x="250"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        xml:space="preserve"><tspan
          y="87"
          x="250"
          id="tspan3731"
-         sodipodi:role="line">%%add_transition%%</tspan></text>
+         sodipodi:role="line"
+         style="font-size:4.49727678px;line-height:1.25">%%add_transition%%</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        x="290"
        y="81"
        id="text3735"><tspan
          sodipodi:role="line"
          id="tspan3737"
          x="290"
-         y="81">%%add_rung%%</tspan></text>
+         y="81"
+         style="font-size:4.49727678px;line-height:1.25">%%add_rung%%</tspan></text>
     <text
        id="text3741"
        y="87"
        x="330"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        xml:space="preserve"><tspan
          y="87"
          x="330"
          id="tspan3743"
-         sodipodi:role="line">%%select%%</tspan></text>
+         sodipodi:role="line"
+         style="font-size:4.49727678px;line-height:1.25">%%select%%</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        x="370"
        y="81"
        id="text3747"><tspan
          sodipodi:role="line"
          id="tspan3749"
          x="370"
-         y="81">%%add_comment%%</tspan></text>
+         y="81"
+         style="font-size:4.49727678px;line-height:1.25">%%add_comment%%</tspan></text>
     <path
        style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        d="M 22.097087,-12.461048 L 8.8388348,-1.3241161"
@@ -12725,17 +12861,17 @@
     </g>
     <text
        xml:space="preserve"
-       style="font-size:7.47265005px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Arial;-inkscape-font-specification:Arial Bold"
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:Arial;-inkscape-font-specification:'Arial Bold';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        x="91.967514"
        y="112.92294"
        id="textg"
-       sodipodi:linespacing="125%"
-       transform="matrix(0.7071068,-0.7071068,0.7071068,0.7071068,0,0)"
+       transform="rotate(-45)"
        inkscape:label="#text3904"><tspan
          sodipodi:role="line"
          id="tspan3906"
          x="91.967514"
-         y="112.92294">PLC</tspan></text>
+         y="112.92294"
+         style="font-size:7.47265005px;line-height:1.25">PLC</tspan></text>
     <g
        id="g4346">
       <path
@@ -12749,16 +12885,16 @@
          style="font-size:5.20968056px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans" />
       <text
          transform="scale(0.9148123,1.0931204)"
-         sodipodi:linespacing="125%"
          id="text3916"
          y="8.2332983"
          x="218.16463"
-         style="font-size:5.01952219px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            id="tspan3918"
            y="8.2332983"
            x="218.16463"
-           sodipodi:role="line">N</tspan></text>
+           sodipodi:role="line"
+           style="font-size:5.01952219px;line-height:1.25">N</tspan></text>
     </g>
     <g
        id="g4360">
@@ -12883,12 +13019,13 @@
          id="text4170"
          y="12"
          x="295"
-         style="font-size:13.0971384px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            y="12"
            x="295"
            id="tspan4172"
-           sodipodi:role="line">}</tspan></text>
+           sodipodi:role="line"
+           style="font-size:13.0971384px;line-height:1.25">}</tspan></text>
       <rect
          style="opacity:1;fill:#44aa00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
          id="rect4176"
@@ -12971,52 +13108,52 @@
          style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;marker:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
       <text
          transform="scale(0.9666368,1.0345148)"
-         sodipodi:linespacing="125%"
          id="text3626"
          y="96.663689"
          x="-52.761501"
-         style="font-size:5.20968056px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            id="tspan3628"
            y="96.663689"
            x="-52.761501"
-           sodipodi:role="line">ACT</tspan></text>
+           sodipodi:role="line"
+           style="font-size:5.20968103px;line-height:1.25">ACT</tspan></text>
       <text
          transform="scale(0.9148123,1.0931204)"
-         sodipodi:linespacing="125%"
          id="text2015"
          y="91.481232"
          x="-62.768635"
-         style="font-size:5.01952219px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            id="tspan2017"
            y="91.481232"
            x="-62.768635"
-           sodipodi:role="line">N</tspan></text>
+           sodipodi:role="line"
+           style="font-size:5.01952219px;line-height:1.25">N</tspan></text>
       <text
          transform="scale(0.9930776,1.0069706)"
-         sodipodi:linespacing="125%"
          id="text2019"
          y="107.17803"
          x="-57.774296"
-         style="font-size:5.25197458px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            id="tspan2023"
            y="107.17803"
            x="-57.774296"
-           sodipodi:role="line">S</tspan></text>
+           sodipodi:role="line"
+           style="font-size:5.25197506px;line-height:1.25">S</tspan></text>
       <text
          transform="scale(0.934197,1.070438)"
-         sodipodi:linespacing="125%"
          id="text2027"
          y="100.89328"
          x="-54.591038"
-         style="font-size:5.12588978px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
          xml:space="preserve"><tspan
            id="tspan2029"
            y="100.89328"
            x="-54.591038"
-           sodipodi:role="line">VAR</tspan></text>
+           sodipodi:role="line"
+           style="font-size:5.12588978px;line-height:1.25">VAR</tspan></text>
     </g>
     <use
        x="0"
@@ -13185,22 +13322,24 @@
        id="text4026"
        y="-54"
        x="8"
-       style="font-size:5px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
        xml:space="preserve"><tspan
          y="-54"
          x="8"
          id="tspan4028"
-         sodipodi:role="line">%% VAR_LOCAL VAR_INPUT VAR_OUTPUT VAR_INOUT %%</tspan></text>
+         sodipodi:role="line"
+         style="font-size:5px;line-height:1.25">%% VAR_LOCAL VAR_INPUT VAR_OUTPUT VAR_INOUT %%</tspan></text>
     <text
        id="text4026-5"
        y="-54"
        x="210"
-       style="font-size:5px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          y="-54"
          x="210"
          id="tspan4028-7"
-         sodipodi:role="line">%% COMMENT BLOCK IO_VARIABLE CONNECTOR CONTACT COIL STEP JUMP %%</tspan></text>
+         sodipodi:role="line"
+         style="font-size:5px;line-height:1.25">%% COMMENT BLOCK IO_VARIABLE CONNECTOR CONTACT COIL STEP JUMP %%</tspan></text>
     <use
        style="display:inline"
        x="0"
@@ -13241,16 +13380,16 @@
          sodipodi:nodetypes="ccccccccccccccccc" />
       <text
          transform="scale(1.0345959,0.96656095)"
-         sodipodi:linespacing="125%"
          id="text3339-4"
          y="17.998188"
          x="4.4307899"
-         style="font-size:3.46388555px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan1988-1"
            y="17.998188"
            x="4.4307899"
-           sodipodi:role="line">CMT</tspan></text>
+           sodipodi:role="line"
+           style="font-size:3.46388602px;line-height:1.25">CMT</tspan></text>
     </g>
     <g
        transform="translate(129,-48)"
@@ -13264,16 +13403,16 @@
          style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.33726069px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
       <text
          transform="scale(1.0096698,0.9904228)"
-         sodipodi:linespacing="125%"
          id="text6441-8"
          y="8.1013546"
          x="123.80813"
-         style="font-size:4.17388439px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            y="8.1013546"
            x="123.80813"
            id="tspan6443-7"
-           sodipodi:role="line">FB</tspan></text>
+           sodipodi:role="line"
+           style="font-size:4.17388391px;line-height:1.25">FB</tspan></text>
     </g>
     <use
        style="display:inline"
@@ -13307,16 +13446,16 @@
          d="m 9,8.95581 0,8 10,0 0,-4 2,0 0,-1 -2,0 0,-3 z m 1,1 8,-4e-6 0,6 -8,4e-6 z"
          style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible" />
       <text
-         sodipodi:linespacing="125%"
          id="text3585-0"
          y="13.95581"
          x="11"
-         style="font-size:2.67459083px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            y="13.95581"
            x="11"
            id="tspan3587-7"
-           sodipodi:role="line">VAR</tspan></text>
+           sodipodi:role="line"
+           style="font-size:2.67459106px;line-height:1.25">VAR</tspan></text>
     </g>
     <use
        style="display:inline"
@@ -13354,16 +13493,16 @@
          d="M 9.4649098,9.5580851 12.55965,12.95581 9.5309398,16.357614"
          style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
       <text
-         sodipodi:linespacing="125%"
          id="text3365-3"
          y="13.95581"
          x="13.46875"
-         style="font-size:2.69470572px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            y="13.95581"
            x="13.46875"
            id="tspan3367-9"
-           sodipodi:role="line">C</tspan></text>
+           sodipodi:role="line"
+           style="font-size:2.69470596px;line-height:1.25">C</tspan></text>
       <path
          inkscape:connector-curvature="0"
          inkscape:export-ydpi="90"
@@ -13387,16 +13526,16 @@
          d="m 10,6 0,9 2,0 0,-4 2,0 0,-1 -2,0 0,-4 z"
          style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible" />
       <text
-         sodipodi:linespacing="125%"
          id="text3387-1"
          y="5"
          x="5"
-         style="font-size:2.80351019px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            y="5"
            x="5"
            id="tspan3389-3"
-           sodipodi:role="line">VAR</tspan></text>
+           sodipodi:role="line"
+           style="font-size:2.80350995px;line-height:1.25">VAR</tspan></text>
       <path
          inkscape:connector-curvature="0"
          inkscape:export-ydpi="90"
@@ -13476,16 +13615,16 @@
        sodipodi:end="3.6937671"
        sodipodi:open="true" />
     <text
-       sodipodi:linespacing="125%"
        id="text3387-1-9"
        y="-44"
        x="357.98856"
-       style="font-size:2.80351019px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          y="-44"
          x="357.98856"
          id="tspan3389-3-6"
-         sodipodi:role="line">VAR</tspan></text>
+         sodipodi:role="line"
+         style="font-size:2.80350995px;line-height:1.25">VAR</tspan></text>
     <path
        sodipodi:open="true"
        sodipodi:end="3.6937671"
@@ -13521,16 +13660,16 @@
          style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible" />
       <text
          transform="scale(0.94258374,1.0609137)"
-         sodipodi:linespacing="125%"
          id="text3545-3"
          y="13.081616"
          x="12.051801"
-         style="font-size:2.41527915px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            id="tspan1952-7"
            y="13.081616"
            x="12.051801"
-           sodipodi:role="line">STEP</tspan></text>
+           sodipodi:role="line"
+           style="font-size:2.41527891px;line-height:1.25">STEP</tspan></text>
     </g>
     <g
        style="display:inline"
@@ -13539,16 +13678,16 @@
        transform="translate(383,-51)">
       <text
          transform="scale(1.0096698,0.99042281)"
-         sodipodi:linespacing="125%"
          id="text3447-6"
          y="11.106368"
          x="15.846765"
-         style="font-size:4.09374714px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+         style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0%;font-family:'Bitstream Vera Sans';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
          xml:space="preserve"><tspan
            y="11.106368"
            x="15.846765"
            id="tspan3449-5"
-           sodipodi:role="line">JP</tspan></text>
+           sodipodi:role="line"
+           style="font-size:4.09374714px;line-height:1.25">JP</tspan></text>
       <path
          inkscape:connector-curvature="0"
          sodipodi:nodetypes="cccccccc"
@@ -13568,12 +13707,13 @@
        id="text3741-2"
        y="87"
        x="416"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        xml:space="preserve"><tspan
          y="87"
          x="416"
          id="tspan3743-5"
-         sodipodi:role="line">%%move%%</tspan></text>
+         sodipodi:role="line"
+         style="font-size:4.49727678px;line-height:1.25">%%move%%</tspan></text>
     <path
        id="rect4019-0"
        style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.04667795;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
@@ -13646,14 +13786,15 @@
     </g>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-266"
        y="133"
        id="text3638-3"><tspan
          sodipodi:role="line"
          id="tspan3640-1"
          x="-266"
-         y="133">%%new%%</tspan></text>
+         y="133"
+         style="font-size:4.49727678px;line-height:1.25">%%new%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="139"
@@ -13741,14 +13882,15 @@
     </g>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-233"
        y="133"
        id="text3638-3-1"><tspan
          sodipodi:role="line"
          id="tspan3640-1-2"
          x="-233"
-         y="133">%%open%%</tspan></text>
+         y="133"
+         style="font-size:4.49727678px;line-height:1.25">%%open%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="139"
@@ -13759,14 +13901,15 @@
        style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-199"
        y="133"
        id="text3638-3-1-0"><tspan
          sodipodi:role="line"
          id="tspan3640-1-2-4"
          x="-199"
-         y="133">%%save%%</tspan></text>
+         y="133"
+         style="font-size:4.49727678px;line-height:1.25">%%save%%</tspan></text>
     <g
        id="layer1-97"
        transform="translate(-197.02443,138.98432)">
@@ -13883,14 +14026,15 @@
        style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-166"
        y="133"
        id="text3638-3-1-0-5"><tspan
          sodipodi:role="line"
          id="tspan3640-1-2-4-7"
          x="-166"
-         y="133">%%saveas%%</tspan></text>
+         y="133"
+         style="font-size:4.49727678px;line-height:1.25">%%saveas%%</tspan></text>
     <g
        id="g4931"
        transform="translate(-161.99995,138.98881)">
@@ -14037,14 +14181,15 @@
        style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-129"
        y="133"
        id="text3638-3-1-0-5-2"><tspan
          sodipodi:role="line"
          id="tspan3640-1-2-4-7-9"
          x="-129"
-         y="133">%%print%%</tspan></text>
+         y="133"
+         style="font-size:4.49727678px;line-height:1.25">%%print%%</tspan></text>
     <g
        id="g5067"
        transform="translate(-127.01381,138.27905)">
@@ -14136,14 +14281,15 @@
        style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-93.51992"
        y="133"
        id="text3638-3-1-0-5-2-8"><tspan
          sodipodi:role="line"
          id="tspan3640-1-2-4-7-9-4"
          x="-93.51992"
-         y="133">%%undo%%</tspan></text>
+         y="133"
+         style="font-size:4.49727678px;line-height:1.25">%%undo%%</tspan></text>
     <g
        transform="translate(-90.992695,145.90231)"
        id="layer1-62">
@@ -14193,14 +14339,15 @@
        style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-59"
        y="133"
        id="text3638-3-1-0-5-2-8-8"><tspan
          sodipodi:role="line"
          id="tspan3640-1-2-4-7-9-4-9"
          x="-59"
-         y="133">%%redo%%</tspan></text>
+         y="133"
+         style="font-size:4.49727678px;line-height:1.25">%%redo%%</tspan></text>
     <g
        transform="matrix(-1,0,0,1,-34.0625,145.9375)"
        id="layer1-7">
@@ -14313,14 +14460,15 @@
     </g>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-22"
        y="133"
        id="text3638-3-1-0-5-2-8-8-2"><tspan
          sodipodi:role="line"
          id="tspan3640-1-2-4-7-9-4-9-0"
          x="-22"
-         y="133">%%cut%%</tspan></text>
+         y="133"
+         style="font-size:4.49727678px;line-height:1.25">%%cut%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="139"
@@ -14331,14 +14479,15 @@
        style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="11"
        y="133"
        id="text3638-3-1-0-5-2-8-8-2-5"><tspan
          sodipodi:role="line"
          id="tspan3640-1-2-4-7-9-4-9-0-2"
          x="11"
-         y="133">%%copy%%</tspan></text>
+         y="133"
+         style="font-size:4.49727678px;line-height:1.25">%%copy%%</tspan></text>
     <g
        id="g5446"
        transform="translate(13,139)">
@@ -14360,14 +14509,15 @@
     </g>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="45"
        y="133"
        id="text3638-3-1-0-5-2-8-8-2-8"><tspan
          sodipodi:role="line"
          id="tspan3640-1-2-4-7-9-4-9-0-9"
          x="45"
-         y="133">%%paste%%</tspan></text>
+         y="133"
+         style="font-size:4.49727678px;line-height:1.25">%%paste%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="139"
@@ -14415,14 +14565,15 @@
        style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;opacity:0" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="82"
        y="133"
        id="text3638-3-1-0-5-2-8-8-2-8-6"><tspan
          sodipodi:role="line"
          id="tspan3640-1-2-4-7-9-4-9-0-9-4"
          x="82"
-         y="133">%%find%%</tspan></text>
+         y="133"
+         style="font-size:4.49727678px;line-height:1.25">%%find%%</tspan></text>
     <g
        id="layer1-35"
        transform="translate(83.013866,139.01391)">
@@ -14498,14 +14649,15 @@
        inkscape:connector-curvature="0" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="175"
        y="131"
        id="text3638-3-1-0-5-2-8-8-2-8-6-1"><tspan
          sodipodi:role="line"
          id="tspan3640-1-2-4-7-9-4-9-0-9-4-8"
          x="175"
-         y="131">%%custom_tree_background%%</tspan></text>
+         y="131"
+         style="font-size:4.49727678px;line-height:1.25">%%custom_tree_background%%</tspan></text>
     <g
        transform="matrix(0,1,1,0,-125.9999,182.5)"
        id="layer1-5">
@@ -14555,14 +14707,15 @@
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-133"
        y="177"
        id="text3638-3-3"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8"
          x="-133"
-         y="177">%%up%%</tspan></text>
+         y="177"
+         style="font-size:4.49727678px;line-height:1.25">%%up%%</tspan></text>
     <g
        id="layer1-57"
        transform="translate(-233.09946,219.05807)">
@@ -14983,14 +15136,15 @@
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-233.67409"
        y="215.06073"
        id="text3638-3-3-2"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0"
          x="-233.67409"
-         y="215.06073">%%edit%%</tspan></text>
+         y="215.06073"
+         style="font-size:4.49727678px;line-height:1.25">%%edit%%</tspan></text>
     <g
        style="fill-rule:evenodd"
        id="g652"
@@ -15062,14 +15216,15 @@
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-204"
        y="215"
        id="text3638-3-3-2-0"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6"
          x="-204"
-         y="215">%%debug_instance%%</tspan></text>
+         y="215"
+         style="font-size:4.49727678px;line-height:1.25">%%debug_instance%%</tspan></text>
     <g
        style="display:inline"
        id="layer1-8"
@@ -15234,14 +15389,15 @@
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-148"
        y="215"
        id="text3638-3-3-2-0-9"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8"
          x="-148"
-         y="215">%%instance_graph%%</tspan></text>
+         y="215"
+         style="font-size:4.49727678px;line-height:1.25">%%instance_graph%%</tspan></text>
     <path
        inkscape:connector-curvature="0"
        id="path4200"
@@ -15315,14 +15471,15 @@
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-30.037788"
        y="177.11613"
        id="text3638-3-3-2-0-9-8-5-5"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-4-3-9"
          x="-30.037788"
-         y="177.11613">%%export_graph%%</tspan></text>
+         y="177.11613"
+         style="font-size:4.49727678px;line-height:1.25">%%export_graph%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="181"
@@ -15333,14 +15490,15 @@
        style="opacity:0;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans"
+       style="color:#000000;font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
        x="-167"
        y="177"
        id="text3638-3-3-29"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-3"
          x="-167"
-         y="177">%%down%%</tspan></text>
+         y="177"
+         style="font-size:4.49727678px;line-height:1.25">%%down%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="219"
@@ -15351,14 +15509,15 @@
        style="opacity:0;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans"
+       style="color:#000000;font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
        x="-265.58582"
        y="215"
        id="text3638-3-3-29-8"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-3-4"
          x="-265.58582"
-         y="215">%%top%%</tspan></text>
+         y="215"
+         style="font-size:4.49727678px;line-height:1.25">%%top%%</tspan></text>
     <g
        id="layer1-06"
        transform="matrix(0,1,1,0,-258.5827,219.99205)">
@@ -15438,14 +15597,15 @@
        style="opacity:0;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans"
+       style="color:#000000;font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
        x="-276.58582"
        y="177"
        id="text3638-3-3-29-8-1"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-3-4-3"
          x="-276.58582"
-         y="177">%%add_element%%</tspan></text>
+         y="177"
+         style="font-size:4.49727678px;line-height:1.25">%%add_element%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="181"
@@ -15456,14 +15616,15 @@
        style="opacity:0;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;color:#000000;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans"
+       style="color:#000000;font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;enable-background:accumulate"
        x="-227.08582"
        y="177"
        id="text3638-3-3-29-8-8"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-3-4-7"
          x="-227.08582"
-         y="177">%%remove_element%%</tspan></text>
+         y="177"
+         style="font-size:4.49727678px;line-height:1.25">%%remove_element%%</tspan></text>
     <g
        transform="translate(-265.9142,180.9194)"
        id="layer1-2">
@@ -15527,14 +15688,15 @@
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-102"
        y="177"
        id="text3638-3-3-2-0-9-8"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-4"
          x="-102"
-         y="177">%%reset%%</tspan></text>
+         y="177"
+         style="font-size:4.49727678px;line-height:1.25">%%reset%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="181"
@@ -15545,14 +15707,15 @@
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-67.292892"
        y="177"
        id="text3638-3-3-2-0-9-8-0"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-4-7"
          x="-67.292892"
-         y="177">%%current%%</tspan></text>
+         y="177"
+         style="font-size:4.49727678px;line-height:1.25">%%current%%</tspan></text>
     <path
        inkscape:connector-curvature="0"
        d="m -192.2071,189.49482 0,7.00518 -19,0 0,-7.00518 19,0 z"
@@ -15828,14 +15991,15 @@
     </g>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="20.5"
        y="177.11613"
        id="text3638-3-3-2-0-9-8-5-5-9"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-4-3-9-0"
          x="20.5"
-         y="177.11613">%%fit%%</tspan></text>
+         y="177.11613"
+         style="font-size:4.49727678px;line-height:1.25">%%fit%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="180.75"
@@ -15941,24 +16105,26 @@
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-268.17508"
        y="255.625"
        id="text3638-3-3-2-0-9-84"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-0"
          x="-268.17508"
-         y="255.625">%%force%%</tspan></text>
+         y="255.625"
+         style="font-size:4.49727678px;line-height:1.25">%%force%%</tspan></text>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-235.5"
        y="255.5"
        id="text3638-3-3-2-0-9-84-1"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-0-5"
          x="-235.5"
-         y="255.5">%%release%%</tspan></text>
+         y="255.5"
+         style="font-size:4.49727678px;line-height:1.25">%%release%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="259"
@@ -15969,14 +16135,15 @@
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-91.428932"
        y="214.86613"
        id="text3638-3-3-2-0-9-84-1-0"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-0-5-0"
          x="-91.428932"
-         y="214.86613">%%split%%</tspan></text>
+         y="214.86613"
+         style="font-size:4.49727678px;line-height:1.25">%%split%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="218.39645"
@@ -16085,14 +16252,15 @@
     </g>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-200"
        y="255.625"
        id="text3638-3-3-2-0-9-84-1-0-7"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-0-5-0-8"
          x="-200"
-         y="255.625">%%delete_graph%%</tspan></text>
+         y="255.625"
+         style="font-size:4.49727678px;line-height:1.25">%%delete_graph%%</tspan></text>
     <g
        transform="translate(-184.69001,259.127)"
        id="layer1-1">
@@ -16122,14 +16290,15 @@
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-149.75002"
        y="255.75"
        id="text3638-3-3-2-0-9-84-1-0-7-8"><tspan
          sodipodi:role="line"
          x="-149.75002"
          y="255.75"
-         id="tspan5713">%%minimize_graph%%</tspan></text>
+         id="tspan5713"
+         style="font-size:4.49727678px;line-height:1.25">%%minimize_graph%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="259"
@@ -16178,14 +16347,15 @@
        sodipodi:nodetypes="ccc" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-45.511536"
        y="255.83347"
        id="text3638-3-3-2-0-9-84-1-0-7-8-0"><tspan
          sodipodi:role="line"
          x="-45.511536"
          y="255.83347"
-         id="tspan5713-0">%%maximize_graph%%</tspan></text>
+         id="tspan5713-0"
+         style="font-size:4.49727678px;line-height:1.25">%%maximize_graph%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="259.08347"
@@ -16330,14 +16500,15 @@
     </g>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="-94.52224"
        y="255.6499"
        id="text3638-3-3-2-0-9-84-1-0-7-8-0-7"><tspan
          sodipodi:role="line"
          x="-94.52224"
          y="255.6499"
-         id="tspan5713-0-6">%%middle_graph%%</tspan></text>
+         id="tspan5713-0-6"
+         style="font-size:4.49727678px;line-height:1.25">%%middle_graph%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="259.02292"
@@ -16387,14 +16558,15 @@
        sodipodi:nodetypes="ccc" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="10.198587"
        y="255.80313"
        id="text3638-3-3-2-0-9-8-5-5-2"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-4-3-9-5"
          x="10.198587"
-         y="255.80313">%%export_graph_mini%%</tspan></text>
+         y="255.80313"
+         style="font-size:4.49727678px;line-height:1.25">%%export_graph_mini%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="259.125"
@@ -16469,14 +16641,15 @@
     </g>
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="70.198586"
        y="255.80313"
        id="text3638-3-3-2-0-9-8-5-5-2-6"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-4-3-9-5-4"
          x="70.198586"
-         y="255.80313">%%fit_graph%%</tspan></text>
+         y="255.80313"
+         style="font-size:4.49727678px;line-height:1.25">%%fit_graph%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="259.125"
@@ -16487,14 +16660,15 @@
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
-       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       style="font-style:normal;font-weight:normal;line-height:0%;font-family:'Bitstream Vera Sans';display:inline;fill:#000000;fill-opacity:1;stroke:none"
        x="108.19859"
        y="255.80313"
        id="text3638-3-3-2-0-9-8-5-5-2-6-9"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-4-3-9-5-4-0"
          x="108.19859"
-         y="255.80313">%%full_graph%%</tspan></text>
+         y="255.80313"
+         style="font-size:4.49727678px;line-height:1.25">%%full_graph%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
        y="259.125"
@@ -16623,5 +16797,759 @@
          style="fill:#73a300"
          d="M 13.536,9.2929 10.707,6.4645 10,10 13.536,9.2929 z" />
     </g>
+    <text
+       xml:space="preserve"
+       style="font-style:normal;font-weight:normal;font-size:10.66666698px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       x="-71.152626"
+       y="408.97461"
+       id="text3851"><tspan
+         sodipodi:role="line"
+         id="tspan3849"
+         x="-71.152626"
+         y="418.41211" /></text>
+    <g
+       id="g3892">
+      <g
+         id="g4063"
+         inkscape:export-filename="/tmp/g6048.png"
+         inkscape:export-xdpi="511.16"
+         inkscape:export-ydpi="511.16"
+         transform="matrix(0.336675,0,0,0.336675,243.01541,255.68519)">
+        <rect
+           transform="matrix(1,0,-0.00552419,0.99998474,0,0)"
+           y="369.00568"
+           x="-125.7665"
+           height="48.000736"
+           width="47.812504"
+           id="poeico016"
+           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke-width:0.26469493;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <rect
+           y="369.99533"
+           x="-121.00365"
+           height="45.998077"
+           width="34.008987"
+           id="rect4027"
+           style="opacity:1;vector-effect:none;fill:url(#linearGradient4065);fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <text
+           id="text4031"
+           y="383.96072"
+           x="-104.72483"
+           style="font-style:normal;font-weight:normal;font-size:14.66666698px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.93999999;fill:#0070ba;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           xml:space="preserve"><tspan
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14.66666698px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';text-align:center;text-anchor:middle;fill:#0070ba;fill-opacity:1"
+             y="383.96072"
+             x="-104.72483"
+             id="tspan4029"
+             sodipodi:role="line">PLC</tspan></text>
+        <text
+           id="text4035"
+           y="406.02539"
+           x="-104.02523"
+           style="font-style:normal;font-weight:normal;font-size:10.26000023px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.93999999;fill:#0070ba;fill-opacity:1;stroke:none;stroke-width:0.85499996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           xml:space="preserve"><tspan
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.53999996px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';text-align:center;text-anchor:middle;fill:#0070ba;fill-opacity:1;stroke-width:0.85499996px"
+             y="406.02539"
+             x="-104.02523"
+             id="tspan4033"
+             sodipodi:role="line">XML</tspan></text>
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path4037"
+           d="m -117.99446,388.00089 h 27.980075"
+           style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path4039"
+           d="m -87.008818,372.99845 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path4041"
+           d="m -87.007295,380.99967 h 7.009941"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path4043"
+           d="m -87.006103,389.00521 h 2.99829 0.07031 3.941337"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path4045"
+           d="m -87.008486,397.0006 h 7.009941"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path4047"
+           d="m -87.006866,405.00034 h 2.99829 0.07031 3.941337"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path4049"
+           d="m -87.001436,413.00354 h 7.009941"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path4051"
+           d="m -127.99296,372.99734 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path4053"
+           d="m -127.99144,380.99856 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path4055"
+           d="m -127.99025,389.0041 h 2.99829 0.0703 3.94134"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path4057"
+           d="m -127.99263,396.99949 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path4059"
+           d="m -127.99101,404.99923 h 2.99829 0.0703 3.94134"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path4061"
+           d="m -127.98558,413.00243 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      </g>
+      <g
+         transform="matrix(0.5025,0,0,0.5025,184.67577,190.51635)"
+         inkscape:export-ydpi="511.16"
+         inkscape:export-xdpi="511.16"
+         inkscape:export-filename="/tmp/g6048.png"
+         id="g4021">
+        <rect
+           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke-width:0.26469493;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="poeico024"
+           width="47.812504"
+           height="48.000736"
+           x="-125.7665"
+           y="369.00568"
+           transform="matrix(1,0,-0.00552419,0.99998474,0,0)" />
+        <rect
+           style="opacity:1;vector-effect:none;fill:url(#linearGradient4023);fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="rect3984"
+           width="34.008987"
+           height="45.998077"
+           x="-121.00365"
+           y="369.99533" />
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-weight:normal;font-size:14.66666698px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.93999999;fill:#0070ba;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="-104.72483"
+           y="383.96072"
+           id="text3988"><tspan
+             sodipodi:role="line"
+             id="tspan3986"
+             x="-104.72483"
+             y="383.96072"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14.66666698px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';text-align:center;text-anchor:middle;fill:#0070ba;fill-opacity:1">PLC</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-weight:normal;font-size:10.26000023px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.93999999;fill:#0070ba;fill-opacity:1;stroke:none;stroke-width:0.85499996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="-104.02523"
+           y="406.02539"
+           id="text3992"><tspan
+             sodipodi:role="line"
+             id="tspan3990"
+             x="-104.02523"
+             y="406.02539"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.53999996px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';text-align:center;text-anchor:middle;fill:#0070ba;fill-opacity:1;stroke-width:0.85499996px">XML</tspan></text>
+        <path
+           style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -117.99446,388.00089 h 27.980075"
+           id="path3994"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.008818,372.99845 h 7.00994"
+           id="path3997"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.007295,380.99967 h 7.009941"
+           id="path3999"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.006103,389.00521 h 2.99829 0.07031 3.941337"
+           id="path4001"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.008486,397.0006 h 7.009941"
+           id="path4003"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.006866,405.00034 h 2.99829 0.07031 3.941337"
+           id="path4005"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.001436,413.00354 h 7.009941"
+           id="path4007"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99296,372.99734 h 7.00994"
+           id="path4009"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99144,380.99856 h 7.00994"
+           id="path4011"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99025,389.0041 h 2.99829 0.0703 3.94134"
+           id="path4013"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99263,396.99949 h 7.00994"
+           id="path4015"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99101,404.99923 h 2.99829 0.0703 3.94134"
+           id="path4017"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.98558,413.00243 h 7.00994"
+           id="path4019"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+      </g>
+      <g
+         id="g3978"
+         inkscape:export-filename="/tmp/g6048.png"
+         inkscape:export-xdpi="511.16"
+         inkscape:export-ydpi="511.16"
+         transform="matrix(0.67,0,0,0.67,126.51038,124.68924)">
+        <rect
+           transform="matrix(1,0,-0.00552419,0.99998474,0,0)"
+           y="369.00568"
+           x="-125.7665"
+           height="48.000736"
+           width="47.812504"
+           id="poeico032"
+           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke-width:0.26469493;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <rect
+           y="369.99533"
+           x="-121.00365"
+           height="45.998077"
+           width="34.008987"
+           id="rect3941"
+           style="opacity:1;vector-effect:none;fill:url(#linearGradient3980);fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <text
+           id="text3945"
+           y="383.96072"
+           x="-104.72483"
+           style="font-style:normal;font-weight:normal;font-size:14.66666698px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.93999999;fill:#0070ba;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           xml:space="preserve"><tspan
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14.66666698px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';text-align:center;text-anchor:middle;fill:#0070ba;fill-opacity:1"
+             y="383.96072"
+             x="-104.72483"
+             id="tspan3943"
+             sodipodi:role="line">PLC</tspan></text>
+        <text
+           id="text3949"
+           y="406.02539"
+           x="-104.02523"
+           style="font-style:normal;font-weight:normal;font-size:10.26000023px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.93999999;fill:#0070ba;fill-opacity:1;stroke:none;stroke-width:0.85499996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           xml:space="preserve"><tspan
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.53999996px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';text-align:center;text-anchor:middle;fill:#0070ba;fill-opacity:1;stroke-width:0.85499996px"
+             y="406.02539"
+             x="-104.02523"
+             id="tspan3947"
+             sodipodi:role="line">XML</tspan></text>
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3951"
+           d="m -117.99446,388.00089 h 27.980075"
+           style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3953"
+           d="m -87.008818,372.99845 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3955"
+           d="m -87.007295,380.99967 h 7.009941"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path3957"
+           d="m -87.006103,389.00521 h 2.99829 0.07031 3.941337"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3960"
+           d="m -87.008486,397.0006 h 7.009941"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path3962"
+           d="m -87.006866,405.00034 h 2.99829 0.07031 3.941337"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3964"
+           d="m -87.001436,413.00354 h 7.009941"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3966"
+           d="m -127.99296,372.99734 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3968"
+           d="m -127.99144,380.99856 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path3970"
+           d="m -127.99025,389.0041 h 2.99829 0.0703 3.94134"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3972"
+           d="m -127.99263,396.99949 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path3974"
+           d="m -127.99101,404.99923 h 2.99829 0.0703 3.94134"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3976"
+           d="m -127.98558,413.00243 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      </g>
+      <g
+         transform="translate(85.25,-5)"
+         inkscape:export-ydpi="511.16"
+         inkscape:export-xdpi="511.16"
+         inkscape:export-filename="/tmp/g6048.png"
+         id="g6048">
+        <rect
+           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke-width:0.26469493;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="poeico048"
+           width="47.812504"
+           height="48.000736"
+           x="-125.7665"
+           y="369.00568"
+           transform="matrix(1,0,-0.00552419,0.99998474,0,0)" />
+        <rect
+           style="opacity:1;vector-effect:none;fill:url(#linearGradient6068);fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="rect3855"
+           width="34.008987"
+           height="45.998077"
+           x="-121.00365"
+           y="369.99533" />
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-weight:normal;font-size:14.66666698px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.93999999;fill:#0070ba;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="-104.72483"
+           y="383.96072"
+           id="text3820"><tspan
+             sodipodi:role="line"
+             id="tspan3818"
+             x="-104.72483"
+             y="383.96072"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14.66666698px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';text-align:center;text-anchor:middle;fill:#0070ba;fill-opacity:1">PLC</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-weight:normal;font-size:10.26000023px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.93999999;fill:#0070ba;fill-opacity:1;stroke:none;stroke-width:0.85499996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="-104.02523"
+           y="406.02539"
+           id="text3820-7"><tspan
+             sodipodi:role="line"
+             id="tspan3818-3"
+             x="-104.02523"
+             y="406.02539"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.53999996px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';text-align:center;text-anchor:middle;fill:#0070ba;fill-opacity:1;stroke-width:0.85499996px">XML</tspan></text>
+        <path
+           style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -117.99446,388.00089 h 27.980075"
+           id="path3853"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.008818,372.99845 h 7.00994"
+           id="path3853-6"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.007295,380.99967 h 7.009941"
+           id="path3853-6-4"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.006103,389.00521 h 2.99829 0.07031 3.941337"
+           id="path3853-6-7"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.008486,397.0006 h 7.009941"
+           id="path3853-6-4-9"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.006866,405.00034 h 2.99829 0.07031 3.941337"
+           id="path3853-6-7-7"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.001436,413.00354 h 7.009941"
+           id="path3853-6-4-9-2"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99296,372.99734 h 7.00994"
+           id="path3853-6-2"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99144,380.99856 h 7.00994"
+           id="path3853-6-4-1"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99025,389.0041 h 2.99829 0.0703 3.94134"
+           id="path3853-6-7-6"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99263,396.99949 h 7.00994"
+           id="path3853-6-4-9-3"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99101,404.99923 h 2.99829 0.0703 3.94134"
+           id="path3853-6-7-7-0"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.98558,413.00243 h 7.00994"
+           id="path3853-6-4-9-2-2"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+      </g>
+      <g
+         id="g3848"
+         inkscape:export-filename="/tmp/g6048.png"
+         inkscape:export-xdpi="511.16"
+         inkscape:export-ydpi="511.16"
+         transform="matrix(1.33,0,0,1.33,14.125447,-134.68924)">
+        <rect
+           transform="matrix(1,0,-0.00552419,0.99998474,0,0)"
+           y="369.00568"
+           x="-125.7665"
+           height="48.000736"
+           width="47.812504"
+           id="poeico064"
+           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke-width:0.26469493;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <rect
+           y="369.99533"
+           x="-121.00365"
+           height="45.998077"
+           width="34.008987"
+           id="rect3811"
+           style="opacity:1;vector-effect:none;fill:url(#linearGradient3850);fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+        <text
+           id="text3815"
+           y="383.96072"
+           x="-104.72483"
+           style="font-style:normal;font-weight:normal;font-size:14.66666698px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.93999999;fill:#0070ba;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           xml:space="preserve"><tspan
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14.66666698px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';text-align:center;text-anchor:middle;fill:#0070ba;fill-opacity:1"
+             y="383.96072"
+             x="-104.72483"
+             id="tspan3813"
+             sodipodi:role="line">PLC</tspan></text>
+        <text
+           id="text3819"
+           y="406.02539"
+           x="-104.02523"
+           style="font-style:normal;font-weight:normal;font-size:10.26000023px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.93999999;fill:#0070ba;fill-opacity:1;stroke:none;stroke-width:0.85499996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           xml:space="preserve"><tspan
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.53999996px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';text-align:center;text-anchor:middle;fill:#0070ba;fill-opacity:1;stroke-width:0.85499996px"
+             y="406.02539"
+             x="-104.02523"
+             id="tspan3817"
+             sodipodi:role="line">XML</tspan></text>
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3821"
+           d="m -117.99446,388.00089 h 27.980075"
+           style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3823"
+           d="m -87.008818,372.99845 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3825"
+           d="m -87.007295,380.99967 h 7.009941"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path3827"
+           d="m -87.006103,389.00521 h 2.99829 0.07031 3.941337"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3829"
+           d="m -87.008486,397.0006 h 7.009941"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path3831"
+           d="m -87.006866,405.00034 h 2.99829 0.07031 3.941337"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3833"
+           d="m -87.001436,413.00354 h 7.009941"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3835"
+           d="m -127.99296,372.99734 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3837"
+           d="m -127.99144,380.99856 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path3839"
+           d="m -127.99025,389.0041 h 2.99829 0.0703 3.94134"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3842"
+           d="m -127.99263,396.99949 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cccc"
+           inkscape:connector-curvature="0"
+           id="path3844"
+           d="m -127.99101,404.99923 h 2.99829 0.0703 3.94134"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+        <path
+           sodipodi:nodetypes="cc"
+           inkscape:connector-curvature="0"
+           id="path3846"
+           d="m -127.98558,413.00243 h 7.00994"
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      </g>
+      <g
+         transform="matrix(5.32,0,0,5.32,202.43672,-1608.2618)"
+         inkscape:export-ydpi="511.16"
+         inkscape:export-xdpi="511.16"
+         inkscape:export-filename="/tmp/g6048.png"
+         id="g3933">
+        <rect
+           style="opacity:1;vector-effect:none;fill:none;fill-opacity:1;stroke-width:0.26469493;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="poeico256"
+           width="47.812504"
+           height="48.000736"
+           x="-125.7665"
+           y="369.00568"
+           transform="matrix(1,0,-0.00552419,0.99998474,0,0)" />
+        <rect
+           style="opacity:1;vector-effect:none;fill:url(#linearGradient3937);fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+           id="rect3896"
+           width="34.008987"
+           height="45.998077"
+           x="-121.00365"
+           y="369.99533" />
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-weight:normal;font-size:14.66666698px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;opacity:0.93999999;fill:#0070ba;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="-104.72483"
+           y="383.96072"
+           id="text3900"><tspan
+             sodipodi:role="line"
+             id="tspan3898"
+             x="-104.72483"
+             y="383.96072"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:14.66666698px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';text-align:center;text-anchor:middle;fill:#0070ba;fill-opacity:1">PLC</tspan></text>
+        <text
+           xml:space="preserve"
+           style="font-style:normal;font-weight:normal;font-size:10.26000023px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;opacity:0.93999999;fill:#0070ba;fill-opacity:1;stroke:none;stroke-width:0.85499996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           x="-104.02523"
+           y="406.02539"
+           id="text3904"><tspan
+             sodipodi:role="line"
+             id="tspan3902"
+             x="-104.02523"
+             y="406.02539"
+             style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.53999996px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans Bold';text-align:center;text-anchor:middle;fill:#0070ba;fill-opacity:1;stroke-width:0.85499996px">XML</tspan></text>
+        <path
+           style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -117.99446,388.00089 h 27.980075"
+           id="path3906"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.008818,372.99845 h 7.00994"
+           id="path3908"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.007295,380.99967 h 7.009941"
+           id="path3911"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.006103,389.00521 h 2.99829 0.07031 3.941337"
+           id="path3913"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.008486,397.0006 h 7.009941"
+           id="path3915"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.006866,405.00034 h 2.99829 0.07031 3.941337"
+           id="path3917"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -87.001436,413.00354 h 7.009941"
+           id="path3919"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99296,372.99734 h 7.00994"
+           id="path3921"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99144,380.99856 h 7.00994"
+           id="path3923"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99025,389.0041 h 2.99829 0.0703 3.94134"
+           id="path3925"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99263,396.99949 h 7.00994"
+           id="path3927"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.99101,404.99923 h 2.99829 0.0703 3.94134"
+           id="path3929"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cccc" />
+        <path
+           style="display:inline;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0070ba;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+           d="m -127.98558,413.00243 h 7.00994"
+           id="path3931"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="cc" />
+      </g>
+    </g>
+    <text
+       style="font-style:normal;font-weight:normal;font-size:13.88476658px;line-height:0%;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none"
+       xml:space="preserve"
+       id="text19983"
+       y="344.57449"
+       x="-406.12531"><tspan
+         id="tspan19985"
+         y="344.57449"
+         x="-406.12531">%% poeico256                                 poeico064       poeico048    poeico032 poeico024 poeico016 %%</tspan></text>
   </g>
 </svg>
Binary file images/poe.ico has changed
Binary file locale/bn_BD/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/de_DE/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/es_ES/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/fr_FR/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/hr/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/hu_HU/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/it_IT/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/ko_KR/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/nl_NL/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/pl/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/pt/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/pt_BR/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/ro_RO/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/ru_RU/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/sl_SI/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/tr_TR/LC_MESSAGES/Beremiz.mo has changed
Binary file locale/zh_CN/LC_MESSAGES/Beremiz.mo has changed
--- a/modbus/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/modbus/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -8,7 +8,7 @@
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
+# the Free Software Foundation, either version 2 of the License, or
 # (at your option) any later version.
 #
 # This program is distributed in the hope that it will be useful,
@@ -18,9 +18,6 @@
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#    
+#
 # This code is made available on the understanding that it will not be
 # used in safety-critical situations without a full and competent review.
-
-
-from modbus import *
--- a/modbus/mb_runtime.c	Sat Jun 02 11:56:01 2018 +0100
+++ b/modbus/mb_runtime.c	Mon Jan 07 13:50:39 2019 +0100
@@ -1,623 +1,613 @@
-/* File generated by Beremiz (PlugGenerate_C method of Modbus plugin) */
-
-/*
- * Copyright (c) 2016 Mario de Sousa (msousa@fe.up.pt)
- *
- * This file is part of the Modbus library for Beremiz and matiec.
- *
- * This Modbus library is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 
- * General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this Modbus library.  If not, see <http://www.gnu.org/licenses/>.
- *
- * This code is made available on the understanding that it will not be
- * used in safety-critical situations without a full and competent review.
- */
-
-
-#include <stdio.h>
-#include <string.h>  /* required for memcpy() */
-#include "mb_slave_and_master.h"
-#include "MB_%(locstr)s.h"
-
-
-#define MAX_MODBUS_ERROR_CODE 11
-static const char *modbus_error_messages[MAX_MODBUS_ERROR_CODE+1] = {
-    /* 0 */ "",                             /* un-used -> no error! */
-    /* 1 */ "illegal/unsuported function",
-    /* 2 */ "illegal data address",
-    /* 3 */ "illegal data value",
-    /* 4 */ "slave device failure",
-    /* 5 */ "acknowledge -> slave intends to reply later",
-    /* 6 */ "slave device busy",
-    /* 7 */ "negative acknowledge",
-    /* 8 */ "memory parity error",
-    /* 9 */ "",                             /* undefined by Modbus */
-    /* 10*/ "gateway path unavalilable",
-    /* 11*/ "gateway target device failed to respond"
-};    
-
-
-/* Execute a modbus client transaction/request */
-static int __execute_mb_request(int request_id){
-	switch (client_requests[request_id].mb_function){
-	
-	case  1: /* read coils */
-		return read_output_bits(client_requests[request_id].slave_id,
-					client_requests[request_id].address,
-					client_requests[request_id].count,
-					client_requests[request_id].coms_buffer,
-					(int) client_requests[request_id].count,
-					client_nodes[client_requests[request_id].client_node_id].mb_nd,
-					client_requests[request_id].retries,
-					&(client_requests[request_id].error_code),
-					&(client_requests[request_id].resp_timeout),
-					&(client_requests[request_id].coms_buf_mutex));
-
-	case  2: /* read discrete inputs */
-		return read_input_bits( client_requests[request_id].slave_id,
-					client_requests[request_id].address,
-					client_requests[request_id].count,
-					client_requests[request_id].coms_buffer,
-					(int) client_requests[request_id].count,
-					client_nodes[client_requests[request_id].client_node_id].mb_nd,
-					client_requests[request_id].retries,
-					&(client_requests[request_id].error_code),
-					&(client_requests[request_id].resp_timeout),
-					&(client_requests[request_id].coms_buf_mutex));
-
-	case  3: /* read holding registers */
-		return read_output_words(client_requests[request_id].slave_id,
-					client_requests[request_id].address,
-					client_requests[request_id].count,
-					client_requests[request_id].coms_buffer,
-					(int) client_requests[request_id].count,
-					client_nodes[client_requests[request_id].client_node_id].mb_nd,
-					client_requests[request_id].retries,
-					&(client_requests[request_id].error_code),
-					&(client_requests[request_id].resp_timeout),
-					&(client_requests[request_id].coms_buf_mutex));
-	
-	case  4: /* read input registers */
-		return read_input_words(client_requests[request_id].slave_id,
-					client_requests[request_id].address,
-					client_requests[request_id].count,
-					client_requests[request_id].coms_buffer,
-					(int) client_requests[request_id].count,
-					client_nodes[client_requests[request_id].client_node_id].mb_nd,
-					client_requests[request_id].retries,
-					&(client_requests[request_id].error_code),
-					&(client_requests[request_id].resp_timeout),
-					&(client_requests[request_id].coms_buf_mutex));
-
-	case  5: /* write single coil */
-		return write_output_bit(client_requests[request_id].slave_id,
-					client_requests[request_id].address,
-					client_requests[request_id].coms_buffer[0],
-					client_nodes[client_requests[request_id].client_node_id].mb_nd,
-					client_requests[request_id].retries,
-					&(client_requests[request_id].error_code),
-					&(client_requests[request_id].resp_timeout),
-					&(client_requests[request_id].coms_buf_mutex));
-
-	case  6: /* write single register */
-		return write_output_word(client_requests[request_id].slave_id,
-					client_requests[request_id].address,
-					client_requests[request_id].coms_buffer[0],
-					client_nodes[client_requests[request_id].client_node_id].mb_nd,
-					client_requests[request_id].retries,
-					&(client_requests[request_id].error_code),
-					&(client_requests[request_id].resp_timeout),
-					&(client_requests[request_id].coms_buf_mutex));
-
-	case  7: break; /* function not yet supported */
-	case  8: break; /* function not yet supported */
-	case  9: break; /* function not yet supported */
-	case 10: break; /* function not yet supported */
-	case 11: break; /* function not yet supported */
-	case 12: break; /* function not yet supported */
-	case 13: break; /* function not yet supported */
-	case 14: break; /* function not yet supported */
-	
-	case 15: /* write multiple coils */
-		return write_output_bits(client_requests[request_id].slave_id,
-					 client_requests[request_id].address,
-					 client_requests[request_id].count,
-					 client_requests[request_id].coms_buffer,
-					 client_nodes[client_requests[request_id].client_node_id].mb_nd,
-					 client_requests[request_id].retries,
-					 &(client_requests[request_id].error_code),
-					 &(client_requests[request_id].resp_timeout),
-					 &(client_requests[request_id].coms_buf_mutex));
-
-	case 16: /* write multiple registers */
-		return write_output_words(client_requests[request_id].slave_id,
-					client_requests[request_id].address,
-					client_requests[request_id].count,
-					client_requests[request_id].coms_buffer,
-					client_nodes[client_requests[request_id].client_node_id].mb_nd,
-					client_requests[request_id].retries,
-					&(client_requests[request_id].error_code),
-					&(client_requests[request_id].resp_timeout),
-					&(client_requests[request_id].coms_buf_mutex));
-	
-	default: break;  /* should never occur, if file generation is correct */
-	}
-
-	fprintf(stderr, "Modbus plugin: Modbus function %%d not supported\n", request_id); /* should never occur, if file generation is correct */
-	return -1;
-}
-
-
-
-/* pack bits from unpacked_data to packed_data */
-static inline int __pack_bits(u16 *unpacked_data, u16 start_addr, u16 bit_count,  u8  *packed_data) {
-  u8 bit;
-  u16 byte, coils_processed;
-
-  if ((0 == bit_count) || (65535-start_addr < bit_count-1))
-    return -ERR_ILLEGAL_DATA_ADDRESS; /* ERR_ILLEGAL_DATA_ADDRESS defined in mb_util.h */
-  
-  for( byte = 0, coils_processed = 0; coils_processed < bit_count; byte++) {
-    packed_data[byte] = 0;
-    for( bit = 0x01; (bit & 0xFF) && (coils_processed < bit_count); bit <<= 1, coils_processed++ ) {
-      if(unpacked_data[start_addr + coils_processed])
-            packed_data[byte] |=  bit; /*   set bit */
-      else  packed_data[byte] &= ~bit; /* reset bit */
-    }
-  }
-  return 0;
-}
-
-
-/* unpack bits from packed_data to unpacked_data */
-static inline int __unpack_bits(u16 *unpacked_data, u16 start_addr, u16 bit_count,  u8  *packed_data) {
-  u8  temp, bit;
-  u16 byte, coils_processed;
-
-  if ((0 == bit_count) || (65535-start_addr < bit_count-1))
-    return -ERR_ILLEGAL_DATA_ADDRESS; /* ERR_ILLEGAL_DATA_ADDRESS defined in mb_util.h */
-  
-  for(byte = 0, coils_processed = 0; coils_processed < bit_count; byte++) {
-    temp = packed_data[byte] ;
-    for(bit = 0x01; (bit & 0xff) && (coils_processed < bit_count); bit <<= 1, coils_processed++) {
-      unpacked_data[start_addr + coils_processed] = (temp & bit)?1:0;
-    }
-  }
-  return 0;
-}
-
-
-static int __read_inbits   (void *mem_map, u16 start_addr, u16 bit_count, u8  *data_bytes)
-  {return   __pack_bits(((server_mem_t *)mem_map)->ro_bits, start_addr, bit_count, data_bytes);}
-static int __read_outbits  (void *mem_map, u16 start_addr, u16 bit_count, u8  *data_bytes)
-  {return   __pack_bits(((server_mem_t *)mem_map)->rw_bits, start_addr, bit_count, data_bytes);}
-static int __write_outbits (void *mem_map, u16 start_addr, u16 bit_count, u8  *data_bytes)
-  {return __unpack_bits(((server_mem_t *)mem_map)->rw_bits, start_addr, bit_count, data_bytes); }
-
-
-
-static int __read_inwords  (void *mem_map, u16 start_addr, u16 word_count, u16 *data_words) {
-  u16 count;
-  // return -ERR_ILLEGAL_FUNCTION; /* function not yet supported *//* ERR_ILLEGAL_FUNCTION defined in mb_util.h */
-  
-  if ((start_addr + word_count) > MEM_AREA_SIZE)
-    return -ERR_ILLEGAL_DATA_ADDRESS; /* ERR_ILLEGAL_DATA_ADDRESS defined in mb_util.h */
-  
-  /* use memcpy() as it is more efficient...
-  for (count = 0; count < word_count ; count++)
-    data_words[count] = ((server_mem_t *)mem_map)->ro_words[count + start_addr];
-  */
-  memcpy(/* dest */ (void *)data_words,
-         /* src  */ (void *)&(((server_mem_t *)mem_map)->ro_words[start_addr]),
-         /* size */ word_count * 2);
-  return 0;
-}
-
-
-
-static int __read_outwords (void *mem_map, u16 start_addr, u16 word_count, u16 *data_words) {
-  u16 count;
-  // return -ERR_ILLEGAL_FUNCTION; /* function not yet supported *//* ERR_ILLEGAL_FUNCTION defined in mb_util.h */
-  
-  if ((start_addr + word_count) > MEM_AREA_SIZE)
-    return -ERR_ILLEGAL_DATA_ADDRESS; /* ERR_ILLEGAL_DATA_ADDRESS defined in mb_util.h */
-  
-  /* use memcpy() as it is more efficient...
-  for (count = 0; count < word_count ; count++)
-    data_words[count] = ((server_mem_t *)mem_map)->rw_words[count + start_addr];
-  */
-  memcpy(/* dest */ (void *)data_words,
-         /* src  */ (void *)&(((server_mem_t *)mem_map)->rw_words[start_addr]),
-         /* size */ word_count * 2);
-  return 0;
-}
-
-
-
-
-static int __write_outwords(void *mem_map, u16 start_addr, u16 word_count, u16 *data_words) {
-  u16 count;
-  // return -ERR_ILLEGAL_FUNCTION; /* function not yet supported *//* ERR_ILLEGAL_FUNCTION defined in mb_util.h */
-  
-  if ((start_addr + word_count) > MEM_AREA_SIZE)
-    return -ERR_ILLEGAL_DATA_ADDRESS; /* ERR_ILLEGAL_DATA_ADDRESS defined in mb_util.h */
-
-  /* WARNING: The data returned in the data_words[] array is not guaranteed to be 16 bit aligned.
-   *           It is not therefore safe to cast it to an u16 data type.
-   *           The following code cannot be used. memcpy() is used instead.
-   */
-  /*
-  for (count = 0; count < word_count ; count++)
-    ((server_mem_t *)mem_map)->rw_words[count + start_addr] = data_words[count];
-  */
-  memcpy(/* dest */ (void *)&(((server_mem_t *)mem_map)->rw_words[start_addr]),
-         /* src  */ (void *)data_words,
-         /* size */ word_count * 2);
-  return 0;
-}
-
-
-
-
-#include <pthread.h>
-
-static void *__mb_server_thread(void *_server_node)  {
-	server_node_t *server_node = _server_node;
-	mb_slave_callback_t callbacks = { 
-			&__read_inbits,
-			&__read_outbits,
-			&__write_outbits,
-			&__read_inwords,
-			&__read_outwords,
-			&__write_outwords,
-			(void *)&(server_node->mem_area)
-			};  
-	
-	// Enable thread cancelation. Enabled is default, but set it anyway to be safe.
-	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
-
-	// mb_slave_run() should never return!
-	mb_slave_run(server_node->mb_nd /* nd */, callbacks, server_node->slave_id);
-	fprintf(stderr, "Modbus plugin: Modbus server for node %%s died unexpectedly!\n", server_node->location); /* should never occur */
-	return NULL;
-}
-
-
-#define timespec_add(ts, sec, nsec) {		\
-	ts.tv_sec  +=  sec;			\
-	ts.tv_nsec += nsec;			\
-	if (ts.tv_nsec >= 1000000000) {		\
-		ts.tv_sec  ++;			\
-		ts.tv_nsec -= 1000000000;	\
-	}					\
-}
-
-
-static void *__mb_client_thread(void *_index)  {
-	int client_node_id = (char *)_index - (char *)NULL; // Use pointer arithmetic (more portable than cast)
-	struct timespec next_cycle;
-	int period_sec  =  client_nodes[client_node_id].comm_period / 1000;          /* comm_period is in ms */
-	int period_nsec = (client_nodes[client_node_id].comm_period %%1000)*1000000; /* comm_period is in ms */
-
-	// Enable thread cancelation. Enabled is default, but set it anyway to be safe.
-	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
-	
-	// get the current time
-	clock_gettime(CLOCK_MONOTONIC, &next_cycle);
-
-	// loop the communication with the client
-	while (1) {
-		/*
-		struct timespec cur_time;
-		clock_gettime(CLOCK_MONOTONIC, &cur_time);
-		fprintf(stderr, "Modbus client thread - new cycle (%%ld:%%ld)!\n", cur_time.tv_sec, cur_time.tv_nsec);
-		*/
-		int req;
-		for (req=0; req < NUMBER_OF_CLIENT_REQTS; req ++){
-			/*just do the requests belonging to the client */
-			if (client_requests[req].client_node_id != client_node_id)
-				continue;
-			int res_tmp = __execute_mb_request(req);
-			switch (res_tmp) {
-			  case PORT_FAILURE: {
-				if (res_tmp != client_nodes[client_node_id].prev_error)
-					fprintf(stderr, "Modbus plugin: Error connecting Modbus client %%s to remote server.\n", client_nodes[client_node_id].location);
-				client_nodes[client_node_id].prev_error = res_tmp;
-				break;
-			  }
-			  case INVALID_FRAME: {
-				if ((res_tmp != client_requests[req].prev_error) && (0 == client_nodes[client_node_id].prev_error))
-					fprintf(stderr, "Modbus plugin: Modbus client request configured at location %%s was unsuccesful. Server/slave returned an invalid/corrupted frame.\n", client_requests[req].location);
-				client_requests[req].prev_error = res_tmp;
-				break;
-			  }
-			  case TIMEOUT: {
-				if ((res_tmp != client_requests[req].prev_error) && (0 == client_nodes[client_node_id].prev_error))
-					fprintf(stderr, "Modbus plugin: Modbus client request configured at location %%s timed out waiting for reply from server.\n", client_requests[req].location);
-				client_requests[req].prev_error = res_tmp;
-				break;
-			  }
-			  case MODBUS_ERROR: {
-				if (client_requests[req].prev_error != client_requests[req].error_code) {
-					fprintf(stderr, "Modbus plugin: Modbus client request configured at location %%s was unsuccesful. Server/slave returned error code 0x%%2x", client_requests[req].location, client_requests[req].error_code);
-					if (client_requests[req].error_code <= MAX_MODBUS_ERROR_CODE ) {
-						fprintf(stderr, "(%%s)", modbus_error_messages[client_requests[req].error_code]);
-						fprintf(stderr, ".\n");
-					}
-				}
-				client_requests[req].prev_error = client_requests[req].error_code;
-				break;
-			  }
-			  default: {
-				if ((res_tmp >= 0) && (client_nodes[client_node_id].prev_error != 0)) {
-					fprintf(stderr, "Modbus plugin: Modbus client %%s has reconnected to server/slave.\n", client_nodes[client_node_id].location);
-				}
-				if ((res_tmp >= 0) && (client_requests[req]        .prev_error != 0)) {
-					fprintf(stderr, "Modbus plugin: Modbus client request configured at location %%s has succesfully resumed comunication.\n", client_requests[req].location);
-				}
-				client_nodes[client_node_id].prev_error = 0;
-				client_requests[req]        .prev_error = 0;
-				break;
-			  }
-			}
-		}
-		// Determine absolute time instant for starting the next cycle
-		struct timespec prev_cycle, now;
-		prev_cycle = next_cycle;
-		timespec_add(next_cycle, period_sec, period_nsec);
-		/* NOTE A:
-		 * When we have difficulty communicating with remote client and/or server, then the communications get delayed and we will
-		 * fall behind in the period. This means that when communication is re-established we may end up running this loop continuously
-		 * for some time until we catch up.
-		 * This is undesirable, so we detect it by making sure the next_cycle will start in the future.
-		 * When this happens we will switch from a purely periodic task _activation_ sequence, to a fixed task suspension interval.
-		 * 
-		 * NOTE B:
-		 * It probably does not make sense to check for overflow of timer.
-		 * Even in 32 bit systems this will take at least 68 years since the computer booted
-		 * (remember, we are using CLOCK_MONOTONIC, which should start counting from 0
-		 * every time the system boots). On 64 bit systems, it will take over 
-		 * 10^11 years to overflow.
-		 */
-		clock_gettime(CLOCK_MONOTONIC, &now);
-		if (  ((now.tv_sec > next_cycle.tv_sec) || ((now.tv_sec == next_cycle.tv_sec) && (now.tv_nsec > next_cycle.tv_nsec)))
-		   /* We are falling behind. See NOTE A above */
-		   || (next_cycle.tv_sec < prev_cycle.tv_sec)
-		   /* Timer overflow. See NOTE B above */
-		   ) {
-			next_cycle = now;
-			timespec_add(next_cycle, period_sec, period_nsec);
-		}
-		clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &next_cycle, NULL);
-	}
-
-	// humour the compiler.
-	return NULL;
-}
-
-
-
-int __init_%(locstr)s (int argc, char **argv){
-	int index;
-
-	for (index=0; index < NUMBER_OF_CLIENT_NODES;index++)
-		client_nodes[index].mb_nd = -1;
-	for (index=0; index < NUMBER_OF_SERVER_NODES;index++)
-		// mb_nd with negative numbers indicate how far it has been initialised (or not)
-		//   -2  --> no modbus node created;  no thread  created
-		//   -1  -->    modbus node created!; no thread  created
-		//  >=0  -->    modbus node created!;    thread  created!
-		server_nodes[index].mb_nd = -2; 
-
-	/* modbus library init */
-	/* Note that TOTAL_xxxNODE_COUNT are the nodes required by _ALL_ the instances of the modbus
-	 *  extension currently in the user's project. This file (MB_xx.c) is handling only one instance,
-	 *  but must initialize the library for all instances. Only the first call to mb_slave_and_master_init()
-	 *  will result in memory being allocated. All subsequent calls (by other MB_xx,c files) will be ignored
-	 *  by the mb_slave_and_master_init() funtion, as long as they are called with the same arguments.
-	 */
-	if (mb_slave_and_master_init(TOTAL_TCPNODE_COUNT, TOTAL_RTUNODE_COUNT, TOTAL_ASCNODE_COUNT) <0) {
-		fprintf(stderr, "Modbus plugin: Error starting modbus library\n");
-		// return imediately. Do NOT goto error_exit, as we did not get to
-		//  start the modbus library!
-		return -1;
-	}
-	
-	/* init the mutex for each client request */
-	/* Must be done _before_ launching the client threads!! */
-	for (index=0; index < NUMBER_OF_CLIENT_REQTS; index ++){
-		if (pthread_mutex_init(&(client_requests[index].coms_buf_mutex), NULL)) {
-			fprintf(stderr, "Modbus plugin: Error initializing request for modbus client node %%s\n", client_nodes[client_requests[index].client_node_id].location);
-			goto error_exit;
-		}
-	}
-
-	/* init each client connection to remote modbus server, and launch thread */
-	/* NOTE: All client_nodes[].init_state are initialised to 0 in the code 
-	 *       generated by the modbus plugin 
-	 */
-	for (index=0; index < NUMBER_OF_CLIENT_NODES;index++){
-		/* establish client connection */
-		client_nodes[index].mb_nd = mb_master_connect (client_nodes[index].node_address);
-		if (client_nodes[index].mb_nd < 0){
-			fprintf(stderr, "Modbus plugin: Error creating modbus client node %%s\n", client_nodes[index].location);
-			goto error_exit;
-		}
-		client_nodes[index].init_state = 1; // we have created the node 
-		
-		/* launch a thread to handle this client node */
-		{
-			int res = 0;
-			pthread_attr_t attr;
-			res |= pthread_attr_init(&attr);
-			res |= pthread_create(&(client_nodes[index].thread_id), &attr, &__mb_client_thread, (void *)((char *)NULL + index));
-			if (res !=  0) {
-				fprintf(stderr, "Modbus plugin: Error starting modbus client thread for node %%s\n", client_nodes[index].location);
-				goto error_exit;
-			}
-		}
-		client_nodes[index].init_state = 2; // we have created the node and a thread
-	}
-
-	/* init each local server */
-	/* NOTE: All server_nodes[].init_state are initialised to 0 in the code 
-	 *       generated by the modbus plugin 
-	 */
-	for (index=0; index < NUMBER_OF_SERVER_NODES;index++){
-		/* create the modbus server */
-		server_nodes[index].mb_nd = mb_slave_new (server_nodes[index].node_address);
-		if (server_nodes[index].mb_nd < 0){
-			fprintf(stderr, "Modbus plugin: Error creating modbus server node %%s\n", server_nodes[index].location);
-			goto error_exit;
-		}
-		server_nodes[index].init_state = 1; // we have created the node
-		
-		/* launch a thread to handle this server node */
-		{
-			int res = 0;
-			pthread_attr_t attr;
-			res |= pthread_attr_init(&attr);
-			res |= pthread_create(&(server_nodes[index].thread_id), &attr, &__mb_server_thread, (void *)&(server_nodes[index]));
-			if (res !=  0) {
-				fprintf(stderr, "Modbus plugin: Error starting modbus server thread for node %%s\n", server_nodes[index].location);
-				goto error_exit;
-			}
-		}
-		server_nodes[index].init_state = 2; // we have created the node and thread
-	}
-
-	return 0;
-	
-error_exit:
-	__cleanup_%(locstr)s ();
-	return -1;
-}
-
-
-
-
-
-void __publish_%(locstr)s (){
-	int index;
-
-	for (index=0; index < NUMBER_OF_CLIENT_REQTS; index ++){
-		/*just do the output requests */
-		if (client_requests[index].req_type == req_output){
-			pthread_mutex_lock(&(client_requests[index].coms_buf_mutex));
-			// copy from plcv_buffer to coms_buffer
-			memcpy((void *)client_requests[index].coms_buffer /* destination */,
-			       (void *)client_requests[index].plcv_buffer /* source */,
-			       REQ_BUF_SIZE * sizeof(u16) /* size in bytes */);
-			pthread_mutex_unlock(&(client_requests[index].coms_buf_mutex));
-		}
-	}
-}
-
-
-
-
-
-void __retrieve_%(locstr)s (){
-	int index;
-
-	for (index=0; index < NUMBER_OF_CLIENT_REQTS; index ++){
-		/*just do the input requests */
-		if (client_requests[index].req_type == req_input){
-			pthread_mutex_lock(&(client_requests[index].coms_buf_mutex));
-			// copy from coms_buffer to plcv_buffer
-			memcpy((void *)client_requests[index].plcv_buffer /* destination */,
-			       (void *)client_requests[index].coms_buffer /* source */,
-			       REQ_BUF_SIZE * sizeof(u16) /* size in bytes */);
-			pthread_mutex_unlock(&(client_requests[index].coms_buf_mutex));
-		}
-	}
-}
-
-
-
-
-
-int __cleanup_%(locstr)s (){
-	int index, close;
-	int res = 0;
-
-	/* kill thread and close connections of each modbus client node */
-	for (index=0; index < NUMBER_OF_CLIENT_NODES; index++) {
-		close = 0;
-		if (client_nodes[index].init_state >= 2) {
-			// thread was launched, so we try to cancel it!
-			close  = pthread_cancel(client_nodes[index].thread_id);
-			close |= pthread_join  (client_nodes[index].thread_id, NULL);
-			if (close < 0)
-				fprintf(stderr, "Modbus plugin: Error closing thread for modbus client %%s\n", client_nodes[index].location);
-		}
-		res |= close;
-
-		close = 0;
-		if (client_nodes[index].init_state >= 1) {
-			// modbus client node was created, so we try to close it!
-			close = mb_master_close (client_nodes[index].mb_nd);
-			if (close < 0){
-				fprintf(stderr, "Modbus plugin: Error closing modbus client node %%s\n", client_nodes[index].location);
-				// We try to shut down as much as possible, so we do not return noW!
-			}
-			client_nodes[index].mb_nd = -1;
-		}
-		res |= close;
-		client_nodes[index].init_state = 0;
-	}
-	
-	/* kill thread and close connections of each modbus server node */
-	for (index=0; index < NUMBER_OF_SERVER_NODES; index++) {
-		close = 0;
-		if (server_nodes[index].init_state >= 2) {
-			// thread was launched, so we try to cancel it!
-			close  = pthread_cancel(server_nodes[index].thread_id);
-			close |= pthread_join  (server_nodes[index].thread_id, NULL);
-			if (close < 0)
-				fprintf(stderr, "Modbus plugin: Error closing thread for modbus server %%s\n", server_nodes[index].location);
-		}
-		res |= close;
-
-		close = 0;
-		if (server_nodes[index].init_state >= 1) {
-			// modbus server node was created, so we try to close it!
-			close = mb_slave_close (server_nodes[index].mb_nd);
-			if (close < 0) {
-				fprintf(stderr, "Modbus plugin: Error closing node for modbus server %%s (%%d)\n", server_nodes[index].location, server_nodes[index].mb_nd);
-				// We try to shut down as much as possible, so we do not return noW!
-			}
-			server_nodes[index].mb_nd = -1;
-		}
-		res |= close;
-		server_nodes[index].init_state = 0;
-	}
-
-	/* destroy the mutex of each client request */
-	for (index=0; index < NUMBER_OF_CLIENT_REQTS; index ++) {
-		if (pthread_mutex_destroy(&(client_requests[index].coms_buf_mutex))) {
-			fprintf(stderr, "Modbus plugin: Error destroying request for modbus client node %%s\n", client_nodes[client_requests[index].client_node_id].location);
-			// We try to shut down as much as possible, so we do not return noW!
-			res |= -1;
-		}
-	}
-
-	/* modbus library close */
-	//fprintf(stderr, "Shutting down modbus library...\n");
-	if (mb_slave_and_master_done()<0) {
-		fprintf(stderr, "Modbus plugin: Error shutting down modbus library\n");
-		res |= -1;
-	}
-
-	return res;
-}
-
+/* File generated by Beremiz (PlugGenerate_C method of Modbus plugin) */
+
+/*
+ * Copyright (c) 2016 Mario de Sousa (msousa@fe.up.pt)
+ *
+ * This file is part of the Modbus library for Beremiz and matiec.
+ *
+ * This Modbus library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this Modbus library.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * This code is made available on the understanding that it will not be
+ * used in safety-critical situations without a full and competent review.
+ */
+
+
+#include <stdio.h>
+#include <string.h>  /* required for memcpy() */
+#include "mb_slave_and_master.h"
+#include "MB_%(locstr)s.h"
+
+
+#define MAX_MODBUS_ERROR_CODE 11
+static const char *modbus_error_messages[MAX_MODBUS_ERROR_CODE+1] = {
+    /* 0 */ "",                             /* un-used -> no error! */
+    /* 1 */ "illegal/unsuported function",
+    /* 2 */ "illegal data address",
+    /* 3 */ "illegal data value",
+    /* 4 */ "slave device failure",
+    /* 5 */ "acknowledge -> slave intends to reply later",
+    /* 6 */ "slave device busy",
+    /* 7 */ "negative acknowledge",
+    /* 8 */ "memory parity error",
+    /* 9 */ "",                             /* undefined by Modbus */
+    /* 10*/ "gateway path unavalilable",
+    /* 11*/ "gateway target device failed to respond"
+};    
+
+
+/* Execute a modbus client transaction/request */
+static int __execute_mb_request(int request_id){
+	switch (client_requests[request_id].mb_function){
+	
+	case  1: /* read coils */
+		return read_output_bits(client_requests[request_id].slave_id,
+					client_requests[request_id].address,
+					client_requests[request_id].count,
+					client_requests[request_id].coms_buffer,
+					(int) client_requests[request_id].count,
+					client_nodes[client_requests[request_id].client_node_id].mb_nd,
+					client_requests[request_id].retries,
+					&(client_requests[request_id].error_code),
+					&(client_requests[request_id].resp_timeout),
+					&(client_requests[request_id].coms_buf_mutex));
+
+	case  2: /* read discrete inputs */
+		return read_input_bits( client_requests[request_id].slave_id,
+					client_requests[request_id].address,
+					client_requests[request_id].count,
+					client_requests[request_id].coms_buffer,
+					(int) client_requests[request_id].count,
+					client_nodes[client_requests[request_id].client_node_id].mb_nd,
+					client_requests[request_id].retries,
+					&(client_requests[request_id].error_code),
+					&(client_requests[request_id].resp_timeout),
+					&(client_requests[request_id].coms_buf_mutex));
+
+	case  3: /* read holding registers */
+		return read_output_words(client_requests[request_id].slave_id,
+					client_requests[request_id].address,
+					client_requests[request_id].count,
+					client_requests[request_id].coms_buffer,
+					(int) client_requests[request_id].count,
+					client_nodes[client_requests[request_id].client_node_id].mb_nd,
+					client_requests[request_id].retries,
+					&(client_requests[request_id].error_code),
+					&(client_requests[request_id].resp_timeout),
+					&(client_requests[request_id].coms_buf_mutex));
+	
+	case  4: /* read input registers */
+		return read_input_words(client_requests[request_id].slave_id,
+					client_requests[request_id].address,
+					client_requests[request_id].count,
+					client_requests[request_id].coms_buffer,
+					(int) client_requests[request_id].count,
+					client_nodes[client_requests[request_id].client_node_id].mb_nd,
+					client_requests[request_id].retries,
+					&(client_requests[request_id].error_code),
+					&(client_requests[request_id].resp_timeout),
+					&(client_requests[request_id].coms_buf_mutex));
+
+	case  5: /* write single coil */
+		return write_output_bit(client_requests[request_id].slave_id,
+					client_requests[request_id].address,
+					client_requests[request_id].coms_buffer[0],
+					client_nodes[client_requests[request_id].client_node_id].mb_nd,
+					client_requests[request_id].retries,
+					&(client_requests[request_id].error_code),
+					&(client_requests[request_id].resp_timeout),
+					&(client_requests[request_id].coms_buf_mutex));
+
+	case  6: /* write single register */
+		return write_output_word(client_requests[request_id].slave_id,
+					client_requests[request_id].address,
+					client_requests[request_id].coms_buffer[0],
+					client_nodes[client_requests[request_id].client_node_id].mb_nd,
+					client_requests[request_id].retries,
+					&(client_requests[request_id].error_code),
+					&(client_requests[request_id].resp_timeout),
+					&(client_requests[request_id].coms_buf_mutex));
+
+	case  7: break; /* function not yet supported */
+	case  8: break; /* function not yet supported */
+	case  9: break; /* function not yet supported */
+	case 10: break; /* function not yet supported */
+	case 11: break; /* function not yet supported */
+	case 12: break; /* function not yet supported */
+	case 13: break; /* function not yet supported */
+	case 14: break; /* function not yet supported */
+	
+	case 15: /* write multiple coils */
+		return write_output_bits(client_requests[request_id].slave_id,
+					 client_requests[request_id].address,
+					 client_requests[request_id].count,
+					 client_requests[request_id].coms_buffer,
+					 client_nodes[client_requests[request_id].client_node_id].mb_nd,
+					 client_requests[request_id].retries,
+					 &(client_requests[request_id].error_code),
+					 &(client_requests[request_id].resp_timeout),
+					 &(client_requests[request_id].coms_buf_mutex));
+
+	case 16: /* write multiple registers */
+		return write_output_words(client_requests[request_id].slave_id,
+					client_requests[request_id].address,
+					client_requests[request_id].count,
+					client_requests[request_id].coms_buffer,
+					client_nodes[client_requests[request_id].client_node_id].mb_nd,
+					client_requests[request_id].retries,
+					&(client_requests[request_id].error_code),
+					&(client_requests[request_id].resp_timeout),
+					&(client_requests[request_id].coms_buf_mutex));
+	
+	default: break;  /* should never occur, if file generation is correct */
+	}
+
+	fprintf(stderr, "Modbus plugin: Modbus function %%d not supported\n", request_id); /* should never occur, if file generation is correct */
+	return -1;
+}
+
+
+
+/* pack bits from unpacked_data to packed_data */
+static inline int __pack_bits(u16 *unpacked_data, u16 start_addr, u16 bit_count,  u8  *packed_data) {
+  u8 bit;
+  u16 byte, coils_processed;
+
+  if ((0 == bit_count) || (65535-start_addr < bit_count-1))
+    return -ERR_ILLEGAL_DATA_ADDRESS; /* ERR_ILLEGAL_DATA_ADDRESS defined in mb_util.h */
+  
+  for( byte = 0, coils_processed = 0; coils_processed < bit_count; byte++) {
+    packed_data[byte] = 0;
+    for( bit = 0x01; (bit & 0xFF) && (coils_processed < bit_count); bit <<= 1, coils_processed++ ) {
+      if(unpacked_data[start_addr + coils_processed])
+            packed_data[byte] |=  bit; /*   set bit */
+      else  packed_data[byte] &= ~bit; /* reset bit */
+    }
+  }
+  return 0;
+}
+
+
+/* unpack bits from packed_data to unpacked_data */
+static inline int __unpack_bits(u16 *unpacked_data, u16 start_addr, u16 bit_count,  u8  *packed_data) {
+  u8  temp, bit;
+  u16 byte, coils_processed;
+
+  if ((0 == bit_count) || (65535-start_addr < bit_count-1))
+    return -ERR_ILLEGAL_DATA_ADDRESS; /* ERR_ILLEGAL_DATA_ADDRESS defined in mb_util.h */
+  
+  for(byte = 0, coils_processed = 0; coils_processed < bit_count; byte++) {
+    temp = packed_data[byte] ;
+    for(bit = 0x01; (bit & 0xff) && (coils_processed < bit_count); bit <<= 1, coils_processed++) {
+      unpacked_data[start_addr + coils_processed] = (temp & bit)?1:0;
+    }
+  }
+  return 0;
+}
+
+
+static int __read_inbits   (void *mem_map, u16 start_addr, u16 bit_count, u8  *data_bytes)
+  {return   __pack_bits(((server_mem_t *)mem_map)->ro_bits, start_addr, bit_count, data_bytes);}
+static int __read_outbits  (void *mem_map, u16 start_addr, u16 bit_count, u8  *data_bytes)
+  {return   __pack_bits(((server_mem_t *)mem_map)->rw_bits, start_addr, bit_count, data_bytes);}
+static int __write_outbits (void *mem_map, u16 start_addr, u16 bit_count, u8  *data_bytes)
+  {return __unpack_bits(((server_mem_t *)mem_map)->rw_bits, start_addr, bit_count, data_bytes); }
+
+
+
+static int __read_inwords  (void *mem_map, u16 start_addr, u16 word_count, u16 *data_words) {
+
+  if ((start_addr + word_count) > MEM_AREA_SIZE)
+    return -ERR_ILLEGAL_DATA_ADDRESS; /* ERR_ILLEGAL_DATA_ADDRESS defined in mb_util.h */
+
+  /* use memcpy() because loop with pointers (u16 *) caused alignment problems */
+  memcpy(/* dest */ (void *)data_words,
+         /* src  */ (void *)&(((server_mem_t *)mem_map)->ro_words[start_addr]),
+         /* size */ word_count * 2);
+  return 0;
+}
+
+
+
+static int __read_outwords (void *mem_map, u16 start_addr, u16 word_count, u16 *data_words) {
+
+  if ((start_addr + word_count) > MEM_AREA_SIZE)
+    return -ERR_ILLEGAL_DATA_ADDRESS; /* ERR_ILLEGAL_DATA_ADDRESS defined in mb_util.h */
+
+  /* use memcpy() because loop with pointers (u16 *) caused alignment problems */
+  memcpy(/* dest */ (void *)data_words,
+         /* src  */ (void *)&(((server_mem_t *)mem_map)->rw_words[start_addr]),
+         /* size */ word_count * 2);
+  return 0;
+}
+
+
+
+
+static int __write_outwords(void *mem_map, u16 start_addr, u16 word_count, u16 *data_words) {
+
+  if ((start_addr + word_count) > MEM_AREA_SIZE)
+    return -ERR_ILLEGAL_DATA_ADDRESS; /* ERR_ILLEGAL_DATA_ADDRESS defined in mb_util.h */
+
+  /* WARNING: The data returned in the data_words[] array is not guaranteed to be 16 bit aligned.
+   *           It is not therefore safe to cast it to an u16 data type.
+   *           The following code cannot be used. memcpy() is used instead.
+   */
+  /*
+  for (count = 0; count < word_count ; count++)
+    ((server_mem_t *)mem_map)->rw_words[count + start_addr] = data_words[count];
+  */
+  memcpy(/* dest */ (void *)&(((server_mem_t *)mem_map)->rw_words[start_addr]),
+         /* src  */ (void *)data_words,
+         /* size */ word_count * 2);
+  return 0;
+}
+
+
+
+
+#include <pthread.h>
+
+static void *__mb_server_thread(void *_server_node)  {
+	server_node_t *server_node = _server_node;
+	mb_slave_callback_t callbacks = { 
+			&__read_inbits,
+			&__read_outbits,
+			&__write_outbits,
+			&__read_inwords,
+			&__read_outwords,
+			&__write_outwords,
+			(void *)&(server_node->mem_area)
+			};  
+	
+	// Enable thread cancelation. Enabled is default, but set it anyway to be safe.
+	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+
+	// mb_slave_run() should never return!
+	mb_slave_run(server_node->mb_nd /* nd */, callbacks, server_node->slave_id);
+	fprintf(stderr, "Modbus plugin: Modbus server for node %%s died unexpectedly!\n", server_node->location); /* should never occur */
+	return NULL;
+}
+
+
+#define timespec_add(ts, sec, nsec) {		\
+	ts.tv_sec  +=  sec;			\
+	ts.tv_nsec += nsec;			\
+	if (ts.tv_nsec >= 1000000000) {		\
+		ts.tv_sec  ++;			\
+		ts.tv_nsec -= 1000000000;	\
+	}					\
+}
+
+
+static void *__mb_client_thread(void *_index)  {
+	int client_node_id = (char *)_index - (char *)NULL; // Use pointer arithmetic (more portable than cast)
+	struct timespec next_cycle;
+	int period_sec  =  client_nodes[client_node_id].comm_period / 1000;          /* comm_period is in ms */
+	int period_nsec = (client_nodes[client_node_id].comm_period %%1000)*1000000; /* comm_period is in ms */
+
+	// Enable thread cancelation. Enabled is default, but set it anyway to be safe.
+	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
+	
+	// get the current time
+	clock_gettime(CLOCK_MONOTONIC, &next_cycle);
+
+	// loop the communication with the client
+	while (1) {
+		/*
+		struct timespec cur_time;
+		clock_gettime(CLOCK_MONOTONIC, &cur_time);
+		fprintf(stderr, "Modbus client thread - new cycle (%%ld:%%ld)!\n", cur_time.tv_sec, cur_time.tv_nsec);
+		*/
+		int req;
+		for (req=0; req < NUMBER_OF_CLIENT_REQTS; req ++){
+			/*just do the requests belonging to the client */
+			if (client_requests[req].client_node_id != client_node_id)
+				continue;
+			int res_tmp = __execute_mb_request(req);
+			switch (res_tmp) {
+			  case PORT_FAILURE: {
+				if (res_tmp != client_nodes[client_node_id].prev_error)
+					fprintf(stderr, "Modbus plugin: Error connecting Modbus client %%s to remote server.\n", client_nodes[client_node_id].location);
+				client_nodes[client_node_id].prev_error = res_tmp;
+				break;
+			  }
+			  case INVALID_FRAME: {
+				if ((res_tmp != client_requests[req].prev_error) && (0 == client_nodes[client_node_id].prev_error))
+					fprintf(stderr, "Modbus plugin: Modbus client request configured at location %%s was unsuccesful. Server/slave returned an invalid/corrupted frame.\n", client_requests[req].location);
+				client_requests[req].prev_error = res_tmp;
+				break;
+			  }
+			  case TIMEOUT: {
+				if ((res_tmp != client_requests[req].prev_error) && (0 == client_nodes[client_node_id].prev_error))
+					fprintf(stderr, "Modbus plugin: Modbus client request configured at location %%s timed out waiting for reply from server.\n", client_requests[req].location);
+				client_requests[req].prev_error = res_tmp;
+				break;
+			  }
+			  case MODBUS_ERROR: {
+				if (client_requests[req].prev_error != client_requests[req].error_code) {
+					fprintf(stderr, "Modbus plugin: Modbus client request configured at location %%s was unsuccesful. Server/slave returned error code 0x%%2x", client_requests[req].location, client_requests[req].error_code);
+					if (client_requests[req].error_code <= MAX_MODBUS_ERROR_CODE ) {
+						fprintf(stderr, "(%%s)", modbus_error_messages[client_requests[req].error_code]);
+						fprintf(stderr, ".\n");
+					}
+				}
+				client_requests[req].prev_error = client_requests[req].error_code;
+				break;
+			  }
+			  default: {
+				if ((res_tmp >= 0) && (client_nodes[client_node_id].prev_error != 0)) {
+					fprintf(stderr, "Modbus plugin: Modbus client %%s has reconnected to server/slave.\n", client_nodes[client_node_id].location);
+				}
+				if ((res_tmp >= 0) && (client_requests[req]        .prev_error != 0)) {
+					fprintf(stderr, "Modbus plugin: Modbus client request configured at location %%s has succesfully resumed comunication.\n", client_requests[req].location);
+				}
+				client_nodes[client_node_id].prev_error = 0;
+				client_requests[req]        .prev_error = 0;
+				break;
+			  }
+			}
+		}
+		// Determine absolute time instant for starting the next cycle
+		struct timespec prev_cycle, now;
+		prev_cycle = next_cycle;
+		timespec_add(next_cycle, period_sec, period_nsec);
+		/* NOTE A:
+		 * When we have difficulty communicating with remote client and/or server, then the communications get delayed and we will
+		 * fall behind in the period. This means that when communication is re-established we may end up running this loop continuously
+		 * for some time until we catch up.
+		 * This is undesirable, so we detect it by making sure the next_cycle will start in the future.
+		 * When this happens we will switch from a purely periodic task _activation_ sequence, to a fixed task suspension interval.
+		 * 
+		 * NOTE B:
+		 * It probably does not make sense to check for overflow of timer.
+		 * Even in 32 bit systems this will take at least 68 years since the computer booted
+		 * (remember, we are using CLOCK_MONOTONIC, which should start counting from 0
+		 * every time the system boots). On 64 bit systems, it will take over 
+		 * 10^11 years to overflow.
+		 */
+		clock_gettime(CLOCK_MONOTONIC, &now);
+		if (  ((now.tv_sec > next_cycle.tv_sec) || ((now.tv_sec == next_cycle.tv_sec) && (now.tv_nsec > next_cycle.tv_nsec)))
+		   /* We are falling behind. See NOTE A above */
+		   || (next_cycle.tv_sec < prev_cycle.tv_sec)
+		   /* Timer overflow. See NOTE B above */
+		   ) {
+			next_cycle = now;
+			timespec_add(next_cycle, period_sec, period_nsec);
+		}
+		clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &next_cycle, NULL);
+	}
+
+	// humour the compiler.
+	return NULL;
+}
+
+
+int __cleanup_%(locstr)s ();
+int __init_%(locstr)s (int argc, char **argv){
+	int index;
+
+	for (index=0; index < NUMBER_OF_CLIENT_NODES;index++)
+		client_nodes[index].mb_nd = -1;
+	for (index=0; index < NUMBER_OF_SERVER_NODES;index++)
+		// mb_nd with negative numbers indicate how far it has been initialised (or not)
+		//   -2  --> no modbus node created;  no thread  created
+		//   -1  -->    modbus node created!; no thread  created
+		//  >=0  -->    modbus node created!;    thread  created!
+		server_nodes[index].mb_nd = -2; 
+
+	/* modbus library init */
+	/* Note that TOTAL_xxxNODE_COUNT are the nodes required by _ALL_ the instances of the modbus
+	 *  extension currently in the user's project. This file (MB_xx.c) is handling only one instance,
+	 *  but must initialize the library for all instances. Only the first call to mb_slave_and_master_init()
+	 *  will result in memory being allocated. All subsequent calls (by other MB_xx,c files) will be ignored
+	 *  by the mb_slave_and_master_init() funtion, as long as they are called with the same arguments.
+	 */
+	if (mb_slave_and_master_init(TOTAL_TCPNODE_COUNT, TOTAL_RTUNODE_COUNT, TOTAL_ASCNODE_COUNT) <0) {
+		fprintf(stderr, "Modbus plugin: Error starting modbus library\n");
+		// return imediately. Do NOT goto error_exit, as we did not get to
+		//  start the modbus library!
+		return -1;
+	}
+	
+	/* init the mutex for each client request */
+	/* Must be done _before_ launching the client threads!! */
+	for (index=0; index < NUMBER_OF_CLIENT_REQTS; index ++){
+		if (pthread_mutex_init(&(client_requests[index].coms_buf_mutex), NULL)) {
+			fprintf(stderr, "Modbus plugin: Error initializing request for modbus client node %%s\n", client_nodes[client_requests[index].client_node_id].location);
+			goto error_exit;
+		}
+	}
+
+	/* init each client connection to remote modbus server, and launch thread */
+	/* NOTE: All client_nodes[].init_state are initialised to 0 in the code 
+	 *       generated by the modbus plugin 
+	 */
+	for (index=0; index < NUMBER_OF_CLIENT_NODES;index++){
+		/* establish client connection */
+		client_nodes[index].mb_nd = mb_master_connect (client_nodes[index].node_address);
+		if (client_nodes[index].mb_nd < 0){
+			fprintf(stderr, "Modbus plugin: Error creating modbus client node %%s\n", client_nodes[index].location);
+			goto error_exit;
+		}
+		client_nodes[index].init_state = 1; // we have created the node 
+		
+		/* launch a thread to handle this client node */
+		{
+			int res = 0;
+			pthread_attr_t attr;
+			res |= pthread_attr_init(&attr);
+			res |= pthread_create(&(client_nodes[index].thread_id), &attr, &__mb_client_thread, (void *)((char *)NULL + index));
+			if (res !=  0) {
+				fprintf(stderr, "Modbus plugin: Error starting modbus client thread for node %%s\n", client_nodes[index].location);
+				goto error_exit;
+			}
+		}
+		client_nodes[index].init_state = 2; // we have created the node and a thread
+	}
+
+	/* init each local server */
+	/* NOTE: All server_nodes[].init_state are initialised to 0 in the code 
+	 *       generated by the modbus plugin 
+	 */
+	for (index=0; index < NUMBER_OF_SERVER_NODES;index++){
+		/* create the modbus server */
+		server_nodes[index].mb_nd = mb_slave_new (server_nodes[index].node_address);
+		if (server_nodes[index].mb_nd < 0){
+			fprintf(stderr, "Modbus plugin: Error creating modbus server node %%s\n", server_nodes[index].location);
+			goto error_exit;
+		}
+		server_nodes[index].init_state = 1; // we have created the node
+		
+		/* launch a thread to handle this server node */
+		{
+			int res = 0;
+			pthread_attr_t attr;
+			res |= pthread_attr_init(&attr);
+			res |= pthread_create(&(server_nodes[index].thread_id), &attr, &__mb_server_thread, (void *)&(server_nodes[index]));
+			if (res !=  0) {
+				fprintf(stderr, "Modbus plugin: Error starting modbus server thread for node %%s\n", server_nodes[index].location);
+				goto error_exit;
+			}
+		}
+		server_nodes[index].init_state = 2; // we have created the node and thread
+	}
+
+	return 0;
+	
+error_exit:
+	__cleanup_%(locstr)s ();
+	return -1;
+}
+
+
+
+
+
+void __publish_%(locstr)s (){
+	int index;
+
+	for (index=0; index < NUMBER_OF_CLIENT_REQTS; index ++){
+		/*just do the output requests */
+		if (client_requests[index].req_type == req_output){
+			if(pthread_mutex_trylock(&(client_requests[index].coms_buf_mutex)) == 0){
+                // copy from plcv_buffer to coms_buffer
+                memcpy((void *)client_requests[index].coms_buffer /* destination */,
+                       (void *)client_requests[index].plcv_buffer /* source */,
+                       REQ_BUF_SIZE * sizeof(u16) /* size in bytes */);
+                pthread_mutex_unlock(&(client_requests[index].coms_buf_mutex));
+            }
+		}
+	}
+}
+
+
+
+
+
+void __retrieve_%(locstr)s (){
+	int index;
+
+	for (index=0; index < NUMBER_OF_CLIENT_REQTS; index ++){
+		/*just do the input requests */
+		if (client_requests[index].req_type == req_input){
+			if(pthread_mutex_trylock(&(client_requests[index].coms_buf_mutex)) == 0){
+                // copy from coms_buffer to plcv_buffer
+                memcpy((void *)client_requests[index].plcv_buffer /* destination */,
+                       (void *)client_requests[index].coms_buffer /* source */,
+                       REQ_BUF_SIZE * sizeof(u16) /* size in bytes */);
+                pthread_mutex_unlock(&(client_requests[index].coms_buf_mutex));
+            }
+		}
+	}
+}
+
+
+
+
+
+int __cleanup_%(locstr)s (){
+	int index, close;
+	int res = 0;
+
+	/* kill thread and close connections of each modbus client node */
+	for (index=0; index < NUMBER_OF_CLIENT_NODES; index++) {
+		close = 0;
+		if (client_nodes[index].init_state >= 2) {
+			// thread was launched, so we try to cancel it!
+			close  = pthread_cancel(client_nodes[index].thread_id);
+			close |= pthread_join  (client_nodes[index].thread_id, NULL);
+			if (close < 0)
+				fprintf(stderr, "Modbus plugin: Error closing thread for modbus client %%s\n", client_nodes[index].location);
+		}
+		res |= close;
+
+		close = 0;
+		if (client_nodes[index].init_state >= 1) {
+			// modbus client node was created, so we try to close it!
+			close = mb_master_close (client_nodes[index].mb_nd);
+			if (close < 0){
+				fprintf(stderr, "Modbus plugin: Error closing modbus client node %%s\n", client_nodes[index].location);
+				// We try to shut down as much as possible, so we do not return noW!
+			}
+			client_nodes[index].mb_nd = -1;
+		}
+		res |= close;
+		client_nodes[index].init_state = 0;
+	}
+	
+	/* kill thread and close connections of each modbus server node */
+	for (index=0; index < NUMBER_OF_SERVER_NODES; index++) {
+		close = 0;
+		if (server_nodes[index].init_state >= 2) {
+			// thread was launched, so we try to cancel it!
+			close  = pthread_cancel(server_nodes[index].thread_id);
+			close |= pthread_join  (server_nodes[index].thread_id, NULL);
+			if (close < 0)
+				fprintf(stderr, "Modbus plugin: Error closing thread for modbus server %%s\n", server_nodes[index].location);
+		}
+		res |= close;
+
+		close = 0;
+		if (server_nodes[index].init_state >= 1) {
+			// modbus server node was created, so we try to close it!
+			close = mb_slave_close (server_nodes[index].mb_nd);
+			if (close < 0) {
+				fprintf(stderr, "Modbus plugin: Error closing node for modbus server %%s (%%d)\n", server_nodes[index].location, server_nodes[index].mb_nd);
+				// We try to shut down as much as possible, so we do not return noW!
+			}
+			server_nodes[index].mb_nd = -1;
+		}
+		res |= close;
+		server_nodes[index].init_state = 0;
+	}
+
+	/* destroy the mutex of each client request */
+	for (index=0; index < NUMBER_OF_CLIENT_REQTS; index ++) {
+		if (pthread_mutex_destroy(&(client_requests[index].coms_buf_mutex))) {
+			fprintf(stderr, "Modbus plugin: Error destroying request for modbus client node %%s\n", client_nodes[client_requests[index].client_node_id].location);
+			// We try to shut down as much as possible, so we do not return noW!
+			res |= -1;
+		}
+	}
+
+	/* modbus library close */
+	//fprintf(stderr, "Shutting down modbus library...\n");
+	if (mb_slave_and_master_done()<0) {
+		fprintf(stderr, "Modbus plugin: Error shutting down modbus library\n");
+		res |= -1;
+	}
+
+	return res;
+}
+
--- a/modbus/mb_runtime.h	Sat Jun 02 11:56:01 2018 +0100
+++ b/modbus/mb_runtime.h	Mon Jan 07 13:50:39 2019 +0100
@@ -1,148 +1,148 @@
-/* File generated by Beremiz (PlugGenerate_C method of modbus Plugin instance) */
-
-/*
- * Copyright (c) 2016 Mario de Sousa (msousa@fe.up.pt)
- *
- * This file is part of the Modbus library for Beremiz and matiec.
- *
- * This Modbus library is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 
- * General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this Modbus library.  If not, see <http://www.gnu.org/licenses/>.
- *
- * This code is made available on the understanding that it will not be
- * used in safety-critical situations without a full and competent review.
- */
-
-#include "mb_addr.h"
-#include "mb_tcp_private.h"
-#include "mb_master_private.h"
-
-
-
-#define DEF_REQ_SEND_RETRIES 0
-
-  // Used by the Modbus server node
-#define MEM_AREA_SIZE 65536
-typedef struct{
-	    u16		ro_bits [MEM_AREA_SIZE];
-	    u16		rw_bits [MEM_AREA_SIZE];
-	    u16		ro_words[MEM_AREA_SIZE];
-	    u16		rw_words[MEM_AREA_SIZE];
-	} server_mem_t;
-
-typedef struct{
-	    const char *location;
-	    u8		slave_id;
-	    node_addr_t	node_address;
-	    int		mb_nd;      // modbus library node used for this server 
-	    int		init_state; // store how far along the server's initialization has progressed
-	    pthread_t	thread_id;  // thread handling this server
-	    server_mem_t	mem_area;
-	} server_node_t;
-
-
-  // Used by the Modbus client node
-typedef struct{
-	    const char *location;
-	    node_addr_t	node_address;
-	    int		mb_nd;
-	    int		init_state; // store how far along the client's initialization has progressed
-	    u64		comm_period;
-	    int		prev_error; // error code of the last printed error message (0 when no error) 
-	    pthread_t	thread_id;  // thread handling all communication with this client
-	} client_node_t;
-
-
-  // Used by the Modbus client plugin
-typedef enum {
-	    req_input,
-	    req_output,
-	    no_request		/* just for tests to quickly disable a request */
-	} iotype_t;
-
-#define REQ_BUF_SIZE 2000
-typedef struct{
-	    const char *location;
-	    int		client_node_id;
-	    u8		slave_id;
-	    iotype_t	req_type;
-	    u8		mb_function;
-	    u16		address;
-	    u16		count;
-	    int		retries;
-	    u8		error_code; // modbus error code (if any) of current request
-	    int		prev_error; // error code of the last printed error message (0 when no error) 
-	    struct timespec resp_timeout;
-	      // buffer used to store located PLC variables
-	    u16		plcv_buffer[REQ_BUF_SIZE];
-	      // buffer used to store data coming from / going to server
-	    u16		coms_buffer[REQ_BUF_SIZE]; 
-	    pthread_mutex_t coms_buf_mutex; // mutex to access coms_buffer[]
-	} client_request_t;
-
-
-/* The total number of nodes, needed to support _all_ instances of the modbus plugin */
-#define TOTAL_TCPNODE_COUNT       %(total_tcpnode_count)s
-#define TOTAL_RTUNODE_COUNT       %(total_rtunode_count)s
-#define TOTAL_ASCNODE_COUNT       %(total_ascnode_count)s
-
-/* Values for instance %(locstr)s of the modbus plugin */
-#define MAX_NUMBER_OF_TCPCLIENTS  %(max_remote_tcpclient)s
-
-#define NUMBER_OF_TCPSERVER_NODES %(tcpserver_node_count)s
-#define NUMBER_OF_TCPCLIENT_NODES %(tcpclient_node_count)s
-#define NUMBER_OF_TCPCLIENT_REQTS %(tcpclient_reqs_count)s
-
-#define NUMBER_OF_RTUSERVER_NODES %(rtuserver_node_count)s
-#define NUMBER_OF_RTUCLIENT_NODES %(rtuclient_node_count)s
-#define NUMBER_OF_RTUCLIENT_REQTS %(rtuclient_reqs_count)s
-
-#define NUMBER_OF_ASCIISERVER_NODES %(ascserver_node_count)s
-#define NUMBER_OF_ASCIICLIENT_NODES %(ascclient_node_count)s
-#define NUMBER_OF_ASCIICLIENT_REQTS %(ascclient_reqs_count)s
-
-#define NUMBER_OF_SERVER_NODES (NUMBER_OF_TCPSERVER_NODES + \
-                                NUMBER_OF_RTUSERVER_NODES + \
-                                NUMBER_OF_ASCIISERVER_NODES)
-
-#define NUMBER_OF_CLIENT_NODES (NUMBER_OF_TCPCLIENT_NODES + \
-                                NUMBER_OF_RTUCLIENT_NODES + \
-                                NUMBER_OF_ASCIICLIENT_NODES)
-
-#define NUMBER_OF_CLIENT_REQTS (NUMBER_OF_TCPCLIENT_REQTS + \
-                                NUMBER_OF_RTUCLIENT_REQTS + \
-                                NUMBER_OF_ASCIICLIENT_REQTS)
-
-
-/*initialization following all parameters given by user in application*/
-
-static client_node_t		client_nodes[NUMBER_OF_CLIENT_NODES] = {
-%(client_nodes_params)s
-};
-
-
-static client_request_t	client_requests[NUMBER_OF_CLIENT_REQTS] = {
-%(client_req_params)s
-};
-
-
-static server_node_t		server_nodes[NUMBER_OF_SERVER_NODES] = {
-%(server_nodes_params)s
-}
-;
-
-/*******************/
-/*located variables*/
-/*******************/
-
-%(loc_vars)s
-
+/* File generated by Beremiz (PlugGenerate_C method of modbus Plugin instance) */
+
+/*
+ * Copyright (c) 2016 Mario de Sousa (msousa@fe.up.pt)
+ *
+ * This file is part of the Modbus library for Beremiz and matiec.
+ *
+ * This Modbus library is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser 
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this Modbus library.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * This code is made available on the understanding that it will not be
+ * used in safety-critical situations without a full and competent review.
+ */
+
+#include "mb_addr.h"
+#include "mb_tcp_private.h"
+#include "mb_master_private.h"
+
+
+
+#define DEF_REQ_SEND_RETRIES 0
+
+  // Used by the Modbus server node
+#define MEM_AREA_SIZE 65536
+typedef struct{
+	    u16		ro_bits [MEM_AREA_SIZE];
+	    u16		rw_bits [MEM_AREA_SIZE];
+	    u16		ro_words[MEM_AREA_SIZE];
+	    u16		rw_words[MEM_AREA_SIZE];
+	} server_mem_t;
+
+typedef struct{
+	    const char *location;
+	    u8		slave_id;
+	    node_addr_t	node_address;
+	    int		mb_nd;      // modbus library node used for this server 
+	    int		init_state; // store how far along the server's initialization has progressed
+	    pthread_t	thread_id;  // thread handling this server
+	    server_mem_t	mem_area;
+	} server_node_t;
+
+
+  // Used by the Modbus client node
+typedef struct{
+	    const char *location;
+	    node_addr_t	node_address;
+	    int		mb_nd;
+	    int		init_state; // store how far along the client's initialization has progressed
+	    u64		comm_period;
+	    int		prev_error; // error code of the last printed error message (0 when no error) 
+	    pthread_t	thread_id;  // thread handling all communication with this client
+	} client_node_t;
+
+
+  // Used by the Modbus client plugin
+typedef enum {
+	    req_input,
+	    req_output,
+	    no_request		/* just for tests to quickly disable a request */
+	} iotype_t;
+
+#define REQ_BUF_SIZE 2000
+typedef struct{
+	    const char *location;
+	    int		client_node_id;
+	    u8		slave_id;
+	    iotype_t	req_type;
+	    u8		mb_function;
+	    u16		address;
+	    u16		count;
+	    int		retries;
+	    u8		error_code; // modbus error code (if any) of current request
+	    int		prev_error; // error code of the last printed error message (0 when no error) 
+	    struct timespec resp_timeout;
+	      // buffer used to store located PLC variables
+	    u16		plcv_buffer[REQ_BUF_SIZE];
+	      // buffer used to store data coming from / going to server
+	    u16		coms_buffer[REQ_BUF_SIZE]; 
+	    pthread_mutex_t coms_buf_mutex; // mutex to access coms_buffer[]
+	} client_request_t;
+
+
+/* The total number of nodes, needed to support _all_ instances of the modbus plugin */
+#define TOTAL_TCPNODE_COUNT       %(total_tcpnode_count)s
+#define TOTAL_RTUNODE_COUNT       %(total_rtunode_count)s
+#define TOTAL_ASCNODE_COUNT       %(total_ascnode_count)s
+
+/* Values for instance %(locstr)s of the modbus plugin */
+#define MAX_NUMBER_OF_TCPCLIENTS  %(max_remote_tcpclient)s
+
+#define NUMBER_OF_TCPSERVER_NODES %(tcpserver_node_count)s
+#define NUMBER_OF_TCPCLIENT_NODES %(tcpclient_node_count)s
+#define NUMBER_OF_TCPCLIENT_REQTS %(tcpclient_reqs_count)s
+
+#define NUMBER_OF_RTUSERVER_NODES %(rtuserver_node_count)s
+#define NUMBER_OF_RTUCLIENT_NODES %(rtuclient_node_count)s
+#define NUMBER_OF_RTUCLIENT_REQTS %(rtuclient_reqs_count)s
+
+#define NUMBER_OF_ASCIISERVER_NODES %(ascserver_node_count)s
+#define NUMBER_OF_ASCIICLIENT_NODES %(ascclient_node_count)s
+#define NUMBER_OF_ASCIICLIENT_REQTS %(ascclient_reqs_count)s
+
+#define NUMBER_OF_SERVER_NODES (NUMBER_OF_TCPSERVER_NODES + \
+                                NUMBER_OF_RTUSERVER_NODES + \
+                                NUMBER_OF_ASCIISERVER_NODES)
+
+#define NUMBER_OF_CLIENT_NODES (NUMBER_OF_TCPCLIENT_NODES + \
+                                NUMBER_OF_RTUCLIENT_NODES + \
+                                NUMBER_OF_ASCIICLIENT_NODES)
+
+#define NUMBER_OF_CLIENT_REQTS (NUMBER_OF_TCPCLIENT_REQTS + \
+                                NUMBER_OF_RTUCLIENT_REQTS + \
+                                NUMBER_OF_ASCIICLIENT_REQTS)
+
+
+/*initialization following all parameters given by user in application*/
+
+static client_node_t		client_nodes[NUMBER_OF_CLIENT_NODES] = {
+%(client_nodes_params)s
+};
+
+
+static client_request_t	client_requests[NUMBER_OF_CLIENT_REQTS] = {
+%(client_req_params)s
+};
+
+
+static server_node_t		server_nodes[NUMBER_OF_SERVER_NODES] = {
+%(server_nodes_params)s
+}
+;
+
+/*******************/
+/*located variables*/
+/*******************/
+
+%(loc_vars)s
+
--- a/modbus/mb_utils.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/modbus/mb_utils.py	Mon Jan 07 13:50:39 2019 +0100
@@ -8,7 +8,7 @@
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
+# the Free Software Foundation, either version 2 of the License, or
 # (at your option) any later version.
 #
 # This program is distributed in the hope that it will be useful,
@@ -18,26 +18,37 @@
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#    
+#
 # This code is made available on the understanding that it will not be
 # used in safety-critical situations without a full and competent review.
 
-
-
-
-#dictionary implementing:
-#key   - string with the description we want in the request plugin GUI
-#tuple - (modbus function number, request type, max count value, data_type, bit_size)
-modbus_function_dict = {"01 - Read Coils" :               ( '1', 'req_input', 2000, "BOOL", 1 , "Q", "X", "Coil"),
-                        "02 - Read Input Discretes" :     ( '2', 'req_input', 2000, "BOOL", 1 , "I", "X", "Input Discrete"),
-                        "03 - Read Holding Registers" :   ( '3', 'req_input',  125, "WORD", 16, "Q", "W", "Holding Register"),
-                        "04 - Read Input Registers" :     ( '4', 'req_input',  125, "WORD", 16, "I", "W", "Input Register"),
-                        "05 - Write Single coil" :        ( '5','req_output',    1, "BOOL", 1 , "Q", "X", "Coil"),
-                        "06 - Write Single Register" :    ( '6','req_output',    1, "WORD", 16, "Q", "W", "Holding Register"),
-                        "15 - Write Multiple Coils" :     ('15','req_output', 1968, "BOOL", 1 , "Q", "X", "Coil"),
-                        "16 - Write Multiple Registers" : ('16','req_output',  123, "WORD", 16, "Q", "W", "Holding Register"),
-                       }
-
+from __future__ import absolute_import
+from __future__ import division
+from six.moves import xrange
+
+# dictionary implementing:
+# key   - string with the description we want in the request plugin GUI
+# tuple - (modbus function number, request type, max count value,
+# data_type, bit_size)
+modbus_function_dict = {
+    "01 - Read Coils":                ('1',  'req_input', 2000, "BOOL",  1, "Q", "X", "Coil"),
+    "02 - Read Input Discretes":      ('2',  'req_input', 2000, "BOOL",  1, "I", "X", "Input Discrete"),
+    "03 - Read Holding Registers":    ('3',  'req_input',  125, "WORD", 16, "Q", "W", "Holding Register"),
+    "04 - Read Input Registers":      ('4',  'req_input',  125, "WORD", 16, "I", "W", "Input Register"),
+    "05 - Write Single coil":         ('5', 'req_output',    1, "BOOL",  1, "Q", "X", "Coil"),
+    "06 - Write Single Register":     ('6', 'req_output',    1, "WORD", 16, "Q", "W", "Holding Register"),
+    "15 - Write Multiple Coils":     ('15', 'req_output', 1968, "BOOL",  1, "Q", "X", "Coil"),
+    "16 - Write Multiple Registers": ('16', 'req_output',  123, "WORD", 16, "Q", "W", "Holding Register")}
+
+
+# Configuration tree value acces helper
+def GetCTVal(child, index):
+    return child.GetParamsAttributes()[0]["children"][index]["value"]
+
+
+# Configuration tree value acces helper, for multiple values
+def GetCTVals(child, indexes):
+    return map(lambda index: GetCTVal(child, index), indexes)
 
 
 def GetTCPServerNodePrinted(self, child):
@@ -49,26 +60,21 @@
 {"%(locnodestr)s", %(slaveid)s, {naf_tcp, {.tcp = {%(host)s, "%(port)s", DEF_CLOSE_ON_SILENCE}}}, -1 /* mb_nd */, 0 /* init_state */}'''
 
     location = ".".join(map(str, child.GetCurrentLocation()))
-    host     = child.GetParamsAttributes()[0]["children"][0]["value"]
-    port     = child.GetParamsAttributes()[0]["children"][1]["value"]
-    slaveid  = child.GetParamsAttributes()[0]["children"][2]["value"]
-    if host=="#ANY#":
-      host='INADDR_ANY'
+    host, port, slaveid = GetCTVals(child, range(3))
+    if host == "#ANY#":
+        host = 'INADDR_ANY'
     else:
-      host='"'+host+'"'
-    #slaveid = child.GetParamsAttributes()[0]["children"][2]["value"]
-    #if int(slaveid) not in xrange(256):
-        #self.GetCTRoot().logger.write_error("Error: Wrong slave ID in %s server node\nModbus Plugin C code returns empty\n"%location)
-        #return None
-
-    node_dict = {"locnodestr" : location,
-                 "host"       : host,
-                 "port"       : port,
-                 "slaveid"    : slaveid,
-                }
-    return node_init_template % node_dict
-
-
+        host = '"' + host + '"'
+    # slaveid = GetCTVal(child, 2)
+    # if int(slaveid) not in xrange(256):
+        # self.GetCTRoot().logger.write_error("Error: Wrong slave ID in %s server node\nModbus Plugin C code returns empty\n"%location)
+        # return None
+
+    node_dict = {"locnodestr": location,
+                 "host": host,
+                 "port": port,
+                 "slaveid": slaveid}
+    return node_init_template % node_dict
 
 
 def GetTCPServerMemAreaPrinted(self, child, nodeid):
@@ -84,27 +90,28 @@
 
     request_dict["locreqstr"] = "_".join(map(str, child.GetCurrentLocation()))
     request_dict["nodeid"] = str(nodeid)
-    request_dict["address"] = child.GetParamsAttributes()[0]["children"][2]["value"]
+    request_dict["address"] = GetCTVal(child, 2)
     if int(request_dict["address"]) not in xrange(65536):
-        self.GetCTRoot().logger.write_error("Modbus plugin: Invalid Start Address in server memory area node %(locreqstr)s (Must be in the range [0..65535])\nModbus plugin: Aborting C code generation for this node\n"%request_dict)
-        return None
-    request_dict["count"] = child.GetParamsAttributes()[0]["children"][1]["value"]
+        self.GetCTRoot().logger.write_error(
+            "Modbus plugin: Invalid Start Address in server memory area node %(locreqstr)s (Must be in the range [0..65535])\nModbus plugin: Aborting C code generation for this node\n" % request_dict)
+        return None
+    request_dict["count"] = GetCTVal(child, 1)
     if int(request_dict["count"]) not in xrange(1, 65536):
-        self.GetCTRoot().logger.write_error("Modbus plugin: Invalid number of channels in server memory area node %(locreqstr)s (Must be in the range [1..65536-start_address])\nModbus plugin: Aborting C code generation for this node\n"%request_dict)
-        return None
-    if (int(request_dict["address"]) + int(request_dict["count"])) not in xrange(1,65537):
-        self.GetCTRoot().logger.write_error("Modbus plugin: Invalid number of channels in server memory area node %(locreqstr)s (Must be in the range [1..65536-start_address])\nModbus plugin: Aborting C code generation for this node\n"%request_dict)
-        return None
-    
+        self.GetCTRoot().logger.write_error(
+            "Modbus plugin: Invalid number of channels in server memory area node %(locreqstr)s (Must be in the range [1..65536-start_address])\nModbus plugin: Aborting C code generation for this node\n" % request_dict)
+        return None
+    if (int(request_dict["address"]) + int(request_dict["count"])) not in xrange(1, 65537):
+        self.GetCTRoot().logger.write_error(
+            "Modbus plugin: Invalid number of channels in server memory area node %(locreqstr)s (Must be in the range [1..65536-start_address])\nModbus plugin: Aborting C code generation for this node\n" % request_dict)
+        return None
+
     return ""
 
 
-
-
-modbus_serial_baudrate_list = ["110", "300", "600", "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200"]
+modbus_serial_baudrate_list = [
+    "110", "300", "600", "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200"]
 modbus_serial_stopbits_list = ["1", "2"]
-modbus_serial_parity_dict   = {"none": 0, "odd": 1, "even": 2}
-
+modbus_serial_parity_dict = {"none": 0, "odd": 1, "even": 2}
 
 
 def GetRTUSlaveNodePrinted(self, child):
@@ -116,24 +123,16 @@
 {"%(locnodestr)s", %(slaveid)s, {naf_rtu, {.rtu = {"%(device)s", %(baud)s /*baud*/, %(parity)s /*parity*/, 8 /*data bits*/, %(stopbits)s, 0 /* ignore echo */}}}, -1 /* mb_nd */, 0 /* init_state */}'''
 
     location = ".".join(map(str, child.GetCurrentLocation()))
-    device   = child.GetParamsAttributes()[0]["children"][0]["value"]
-    baud     = child.GetParamsAttributes()[0]["children"][1]["value"]
-    parity   = child.GetParamsAttributes()[0]["children"][2]["value"]
-    stopbits = child.GetParamsAttributes()[0]["children"][3]["value"]
-    slaveid  = child.GetParamsAttributes()[0]["children"][4]["value"]
-    
-    node_dict = {"locnodestr" : location,
-                 "device"     : device,
-                 "baud"       : baud,
-                 "parity"     : modbus_serial_parity_dict[parity],
-                 "stopbits"   : stopbits,
-                 "slaveid"    : slaveid
-                }
-    return node_init_template % node_dict
-
-
-
- 
+    device, baud, parity, stopbits, slaveid = GetCTVals(child, range(5))
+
+    node_dict = {"locnodestr": location,
+                 "device": device,
+                 "baud": baud,
+                 "parity": modbus_serial_parity_dict[parity],
+                 "stopbits": stopbits,
+                 "slaveid": slaveid}
+    return node_init_template % node_dict
+
 
 def GetRTUClientNodePrinted(self, child):
     """
@@ -143,23 +142,16 @@
     node_init_template = '''/*node %(locnodestr)s*/
 {"%(locnodestr)s", {naf_rtu, {.rtu = {"%(device)s", %(baud)s /*baud*/, %(parity)s /*parity*/, 8 /*data bits*/, %(stopbits)s, 0 /* ignore echo */}}}, -1 /* mb_nd */, 0 /* init_state */, %(coms_period)s /* communication period */}'''
 
-    location    = ".".join(map(str, child.GetCurrentLocation()))
-    device      = child.GetParamsAttributes()[0]["children"][0]["value"]
-    baud        = child.GetParamsAttributes()[0]["children"][1]["value"]
-    parity      = child.GetParamsAttributes()[0]["children"][2]["value"]
-    stopbits    = child.GetParamsAttributes()[0]["children"][3]["value"]
-    coms_period = child.GetParamsAttributes()[0]["children"][4]["value"]
-    
-    node_dict = {"locnodestr"  : location,
-                 "device"      : device,
-                 "baud"        : baud,
-                 "parity"      : modbus_serial_parity_dict[parity],
-                 "stopbits"    : stopbits,
-                 "coms_period" : coms_period
-                }
-    return node_init_template % node_dict
-
-
+    location = ".".join(map(str, child.GetCurrentLocation()))
+    device, baud, parity, stopbits, coms_period = GetCTVals(child, range(5))
+
+    node_dict = {"locnodestr": location,
+                 "device": device,
+                 "baud": baud,
+                 "parity": modbus_serial_parity_dict[parity],
+                 "stopbits": stopbits,
+                 "coms_period": coms_period}
+    return node_init_template % node_dict
 
 
 def GetTCPClientNodePrinted(self, child):
@@ -171,18 +163,13 @@
 {"%(locnodestr)s", {naf_tcp, {.tcp = {"%(host)s", "%(port)s", DEF_CLOSE_ON_SILENCE}}}, -1 /* mb_nd */, 0 /* init_state */, %(coms_period)s /* communication period */, 0 /* prev_error */}'''
 
     location = ".".join(map(str, child.GetCurrentLocation()))
-    host        = child.GetParamsAttributes()[0]["children"][0]["value"]
-    port        = child.GetParamsAttributes()[0]["children"][1]["value"]
-    coms_period = child.GetParamsAttributes()[0]["children"][2]["value"]
-
-    node_dict = {"locnodestr"  : location,
-                 "host"        : host,
-                 "port"        : port,
-                 "coms_period" : coms_period
-                }
-    return node_init_template % node_dict
-
-
+    host, port, coms_period = GetCTVals(child, range(3))
+
+    node_dict = {"locnodestr": location,
+                 "host": host,
+                 "port": port,
+                 "coms_period": coms_period}
+    return node_init_template % node_dict
 
 
 def GetClientRequestPrinted(self, child, nodeid):
@@ -199,38 +186,41 @@
 {"%(locreqstr)s", %(nodeid)s, %(slaveid)s, %(iotype)s, %(func_nr)s, %(address)s , %(count)s,
 DEF_REQ_SEND_RETRIES, 0 /* error_code */, 0 /* prev_code */, {%(timeout_s)d, %(timeout_ns)d} /* timeout */,
 {%(buffer)s}, {%(buffer)s}}'''
-    
-    timeout      = int(child.GetParamsAttributes()[0]["children"][4]["value"])
-    timeout_s    = int(timeout / 1000)
-    timeout_ms   = timeout - (timeout_s * 1000)
-    timeout_ns   = timeout_ms * 1000000
-    
-    request_dict = {}
-
-    request_dict["locreqstr" ] = "_".join(map(str, child.GetCurrentLocation()))
-    request_dict["nodeid"    ] = str(nodeid)
-    request_dict["slaveid"   ] =                      child.GetParamsAttributes()[0]["children"][1]["value"]
-    request_dict["address"   ] =                      child.GetParamsAttributes()[0]["children"][3]["value"]
-    request_dict["count"     ] =                      child.GetParamsAttributes()[0]["children"][2]["value"]
-    request_dict["timeout"   ] = timeout
-    request_dict["timeout_s" ] = timeout_s
-    request_dict["timeout_ns"] = timeout_ns
-    request_dict["buffer"    ] = ",".join(['0'] * int(child.GetParamsAttributes()[0]["children"][2]["value"]))
-    request_dict["func_nr"   ] = modbus_function_dict[child.GetParamsAttributes()[0]["children"][0]["value"]][0]
-    request_dict["iotype"    ] = modbus_function_dict[child.GetParamsAttributes()[0]["children"][0]["value"]][1]
-    request_dict["maxcount"  ] = modbus_function_dict[child.GetParamsAttributes()[0]["children"][0]["value"]][2]
-    
+
+    timeout = int(GetCTVal(child, 4))
+    timeout_s = timeout // 1000
+    timeout_ms = timeout - (timeout_s * 1000)
+    timeout_ns = timeout_ms * 1000000
+
+    request_dict = {
+        "locreqstr": "_".join(map(str, child.GetCurrentLocation())),
+        "nodeid": str(nodeid),
+        "slaveid": GetCTVal(child, 1),
+        "address": GetCTVal(child, 3),
+        "count": GetCTVal(child, 2),
+        "timeout": timeout,
+        "timeout_s": timeout_s,
+        "timeout_ns": timeout_ns,
+        "buffer": ",".join(['0'] * int(GetCTVal(child, 2))),
+        "func_nr": modbus_function_dict[GetCTVal(child, 0)][0],
+        "iotype": modbus_function_dict[GetCTVal(child, 0)][1],
+        "maxcount": modbus_function_dict[GetCTVal(child, 0)][2]}
+
     if int(request_dict["slaveid"]) not in xrange(256):
-        self.GetCTRoot().logger.write_error("Modbus plugin: Invalid slaveID in TCP client request node %(locreqstr)s (Must be in the range [0..255])\nModbus plugin: Aborting C code generation for this node\n"%request_dict)
+        self.GetCTRoot().logger.write_error(
+            "Modbus plugin: Invalid slaveID in TCP client request node %(locreqstr)s (Must be in the range [0..255])\nModbus plugin: Aborting C code generation for this node\n" % request_dict)
         return None
     if int(request_dict["address"]) not in xrange(65536):
-        self.GetCTRoot().logger.write_error("Modbus plugin: Invalid Start Address in TCP client request node %(locreqstr)s (Must be in the range [0..65535])\nModbus plugin: Aborting C code generation for this node\n"%request_dict)
-        return None
-    if int(request_dict["count"]) not in xrange(1, 1+int(request_dict["maxcount"])):
-        self.GetCTRoot().logger.write_error("Modbus plugin: Invalid number of channels in TCP client request node %(locreqstr)s (Must be in the range [1..%(maxcount)s])\nModbus plugin: Aborting C code generation for this node\n"%request_dict)
-        return None
-    if (int(request_dict["address"]) + int(request_dict["count"])) not in xrange(1,65537):
-        self.GetCTRoot().logger.write_error("Modbus plugin: Invalid number of channels in TCP client request node %(locreqstr)s (start_address + nr_channels must be less than 65536)\nModbus plugin: Aborting C code generation for this node\n"%request_dict)
-        return None
-    
+        self.GetCTRoot().logger.write_error(
+            "Modbus plugin: Invalid Start Address in TCP client request node %(locreqstr)s (Must be in the range [0..65535])\nModbus plugin: Aborting C code generation for this node\n" % request_dict)
+        return None
+    if int(request_dict["count"]) not in xrange(1, 1 + int(request_dict["maxcount"])):
+        self.GetCTRoot().logger.write_error(
+            "Modbus plugin: Invalid number of channels in TCP client request node %(locreqstr)s (Must be in the range [1..%(maxcount)s])\nModbus plugin: Aborting C code generation for this node\n" % request_dict)
+        return None
+    if (int(request_dict["address"]) + int(request_dict["count"])) not in xrange(1, 65537):
+        self.GetCTRoot().logger.write_error(
+            "Modbus plugin: Invalid number of channels in TCP client request node %(locreqstr)s (start_address + nr_channels must be less than 65536)\nModbus plugin: Aborting C code generation for this node\n" % request_dict)
+        return None
+
     return req_init_template % request_dict
--- a/modbus/modbus.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/modbus/modbus.py	Mon Jan 07 13:50:39 2019 +0100
@@ -8,7 +8,7 @@
 #
 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
+# the Free Software Foundation, either version 2 of the License, or
 # (at your option) any later version.
 #
 # This program is distributed in the hope that it will be useful,
@@ -18,36 +18,34 @@
 #
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#    
+#
 # This code is made available on the understanding that it will not be
 # used in safety-critical situations without a full and competent review.
 
 
-
-
-import os, sys
+from __future__ import absolute_import
+import os
+from six.moves import xrange
+
+from modbus.mb_utils import *
+from ConfigTreeNode import ConfigTreeNode
+from PLCControler import LOCATION_CONFNODE, LOCATION_VAR_MEMORY
+
 base_folder = os.path.split(os.path.dirname(os.path.realpath(__file__)))[0]
 base_folder = os.path.join(base_folder, "..")
-ModbusPath  = os.path.join(base_folder, "Modbus")
-
-from mb_utils import *
-
-import wx
-from ConfigTreeNode import ConfigTreeNode
-from PLCControler import LOCATION_CONFNODE, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY
-
-
-
-###################################################
-###################################################
-#                                                 #
-#         C L I E N T    R E Q U E S T            # 
-#                                                 #
-###################################################
-###################################################
-
-
-class _RequestPlug:
+ModbusPath = os.path.join(base_folder, "Modbus")
+
+
+#
+#
+#
+# C L I E N T    R E Q U E S T            #
+#
+#
+#
+
+
+class _RequestPlug(object):
     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <xsd:element name="ModbusRequest">
@@ -90,8 +88,8 @@
     </xsd:schema>
     """
 
-    def GetParamsAttributes(self, path = None):
-        infos = ConfigTreeNode.GetParamsAttributes(self, path = path)
+    def GetParamsAttributes(self, path=None):
+        infos = ConfigTreeNode.GetParamsAttributes(self, path=path)
         for element in infos:
             if element["name"] == "ModbusRequest":
                 for child in element["children"]:
@@ -100,25 +98,25 @@
                         list.sort()
                         child["type"] = list
         return infos
-      
+
     def GetVariableLocationTree(self):
         current_location = self.GetCurrentLocation()
         name = self.BaseParams.getName()
         address = self.GetParamsAttributes()[0]["children"][3]["value"]
-        count   = self.GetParamsAttributes()[0]["children"][2]["value"]
-        function= self.GetParamsAttributes()[0]["children"][0]["value"]
+        count = self.GetParamsAttributes()[0]["children"][2]["value"]
+        function = self.GetParamsAttributes()[0]["children"][0]["value"]
         # 'BOOL' or 'WORD'
-        datatype= modbus_function_dict[function][3]
+        datatype = modbus_function_dict[function][3]
         # 1 or 16
-        datasize= modbus_function_dict[function][4]
+        datasize = modbus_function_dict[function][4]
         # 'Q' for coils and holding registers, 'I' for input discretes and input registers
-        datazone= modbus_function_dict[function][5] 
+        # datazone = modbus_function_dict[function][5]
         # 'X' for bits, 'W' for words
-        datatacc= modbus_function_dict[function][6] 
+        datatacc = modbus_function_dict[function][6]
         # 'Coil', 'Holding Register', 'Input Discrete' or 'Input Register'
-        dataname= modbus_function_dict[function][7] 
+        dataname = modbus_function_dict[function][7]
         entries = []
-        for offset in range(address, address+count):
+        for offset in range(address, address + count):
             entries.append({
                 "name": dataname + " " + str(offset),
                 "type": LOCATION_VAR_MEMORY,
@@ -128,14 +126,10 @@
                 "location": datatacc + ".".join([str(i) for i in current_location]) + "." + str(offset),
                 "description": "description",
                 "children": []})
-        return  {"name": name,
-                 "type": LOCATION_CONFNODE,
-                 "location": ".".join([str(i) for i in current_location]) + ".x",
-                 "children": entries}
-
-
-
-
+        return {"name": name,
+                "type": LOCATION_CONFNODE,
+                "location": ".".join([str(i) for i in current_location]) + ".x",
+                "children": entries}
 
     def CTNGenerate_C(self, buildpath, locations):
         """
@@ -151,26 +145,28 @@
         @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
         """
         return [], "", False
-        
-        
-###################################################
-###################################################
-#                                                 #
-#     S E R V E R    M E M O R Y    A R E A       # 
-#                                                 #
-###################################################
-###################################################
-
-#dictionary implementing:
-#key - string with the description we want in the request plugin GUI
-#list - (modbus function number, request type, max count value)
-modbus_memtype_dict = {"01 - Coils" :            ( '1', 'rw_bits',  65536, "BOOL", 1  , "Q", "X", "Coil"),
-                       "02 - Input Discretes" :  ( '2', 'ro_bits',  65536, "BOOL", 1  , "I", "X", "Input Discrete"),
-                       "03 - Holding Registers" :( '3', 'rw_words', 65536, "WORD", 16 , "Q", "W", "Holding Register"),
-                       "04 - Input Registers" :  ( '4', 'ro_words', 65536, "WORD", 16 , "I", "W", "Input Register"),
-                       }
-
-class _MemoryAreaPlug:
+
+
+#
+#
+#
+# S E R V E R    M E M O R Y    A R E A       #
+#
+#
+#
+
+# dictionary implementing:
+# key - string with the description we want in the request plugin GUI
+# list - (modbus function number, request type, max count value)
+modbus_memtype_dict = {
+    "01 - Coils":            ('1', 'rw_bits',  65536, "BOOL", 1, "Q", "X", "Coil"),
+    "02 - Input Discretes":  ('2', 'ro_bits',  65536, "BOOL", 1, "I", "X", "Input Discrete"),
+    "03 - Holding Registers": ('3', 'rw_words', 65536, "WORD", 16, "Q", "W", "Holding Register"),
+    "04 - Input Registers":  ('4', 'ro_words', 65536, "WORD", 16, "I", "W", "Input Register"),
+}
+
+
+class _MemoryAreaPlug(object):
     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <xsd:element name="MemoryArea">
@@ -197,8 +193,8 @@
     </xsd:schema>
     """
 
-    def GetParamsAttributes(self, path = None):
-        infos = ConfigTreeNode.GetParamsAttributes(self, path = path)
+    def GetParamsAttributes(self, path=None):
+        infos = ConfigTreeNode.GetParamsAttributes(self, path=path)
         for element in infos:
             if element["name"] == "MemoryArea":
                 for child in element["children"]:
@@ -212,20 +208,20 @@
         current_location = self.GetCurrentLocation()
         name = self.BaseParams.getName()
         address = self.GetParamsAttributes()[0]["children"][2]["value"]
-        count   = self.GetParamsAttributes()[0]["children"][1]["value"]
-        function= self.GetParamsAttributes()[0]["children"][0]["value"]
+        count = self.GetParamsAttributes()[0]["children"][1]["value"]
+        function = self.GetParamsAttributes()[0]["children"][0]["value"]
         # 'BOOL' or 'WORD'
-        datatype= modbus_memtype_dict[function][3]
+        datatype = modbus_memtype_dict[function][3]
         # 1 or 16
-        datasize= modbus_memtype_dict[function][4]
+        datasize = modbus_memtype_dict[function][4]
         # 'Q' for coils and holding registers, 'I' for input discretes and input registers
-        datazone= modbus_memtype_dict[function][5] 
+        # datazone = modbus_memtype_dict[function][5]
         # 'X' for bits, 'W' for words
-        datatacc= modbus_memtype_dict[function][6] 
+        datatacc = modbus_memtype_dict[function][6]
         # 'Coil', 'Holding Register', 'Input Discrete' or 'Input Register'
-        dataname= modbus_memtype_dict[function][7] 
+        dataname = modbus_memtype_dict[function][7]
         entries = []
-        for offset in range(address, address+count):
+        for offset in range(address, address + count):
             entries.append({
                 "name": dataname + " " + str(offset),
                 "type": LOCATION_VAR_MEMORY,
@@ -235,10 +231,10 @@
                 "location": datatacc + ".".join([str(i) for i in current_location]) + "." + str(offset),
                 "description": "description",
                 "children": []})
-        return  {"name": name,
-                 "type": LOCATION_CONFNODE,
-                 "location": ".".join([str(i) for i in current_location]) + ".x",
-                 "children": entries}
+        return {"name": name,
+                "type": LOCATION_CONFNODE,
+                "location": ".".join([str(i) for i in current_location]) + ".x",
+                "children": entries}
 
     def CTNGenerate_C(self, buildpath, locations):
         """
@@ -255,16 +251,16 @@
         """
         return [], "", False
 
-        
-###################################################
-###################################################
-#                                                 #
-#            T C P    C L I E N T                 # 
-#                                                 #
-###################################################
-###################################################
-
-class _ModbusTCPclientPlug:
+
+#
+#
+#
+# T C P    C L I E N T                 #
+#
+#
+#
+
+class _ModbusTCPclientPlug(object):
     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <xsd:element name="ModbusTCPclient">
@@ -283,8 +279,9 @@
       </xsd:element>
     </xsd:schema>
     """
-    # NOTE: Max value of 2147483647 (i32_max) for Invocation_Rate_in_ms corresponds to aprox 25 days.
-    CTNChildrenTypes = [("ModbusRequest",_RequestPlug, "Request")]
+    # NOTE: Max value of 2147483647 (i32_max) for Invocation_Rate_in_ms
+    # corresponds to aprox 25 days.
+    CTNChildrenTypes = [("ModbusRequest", _RequestPlug, "Request")]
     # TODO: Replace with CTNType !!!
     PlugType = "ModbusTCPclient"
 
@@ -309,19 +306,17 @@
         return [], "", False
 
 
-
-        
-###################################################
-###################################################
-#                                                 #
-#            T C P    S E R V E R                 # 
-#                                                 #
-###################################################
-###################################################
-
-class _ModbusTCPserverPlug:
+#
+#
+#
+# T C P    S E R V E R                 #
+#
+#
+#
+
+class _ModbusTCPserverPlug(object):
     # NOTE: the Port number is a 'string' and not an 'integer'!
-    # This is because the underlying modbus library accepts strings 
+    # This is because the underlying modbus library accepts strings
     # (e.g.: well known port names!)
     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
@@ -341,7 +336,7 @@
       </xsd:element>
     </xsd:schema>
     """
-    CTNChildrenTypes = [("MemoryArea",_MemoryAreaPlug, "Memory Area")]
+    CTNChildrenTypes = [("MemoryArea", _MemoryAreaPlug, "Memory Area")]
     # TODO: Replace with CTNType !!!
     PlugType = "ModbusTCPserver"
 
@@ -355,7 +350,7 @@
     #     port number: IP port used by this Modbus/IP server
     def GetIPServerPortNumbers(self):
         port = self.GetParamsAttributes()[0]["children"][1]["value"]
-        return [(self.GetCurrentLocation() , port)]
+        return [(self.GetCurrentLocation(), port)]
 
     def CTNGenerate_C(self, buildpath, locations):
         """
@@ -373,17 +368,15 @@
         return [], "", False
 
 
-
-
-###################################################
-###################################################
-#                                                 #
-#            R T U    C L I E N T                 # 
-#                                                 #
-###################################################
-###################################################
-
-class _ModbusRTUclientPlug:
+#
+#
+#
+# R T U    C L I E N T                 #
+#
+#
+#
+
+class _ModbusRTUclientPlug(object):
     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <xsd:element name="ModbusRTUclient">
@@ -404,13 +397,14 @@
       </xsd:element>
     </xsd:schema>
     """
-    # NOTE: Max value of 2147483647 (i32_max) for Invocation_Rate_in_ms corresponds to aprox 25 days.
-    CTNChildrenTypes = [("ModbusRequest",_RequestPlug, "Request")]
+    # NOTE: Max value of 2147483647 (i32_max) for Invocation_Rate_in_ms
+    # corresponds to aprox 25 days.
+    CTNChildrenTypes = [("ModbusRequest", _RequestPlug, "Request")]
     # TODO: Replace with CTNType !!!
     PlugType = "ModbusRTUclient"
 
-    def GetParamsAttributes(self, path = None):
-        infos = ConfigTreeNode.GetParamsAttributes(self, path = path)
+    def GetParamsAttributes(self, path=None):
+        infos = ConfigTreeNode.GetParamsAttributes(self, path=path)
         for element in infos:
             if element["name"] == "ModbusRTUclient":
                 for child in element["children"]:
@@ -421,7 +415,7 @@
                     if child["name"] == "Parity":
                         child["type"] = modbus_serial_parity_dict.keys()
         return infos
-      
+
     # Return the number of (modbus library) nodes this specific RTU client will need
     #   return type: (tcp nodes, rtu nodes, ascii nodes)
     def GetNodeCount(self):
@@ -443,17 +437,16 @@
         return [], "", False
 
 
-
-###################################################
-###################################################
-#                                                 #
-#            R T U    S L A V E                   # 
-#                                                 #
-###################################################
-###################################################
-
-
-class _ModbusRTUslavePlug:
+#
+#
+#
+# R T U    S L A V E                   #
+#
+#
+#
+
+
+class _ModbusRTUslavePlug(object):
     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <xsd:element name="ModbusRTUslave">
@@ -474,12 +467,12 @@
       </xsd:element>
     </xsd:schema>
     """
-    CTNChildrenTypes = [("MemoryArea",_MemoryAreaPlug, "Memory Area")]
+    CTNChildrenTypes = [("MemoryArea", _MemoryAreaPlug, "Memory Area")]
     # TODO: Replace with CTNType !!!
     PlugType = "ModbusRTUslave"
 
-    def GetParamsAttributes(self, path = None):
-        infos = ConfigTreeNode.GetParamsAttributes(self, path = path)
+    def GetParamsAttributes(self, path=None):
+        infos = ConfigTreeNode.GetParamsAttributes(self, path=path)
         for element in infos:
             if element["name"] == "ModbusRTUslave":
                 for child in element["children"]:
@@ -490,7 +483,7 @@
                     if child["name"] == "Parity":
                         child["type"] = modbus_serial_parity_dict.keys()
         return infos
-      
+
     # Return the number of (modbus library) nodes this specific RTU slave will need
     #   return type: (tcp nodes, rtu nodes, ascii nodes)
     def GetNodeCount(self):
@@ -511,16 +504,19 @@
         """
         return [], "", False
 
-    
-
-###################################################
-###################################################
-#                                                 #
-#             R O O T    C L A S S                # 
-#                                                 #
-###################################################
-###################################################
-class RootClass:
+
+def _lt_to_str(loctuple):
+    return '.'.join(map(str, loctuple))
+
+
+#
+#
+#
+# R O O T    C L A S S                #
+#
+#
+#
+class RootClass(object):
     XSD = """<?xml version="1.0" encoding="ISO-8859-1" ?>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
       <xsd:element name="ModbusRoot">
@@ -537,23 +533,25 @@
       </xsd:element>
     </xsd:schema>
     """
-    CTNChildrenTypes = [("ModbusTCPclient",_ModbusTCPclientPlug, "Modbus TCP Client")
-                       ,("ModbusTCPserver",_ModbusTCPserverPlug, "Modbus TCP Server")
-                       ,("ModbusRTUclient",_ModbusRTUclientPlug, "Modbus RTU Client")
-                       ,("ModbusRTUslave", _ModbusRTUslavePlug,  "Modbus RTU Slave")
-                       ]
-    
+    CTNChildrenTypes = [("ModbusTCPclient", _ModbusTCPclientPlug, "Modbus TCP Client"),
+                        ("ModbusTCPserver", _ModbusTCPserverPlug, "Modbus TCP Server"),
+                        ("ModbusRTUclient", _ModbusRTUclientPlug, "Modbus RTU Client"),
+                        ("ModbusRTUslave", _ModbusRTUslavePlug,  "Modbus RTU Slave")]
+
     # Return the number of (modbus library) nodes this specific instance of the modbus plugin will need
     #   return type: (tcp nodes, rtu nodes, ascii nodes)
     def GetNodeCount(self):
-        max_remote_tcpclient = self.GetParamsAttributes()[0]["children"][0]["value"]
+        max_remote_tcpclient = self.GetParamsAttributes()[
+            0]["children"][0]["value"]
         total_node_count = (max_remote_tcpclient, 0, 0)
         for child in self.IECSortedChildren():
             # ask each child how many nodes it needs, and add them all up.
-            total_node_count = tuple(x1 + x2 for x1, x2 in zip(total_node_count, child.GetNodeCount())) 
+            total_node_count = tuple(
+                x1 + x2 for x1, x2 in zip(total_node_count, child.GetNodeCount()))
         return total_node_count
 
-    # Return a list with tuples of the (location, port numbers) used by all the Modbus/IP servers
+    # Return a list with tuples of the (location, port numbers) used by all
+    # the Modbus/IP servers
     def GetIPServerPortNumbers(self):
         IPServer_port_numbers = []
         for child in self.IECSortedChildren():
@@ -562,54 +560,64 @@
         return IPServer_port_numbers
 
     def CTNGenerate_C(self, buildpath, locations):
-        #print "#############"
-        #print self.__class__
-        #print type(self)
-        #print "self.CTNType >>>"
-        #print self.CTNType
-        #print "type(self.CTNType) >>>"
-        #print type(self.CTNType)
-        #print "#############"
-        
-        loc_dict = {"locstr" : "_".join(map(str,self.GetCurrentLocation())),
-                   }
-        
+        # print "#############"
+        # print self.__class__
+        # print type(self)
+        # print "self.CTNType >>>"
+        # print self.CTNType
+        # print "type(self.CTNType) >>>"
+        # print type(self.CTNType)
+        # print "#############"
+
+        loc_dict = {"locstr": "_".join(map(str, self.GetCurrentLocation()))}
+
         # Determine the number of (modbus library) nodes ALL instances of the modbus plugin will need
         #   total_node_count: (tcp nodes, rtu nodes, ascii nodes)
         # Also get a list with tuples of (location, IP port numbers) used by all the Modbus/IP server nodes
         #   This list is later used to search for duplicates in port numbers!
         #   IPServer_port_numbers = [(location ,IPserver_port_number), ...]
         #       location: tuple similar to (0, 3, 1) representing the location in the configuration tree "0.3.1.x"
-        #       IPserver_port_number: a number (i.e. port number used by the Modbus/IP server)
+        # IPserver_port_number: a number (i.e. port number used by the
+        # Modbus/IP server)
         total_node_count = (0, 0, 0)
         IPServer_port_numbers = []
         for CTNInstance in self.GetCTRoot().IterChildren():
             if CTNInstance.CTNType == "modbus":
-                # ask each modbus plugin instance how many nodes it needs, and add them all up.
-                total_node_count = tuple(x1 + x2 for x1, x2 in zip(total_node_count, CTNInstance.GetNodeCount())) 
-                IPServer_port_numbers.extend(CTNInstance.GetIPServerPortNumbers())
+                # ask each modbus plugin instance how many nodes it needs, and
+                # add them all up.
+                total_node_count = tuple(x1 + x2 for x1, x2 in zip(
+                    total_node_count, CTNInstance.GetNodeCount()))
+                IPServer_port_numbers.extend(
+                    CTNInstance.GetIPServerPortNumbers())
 
         # Search for use of duplicate port numbers by Modbus/IP servers
-        #print IPServer_port_numbers 
+        # print IPServer_port_numbers
         # ..but first define a lambda function to convert a tuple with the config tree location to a nice looking string
-        #   for e.g., convert the tuple (0, 3, 4) to "0.3.4" 
-        lt_to_str = lambda loctuple: '.'.join(map(str, loctuple))
-        for i in range(0, len(IPServer_port_numbers)-1):
-            for j in range (i+1, len(IPServer_port_numbers)):
+        #   for e.g., convert the tuple (0, 3, 4) to "0.3.4"
+
+        for i in range(0, len(IPServer_port_numbers) - 1):
+            for j in range(i + 1, len(IPServer_port_numbers)):
                 if IPServer_port_numbers[i][1] == IPServer_port_numbers[j][1]:
-                    self.GetCTRoot().logger.write_warning(_("Error: Modbus/IP Servers %s.x and %s.x use the same port number %s.\n")%(lt_to_str(IPServer_port_numbers[i][0]), lt_to_str(IPServer_port_numbers[j][0]), IPServer_port_numbers[j][1]))
-                    raise Exception, False
-                    # TODO: return an error code instead of raising an exception
-        
-        # Determine the current location in Beremiz's project configuration tree 
+                    self.GetCTRoot().logger.write_warning(
+                        _("Error: Modbus/IP Servers %{a1}.x and %{a2}.x use the same port number {a3}.\n").
+                        format(
+                            a1=_lt_to_str(IPServer_port_numbers[i][0]),
+                            a2=_lt_to_str(IPServer_port_numbers[j][0]),
+                            a3=IPServer_port_numbers[j][1]))
+                    raise Exception
+                    # TODO: return an error code instead of raising an
+                    # exception
+
+        # Determine the current location in Beremiz's project configuration
+        # tree
         current_location = self.GetCurrentLocation()
-        
+
         # define a unique name for the generated C and h files
         prefix = "_".join(map(str, current_location))
-        Gen_MB_c_path = os.path.join(buildpath, "MB_%s.c"%prefix)
-        Gen_MB_h_path = os.path.join(buildpath, "MB_%s.h"%prefix) 
-        c_filename = os.path.join(os.path.split(__file__)[0],"mb_runtime.c")
-        h_filename = os.path.join(os.path.split(__file__)[0],"mb_runtime.h")
+        Gen_MB_c_path = os.path.join(buildpath, "MB_%s.c" % prefix)
+        Gen_MB_h_path = os.path.join(buildpath, "MB_%s.h" % prefix)
+        c_filename = os.path.join(os.path.split(__file__)[0], "mb_runtime.c")
+        h_filename = os.path.join(os.path.split(__file__)[0], "mb_runtime.h")
 
         tcpclient_reqs_count = 0
         rtuclient_reqs_count = 0
@@ -624,124 +632,134 @@
         client_nodeid = 0
         client_requestid = 0
         server_id = 0
-        
+
         server_node_list = []
         client_node_list = []
         client_request_list = []
         server_memarea_list = []
         loc_vars = []
-        loc_vars_list = [] # list of variables already declared in C code!
+        loc_vars_list = []  # list of variables already declared in C code!
         for child in self.IECSortedChildren():
-            #print "<<<<<<<<<<<<<"
-            #print "child (self.IECSortedChildren())----->"
-            #print child.__class__
-            #print ">>>>>>>>>>>>>"
-            ######################################
+            # print "<<<<<<<<<<<<<"
+            # print "child (self.IECSortedChildren())----->"
+            # print child.__class__
+            # print ">>>>>>>>>>>>>"
+            #
             if child.PlugType == "ModbusTCPserver":
                 tcpserver_node_count += 1
                 new_node = GetTCPServerNodePrinted(self, child)
                 if new_node is None:
-                    return [],"",False
+                    return [], "", False
                 server_node_list.append(new_node)
-                ##############
+                #
                 for subchild in child.IECSortedChildren():
-                    new_memarea = GetTCPServerMemAreaPrinted(self, subchild, nodeid)
+                    new_memarea = GetTCPServerMemAreaPrinted(
+                        self, subchild, nodeid)
                     if new_memarea is None:
-                        return [],"",False
+                        return [], "", False
                     server_memarea_list.append(new_memarea)
-                    function= subchild.GetParamsAttributes()[0]["children"][0]["value"]
+                    function = subchild.GetParamsAttributes()[
+                        0]["children"][0]["value"]
                     # 'ro_bits', 'rw_bits', 'ro_words' or 'rw_words'
-                    memarea= modbus_memtype_dict[function][1]
+                    memarea = modbus_memtype_dict[function][1]
                     for iecvar in subchild.GetLocations():
-                        #print repr(iecvar)
+                        # print repr(iecvar)
                         absloute_address = iecvar["LOC"][3]
-                        start_address = int(subchild.GetParamsAttributes()[0]["children"][2]["value"])
+                        start_address = int(GetCTVal(subchild, 2))
                         relative_addr = absloute_address - start_address
-                        #test if relative address in request specified range
-                        if relative_addr in xrange(int(subchild.GetParamsAttributes()[0]["children"][1]["value"])):
+                        # test if relative address in request specified range
+                        if relative_addr in xrange(int(GetCTVal(subchild, 1))):
                             if str(iecvar["NAME"]) not in loc_vars_list:
-                                loc_vars.append("u16 *" + str(iecvar["NAME"]) + " = &server_nodes[%d].mem_area.%s[%d];" % (server_id, memarea, absloute_address))
+                                loc_vars.append("u16 *" + str(iecvar["NAME"]) + " = &server_nodes[%d].mem_area.%s[%d];" % (
+                                    server_id, memarea, absloute_address))
                                 loc_vars_list.append(str(iecvar["NAME"]))
                 server_id += 1
-            ######################################
+            #
             if child.PlugType == "ModbusRTUslave":
                 rtuserver_node_count += 1
                 new_node = GetRTUSlaveNodePrinted(self, child)
                 if new_node is None:
-                    return [],"",False
+                    return [], "", False
                 server_node_list.append(new_node)
-                ##############
+                #
                 for subchild in child.IECSortedChildren():
-                    new_memarea = GetTCPServerMemAreaPrinted(self, subchild, nodeid)
+                    new_memarea = GetTCPServerMemAreaPrinted(
+                        self, subchild, nodeid)
                     if new_memarea is None:
-                        return [],"",False
+                        return [], "", False
                     server_memarea_list.append(new_memarea)
-                    function= subchild.GetParamsAttributes()[0]["children"][0]["value"]
+                    function = subchild.GetParamsAttributes()[
+                        0]["children"][0]["value"]
                     # 'ro_bits', 'rw_bits', 'ro_words' or 'rw_words'
-                    memarea= modbus_memtype_dict[function][1]
+                    memarea = modbus_memtype_dict[function][1]
                     for iecvar in subchild.GetLocations():
-                        #print repr(iecvar)
+                        # print repr(iecvar)
                         absloute_address = iecvar["LOC"][3]
-                        start_address = int(subchild.GetParamsAttributes()[0]["children"][2]["value"])
+                        start_address = int(GetCTVal(subchild, 2))
                         relative_addr = absloute_address - start_address
-                        #test if relative address in request specified range
-                        if relative_addr in xrange(int(subchild.GetParamsAttributes()[0]["children"][1]["value"])):
+                        # test if relative address in request specified range
+                        if relative_addr in xrange(int(GetCTVal(subchild, 1))):
                             if str(iecvar["NAME"]) not in loc_vars_list:
-                                loc_vars.append("u16 *" + str(iecvar["NAME"]) + " = &server_nodes[%d].mem_area.%s[%d];" % (server_id, memarea, absloute_address))
+                                loc_vars.append("u16 *" + str(iecvar["NAME"]) + " = &server_nodes[%d].mem_area.%s[%d];" % (
+                                    server_id, memarea, absloute_address))
                                 loc_vars_list.append(str(iecvar["NAME"]))
                 server_id += 1
-            ######################################
+            #
             if child.PlugType == "ModbusTCPclient":
                 tcpclient_reqs_count += len(child.IECSortedChildren())
                 new_node = GetTCPClientNodePrinted(self, child)
                 if new_node is None:
-                    return [],"",False
+                    return [], "", False
                 client_node_list.append(new_node)
                 for subchild in child.IECSortedChildren():
-                    new_req = GetClientRequestPrinted(self, subchild, client_nodeid)
+                    new_req = GetClientRequestPrinted(
+                        self, subchild, client_nodeid)
                     if new_req is None:
-                        return [],"",False
+                        return [], "", False
                     client_request_list.append(new_req)
                     for iecvar in subchild.GetLocations():
-                        #absloute address - start address
-                        relative_addr = iecvar["LOC"][3] - int(subchild.GetParamsAttributes()[0]["children"][3]["value"])
-                        #test if relative address in request specified range
-                        if relative_addr in xrange(int(subchild.GetParamsAttributes()[0]["children"][2]["value"])):
+                        # absloute address - start address
+                        relative_addr = iecvar["LOC"][3] - int(GetCTVal(subchild, 3))
+                        # test if relative address in request specified range
+                        if relative_addr in xrange(int(GetCTVal(subchild, 2))):
                             if str(iecvar["NAME"]) not in loc_vars_list:
-                                loc_vars.append("u16 *" + str(iecvar["NAME"]) + " = &client_requests[%d].plcv_buffer[%d];" % (client_requestid, relative_addr))
+                                loc_vars.append(
+                                    "u16 *" + str(iecvar["NAME"]) + " = &client_requests[%d].plcv_buffer[%d];" % (client_requestid, relative_addr))
                                 loc_vars_list.append(str(iecvar["NAME"]))
                     client_requestid += 1
                 tcpclient_node_count += 1
                 client_nodeid += 1
-            ######################################
+            #
             if child.PlugType == "ModbusRTUclient":
                 rtuclient_reqs_count += len(child.IECSortedChildren())
                 new_node = GetRTUClientNodePrinted(self, child)
                 if new_node is None:
-                    return [],"",False
+                    return [], "", False
                 client_node_list.append(new_node)
                 for subchild in child.IECSortedChildren():
-                    new_req = GetClientRequestPrinted(self, subchild, client_nodeid)
+                    new_req = GetClientRequestPrinted(
+                        self, subchild, client_nodeid)
                     if new_req is None:
-                        return [],"",False
+                        return [], "", False
                     client_request_list.append(new_req)
                     for iecvar in subchild.GetLocations():
-                        #absloute address - start address
-                        relative_addr = iecvar["LOC"][3] - int(subchild.GetParamsAttributes()[0]["children"][3]["value"])
-                        #test if relative address in request specified range
-                        if relative_addr in xrange(int(subchild.GetParamsAttributes()[0]["children"][2]["value"])):
+                        # absloute address - start address
+                        relative_addr = iecvar["LOC"][3] - int(GetCTVal(subchild, 3))
+                        # test if relative address in request specified range
+                        if relative_addr in xrange(int(GetCTVal(subchild, 2))):
                             if str(iecvar["NAME"]) not in loc_vars_list:
-                                loc_vars.append("u16 *" + str(iecvar["NAME"]) + " = &client_requests[%d].plcv_buffer[%d];" % (client_requestid, relative_addr))
+                                loc_vars.append(
+                                    "u16 *" + str(iecvar["NAME"]) + " = &client_requests[%d].plcv_buffer[%d];" % (client_requestid, relative_addr))
                                 loc_vars_list.append(str(iecvar["NAME"]))
                     client_requestid += 1
                 rtuclient_node_count += 1
                 client_nodeid += 1
             nodeid += 1
-        
-        loc_dict["loc_vars"]             = "\n".join(loc_vars)
-        loc_dict["server_nodes_params"]  = ",\n\n".join(server_node_list)
-        loc_dict["client_nodes_params"]  = ",\n\n".join(client_node_list)
-        loc_dict["client_req_params"]    = ",\n\n".join(client_request_list)
+
+        loc_dict["loc_vars"] = "\n".join(loc_vars)
+        loc_dict["server_nodes_params"] = ",\n\n".join(server_node_list)
+        loc_dict["client_nodes_params"] = ",\n\n".join(client_node_list)
+        loc_dict["client_req_params"] = ",\n\n".join(client_request_list)
         loc_dict["tcpclient_reqs_count"] = str(tcpclient_reqs_count)
         loc_dict["tcpclient_node_count"] = str(tcpclient_node_count)
         loc_dict["tcpserver_node_count"] = str(tcpserver_node_count)
@@ -751,35 +769,38 @@
         loc_dict["ascclient_reqs_count"] = str(ascclient_reqs_count)
         loc_dict["ascclient_node_count"] = str(ascclient_node_count)
         loc_dict["ascserver_node_count"] = str(ascserver_node_count)
-        loc_dict["total_tcpnode_count"]  = str(total_node_count[0])
-        loc_dict["total_rtunode_count"]  = str(total_node_count[1])
-        loc_dict["total_ascnode_count"]  = str(total_node_count[2])
-        loc_dict["max_remote_tcpclient"] = int(self.GetParamsAttributes()[0]["children"][0]["value"])
-
-        #get template file content into a string, format it with dict
-        #and write it to proper .h file
+        loc_dict["total_tcpnode_count"] = str(total_node_count[0])
+        loc_dict["total_rtunode_count"] = str(total_node_count[1])
+        loc_dict["total_ascnode_count"] = str(total_node_count[2])
+        loc_dict["max_remote_tcpclient"] = int(
+            self.GetParamsAttributes()[0]["children"][0]["value"])
+
+        # get template file content into a string, format it with dict
+        # and write it to proper .h file
         mb_main = open(h_filename).read() % loc_dict
-        f = open(Gen_MB_h_path,'w')
+        f = open(Gen_MB_h_path, 'w')
         f.write(mb_main)
         f.close()
-        #same thing as above, but now to .c file
+        # same thing as above, but now to .c file
         mb_main = open(c_filename).read() % loc_dict
-        f = open(Gen_MB_c_path,'w')
+        f = open(Gen_MB_c_path, 'w')
         f.write(mb_main)
         f.close()
 
         LDFLAGS = []
         LDFLAGS.append(" \"-L" + ModbusPath + "\"")
-        LDFLAGS.append(" -lmb ")
+        LDFLAGS.append(" \"" + os.path.join(ModbusPath, "libmb.a") + "\"")
         LDFLAGS.append(" \"-Wl,-rpath," + ModbusPath + "\"")
-        #LDFLAGS.append("\"" + os.path.join(ModbusPath, "mb_slave_and_master.o") + "\"")
-        #LDFLAGS.append("\"" + os.path.join(ModbusPath, "mb_slave.o") + "\"")
-        #LDFLAGS.append("\"" + os.path.join(ModbusPath, "mb_master.o") + "\"")
-        #LDFLAGS.append("\"" + os.path.join(ModbusPath, "mb_tcp.o")    + "\"")
-        #LDFLAGS.append("\"" + os.path.join(ModbusPath, "mb_rtu.o")    + "\"")
-        #LDFLAGS.append("\"" + os.path.join(ModbusPath, "mb_ascii.o")    + "\"")
-        #LDFLAGS.append("\"" + os.path.join(ModbusPath, "sin_util.o")  + "\"")
-        if os.name == 'nt':   # other possible values: 'posix' 'os2' 'ce' 'java' 'riscos'
-            LDFLAGS.append(" -lws2_32 ")  # on windows we need to load winsock library!
-
-        return [(Gen_MB_c_path, ' -I"'+ModbusPath+'"')], LDFLAGS, True
+        # LDFLAGS.append("\"" + os.path.join(ModbusPath, "mb_slave_and_master.o") + "\"")
+        # LDFLAGS.append("\"" + os.path.join(ModbusPath, "mb_slave.o") + "\"")
+        # LDFLAGS.append("\"" + os.path.join(ModbusPath, "mb_master.o") + "\"")
+        # LDFLAGS.append("\"" + os.path.join(ModbusPath, "mb_tcp.o")    + "\"")
+        # LDFLAGS.append("\"" + os.path.join(ModbusPath, "mb_rtu.o")    + "\"")
+        # LDFLAGS.append("\"" + os.path.join(ModbusPath, "mb_ascii.o")    + "\"")
+        # LDFLAGS.append("\"" + os.path.join(ModbusPath, "sin_util.o")  + "\"")
+        # Target is ARM with linux and not win on x86 so winsock2 (ws2_32) library is useless !!!
+        # if os.name == 'nt':   # other possible values: 'posix' 'os2' 'ce' 'java' 'riscos'
+        # LDFLAGS.append(" -lws2_32 ")  # on windows we need to load winsock
+        # library!
+
+        return [(Gen_MB_c_path, ' -I"' + ModbusPath + '"')], LDFLAGS, True
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plcopen/BlockInstanceCollector.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,188 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# This file is part of Beremiz.
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+from collections import OrderedDict, namedtuple
+from plcopen.XSLTModelQuery import XSLTModelQuery, _StringValue, _BoolValue, _translate_args
+
+# -------------------------------------------------------------------------------
+#           Helpers object for generating pou block instances list
+# -------------------------------------------------------------------------------
+
+
+_Point = namedtuple("Point", ["x", "y"])
+
+_BlockInstanceInfos = namedtuple(
+    "BlockInstanceInfos",
+    ["type", "id", "x", "y", "width", "height", "specific_values", "inputs", "outputs"])
+
+_BlockSpecificValues = (
+    namedtuple("BlockSpecificValues",
+               ["name", "execution_order"]),
+    [_StringValue, int])
+_VariableSpecificValues = (
+    namedtuple("VariableSpecificValues",
+               ["name", "value_type", "execution_order"]),
+    [_StringValue, _StringValue, int])
+_ConnectionSpecificValues = (
+    namedtuple("ConnectionSpecificValues", ["name"]),
+    [_StringValue])
+
+_PowerRailSpecificValues = (
+    namedtuple("PowerRailSpecificValues", ["connectors"]),
+    [int])
+
+_LDElementSpecificValues = (
+    namedtuple("LDElementSpecificValues",
+               ["name", "negated", "edge", "storage", "execution_order"]),
+    [_StringValue, _BoolValue, _StringValue, _StringValue, int])
+
+_DivergenceSpecificValues = (
+    namedtuple("DivergenceSpecificValues", ["connectors"]),
+    [int])
+
+_SpecificValuesTuples = {
+    "comment": (
+        namedtuple("CommentSpecificValues", ["content"]),
+        [_StringValue]),
+    "input": _VariableSpecificValues,
+    "output": _VariableSpecificValues,
+    "inout": _VariableSpecificValues,
+    "connector": _ConnectionSpecificValues,
+    "continuation": _ConnectionSpecificValues,
+    "leftPowerRail": _PowerRailSpecificValues,
+    "rightPowerRail": _PowerRailSpecificValues,
+    "contact": _LDElementSpecificValues,
+    "coil": _LDElementSpecificValues,
+    "step": (
+        namedtuple("StepSpecificValues", ["name", "initial", "action"]),
+        [_StringValue, _BoolValue, lambda x: x]),
+    "transition": (
+        namedtuple("TransitionSpecificValues",
+                   ["priority", "condition_type", "condition", "connection"]),
+        [int, _StringValue, _StringValue, lambda x: x]),
+    "selectionDivergence": _DivergenceSpecificValues,
+    "selectionConvergence": _DivergenceSpecificValues,
+    "simultaneousDivergence": _DivergenceSpecificValues,
+    "simultaneousConvergence": _DivergenceSpecificValues,
+    "jump": (
+        namedtuple("JumpSpecificValues", ["target"]),
+        [_StringValue]),
+    "actionBlock": (
+        namedtuple("ActionBlockSpecificValues", ["actions"]),
+        [lambda x: x]),
+}
+
+_InstanceConnectionInfos = namedtuple(
+    "InstanceConnectionInfos",
+    ["name", "negated", "edge", "position", "links"])
+
+_ConnectionLinkInfos = namedtuple(
+    "ConnectionLinkInfos",
+    ["refLocalId", "formalParameter", "points"])
+
+
+class _ActionInfos(object):
+    __slots__ = ["qualifier", "type", "value", "duration", "indicator"]
+
+    def __init__(self, *args):
+        for attr, value in zip(self.__slots__, args):
+            setattr(self, attr, value if value is not None else "")
+
+    def copy(self):
+        return _ActionInfos(*[getattr(self, attr) for attr in self.__slots__])
+
+
+class BlockInstanceFactory(object):
+
+    def __init__(self, block_instances):
+        self.BlockInstances = block_instances
+        self.CurrentInstance = None
+        self.SpecificValues = None
+        self.CurrentConnection = None
+        self.CurrentLink = None
+
+    def SetSpecificValues(self, context, *args):
+        self.SpecificValues = list(args)
+        self.CurrentInstance = None
+        self.CurrentConnection = None
+        self.CurrentLink = None
+
+    def AddBlockInstance(self, context, *args):
+        specific_values_tuple, specific_values_translation = \
+            _SpecificValuesTuples.get(args[0][0], _BlockSpecificValues)
+
+        if args[0][0] == "step" and len(self.SpecificValues) < 3 or \
+           args[0][0] == "transition" and len(self.SpecificValues) < 4:
+            self.SpecificValues.append([None])
+        elif args[0][0] == "actionBlock" and len(self.SpecificValues) < 1:
+            self.SpecificValues.append([[]])
+        specific_values = specific_values_tuple(*_translate_args(
+            specific_values_translation, self.SpecificValues))
+        self.SpecificValues = None
+
+        self.CurrentInstance = _BlockInstanceInfos(
+            *(_translate_args([_StringValue, int] + [float] * 4, args) +
+              [specific_values, [], []]))
+
+        self.BlockInstances[self.CurrentInstance.id] = self.CurrentInstance
+
+    def AddInstanceConnection(self, context, *args):
+        connection_args = _translate_args(
+            [_StringValue] * 2 + [_BoolValue, _StringValue] + [float] * 2, args)
+
+        self.CurrentConnection = _InstanceConnectionInfos(
+            *(connection_args[1:4] + [
+                _Point(*connection_args[4:6]), []]))
+
+        if self.CurrentInstance is not None:
+            if connection_args[0] == "input":
+                self.CurrentInstance.inputs.append(self.CurrentConnection)
+            else:
+                self.CurrentInstance.outputs.append(self.CurrentConnection)
+        else:
+            self.SpecificValues.append([self.CurrentConnection])
+
+    def AddConnectionLink(self, context, *args):
+        self.CurrentLink = _ConnectionLinkInfos(
+            *(_translate_args([int, _StringValue], args) + [[]]))
+        self.CurrentConnection.links.append(self.CurrentLink)
+
+    def AddLinkPoint(self, context, *args):
+        self.CurrentLink.points.append(_Point(
+            *_translate_args([float] * 2, args)))
+
+    def AddAction(self, context, *args):
+        if len(self.SpecificValues) == 0:
+            self.SpecificValues.append([[]])
+        translated_args = _translate_args([_StringValue] * 5, args)
+        self.SpecificValues[0][0].append(_ActionInfos(*translated_args))
+
+
+class BlockInstanceCollector(XSLTModelQuery):
+    """ object for collecting instances path list"""
+    def __init__(self, controller):
+        XSLTModelQuery.__init__(self,
+                                controller,
+                                "pou_block_instances.xslt",
+                                [(name, self.FactoryCaller(name))
+                                 for name in ["AddBlockInstance",
+                                              "SetSpecificValues",
+                                              "AddInstanceConnection",
+                                              "AddConnectionLink",
+                                              "AddLinkPoint",
+                                              "AddAction"]])
+
+    def FactoryCaller(self, funcname):
+        def CallFactory(*args):
+            return getattr(self.factory, funcname)(*args)
+        return CallFactory
+
+    def Collect(self, root, debug):
+        element_instances = OrderedDict()
+        self.factory = BlockInstanceFactory(element_instances)
+        self._process_xslt(root, debug)
+        self.factory = None
+        return element_instances
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plcopen/InstanceTagnameCollector.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# This file is part of Beremiz.
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+from plcopen.XSLTModelQuery import XSLTModelQuery
+from plcopen.types_enums import *
+
+
+class InstanceTagName(object):
+    """Helpers object for generating instance tagname"""
+
+    def __init__(self):
+        self.TagName = None
+
+    def GetTagName(self):
+        return self.TagName
+
+    def ConfigTagName(self, context, *args):
+        self.TagName = ComputeConfigurationName(args[0][0])
+
+    def ResourceTagName(self, context, *args):
+        self.TagName = ComputeConfigurationResourceName(args[0][0], args[1][0])
+
+    def PouTagName(self, context, *args):
+        self.TagName = ComputePouName(args[0][0])
+
+    def ActionTagName(self, context, *args):
+        self.TagName = ComputePouActionName(args[0][0], args[0][1])
+
+    def TransitionTagName(self, context, *args):
+        self.TagName = ComputePouTransitionName(args[0][0], args[0][1])
+
+
+class InstanceTagnameCollector(XSLTModelQuery):
+    """ object for collecting instances path list"""
+    def __init__(self, controller):
+        XSLTModelQuery.__init__(self,
+                                controller,
+                                "instance_tagname.xslt",
+                                [(name, self.FactoryCaller(name))
+                                 for name in ["ConfigTagName",
+                                              "ResourceTagName",
+                                              "PouTagName",
+                                              "ActionTagName",
+                                              "TransitionTagName"]])
+
+    def FactoryCaller(self, funcname):
+        def CallFactory(*args):
+            return getattr(self.factory, funcname)(*args)
+        return CallFactory
+
+    def Collect(self, root, debug, instance_path):
+        self.factory = InstanceTagName()
+        self._process_xslt(root, debug, instance_path=instance_path)
+        res = self.factory.GetTagName()
+        self.factory = None
+        return res
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plcopen/InstancesPathCollector.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# This file is part of Beremiz.
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+from plcopen.XSLTModelQuery import XSLTModelQuery
+
+
+class InstancesPathCollector(XSLTModelQuery):
+    """ object for collecting instances path list"""
+    def __init__(self, controller):
+        self.Instances = []
+        XSLTModelQuery.__init__(self,
+                                controller,
+                                "instances_path.xslt",
+                                [("AddInstance", self.AddInstance)])
+
+    def AddInstance(self, context, *args):
+        self.Instances.append(args[0][0])
+
+    def Collect(self, root, name, debug):
+        self._process_xslt(root, debug, instance_type=name)
+        res = self.Instances
+        self.Instances = []
+        return res
--- a/plcopen/Makefile	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/Makefile	Mon Jan 07 13:50:39 2019 +0100
@@ -6,10 +6,10 @@
 
 all:$(xsltfiles)
 
-%.xslt: %.ysl2
+%.xslt: %.ysl2 yslt_noindent.yml2
 	$(yml)/yml2c -I $(yml) $< -o $@.tmp
 	xmlstarlet fo $@.tmp > $@
 	rm $@.tmp
 	
 clean:
-	rm -f $(xsltfiles)
\ No newline at end of file
+	rm -f $(xsltfiles)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plcopen/POUVariablesCollector.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# This file is part of Beremiz.
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+from plcopen.XSLTModelQuery import XSLTModelQuery, _StringValue, _BoolValue, _translate_args
+from plcopen.types_enums import CLASS_TYPES, POU_TYPES, VAR_CLASS_INFOS
+
+
+def class_extraction(value):
+    class_type = CLASS_TYPES.get(value)
+    if class_type is not None:
+        return class_type
+
+    pou_type = POU_TYPES.get(value)
+    if pou_type is not None:
+        return pou_type
+
+    var_type = VAR_CLASS_INFOS.get(value)
+    if var_type is not None:
+        return var_type[1]
+
+    return None
+
+
+class _VariablesTreeItemInfos(object):
+    __slots__ = ["name", "var_class", "type", "edit", "debug", "variables"]
+
+    def __init__(self, *args):
+        for attr, value in zip(self.__slots__, args):
+            setattr(self, attr, value if value is not None else "")
+
+    def copy(self):
+        return _VariablesTreeItemInfos(*[getattr(self, attr) for attr in self.__slots__])
+
+
+class VariablesTreeInfosFactory(object):
+
+    def __init__(self):
+        self.Root = None
+
+    def GetRoot(self):
+        return self.Root
+
+    def SetRoot(self, context, *args):
+        self.Root = _VariablesTreeItemInfos(
+            *([''] + _translate_args(
+                [class_extraction, _StringValue] + [_BoolValue] * 2,
+                args) + [[]]))
+
+    def AddVariable(self, context, *args):
+        if self.Root is not None:
+            self.Root.variables.append(_VariablesTreeItemInfos(
+                *(_translate_args(
+                    [_StringValue, class_extraction, _StringValue] +
+                    [_BoolValue] * 2, args) + [[]])))
+
+
+class POUVariablesCollector(XSLTModelQuery):
+    def __init__(self, controller):
+        XSLTModelQuery.__init__(self,
+                                controller,
+                                "pou_variables.xslt",
+                                [(name, self.FactoryCaller(name))
+                                 for name in ["SetRoot", "AddVariable"]])
+
+    def FactoryCaller(self, funcname):
+        def CallFactory(*args):
+            return getattr(self.factory, funcname)(*args)
+        return CallFactory
+
+    def Collect(self, root, debug):
+        self.factory = VariablesTreeInfosFactory()
+        self._process_xslt(root, debug)
+        res = self.factory.GetRoot()
+        self.factory = None
+        return res
--- a/plcopen/Standard_Function_Blocks.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/Standard_Function_Blocks.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -115,7 +115,7 @@
           </ST>
         </body>
         <documentation>
-          <xhtml:p><![CDATA[The semaphore provides a mechanism to allow software elements mutually exclusive access to certain ressources.]]></xhtml:p>
+          <xhtml:p><![CDATA[The semaphore provides a mechanism to allow software elements mutually exclusive access to certain resources.]]></xhtml:p>
         </documentation>
       </pou>
       <pou name="R_TRIG" pouType="functionBlock">
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plcopen/VariableInfoCollector.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,87 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# This file is part of Beremiz.
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+from plcopen.XSLTModelQuery import XSLTModelQuery, _StringValue, _BoolValue, _translate_args
+
+# -------------------------------------------------------------------------------
+#                 Helpers object for generating pou var list
+# -------------------------------------------------------------------------------
+
+
+class _VariableInfos(object):
+    __slots__ = ["Name", "Class", "Option", "Location", "InitialValue",
+                 "Edit", "Documentation", "Type", "Tree", "Number"]
+
+    def __init__(self, *args):
+        for attr, value in zip(self.__slots__, args):
+            setattr(self, attr, value if value is not None else "")
+
+    def copy(self):
+        return _VariableInfos(*[getattr(self, attr) for attr in self.__slots__])
+
+
+class VariablesInfosFactory(object):
+    """ Helpers object for generating pou var list """
+
+    def __init__(self, variables):
+        self.Variables = variables
+        self.TreeStack = []
+        self.Type = None
+        self.Dimensions = None
+
+    def SetType(self, context, *args):
+        self.Type = args[0][0]
+
+    def GetType(self):
+        if len(self.Dimensions) > 0:
+            return ("array", self.Type, self.Dimensions)
+        return self.Type
+
+    def GetTree(self):
+        return (self.TreeStack.pop(-1), self.Dimensions)
+
+    def AddDimension(self, context, *args):
+        self.Dimensions.append(tuple(
+            _translate_args([_StringValue] * 2, args)))
+
+    def AddTree(self, context, *args):
+        self.TreeStack.append([])
+        self.Dimensions = []
+
+    def AddVarToTree(self, context, *args):
+        var = (args[0][0], self.Type, self.GetTree())
+        self.TreeStack[-1].append(var)
+
+    def AddVariable(self, context, *args):
+        self.Variables.append(_VariableInfos(*(
+            _translate_args([_StringValue] * 5 + [_BoolValue] + [_StringValue], args) +
+            [self.GetType(), self.GetTree()])))
+
+
+class VariableInfoCollector(XSLTModelQuery):
+    def __init__(self, controller):
+        XSLTModelQuery.__init__(self,
+                                controller,
+                                "variables_infos.xslt",
+                                [(name, self.FactoryCaller(name))
+                                 for name in [
+                                     "SetType",
+                                     "AddDimension",
+                                     "AddTree",
+                                     "AddVarToTree",
+                                     "AddVariable"]])
+
+    def FactoryCaller(self, funcname):
+        def CallFactory(*args):
+            return getattr(self.factory, funcname)(*args)
+        return CallFactory
+
+    def Collect(self, root, debug, variables, tree):
+        self.factory = VariablesInfosFactory(variables)
+        self._process_xslt(root, debug, tree=str(tree))
+        res = self.factory
+        self.factory = None
+        return res
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plcopen/XSLTModelQuery.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,65 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# This file is part of Beremiz.
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+import os
+from lxml import etree
+import util.paths as paths
+from plcopen.structures import StdBlckLibs
+
+ScriptDirectory = paths.AbsDir(__file__)
+
+
+class XSLTModelQuery(object):
+    """ a class to handle XSLT queries on project and libs """
+    def __init__(self, controller, xsltpath, ext=None):
+        # arbitrary set debug to false, updated later
+        self.debug = False
+
+        # merge xslt extensions for library access to query specific ones
+        xsltext = [
+            ("GetProject", lambda *_ignored:
+             [controller.GetProject(self.debug)]),
+            ("GetStdLibs", lambda *_ignored:
+             [lib for lib in StdBlckLibs.values()]),
+            ("GetExtensions", lambda *_ignored:
+             [ctn["types"] for ctn in controller.ConfNodeTypes])
+        ]
+
+        if ext is not None:
+            xsltext.extend(ext)
+
+        # parse and compile. "beremiz" arbitrary namespace for extensions
+        self.xslt = etree.XSLT(
+            etree.parse(
+                os.path.join(ScriptDirectory, xsltpath),
+                etree.XMLParser()),
+            extensions={("beremiz", name): call for name, call in xsltext})
+
+    def _process_xslt(self, root, debug, **kwargs):
+        self.debug = debug
+        res = self.xslt(root, **{k: etree.XSLT.strparam(v) for k, v in kwargs.iteritems()})
+        # print(self.xslt.error_log)
+        return res
+
+
+# -------------------------------------------------------------------------------
+#           Helpers functions for translating list of arguments
+#                       from xslt to valid arguments
+# -------------------------------------------------------------------------------
+
+
+def _StringValue(x):
+    return x
+
+
+def _BoolValue(x):
+    return x in ["true", "0"]
+
+
+def _translate_args(translations, args):
+    return [translate(arg[0]) if len(arg) > 0 else None
+            for translate, arg in
+            zip(translations, args)]
--- a/plcopen/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -26,7 +26,7 @@
 
 # plcopen module dynamically creates its classes
 
-from plcopen import PLCOpenParser, LoadProject, SaveProject, LoadPou, \
+from __future__ import absolute_import
+from plcopen.plcopen import \
+    PLCOpenParser, LoadProject, SaveProject, LoadPou, \
     LoadPouInstances, VarOrder, QualifierList, rect
-
-
--- a/plcopen/definitions.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/definitions.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -23,30 +24,34 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 
-from os.path import join, split, realpath
-sd = split(realpath(__file__))[0]
+from __future__ import absolute_import
+from os.path import join
+import util.paths as paths
+from util.TranslationCatalogs import NoTranslate
+sd = paths.AbsDir(__file__)
 
 # Override gettext _ in this module
 # since we just want string to be added to dictionnary
 # but translation should happen here
-_ = lambda x:x
+_ = NoTranslate
 
-LANGUAGES = ["IL","ST","FBD","LD","SFC"]
+LANGUAGES = ["IL", "ST", "FBD", "LD", "SFC"]
 
-LOCATIONDATATYPES = {"X" : ["BOOL"],
-                     "B" : ["SINT", "USINT", "BYTE", "STRING"],
-                     "W" : ["INT", "UINT", "WORD", "WSTRING"],
-                     "D" : ["DINT", "UDINT", "REAL", "DWORD"],
-                     "L" : ["LINT", "ULINT", "LREAL", "LWORD"]}
+LOCATIONDATATYPES = {"X": ["BOOL"],
+                     "B": ["SINT", "USINT", "BYTE", "STRING"],
+                     "W": ["INT", "UINT", "WORD", "WSTRING"],
+                     "D": ["DINT", "UDINT", "REAL", "DWORD"],
+                     "L": ["LINT", "ULINT", "LREAL", "LWORD"]}
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                        Function Block Types definitions
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
-StdTC6Libs = [(_("Standard function blocks"),  join(sd, "Standard_Function_Blocks.xml")),
-              (_("Additional function blocks"),join(sd, "Additional_Function_Blocks.xml"))]
+StdTC6Libs = [(_("Standard function blocks"),   join(sd, "Standard_Function_Blocks.xml")),
+              (_("Additional function blocks"), join(sd, "Additional_Function_Blocks.xml"))]
 
-StdFuncsCSV = join(sd,"iec_std.csv")
+StdFuncsCSV = join(sd, "iec_std.csv")
+
 
 def GetBlockInfos(pou):
     infos = pou.getblockInfos()
@@ -57,15 +62,15 @@
         for var_name, var_type, var_modifier in infos["inputs"]]
     return infos
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                           Data Types definitions
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
-"""
-Ordored list of common data types defined in the IEC 61131-3
-Each type is associated to his direct parent type. It defines then a hierarchy
-between type that permits to make a comparison of two types
-"""
+
+#: Ordored list of common data types defined in the IEC 61131-3
+#: Each type is associated to his direct parent type. It defines then a hierarchy
+#: between type that permits to make a comparison of two types
+
 TypeHierarchy_list = [
     ("ANY", None),
     ("ANY_DERIVED", "ANY"),
@@ -100,45 +105,45 @@
     ("WORD", "ANY_NBIT"),
     ("DWORD", "ANY_NBIT"),
     ("LWORD", "ANY_NBIT")
-    #("WSTRING", "ANY_STRING") # TODO
+    # ("WSTRING", "ANY_STRING") # TODO
 ]
 
 DefaultType = "DINT"
 
 DataTypeRange_list = [
-    ("SINT", (-2**7, 2**7 - 1)),
-    ("INT", (-2**15, 2**15 - 1)),
-    ("DINT", (-2**31, 2**31 - 1)),
-    ("LINT", (-2**31, 2**31 - 1)),
-    ("USINT", (0, 2**8 - 1)),
-    ("UINT", (0, 2**16 - 1)),
-    ("UDINT", (0, 2**31 - 1)),
-    ("ULINT", (0, 2**31 - 1))
+    ("SINT",  (-2**7,  2**7 - 1)),
+    ("INT",   (-2**15, 2**15 - 1)),
+    ("DINT",  (-2**31, 2**31 - 1)),
+    ("LINT",  (-2**63, 2**63 - 1)),
+    ("USINT", (0,      2**8 - 1)),
+    ("UINT",  (0,      2**16 - 1)),
+    ("UDINT", (0,      2**32 - 1)),
+    ("ULINT", (0,      2**64 - 1))
 ]
 
 ANY_TO_ANY_FILTERS = {
-    "ANY_TO_ANY":[
+    "ANY_TO_ANY": [
         # simple type conv are let as C cast
-        (("ANY_INT","ANY_BIT"),("ANY_NUM","ANY_BIT")),
-        (("ANY_REAL",),("ANY_REAL",)),
+        (("ANY_INT", "ANY_BIT"), ("ANY_NUM", "ANY_BIT")),
+        (("ANY_REAL",), ("ANY_REAL",)),
         # REAL_TO_INT
-        (("ANY_REAL",),("ANY_SINT",)),
-        (("ANY_REAL",),("ANY_UINT",)),
-        (("ANY_REAL",),("ANY_BIT",)),
+        (("ANY_REAL",), ("ANY_SINT",)),
+        (("ANY_REAL",), ("ANY_UINT",)),
+        (("ANY_REAL",), ("ANY_BIT",)),
         # TO_TIME
-        (("ANY_INT","ANY_BIT"),("ANY_DATE","TIME")),
-        (("ANY_REAL",),("ANY_DATE","TIME")),
-        (("ANY_STRING",), ("ANY_DATE","TIME")),
+        (("ANY_INT", "ANY_BIT"), ("ANY_DATE", "TIME")),
+        (("ANY_REAL",),          ("ANY_DATE", "TIME")),
+        (("ANY_STRING",),        ("ANY_DATE", "TIME")),
         # FROM_TIME
-        (("ANY_DATE","TIME"), ("ANY_REAL",)),
-        (("ANY_DATE","TIME"), ("ANY_INT","ANY_NBIT")),
+        (("ANY_DATE", "TIME"), ("ANY_REAL",)),
+        (("ANY_DATE", "TIME"), ("ANY_INT", "ANY_NBIT")),
         (("TIME",), ("ANY_STRING",)),
         (("DATE",), ("ANY_STRING",)),
-        (("TOD",), ("ANY_STRING",)),
-        (("DT",), ("ANY_STRING",)),
+        (("TOD",),  ("ANY_STRING",)),
+        (("DT",),   ("ANY_STRING",)),
         # TO_STRING
-        (("BOOL",), ("ANY_STRING",)),
-        (("ANY_BIT",), ("ANY_STRING",)),
+        (("BOOL",),     ("ANY_STRING",)),
+        (("ANY_BIT",),  ("ANY_STRING",)),
         (("ANY_REAL",), ("ANY_STRING",)),
         (("ANY_SINT",), ("ANY_STRING",)),
         (("ANY_UINT",), ("ANY_STRING",)),
@@ -147,17 +152,20 @@
         (("ANY_STRING",), ("ANY_BIT",)),
         (("ANY_STRING",), ("ANY_SINT",)),
         (("ANY_STRING",), ("ANY_UINT",)),
-        (("ANY_STRING",), ("ANY_REAL",))],
-    "BCD_TO_ANY":[
-        (("BYTE",),("USINT",)),
-        (("WORD",),("UINT",)),
-        (("DWORD",),("UDINT",)),
-        (("LWORD",),("ULINT",))],
-    "ANY_TO_BCD":[
-        (("USINT",),("BYTE",)),
-        (("UINT",),("WORD",)),
-        (("UDINT",),("DWORD",)),
-        (("ULINT",),("LWORD",))]
+        (("ANY_STRING",), ("ANY_REAL",))
+    ],
+    "BCD_TO_ANY": [
+        (("BYTE",),  ("USINT",)),
+        (("WORD",),  ("UINT",)),
+        (("DWORD",), ("UDINT",)),
+        (("LWORD",), ("ULINT",))
+    ],
+    "ANY_TO_BCD": [
+        (("USINT",), ("BYTE",)),
+        (("UINT",),  ("WORD",)),
+        (("UDINT",), ("DWORD",)),
+        (("ULINT",), ("LWORD",))
+    ]
 }
 
 # remove gettext override
--- a/plcopen/instance_tagname.xslt	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/instance_tagname.xslt	Mon Jan 07 13:50:39 2019 +0100
@@ -1,20 +1,12 @@
 <?xml version="1.0"?>
-<xsl:stylesheet xmlns:func="http://exslt.org/functions" xmlns:dyn="http://exslt.org/dynamic" xmlns:str="http://exslt.org/strings" xmlns:math="http://exslt.org/math" xmlns:exsl="http://exslt.org/common" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:yml="http://fdik.org/yml" xmlns:set="http://exslt.org/sets" xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" xmlns:ns="instance_tagname_ns" xmlns:regexp="http://exslt.org/regular-expressions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" extension-element-prefixes="ns" version="1.0" exclude-result-prefixes="ns">
+<xsl:stylesheet xmlns:exsl="http://exslt.org/common" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" xmlns:ns="beremiz" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" extension-element-prefixes="ns" version="1.0" exclude-result-prefixes="ns">
   <xsl:output method="xml"/>
-  <xsl:variable name="space" select="'                                                                                                                                                                                                        '"/>
-  <xsl:param name="autoindent" select="4"/>
   <xsl:param name="instance_path"/>
-  <xsl:variable name="project">
-    <xsl:copy-of select="document('project')/project/*"/>
-  </xsl:variable>
-  <xsl:variable name="stdlib">
-    <xsl:copy-of select="document('stdlib')/stdlib/*"/>
-  </xsl:variable>
-  <xsl:variable name="extensions">
-    <xsl:copy-of select="document('extensions')/extensions/*"/>
-  </xsl:variable>
+  <xsl:variable name="project" select="ns:GetProject()"/>
+  <xsl:variable name="stdlib" select="ns:GetStdLibs()"/>
+  <xsl:variable name="extensions" select="ns:GetExtensions()"/>
+  <xsl:variable name="all_types" select="($project | $stdlib | $extensions)/ppx:types"/>
   <xsl:template name="element_name">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="path"/>
     <xsl:choose>
       <xsl:when test="contains($path,'.')">
@@ -26,7 +18,6 @@
     </xsl:choose>
   </xsl:template>
   <xsl:template name="next_path">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="path"/>
     <xsl:choose>
       <xsl:when test="contains($path,'.')">
@@ -35,14 +26,12 @@
     </xsl:choose>
   </xsl:template>
   <xsl:template match="ppx:project">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="config_name">
       <xsl:call-template name="element_name">
         <xsl:with-param name="path" select="$instance_path"/>
       </xsl:call-template>
     </xsl:variable>
     <xsl:apply-templates select="ppx:instances/ppx:configurations/ppx:configuration[@name=$config_name]">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="element_path">
         <xsl:call-template name="next_path">
           <xsl:with-param name="path" select="$instance_path"/>
@@ -51,7 +40,6 @@
     </xsl:apply-templates>
   </xsl:template>
   <xsl:template match="ppx:configuration">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="element_path"/>
     <xsl:choose>
       <xsl:when test="$element_path!=''">
@@ -61,7 +49,6 @@
           </xsl:call-template>
         </xsl:variable>
         <xsl:apply-templates select="ppx:resource[@name=$child_name] | ppx:globalVars/ppx:variable[@name=$child_name]/ppx:type/*[self::ppx:derived or self::ppx:struct or self::ppx:array]">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
           <xsl:with-param name="element_path">
             <xsl:call-template name="next_path">
               <xsl:with-param name="path" select="$element_path"/>
@@ -75,7 +62,6 @@
     </xsl:choose>
   </xsl:template>
   <xsl:template match="ppx:resource">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="element_path"/>
     <xsl:choose>
       <xsl:when test="$element_path!=''">
@@ -87,7 +73,6 @@
           </xsl:call-template>
         </xsl:variable>
         <xsl:apply-templates select="ppx:pouInstance[@name=$child_name] | ppx:task/ppx:pouInstance[@name=$child_name] | ppx:globalVars/ppx:variable[@name=$child_name]/ppx:type/*[self::ppx:derived or self::ppx:struct or self::ppx:array]">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
           <xsl:with-param name="element_path">
             <xsl:call-template name="next_path">
               <xsl:with-param name="path" select="$element_path"/>
@@ -101,18 +86,15 @@
     </xsl:choose>
   </xsl:template>
   <xsl:template match="ppx:pouInstance">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="element_path"/>
     <xsl:variable name="type_name">
       <xsl:value-of select="@typeName"/>
     </xsl:variable>
-    <xsl:apply-templates select="exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                 exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                 exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                 exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                 exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                 exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
+    <xsl:apply-templates select="$all_types/ppx:pous/ppx:pou[@name=$type_name] |                  $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name]">
       <xsl:with-param name="element_path" select="$element_path"/>
     </xsl:apply-templates>
   </xsl:template>
   <xsl:template match="ppx:pou">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="element_path"/>
     <xsl:choose>
       <xsl:when test="$element_path!=''">
@@ -122,16 +104,13 @@
           </xsl:call-template>
         </xsl:variable>
         <xsl:apply-templates select="ppx:interface/*/ppx:variable[@name=$child_name]/ppx:type/*[self::ppx:derived or self::ppx:struct or self::ppx:array]">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
           <xsl:with-param name="element_path">
             <xsl:call-template name="next_path">
               <xsl:with-param name="path" select="$element_path"/>
             </xsl:call-template>
           </xsl:with-param>
         </xsl:apply-templates>
-        <xsl:apply-templates select="ppx:actions/ppx:action[@name=$child_name] | ppx:transitions/ppx:transition[@name=$child_name]">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-        </xsl:apply-templates>
+        <xsl:apply-templates select="ppx:actions/ppx:action[@name=$child_name] | ppx:transitions/ppx:transition[@name=$child_name]"/>
       </xsl:when>
       <xsl:otherwise>
         <xsl:variable name="name">
@@ -142,42 +121,33 @@
     </xsl:choose>
   </xsl:template>
   <xsl:template match="ppx:action">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="ns:ActionTagName(ancestor::ppx:pou/@name, @name)"/>
   </xsl:template>
   <xsl:template match="ppx:transition">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="ns:TransitionTagName(ancestor::ppx:pou/@name, @name)"/>
   </xsl:template>
   <xsl:template match="ppx:dataType">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="element_path"/>
     <xsl:apply-templates select="ppx:baseType/*[self::ppx:derived or self::ppx:struct or self::ppx:array]">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="element_path" select="$element_path"/>
     </xsl:apply-templates>
   </xsl:template>
   <xsl:template match="ppx:derived">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="element_path"/>
     <xsl:variable name="type_name">
       <xsl:value-of select="@name"/>
     </xsl:variable>
-    <xsl:apply-templates select="exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                 exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                 exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                 exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                 exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                 exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
+    <xsl:apply-templates select="$all_types/ppx:pous/ppx:pou[@name=$type_name] |                  $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name]">
       <xsl:with-param name="element_path" select="$element_path"/>
     </xsl:apply-templates>
   </xsl:template>
   <xsl:template match="ppx:array">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="element_path"/>
     <xsl:apply-templates select="ppx:baseType/*[self::ppx:derived or self::ppx:struct or self::ppx:array]">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="element_path" select="$element_path"/>
     </xsl:apply-templates>
   </xsl:template>
   <xsl:template match="ppx:struct">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="element_path"/>
     <xsl:variable name="child_name">
       <xsl:call-template name="element_name">
@@ -185,7 +155,6 @@
       </xsl:call-template>
     </xsl:variable>
     <xsl:apply-templates select="ppx:variable[@name=$child_name]/ppx:type/*[self::ppx:derived or self::ppx:struct or self::ppx:array]">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="element_path">
         <xsl:call-template name="next_path">
           <xsl:with-param name="path" select="$element_path"/>
--- a/plcopen/instance_tagname.ysl2	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/instance_tagname.ysl2	Mon Jan 07 13:50:39 2019 +0100
@@ -1,22 +1,19 @@
-include yslt.yml2
-estylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
+include yslt_noindent.yml2
+istylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
             xmlns:xhtml="http://www.w3.org/1999/xhtml"
-            xmlns:ns="instance_tagname_ns" 
+            xmlns:ns="beremiz" 
             extension-element-prefixes="ns" 
             exclude-result-prefixes="ns" {
     
     param "instance_path";
     
-    variable "project" {
-        copy "document('project')/project/*";
-    }
+    variable "project", "ns:GetProject()";
     
-    variable "stdlib" {
-        copy "document('stdlib')/stdlib/*";
-    }
-    variable "extensions" {
-        copy "document('extensions')/extensions/*";
-    }
+    variable "stdlib", "ns:GetStdLibs()";
+
+    variable "extensions", "ns:GetExtensions()";
+
+    variable "all_types", "($project | $stdlib | $extensions)/ppx:types";
     
     function "element_name" {
         param "path";
@@ -97,12 +94,8 @@
     template "ppx:pouInstance" {
         param "element_path";
         variable "type_name" > «@typeName»
-        apply """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                 exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
-                 exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                 exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
-                 exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                 exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]""" {
+        apply """$all_types/ppx:pous/ppx:pou[@name=$type_name] | \
+                 $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name]""" {
             with "element_path", "$element_path";
         }
     }
@@ -150,12 +143,8 @@
     template "ppx:derived" {
         param "element_path";
         variable "type_name" > «@name»
-        apply """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                 exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
-                 exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                 exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
-                 exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                 exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]""" {
+        apply """$all_types/ppx:pous/ppx:pou[@name=$type_name] | \
+                 $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name]""" {
             with "element_path", "$element_path";
         }
     }
--- a/plcopen/instances_path.xslt	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/instances_path.xslt	Mon Jan 07 13:50:39 2019 +0100
@@ -1,40 +1,23 @@
 <?xml version="1.0"?>
-<xsl:stylesheet xmlns:func="http://exslt.org/functions" xmlns:dyn="http://exslt.org/dynamic" xmlns:str="http://exslt.org/strings" xmlns:math="http://exslt.org/math" xmlns:exsl="http://exslt.org/common" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:yml="http://fdik.org/yml" xmlns:set="http://exslt.org/sets" xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" xmlns:ns="instances_ns" xmlns:regexp="http://exslt.org/regular-expressions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" extension-element-prefixes="ns" version="1.0" exclude-result-prefixes="ns">
+<xsl:stylesheet xmlns:exsl="http://exslt.org/common" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" xmlns:ns="beremiz" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" extension-element-prefixes="ns" version="1.0" exclude-result-prefixes="ns">
   <xsl:output method="xml"/>
-  <xsl:variable name="space" select="'                                                                                                                                                                                                        '"/>
-  <xsl:param name="autoindent" select="4"/>
   <xsl:param name="instance_type"/>
-  <xsl:template match="text()">
-    <xsl:param name="_indent" select="0"/>
-  </xsl:template>
-  <xsl:variable name="project">
-    <xsl:copy-of select="document('project')/project/*"/>
-  </xsl:variable>
-  <xsl:variable name="stdlib">
-    <xsl:copy-of select="document('stdlib')/stdlib/*"/>
-  </xsl:variable>
-  <xsl:variable name="extensions">
-    <xsl:copy-of select="document('extensions')/extensions/*"/>
-  </xsl:variable>
+  <xsl:template match="text()"/>
+  <xsl:variable name="project" select="ns:GetProject()"/>
+  <xsl:variable name="stdlib" select="ns:GetStdLibs()"/>
+  <xsl:variable name="extensions" select="ns:GetExtensions()"/>
+  <xsl:variable name="all_types" select="($project | $stdlib | $extensions)/ppx:types"/>
   <xsl:template match="ppx:project">
-    <xsl:param name="_indent" select="0"/>
-    <instances>
-      <xsl:apply-templates select="ppx:instances/ppx:configurations/ppx:configuration">
-        <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-      </xsl:apply-templates>
-    </instances>
+    <xsl:apply-templates select="ppx:instances/ppx:configurations/ppx:configuration"/>
   </xsl:template>
   <xsl:template match="ppx:configuration">
-    <xsl:param name="_indent" select="0"/>
     <xsl:apply-templates select="ppx:globalVars/ppx:variable[ppx:type/ppx:derived] | ppx:resource">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="parent_path">
         <xsl:value-of select="@name"/>
       </xsl:with-param>
     </xsl:apply-templates>
   </xsl:template>
   <xsl:template match="ppx:resource">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="parent_path"/>
     <xsl:variable name="resource_path">
       <xsl:value-of select="$parent_path"/>
@@ -42,14 +25,12 @@
       <xsl:value-of select="@name"/>
     </xsl:variable>
     <xsl:apply-templates select="ppx:globalVars/ppx:variable[ppx:type/ppx:derived] | ppx:pouInstance | ppx:task/ppx:pouInstance">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="parent_path">
         <xsl:value-of select="$resource_path"/>
       </xsl:with-param>
     </xsl:apply-templates>
   </xsl:template>
   <xsl:template match="ppx:pouInstance">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="parent_path"/>
     <xsl:variable name="pou_instance_path">
       <xsl:value-of select="$parent_path"/>
@@ -64,8 +45,7 @@
         <xsl:variable name="type_name">
           <xsl:value-of select="@typeName"/>
         </xsl:variable>
-        <xsl:apply-templates select="exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                         exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
+        <xsl:apply-templates select="$all_types/ppx:pous/ppx:pou[@name=$type_name] |                          $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name]">
           <xsl:with-param name="instance_path">
             <xsl:value-of select="$pou_instance_path"/>
           </xsl:with-param>
@@ -74,27 +54,22 @@
     </xsl:choose>
   </xsl:template>
   <xsl:template match="ppx:pou">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="instance_path"/>
     <xsl:apply-templates select="ppx:interface/*/ppx:variable[ppx:type/ppx:derived]">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="parent_path">
         <xsl:value-of select="$instance_path"/>
       </xsl:with-param>
     </xsl:apply-templates>
   </xsl:template>
   <xsl:template match="ppx:dataType">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="instance_path"/>
     <xsl:apply-templates select="ppx:baseType/*[self::ppx:derived or self::ppx:struct or self::ppx:array]">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="parent_path">
         <xsl:value-of select="$instance_path"/>
       </xsl:with-param>
     </xsl:apply-templates>
   </xsl:template>
   <xsl:template match="ppx:variable">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="parent_path"/>
     <xsl:variable name="variable_path">
       <xsl:value-of select="$parent_path"/>
@@ -102,14 +77,12 @@
       <xsl:value-of select="@name"/>
     </xsl:variable>
     <xsl:apply-templates select="ppx:type/ppx:derived">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="variable_path">
         <xsl:value-of select="$variable_path"/>
       </xsl:with-param>
     </xsl:apply-templates>
   </xsl:template>
   <xsl:template match="ppx:derived">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="variable_path"/>
     <xsl:choose>
       <xsl:when test="@name=$instance_type">
@@ -119,8 +92,7 @@
         <xsl:variable name="type_name">
           <xsl:value-of select="@name"/>
         </xsl:variable>
-        <xsl:apply-templates select="exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                         exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
+        <xsl:apply-templates select="$all_types/ppx:pous/ppx:pou[@name=$type_name] |                          $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name]">
           <xsl:with-param name="instance_path">
             <xsl:value-of select="$variable_path"/>
           </xsl:with-param>
@@ -129,7 +101,6 @@
     </xsl:choose>
   </xsl:template>
   <xsl:template match="ppx:struct">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="variable_path"/>
     <xsl:for-each select="ppx:variable[ppx:type/ppx:derived or ppx:type/ppx:struct or ppx:type/ppx:array]">
       <xsl:variable name="element_path">
@@ -139,17 +110,14 @@
       </xsl:variable>
     </xsl:for-each>
     <xsl:apply-templates select="ppx:type/*[self::ppx:derived or self::ppx:struct or self::ppx:array]">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="variable_path">
         <xsl:value-of select="$element_path"/>
       </xsl:with-param>
     </xsl:apply-templates>
   </xsl:template>
   <xsl:template match="ppx:array">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="variable_path"/>
     <xsl:apply-templates select="ppx:baseType/*[self::ppx:derived or self::ppx:struct or self::ppx:array]">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="variable_path">
         <xsl:value-of select="$variable_path"/>
       </xsl:with-param>
--- a/plcopen/instances_path.ysl2	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/instances_path.ysl2	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,7 @@
-include yslt.yml2
-estylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
+include yslt_noindent.yml2
+istylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
             xmlns:xhtml="http://www.w3.org/1999/xhtml"
-            xmlns:ns="instances_ns" 
+            xmlns:ns="beremiz" 
             extension-element-prefixes="ns" 
             exclude-result-prefixes="ns" {
     
@@ -9,21 +9,16 @@
     
     template "text()";
     
-    variable "project" {
-        copy "document('project')/project/*";
-    }
+    variable "project", "ns:GetProject()";
     
-    variable "stdlib" {
-        copy "document('stdlib')/stdlib/*";
-    }
-    variable "extensions" {
-        copy "document('extensions')/extensions/*";
-    }
-    
+    variable "stdlib", "ns:GetStdLibs()";
+
+    variable "extensions", "ns:GetExtensions()";
+
+    variable "all_types", "($project | $stdlib | $extensions)/ppx:types";
+
     template "ppx:project" {
-        instances {
-            apply "ppx:instances/ppx:configurations/ppx:configuration";
-        }
+        apply "ppx:instances/ppx:configurations/ppx:configuration";
     }
     
     template "ppx:configuration" {
@@ -49,12 +44,8 @@
             }
             otherwise {
                 variable "type_name" > «@typeName»
-                apply """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                         exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
-                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
-                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]""" {
+                apply """$all_types/ppx:pous/ppx:pou[@name=$type_name] | \
+                         $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name]""" {
                     with "instance_path" > «$pou_instance_path»
                 }
             }
@@ -91,12 +82,8 @@
             }
             otherwise {
                 variable "type_name" > «@name»
-                apply """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                         exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
-                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
-                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]""" {
+                apply """$all_types/ppx:pous/ppx:pou[@name=$type_name] | \
+                         $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name]""" {
                     with "instance_path" > «$variable_path»
                 }
             }
--- a/plcopen/plcopen.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/plcopen.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -22,39 +23,63 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+from __future__ import division
+import re
+from collections import OrderedDict
+
+from six.moves import xrange
+from lxml import etree
+
 from xmlclass import *
-from types import *
-import os, re
-from lxml import etree
-from collections import OrderedDict
-
-"""
-Dictionary that makes the relation between var names in plcopen and displayed values
-"""
-VarTypes = {"Local" : "localVars", "Temp" : "tempVars", "Input" : "inputVars",
-            "Output" : "outputVars", "InOut" : "inOutVars", "External" : "externalVars",
-            "Global" : "globalVars", "Access" : "accessVars"}
+import util.paths as paths
+
+
+#: Dictionary that makes the relation between var names
+#: in plcopen and displayed values
+
+VarTypes = {
+    "Local":    "localVars",
+    "Temp":     "tempVars",
+    "Input":    "inputVars",
+    "Output":   "outputVars",
+    "InOut":    "inOutVars",
+    "External": "externalVars",
+    "Global":   "globalVars",
+    "Access":   "accessVars"
+}
 
 searchResultVarTypes = {
-    "inputVars": "var_input",
+    "inputVars":  "var_input",
     "outputVars": "var_output",
-    "inOutVars": "var_inout"
+    "inOutVars":  "var_inout"
 }
 
-"""
-Define in which order var types must be displayed
-"""
-VarOrder = ["Local","Temp","Input","Output","InOut","External","Global","Access"]
-
-"""
-Define which action qualifier must be associated with a duration 
-"""
-QualifierList = OrderedDict([("N", False), ("R", False), ("S", False), 
-    ("L", True), ("D", True), ("P", False), ("P0", False), 
-    ("P1", False), ("SD", True), ("DS", True), ("SL", True)])
-
-
-FILTER_ADDRESS_MODEL = "(%%[IQM](?:[XBWDL])?)(%s)((?:\.[0-9]+)*)" 
+
+#: Define in which order var types must be displayed
+
+VarOrder = ["Local", "Temp", "Input", "Output", "InOut", "External", "Global", "Access"]
+
+
+#:  Define which action qualifier must be associated with a duration
+
+QualifierList = OrderedDict([
+    ("N", False),
+    ("R", False),
+    ("S", False),
+    ("L", True),
+    ("D", True),
+    ("P", False),
+    ("P0", False),
+    ("P1", False),
+    ("SD", True),
+    ("DS", True),
+    ("SL", True)])
+
+
+FILTER_ADDRESS_MODEL = r"(%%[IQM](?:[XBWDL])?)(%s)((?:\.[0-9]+)*)"
+
 
 def update_address(address, address_model, new_leading):
     result = address_model.match(address)
@@ -63,6 +88,7 @@
     groups = result.groups()
     return groups[0] + new_leading + groups[2]
 
+
 def _init_and_compare(function, v1, v2):
     if v1 is None:
         return v2
@@ -70,11 +96,12 @@
         return function(v1, v2)
     return v1
 
-"""
-Helper class for bounding_box calculation 
-"""
-class rect:
-    
+
+class rect(object):
+    """
+    Helper class for bounding_box calculation
+    """
+
     def __init__(self, x=None, y=None, width=None, height=None):
         self.x_min = x
         self.x_max = None
@@ -84,19 +111,19 @@
             self.x_max = x + width
         if height is not None and y is not None:
             self.y_max = y + height
-    
+
     def update(self, x, y):
         self.x_min = _init_and_compare(min, self.x_min, x)
         self.x_max = _init_and_compare(max, self.x_max, x)
         self.y_min = _init_and_compare(min, self.y_min, y)
         self.y_max = _init_and_compare(max, self.y_max, y)
-        
+
     def union(self, rect):
         self.x_min = _init_and_compare(min, self.x_min, rect.x_min)
         self.x_max = _init_and_compare(max, self.x_max, rect.x_max)
         self.y_min = _init_and_compare(min, self.y_min, rect.y_min)
         self.y_max = _init_and_compare(max, self.y_max, rect.y_max)
-    
+
     def bounding_box(self):
         width = height = None
         if self.x_min is not None and self.x_max is not None:
@@ -105,12 +132,14 @@
             height = self.y_max - self.y_min
         return self.x_min, self.y_min, width, height
 
+
 def TextLenInRowColumn(text):
     if text == "":
         return (0, 0)
     lines = text.split("\n")
     return len(lines) - 1, len(lines[-1])
 
+
 def CompilePattern(criteria):
     flag = 0 if criteria["case_sensitive"] else re.IGNORECASE
     find_pattern = criteria["find_pattern"]
@@ -118,29 +147,39 @@
         find_pattern = re.escape(find_pattern)
     criteria["pattern"] = re.compile(find_pattern, flag)
 
+
 def TestTextElement(text, criteria):
     lines = text.splitlines()
     test_result = []
     result = criteria["pattern"].search(text)
     while result is not None:
+        prev_pos = result.span()[1]
         start = TextLenInRowColumn(text[:result.start()])
         end = TextLenInRowColumn(text[:result.end() - 1])
         test_result.append((start, end, "\n".join(lines[start[0]:end[0] + 1])))
         result = criteria["pattern"].search(text, result.end())
+        if result is not None and prev_pos == result.end():
+            break
     return test_result
 
+
 def TextMatched(str1, str2):
     return str1 and str2 and (str1.upper() == str2.upper())
 
-PLCOpenParser = GenerateParserFromXSD(os.path.join(os.path.split(__file__)[0], "tc6_xml_v201.xsd"))
-PLCOpen_XPath = lambda xpath: etree.XPath(xpath, namespaces=PLCOpenParser.NSMAP)
+
+PLCOpenParser = GenerateParserFromXSD(paths.AbsNeighbourFile(__file__, "tc6_xml_v201.xsd"))
+
+
+def PLCOpen_XPath(xpath):
+    return etree.XPath(xpath, namespaces=PLCOpenParser.NSMAP)
+
 
 LOAD_POU_PROJECT_TEMPLATE = """
-<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" 
-         xmlns:xhtml="http://www.w3.org/1999/xhtml" 
-         xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
+<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201"
+         xmlns:xhtml="http://www.w3.org/1999/xhtml"
+         xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns="http://www.plcopen.org/xml/tc6_0201">
-  <fileHeader companyName="" productName="" productVersion="" 
+  <fileHeader companyName="" productName="" productVersion=""
               creationDateTime="1970-01-01T00:00:00"/>
   <contentHeader name="paste_project">
     <coordinateInfo>
@@ -159,6 +198,7 @@
 </project>
 """
 
+
 def LOAD_POU_INSTANCES_PROJECT_TEMPLATE(body_type):
     return LOAD_POU_PROJECT_TEMPLATE % """
 <pou name="paste_pou" pouType="program">
@@ -167,12 +207,13 @@
   </body>
 </pou>""" % locals()
 
-PLCOpen_v1_file = open(os.path.join(os.path.split(__file__)[0], "TC6_XML_V10_B.xsd"))
+
+PLCOpen_v1_file = open(paths.AbsNeighbourFile(__file__, "TC6_XML_V10_B.xsd"))
 PLCOpen_v1_xml = PLCOpen_v1_file.read()
 PLCOpen_v1_file.close()
 PLCOpen_v1_xml = PLCOpen_v1_xml.replace(
-        "http://www.plcopen.org/xml/tc6.xsd", 
-        "http://www.plcopen.org/xml/tc6_0201") 
+    "http://www.plcopen.org/xml/tc6.xsd",
+    "http://www.plcopen.org/xml/tc6_0201")
 PLCOpen_v1_xsd = etree.XMLSchema(etree.fromstring(PLCOpen_v1_xml))
 
 # XPath for file compatibility process
@@ -183,23 +224,24 @@
 ActionBlocksXPath = PLCOpen_XPath("ppx:types/ppx:pous/ppx:pou/ppx:body/*/ppx:actionBlock")
 ActionBlocksConnectionPointOutXPath = PLCOpen_XPath("ppx:connectionPointOut")
 
+
 def LoadProjectXML(project_xml):
     project_xml = project_xml.replace(
-        "http://www.plcopen.org/xml/tc6.xsd", 
+        "http://www.plcopen.org/xml/tc6.xsd",
         "http://www.plcopen.org/xml/tc6_0201")
     for cre, repl in [
-        (re.compile("(?<!<xhtml:p>)(?:<!\[CDATA\[)"), "<xhtml:p><![CDATA["),
-        (re.compile("(?:]]>)(?!</xhtml:p>)"), "]]></xhtml:p>")]:
+            (re.compile(r"(?<!<xhtml:p>)(?:<!\[CDATA\[)"), "<xhtml:p><![CDATA["),
+            (re.compile(r"(?:]]>)(?!</xhtml:p>)"), "]]></xhtml:p>")]:
         project_xml = cre.sub(repl, project_xml)
-    
+
     try:
         tree, error = PLCOpenParser.LoadXMLString(project_xml)
         if error is None:
             return tree, None
-        
+
         if PLCOpen_v1_xsd.validate(tree):
             # Make file compatible with PLCOpen v2
-            
+
             # Update resource interval value
             for resource in ProjectResourcesXPath(tree):
                 for task in resource.gettask():
@@ -213,24 +255,24 @@
                             time_values.extend([int(seconds), int((seconds % 1) * 1000000)])
                             text = "T#"
                             if time_values[0] != 0:
-                                text += "%dh"%time_values[0]
+                                text += "%dh" % time_values[0]
                             if time_values[1] != 0:
-                                text += "%dm"%time_values[1]
+                                text += "%dm" % time_values[1]
                             if time_values[2] != 0:
-                                text += "%ds"%time_values[2]
+                                text += "%ds" % time_values[2]
                             if time_values[3] != 0:
                                 if time_values[3] % 1000 != 0:
-                                    text += "%.3fms"%(float(time_values[3]) / 1000)
+                                    text += "%.3fms" % (time_values[3] / 1000)
                                 else:
-                                    text += "%dms"%(time_values[3] / 1000)
+                                    text += "%dms" % (time_values[3] // 1000)
                             task.set("interval", text)
-                
+
                 # Update resources pou instance attributes
                 for pouInstance in ResourceInstancesXpath(resource):
                     type_name = pouInstance.attrib.pop("type")
                     if type_name is not None:
                         pouInstance.set("typeName", type_name)
-            
+
             # Update transitions condition
             for transition_condition in TransitionsConditionXPath(tree):
                 connections = ConditionConnectionsXPath(transition_condition)
@@ -240,25 +282,26 @@
                     connectionPointIn.setrelPositionXY(0, 0)
                     for connection in connections:
                         connectionPointIn.append(connection)
-            
+
             # Update actionBlocks
             for actionBlock in ActionBlocksXPath(tree):
                 for connectionPointOut in ActionBlocksConnectionPointOutXPath(actionBlock):
                     actionBlock.remove(connectionPointOut)
-                    
+
                 for action in actionBlock.getaction():
                     action.set("localId", "0")
                     relPosition = PLCOpenParser.CreateElement("relPosition", "action")
                     relPosition.set("x", "0")
                     relPosition.set("y", "0")
                     action.setrelPosition(relPosition)
-            
+
             return tree, None
-        
+
         return tree, error
-    
-    except Exception, e:
-        return None, e.message
+
+    except Exception as e:
+        return None, str(e)
+
 
 def LoadProject(filepath):
     project_file = open(filepath)
@@ -266,38 +309,48 @@
     project_file.close()
     return LoadProjectXML(project_xml)
 
+
 project_pou_xpath = PLCOpen_XPath("/ppx:project/ppx:types/ppx:pous/ppx:pou")
+
+
 def LoadPou(xml_string):
     root, error = LoadProjectXML(LOAD_POU_PROJECT_TEMPLATE % xml_string)
     return project_pou_xpath(root)[0], error
 
+
 project_pou_instances_xpath = {
     body_type: PLCOpen_XPath(
         "/ppx:project/ppx:types/ppx:pous/ppx:pou[@name='paste_pou']/ppx:body/ppx:%s/*" % body_type)
     for body_type in ["FBD", "LD", "SFC"]}
+
+
 def LoadPouInstances(xml_string, body_type):
     root, error = LoadProjectXML(
         LOAD_POU_INSTANCES_PROJECT_TEMPLATE(body_type) % xml_string)
     return project_pou_instances_xpath[body_type](root), error
 
+
 def SaveProject(project, filepath):
     project_file = open(filepath, 'w')
     project_file.write(etree.tostring(
-        project, 
-        pretty_print=True, 
-        xml_declaration=True, 
+        project,
+        pretty_print=True,
+        xml_declaration=True,
         encoding='utf-8'))
     project_file.close()
 
-cls = PLCOpenParser.GetElementClass("formattedText")
-if cls:
+
+# ----------------------------------------------------------------------
+
+
+def _updateFormattedTextClass(cls):
     def updateElementName(self, old_name, new_name):
         text = self.getanyText()
         pattern = re.compile('\\b' + old_name + '\\b', re.IGNORECASE)
         text = pattern.sub(new_name, text)
         self.setanyText(text)
     setattr(cls, "updateElementName", updateElementName)
-    
+
     def updateElementAddress(self, address_model, new_leading):
         text = self.getanyText()
         startpos = 0
@@ -310,28 +363,35 @@
             result = address_model.search(text, startpos)
         self.setanyText(text)
     setattr(cls, "updateElementAddress", updateElementAddress)
-    
+
     def hasblock(self, block_type):
-        text = self.getanyText()        
+        text = self.getanyText()
         pattern = re.compile('\\b' + block_type + '\\b', re.IGNORECASE)
         return pattern.search(text) is not None
     setattr(cls, "hasblock", hasblock)
-    
+
     def Search(self, criteria, parent_infos):
         return [(tuple(parent_infos),) + result for result in TestTextElement(self.getanyText(), criteria)]
     setattr(cls, "Search", Search)
-    
-cls = PLCOpenParser.GetElementClass("project")
-if cls:
-    
+
+
+cls = PLCOpenParser.GetElementClass("formattedText")
+if cls:
+    _updateFormattedTextClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateProjectClass(cls):
     def setname(self, name):
         self.contentHeader.setname(name)
     setattr(cls, "setname", setname)
-        
+
     def getname(self):
         return self.contentHeader.getname()
     setattr(cls, "getname", getname)
-    
+
     def getfileHeader(self):
         fileheader_obj = self.fileHeader
         return {
@@ -346,7 +406,7 @@
                 ("contentDescription", fileheader_obj.getcontentDescription())]
         }
     setattr(cls, "getfileHeader", getfileHeader)
-    
+
     def setfileHeader(self, fileheader):
         fileheader_obj = self.fileHeader
         for attr in ["companyName", "companyURL", "productName",
@@ -356,7 +416,7 @@
             if value is not None:
                 setattr(fileheader_obj, attr, value)
     setattr(cls, "setfileHeader", setfileHeader)
-    
+
     def getcontentHeader(self):
         contentheader_obj = self.contentHeader
         contentheader = {
@@ -373,7 +433,7 @@
         contentheader["scaling"] = self.contentHeader.getscaling()
         return contentheader
     setattr(cls, "getcontentHeader", getcontentHeader)
-    
+
     def setcontentHeader(self, contentheader):
         contentheader_obj = self.contentHeader
         for attr, value in contentheader.iteritems():
@@ -382,79 +442,84 @@
                     "authorName": contentheader_obj.setauthor,
                     "pageSize": lambda v: contentheader_obj.setpageSize(*v),
                     "scaling": contentheader_obj.setscaling}.get(attr)
-            if func is not None:
+            if func is not None and value is not None:
                 func(value)
             elif attr in ["modificationDateTime", "organization", "language"]:
                 setattr(contentheader_obj, attr, value)
     setattr(cls, "setcontentHeader", setcontentHeader)
-    
+
     def gettypeElementFunc(element_type):
         elements_xpath = PLCOpen_XPath(
             "ppx:types/ppx:%(element_type)ss/ppx:%(element_type)s[@name=$name]" % locals())
+
         def gettypeElement(self, name):
             elements = elements_xpath(self, name=name)
             if len(elements) == 1:
                 return elements[0]
             return None
         return gettypeElement
-    
+
     datatypes_xpath = PLCOpen_XPath("ppx:types/ppx:dataTypes/ppx:dataType")
     filtered_datatypes_xpath = PLCOpen_XPath(
         "ppx:types/ppx:dataTypes/ppx:dataType[@name!=$exclude]")
+
     def getdataTypes(self, exclude=None):
         if exclude is not None:
             return filtered_datatypes_xpath(self, exclude=exclude)
         return datatypes_xpath(self)
     setattr(cls, "getdataTypes", getdataTypes)
-    
+
     setattr(cls, "getdataType", gettypeElementFunc("dataType"))
-    
+
     def appenddataType(self, name):
         if self.getdataType(name) is not None:
-            raise ValueError, "\"%s\" Data Type already exists !!!"%name
+            raise ValueError("\"%s\" Data Type already exists !!!" % name)
         self.types.appenddataTypeElement(name)
     setattr(cls, "appenddataType", appenddataType)
-        
+
     def insertdataType(self, index, datatype):
         self.types.insertdataTypeElement(index, datatype)
     setattr(cls, "insertdataType", insertdataType)
-    
+
     def removedataType(self, name):
         self.types.removedataTypeElement(name)
     setattr(cls, "removedataType", removedataType)
-    
-    def getpous(self, exclude=None, filter=[]):
+
+    def getpous(self, exclude=None, filter=None):
+        filter = [] if filter is None else filter
         return self.xpath(
-            "ppx:types/ppx:pous/ppx:pou%s%s" % 
-                (("[@name!='%s']" % exclude) if exclude is not None else '',
-                 ("[%s]" % " or ".join(
-                    map(lambda x: "@pouType='%s'" % x, filter)))
-                 if len(filter) > 0 else ""),
+            "ppx:types/ppx:pous/ppx:pou%s%s" %
+            (("[@name!='%s']" % exclude) if exclude is not None else '',
+             ("[%s]" % " or ".join(
+                 map(lambda x: "@pouType='%s'" % x, filter)))
+             if len(filter) > 0 else ""),
             namespaces=PLCOpenParser.NSMAP)
     setattr(cls, "getpous", getpous)
-    
+
     setattr(cls, "getpou", gettypeElementFunc("pou"))
-    
+
     def appendpou(self, name, pou_type, body_type):
         self.types.appendpouElement(name, pou_type, body_type)
     setattr(cls, "appendpou", appendpou)
-        
+
     def insertpou(self, index, pou):
         self.types.insertpouElement(index, pou)
     setattr(cls, "insertpou", insertpou)
-    
+
     def removepou(self, name):
         self.types.removepouElement(name)
     setattr(cls, "removepou", removepou)
 
     configurations_xpath = PLCOpen_XPath(
         "ppx:instances/ppx:configurations/ppx:configuration")
+
     def getconfigurations(self):
         return configurations_xpath(self)
     setattr(cls, "getconfigurations", getconfigurations)
 
     configuration_xpath = PLCOpen_XPath(
         "ppx:instances/ppx:configurations/ppx:configuration[@name=$name]")
+
     def getconfiguration(self, name):
         configurations = configuration_xpath(self, name=name)
         if len(configurations) == 1:
@@ -464,21 +529,22 @@
 
     def addconfiguration(self, name):
         if self.getconfiguration(name) is not None:
-            raise ValueError, _("\"%s\" configuration already exists !!!") % name
+            raise ValueError(_("\"%s\" configuration already exists !!!") % name)
         new_configuration = PLCOpenParser.CreateElement("configuration", "configurations")
         new_configuration.setname(name)
         self.instances.configurations.appendconfiguration(new_configuration)
-    setattr(cls, "addconfiguration", addconfiguration)    
+    setattr(cls, "addconfiguration", addconfiguration)
 
     def removeconfiguration(self, name):
         configuration = self.getconfiguration(name)
         if configuration is None:
-            raise ValueError, ("\"%s\" configuration doesn't exist !!!") % name
+            raise ValueError(_("\"%s\" configuration doesn't exist !!!") % name)
         self.instances.configurations.remove(configuration)
     setattr(cls, "removeconfiguration", removeconfiguration)
-    
+
     resources_xpath = PLCOpen_XPath(
         "ppx:instances/ppx:configurations/ppx:configuration[@name=$configname]/ppx:resource[@name=$name]")
+
     def getconfigurationResource(self, config_name, name):
         resources = resources_xpath(self, configname=config_name, name=name)
         if len(resources) == 1:
@@ -488,8 +554,10 @@
 
     def addconfigurationResource(self, config_name, name):
         if self.getconfigurationResource(config_name, name) is not None:
-            msg = _("\"{a1}\" resource already exists in \"{a2}\" configuration !!!").format(a1 = name, a2 = config_name)
-            raise ValueError, msg
+            raise ValueError(
+                _("\"{a1}\" resource already exists in \"{a2}\" configuration !!!").
+                format(a1=name, a2=config_name))
+
         configuration = self.getconfiguration(config_name)
         if configuration is not None:
             new_resource = PLCOpenParser.CreateElement("resource", "configuration")
@@ -506,8 +574,10 @@
                 configuration.remove(resource)
                 found = True
         if not found:
-            msg = _("\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!").format(a1 = name, a2 = config_name)
-            raise ValueError, msg
+            raise ValueError(
+                _("\"{a1}\" resource doesn't exist in \"{a2}\" configuration !!!").
+                format(a1=name, a2=config_name))
+
     setattr(cls, "removeconfigurationResource", removeconfigurationResource)
 
     def updateElementName(self, old_name, new_name):
@@ -544,24 +614,33 @@
 
     enumerated_values_xpath = PLCOpen_XPath(
         "ppx:types/ppx:dataTypes/ppx:dataType/ppx:baseType/ppx:enum/ppx:values/ppx:value")
+
     def GetEnumeratedDataTypeValues(self):
         return [value.getname() for value in enumerated_values_xpath(self)]
     setattr(cls, "GetEnumeratedDataTypeValues", GetEnumeratedDataTypeValues)
 
-    def Search(self, criteria, parent_infos=[]):
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         result = self.types.Search(criteria, parent_infos)
         for configuration in self.instances.configurations.getconfiguration():
             result.extend(configuration.Search(criteria, parent_infos))
         return result
     setattr(cls, "Search", Search)
 
-cls = PLCOpenParser.GetElementClass("contentHeader", "project")
-if cls:
-    
+
+cls = PLCOpenParser.GetElementClass("project")
+if cls:
+    _updateProjectClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateContentHeaderProjectClass(cls):
     def setpageSize(self, width, height):
         self.coordinateInfo.setpageSize(width, height)
     setattr(cls, "setpageSize", setpageSize)
-    
+
     def getpageSize(self):
         return self.coordinateInfo.getpageSize()
     setattr(cls, "getpageSize", getpageSize)
@@ -570,7 +649,7 @@
         for language, (x, y) in scaling.items():
             self.coordinateInfo.setscaling(language, x, y)
     setattr(cls, "setscaling", setscaling)
-    
+
     def getscaling(self):
         scaling = {}
         scaling["FBD"] = self.coordinateInfo.getscaling("FBD")
@@ -579,8 +658,16 @@
         return scaling
     setattr(cls, "getscaling", getscaling)
 
-cls = PLCOpenParser.GetElementClass("coordinateInfo", "contentHeader")
-if cls:
+
+cls = PLCOpenParser.GetElementClass("contentHeader", "project")
+if cls:
+    _updateContentHeaderProjectClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateCoordinateInfoContentHeaderClass(cls):
     def setpageSize(self, width, height):
         if width == 0 and height == 0:
             self.deletepageSize()
@@ -590,7 +677,7 @@
             self.pageSize.setx(width)
             self.pageSize.sety(height)
     setattr(cls, "setpageSize", setpageSize)
-    
+
     def getpageSize(self):
         if self.pageSize is not None:
             return self.pageSize.getx(), self.pageSize.gety()
@@ -608,7 +695,7 @@
             self.sfc.scaling.setx(x)
             self.sfc.scaling.sety(y)
     setattr(cls, "setscaling", setscaling)
-    
+
     def getscaling(self, language):
         if language == "FBD":
             return self.fbd.scaling.getx(), self.fbd.scaling.gety()
@@ -619,6 +706,15 @@
         return 0, 0
     setattr(cls, "getscaling", getscaling)
 
+
+cls = PLCOpenParser.GetElementClass("coordinateInfo", "contentHeader")
+if cls:
+    _updateCoordinateInfoContentHeaderClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
 def _Search(attributes, criteria, parent_infos):
     search_result = []
     for attr, value in attributes:
@@ -626,6 +722,7 @@
             search_result.extend([(tuple(parent_infos + [attr]),) + result for result in TestTextElement(value, criteria)])
     return search_result
 
+
 def _updateConfigurationResourceElementName(self, old_name, new_name):
     for varlist in self.getglobalVars():
         for var in varlist.getvariable():
@@ -636,6 +733,7 @@
                 if TextMatched(var.getname(), old_name):
                     var.setname(new_name)
 
+
 def _updateConfigurationResourceElementAddress(self, address_model, new_leading):
     for varlist in self.getglobalVars():
         for var in varlist.getvariable():
@@ -643,6 +741,7 @@
             if var_address is not None:
                 var.setaddress(update_address(var_address, address_model, new_leading))
 
+
 def _removeConfigurationResourceVariableByAddress(self, address):
     for varlist in self.getglobalVars():
         variables = varlist.getvariable()
@@ -650,6 +749,7 @@
             if variables[i].getaddress() == address:
                 variables.remove(variables[i])
 
+
 def _removeConfigurationResourceVariableByFilter(self, address_model):
     for varlist in self.getglobalVars():
         variables = varlist.getvariable()
@@ -660,7 +760,9 @@
                 if result is not None:
                     variables.remove(variables[i])
 
-def _SearchInConfigurationResource(self, criteria, parent_infos=[]):
+
+def _SearchInConfigurationResource(self, criteria, parent_infos=None):
+    parent_infos = [] if parent_infos is None else parent_infos
     search_result = _Search([("name", self.getname())], criteria, parent_infos)
     var_number = 0
     for varlist in self.getglobalVars():
@@ -678,9 +780,11 @@
             var_number += 1
     return search_result
 
-cls = PLCOpenParser.GetElementClass("configuration", "configurations")
-if cls:
-    
+
+# ----------------------------------------------------------------------
+
+
+def _updateConfigurationConfigurationsClass(cls):
     def addglobalVar(self, var_type, name, location="", description=""):
         globalvars = self.getglobalVars()
         if len(globalvars) == 0:
@@ -696,7 +800,7 @@
             var.setdocumentation(ft)
         globalvars[-1].appendvariable(var)
     setattr(cls, "addglobalVar", addglobalVar)
-    
+
     def updateElementName(self, old_name, new_name):
         _updateConfigurationResourceElementName(self, old_name, new_name)
         for resource in self.getresource():
@@ -712,7 +816,8 @@
     setattr(cls, "removeVariableByAddress", _removeConfigurationResourceVariableByAddress)
     setattr(cls, "removeVariableByFilter", _removeConfigurationResourceVariableByFilter)
 
-    def Search(self, criteria, parent_infos=[]):
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         search_result = []
         parent_infos = parent_infos + ["C::%s" % self.getname()]
         filter = criteria["filter"]
@@ -722,9 +827,17 @@
                 search_result.extend(resource.Search(criteria, parent_infos))
         return search_result
     setattr(cls, "Search", Search)
-    
-cls = PLCOpenParser.GetElementClass("resource", "configuration")
-if cls:
+
+
+cls = PLCOpenParser.GetElementClass("configuration", "configurations")
+if cls:
+    _updateConfigurationConfigurationsClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateResourceConfigurationClass(cls):
     def updateElementName(self, old_name, new_name):
         _updateConfigurationResourceElementName(self, old_name, new_name)
         for instance in self.getpouInstance():
@@ -742,7 +855,8 @@
     setattr(cls, "removeVariableByAddress", _removeConfigurationResourceVariableByAddress)
     setattr(cls, "removeVariableByFilter", _removeConfigurationResourceVariableByFilter)
 
-    def Search(self, criteria, parent_infos=[]):
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         parent_infos = parent_infos[:-1] + ["R::%s::%s" % (parent_infos[-1].split("::")[1], self.getname())]
         search_result = _SearchInConfigurationResource(self, criteria, parent_infos)
         task_number = 0
@@ -764,8 +878,16 @@
         return search_result
     setattr(cls, "Search", Search)
 
-cls = PLCOpenParser.GetElementClass("task", "resource")
-if cls:
+
+cls = PLCOpenParser.GetElementClass("resource", "configuration")
+if cls:
+    _updateResourceConfigurationClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateTaskResourceClass(cls):
     def updateElementName(self, old_name, new_name):
         if TextMatched(self.single, old_name):
             self.single = new_name
@@ -782,28 +904,46 @@
             self.interval = update_address(self.interval, address_model, new_leading)
     setattr(cls, "updateElementAddress", updateElementAddress)
 
-    def Search(self, criteria, parent_infos=[]):
-        return _Search([("single", self.getsingle()), 
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
+        return _Search([("single", self.getsingle()),
                         ("interval", self.getinterval()),
                         ("priority", str(self.getpriority()))],
                        criteria, parent_infos)
     setattr(cls, "Search", Search)
 
-cls = PLCOpenParser.GetElementClass("pouInstance")
-if cls:
+
+cls = PLCOpenParser.GetElementClass("task", "resource")
+if cls:
+    _updateTaskResourceClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updatePouInstanceClass(cls):
     def updateElementName(self, old_name, new_name):
         if TextMatched(self.typeName, old_name):
             self.typeName = new_name
     setattr(cls, "updateElementName", updateElementName)
 
-    def Search(self, criteria, parent_infos=[]):
-        return _Search([("name", self.getname()), 
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
+        return _Search([("name", self.getname()),
                         ("type", self.gettypeName())],
                        criteria, parent_infos)
     setattr(cls, "Search", Search)
 
-cls = PLCOpenParser.GetElementClass("variable", "varListPlain")
-if cls:
+
+cls = PLCOpenParser.GetElementClass("pouInstance")
+if cls:
+    _updatePouInstanceClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateVariableVarListPlain(cls):
     def gettypeAsText(self):
         vartype_content = self.gettype().getcontent()
         vartype_content_name = vartype_content.getLocalTag()
@@ -817,22 +957,23 @@
         elif vartype_content_name == "array":
             base_type = vartype_content.baseType.getcontent()
             base_type_name = base_type.getLocalTag()
-            # Array derived directly from a user defined type 
+            # Array derived directly from a user defined type
             if base_type_name == "derived":
                 basetype_name = base_type.getname()
-            # Array derived directly from a string type 
+            # Array derived directly from a string type
             elif base_type_name in ["string", "wstring"]:
                 basetype_name = base_type_name.upper()
-            # Array derived directly from an elementary type 
+            # Array derived directly from an elementary type
             else:
                 basetype_name = base_type_name
-            return "ARRAY [%s] OF %s" % (",".join(map(lambda x : "%s..%s" % (x.getlower(), x.getupper()), vartype_content.getdimension())), basetype_name)
+            return "ARRAY [%s] OF %s" % (",".join(map(lambda x: "%s..%s" % (x.getlower(), x.getupper()), vartype_content.getdimension())), basetype_name)
         # Variable type is an elementary type
         return vartype_content_name
     setattr(cls, "gettypeAsText", gettypeAsText)
-    
-    def Search(self, criteria, parent_infos=[]):
-        search_result = _Search([("name", self.getname()), 
+
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
+        search_result = _Search([("name", self.getname()),
                                  ("type", self.gettypeAsText()),
                                  ("location", self.getaddress())],
                                 criteria, parent_infos)
@@ -845,12 +986,20 @@
         return search_result
     setattr(cls, "Search", Search)
 
-cls = PLCOpenParser.GetElementClass("types", "project")
-if cls:
+
+cls = PLCOpenParser.GetElementClass("variable", "varListPlain")
+if cls:
+    _updateVariableVarListPlain(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateTypesProjectClass(cls):
     def getdataTypeElements(self):
         return self.dataTypes.getdataType()
     setattr(cls, "getdataTypeElements", getdataTypeElements)
-    
+
     def getdataTypeElement(self, name):
         elements = self.dataTypes.getdataType()
         for element in elements:
@@ -865,11 +1014,11 @@
         new_datatype.setname(name)
         new_datatype.baseType.setcontent(PLCOpenParser.CreateElement("BOOL", "dataType"))
     setattr(cls, "appenddataTypeElement", appenddataTypeElement)
-    
+
     def insertdataTypeElement(self, index, dataType):
         self.dataTypes.insertdataType(index, dataType)
     setattr(cls, "insertdataTypeElement", insertdataTypeElement)
-    
+
     def removedataTypeElement(self, name):
         found = False
         for element in self.dataTypes.getdataType():
@@ -878,13 +1027,13 @@
                 found = True
                 break
         if not found:
-            raise ValueError, _("\"%s\" Data Type doesn't exist !!!")%name
+            raise ValueError(_("\"%s\" Data Type doesn't exist !!!") % name)
     setattr(cls, "removedataTypeElement", removedataTypeElement)
-    
+
     def getpouElements(self):
         return self.pous.getpou()
     setattr(cls, "getpouElements", getpouElements)
-    
+
     def getpouElement(self, name):
         elements = self.pous.getpou()
         for element in elements:
@@ -896,7 +1045,7 @@
     def appendpouElement(self, name, pou_type, body_type):
         for element in self.pous.getpou():
             if TextMatched(element.getname(), name):
-                raise ValueError, _("\"%s\" POU already exists !!!")%name
+                raise ValueError(_("\"%s\" POU already exists !!!") % name)
         new_pou = PLCOpenParser.CreateElement("pou", "pous")
         self.pous.appendpou(new_pou)
         new_pou.setname(name)
@@ -904,11 +1053,11 @@
         new_pou.appendbody(PLCOpenParser.CreateElement("body", "pou"))
         new_pou.setbodyType(body_type)
     setattr(cls, "appendpouElement", appendpouElement)
-        
+
     def insertpouElement(self, index, pou):
         self.pous.insertpou(index, pou)
     setattr(cls, "insertpouElement", insertpouElement)
-    
+
     def removepouElement(self, name):
         found = False
         for element in self.pous.getpou():
@@ -917,12 +1066,12 @@
                 found = True
                 break
         if not found:
-            raise ValueError, _("\"%s\" POU doesn't exist !!!")%name
+            raise ValueError(_("\"%s\" POU doesn't exist !!!") % name)
     setattr(cls, "removepouElement", removepouElement)
 
-    def Search(self, criteria, parent_infos=[]):
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         search_result = []
-        filter = criteria["filter"]
         for datatype in self.dataTypes.getdataType():
             search_result.extend(datatype.Search(criteria, parent_infos))
         for pou in self.pous.getpou():
@@ -930,14 +1079,24 @@
         return search_result
     setattr(cls, "Search", Search)
 
+
+cls = PLCOpenParser.GetElementClass("types", "project")
+if cls:
+    _updateTypesProjectClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
 def _updateBaseTypeElementName(self, old_name, new_name):
     self.baseType.updateElementName(old_name, new_name)
 
-cls = PLCOpenParser.GetElementClass("dataType", "dataTypes")
-if cls:
+
+def _updateDataTypeDataTypesClass(cls):
     setattr(cls, "updateElementName", _updateBaseTypeElementName)
-    
-    def Search(self, criteria, parent_infos=[]):
+
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         search_result = []
         filter = criteria["filter"]
         if filter == "all" or "datatype" in filter:
@@ -949,19 +1108,27 @@
         return search_result
     setattr(cls, "Search", Search)
 
-cls = PLCOpenParser.GetElementClass("dataType")
-if cls:
-    
+
+cls = PLCOpenParser.GetElementClass("dataType", "dataTypes")
+if cls:
+    _updateDataTypeDataTypesClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateDataTypeClass(cls):
     def updateElementName(self, old_name, new_name):
         content_name = self.content.getLocalTag()
         if content_name in ["derived", "array", "subrangeSigned", "subrangeUnsigned"]:
             self.content.updateElementName(old_name, new_name)
         elif content_name == "struct":
             for element in self.content.getvariable():
-                element_type = element.type.updateElementName(old_name, new_name)
+                element.type.updateElementName(old_name, new_name)
     setattr(cls, "updateElementName", updateElementName)
 
-    def Search(self, criteria, parent_infos=[]):
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         search_result = []
         content_name = self.content.getLocalTag()
         if content_name in ["derived", "array", "enum", "subrangeSigned", "subrangeUnsigned"]:
@@ -976,22 +1143,40 @@
         return search_result
     setattr(cls, "Search", Search)
 
-cls = PLCOpenParser.GetElementClass("derived", "dataType")
-if cls:
+
+cls = PLCOpenParser.GetElementClass("dataType")
+if cls:
+    _updateDataTypeClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateDerivedDataTypeClass(cls):
     def updateElementName(self, old_name, new_name):
         if TextMatched(self.name, old_name):
             self.name = new_name
     setattr(cls, "updateElementName", updateElementName)
-    
-    def Search(self, criteria, parent_infos=[]):
+
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         return [(tuple(parent_infos),) + result for result in TestTextElement(self.name, criteria)]
     setattr(cls, "Search", Search)
 
-cls = PLCOpenParser.GetElementClass("array", "dataType")
-if cls:
+
+cls = PLCOpenParser.GetElementClass("derived", "dataType")
+if cls:
+    _updateDerivedDataTypeClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateArrayDataTypeClass(cls):
     setattr(cls, "updateElementName", _updateBaseTypeElementName)
-    
-    def Search(self, criteria, parent_infos=[]):
+
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         search_result = self.baseType.Search(criteria, parent_infos)
         for i, dimension in enumerate(self.getdimension()):
             search_result.extend(_Search([("lower", dimension.getlower()),
@@ -1000,32 +1185,51 @@
         return search_result
     setattr(cls, "Search", Search)
 
-def _SearchInSubrange(self, criteria, parent_infos=[]):
+
+cls = PLCOpenParser.GetElementClass("array", "dataType")
+if cls:
+    _updateArrayDataTypeClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _SearchInSubrange(self, criteria, parent_infos=None):
+    parent_infos = [] if parent_infos is None else parent_infos
     search_result = self.baseType.Search(criteria, parent_infos)
     search_result.extend(_Search([("lower", self.range.getlower()),
                                   ("upper", self.range.getupper())],
                                  criteria, parent_infos))
     return search_result
 
+
 cls = PLCOpenParser.GetElementClass("subrangeSigned", "dataType")
 if cls:
     setattr(cls, "updateElementName", _updateBaseTypeElementName)
     setattr(cls, "Search", _SearchInSubrange)
 
+
+# ----------------------------------------------------------------------
+
+
 cls = PLCOpenParser.GetElementClass("subrangeUnsigned", "dataType")
 if cls:
     setattr(cls, "updateElementName", _updateBaseTypeElementName)
     setattr(cls, "Search", _SearchInSubrange)
 
-cls = PLCOpenParser.GetElementClass("enum", "dataType")
-if cls:
-    
+
+# ----------------------------------------------------------------------
+
+
+def _updateEnumDataTypeClass(cls):
     def updateElementName(self, old_name, new_name):
         pass
     setattr(cls, "updateElementName", updateElementName)
-    
+
     enumerated_datatype_values_xpath = PLCOpen_XPath("ppx:values/ppx:value")
-    def Search(self, criteria, parent_infos=[]):
+
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         search_result = []
         for i, value in enumerate(enumerated_datatype_values_xpath(self)):
             for result in TestTextElement(value.getname(), criteria):
@@ -1033,28 +1237,32 @@
         return search_result
     setattr(cls, "Search", Search)
 
+
+cls = PLCOpenParser.GetElementClass("enum", "dataType")
+if cls:
+    _updateEnumDataTypeClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
 def _getvariableTypeinfos(variable_type):
     type_content = variable_type.getcontent()
     type_content_type = type_content.getLocalTag()
     if type_content_type == "derived":
         return type_content.getname()
     return type_content_type.upper()
-    
-cls = PLCOpenParser.GetElementClass("pou", "pous")
-if cls:
-    
-    block_inputs_xpath = PLCOpen_XPath(
-        "ppx:interface/*[self::ppx:inputVars or self::ppx:inOutVars]/ppx:variable")
-    block_outputs_xpath = PLCOpen_XPath(
-        "ppx:interface/*[self::ppx:outputVars or self::ppx:inOutVars]/ppx:variable")
-    def getblockInfos(self): 
+
+
+def _updatePouPousClass(cls):
+    def getblockInfos(self):
         block_infos = {
-            "name" : self.getname(), 
-            "type" : self.getpouType(), 
-            "extensible" : False,
-            "inputs" : [], 
-            "outputs" : [], 
-            "comment" : self.getdescription()}
+            "name": self.getname(),
+            "type": self.getpouType(),
+            "extensible": False,
+            "inputs": [],
+            "outputs": [],
+            "comment": self.getdescription()}
         if self.interface is not None:
             return_type = self.interface.getreturnType()
             if return_type is not None:
@@ -1066,15 +1274,15 @@
             block_infos["outputs"].extend(
                 [(var.getname(), _getvariableTypeinfos(var.type), "none")
                  for var in block_outputs_xpath(self)])
-            
-        block_infos["usage"] = ("\n (%s) => (%s)" % 
-            (", ".join(["%s:%s" % (input[1], input[0]) 
-                        for input in block_infos["inputs"]]),
-             ", ".join(["%s:%s" % (output[1], output[0]) 
-                        for output in block_infos["outputs"]])))
+
+        block_infos["usage"] = ("\n (%s) => (%s)" %
+                                (", ".join(["%s:%s" % (input[1], input[0])
+                                            for input in block_infos["inputs"]]),
+                                 ", ".join(["%s:%s" % (output[1], output[0])
+                                            for output in block_infos["outputs"]])))
         return block_infos
     setattr(cls, "getblockInfos", getblockInfos)
-    
+
     def setdescription(self, description):
         doc = self.getdocumentation()
         if doc is None:
@@ -1082,81 +1290,81 @@
             self.setdocumentation(doc)
         doc.setanyText(description)
     setattr(cls, "setdescription", setdescription)
-    
+
     def getdescription(self):
         doc = self.getdocumentation()
         if doc is not None:
             return doc.getanyText()
         return ""
     setattr(cls, "getdescription", getdescription)
-    
+
     def setbodyType(self, body_type):
         if len(self.body) > 0:
             if body_type in ["IL", "ST", "LD", "FBD", "SFC"]:
                 self.body[0].setcontent(PLCOpenParser.CreateElement(body_type, "body"))
             else:
-                raise ValueError, "%s isn't a valid body type!"%type
+                raise ValueError("%s isn't a valid body type!" % type)
     setattr(cls, "setbodyType", setbodyType)
-    
+
     def getbodyType(self):
         if len(self.body) > 0:
             return self.body[0].getcontent().getLocalTag()
     setattr(cls, "getbodyType", getbodyType)
-    
+
     def resetexecutionOrder(self):
         if len(self.body) > 0:
             self.body[0].resetexecutionOrder()
     setattr(cls, "resetexecutionOrder", resetexecutionOrder)
-    
+
     def compileexecutionOrder(self):
         if len(self.body) > 0:
             self.body[0].compileexecutionOrder()
     setattr(cls, "compileexecutionOrder", compileexecutionOrder)
-    
+
     def setelementExecutionOrder(self, instance, new_executionOrder):
         if len(self.body) > 0:
             self.body[0].setelementExecutionOrder(instance, new_executionOrder)
     setattr(cls, "setelementExecutionOrder", setelementExecutionOrder)
-    
+
     def addinstance(self, instance):
         if len(self.body) > 0:
             self.body[0].appendcontentInstance(instance)
     setattr(cls, "addinstance", addinstance)
-    
+
     def getinstances(self):
         if len(self.body) > 0:
             return self.body[0].getcontentInstances()
         return []
     setattr(cls, "getinstances", getinstances)
-    
+
     def getinstance(self, id):
         if len(self.body) > 0:
             return self.body[0].getcontentInstance(id)
         return None
     setattr(cls, "getinstance", getinstance)
-    
+
     def getinstancesIds(self):
         if len(self.body) > 0:
             return self.body[0].getcontentInstancesIds()
         return []
     setattr(cls, "getinstancesIds", getinstancesIds)
-    
+
     def getinstanceByName(self, name):
         if len(self.body) > 0:
             return self.body[0].getcontentInstanceByName(name)
         return None
     setattr(cls, "getinstanceByName", getinstanceByName)
-    
+
     def removeinstance(self, id):
         if len(self.body) > 0:
             self.body[0].removecontentInstance(id)
     setattr(cls, "removeinstance", removeinstance)
-    
+
     def settext(self, text):
         if len(self.body) > 0:
             self.body[0].settext(text)
     setattr(cls, "settext", settext)
-    
+
     def gettext(self):
         if len(self.body) > 0:
             return self.body[0].gettext()
@@ -1173,17 +1381,17 @@
                 vars.append((reverse_types[varlist.getLocalTag()], varlist))
         return vars
     setattr(cls, "getvars", getvars)
-    
+
     def setvars(self, vars):
         if self.interface is None:
             self.interface = PLCOpenParser.CreateElement("interface", "pou")
         self.interface.setcontent(vars)
     setattr(cls, "setvars", setvars)
-        
+
     def addpouExternalVar(self, var_type, name):
         self.addpouVar(var_type, name, "externalVars")
     setattr(cls, "addpouExternalVar", addpouExternalVar)
-    
+
     def addpouVar(self, var_type, name, var_class="localVars", location="", description="", initval=""):
         if self.interface is None:
             self.interface = PLCOpenParser.CreateElement("interface", "pou")
@@ -1213,11 +1421,11 @@
             el = PLCOpenParser.CreateElement("initialValue", "variable")
             el.setvalue(initval)
             var.setinitialValue(el)
-        
+
         varlist.appendvariable(var)
     setattr(cls, "addpouVar", addpouVar)
     setattr(cls, "addpouLocalVar", addpouVar)
-    
+
     def changepouVar(self, old_type, old_name, new_type, new_name):
         if self.interface is not None:
             content = self.interface.getcontent()
@@ -1231,7 +1439,7 @@
                             vartype_content.setname(new_type)
                             return
     setattr(cls, "changepouVar", changepouVar)
-    
+
     def removepouVar(self, var_type, name):
         if self.interface is not None:
             content = self.interface.getcontent()
@@ -1250,15 +1458,16 @@
         if self.getbodyType() in ["SFC"]:
             for instance in self.getinstances():
                 if isinstance(instance, PLCOpenParser.GetElementClass("step", "sfcObjects")) and TextMatched(instance.getname(), name):
-                    return True         
+                    return True
         return False
     setattr(cls, "hasstep", hasstep)
-    
+
     def hasblock(self, name=None, block_type=None):
         if self.getbodyType() in ["FBD", "LD", "SFC"]:
             for instance in self.getinstances():
-                if (isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) and 
-                    (TextMatched(instance.getinstanceName(), name) or TextMatched(instance.gettypeName(), block_type))):
+                if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) \
+                   and (TextMatched(instance.getinstanceName(), name) or
+                        TextMatched(instance.gettypeName(), block_type)):
                     return True
             if self.transitions:
                 for transition in self.transitions.gettransition():
@@ -1274,7 +1483,7 @@
             return self.body[0].hasblock(block_type)
         return False
     setattr(cls, "hasblock", hasblock)
-    
+
     def addtransition(self, name, body_type):
         if self.transitions is None:
             self.addtransitions()
@@ -1286,7 +1495,7 @@
         if body_type == "ST":
             transition.settext(":= ;")
     setattr(cls, "addtransition", addtransition)
-    
+
     def gettransition(self, name):
         if self.transitions is not None:
             for transition in self.transitions.gettransition():
@@ -1294,13 +1503,13 @@
                     return transition
         return None
     setattr(cls, "gettransition", gettransition)
-        
+
     def gettransitionList(self):
         if self.transitions is not None:
             return self.transitions.gettransition()
         return []
     setattr(cls, "gettransitionList", gettransitionList)
-    
+
     def removetransition(self, name):
         if self.transitions is not None:
             removed = False
@@ -1309,13 +1518,13 @@
                     if transition.getbodyType() in ["FBD", "LD", "SFC"]:
                         for instance in transition.getinstances():
                             if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")):
-                                self.removepouVar(instance.gettypeName(), 
+                                self.removepouVar(instance.gettypeName(),
                                                   instance.getinstanceName())
                     self.transitions.remove(transition)
                     removed = True
                     break
             if not removed:
-                raise ValueError, _("Transition with name %s doesn't exist!")%name
+                raise ValueError(_("Transition with name %s doesn't exist!") % name)
     setattr(cls, "removetransition", removetransition)
 
     def addaction(self, name, body_type):
@@ -1327,7 +1536,7 @@
         action.setname(name)
         action.setbodyType(body_type)
     setattr(cls, "addaction", addaction)
-    
+
     def getaction(self, name):
         if self.actions is not None:
             for action in self.actions.getaction():
@@ -1335,13 +1544,13 @@
                     return action
         return None
     setattr(cls, "getaction", getaction)
-    
+
     def getactionList(self):
         if self.actions is not None:
             return self.actions.getaction()
         return []
     setattr(cls, "getactionList", getactionList)
-    
+
     def removeaction(self, name):
         if self.actions is not None:
             removed = False
@@ -1350,13 +1559,13 @@
                     if action.getbodyType() in ["FBD", "LD", "SFC"]:
                         for instance in action.getinstances():
                             if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")):
-                                self.removepouVar(instance.gettypeName(), 
+                                self.removepouVar(instance.gettypeName(),
                                                   instance.getinstanceName())
                     self.actions.remove(action)
                     removed = True
                     break
             if not removed:
-                raise ValueError, _("Action with name %s doesn't exist!")%name
+                raise ValueError(_("Action with name %s doesn't exist!") % name)
     setattr(cls, "removeaction", removeaction)
 
     def updateElementName(self, old_name, new_name):
@@ -1412,8 +1621,9 @@
                         if result is not None:
                             content.remove(variable)
     setattr(cls, "removeVariableByFilter", removeVariableByFilter)
-    
-    def Search(self, criteria, parent_infos=[]):
+
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         search_result = []
         filter = criteria["filter"]
         if filter == "all" or self.getpouType() in filter:
@@ -1444,67 +1654,96 @@
         return search_result
     setattr(cls, "Search", Search)
 
+
+cls = PLCOpenParser.GetElementClass("pou", "pous")
+if cls:
+    block_inputs_xpath = PLCOpen_XPath(
+        "ppx:interface/*[self::ppx:inputVars or self::ppx:inOutVars]/ppx:variable")
+    block_outputs_xpath = PLCOpen_XPath(
+        "ppx:interface/*[self::ppx:outputVars or self::ppx:inOutVars]/ppx:variable")
+    _updatePouPousClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
 def setbodyType(self, body_type):
     if body_type in ["IL", "ST", "LD", "FBD", "SFC"]:
         self.body.setcontent(PLCOpenParser.CreateElement(body_type, "body"))
     else:
-        raise ValueError, "%s isn't a valid body type!"%type
+        raise ValueError("%s isn't a valid body type!" % type)
+
 
 def getbodyType(self):
     return self.body.getcontent().getLocalTag()
 
+
 def resetexecutionOrder(self):
     self.body.resetexecutionOrder()
 
+
 def compileexecutionOrder(self):
     self.body.compileexecutionOrder()
 
+
 def setelementExecutionOrder(self, instance, new_executionOrder):
     self.body.setelementExecutionOrder(instance, new_executionOrder)
 
+
 def addinstance(self, instance):
     self.body.appendcontentInstance(instance)
 
+
 def getinstances(self):
     return self.body.getcontentInstances()
 
+
 def getinstance(self, id):
     return self.body.getcontentInstance(id)
 
+
 def getrandomInstance(self, exclude):
     return self.body.getcontentRandomInstance(exclude)
 
+
 def getinstanceByName(self, name):
     return self.body.getcontentInstanceByName(name)
 
+
 def removeinstance(self, id):
     self.body.removecontentInstance(id)
 
+
 def settext(self, text):
     self.body.settext(text)
 
+
 def gettext(self):
     return self.body.gettext()
 
+
 def hasblock(self, name=None, block_type=None):
     if self.getbodyType() in ["FBD", "LD", "SFC"]:
         for instance in self.getinstances():
-            if (isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) and 
-                (TextMatched(instance.getinstanceName(), name) or TextMatched(instance.gettypeName(), block_type))):
+            if isinstance(instance, PLCOpenParser.GetElementClass("block", "fbdObjects")) and \
+               (TextMatched(instance.getinstanceName(), name) or TextMatched(instance.gettypeName(), block_type)):
                 return True
     elif block_type is not None:
         return self.body.hasblock(block_type)
     return False
 
+
 def updateElementName(self, old_name, new_name):
     self.body.updateElementName(old_name, new_name)
 
+
 def updateElementAddress(self, address_model, new_leading):
     self.body.updateElementAddress(address_model, new_leading)
-    
-
-cls = PLCOpenParser.GetElementClass("transition", "transitions")
-if cls:
+
+
+# ----------------------------------------------------------------------
+
+def _updateTransitionTransitionsClass(cls):
     setattr(cls, "setbodyType", setbodyType)
     setattr(cls, "getbodyType", getbodyType)
     setattr(cls, "resetexecutionOrder", resetexecutionOrder)
@@ -1521,7 +1760,7 @@
     setattr(cls, "hasblock", hasblock)
     setattr(cls, "updateElementName", updateElementName)
     setattr(cls, "updateElementAddress", updateElementAddress)
-    
+
     def Search(self, criteria, parent_infos):
         search_result = []
         parent_infos = parent_infos[:-1] + ["T::%s::%s" % (parent_infos[-1].split("::")[1], self.getname())]
@@ -1531,8 +1770,16 @@
         return search_result
     setattr(cls, "Search", Search)
 
-cls = PLCOpenParser.GetElementClass("action", "actions")
-if cls:
+
+cls = PLCOpenParser.GetElementClass("transition", "transitions")
+if cls:
+    _updateTransitionTransitionsClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateActionActionsClass(cls):
     setattr(cls, "setbodyType", setbodyType)
     setattr(cls, "getbodyType", getbodyType)
     setattr(cls, "resetexecutionOrder", resetexecutionOrder)
@@ -1549,7 +1796,7 @@
     setattr(cls, "hasblock", hasblock)
     setattr(cls, "updateElementName", updateElementName)
     setattr(cls, "updateElementAddress", updateElementAddress)
-    
+
     def Search(self, criteria, parent_infos):
         search_result = []
         parent_infos = parent_infos[:-1] + ["A::%s::%s" % (parent_infos[-1].split("::")[1], self.getname())]
@@ -1559,31 +1806,40 @@
         return search_result
     setattr(cls, "Search", Search)
 
-cls = PLCOpenParser.GetElementClass("body")
-if cls:
+
+cls = PLCOpenParser.GetElementClass("action", "actions")
+if cls:
+    _updateActionActionsClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateBodyClass(cls):
     cls.currentExecutionOrderId = 0
     cls.checkedBlocksDict = {}
+
     def resetcurrentExecutionOrderId(self):
         object.__setattr__(self, "currentExecutionOrderId", 0)
     setattr(cls, "resetcurrentExecutionOrderId", resetcurrentExecutionOrderId)
-    
+
     def getnewExecutionOrderId(self):
         object.__setattr__(self, "currentExecutionOrderId", self.currentExecutionOrderId + 1)
         return self.currentExecutionOrderId
     setattr(cls, "getnewExecutionOrderId", getnewExecutionOrderId)
-    
+
     def resetexecutionOrder(self):
         if self.content.getLocalTag() == "FBD":
             for element in self.content.getcontent():
-                if not isinstance(element, (PLCOpenParser.GetElementClass("comment", "commonObjects"), 
-                                            PLCOpenParser.GetElementClass("connector", "commonObjects"), 
+                if not isinstance(element, (PLCOpenParser.GetElementClass("comment", "commonObjects"),
+                                            PLCOpenParser.GetElementClass("connector", "commonObjects"),
                                             PLCOpenParser.GetElementClass("continuation", "commonObjects"))):
                     element.setexecutionOrderId(0)
             self.checkedBlocksDict.clear()
         else:
-            raise TypeError, _("Can only generate execution order on FBD networks!")
+            raise TypeError(_("Can only generate execution order on FBD networks!"))
     setattr(cls, "resetexecutionOrder", resetexecutionOrder)
-    
+
     def compileexecutionOrder(self):
         if self.content.getLocalTag() == "FBD":
             self.resetexecutionOrder()
@@ -1595,9 +1851,9 @@
                         self.compileelementExecutionOrder(connections[0])
                     element.setexecutionOrderId(self.getnewExecutionOrderId())
         else:
-            raise TypeError, _("Can only generate execution order on FBD networks!")
+            raise TypeError(_("Can only generate execution order on FBD networks!"))
     setattr(cls, "compileexecutionOrder", compileexecutionOrder)
-    
+
     def compileelementExecutionOrder(self, link):
         if self.content.getLocalTag() == "FBD":
             localid = link.getrefLocalId()
@@ -1607,21 +1863,22 @@
                 for variable in instance.inputVariables.getvariable():
                     connections = variable.connectionPointIn.getconnections()
                     if connections and len(connections) == 1:
-                        if (self.checkedBlocksDict.has_key(connections[0].getrefLocalId()) == False):
+                        if not connections[0].getrefLocalId() in self.checkedBlocksDict:
                             self.compileelementExecutionOrder(connections[0])
                 if instance.getexecutionOrderId() == 0:
                     instance.setexecutionOrderId(self.getnewExecutionOrderId())
             elif isinstance(instance, PLCOpenParser.GetElementClass("continuation", "commonObjects")) and instance.getexecutionOrderId() == 0:
                 for tmp_instance in self.getcontentInstances():
-                    if (isinstance(tmp_instance, PLCOpenParser.GetElementClass("connector", "commonObjects")) and
-                        TextMatched(tmp_instance.getname(), instance.getname()) and tmp_instance.getexecutionOrderId() == 0):
+                    if isinstance(tmp_instance, PLCOpenParser.GetElementClass("connector", "commonObjects")) and \
+                       TextMatched(tmp_instance.getname(), instance.getname()) and \
+                       tmp_instance.getexecutionOrderId() == 0:
                         connections = tmp_instance.connectionPointIn.getconnections()
                         if connections and len(connections) == 1:
                             self.compileelementExecutionOrder(connections[0])
         else:
-            raise TypeError, _("Can only generate execution order on FBD networks!")
+            raise TypeError(_("Can only generate execution order on FBD networks!"))
     setattr(cls, "compileelementExecutionOrder", compileelementExecutionOrder)
-    
+
     def setelementExecutionOrder(self, instance, new_executionOrder):
         if self.content.getLocalTag() == "FBD":
             old_executionOrder = instance.getexecutionOrderId()
@@ -1635,85 +1892,86 @@
                             element.setexecutionOrderId(element_executionOrder + 1)
             instance.setexecutionOrderId(new_executionOrder)
         else:
-            raise TypeError, _("Can only generate execution order on FBD networks!")
+            raise TypeError(_("Can only generate execution order on FBD networks!"))
     setattr(cls, "setelementExecutionOrder", setelementExecutionOrder)
-    
+
     def appendcontentInstance(self, instance):
-        if self.content.getLocalTag() in ["LD","FBD","SFC"]:
+        if self.content.getLocalTag() in ["LD", "FBD", "SFC"]:
             self.content.appendcontent(instance)
         else:
-            raise TypeError, _("%s body don't have instances!")%self.content.getLocalTag()
+            raise TypeError(_("%s body don't have instances!") % self.content.getLocalTag())
     setattr(cls, "appendcontentInstance", appendcontentInstance)
-    
+
     def getcontentInstances(self):
-        if self.content.getLocalTag() in ["LD","FBD","SFC"]:
+        if self.content.getLocalTag() in ["LD", "FBD", "SFC"]:
             return self.content.getcontent()
         else:
-            raise TypeError, _("%s body don't have instances!")%self.content.getLocalTag()
+            raise TypeError(_("%s body don't have instances!") % self.content.getLocalTag())
     setattr(cls, "getcontentInstances", getcontentInstances)
-    
+
     instance_by_id_xpath = PLCOpen_XPath("*[@localId=$localId]")
     instance_by_name_xpath = PLCOpen_XPath("ppx:block[@instanceName=$name]")
+
     def getcontentInstance(self, local_id):
-        if self.content.getLocalTag() in ["LD","FBD","SFC"]:
+        if self.content.getLocalTag() in ["LD", "FBD", "SFC"]:
             instance = instance_by_id_xpath(self.content, localId=local_id)
             if len(instance) > 0:
                 return instance[0]
             return None
         else:
-            raise TypeError, _("%s body don't have instances!")%self.content.getLocalTag()
+            raise TypeError(_("%s body don't have instances!") % self.content.getLocalTag())
     setattr(cls, "getcontentInstance", getcontentInstance)
-    
+
     def getcontentInstancesIds(self):
-        if self.content.getLocalTag() in ["LD","FBD","SFC"]:
+        if self.content.getLocalTag() in ["LD", "FBD", "SFC"]:
             return OrderedDict([(instance.getlocalId(), True)
                                 for instance in self.content])
         else:
-            raise TypeError, _("%s body don't have instances!")%self.content.getLocalTag()
+            raise TypeError(_("%s body don't have instances!") % self.content.getLocalTag())
     setattr(cls, "getcontentInstancesIds", getcontentInstancesIds)
-    
+
     def getcontentInstanceByName(self, name):
-        if self.content.getLocalTag() in ["LD","FBD","SFC"]:
+        if self.content.getLocalTag() in ["LD", "FBD", "SFC"]:
             instance = instance_by_name_xpath(self.content)
             if len(instance) > 0:
                 return instance[0]
             return None
         else:
-            raise TypeError, _("%s body don't have instances!")%self.content.getLocalTag()
+            raise TypeError(_("%s body don't have instances!") % self.content.getLocalTag())
     setattr(cls, "getcontentInstanceByName", getcontentInstanceByName)
-    
+
     def removecontentInstance(self, local_id):
-        if self.content.getLocalTag() in ["LD","FBD","SFC"]:
+        if self.content.getLocalTag() in ["LD", "FBD", "SFC"]:
             instance = instance_by_id_xpath(self.content, localId=local_id)
             if len(instance) > 0:
                 self.content.remove(instance[0])
             else:
-                raise ValueError, _("Instance with id %d doesn't exist!")%id
+                raise ValueError(_("Instance with id %d doesn't exist!") % id)
         else:
-            raise TypeError, "%s body don't have instances!"%self.content.getLocalTag()
+            raise TypeError(_("%s body don't have instances!") % self.content.getLocalTag())
     setattr(cls, "removecontentInstance", removecontentInstance)
-    
+
     def settext(self, text):
-        if self.content.getLocalTag() in ["IL","ST"]:
+        if self.content.getLocalTag() in ["IL", "ST"]:
             self.content.setanyText(text)
         else:
-            raise TypeError, _("%s body don't have text!")%self.content.getLocalTag()
+            raise TypeError(_("%s body don't have text!") % self.content.getLocalTag())
     setattr(cls, "settext", settext)
 
     def gettext(self):
-        if self.content.getLocalTag() in ["IL","ST"]:
+        if self.content.getLocalTag() in ["IL", "ST"]:
             return self.content.getanyText()
         else:
-            raise TypeError, _("%s body don't have text!")%self.content.getLocalTag()
+            raise TypeError(_("%s body don't have text!") % self.content.getLocalTag())
     setattr(cls, "gettext", gettext)
-    
+
     def hasblock(self, block_type):
-        if self.content.getLocalTag() in ["IL","ST"]:
+        if self.content.getLocalTag() in ["IL", "ST"]:
             return self.content.hasblock(block_type)
         else:
-            raise TypeError, _("%s body don't have text!")%self.content.getLocalTag()
+            raise TypeError(_("%s body don't have text!") % self.content.getLocalTag())
     setattr(cls, "hasblock", hasblock)
-    
+
     def updateElementName(self, old_name, new_name):
         if self.content.getLocalTag() in ["IL", "ST"]:
             self.content.updateElementName(old_name, new_name)
@@ -1730,7 +1988,8 @@
                 element.updateElementAddress(address_model, new_leading)
     setattr(cls, "updateElementAddress", updateElementAddress)
 
-    def Search(self, criteria, parent_infos=[]):
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         if self.content.getLocalTag() in ["IL", "ST"]:
             search_result = self.content.Search(criteria, parent_infos + ["body", 0])
         else:
@@ -1740,21 +1999,35 @@
         return search_result
     setattr(cls, "Search", Search)
 
+
+cls = PLCOpenParser.GetElementClass("body")
+if cls:
+    _updateBodyClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
 def getx(self):
     return self.position.getx()
 
+
 def gety(self):
     return self.position.gety()
 
+
 def setx(self, x):
     self.position.setx(x)
-    
+
+
 def sety(self, y):
     self.position.sety(y)
 
+
 def _getBoundingBox(self):
     return rect(self.getx(), self.gety(), self.getwidth(), self.getheight())
 
+
 def _getConnectionsBoundingBox(connectionPointIn):
     bbox = rect()
     connections = connectionPointIn.getconnections()
@@ -1764,39 +2037,46 @@
                 bbox.update(x, y)
     return bbox
 
+
 def _getBoundingBoxSingle(self):
     bbox = _getBoundingBox(self)
     if self.connectionPointIn is not None:
         bbox.union(_getConnectionsBoundingBox(self.connectionPointIn))
     return bbox
 
+
 def _getBoundingBoxMultiple(self):
     bbox = _getBoundingBox(self)
     for connectionPointIn in self.getconnectionPointIn():
         bbox.union(_getConnectionsBoundingBox(connectionPointIn))
     return bbox
 
+
 def _filterConnections(connectionPointIn, localId, connections):
     in_connections = connectionPointIn.getconnections()
     if in_connections is not None:
         for connection in in_connections:
             connected = connection.getrefLocalId()
-            if not connections.has_key((localId, connected)) and \
-               not connections.has_key((connected, localId)):
+            if not (localId, connected) in connections and \
+               not (connected, localId) in connections:
                 connectionPointIn.remove(connection)
 
+
 def _filterConnectionsSingle(self, connections):
     if self.connectionPointIn is not None:
         _filterConnections(self.connectionPointIn, self.localId, connections)
 
+
 def _filterConnectionsMultiple(self, connections):
     for connectionPointIn in self.getconnectionPointIn():
         _filterConnections(connectionPointIn, self.localId, connections)
 
+
 def _getconnectionsdefinition(instance, connections_end):
     local_id = instance.getlocalId()
     return dict([((local_id, end), True) for end in connections_end])
 
+
 def _updateConnectionsId(connectionPointIn, translation):
     connections_end = []
     connections = connectionPointIn.getconnections()
@@ -1808,22 +2088,26 @@
             connections_end.append(new_reflocalId)
     return connections_end
 
+
 def _updateConnectionsIdSingle(self, translation):
     connections_end = []
     if self.connectionPointIn is not None:
         connections_end = _updateConnectionsId(self.connectionPointIn, translation)
     return _getconnectionsdefinition(self, connections_end)
 
+
 def _updateConnectionsIdMultiple(self, translation):
     connections_end = []
     for connectionPointIn in self.getconnectionPointIn():
         connections_end.extend(_updateConnectionsId(connectionPointIn, translation))
     return _getconnectionsdefinition(self, connections_end)
 
+
 def _translate(self, dx, dy):
     self.setx(self.getx() + dx)
     self.sety(self.gety() + dy)
-    
+
+
 def _translateConnections(connectionPointIn, dx, dy):
     connections = connectionPointIn.getconnections()
     if connections is not None:
@@ -1832,32 +2116,38 @@
                 position.setx(position.getx() + dx)
                 position.sety(position.gety() + dy)
 
+
 def _translateSingle(self, dx, dy):
     _translate(self, dx, dy)
     if self.connectionPointIn is not None:
         _translateConnections(self.connectionPointIn, dx, dy)
 
+
 def _translateMultiple(self, dx, dy):
     _translate(self, dx, dy)
     for connectionPointIn in self.getconnectionPointIn():
         _translateConnections(connectionPointIn, dx, dy)
 
+
 def _updateElementName(self, old_name, new_name):
     pass
 
+
 def _updateElementAddress(self, address_model, new_leading):
     pass
 
-def _SearchInElement(self, criteria, parent_infos=[]):
+
+def _SearchInElement(self, criteria, parent_infos=None):
     return []
 
+
 _connectionsFunctions = {
     "bbox": {"none": _getBoundingBox,
              "single": _getBoundingBoxSingle,
              "multiple": _getBoundingBoxMultiple},
     "translate": {"none": _translate,
-               "single": _translateSingle,
-               "multiple": _translateMultiple},
+                  "single": _translateSingle,
+                  "multiple": _translateMultiple},
     "filter": {"none": lambda self, connections: None,
                "single": _filterConnectionsSingle,
                "multiple": _filterConnectionsMultiple},
@@ -1866,6 +2156,7 @@
                "multiple": _updateConnectionsIdMultiple},
 }
 
+
 def _initElementClass(name, parent, connectionPointInType="none"):
     cls = PLCOpenParser.GetElementClass(name, parent)
     if cls:
@@ -1882,16 +2173,19 @@
         setattr(cls, "Search", _SearchInElement)
     return cls
 
-cls = _initElementClass("comment", "commonObjects")
-if cls:
+
+# ----------------------------------------------------------------------
+
+
+def _updateCommentCommonObjectsClass(cls):
     def setcontentText(self, text):
         self.content.setanyText(text)
     setattr(cls, "setcontentText", setcontentText)
-        
+
     def getcontentText(self):
         return self.content.getanyText()
     setattr(cls, "getcontentText", getcontentText)
-    
+
     def updateElementName(self, old_name, new_name):
         self.content.updateElementName(old_name, new_name)
     setattr(cls, "updateElementName", updateElementName)
@@ -1900,12 +2194,21 @@
         self.content.updateElementAddress(address_model, new_leading)
     setattr(cls, "updateElementAddress", updateElementAddress)
 
-    def Search(self, criteria, parent_infos=[]):
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         return self.content.Search(criteria, parent_infos + ["comment", self.getlocalId(), "content"])
     setattr(cls, "Search", Search)
 
-cls = _initElementClass("block", "fbdObjects")
-if cls:
+
+cls = _initElementClass("comment", "commonObjects")
+if cls:
+    _updateCommentCommonObjectsClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateBlockFbdObjectsClass(cls):
     def getBoundingBox(self):
         bbox = _getBoundingBox(self)
         for input in self.inputVariables.getvariable():
@@ -1936,7 +2239,8 @@
             _translateConnections(input.connectionPointIn, dx, dy)
     setattr(cls, "translate", translate)
 
-    def Search(self, criteria, parent_infos=[]):
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         parent_infos = parent_infos + ["block", self.getlocalId()]
         search_result = _Search([("name", self.getinstanceName()),
                                  ("type", self.gettypeName())],
@@ -1950,41 +2254,74 @@
         return search_result
     setattr(cls, "Search", Search)
 
+
+cls = _initElementClass("block", "fbdObjects")
+if cls:
+    _updateBlockFbdObjectsClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
 _initElementClass("leftPowerRail", "ldObjects")
 _initElementClass("rightPowerRail", "ldObjects", "multiple")
 
+
 def _UpdateLDElementName(self, old_name, new_name):
     if TextMatched(self.variable, old_name):
         self.variable = new_name
 
+
 def _UpdateLDElementAddress(self, address_model, new_leading):
     self.variable = update_address(self.variable, address_model, new_leading)
 
+
 def _getSearchInLDElement(ld_element_type):
-    def SearchInLDElement(self, criteria, parent_infos=[]):
+    def SearchInLDElement(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         return _Search([("reference", self.variable)], criteria, parent_infos + [ld_element_type, self.getlocalId()])
     return SearchInLDElement
 
+
+# ----------------------------------------------------------------------
+
+
 cls = _initElementClass("contact", "ldObjects", "single")
 if cls:
     setattr(cls, "updateElementName", _UpdateLDElementName)
     setattr(cls, "updateElementAddress", _UpdateLDElementAddress)
     setattr(cls, "Search", _getSearchInLDElement("contact"))
 
+
+# ----------------------------------------------------------------------
+
+
 cls = _initElementClass("coil", "ldObjects", "single")
 if cls:
     setattr(cls, "updateElementName", _UpdateLDElementName)
     setattr(cls, "updateElementAddress", _UpdateLDElementAddress)
     setattr(cls, "Search", _getSearchInLDElement("coil"))
 
-cls = _initElementClass("step", "sfcObjects", "single")
-if cls:
-    def Search(self, criteria, parent_infos=[]):
+
+# ----------------------------------------------------------------------
+
+
+def _updateStepSfcObjectSingleClass(cls):
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         return _Search([("name", self.getname())], criteria, parent_infos + ["step", self.getlocalId()])
     setattr(cls, "Search", Search)
 
-cls = _initElementClass("transition", "sfcObjects")
-if cls:
+
+cls = _initElementClass("step", "sfcObjects", "single")
+if cls:
+    _updateStepSfcObjectSingleClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateTransitionSfcObjectsClass(cls):
     def setconditionContent(self, condition_type, value):
         if self.condition is None:
             self.addcondition()
@@ -1999,11 +2336,11 @@
             condition.setcontent(PLCOpenParser.CreateElement("ST", "inline"))
             condition.settext(value)
     setattr(cls, "setconditionContent", setconditionContent)
-        
+
     def getconditionContent(self):
         if self.condition is not None:
             content = self.condition.getcontent()
-            values = {"type" : content.getLocalTag()}
+            values = {"type": content.getLocalTag()}
             if values["type"] == "reference":
                 values["value"] = content.getname()
             elif values["type"] == "inline":
@@ -2030,21 +2367,21 @@
             bbox.union(_getConnectionsBoundingBox(condition_connection))
         return bbox
     setattr(cls, "getBoundingBox", getBoundingBox)
-    
+
     def translate(self, dx, dy):
         _translateSingle(self, dx, dy)
         condition_connection = self.getconditionConnection()
         if condition_connection is not None:
             _translateConnections(condition_connection, dx, dy)
     setattr(cls, "translate", translate)
-    
+
     def filterConnections(self, connections):
         _filterConnectionsSingle(self, connections)
         condition_connection = self.getconditionConnection()
         if condition_connection is not None:
             _filterConnections(condition_connection, self.localId, connections)
     setattr(cls, "filterConnections", filterConnections)
-    
+
     def updateConnectionsId(self, translation):
         connections_end = []
         if self.connectionPointIn is not None:
@@ -2082,8 +2419,9 @@
             return condition_connection.getconnections()
         return None
     setattr(cls, "getconnections", getconnections)
-    
-    def Search(self, criteria, parent_infos=[]):
+
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         parent_infos = parent_infos + ["transition", self.getlocalId()]
         search_result = []
         content = self.condition.getcontent()
@@ -2095,24 +2433,41 @@
         return search_result
     setattr(cls, "Search", Search)
 
+
+cls = _initElementClass("transition", "sfcObjects")
+if cls:
+    _updateTransitionSfcObjectsClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
 _initElementClass("selectionDivergence", "sfcObjects", "single")
 _initElementClass("selectionConvergence", "sfcObjects", "multiple")
 _initElementClass("simultaneousDivergence", "sfcObjects", "single")
 _initElementClass("simultaneousConvergence", "sfcObjects", "multiple")
-    
-cls = _initElementClass("jumpStep", "sfcObjects", "single")
-if cls:
+
+
+def _updateJumpStepSfcObjectSingleClass(cls):
     def Search(self, criteria, parent_infos):
         return _Search([("target", self.gettargetName())], criteria, parent_infos + ["jump", self.getlocalId()])
     setattr(cls, "Search", Search)
 
-cls = PLCOpenParser.GetElementClass("action", "actionBlock")
-if cls:
+
+cls = _initElementClass("jumpStep", "sfcObjects", "single")
+if cls:
+    _updateJumpStepSfcObjectSingleClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateActionActionBlockClass(cls):
     def setreferenceName(self, name):
         if self.reference is not None:
             self.reference.setname(name)
     setattr(cls, "setreferenceName", setreferenceName)
-    
+
     def getreferenceName(self):
         if self.reference is not None:
             return self.reference.getname()
@@ -2124,7 +2479,7 @@
             self.inline.setcontent(PLCOpenParser.CreateElement("ST", "inline"))
             self.inline.settext(content)
     setattr(cls, "setinlineContent", setinlineContent)
-    
+
     def getinlineContent(self):
         if self.inline is not None:
             return self.inline.gettext()
@@ -2145,20 +2500,29 @@
             self.inline.updateElementAddress(address_model, new_leading)
     setattr(cls, "updateElementAddress", updateElementAddress)
 
-    def Search(self, criteria, parent_infos=[]):
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         qualifier = self.getqualifier()
         if qualifier is None:
             qualifier = "N"
         return _Search([("inline", self.getinlineContent()),
-                        ("reference", self.getreferenceName()), 
+                        ("reference", self.getreferenceName()),
                         ("qualifier", qualifier),
                         ("duration", self.getduration()),
                         ("indicator", self.getindicator())],
                        criteria, parent_infos)
     setattr(cls, "Search", Search)
 
-cls = _initElementClass("actionBlock", "commonObjects", "single")
-if cls:
+
+cls = PLCOpenParser.GetElementClass("action", "actionBlock")
+if cls:
+    _updateActionActionBlockClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateActionBlockCommonObjectsSingleClass(cls):
     def setactions(self, actions):
         self.action = []
         for params in actions:
@@ -2210,7 +2574,8 @@
             action.updateElementAddress(address_model, new_leading)
     setattr(cls, "updateElementAddress", updateElementAddress)
 
-    def Search(self, criteria, parent_infos=[]):
+    def Search(self, criteria, parent_infos=None):
+        parent_infos = [] if parent_infos is None else parent_infos
         parent_infos = parent_infos + ["action_block", self.getlocalId()]
         search_result = []
         for idx, action in enumerate(self.action):
@@ -2218,16 +2583,29 @@
         return search_result
     setattr(cls, "Search", Search)
 
-def _SearchInIOVariable(self, criteria, parent_infos=[]):
+
+cls = _initElementClass("actionBlock", "commonObjects", "single")
+if cls:
+    _updateActionBlockCommonObjectsSingleClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _SearchInIOVariable(self, criteria, parent_infos=None):
+    parent_infos = [] if parent_infos is None else parent_infos
     return _Search([("expression", self.expression)], criteria, parent_infos + ["io_variable", self.getlocalId()])
 
+
 def _UpdateIOElementName(self, old_name, new_name):
     if TextMatched(self.expression, old_name):
         self.expression = new_name
 
+
 def _UpdateIOElementAddress(self, address_model, new_leading):
     self.expression = update_address(self.expression, address_model, new_leading)
 
+
 cls = _initElementClass("inVariable", "fbdObjects")
 if cls:
     setattr(cls, "updateElementName", _UpdateIOElementName)
@@ -2247,11 +2625,15 @@
     setattr(cls, "Search", _SearchInIOVariable)
 
 
-def _SearchInConnector(self, criteria, parent_infos=[]):
+def _SearchInConnector(self, criteria, parent_infos=None):
+    parent_infos = [] if parent_infos is None else parent_infos
     return _Search([("name", self.getname())], criteria, parent_infos + ["connector", self.getlocalId()])
 
-cls = _initElementClass("continuation", "commonObjects")
-if cls:
+
+# ----------------------------------------------------------------------
+
+
+def _updateContinuationCommonObjectsClass(cls):
     setattr(cls, "Search", _SearchInConnector)
 
     def updateElementName(self, old_name, new_name):
@@ -2259,8 +2641,16 @@
             self.name = new_name
     setattr(cls, "updateElementName", updateElementName)
 
-cls = _initElementClass("connector", "commonObjects", "single")
-if cls:
+
+cls = _initElementClass("continuation", "commonObjects")
+if cls:
+    _updateContinuationCommonObjectsClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateConnectorCommonObjectsSingleClass(cls):
     setattr(cls, "Search", _SearchInConnector)
 
     def updateElementName(self, old_name, new_name):
@@ -2268,8 +2658,16 @@
             self.name = new_name
     setattr(cls, "updateElementName", updateElementName)
 
-cls = PLCOpenParser.GetElementClass("connection")
-if cls:
+
+cls = _initElementClass("connector", "commonObjects", "single")
+if cls:
+    _updateConnectorCommonObjectsSingleClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateConnectionClass(cls):
     def setpoints(self, points):
         positions = []
         for point in points:
@@ -2283,12 +2681,20 @@
     def getpoints(self):
         points = []
         for position in self.position:
-            points.append((position.getx(),position.gety()))
+            points.append((position.getx(), position.gety()))
         return points
     setattr(cls, "getpoints", getpoints)
 
-cls = PLCOpenParser.GetElementClass("connectionPointIn")
-if cls:
+
+cls = PLCOpenParser.GetElementClass("connection")
+if cls:
+    _updateConnectionClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateConnectionPointInClass(cls):
     def setrelPositionXY(self, x, y):
         self.relPosition = PLCOpenParser.CreateElement("relPosition", "connectionPointIn")
         self.relPosition.setx(x)
@@ -2313,33 +2719,34 @@
     def removeconnections(self):
         self.content = None
     setattr(cls, "removeconnections", removeconnections)
-    
+
     connection_xpath = PLCOpen_XPath("ppx:connection")
     connection_by_position_xpath = PLCOpen_XPath("ppx:connection[position()=$pos]")
+
     def getconnections(self):
         return connection_xpath(self)
     setattr(cls, "getconnections", getconnections)
-    
+
     def getconnection(self, idx):
         connection = connection_by_position_xpath(self, pos=idx+1)
         if len(connection) > 0:
             return connection[0]
         return None
     setattr(cls, "getconnection", getconnection)
-    
+
     def setconnectionId(self, idx, local_id):
         connection = self.getconnection(idx)
         if connection is not None:
             connection.setrefLocalId(local_id)
     setattr(cls, "setconnectionId", setconnectionId)
-    
+
     def getconnectionId(self, idx):
         connection = self.getconnection(idx)
         if connection is not None:
             return connection.getrefLocalId()
         return None
     setattr(cls, "getconnectionId", getconnectionId)
-    
+
     def setconnectionPoints(self, idx, points):
         connection = self.getconnection(idx)
         if connection is not None:
@@ -2358,7 +2765,7 @@
         if connection is not None:
             connection.setformalParameter(parameter)
     setattr(cls, "setconnectionParameter", setconnectionParameter)
-    
+
     def getconnectionParameter(self, idx):
         connection = self.getconnection(idx)
         if connection is not None:
@@ -2366,6 +2773,7 @@
         return None
     setattr(cls, "getconnectionParameter", getconnectionParameter)
 
+
 cls = PLCOpenParser.GetElementClass("connectionPointOut")
 if cls:
     def setrelPositionXY(self, x, y):
@@ -2380,8 +2788,16 @@
         return self.relPosition
     setattr(cls, "getrelPositionXY", getrelPositionXY)
 
-cls = PLCOpenParser.GetElementClass("value")
-if cls:
+
+cls = PLCOpenParser.GetElementClass("connectionPointIn")
+if cls:
+    _updateConnectionPointInClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
+def _updateValueClass(cls):
     def setvalue(self, value):
         value = value.strip()
         if value.startswith("[") and value.endswith("]"):
@@ -2393,11 +2809,20 @@
         content.setvalue(value)
         self.setcontent(content)
     setattr(cls, "setvalue", setvalue)
-    
+
     def getvalue(self):
         return self.content.getvalue()
     setattr(cls, "getvalue", getvalue)
 
+
+cls = PLCOpenParser.GetElementClass("value")
+if cls:
+    _updateValueClass(cls)
+
+
+# ----------------------------------------------------------------------
+
+
 def extractValues(values):
     items = values.split(",")
     i = 1
@@ -2409,13 +2834,11 @@
         elif opened == closed:
             i += 1
         else:
-            raise ValueError, _("\"%s\" is an invalid value!")%value
+            raise ValueError(_("\"%s\" is an invalid value!") % values)
     return items
 
-cls = PLCOpenParser.GetElementClass("arrayValue", "value")
-if cls:
-    arrayValue_model = re.compile("([0-9]*)\((.*)\)$")
-    
+
+def _updateArrayValueValueClass(cls):
     def setvalue(self, value):
         elements = []
         for item in extractValues(value[1:-1]):
@@ -2431,28 +2854,34 @@
             elements.append(element)
         self.value = elements
     setattr(cls, "setvalue", setvalue)
-    
+
     def getvalue(self):
         values = []
         for element in self.value:
             try:
                 repetition = int(element.getrepetitionValue())
-            except:
+            except Exception:
                 repetition = 1
             if repetition > 1:
                 value = element.getvalue()
                 if value is None:
                     value = ""
-                values.append("%s(%s)"%(repetition, value))
+                values.append("%s(%s)" % (repetition, value))
             else:
                 values.append(element.getvalue())
-        return "[%s]"%", ".join(values)
+        return "[%s]" % ", ".join(values)
     setattr(cls, "getvalue", getvalue)
 
-cls = PLCOpenParser.GetElementClass("structValue", "value")
-if cls:
-    structValue_model = re.compile("(.*):=(.*)")
-    
+
+cls = PLCOpenParser.GetElementClass("arrayValue", "value")
+if cls:
+    arrayValue_model = re.compile(r"([0-9]+)\((.*)\)$")
+    _updateArrayValueValueClass(cls)
+
+# ----------------------------------------------------------------------
+
+
+def _updateStructValueValueClass(cls):
     def setvalue(self, value):
         elements = []
         for item in extractValues(value[1:-1]):
@@ -2465,11 +2894,16 @@
                 elements.append(element)
         self.value = elements
     setattr(cls, "setvalue", setvalue)
-    
+
     def getvalue(self):
         values = []
         for element in self.value:
-            values.append("%s := %s"%(element.getmember(), element.getvalue()))
-        return "(%s)"%", ".join(values)
+            values.append("%s := %s" % (element.getmember(), element.getvalue()))
+        return "(%s)" % ", ".join(values)
     setattr(cls, "getvalue", getvalue)
 
+
+cls = PLCOpenParser.GetElementClass("structValue", "value")
+if cls:
+    structValue_model = re.compile("(.*):=(.*)")
+    _updateStructValueValueClass(cls)
--- a/plcopen/pou_block_instances.xslt	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/pou_block_instances.xslt	Mon Jan 07 13:50:39 2019 +0100
@@ -1,24 +1,15 @@
 <?xml version="1.0"?>
-<xsl:stylesheet xmlns:func="http://exslt.org/functions" xmlns:dyn="http://exslt.org/dynamic" xmlns:str="http://exslt.org/strings" xmlns:math="http://exslt.org/math" xmlns:exsl="http://exslt.org/common" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:yml="http://fdik.org/yml" xmlns:set="http://exslt.org/sets" xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" xmlns:ns="pou_block_instances_ns" xmlns:regexp="http://exslt.org/regular-expressions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" extension-element-prefixes="ns" version="1.0" exclude-result-prefixes="ns">
+<xsl:stylesheet xmlns:exsl="http://exslt.org/common" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" xmlns:ns="beremiz" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" extension-element-prefixes="ns" version="1.0" exclude-result-prefixes="ns">
   <xsl:output method="xml"/>
-  <xsl:variable name="space" select="'                                                                                                                                                                                                        '"/>
-  <xsl:param name="autoindent" select="4"/>
-  <xsl:template match="text()">
-    <xsl:param name="_indent" select="0"/>
-  </xsl:template>
+  <xsl:template match="text()"/>
   <xsl:template match="ppx:pou[ppx:body]|ppx:transition[ppx:body]|ppx:action[ppx:body]">
-    <xsl:param name="_indent" select="0"/>
-    <xsl:apply-templates select="ppx:body/*[self::ppx:FBD or self::ppx:LD or self::ppx:SFC]/*">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:body/*[self::ppx:FBD or self::ppx:LD or self::ppx:SFC]/*"/>
   </xsl:template>
   <xsl:template name="add_instance">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="type"/>
     <xsl:value-of select="ns:AddBlockInstance($type, @localId, ppx:position/@x, ppx:position/@y, @width, @height)"/>
   </xsl:template>
   <xsl:template name="execution_order">
-    <xsl:param name="_indent" select="0"/>
     <xsl:choose>
       <xsl:when test="@executionOrderId">
         <xsl:value-of select="@executionOrderId"/>
@@ -29,7 +20,6 @@
     </xsl:choose>
   </xsl:template>
   <xsl:template name="ConnectionInfos">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="type"/>
     <xsl:param name="negated"/>
     <xsl:param name="edge"/>
@@ -37,18 +27,13 @@
     <xsl:value-of select="ns:AddInstanceConnection($type, $formalParameter, $negated, $edge, ppx:relPosition/@x, ppx:relPosition/@y)"/>
   </xsl:template>
   <xsl:template match="ppx:position">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="ns:AddLinkPoint(@x, @y)"/>
   </xsl:template>
   <xsl:template match="ppx:connection">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="ns:AddConnectionLink(@refLocalId, @formalParameter)"/>
-    <xsl:apply-templates select="ppx:position">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:position"/>
   </xsl:template>
   <xsl:template match="ppx:connectionPointIn">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="negated"/>
     <xsl:param name="edge"/>
     <xsl:param name="formalParameter"/>
@@ -66,12 +51,9 @@
         <xsl:value-of select="$formalParameter"/>
       </xsl:with-param>
     </xsl:call-template>
-    <xsl:apply-templates select="ppx:connection">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:connection"/>
   </xsl:template>
   <xsl:template match="ppx:connectionPointOut">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="negated"/>
     <xsl:param name="edge"/>
     <xsl:param name="formalParameter"/>
@@ -91,7 +73,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:connectionPointOutAction">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="ConnectionInfos">
       <xsl:with-param name="type">
         <xsl:text>output</xsl:text>
@@ -99,7 +80,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:comment">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="ns:SetSpecificValues(ppx:content/xhtml:p/text())"/>
     <xsl:call-template name="add_instance">
       <xsl:with-param name="type">
@@ -108,7 +88,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:block">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="execution_order">
       <xsl:call-template name="execution_order"/>
     </xsl:variable>
@@ -120,7 +99,6 @@
     </xsl:call-template>
     <xsl:for-each select="ppx:inputVariables/ppx:variable">
       <xsl:apply-templates select="ppx:connectionPointIn">
-        <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
         <xsl:with-param name="negated" select="@negated"/>
         <xsl:with-param name="edge" select="@edge"/>
         <xsl:with-param name="formalParameter" select="@formalParameter"/>
@@ -128,7 +106,6 @@
     </xsl:for-each>
     <xsl:for-each select="ppx:outputVariables/ppx:variable">
       <xsl:apply-templates select="ppx:connectionPointOut">
-        <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
         <xsl:with-param name="negated" select="@negated"/>
         <xsl:with-param name="edge" select="@edge"/>
         <xsl:with-param name="formalParameter" select="@formalParameter"/>
@@ -136,23 +113,18 @@
     </xsl:for-each>
   </xsl:template>
   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="@name"/>
   </xsl:template>
   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:string">
-    <xsl:param name="_indent" select="0"/>
     <xsl:text>STRING</xsl:text>
   </xsl:template>
   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:wstring">
-    <xsl:param name="_indent" select="0"/>
     <xsl:text>WSTRING</xsl:text>
   </xsl:template>
   <xsl:template match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="local-name()"/>
   </xsl:template>
   <xsl:template name="VariableBlockInfos">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="type"/>
     <xsl:variable name="expression">
       <xsl:value-of select="ppx:expression/text()"/>
@@ -163,14 +135,10 @@
           <xsl:text>BOOL</xsl:text>
         </xsl:when>
         <xsl:when test="ancestor::ppx:pou[@name=$expression]">
-          <xsl:apply-templates select="ancestor::ppx:pou/child::ppx:interface/ppx:returnType">
-            <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-          </xsl:apply-templates>
-        </xsl:when>
-        <xsl:otherwise>
-          <xsl:apply-templates select="ancestor::ppx:pou/child::ppx:interface/*/ppx:variable[@name=$expression]/ppx:type">
-            <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-          </xsl:apply-templates>
+          <xsl:apply-templates select="ancestor::ppx:pou/child::ppx:interface/ppx:returnType"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates select="ancestor::ppx:pou/child::ppx:interface/*/ppx:variable[@name=$expression]/ppx:type"/>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:variable>
@@ -184,51 +152,40 @@
       </xsl:with-param>
     </xsl:call-template>
     <xsl:apply-templates select="ppx:connectionPointIn">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="negated" select="@negatedIn"/>
       <xsl:with-param name="edge" select="@edgeIn"/>
     </xsl:apply-templates>
     <xsl:apply-templates select="ppx:connectionPointOut">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="negated" select="@negatedOut"/>
       <xsl:with-param name="edge" select="@edgeOut"/>
     </xsl:apply-templates>
   </xsl:template>
   <xsl:template match="ppx:inVariable">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="VariableBlockInfos">
       <xsl:with-param name="type" select="'input'"/>
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:outVariable">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="VariableBlockInfos">
       <xsl:with-param name="type" select="'output'"/>
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:inOutVariable">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="VariableBlockInfos">
       <xsl:with-param name="type" select="'inout'"/>
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:connector|ppx:continuation">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="ns:SetSpecificValues(@name)"/>
     <xsl:call-template name="add_instance">
       <xsl:with-param name="type">
         <xsl:value-of select="local-name()"/>
       </xsl:with-param>
     </xsl:call-template>
-    <xsl:apply-templates select="ppx:connectionPointIn">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
-    <xsl:apply-templates select="ppx:connectionPointOut">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:connectionPointIn"/>
+    <xsl:apply-templates select="ppx:connectionPointOut"/>
   </xsl:template>
   <xsl:template match="ppx:leftPowerRail|ppx:rightPowerRail">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="type" select="local-name()"/>
     <xsl:variable name="connectors">
       <xsl:choose>
@@ -248,19 +205,14 @@
     </xsl:call-template>
     <xsl:choose>
       <xsl:when test="$type='leftPowerRail'">
-        <xsl:apply-templates select="ppx:connectionPointOut">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-        </xsl:apply-templates>
+        <xsl:apply-templates select="ppx:connectionPointOut"/>
       </xsl:when>
       <xsl:otherwise>
-        <xsl:apply-templates select="ppx:connectionPointIn">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-        </xsl:apply-templates>
+        <xsl:apply-templates select="ppx:connectionPointIn"/>
       </xsl:otherwise>
     </xsl:choose>
   </xsl:template>
   <xsl:template match="ppx:contact|ppx:coil">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="type" select="local-name()"/>
     <xsl:variable name="storage">
       <xsl:choose>
@@ -278,18 +230,12 @@
         <xsl:value-of select="$type"/>
       </xsl:with-param>
     </xsl:call-template>
-    <xsl:apply-templates select="ppx:connectionPointIn">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
-    <xsl:apply-templates select="ppx:connectionPointOut">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:connectionPointIn"/>
+    <xsl:apply-templates select="ppx:connectionPointOut"/>
   </xsl:template>
   <xsl:template match="ppx:step">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="ns:SetSpecificValues(@name, @initialStep)"/>
     <xsl:apply-templates select="ppx:connectionPointOutAction">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="negated" select="@negated"/>
     </xsl:apply-templates>
     <xsl:call-template name="add_instance">
@@ -297,15 +243,10 @@
         <xsl:value-of select="local-name()"/>
       </xsl:with-param>
     </xsl:call-template>
-    <xsl:apply-templates select="ppx:connectionPointIn">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
-    <xsl:apply-templates select="ppx:connectionPointOut">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:connectionPointIn"/>
+    <xsl:apply-templates select="ppx:connectionPointOut"/>
   </xsl:template>
   <xsl:template match="ppx:transition">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="priority">
       <xsl:choose>
         <xsl:when test="@priority">
@@ -341,7 +282,6 @@
     </xsl:variable>
     <xsl:value-of select="ns:SetSpecificValues($priority, $condition_type, $condition)"/>
     <xsl:apply-templates select="ppx:condition/ppx:connectionPointIn">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="negated" select="ppx:condition/@negated"/>
     </xsl:apply-templates>
     <xsl:call-template name="add_instance">
@@ -349,15 +289,10 @@
         <xsl:value-of select="local-name()"/>
       </xsl:with-param>
     </xsl:call-template>
-    <xsl:apply-templates select="ppx:connectionPointIn">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
-    <xsl:apply-templates select="ppx:connectionPointOut">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:connectionPointIn"/>
+    <xsl:apply-templates select="ppx:connectionPointOut"/>
   </xsl:template>
   <xsl:template match="ppx:selectionDivergence|ppx:selectionConvergence|ppx:simultaneousDivergence|ppx:simultaneousConvergence">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="type">
       <xsl:value-of select="local-name()"/>
     </xsl:variable>
@@ -377,15 +312,10 @@
         <xsl:value-of select="$type"/>
       </xsl:with-param>
     </xsl:call-template>
-    <xsl:apply-templates select="ppx:connectionPointIn">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
-    <xsl:apply-templates select="ppx:connectionPointOut">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:connectionPointIn"/>
+    <xsl:apply-templates select="ppx:connectionPointOut"/>
   </xsl:template>
   <xsl:template match="ppx:jumpStep">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="type">
       <xsl:text>jump</xsl:text>
     </xsl:variable>
@@ -395,12 +325,9 @@
         <xsl:value-of select="$type"/>
       </xsl:with-param>
     </xsl:call-template>
-    <xsl:apply-templates select="ppx:connectionPointIn">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:connectionPointIn"/>
   </xsl:template>
   <xsl:template match="ppx:action">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="type">
       <xsl:choose>
         <xsl:when test="ppx:reference">
@@ -434,18 +361,14 @@
     <xsl:value-of select="ns:AddAction($qualifier, $type, $value, @duration, @indicator)"/>
   </xsl:template>
   <xsl:template match="ppx:actionBlock">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="ns:SetSpecificValues()"/>
-    <xsl:apply-templates select="ppx:action">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:action"/>
     <xsl:call-template name="add_instance">
       <xsl:with-param name="type">
         <xsl:value-of select="local-name()"/>
       </xsl:with-param>
     </xsl:call-template>
     <xsl:apply-templates select="ppx:connectionPointIn">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
       <xsl:with-param name="negated" select="@negated"/>
     </xsl:apply-templates>
   </xsl:template>
--- a/plcopen/pou_block_instances.ysl2	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/pou_block_instances.ysl2	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,7 @@
-include yslt.yml2
-estylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
+include yslt_noindent.yml2
+istylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
             xmlns:xhtml="http://www.w3.org/1999/xhtml"
-            xmlns:ns="pou_block_instances_ns" 
+            xmlns:ns="beremiz" 
             extension-element-prefixes="ns" 
             exclude-result-prefixes="ns" {
     
@@ -312,4 +312,4 @@
             with "negated", "@negated";
         }
     }
-}
\ No newline at end of file
+}
--- a/plcopen/pou_variables.xslt	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/pou_variables.xslt	Mon Jan 07 13:50:39 2019 +0100
@@ -1,34 +1,16 @@
 <?xml version="1.0"?>
-<xsl:stylesheet xmlns:func="http://exslt.org/functions" xmlns:dyn="http://exslt.org/dynamic" xmlns:str="http://exslt.org/strings" xmlns:math="http://exslt.org/math" xmlns:exsl="http://exslt.org/common" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:yml="http://fdik.org/yml" xmlns:set="http://exslt.org/sets" xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" xmlns:ns="pou_vars_ns" xmlns:regexp="http://exslt.org/regular-expressions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" extension-element-prefixes="ns" version="1.0" exclude-result-prefixes="ns">
+<xsl:stylesheet xmlns:exsl="http://exslt.org/common" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" xmlns:ns="beremiz" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" extension-element-prefixes="ns" version="1.0" exclude-result-prefixes="ns">
   <xsl:output method="xml"/>
-  <xsl:variable name="space" select="'                                                                                                                                                                                                        '"/>
-  <xsl:param name="autoindent" select="4"/>
-  <xsl:template match="text()">
-    <xsl:param name="_indent" select="0"/>
-  </xsl:template>
-  <xsl:template mode="var_class" match="text()">
-    <xsl:param name="_indent" select="0"/>
-  </xsl:template>
-  <xsl:template mode="var_type" match="text()">
-    <xsl:param name="_indent" select="0"/>
-  </xsl:template>
-  <xsl:template mode="var_edit" match="text()">
-    <xsl:param name="_indent" select="0"/>
-  </xsl:template>
-  <xsl:template mode="var_debug" match="text()">
-    <xsl:param name="_indent" select="0"/>
-  </xsl:template>
-  <xsl:variable name="project">
-    <xsl:copy-of select="document('project')/project/*"/>
-  </xsl:variable>
-  <xsl:variable name="stdlib">
-    <xsl:copy-of select="document('stdlib')/stdlib/*"/>
-  </xsl:variable>
-  <xsl:variable name="extensions">
-    <xsl:copy-of select="document('extensions')/extensions/*"/>
-  </xsl:variable>
+  <xsl:template match="text()"/>
+  <xsl:template mode="var_class" match="text()"/>
+  <xsl:template mode="var_type" match="text()"/>
+  <xsl:template mode="var_edit" match="text()"/>
+  <xsl:template mode="var_debug" match="text()"/>
+  <xsl:variable name="project" select="ns:GetProject()"/>
+  <xsl:variable name="stdlib" select="ns:GetStdLibs()"/>
+  <xsl:variable name="extensions" select="ns:GetExtensions()"/>
+  <xsl:variable name="all_types" select="($project | $stdlib | $extensions)/ppx:types"/>
   <xsl:template name="add_root">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="class"/>
     <xsl:param name="type"/>
     <xsl:param name="edit">
@@ -40,7 +22,6 @@
     <xsl:value-of select="ns:SetRoot($class, $type, $edit, $debug)"/>
   </xsl:template>
   <xsl:template match="ppx:pou">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="add_root">
       <xsl:with-param name="class">
         <xsl:value-of select="@pouType"/>
@@ -49,37 +30,26 @@
         <xsl:value-of select="@name"/>
       </xsl:with-param>
     </xsl:call-template>
-    <xsl:apply-templates select="ppx:interface">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
-    <xsl:apply-templates mode="variable_list" select="ppx:actions/ppx:action | ppx:transitions/ppx:transition">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:interface"/>
+    <xsl:apply-templates mode="variable_list" select="ppx:actions/ppx:action | ppx:transitions/ppx:transition"/>
   </xsl:template>
   <xsl:template match="ppx:action">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="add_root">
       <xsl:with-param name="class">
         <xsl:text>action</xsl:text>
       </xsl:with-param>
     </xsl:call-template>
-    <xsl:apply-templates select="ancestor::ppx:pou/child::ppx:interface">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ancestor::ppx:pou/child::ppx:interface"/>
   </xsl:template>
   <xsl:template match="ppx:transition">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="add_root">
       <xsl:with-param name="class">
         <xsl:text>transition</xsl:text>
       </xsl:with-param>
     </xsl:call-template>
-    <xsl:apply-templates select="ancestor::ppx:pou/child::ppx:interface">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ancestor::ppx:pou/child::ppx:interface"/>
   </xsl:template>
   <xsl:template match="ppx:configuration">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="add_root">
       <xsl:with-param name="class">
         <xsl:text>configuration</xsl:text>
@@ -88,15 +58,10 @@
         <xsl:text>false</xsl:text>
       </xsl:with-param>
     </xsl:call-template>
-    <xsl:apply-templates mode="variable_list" select="ppx:resource">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
-    <xsl:apply-templates select="ppx:globalVars">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates mode="variable_list" select="ppx:resource"/>
+    <xsl:apply-templates select="ppx:globalVars"/>
   </xsl:template>
   <xsl:template match="ppx:resource">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="add_root">
       <xsl:with-param name="class">
         <xsl:text>resource</xsl:text>
@@ -105,45 +70,32 @@
         <xsl:text>false</xsl:text>
       </xsl:with-param>
     </xsl:call-template>
-    <xsl:apply-templates mode="variable_list" select="ppx:pouInstance | ppx:task/ppx:pouInstance">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
-    <xsl:apply-templates select="ppx:globalVars">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates mode="variable_list" select="ppx:pouInstance | ppx:task/ppx:pouInstance"/>
+    <xsl:apply-templates select="ppx:globalVars"/>
   </xsl:template>
   <xsl:template name="variables_infos">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="var_class"/>
     <xsl:for-each select="ppx:variable">
       <xsl:variable name="class">
         <xsl:apply-templates mode="var_class" select="ppx:type">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
           <xsl:with-param name="default_class">
             <xsl:value-of select="$var_class"/>
           </xsl:with-param>
         </xsl:apply-templates>
       </xsl:variable>
       <xsl:variable name="type">
-        <xsl:apply-templates mode="var_type" select="ppx:type">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-        </xsl:apply-templates>
+        <xsl:apply-templates mode="var_type" select="ppx:type"/>
       </xsl:variable>
       <xsl:variable name="edit">
-        <xsl:apply-templates mode="var_edit" select="ppx:type">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-        </xsl:apply-templates>
+        <xsl:apply-templates mode="var_edit" select="ppx:type"/>
       </xsl:variable>
       <xsl:variable name="debug">
-        <xsl:apply-templates mode="var_debug" select="ppx:type">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-        </xsl:apply-templates>
+        <xsl:apply-templates mode="var_debug" select="ppx:type"/>
       </xsl:variable>
       <xsl:value-of select="ns:AddVariable(@name, $class, $type, $edit, $debug)"/>
     </xsl:for-each>
   </xsl:template>
   <xsl:template match="ppx:localVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>Local</xsl:text>
@@ -151,7 +103,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:globalVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>Global</xsl:text>
@@ -159,7 +110,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:externalVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>External</xsl:text>
@@ -167,7 +117,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:tempVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>Temp</xsl:text>
@@ -175,7 +124,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:inputVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>Input</xsl:text>
@@ -183,7 +131,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:outputVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>Output</xsl:text>
@@ -191,7 +138,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:inOutVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>InOut</xsl:text>
@@ -199,7 +145,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template name="add_variable">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="name"/>
     <xsl:param name="class"/>
     <xsl:param name="type"/>
@@ -212,7 +157,6 @@
     <xsl:value-of select="ns:AddVariable($name, $class, $type, $edit, $debug)"/>
   </xsl:template>
   <xsl:template mode="variable_list" match="ppx:action">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="add_variable">
       <xsl:with-param name="name">
         <xsl:value-of select="@name"/>
@@ -223,7 +167,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template mode="variable_list" match="ppx:transition">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="add_variable">
       <xsl:with-param name="name">
         <xsl:value-of select="@name"/>
@@ -234,7 +177,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template mode="variable_list" match="ppx:resource">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="add_variable">
       <xsl:with-param name="name">
         <xsl:value-of select="@name"/>
@@ -248,7 +190,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template mode="variable_list" match="ppx:pouInstance">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="add_variable">
       <xsl:with-param name="name">
         <xsl:value-of select="@name"/>
@@ -262,17 +203,12 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template mode="var_class" match="*[self::ppx:type or self::ppx:baseType]/ppx:derived">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="default_class"/>
     <xsl:variable name="type_name" select="@name"/>
-    <xsl:variable name="pou_infos">
-      <xsl:copy-of select="exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                    exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                    exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]"/>
-    </xsl:variable>
+    <xsl:variable name="pou_infos" select="$all_types/ppx:pous/ppx:pou[@name=$type_name]"/>
     <xsl:choose>
-      <xsl:when test="$pou_infos != ''">
-        <xsl:apply-templates mode="var_class" select="exsl:node-set($pou_infos)">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-        </xsl:apply-templates>
+      <xsl:when test="$pou_infos">
+        <xsl:apply-templates mode="var_class" select="$pou_infos"/>
       </xsl:when>
       <xsl:otherwise>
         <xsl:value-of select="$default_class"/>
@@ -280,20 +216,16 @@
     </xsl:choose>
   </xsl:template>
   <xsl:template mode="var_class" match="ppx:pou">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="@pouType"/>
   </xsl:template>
   <xsl:template mode="var_class" match="*[self::ppx:type or self::ppx:baseType]/*">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="default_class"/>
     <xsl:value-of select="$default_class"/>
   </xsl:template>
   <xsl:template mode="var_type" match="*[self::ppx:type or self::ppx:baseType]/ppx:derived">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="@name"/>
   </xsl:template>
   <xsl:template mode="var_type" match="*[self::ppx:type or self::ppx:baseType]/ppx:array">
-    <xsl:param name="_indent" select="0"/>
     <xsl:text>ARRAY [</xsl:text>
     <xsl:for-each select="ppx:dimension">
       <xsl:value-of select="@lower"/>
@@ -301,30 +233,22 @@
       <xsl:value-of select="@upper"/>
     </xsl:for-each>
     <xsl:text>] OF </xsl:text>
-    <xsl:apply-templates mode="var_type" select="ppx:baseType">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates mode="var_type" select="ppx:baseType"/>
   </xsl:template>
   <xsl:template mode="var_type" match="*[self::ppx:type or self::ppx:baseType]/ppx:string">
-    <xsl:param name="_indent" select="0"/>
     <xsl:text>STRING</xsl:text>
   </xsl:template>
   <xsl:template mode="var_type" match="*[self::ppx:type or self::ppx:baseType]/ppx:wstring">
-    <xsl:param name="_indent" select="0"/>
     <xsl:text>WSTRING</xsl:text>
   </xsl:template>
   <xsl:template mode="var_type" match="*[self::ppx:type or self::ppx:baseType]/*">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="local-name()"/>
   </xsl:template>
   <xsl:template mode="var_edit" match="*[self::ppx:type or self::ppx:baseType]/ppx:derived">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="type_name" select="@name"/>
-    <xsl:variable name="pou_infos">
-      <xsl:copy-of select="exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]"/>
-    </xsl:variable>
+    <xsl:variable name="pou_infos" select="$project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]"/>
     <xsl:choose>
-      <xsl:when test="$pou_infos != ''">
+      <xsl:when test="$pou_infos">
         <xsl:text>true</xsl:text>
       </xsl:when>
       <xsl:otherwise>
@@ -333,26 +257,17 @@
     </xsl:choose>
   </xsl:template>
   <xsl:template mode="var_edit" match="*[self::ppx:type or self::ppx:baseType]/ppx:array">
-    <xsl:param name="_indent" select="0"/>
-    <xsl:apply-templates mode="var_edit" select="ppx:baseType">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates mode="var_edit" select="ppx:baseType"/>
   </xsl:template>
   <xsl:template mode="var_edit" match="*[self::ppx:type or self::ppx:baseType]/*">
-    <xsl:param name="_indent" select="0"/>
     <xsl:text>false</xsl:text>
   </xsl:template>
   <xsl:template mode="var_debug" match="*[self::ppx:type or self::ppx:baseType]/ppx:derived">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="type_name" select="@name"/>
-    <xsl:variable name="datatype_infos">
-      <xsl:copy-of select="exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                    exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                    exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                    exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]"/>
-    </xsl:variable>
+    <xsl:variable name="datatype_infos" select="             $project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |             $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name]         "/>
     <xsl:choose>
-      <xsl:when test="$datatype_infos != ''">
-        <xsl:apply-templates mode="var_debug" select="exsl:node-set($datatype_infos)">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-        </xsl:apply-templates>
+      <xsl:when test="$datatype_infos">
+        <xsl:apply-templates mode="var_debug" select="$datatype_infos"/>
       </xsl:when>
       <xsl:otherwise>
         <xsl:text>false</xsl:text>
@@ -360,19 +275,15 @@
     </xsl:choose>
   </xsl:template>
   <xsl:template mode="var_debug" match="ppx:pou">
-    <xsl:param name="_indent" select="0"/>
     <xsl:text>true</xsl:text>
   </xsl:template>
   <xsl:template mode="var_debug" match="*[self::ppx:type or self::ppx:baseType]/ppx:array">
-    <xsl:param name="_indent" select="0"/>
     <xsl:text>false</xsl:text>
   </xsl:template>
   <xsl:template mode="var_debug" match="*[self::ppx:type or self::ppx:baseType]/ppx:struct">
-    <xsl:param name="_indent" select="0"/>
     <xsl:text>false</xsl:text>
   </xsl:template>
   <xsl:template mode="var_debug" match="*[self::ppx:type or self::ppx:baseType]/*">
-    <xsl:param name="_indent" select="0"/>
     <xsl:text>true</xsl:text>
   </xsl:template>
 </xsl:stylesheet>
--- a/plcopen/pou_variables.ysl2	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/pou_variables.ysl2	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,7 @@
-include yslt.yml2
-estylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
+include yslt_noindent.yml2
+istylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
             xmlns:xhtml="http://www.w3.org/1999/xhtml"
-            xmlns:ns="pou_vars_ns" 
+            xmlns:ns="beremiz" 
             extension-element-prefixes="ns" 
             exclude-result-prefixes="ns" {
     
@@ -11,16 +11,13 @@
     template "text()", mode="var_edit";
     template "text()", mode="var_debug";
     
-    variable "project" {
-        copy "document('project')/project/*";
-    }
-    
-    variable "stdlib" {
-        copy "document('stdlib')/stdlib/*";
-    }
-    variable "extensions" {
-        copy "document('extensions')/extensions/*";
-    }
+    variable "project", "ns:GetProject()";
+    
+    variable "stdlib", "ns:GetStdLibs()";
+
+    variable "extensions", "ns:GetExtensions()";
+
+    variable "all_types", "($project | $stdlib | $extensions)/ppx:types";
     
     function "add_root" {
         param "class";
@@ -176,14 +173,10 @@
     template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_class" {
         param "default_class";
         variable "type_name", "@name";
-        variable "pou_infos" {
-            copy """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                    exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                    exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]""";
-        }
+        variable "pou_infos", "$all_types/ppx:pous/ppx:pou[@name=$type_name]";
         choose {
-            when "$pou_infos != ''" {
-                apply "exsl:node-set($pou_infos)", mode="var_class";
+            when "$pou_infos" {
+                apply "$pou_infos", mode="var_class";
             }
             otherwise {
                 value "$default_class"
@@ -227,11 +220,9 @@
     
     template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_edit" {
         variable "type_name", "@name";
-        variable "pou_infos" {
-            copy "exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]";
-        }
+        variable "pou_infos", "$project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]";
         choose {
-            when "$pou_infos != ''" > true
+            when "$pou_infos" > true
             otherwise > false
         }
     }
@@ -246,15 +237,13 @@
     
     template "*[self::ppx:type or self::ppx:baseType]/ppx:derived", mode="var_debug" {
         variable "type_name", "@name";
-        variable "datatype_infos" {
-            copy """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                    exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
-                    exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
-                    exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]""";
-        }
+        variable "datatype_infos", """ \
+            $project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] | \
+            $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name] \
+        """;
         choose {
-            when "$datatype_infos != ''" {
-                apply "exsl:node-set($datatype_infos)", mode="var_debug";
+            when "$datatype_infos" {
+                apply "$datatype_infos", mode="var_debug";
             }
             otherwise > false
         }
--- a/plcopen/structures.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/structures.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,17 +22,22 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import string, re
-from plcopen import LoadProject
+
+from __future__ import absolute_import
+import re
 from collections import OrderedDict
-from definitions import *
+from functools import reduce
+
+from plcopen.plcopen import LoadProject
+from plcopen.definitions import *
 
 TypeHierarchy = dict(TypeHierarchy_list)
 
-"""
-returns true if the given data type is the same that "reference" meta-type or one of its types.
-"""
+
 def IsOfType(type, reference):
+    """
+    Returns true if the given data type is the same that "reference" meta-type or one of its types.
+    """
     if reference is None:
         return True
     elif type == reference:
@@ -43,11 +48,13 @@
             return IsOfType(parent_type, reference)
     return False
 
-"""
-returns list of all types that correspont to the ANY* meta type
-"""
+
 def GetSubTypes(type):
-    return [typename for typename, parenttype in TypeHierarchy.items() if not typename.startswith("ANY") and IsOfType(typename, type)]
+    """
+    Returns list of all types that correspont to the ANY* meta type
+    """
+    return [typename for typename, _parenttype in TypeHierarchy.items() if not typename.startswith("ANY") and IsOfType(typename, type)]
+
 
 DataTypeRange = dict(DataTypeRange_list)
 
@@ -67,76 +74,85 @@
     - The default modifier which can be "none", "negated", "rising" or "falling"
 """
 
-StdBlckLibs = {libname : LoadProject(tc6fname)[0]
-             for libname, tc6fname in StdTC6Libs}
-StdBlckLst = [{"name" : libname, "list":
+StdBlckLibs = {libname: LoadProject(tc6fname)[0]
+               for libname, tc6fname in StdTC6Libs}
+StdBlckLst = [{"name": libname, "list":
                [GetBlockInfos(pous) for pous in lib.getpous()]}
-             for libname, lib in StdBlckLibs.iteritems()]
-
-#-------------------------------------------------------------------------------
+              for libname, lib in StdBlckLibs.iteritems()]
+
+# -------------------------------------------------------------------------------
 #                             Test identifier
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 IDENTIFIER_MODEL = re.compile(
     "(?:%(letter)s|_(?:%(letter)s|%(digit)s))(?:_?(?:%(letter)s|%(digit)s))*$" %
     {"letter": "[a-zA-Z]", "digit": "[0-9]"})
 
-# Test if identifier is valid
+
 def TestIdentifier(identifier):
-     return IDENTIFIER_MODEL.match(identifier) is not None
-
-#-------------------------------------------------------------------------------
+    """
+    Test if identifier is valid
+    """
+    return IDENTIFIER_MODEL.match(identifier) is not None
+
+# -------------------------------------------------------------------------------
 #                        Standard functions list generation
-#-------------------------------------------------------------------------------
-
-
-"""
-take a .csv file and translate it it a "csv_table"
-"""            
+# -------------------------------------------------------------------------------
+
+
 def csv_file_to_table(file):
-    return [ map(string.strip,line.split(';')) for line in file.xreadlines()]
-
-"""
-seek into the csv table to a section ( section_name match 1st field )
-return the matching row without first field
-"""
+    """
+    take a .csv file and translate it it a "csv_table"
+    """
+    table = [[column.strip()
+              for column in line.split(';')]
+             for line in file.readlines()]
+    return table
+
+
 def find_section(section_name, table):
+    """
+    seek into the csv table to a section ( section_name match 1st field )
+    return the matching row without first field
+    """
     fields = [None]
-    while(fields[0] != section_name):
+    while fields[0] != section_name:
         fields = table.pop(0)
     return fields[1:]
 
-"""
-extract the standard functions standard parameter names and types...
-return a { ParameterName: Type, ...}
-"""
+
 def get_standard_funtions_input_variables(table):
+    """
+    extract the standard functions standard parameter names and types...
+    return a { ParameterName: Type, ...}
+    """
     variables = find_section("Standard_functions_variables_types", table)
     standard_funtions_input_variables = {}
-    fields = [True,True]
-    while(fields[1]):
+    fields = [True, True]
+    while fields[1]:
         fields = table.pop(0)
-        variable_from_csv = dict([(champ, val) for champ, val in zip(variables, fields[1:]) if champ!=''])
+        variable_from_csv = dict([(champ, val) for champ, val in zip(variables, fields[1:]) if champ != ''])
         standard_funtions_input_variables[variable_from_csv['name']] = variable_from_csv['type']
     return standard_funtions_input_variables
-    
-"""
-translate .csv file input declaration into PLCOpenEditor interessting values
-in : "(ANY_NUM, ANY_NUM)" and { ParameterName: Type, ...}
-return [("IN1","ANY_NUM","none"),("IN2","ANY_NUM","none")] 
-"""
+
+
 def csv_input_translate(str_decl, variables, base):
-    decl = str_decl.replace('(','').replace(')','').replace(' ','').split(',')
+    """
+    translate .csv file input declaration into PLCOpenEditor interessting values
+    in : "(ANY_NUM, ANY_NUM)" and { ParameterName: Type, ...}
+    return [("IN1","ANY_NUM","none"),("IN2","ANY_NUM","none")]
+    """
+    decl = str_decl.replace('(', '').replace(')', '').replace(' ', '').split(',')
     params = []
-    
+
     len_of_not_predifined_variable = len([True for param_type in decl if param_type not in variables])
-    
+
     for param_type in decl:
         if param_type in variables.keys():
             param_name = param_type
             param_type = variables[param_type]
         elif len_of_not_predifined_variable > 1:
-            param_name = "IN%d"%base
+            param_name = "IN%d" % base
             base += 1
         else:
             param_name = "IN"
@@ -144,10 +160,11 @@
     return params
 
 
-"""
-Returns this kind of declaration for all standard functions
-
-            [{"name" : "Numerical", 'list': [   {   
+def get_standard_funtions(table):
+    """
+    Returns this kind of declaration for all standard functions
+
+            [{"name" : "Numerical", 'list': [   {
                 'baseinputnumber': 1,
                 'comment': 'Addition',
                 'extensible': True,
@@ -156,21 +173,20 @@
                 'name': 'ADD',
                 'outputs': [('OUT', 'ANY_NUM', 'none')],
                 'type': 'function'}, ...... ] },.....]
-"""
-def get_standard_funtions(table):
-    
+    """
+
     variables = get_standard_funtions_input_variables(table)
-    
-    fonctions = find_section("Standard_functions_type",table)
+
+    fonctions = find_section("Standard_functions_type", table)
 
     Standard_Functions_Decl = []
     Current_section = None
-    
+
     translate = {
-            "extensible" : lambda x: {"yes":True, "no":False}[x],
-            "inputs" : lambda x:csv_input_translate(x,variables,baseinputnumber),
-            "outputs":lambda x:[("OUT",x,"none")]}
-    
+        "extensible": lambda x: {"yes": True, "no": False}[x],
+        "inputs": lambda x: csv_input_translate(x, variables, baseinputnumber),
+        "outputs": lambda x: [("OUT", x, "none")]}
+
     for fields in table:
         if fields[1]:
             # If function section name given
@@ -180,82 +196,82 @@
                     section_name = words[1]
                 else:
                     section_name = fields[0]
-                Current_section = {"name" : section_name, "list" : []}
+                Current_section = {"name": section_name, "list": []}
                 Standard_Functions_Decl.append(Current_section)
-                Function_decl_list = []
             if Current_section:
                 Function_decl = dict([(champ, val) for champ, val in zip(fonctions, fields[1:]) if champ])
-                baseinputnumber = int(Function_decl.get("baseinputnumber",1))
+                baseinputnumber = int(Function_decl.get("baseinputnumber", 1))
                 Function_decl["baseinputnumber"] = baseinputnumber
                 for param, value in Function_decl.iteritems():
                     if param in translate:
                         Function_decl[param] = translate[param](value)
                 Function_decl["type"] = "function"
-                
-                if Function_decl["name"].startswith('*') or Function_decl["name"].endswith('*') :
+
+                if Function_decl["name"].startswith('*') or Function_decl["name"].endswith('*'):
                     input_ovrloading_types = GetSubTypes(Function_decl["inputs"][0][1])
                     output_types = GetSubTypes(Function_decl["outputs"][0][1])
                 else:
                     input_ovrloading_types = [None]
                     output_types = [None]
-                
+
                 funcdeclname_orig = Function_decl["name"]
                 funcdeclname = Function_decl["name"].strip('*_')
                 fdc = Function_decl["inputs"][:]
                 for intype in input_ovrloading_types:
-                    if intype != None:
+                    if intype is not None:
                         Function_decl["inputs"] = []
                         for decl_tpl in fdc:
                             if IsOfType(intype, decl_tpl[1]):
                                 Function_decl["inputs"] += [(decl_tpl[0], intype, decl_tpl[2])]
                             else:
                                 Function_decl["inputs"] += [(decl_tpl)]
-                            
+
                             if funcdeclname_orig.startswith('*'):
-                                funcdeclin = intype + '_' + funcdeclname 
+                                funcdeclin = intype + '_' + funcdeclname
                             else:
                                 funcdeclin = funcdeclname
                     else:
                         funcdeclin = funcdeclname
-                        
+
                     for outype in output_types:
-                        if outype != None:
+                        if outype is not None:
                             decl_tpl = Function_decl["outputs"][0]
-                            Function_decl["outputs"] = [ (decl_tpl[0] , outype,  decl_tpl[2])]
+                            Function_decl["outputs"] = [(decl_tpl[0], outype,  decl_tpl[2])]
                             if funcdeclname_orig.endswith('*'):
-                                funcdeclout =  funcdeclin + '_' + outype
+                                funcdeclout = funcdeclin + '_' + outype
                             else:
-                                funcdeclout =  funcdeclin
+                                funcdeclout = funcdeclin
                         else:
-                            funcdeclout =  funcdeclin
+                            funcdeclout = funcdeclin
                         Function_decl["name"] = funcdeclout
 
                         # apply filter given in "filter" column
                         filter_name = Function_decl["filter"]
                         store = True
-                        for (InTypes, OutTypes) in ANY_TO_ANY_FILTERS.get(filter_name,[]):
-                            outs = reduce(lambda a,b: a or b, 
-                                       map(lambda testtype : IsOfType(
-                                           Function_decl["outputs"][0][1],
-                                           testtype), OutTypes))
-                            inps = reduce(lambda a,b: a or b,
-                                       map(lambda testtype : IsOfType(
-                                           Function_decl["inputs"][0][1],
-                                           testtype), InTypes))
+                        for (InTypes, OutTypes) in ANY_TO_ANY_FILTERS.get(filter_name, []):
+                            outs = reduce(lambda a, b: a or b,
+                                          map(lambda testtype: IsOfType(
+                                              Function_decl["outputs"][0][1],
+                                              testtype), OutTypes))
+                            inps = reduce(lambda a, b: a or b,
+                                          map(lambda testtype: IsOfType(
+                                              Function_decl["inputs"][0][1],
+                                              testtype), InTypes))
                             if inps and outs and Function_decl["outputs"][0][1] != Function_decl["inputs"][0][1]:
                                 store = True
                                 break
                             else:
                                 store = False
-                        if store :
+                        if store:
                             # create the copy of decl dict to be appended to section
                             Function_decl_copy = Function_decl.copy()
                             Current_section["list"].append(Function_decl_copy)
             else:
-                raise "First function must be in a category"
-    
+                raise ValueError("First function must be in a category")
+
     return Standard_Functions_Decl
 
+
 StdBlckLst.extend(get_standard_funtions(csv_file_to_table(open(StdFuncsCSV))))
 
 # Dictionary to speedup block type fetching by name
@@ -266,17 +282,17 @@
         words = desc["comment"].split('"')
         if len(words) > 1:
             desc["comment"] = words[1]
-        desc["usage"] = ("\n (%s) => (%s)" % 
-            (", ".join(["%s:%s" % (input[1], input[0]) 
-                        for input in desc["inputs"]]),
-             ", ".join(["%s:%s" % (output[1], output[0]) 
-                        for output in desc["outputs"]])))
-        BlkLst = StdBlckDct.setdefault(desc["name"],[])
+        desc["usage"] = ("\n (%s) => (%s)" %
+                         (", ".join(["%s:%s" % (input[1], input[0])
+                                     for input in desc["inputs"]]),
+                          ", ".join(["%s:%s" % (output[1], output[0])
+                                     for output in desc["outputs"]])))
+        BlkLst = StdBlckDct.setdefault(desc["name"], [])
         BlkLst.append((section["name"], desc))
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                            Languages Keywords
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 # Keywords for Pou Declaration
 POU_BLOCK_START_KEYWORDS = ["FUNCTION", "FUNCTION_BLOCK", "PROGRAM"]
@@ -313,16 +329,20 @@
 
 
 # Keywords for Instruction List
-IL_KEYWORDS = ["TRUE", "FALSE", "LD", "LDN", "ST", "STN", "S", "R", "AND", "ANDN", "OR", "ORN",
- "XOR", "XORN", "NOT", "ADD", "SUB", "MUL", "DIV", "MOD", "GT", "GE", "EQ", "NE",
- "LE", "LT", "JMP", "JMPC", "JMPCN", "CAL", "CALC", "CALCN", "RET", "RETC", "RETCN"]
+IL_KEYWORDS = [
+    "TRUE", "FALSE", "LD", "LDN", "ST", "STN", "S", "R", "AND", "ANDN", "OR", "ORN",
+    "XOR", "XORN", "NOT", "ADD", "SUB", "MUL", "DIV", "MOD", "GT", "GE", "EQ", "NE",
+    "LE", "LT", "JMP", "JMPC", "JMPCN", "CAL", "CALC", "CALCN", "RET", "RETC", "RETCN"
+]
 
 
 # Keywords for Structured Text
 ST_BLOCK_START_KEYWORDS = ["IF", "ELSIF", "ELSE", "CASE", "FOR", "WHILE", "REPEAT"]
 ST_BLOCK_END_KEYWORDS = ["END_IF", "END_CASE", "END_FOR", "END_WHILE", "END_REPEAT"]
-ST_KEYWORDS = ["TRUE", "FALSE", "THEN", "OF", "TO", "BY", "DO", "DO", "UNTIL", "EXIT", 
- "RETURN", "NOT", "MOD", "AND", "XOR", "OR"] + ST_BLOCK_START_KEYWORDS + ST_BLOCK_END_KEYWORDS
+ST_KEYWORDS = [
+    "TRUE", "FALSE", "THEN", "OF", "TO", "BY", "DO", "DO", "UNTIL", "EXIT",
+    "RETURN", "NOT", "MOD", "AND", "XOR", "OR"
+] + ST_BLOCK_START_KEYWORDS + ST_BLOCK_END_KEYWORDS
 
 # All the keywords of IEC
 IEC_BLOCK_START_KEYWORDS = []
@@ -338,5 +358,3 @@
                                                     SFC_KEYWORDS, IL_KEYWORDS, ST_KEYWORDS])]:
     for keywords in keywords_list:
         all_keywords.extend([keyword for keyword in keywords if keyword not in all_keywords])
-
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plcopen/types_enums.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,131 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# This file is part of Beremiz
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+from util.TranslationCatalogs import NoTranslate
+_ = NoTranslate
+
+ITEMS_EDITABLE = [
+    ITEM_PROJECT,
+    ITEM_POU,
+    ITEM_VARIABLE,
+    ITEM_TRANSITION,
+    ITEM_ACTION,
+    ITEM_CONFIGURATION,
+    ITEM_RESOURCE,
+    ITEM_DATATYPE
+] = range(8)
+
+ITEMS_UNEDITABLE = [
+    ITEM_DATATYPES,
+    ITEM_FUNCTION,
+    ITEM_FUNCTIONBLOCK,
+    ITEM_PROGRAM,
+    ITEM_TRANSITIONS,
+    ITEM_ACTIONS,
+    ITEM_CONFIGURATIONS,
+    ITEM_RESOURCES,
+    ITEM_PROPERTIES
+] = range(8, 17)
+
+ITEMS_VARIABLE = [
+    ITEM_VAR_LOCAL,
+    ITEM_VAR_GLOBAL,
+    ITEM_VAR_EXTERNAL,
+    ITEM_VAR_TEMP,
+    ITEM_VAR_INPUT,
+    ITEM_VAR_OUTPUT,
+    ITEM_VAR_INOUT
+] = range(17, 24)
+
+ITEM_CONFNODE = 25
+
+VAR_CLASS_INFOS = {
+    "Local":    ("localVars",    ITEM_VAR_LOCAL),
+    "Global":   ("globalVars",   ITEM_VAR_GLOBAL),
+    "External": ("externalVars", ITEM_VAR_EXTERNAL),
+    "Temp":     ("tempVars",     ITEM_VAR_TEMP),
+    "Input":    ("inputVars",    ITEM_VAR_INPUT),
+    "Output":   ("outputVars",   ITEM_VAR_OUTPUT),
+    "InOut":    ("inOutVars",    ITEM_VAR_INOUT)}
+
+POU_TYPES = {
+    "program": ITEM_PROGRAM,
+    "functionBlock": ITEM_FUNCTIONBLOCK,
+    "function": ITEM_FUNCTION,
+}
+
+CLASS_TYPES = {
+    "configuration": ITEM_CONFIGURATION,
+    "resource": ITEM_RESOURCE,
+    "action": ITEM_ACTION,
+    "transition": ITEM_TRANSITION,
+    "program": ITEM_PROGRAM
+}
+
+LOCATIONS_ITEMS = [LOCATION_CONFNODE,
+                   LOCATION_MODULE,
+                   LOCATION_GROUP,
+                   LOCATION_VAR_INPUT,
+                   LOCATION_VAR_OUTPUT,
+                   LOCATION_VAR_MEMORY] = range(6)
+
+UNEDITABLE_NAMES = [_("User-defined POUs"), _("Functions"), _("Function Blocks"),
+                    _("Programs"), _("Data Types"), _("Transitions"), _("Actions"),
+                    _("Configurations"), _("Resources"), _("Properties")]
+
+[USER_DEFINED_POUS, FUNCTIONS, FUNCTION_BLOCKS, PROGRAMS,
+ DATA_TYPES, TRANSITIONS, ACTIONS, CONFIGURATIONS,
+ RESOURCES, PROPERTIES] = UNEDITABLE_NAMES
+
+# -------------------------------------------------------------------------------
+#                   Project Element tag name computation functions
+# -------------------------------------------------------------------------------
+
+
+# Compute a data type name
+def ComputeDataTypeName(datatype):
+    return "D::%s" % datatype
+
+
+# Compute a pou name
+def ComputePouName(pou):
+    return "P::%s" % pou
+
+
+# Compute a pou transition name
+def ComputePouTransitionName(pou, transition):
+    return "T::%s::%s" % (pou, transition)
+
+
+# Compute a pou action name
+def ComputePouActionName(pou, action):
+    return "A::%s::%s" % (pou, action)
+
+
+# Compute a pou  name
+def ComputeConfigurationName(config):
+    return "C::%s" % config
+
+
+# Compute a pou  name
+def ComputeConfigurationResourceName(config, resource):
+    return "R::%s::%s" % (config, resource)
+
+
+def GetElementType(tagname):
+    words = tagname.split("::")
+    return {
+        "D": ITEM_DATATYPE,
+        "P": ITEM_POU,
+        "T": ITEM_TRANSITION,
+        "A": ITEM_ACTION,
+        "C": ITEM_CONFIGURATION,
+        "R": ITEM_RESOURCE
+    }[words[0]]
+
+
+# remove gettext override
+del _
--- a/plcopen/variables_infos.xslt	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/variables_infos.xslt	Mon Jan 07 13:50:39 2019 +0100
@@ -1,48 +1,26 @@
 <?xml version="1.0"?>
-<xsl:stylesheet xmlns:func="http://exslt.org/functions" xmlns:dyn="http://exslt.org/dynamic" xmlns:str="http://exslt.org/strings" xmlns:math="http://exslt.org/math" xmlns:exsl="http://exslt.org/common" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:yml="http://fdik.org/yml" xmlns:set="http://exslt.org/sets" xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" xmlns:ns="var_infos_ns" xmlns:regexp="http://exslt.org/regular-expressions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" extension-element-prefixes="ns" version="1.0" exclude-result-prefixes="ns">
+<xsl:stylesheet xmlns:exsl="http://exslt.org/common" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:ppx="http://www.plcopen.org/xml/tc6_0201" xmlns:ns="beremiz" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" extension-element-prefixes="ns" version="1.0" exclude-result-prefixes="ns">
   <xsl:output method="xml"/>
-  <xsl:variable name="space" select="'                                                                                                                                                                                                        '"/>
-  <xsl:param name="autoindent" select="4"/>
   <xsl:param name="tree"/>
-  <xsl:template match="text()">
-    <xsl:param name="_indent" select="0"/>
-  </xsl:template>
-  <xsl:variable name="project">
-    <xsl:copy-of select="document('project')/project/*"/>
-  </xsl:variable>
-  <xsl:variable name="stdlib">
-    <xsl:copy-of select="document('stdlib')/stdlib/*"/>
-  </xsl:variable>
-  <xsl:variable name="extensions">
-    <xsl:copy-of select="document('extensions')/extensions/*"/>
-  </xsl:variable>
+  <xsl:template match="text()"/>
+  <xsl:variable name="project" select="ns:GetProject()"/>
+  <xsl:variable name="stdlib" select="ns:GetStdLibs()"/>
+  <xsl:variable name="extensions" select="ns:GetExtensions()"/>
+  <xsl:variable name="all_types" select="($project | $stdlib | $extensions)/ppx:types"/>
   <xsl:template match="ppx:configuration">
-    <xsl:param name="_indent" select="0"/>
-    <xsl:apply-templates select="ppx:globalVars">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:globalVars"/>
   </xsl:template>
   <xsl:template match="ppx:resource">
-    <xsl:param name="_indent" select="0"/>
-    <xsl:apply-templates select="ppx:globalVars">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:globalVars"/>
   </xsl:template>
   <xsl:template match="ppx:pou">
-    <xsl:param name="_indent" select="0"/>
-    <xsl:apply-templates select="ppx:interface/*">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates select="ppx:interface/*"/>
   </xsl:template>
   <xsl:template match="ppx:returnType">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="ns:AddTree()"/>
-    <xsl:apply-templates mode="var_type" select=".">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates mode="var_type" select="."/>
   </xsl:template>
   <xsl:template name="variables_infos">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="var_class"/>
     <xsl:variable name="var_option">
       <xsl:choose>
@@ -59,9 +37,7 @@
     </xsl:variable>
     <xsl:for-each select="ppx:variable">
       <xsl:variable name="initial_value">
-        <xsl:apply-templates select="ppx:initialValue">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-        </xsl:apply-templates>
+        <xsl:apply-templates select="ppx:initialValue"/>
       </xsl:variable>
       <xsl:variable name="edit">
         <xsl:choose>
@@ -69,21 +45,16 @@
             <xsl:text>true</xsl:text>
           </xsl:when>
           <xsl:otherwise>
-            <xsl:apply-templates mode="var_edit" select="ppx:type">
-              <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-            </xsl:apply-templates>
+            <xsl:apply-templates mode="var_edit" select="ppx:type"/>
           </xsl:otherwise>
         </xsl:choose>
       </xsl:variable>
       <xsl:value-of select="ns:AddTree()"/>
-      <xsl:apply-templates mode="var_type" select="ppx:type">
-        <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-      </xsl:apply-templates>
+      <xsl:apply-templates mode="var_type" select="ppx:type"/>
       <xsl:value-of select="ns:AddVariable(@name, $var_class, $var_option, @address, $initial_value, $edit, ppx:documentation/xhtml:p/text())"/>
     </xsl:for-each>
   </xsl:template>
   <xsl:template match="ppx:localVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>Local</xsl:text>
@@ -91,7 +62,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:globalVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>Global</xsl:text>
@@ -99,7 +69,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:externalVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>External</xsl:text>
@@ -107,7 +76,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:tempVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>Temp</xsl:text>
@@ -115,7 +83,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:inputVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>Input</xsl:text>
@@ -123,7 +90,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:outputVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>Output</xsl:text>
@@ -131,7 +97,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:inOutVars">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="variables_infos">
       <xsl:with-param name="var_class">
         <xsl:text>InOut</xsl:text>
@@ -139,53 +104,35 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template mode="var_type" match="ppx:pou">
-    <xsl:param name="_indent" select="0"/>
-    <xsl:apply-templates mode="var_type" select="ppx:interface/*[self::ppx:inputVars or self::ppx:inOutVars or self::ppx:outputVars]/ppx:variable">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates mode="var_type" select="ppx:interface/*[self::ppx:inputVars or self::ppx:inOutVars or self::ppx:outputVars]/ppx:variable"/>
   </xsl:template>
   <xsl:template mode="var_type" match="ppx:variable">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="name">
       <xsl:value-of select="@name"/>
     </xsl:variable>
     <xsl:value-of select="ns:AddTree()"/>
-    <xsl:apply-templates mode="var_type" select="ppx:type">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates mode="var_type" select="ppx:type"/>
     <xsl:value-of select="ns:AddVarToTree($name)"/>
   </xsl:template>
   <xsl:template mode="var_type" match="ppx:dataType">
-    <xsl:param name="_indent" select="0"/>
-    <xsl:apply-templates mode="var_type" select="ppx:baseType">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates mode="var_type" select="ppx:baseType"/>
   </xsl:template>
   <xsl:template mode="var_type" match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:struct">
-    <xsl:param name="_indent" select="0"/>
-    <xsl:apply-templates mode="var_type" select="ppx:variable">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates mode="var_type" select="ppx:variable"/>
   </xsl:template>
   <xsl:template mode="var_type" match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="type_name">
       <xsl:value-of select="@name"/>
     </xsl:variable>
     <xsl:choose>
       <xsl:when test="$tree='True'">
-        <xsl:apply-templates mode="var_type" select="exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                         exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |&#10;                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]">
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-        </xsl:apply-templates>
+        <xsl:apply-templates mode="var_type" select="$all_types/ppx:pous/ppx:pou[@name=$type_name] |                          $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name]"/>
       </xsl:when>
     </xsl:choose>
     <xsl:value-of select="ns:SetType($type_name)"/>
   </xsl:template>
   <xsl:template mode="var_type" match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:array">
-    <xsl:param name="_indent" select="0"/>
-    <xsl:apply-templates mode="var_type" select="ppx:baseType">
-      <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-    </xsl:apply-templates>
+    <xsl:apply-templates mode="var_type" select="ppx:baseType"/>
     <xsl:for-each select="ppx:dimension">
       <xsl:variable name="lower">
         <xsl:value-of select="@lower"/>
@@ -197,34 +144,28 @@
     </xsl:for-each>
   </xsl:template>
   <xsl:template mode="var_type" match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:string">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="name">
       <xsl:text>STRING</xsl:text>
     </xsl:variable>
     <xsl:value-of select="ns:SetType($name)"/>
   </xsl:template>
   <xsl:template mode="var_type" match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:wstring">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="name">
       <xsl:text>WSTRING</xsl:text>
     </xsl:variable>
     <xsl:value-of select="ns:SetType($name)"/>
   </xsl:template>
   <xsl:template mode="var_type" match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="name">
       <xsl:value-of select="local-name()"/>
     </xsl:variable>
     <xsl:value-of select="ns:SetType($name)"/>
   </xsl:template>
   <xsl:template mode="var_edit" match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived">
-    <xsl:param name="_indent" select="0"/>
     <xsl:variable name="type_name">
       <xsl:value-of select="@name"/>
     </xsl:variable>
-    <xsl:variable name="pou_infos">
-      <xsl:copy-of select="exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                    exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |&#10;                    exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]"/>
-    </xsl:variable>
+    <xsl:variable name="pou_infos" select="$all_types/ppx:pous/ppx:pou[@name=$type_name]"/>
     <xsl:choose>
       <xsl:when test="$pou_infos != ''">
         <xsl:text>false</xsl:text>
@@ -235,47 +176,35 @@
     </xsl:choose>
   </xsl:template>
   <xsl:template mode="var_edit" match="*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/*">
-    <xsl:param name="_indent" select="0"/>
     <xsl:text>true</xsl:text>
   </xsl:template>
   <xsl:template match="ppx:value">
-    <xsl:param name="_indent" select="0"/>
     <xsl:choose>
       <xsl:when test="@repetitionValue">
         <xsl:value-of select="@repetitionValue"/>
         <xsl:text>(</xsl:text>
-        <xsl:apply-templates>
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-        </xsl:apply-templates>
+        <xsl:apply-templates/>
         <xsl:text>)</xsl:text>
       </xsl:when>
       <xsl:when test="@member">
         <xsl:value-of select="@member"/>
         <xsl:text> := </xsl:text>
-        <xsl:apply-templates>
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-        </xsl:apply-templates>
+        <xsl:apply-templates/>
       </xsl:when>
       <xsl:otherwise>
-        <xsl:apply-templates>
-          <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-        </xsl:apply-templates>
+        <xsl:apply-templates/>
       </xsl:otherwise>
     </xsl:choose>
   </xsl:template>
   <xsl:template match="ppx:simpleValue">
-    <xsl:param name="_indent" select="0"/>
     <xsl:value-of select="@value"/>
   </xsl:template>
   <xsl:template name="complex_type_value">
-    <xsl:param name="_indent" select="0"/>
     <xsl:param name="start_bracket"/>
     <xsl:param name="end_bracket"/>
     <xsl:value-of select="$start_bracket"/>
     <xsl:for-each select="ppx:value">
-      <xsl:apply-templates select=".">
-        <xsl:with-param name="_indent" select="$_indent + (1) * $autoindent"/>
-      </xsl:apply-templates>
+      <xsl:apply-templates select="."/>
       <xsl:choose>
         <xsl:when test="position()!=last()">
           <xsl:text>, </xsl:text>
@@ -285,7 +214,6 @@
     <xsl:value-of select="$end_bracket"/>
   </xsl:template>
   <xsl:template match="ppx:arrayValue">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="complex_type_value">
       <xsl:with-param name="start_bracket">
         <xsl:text>[</xsl:text>
@@ -296,7 +224,6 @@
     </xsl:call-template>
   </xsl:template>
   <xsl:template match="ppx:structValue">
-    <xsl:param name="_indent" select="0"/>
     <xsl:call-template name="complex_type_value">
       <xsl:with-param name="start_bracket">
         <xsl:text>(</xsl:text>
--- a/plcopen/variables_infos.ysl2	Sat Jun 02 11:56:01 2018 +0100
+++ b/plcopen/variables_infos.ysl2	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,7 @@
-include yslt.yml2
-estylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
+include yslt_noindent.yml2
+istylesheet xmlns:ppx="http://www.plcopen.org/xml/tc6_0201"
             xmlns:xhtml="http://www.w3.org/1999/xhtml"
-            xmlns:ns="var_infos_ns" 
+            xmlns:ns="beremiz" 
             extension-element-prefixes="ns" 
             exclude-result-prefixes="ns" {
     
@@ -9,17 +9,14 @@
     
     template "text()";
     
-    variable "project" {
-        copy "document('project')/project/*";
-    }
-    
-    variable "stdlib" {
-        copy "document('stdlib')/stdlib/*";
-    }
-    variable "extensions" {
-        copy "document('extensions')/extensions/*";
-    }
-    
+    variable "project", "ns:GetProject()";
+    
+    variable "stdlib", "ns:GetStdLibs()";
+
+    variable "extensions", "ns:GetExtensions()";
+
+    variable "all_types", "($project | $stdlib | $extensions)/ppx:types";
+
     template "ppx:configuration" {
         apply "ppx:globalVars";
     }
@@ -129,12 +126,8 @@
         variable "type_name" > «@name»
         choose {
             when "$tree='True'" {
-                apply """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                         exsl:node-set($project)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
-                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                         exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name] |
-                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                         exsl:node-set($extensions)/ppx:project/ppx:types/ppx:dataTypes/ppx:dataType[@name=$type_name]""", mode="var_type";
+                apply """$all_types/ppx:pous/ppx:pou[@name=$type_name] | \
+                         $all_types/ppx:dataTypes/ppx:dataType[@name=$type_name]""", mode="var_type";
             }
         }
         value "ns:SetType($type_name)";
@@ -166,11 +159,7 @@
     
     template "*[self::ppx:type or self::ppx:baseType or self::ppx:returnType]/ppx:derived", mode="var_edit" {
         variable "type_name" > «@name»
-        variable "pou_infos" {
-            copy """exsl:node-set($project)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                    exsl:node-set($stdlib)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name] |
-                    exsl:node-set($extensions)/ppx:project/ppx:types/ppx:pous/ppx:pou[@name=$type_name]""";
-        }
+        variable "pou_infos", "$all_types/ppx:pous/ppx:pou[@name=$type_name]";
         choose {
             when "$pou_infos != ''" > false
             otherwise > true
@@ -232,4 +221,4 @@
 }
 
     
-    
\ No newline at end of file
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plcopen/yslt_noindent.yml2	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,32 @@
+include yslt.yml2
+
+in xsl {
+    decl istylesheet (
+        *output="xml",
+        version="1.0",
+        xmlns:xsl="http://www.w3.org/1999/XSL/Transform",
+        xmlns:exsl='http://exslt.org/common',
+        extension-element-prefixes='exsl'
+    ) alias stylesheet {
+        output *output;
+        content;
+    };
+
+    decl template(match) {
+        content;
+    };
+
+    decl function(name) alias template {
+        content;
+    };
+   
+    decl call(name) alias call-template {
+        content;
+    };
+
+    decl apply(select) alias apply-templates {
+        content;
+    };
+}
+
+
--- a/py_ext/PythonEditor.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/py_ext/PythonEditor.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,26 +22,29 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import keyword
 import wx.stc as stc
 
 from controls.CustomStyledTextCtrl import faces
 from editors.CodeFileEditor import CodeFileEditor, CodeEditor
 
+
 class PythonCodeEditor(CodeEditor):
 
     KEYWORDS = keyword.kwlist
     COMMENT_HEADER = "#"
-    
+
     def SetCodeLexer(self):
         self.SetLexer(stc.STC_LEX_PYTHON)
-        
+
         # Line numbers in margin
-        self.StyleSetSpec(stc.STC_STYLE_LINENUMBER,'fore:#000000,back:#99A9C2,size:%(size)d' % faces)    
+        self.StyleSetSpec(stc.STC_STYLE_LINENUMBER, 'fore:#000000,back:#99A9C2,size:%(size)d' % faces)
         # Highlighted brace
-        self.StyleSetSpec(stc.STC_STYLE_BRACELIGHT,'fore:#00009D,back:#FFFF00,size:%(size)d' % faces)
+        self.StyleSetSpec(stc.STC_STYLE_BRACELIGHT, 'fore:#00009D,back:#FFFF00,size:%(size)d' % faces)
         # Unmatched brace
-        self.StyleSetSpec(stc.STC_STYLE_BRACEBAD,'fore:#00009D,back:#FF0000,size:%(size)d' % faces)
+        self.StyleSetSpec(stc.STC_STYLE_BRACEBAD, 'fore:#00009D,back:#FF0000,size:%(size)d' % faces)
         # Indentation guide
         self.StyleSetSpec(stc.STC_STYLE_INDENTGUIDE, 'fore:#CDCDCD,size:%(size)d' % faces)
 
@@ -69,15 +72,14 @@
         # Identifiers. I leave this as not bold because everything seems
         # to be an identifier if it doesn't match the above criterae
         self.StyleSetSpec(stc.STC_P_IDENTIFIER, 'fore:#000000,size:%(size)d' % faces)
-        
 
-#-------------------------------------------------------------------------------
+
+# -------------------------------------------------------------------------------
 #                          CFileEditor Main Frame Class
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 class PythonEditor(CodeFileEditor):
-    
+
     CONFNODEEDITOR_TABS = [
         (_("Python code"), "_create_CodePanel")]
     CODE_EDITOR = PythonCodeEditor
-
--- a/py_ext/PythonFileCTNMixin.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/py_ext/PythonFileCTNMixin.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -22,13 +23,18 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import os, re
-from lxml import etree
-
+
+from __future__ import absolute_import
+import os
+import re
+from builtins import str as text
+
+import util.paths as paths
 from xmlclass import GenerateParserFromXSD
 
 from CodeFileTreeNode import CodeFile
-from PythonEditor import PythonEditor
+from py_ext.PythonEditor import PythonEditor
+
 
 class PythonFileCTNMixin(CodeFile):
 
@@ -47,8 +53,7 @@
         filepath = self.PythonFileName()
 
         if os.path.isfile(filepath):
-            PythonParser = GenerateParserFromXSD(
-                os.path.join(os.path.dirname(__file__), "py_ext_xsd.xsd"))
+            PythonParser = GenerateParserFromXSD(paths.AbsNeighbourFile(__file__, "py_ext_xsd.xsd"))
 
             xmlfile = open(filepath, 'r')
             pythonfile_xml = xmlfile.read()
@@ -58,8 +63,8 @@
                 'xmlns="http://www.w3.org/2001/XMLSchema"',
                 'xmlns:xhtml="http://www.w3.org/1999/xhtml"')
             for cre, repl in [
-                (re.compile("(?<!<xhtml:p>)(?:<!\[CDATA\[)"), "<xhtml:p><![CDATA["),
-                (re.compile("(?:]]>)(?!</xhtml:p>)"), "]]></xhtml:p>")]:
+                    (re.compile(r"(?<!<xhtml:p>)(?:<!\[CDATA\[)"), "<xhtml:p><![CDATA["),
+                    (re.compile(r"(?:]]>)(?!</xhtml:p>)"), "]]></xhtml:p>")]:
                 pythonfile_xml = cre.sub(repl, pythonfile_xml)
 
             try:
@@ -69,8 +74,8 @@
                     os.remove(filepath)
                     self.CreateCodeFileBuffer(False)
                     self.OnCTNSave()
-            except Exception, exc:
-                error = unicode(exc)
+            except Exception as exc:
+                error = text(exc)
 
             if error is not None:
                 self.GetCTRoot().logger.write_error(
@@ -84,34 +89,44 @@
 
     PreSectionsTexts = {}
     PostSectionsTexts = {}
-    def GetSection(self,section):
-        return self.PreSectionsTexts.get(section,"") + "\n" + \
+
+    def GetSection(self, section):
+        return self.PreSectionsTexts.get(section, "") + "\n" + \
                getattr(self.CodeFile, section).getanyText() + "\n" + \
-               self.PostSectionsTexts.get(section,"")
+               self.PostSectionsTexts.get(section, "")
 
     def CTNGenerate_C(self, buildpath, locations):
         # location string for that CTN
-        location_str = "_".join(map(lambda x:str(x),
-                                self.GetCurrentLocation()))
+        location_str = "_".join(map(str, self.GetCurrentLocation()))
         configname = self.GetCTRoot().GetProjectConfigNames()[0]
 
+        def _onchangecode(var):
+            return '"' + var.getonchange() + \
+                "('" + var.getname() + "')\"" \
+                if var.getonchange() else '""'
+
+        def _onchange(var):
+            return repr(var.getonchange()) \
+                if var.getonchange() else None
+
         pyextname = self.CTNName()
-        varinfos = map(lambda variable : {
-                    "name": variable.getname(),
-                    "desc" : repr(variable.getdesc()),
-                    "onchangecode" : '"'+variable.getonchange()+\
-                                         "('"+variable.getname()+"')\"" \
-                                     if variable.getonchange() else '""',
-                    "onchange" : repr(variable.getonchange()) \
-                                 if variable.getonchange() else None,
-                    "opts" : repr(variable.getopts()),
-                    "configname" : configname.upper(),
-                    "uppername" : variable.getname().upper(),
-                    "IECtype" : variable.gettype(),
-                    "pyextname" :pyextname},
-                    self.CodeFile.variables.variable)
+        varinfos = map(
+            lambda variable: {
+                "name": variable.getname(),
+                "desc": repr(variable.getdesc()),
+                "onchangecode": _onchangecode(variable),
+                "onchange": _onchange(variable),
+                "opts": repr(variable.getopts()),
+                "configname": configname.upper(),
+                "uppername": variable.getname().upper(),
+                "IECtype": variable.gettype(),
+                "initial": repr(variable.getinitial()),
+                "pyextname": pyextname
+            },
+            self.CodeFile.variables.variable)
         # python side PLC global variables access stub
-        globalstubs = "\n".join(["""\
+        globalstubs = "\n".join([
+            """\
 _%(name)s_ctype, _%(name)s_unpack, _%(name)s_pack = \\
     TypeTranslator["%(IECtype)s"]
 _PySafeGetPLCGlob_%(name)s = PLCBinary.__SafeGetPLCGlob_%(name)s
@@ -123,11 +138,11 @@
 _%(pyextname)sGlobalsDesc.append((
     "%(name)s",
     "%(IECtype)s",
+    %(initial)s,
     %(desc)s,
     %(onchange)s,
     %(opts)s))
-""" % varinfo
-      for varinfo in varinfos])
+""" % varinfo for varinfo in varinfos])
 
         # Runtime calls (start, stop, init, and cleanup)
         rtcalls = ""
@@ -143,6 +158,13 @@
 
         globalsection = self.GetSection("globals")
 
+        loc_dict = {
+            "pyextname": pyextname,
+            "globalstubs": globalstubs,
+            "globalsection": globalsection,
+            "rtcalls": rtcalls,
+        }
+
         PyFileContent = """\
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
@@ -150,7 +172,7 @@
 ##
 
 ## Code for PLC global variable access
-from targets.typemapping import TypeTranslator
+from runtime.typemapping import TypeTranslator
 import ctypes
 _%(pyextname)sGlobalsDesc = []
 __ext_name__ = "%(pyextname)s"
@@ -165,11 +187,11 @@
 
 del __ext_name__
 
-""" % locals()
+""" % loc_dict
 
         # write generated content to python file
         runtimefile_path = os.path.join(buildpath,
-            "runtime_%s.py"%location_str)
+                                        "runtime_%s.py" % location_str)
         runtimefile = open(runtimefile_path, 'w')
         runtimefile.write(PyFileContent.encode('utf-8'))
         runtimefile.close()
@@ -233,15 +255,23 @@
     __SET_VAR(__%(name)s_notifier->,CODE,,__STRING_LITERAL(%(onchangelen)d,%(onchangecode)s));
 """
         vardec = "\n".join([(vardecfmt + vardeconchangefmt
-                             if varinfo["onchange"] else vardecfmt)% varinfo
+                             if varinfo["onchange"] else vardecfmt) % varinfo
                             for varinfo in varinfos])
         varret = "\n".join([varretfmt % varinfo for varinfo in varinfos])
         varpub = "\n".join([(varpubonchangefmt if varinfo["onchange"] else
                              varpubfmt) % varinfo
                             for varinfo in varinfos])
-        varinit = "\n".join([varinitonchangefmt % dict(
-                                onchangelen = len(varinfo["onchangecode"]),**varinfo)
-                            for varinfo in varinfos if varinfo["onchange"]])
+        varinit = "\n".join([varinitonchangefmt %
+                             dict(onchangelen=len(varinfo["onchangecode"]), **varinfo)
+                             for varinfo in varinfos if varinfo["onchange"]])
+
+        loc_dict = {
+            "vardec": vardec,
+            "varinit": varinit,
+            "varret": varret,
+            "varpub": varpub,
+            "location_str": location_str,
+        }
 
         # TODO : use config name obtained from model instead of default
         # "config.h". User cannot change config name, but project imported
@@ -275,18 +305,17 @@
 void __publish_%(location_str)s(void){
 %(varpub)s
 }
-""" % locals()
-
-        Gen_PyCfile_path = os.path.join(buildpath, "PyCFile_%s.c"%location_str)
-        pycfile = open(Gen_PyCfile_path,'w')
+""" % loc_dict
+
+        Gen_PyCfile_path = os.path.join(buildpath, "PyCFile_%s.c" % location_str)
+        pycfile = open(Gen_PyCfile_path, 'w')
         pycfile.write(PyCFileContent)
         pycfile.close()
 
-        matiec_CFLAGS = '"-I%s"'%os.path.abspath(
+        matiec_CFLAGS = '"-I%s"' % os.path.abspath(
             self.GetCTRoot().GetIECLibPath())
 
         return ([(Gen_PyCfile_path, matiec_CFLAGS)],
                 "",
                 True,
-                ("runtime_%s.py"%location_str, file(runtimefile_path,"rb")))
-
+                ("runtime_%s.py" % location_str, open(runtimefile_path, "rb")))
--- a/py_ext/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/py_ext/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,6 +22,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-from py_ext import *
-from PythonEditor import PythonEditor
-from PythonFileCTNMixin import PythonFileCTNMixin
+from __future__ import absolute_import
+from .py_ext import *
+from .PythonEditor import PythonEditor
+from .PythonFileCTNMixin import PythonFileCTNMixin
--- a/py_ext/plc_python.c	Sat Jun 02 11:56:01 2018 +0100
+++ b/py_ext/plc_python.c	Mon Jan 07 13:50:39 2019 +0100
@@ -89,6 +89,10 @@
  */
 void __PythonEvalFB(int poll, PYTHON_EVAL* data__)
 {
+    if(!__GET_VAR(data__->TRIG)){
+        /* ACK is False when TRIG is false, except a pulse when receiving result */
+        __SET_VAR(data__->, ACK,, 0);
+    }
 	/* detect rising edge on TRIG to trigger evaluation */
 	if(((__GET_VAR(data__->TRIG) && !__GET_VAR(data__->TRIGM1)) ||
 	   /* polling is equivalent to trig on value rather than on rising edge*/
@@ -109,7 +113,7 @@
 		if(__GET_VAR(data__->STATE) == PYTHON_FB_ANSWERED){
 			/* Copy buffer content into result*/
 			__SET_VAR(data__->, RESULT,, __GET_VAR(data__->BUFFER));
-			/* signal result presece to PLC*/
+			/* signal result presence to PLC*/
 			__SET_VAR(data__->, ACK,, 1);
 			/* Mark as free */
 			__SET_VAR(data__->, STATE,, PYTHON_FB_FREE);
--- a/py_ext/py_ext.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/py_ext/py_ext.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -22,18 +23,21 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import os
 from POULibrary import POULibrary
-from PythonFileCTNMixin import PythonFileCTNMixin
+from py_ext.PythonFileCTNMixin import PythonFileCTNMixin
+import util.paths as paths
+
 
 class PythonLibrary(POULibrary):
     def GetLibraryPath(self):
-        return os.path.join(os.path.split(__file__)[0], "pous.xml") 
+        return paths.AbsNeighbourFile(__file__, "pous.xml")
 
     def Generate_C(self, buildpath, varlist, IECCFLAGS):
-        
-        plc_python_filepath = os.path.join(
-            os.path.split(__file__)[0], "plc_python.c")
+
+        plc_python_filepath = paths.AbsNeighbourFile(__file__, "plc_python.c")
         plc_python_file = open(plc_python_filepath, 'r')
         plc_python_code = plc_python_file.read()
         plc_python_file.close()
@@ -43,21 +47,20 @@
                                                       "PYTHON_POLL"]:
                 python_eval_fb_list.append(v)
         python_eval_fb_count = max(1, len(python_eval_fb_list))
-        
+
         # prepare python code
         plc_python_code = plc_python_code % {
-            "python_eval_fb_count": python_eval_fb_count }
-        
+            "python_eval_fb_count": python_eval_fb_count}
+
         Gen_Pythonfile_path = os.path.join(buildpath, "py_ext.c")
-        pythonfile = open(Gen_Pythonfile_path,'w')
+        pythonfile = open(Gen_Pythonfile_path, 'w')
         pythonfile.write(plc_python_code)
         pythonfile.close()
-        
+
         return (["py_ext"], [(Gen_Pythonfile_path, IECCFLAGS)], True), ""
 
+
 class PythonFile(PythonFileCTNMixin):
-    
+
     def GetIconName(self):
         return "Pyfile"
-    
-
--- a/runtime/NevowServer.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/runtime/NevowServer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,39 +1,54 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+# This file is part of Beremiz runtime.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
-# See COPYING file for copyrights details.
+# See COPYING.Runtime file for copyrights details.
 #
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# This library is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+from __future__ import absolute_import
+from __future__ import print_function
 import os
-from nevow import rend, appserver, inevow, tags, loaders, athena
+import platform as platform_module
+from zope.interface import implements
+from nevow import appserver, inevow, tags, loaders, athena, url, rend
 from nevow.page import renderer
-from twisted.python import util
+from nevow.static import File
+from formless import annotate
+from formless import webform
+from formless import configurable
 from twisted.internet import reactor
 
+import util.paths as paths
+from runtime.loglevels import LogLevels, LogLevelsDict
+
+PAGE_TITLE = 'Beremiz Runtime Web Interface'
+
 xhtml_header = '''<?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 '''
 
 WorkingDir = None
+_PySrv = None
+
 
 class PLCHMI(athena.LiveElement):
 
@@ -45,22 +60,30 @@
     def HMIinitialisation(self):
         self.HMIinitialised(None)
 
+
 class DefaultPLCStartedHMI(PLCHMI):
-    docFactory = loaders.stan(tags.div(render=tags.directive('liveElement'))[
-                                            tags.h1["PLC IS NOW STARTED"],
-                                            ])
+    docFactory = loaders.stan(
+        tags.div(render=tags.directive('liveElement'))[
+            tags.h1["PLC IS NOW STARTED"],
+        ])
+
 
 class PLCStoppedHMI(PLCHMI):
-    docFactory = loaders.stan(tags.div(render=tags.directive('liveElement'))[
-                                            tags.h1["PLC IS STOPPED"],
-                                            ])
+    docFactory = loaders.stan(
+        tags.div(render=tags.directive('liveElement'))[
+            tags.h1["PLC IS STOPPED"],
+        ])
+
 
 class MainPage(athena.LiveElement):
     jsClass = u"WebInterface.PLC"
-    docFactory = loaders.stan(tags.div(render=tags.directive('liveElement'))[
-                                                    tags.div(id='content')[
-                                                    tags.div(render = tags.directive('PLCElement')),
-                                                    ]])
+    docFactory = loaders.stan(
+        tags.invisible[
+            tags.div(render=tags.directive('liveElement'))[
+                tags.div(id='content')[
+                    tags.div(render=tags.directive('PLCElement'))]
+            ],
+            tags.a(href='settings')['Settings']])
 
     def __init__(self, *a, **kw):
         athena.LiveElement.__init__(self, *a, **kw)
@@ -84,7 +107,7 @@
 
     def HMIexec(self, function, *args, **kwargs):
         if self.HMI is not None:
-            getattr(self.HMI, function, lambda:None)(*args, **kwargs)
+            getattr(self.HMI, function, lambda: None)(*args, **kwargs)
     athena.expose(HMIexec)
 
     def resetHMI(self):
@@ -109,21 +132,158 @@
         for child in self.liveFragmentChildren[:]:
             child.detach()
 
+
+class ConfigurableBindings(configurable.Configurable):
+
+    def __init__(self):
+        configurable.Configurable.__init__(self, None)
+        self.bindingsNames = []
+        self.infostringcount = 0
+
+    def getBindingNames(self, ctx):
+        return self.bindingsNames
+
+    def addInfoString(self, label, value, name=None):
+        if isinstance(value, str):
+            def default(*k):
+                return value
+        else:
+            def default(*k):
+                return value()
+
+        if name is None:
+            name = "_infostring_" + str(self.infostringcount)
+            self.infostringcount = self.infostringcount + 1
+
+        def _bind(ctx):
+            return annotate.Property(
+                name,
+                annotate.String(
+                    label=label,
+                    default=default,
+                    immutable=True))
+        setattr(self, 'bind_' + name, _bind)
+        self.bindingsNames.append(name)
+
+    def addSettings(self, name, desc, fields, btnlabel, callback):
+        def _bind(ctx):
+            return annotate.MethodBinding(
+                'action_' + name,
+                annotate.Method(
+                    arguments=[
+                        annotate.Argument(*field)
+                        for field in fields],
+                    label=desc),
+                action=btnlabel)
+        setattr(self, 'bind_' + name, _bind)
+
+        setattr(self, 'action_' + name, callback)
+
+        self.bindingsNames.append(name)
+
+
+ConfigurableSettings = ConfigurableBindings()
+
+
+class ISettings(annotate.TypedInterface):
+    platform = annotate.String(label=_("Platform"),
+                               default=platform_module.system() +
+                               " " + platform_module.release(),
+                               immutable=True)
+
+    # TODO version ?
+
+    # pylint: disable=no-self-argument
+    def sendLogMessage(
+            ctx=annotate.Context(),
+            level=annotate.Choice(LogLevels,
+                                  required=True,
+                                  label=_("Log message level")),
+            message=annotate.String(label=_("Message text"))):
+        pass
+
+    sendLogMessage = annotate.autocallable(sendLogMessage,
+                                           label=_(
+                                               "Send a message to the log"),
+                                           action=_("Send"))
+
+
+customSettingsURLs = {
+}
+
+
+class SettingsPage(rend.Page):
+    # We deserve a slash
+    addSlash = True
+
+    # This makes webform_css url answer some default CSS
+    child_webform_css = webform.defaultCSS
+    child_webinterface_css = File(paths.AbsNeighbourFile(__file__, 'webinterface.css'), 'text/css')
+
+    implements(ISettings)
+
+    docFactory = loaders.stan([tags.html[
+        tags.head[
+            tags.title[_("Beremiz Runtime Settings")],
+            tags.link(rel='stylesheet',
+                      type='text/css',
+                      href=url.here.child("webform_css")),
+            tags.link(rel='stylesheet',
+                      type='text/css',
+                      href=url.here.child("webinterface_css"))
+        ],
+        tags.body[
+            tags.a(href='/')['Back'],
+            tags.h1["Runtime settings:"],
+            webform.renderForms('staticSettings'),
+            tags.h1["Extensions settings:"],
+            webform.renderForms('dynamicSettings'),
+        ]]])
+
+    def configurable_staticSettings(self, ctx):
+        return configurable.TypedInterfaceConfigurable(self)
+
+    def configurable_dynamicSettings(self, ctx):
+        return ConfigurableSettings
+
+    def sendLogMessage(self, level, message, **kwargs):
+        level = LogLevelsDict[level]
+        if _PySrv.plcobj is not None:
+            _PySrv.plcobj.LogMessage(
+                level, "Web form log message: " + message)
+
+    def locateChild(self, ctx, segments):
+        if segments[0] in customSettingsURLs:
+            return customSettingsURLs[segments[0]](ctx, segments)
+        return super(SettingsPage, self).locateChild(ctx, segments)
+
+
 class WebInterface(athena.LivePage):
 
     docFactory = loaders.stan([tags.raw(xhtml_header),
-                                tags.html(xmlns="http://www.w3.org/1999/xhtml")[
-                                    tags.head(render=tags.directive('liveglue')),
-                                    tags.body[
-                                        tags.div[
-                                                tags.div( render = tags.directive( "MainPage" ))
-                                                ]]]])
+                               tags.html(xmlns="http://www.w3.org/1999/xhtml")[
+                                   tags.head(render=tags.directive('liveglue'))[
+                                       tags.title[PAGE_TITLE],
+                                       tags.link(rel='stylesheet',
+                                                 type='text/css',
+                                                 href=url.here.child("webform_css"))
+                                   ],
+                                   tags.body[
+                                       tags.div[
+                                           tags.div(
+                                               render=tags.directive(
+                                                   "MainPage")),
+                                       ]]]])
     MainPage = MainPage()
     PLCHMI = PLCHMI
 
+    def child_settings(self, context):
+        return SettingsPage()
+
     def __init__(self, plcState=False, *a, **kw):
         super(WebInterface, self).__init__(*a, **kw)
-        self.jsModules.mapping[u'WebInterface'] = util.sibpath(__file__, 'webinterface.js')
+        self.jsModules.mapping[u'WebInterface'] = paths.AbsNeighbourFile(
+            __file__, 'webinterface.js')
         self.plcState = plcState
         self.MainPage.setPLCState(plcState)
 
@@ -150,7 +310,7 @@
         """
         Force content type to fit with SVG
         """
-        req = inevow.IRequest(ctx)
+        req = ctx.locate(inevow.IRequest)
         req.setHeader('Content-type', 'application/xhtml+xml')
         return super(WebInterface, self).renderHTTP(ctx)
 
@@ -169,19 +329,21 @@
 
     def disconnected(self, reason):
         self.MainPage.resetHMI()
-        #print reason
-        #print "We will be called back when the client disconnects"
-
-def RegisterWebsite(port):
+        # print reason
+        # print "We will be called back when the client disconnects"
+
+
+def RegisterWebsite(iface, port):
     website = WebInterface()
     site = appserver.NevowSite(website)
 
-    listening = False
-    reactor.listenTCP(port, site)
-    print _("HTTP interface port :"), port
+    reactor.listenTCP(port, site, interface=iface)
+    print(_('HTTP interface port :'), port)
     return website
 
-class statuslistener:
+
+class statuslistener(object):
+
     def __init__(self, site):
         self.oldstate = None
         self.site = site
@@ -190,8 +352,15 @@
         if state != self.oldstate:
             action = {'Started': self.site.PLCStarted,
                       'Stopped': self.site.PLCStopped}.get(state, None)
-            if action is not None: action ()
+            if action is not None:
+                action()
             self.oldstate = state
 
+
 def website_statuslistener_factory(site):
     return statuslistener(site).listen
+
+
+def SetServer(pysrv):
+    global _PySrv
+    _PySrv = pysrv
--- a/runtime/PLCObject.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/runtime/PLCObject.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,113 +1,155 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+# This file is part of Beremiz runtime.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
-# See COPYING file for copyrights details.
+# See COPYING.Runtime file for copyrights details.
 #
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# This library is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+from __future__ import absolute_import
+from threading import Thread, Lock, Semaphore, Event
+import ctypes
+import os
+import sys
+import traceback
+from time import time
+import _ctypes  # pylint: disable=wrong-import-order
+from past.builtins import execfile
 import Pyro.core as pyro
-from threading import Timer, Thread, Lock, Semaphore, Event
-import ctypes, os, commands, types, sys
-from targets.typemapping import LogLevelsDefault, LogLevelsCount, TypeTranslator, UnpackDebugBuffer
-from time import time
-
+import six
+from six.moves import _thread, xrange
+import md5
+from tempfile import mkstemp
+import shutil
+
+from runtime.typemapping import TypeTranslator
+from runtime.loglevels import LogLevelsDefault, LogLevelsCount
+from runtime.Stunnel import getPSKID
+from runtime import PlcStatus
+from runtime import MainWorker
+
+empty_md5_digest = md5.new().digest()
 
 if os.name in ("nt", "ce"):
-    from _ctypes import LoadLibrary as dlopen
-    from _ctypes import FreeLibrary as dlclose
+    dlopen = _ctypes.LoadLibrary
+    dlclose = _ctypes.FreeLibrary
 elif os.name == "posix":
-    from _ctypes import dlopen, dlclose
-
-import traceback
+    dlopen = _ctypes.dlopen
+    dlclose = _ctypes.dlclose
+
+
 def get_last_traceback(tb):
     while tb.tb_next:
         tb = tb.tb_next
     return tb
 
-lib_ext ={
-     "linux2":".so",
-     "win32":".dll",
-     }.get(sys.platform, "")
+
+lib_ext = {
+    "linux2": ".so",
+    "win32":  ".dll",
+}.get(sys.platform, "")
+
 
 def PLCprint(message):
     sys.stdout.write("PLCobject : "+message+"\n")
     sys.stdout.flush()
 
-class PLCObject(pyro.ObjBase):
-    def __init__(self, workingdir, daemon, argv, statuschange, evaluator, pyruntimevars):
-        pyro.ObjBase.__init__(self)
+
+def RunInMain(func):
+    def func_wrapper(*args, **kwargs):
+        return MainWorker.call(func, *args, **kwargs)
+    return func_wrapper
+
+
+class PLCObject(object):
+    def __init__(self, WorkingDir, argv, statuschange, evaluator, pyruntimevars):
+        self.workingdir = WorkingDir # must exits already
+        self.tmpdir = os.path.join(WorkingDir, 'tmp')
+        if os.path.exists(self.tmpdir):
+            shutil.rmtree(self.tmpdir)
+        os.mkdir(self.tmpdir)
+        # FIXME : is argv of any use nowadays ?
+        self.argv = [WorkingDir] + argv  # force argv[0] to be "path" to exec...
+        self.statuschange = statuschange
         self.evaluator = evaluator
-        self.argv = [workingdir] + argv # force argv[0] to be "path" to exec...
-        self.workingdir = workingdir
-        self.PLCStatus = "Empty"
+        self.pyruntimevars = pyruntimevars
+        self.PLCStatus = PlcStatus.Empty
         self.PLClibraryHandle = None
         self.PLClibraryLock = Lock()
-        self.DummyIteratorLock = None
         # Creates fake C funcs proxies
-        self._FreePLC()
-        self.daemon = daemon
-        self.statuschange = statuschange
-        self.hmi_frame = None
-        self.pyruntimevars = pyruntimevars
+        self._InitPLCStubCalls()
         self._loading_error = None
         self.python_runtime_vars = None
         self.TraceThread = None
         self.TraceLock = Lock()
-        self.TraceWakeup = Event()
         self.Traces = []
 
-    def AutoLoad(self):
-        # Get the last transfered PLC if connector must be restart
+        self._init_blobs()
+
+    # First task of worker -> no @RunInMain
+    def AutoLoad(self, autostart):
+        # Get the last transfered PLC
         try:
-            self.CurrentPLCFilename=open(
-                             self._GetMD5FileName(),
-                             "r").read().strip() + lib_ext
+            self.CurrentPLCFilename = open(
+                self._GetMD5FileName(),
+                "r").read().strip() + lib_ext
             if self.LoadPLC():
-                self.PLCStatus = "Stopped"
-        except Exception, e:
-            self.PLCStatus = "Empty"
-            self.CurrentPLCFilename=None
+                self.PLCStatus = PlcStatus.Stopped
+                if autostart:
+                    self.StartPLC()
+                    return
+        except Exception:
+            self.PLCStatus = PlcStatus.Empty
+            self.CurrentPLCFilename = None
+
+        self.StatusChange()
 
     def StatusChange(self):
         if self.statuschange is not None:
             for callee in self.statuschange:
                 callee(self.PLCStatus)
 
+    @RunInMain
     def LogMessage(self, *args):
         if len(args) == 2:
             level, msg = args
         else:
             level = LogLevelsDefault
             msg, = args
-        return self._LogMessage(level, msg, len(msg))
-
+        PLCprint(msg)
+        if self._LogMessage is not None:
+            return self._LogMessage(level, msg, len(msg))
+        return None
+
+    @RunInMain
     def ResetLogCount(self):
         if self._ResetLogCount is not None:
             self._ResetLogCount()
 
+    # used internaly
     def GetLogCount(self, level):
-        if self._GetLogCount is not None :
+        if self._GetLogCount is not None:
             return int(self._GetLogCount(level))
-        elif self._loading_error is not None and level==0:
+        elif self._loading_error is not None and level == 0:
             return 1
 
+    @RunInMain
     def GetLogMessage(self, level, msgid):
         tick = ctypes.c_uint32()
         tv_sec = ctypes.c_uint32()
@@ -115,37 +157,37 @@
         if self._GetLogMessage is not None:
             maxsz = len(self._log_read_buffer)-1
             sz = self._GetLogMessage(level, msgid,
-                self._log_read_buffer, maxsz,
-                ctypes.byref(tick),
-                ctypes.byref(tv_sec),
-                ctypes.byref(tv_nsec))
+                                     self._log_read_buffer, maxsz,
+                                     ctypes.byref(tick),
+                                     ctypes.byref(tv_sec),
+                                     ctypes.byref(tv_nsec))
             if sz and sz <= maxsz:
                 self._log_read_buffer[sz] = '\x00'
-                return self._log_read_buffer.value,tick.value,tv_sec.value,tv_nsec.value
-        elif self._loading_error is not None and level==0:
-            return self._loading_error,0,0,0
+                return self._log_read_buffer.value, tick.value, tv_sec.value, tv_nsec.value
+        elif self._loading_error is not None and level == 0:
+            return self._loading_error, 0, 0, 0
         return None
 
     def _GetMD5FileName(self):
         return os.path.join(self.workingdir, "lasttransferedPLC.md5")
 
     def _GetLibFileName(self):
-        return os.path.join(self.workingdir,self.CurrentPLCFilename)
-
-
-    def LoadPLC(self):
+        return os.path.join(self.workingdir, self.CurrentPLCFilename)
+
+    def _LoadPLC(self):
         """
         Load PLC library
         Declare all functions, arguments and return values
         """
         md5 = open(self._GetMD5FileName(), "r").read()
+        self.PLClibraryLock.acquire()
         try:
             self._PLClibraryHandle = dlopen(self._GetLibFileName())
             self.PLClibraryHandle = ctypes.CDLL(self.CurrentPLCFilename, handle=self._PLClibraryHandle)
 
             self.PLC_ID = ctypes.c_char_p.in_dll(self.PLClibraryHandle, "PLC_ID")
-            if len(md5) == 32 : 
-                self.PLC_ID.value = md5 
+            if len(md5) == 32:
+                self.PLC_ID.value = md5
 
             self._startPLC = self.PLClibraryHandle.startPLC
             self._startPLC.restype = ctypes.c_int
@@ -164,6 +206,7 @@
                 # If python confnode is not enabled, we reuse _PythonIterator
                 # as a call that block pythonthread until StopPLC
                 self.PlcStopping = Event()
+
                 def PythonIterator(res, blkid):
                     self.PlcStopping.clear()
                     self.PlcStopping.wait()
@@ -175,7 +218,6 @@
                     self.PlcStopping.set()
                 self._stopPLC = __StopPLC
 
-
             self._ResetDebugVariables = self.PLClibraryHandle.ResetDebugVariables
             self._ResetDebugVariables.restype = None
 
@@ -208,52 +250,74 @@
             self._LogMessage.restype = ctypes.c_int
             self._LogMessage.argtypes = [ctypes.c_uint8, ctypes.c_char_p, ctypes.c_uint32]
 
-            self._log_read_buffer = ctypes.create_string_buffer(1<<14) #16K
+            self._log_read_buffer = ctypes.create_string_buffer(1 << 14)  # 16K
             self._GetLogMessage = self.PLClibraryHandle.GetLogMessage
             self._GetLogMessage.restype = ctypes.c_uint32
             self._GetLogMessage.argtypes = [ctypes.c_uint8, ctypes.c_uint32, ctypes.c_char_p, ctypes.c_uint32, ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(ctypes.c_uint32)]
 
             self._loading_error = None
 
-            self.PythonRuntimeInit()
-
-            return True
-        except:
+        except Exception:
             self._loading_error = traceback.format_exc()
             PLCprint(self._loading_error)
             return False
-
+        finally:
+            self.PLClibraryLock.release()
+
+        return True
+
+    @RunInMain
+    def LoadPLC(self):
+        res = self._LoadPLC()
+        if res:
+            self.PythonRuntimeInit()
+        else:
+            self._FreePLC()
+
+        return res
+
+    @RunInMain
     def UnLoadPLC(self):
         self.PythonRuntimeCleanup()
         self._FreePLC()
 
+    def _InitPLCStubCalls(self):
+        """
+        create dummy C func proxies
+        """
+        self._startPLC = lambda x, y: None
+        self._stopPLC = lambda: None
+        self._ResetDebugVariables = lambda: None
+        self._RegisterDebugVariable = lambda x, y: None
+        self._IterDebugData = lambda x, y: None
+        self._FreeDebugData = lambda: None
+        self._GetDebugData = lambda: -1
+        self._suspendDebug = lambda x: -1
+        self._resumeDebug = lambda: None
+        self._PythonIterator = lambda: ""
+        self._GetLogCount = None
+        self._LogMessage = None
+        self._GetLogMessage = None
+        self._PLClibraryHandle = None
+        self.PLClibraryHandle = None
+
     def _FreePLC(self):
         """
         Unload PLC library.
         This is also called by __init__ to create dummy C func proxies
         """
         self.PLClibraryLock.acquire()
-        # Forget all refs to library
-        self._startPLC = lambda x,y:None
-        self._stopPLC = lambda:None
-        self._ResetDebugVariables = lambda:None
-        self._RegisterDebugVariable = lambda x, y:None
-        self._IterDebugData = lambda x,y:None
-        self._FreeDebugData = lambda:None
-        self._GetDebugData = lambda:-1
-        self._suspendDebug = lambda x:-1
-        self._resumeDebug = lambda:None
-        self._PythonIterator = lambda:""
-        self._GetLogCount = None
-        self._LogMessage = lambda l,m,s:PLCprint("OFF LOG :"+m)
-        self._GetLogMessage = None
-        self.PLClibraryHandle = None
-        # Unload library explicitely
-        if getattr(self,"_PLClibraryHandle",None) is not None:
-            dlclose(self._PLClibraryHandle)
-            self._PLClibraryHandle = None
-
-        self.PLClibraryLock.release()
+        try:
+            # Unload library explicitely
+            if getattr(self, "_PLClibraryHandle", None) is not None:
+                dlclose(self._PLClibraryHandle)
+
+            # Forget all refs to library
+            self._InitPLCStubCalls()
+
+        finally:
+            self.PLClibraryLock.release()
+
         return False
 
     def PythonRuntimeCall(self, methodname):
@@ -261,42 +325,45 @@
         Calls init, start, stop or cleanup method provided by
         runtime python files, loaded when new PLC uploaded
         """
-        for method in self.python_runtime_vars.get("_runtime_%s"%methodname, []):
-            res,exp = self.evaluator(method)
+        for method in self.python_runtime_vars.get("_runtime_%s" % methodname, []):
+            _res, exp = self.evaluator(method)
             if exp is not None:
-                self.LogMessage(0,'\n'.join(traceback.format_exception(*exp)))
-
+                self.LogMessage(0, '\n'.join(traceback.format_exception(*exp)))
+
+    # used internaly
     def PythonRuntimeInit(self):
         MethodNames = ["init", "start", "stop", "cleanup"]
         self.python_runtime_vars = globals().copy()
         self.python_runtime_vars.update(self.pyruntimevars)
-
-        class PLCSafeGlobals:
-            def __getattr__(_self, name):
-                try :
-                    t = self.python_runtime_vars["_"+name+"_ctype"]
+        parent = self
+
+        class PLCSafeGlobals(object):
+            def __getattr__(self, name):
+                try:
+                    t = parent.python_runtime_vars["_"+name+"_ctype"]
                 except KeyError:
-                    raise KeyError("Try to get unknown shared global variable : %s"%name)
+                    raise KeyError("Try to get unknown shared global variable : %s" % name)
                 v = t()
-                r = self.python_runtime_vars["_PySafeGetPLCGlob_"+name](ctypes.byref(v))
-                return self.python_runtime_vars["_"+name+"_unpack"](v)
-            def __setattr__(_self, name, value):
-                try :
-                    t = self.python_runtime_vars["_"+name+"_ctype"]
+                parent.python_runtime_vars["_PySafeGetPLCGlob_"+name](ctypes.byref(v))
+                return parent.python_runtime_vars["_"+name+"_unpack"](v)
+
+            def __setattr__(self, name, value):
+                try:
+                    t = parent.python_runtime_vars["_"+name+"_ctype"]
                 except KeyError:
-                    raise KeyError("Try to set unknown shared global variable : %s"%name)
-                v = self.python_runtime_vars["_"+name+"_pack"](t,value)
-                self.python_runtime_vars["_PySafeSetPLCGlob_"+name](ctypes.byref(v))
+                    raise KeyError("Try to set unknown shared global variable : %s" % name)
+                v = parent.python_runtime_vars["_"+name+"_pack"](t, value)
+                parent.python_runtime_vars["_PySafeSetPLCGlob_"+name](ctypes.byref(v))
 
         self.python_runtime_vars.update({
-            "PLCGlobals" : PLCSafeGlobals(),
-            "WorkingDir" : self.workingdir,
-            "PLCObject"  : self,
-            "PLCBinary"  : self.PLClibraryHandle,
-            "PLCGlobalsDesc" : []})
-
-        for methodname in MethodNames :
-            self.python_runtime_vars["_runtime_%s"%methodname] = []
+            "PLCGlobals":     PLCSafeGlobals(),
+            "WorkingDir":     self.workingdir,
+            "PLCObject":      self,
+            "PLCBinary":      self.PLClibraryHandle,
+            "PLCGlobalsDesc": []})
+
+        for methodname in MethodNames:
+            self.python_runtime_vars["_runtime_%s" % methodname] = []
 
         try:
             filenames = os.listdir(self.workingdir)
@@ -308,15 +375,14 @@
                     for methodname in MethodNames:
                         method = self.python_runtime_vars.get("_%s_%s" % (name, methodname), None)
                         if method is not None:
-                            self.python_runtime_vars["_runtime_%s"%methodname].append(method)
-        except:
-            self.LogMessage(0,traceback.format_exc())
+                            self.python_runtime_vars["_runtime_%s" % methodname].append(method)
+        except Exception:
+            self.LogMessage(0, traceback.format_exc())
             raise
 
         self.PythonRuntimeCall("init")
 
-
-
+    # used internaly
     def PythonRuntimeCleanup(self):
         if self.python_runtime_vars is not None:
             self.PythonRuntimeCall("cleanup")
@@ -325,141 +391,179 @@
 
     def PythonThreadProc(self):
         self.StartSem.release()
-        res,cmd,blkid = "None","None",ctypes.c_void_p()
-        compile_cache={}
+        res, cmd, blkid = "None", "None", ctypes.c_void_p()
+        compile_cache = {}
         while True:
-            # print "_PythonIterator(", res, ")",
-            cmd = self._PythonIterator(res,blkid)
+            cmd = self._PythonIterator(res, blkid)
             FBID = blkid.value
-            # print " -> ", cmd, blkid
             if cmd is None:
                 break
-            try :
-                self.python_runtime_vars["FBID"]=FBID
-                ccmd,AST =compile_cache.get(FBID, (None,None))
-                if ccmd is None or ccmd!=cmd:
+            try:
+                self.python_runtime_vars["FBID"] = FBID
+                ccmd, AST = compile_cache.get(FBID, (None, None))
+                if ccmd is None or ccmd != cmd:
                     AST = compile(cmd, '<plc>', 'eval')
-                    compile_cache[FBID]=(cmd,AST)
-                result,exp = self.evaluator(eval,AST,self.python_runtime_vars)
+                    compile_cache[FBID] = (cmd, AST)
+                result, exp = self.evaluator(eval, AST, self.python_runtime_vars)
                 if exp is not None:
                     res = "#EXCEPTION : "+str(exp[1])
-                    self.LogMessage(1,('PyEval@0x%x(Code="%s") Exception "%s"')%(FBID,cmd,
-                        '\n'.join(traceback.format_exception(*exp))))
+                    self.LogMessage(1, ('PyEval@0x%x(Code="%s") Exception "%s"') % (
+                        FBID, cmd, '\n'.join(traceback.format_exception(*exp))))
                 else:
-                    res=str(result)
-                self.python_runtime_vars["FBID"]=None
-            except Exception,e:
+                    res = str(result)
+                self.python_runtime_vars["FBID"] = None
+            except Exception as e:
                 res = "#EXCEPTION : "+str(e)
-                self.LogMessage(1,('PyEval@0x%x(Code="%s") Exception "%s"')%(FBID,cmd,str(e)))
-
+                self.LogMessage(1, ('PyEval@0x%x(Code="%s") Exception "%s"') % (FBID, cmd, str(e)))
+
+    @RunInMain
     def StartPLC(self):
-        if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped":
+        if self.CurrentPLCFilename is not None and self.PLCStatus == PlcStatus.Stopped:
             c_argv = ctypes.c_char_p * len(self.argv)
-            error = None
-            res = self._startPLC(len(self.argv),c_argv(*self.argv))
+            res = self._startPLC(len(self.argv), c_argv(*self.argv))
             if res == 0:
-                self.PLCStatus = "Started"
+                self.PLCStatus = PlcStatus.Started
                 self.StatusChange()
                 self.PythonRuntimeCall("start")
-                self.StartSem=Semaphore(0)
+                self.StartSem = Semaphore(0)
                 self.PythonThread = Thread(target=self.PythonThreadProc)
                 self.PythonThread.start()
                 self.StartSem.acquire()
                 self.LogMessage("PLC started")
             else:
-                self.LogMessage(0,_("Problem starting PLC : error %d" % res))
-                self.PLCStatus = "Broken"
+                self.LogMessage(0, _("Problem starting PLC : error %d" % res))
+                self.PLCStatus = PlcStatus.Broken
                 self.StatusChange()
 
+    @RunInMain
     def StopPLC(self):
-        if self.PLCStatus == "Started":
+        if self.PLCStatus == PlcStatus.Started:
             self.LogMessage("PLC stopped")
             self._stopPLC()
             self.PythonThread.join()
-            self.PLCStatus = "Stopped"
+            self.PLCStatus = PlcStatus.Stopped
             self.StatusChange()
             self.PythonRuntimeCall("stop")
-            if self.TraceThread is not None :
-                self.TraceWakeup.set()
+            if self.TraceThread is not None:
                 self.TraceThread.join()
                 self.TraceThread = None
             return True
         return False
 
-    def _Reload(self):
-        self.daemon.shutdown(True)
-        self.daemon.sock.close()
-        os.execv(sys.executable,[sys.executable]+sys.argv[:])
-        # never reached
-        return 0
-
-    def ForceReload(self):
-        # respawn python interpreter
-        Timer(0.1,self._Reload).start()
-        return True
-
+    @RunInMain
     def GetPLCstatus(self):
-        return self.PLCStatus, map(self.GetLogCount,xrange(LogLevelsCount))
-
-    def NewPLC(self, md5sum, data, extrafiles):
-        if self.PLCStatus in ["Stopped", "Empty", "Broken"]:
+        return self.PLCStatus, map(self.GetLogCount, xrange(LogLevelsCount))
+
+    @RunInMain
+    def GetPLCID(self):
+        return getPSKID()
+
+    def _init_blobs(self):
+        self.blobs = {}
+        if os.path.exists(self.tmpdir):
+            shutil.rmtree(self.tmpdir)
+        os.mkdir(self.tmpdir)
+    
+    @RunInMain
+    def AppendChunkToBlob(self, data, blobID):
+        blob = ((mkstemp(dir=self.tmpdir) if data else None)\
+                   + (md5.new(),)) \
+               if blobID == empty_md5_digest \
+               else self.blobs.pop(blobID, None)
+
+        if blob is None:
+            return None
+
+        fobj, path, md5sum = blob
+        md5sum.update(data)
+        newBlobID = md5sum.digest()
+        if data:
+            os.write(fobj,data)
+            self.blobs[newBlobID] = blob
+        return newBlobID
+
+    @RunInMain
+    def PurgeBlobs(self):
+        for fobj, path, md5sum in self.blobs:
+            os.close(fobj) 
+        self._init_blobs()
+
+    def _BlobAsFile(self, blobID, newpath):
+        blob = self.blobs.pop(blobID, None)
+
+        if blob is None:
+            if blobID == md5.new().digest():
+                # create empty file
+                open(newpath,'r').close()
+                return
+            raise Exception(_("Missing data to create file: {}").format(newpath))
+
+        fobj, path, md5sum = blob
+        os.close(fobj)
+        shutil.move(path, newpath)
+            
+    @RunInMain
+    def NewPLC(self, md5sum, plc_object, extrafiles):
+        if self.PLCStatus in [PlcStatus.Stopped, PlcStatus.Empty, PlcStatus.Broken]:
             NewFileName = md5sum + lib_ext
-            extra_files_log = os.path.join(self.workingdir,"extra_files.txt")
+            extra_files_log = os.path.join(self.workingdir, "extra_files.txt")
+
+            old_PLC_filename = os.path.join(self.workingdir, self.CurrentPLCFilename) \
+                if self.CurrentPLCFilename is not None \
+                else None
+            new_PLC_filename = os.path.join(self.workingdir, NewFileName)
 
             self.UnLoadPLC()
 
-            self.LogMessage("NewPLC (%s)"%md5sum)
-            self.PLCStatus = "Empty"
+            self.LogMessage("NewPLC (%s)" % md5sum)
+            self.PLCStatus = PlcStatus.Empty
 
             try:
-                os.remove(os.path.join(self.workingdir,
-                                       self.CurrentPLCFilename))
-                for filename in file(extra_files_log, "r").readlines() + [extra_files_log]:
+                os.remove(old_PLC_filename)
+                for filename in open(extra_files_log, "rt").readlines() + [extra_files_log]:
                     try:
                         os.remove(os.path.join(self.workingdir, filename.strip()))
-                    except:
+                    except Exception:
                         pass
-            except:
+            except Exception:
                 pass
 
             try:
                 # Create new PLC file
-                open(os.path.join(self.workingdir,NewFileName),
-                     'wb').write(data)
+                self._BlobAsFile(plc_object, new_PLC_filename)
 
                 # Store new PLC filename based on md5 key
                 open(self._GetMD5FileName(), "w").write(md5sum)
 
                 # Then write the files
-                log = file(extra_files_log, "w")
-                for fname,fdata in extrafiles:
-                    fpath = os.path.join(self.workingdir,fname)
-                    open(fpath, "wb").write(fdata)
+                log = open(extra_files_log, "w")
+                for fname, blobID in extrafiles:
+                    fpath = os.path.join(self.workingdir, fname)
+                    self._BlobAsFile(blobID, fpath)
                     log.write(fname+'\n')
 
                 # Store new PLC filename
                 self.CurrentPLCFilename = NewFileName
-            except:
-                self.PLCStatus = "Broken"
+            except Exception:
+                self.PLCStatus = PlcStatus.Broken
                 self.StatusChange()
                 PLCprint(traceback.format_exc())
                 return False
 
             if self.LoadPLC():
-                self.PLCStatus = "Stopped"
+                self.PLCStatus = PlcStatus.Stopped
             else:
-                self.PLCStatus = "Broken"
-                self._FreePLC()
+                self.PLCStatus = PlcStatus.Broken
             self.StatusChange()
 
-            return self.PLCStatus == "Stopped"
+            return self.PLCStatus == PlcStatus.Stopped
         return False
 
     def MatchMD5(self, MD5):
         try:
             last_md5 = open(self._GetMD5FileName(), "r").read()
             return last_md5 == MD5
-        except:
+        except Exception:
             pass
         return False
 
@@ -473,55 +577,30 @@
             if self._suspendDebug(False) == 0:
                 # keep a copy of requested idx
                 self._ResetDebugVariables()
-                for idx,iectype,force in idxs:
-                    if force !=None:
-                        c_type,unpack_func, pack_func = \
+                for idx, iectype, force in idxs:
+                    if force is not None:
+                        c_type, _unpack_func, pack_func = \
                             TypeTranslator.get(iectype,
-                                                    (None,None,None))
-                        force = ctypes.byref(pack_func(c_type,force))
+                                               (None, None, None))
+                        force = ctypes.byref(pack_func(c_type, force))
                     self._RegisterDebugVariable(idx, force)
                 self._TracesSwap()
                 self._resumeDebug()
         else:
             self._suspendDebug(True)
 
-    def _TracesPush(self, trace):
-        self.TraceLock.acquire()
-        lT = len(self.Traces)
-        if lT != 0 and lT * len(self.Traces[0]) > 1024 * 1024 :
-            self.Traces.pop(0)
-        self.Traces.append(trace)
-        self.TraceLock.release()
-
     def _TracesSwap(self):
         self.LastSwapTrace = time()
-        if self.TraceThread is None and self.PLCStatus == "Started":
+        if self.TraceThread is None and self.PLCStatus == PlcStatus.Started:
             self.TraceThread = Thread(target=self.TraceThreadProc)
             self.TraceThread.start()
         self.TraceLock.acquire()
         Traces = self.Traces
         self.Traces = []
         self.TraceLock.release()
-        self.TraceWakeup.set()
         return Traces
 
-    def _TracesAutoSuspend(self):
-        # TraceProc stops here if Traces not polled for 3 seconds
-        traces_age = time() - self.LastSwapTrace
-        if traces_age > 3:
-            self.TraceLock.acquire()
-            self.Traces = []
-            self.TraceLock.release()
-            self._suspendDebug(True) # Disable debugger
-            self.TraceWakeup.clear()
-            self.TraceWakeup.wait()
-            self._resumeDebug() # Re-enable debugger
-
-    def _TracesFlush(self):
-        self.TraceLock.acquire()
-        self.Traces = []
-        self.TraceLock.release()
-
+    @RunInMain
     def GetTraceVariables(self):
         return self.PLCStatus, self._TracesSwap()
 
@@ -529,33 +608,54 @@
         """
         Return a list of traces, corresponding to the list of required idx
         """
-        while self.PLCStatus == "Started" :
+        self._resumeDebug()  # Re-enable debugger
+        while self.PLCStatus == PlcStatus.Started:
             tick = ctypes.c_uint32()
             size = ctypes.c_uint32()
             buff = ctypes.c_void_p()
             TraceBuffer = None
-            if self.PLClibraryLock.acquire(False):
-                if self._GetDebugData(ctypes.byref(tick),
-                                      ctypes.byref(size),
-                                      ctypes.byref(buff)) == 0:
-                    if size.value:
-                        TraceBuffer = ctypes.string_at(buff.value, size.value)
-                    self._FreeDebugData()
-                self.PLClibraryLock.release()
+
+            self.PLClibraryLock.acquire()
+
+            res = self._GetDebugData(ctypes.byref(tick),
+                                     ctypes.byref(size),
+                                     ctypes.byref(buff))
+            if res == 0:
+                if size.value:
+                    TraceBuffer = ctypes.string_at(buff.value, size.value)
+                self._FreeDebugData()
+
+            self.PLClibraryLock.release()
+
+            # leave thread if GetDebugData isn't happy.
+            if res != 0:
+                break
+
             if TraceBuffer is not None:
-                self._TracesPush((tick.value, TraceBuffer))
-            self._TracesAutoSuspend()
-        self._TracesFlush()
-
+                self.TraceLock.acquire()
+                lT = len(self.Traces)
+                if lT != 0 and lT * len(self.Traces[0]) > 1024 * 1024:
+                    self.Traces.pop(0)
+                self.Traces.append((tick.value, TraceBuffer))
+                self.TraceLock.release()
+
+            # TraceProc stops here if Traces not polled for 3 seconds
+            traces_age = time() - self.LastSwapTrace
+            if traces_age > 3:
+                self.TraceLock.acquire()
+                self.Traces = []
+                self.TraceLock.release()
+                self._suspendDebug(True)  # Disable debugger
+                break
+
+        self.TraceThread = None
 
     def RemoteExec(self, script, *kwargs):
         try:
-            exec script in kwargs
-        except:
-            e_type, e_value, e_traceback = sys.exc_info()
+            exec(script, kwargs)
+        except Exception:
+            _e_type, e_value, e_traceback = sys.exc_info()
             line_no = traceback.tb_lineno(get_last_traceback(e_traceback))
             return (-1, "RemoteExec script failed!\n\nLine %d: %s\n\t%s" %
-                        (line_no, e_value, script.splitlines()[line_no - 1]))
+                    (line_no, e_value, script.splitlines()[line_no - 1]))
         return (0, kwargs.get("returnVal", None))
-
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/PlcStatus.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+
+# See COPYING.Runtime file for copyrights details.
+
+
+def _(x):
+    """No translation"""
+    return x
+
+
+Broken = _("Broken")
+Started = _("Started")
+Stopped = _("Stopped")
+Disconnected = _("Disconnected")
+Empty = _("Empty")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/PyroServer.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz runtime.
+
+# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
+# Copyright (C) 2018: Edouard TISSERANT
+
+# See COPYING file for copyrights details.
+
+from __future__ import absolute_import
+from __future__ import print_function
+import sys
+
+import Pyro
+import Pyro.core as pyro
+import runtime
+from runtime.ServicePublisher import ServicePublisher
+
+
+class PyroServer(object):
+    def __init__(self, servicename, ip_addr, port):
+        self.continueloop = True
+        self.daemon = None
+        self.servicename = servicename
+        self.ip_addr = ip_addr
+        self.port = port
+        self.servicepublisher = None
+
+    def _to_be_published(self):
+        return self.servicename is not None and \
+               self.ip_addr not in ["", "localhost", "127.0.0.1"]
+
+    def PrintServerInfo(self):
+        print(_("Pyro port :"), self.port)
+
+        if self._to_be_published():
+            print(_("Publishing service on local network"))
+
+        sys.stdout.flush()
+
+    def PyroLoop(self, when_ready):
+        if self._to_be_published(): self.Publish()
+        while self.continueloop:
+            Pyro.config.PYRO_MULTITHREADED = 0
+            pyro.initServer()
+            self.daemon = pyro.Daemon(host=self.ip_addr, port=self.port)
+
+            # pyro never frees memory after connection close if no timeout set
+            # taking too small timeout value may cause
+            # unwanted diconnection when IDE is kept busy for long periods
+            self.daemon.setTimeout(60)
+
+            pyro_obj = Pyro.core.ObjBase()
+            pyro_obj.delegateTo(runtime.GetPLCObjectSingleton())
+
+            self.daemon.connect(pyro_obj, "PLCObject")
+
+            when_ready()
+            self.daemon.requestLoop()
+            self.daemon.sock.close()
+        self.Unpublish()
+
+    def Restart(self):
+        self.daemon.shutdown(True)
+
+    def Quit(self):
+        self.continueloop = False
+        self.daemon.shutdown(True)
+
+    def Publish(self):
+        self.servicepublisher = ServicePublisher("PYRO")
+        self.servicepublisher.RegisterService(self.servicename,
+                                              self.ip_addr, self.port)
+
+    def Unpublish(self):
+        if self.servicepublisher is not None:
+            self.servicepublisher.UnRegisterService()
+            self.servicepublisher = None
--- a/runtime/ServicePublisher.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/runtime/ServicePublisher.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,94 +1,106 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+# This file is part of Beremiz runtime.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
-# See COPYING file for copyrights details.
+# See COPYING.Runtime file for copyrights details.
 #
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# This library is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
 
-import socket, threading
-from util import Zeroconf
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-service_type = '_PYRO._tcp.local.'
 
-class ServicePublisher():
-    def __init__(self):
+from __future__ import absolute_import
+from __future__ import print_function
+import socket
+import threading
+import zeroconf
+
+
+service_type = '_Beremiz._tcp.local.'
+
+class ServicePublisher(object):
+    def __init__(self, protocol):
         # type: fully qualified service type name
-        self.serviceproperties = {'description':'Beremiz remote PLC'}
-        
+        self.serviceproperties = {
+            'description': 'Beremiz remote PLC',
+            'protocol': protocol
+        }
+
         self.name = None
         self.ip_32b = None
         self.port = None
         self.server = None
         self.service_name = None
         self.retrytimer = None
-        
+
     def RegisterService(self, name, ip, port):
         try:
             self._RegisterService(name, ip, port)
-        except Exception,e:
-            self.retrytimer = threading.Timer(2,self.RegisterService,[name, ip, port])
-            self.retrytimer.start() 
+        except Exception:
+            self.retrytimer = threading.Timer(2, self.RegisterService, [name, ip, port])
+            self.retrytimer.start()
 
     def _RegisterService(self, name, ip, port):
         # name: fully qualified service name
-        self.service_name = 'Beremiz_%s.%s'%(name,service_type)
+        self.service_name = '%s.%s' % (name, service_type)
         self.name = name
         self.port = port
 
-        self.server = Zeroconf.Zeroconf(ip)
-        print "MDNS brodcasting on :"+ip
+        if ip == "0.0.0.0":
+            print("MDNS brodcasted on all interfaces")
+            interfaces=zeroconf.InterfaceChoice.All
+            ip = self.gethostaddr()
+        else:
+            interfaces=[ip]
 
-        if ip == "0.0.0.0":
-            ip = self.gethostaddr()
-        print "MDNS brodcasted service address :"+ip
+        self.server = zeroconf.Zeroconf(interfaces=interfaces)
+        
+        print("MDNS brodcasted service address :" + ip)
         self.ip_32b = socket.inet_aton(ip)
 
-        self.server.registerService(
-             Zeroconf.ServiceInfo(service_type,
-                                  self.service_name,
-                                  self.ip_32b,
-                                  self.port,
-                                  properties = self.serviceproperties))
-        self.retrytimer=None
-    
+        self.server.register_service(
+            zeroconf.ServiceInfo(service_type,
+                                 self.service_name,
+                                 self.ip_32b,
+                                 self.port,
+                                 properties=self.serviceproperties))
+        self.retrytimer = None
+
     def UnRegisterService(self):
         if self.retrytimer is not None:
             self.retrytimer.cancel()
 
-        self.server.unregisterService(
-                                      Zeroconf.ServiceInfo(service_type, 
-                                                           self.service_name, 
-                                                           self.ip_32b, 
-                                                           self.port, 
-                                                           properties = self.serviceproperties))
-        self.server.close()
-        self.server = None
-    
-    def gethostaddr(self, dst = '224.0.1.41'):
+        if self.server is not None:
+            self.server.unregister_service(
+                zeroconf.ServiceInfo(service_type,
+                                     self.service_name,
+                                     self.ip_32b,
+                                     self.port,
+                                     properties=self.serviceproperties))
+            self.server.close()
+            self.server = None
+
+    def gethostaddr(self, dst='224.0.1.41'):
         s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
         try:
             s.connect((dst, 7))
-            (host, port) = s.getsockname()
+            (host, _port) = s.getsockname()
             s.close()
             if host != '0.0.0.0':
                 return host
-        except Exception,e:
+        except Exception:
             pass
         return socket.gethostbyname(socket.gethostname())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/Stunnel.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,41 @@
+import os
+from binascii import b2a_hqx
+try:
+    from runtime.spawn_subprocess import call
+except ImportError:
+    from subprocess import call
+
+restart_stunnel_cmdline = ["/etc/init.d/S50stunnel","restart"]
+
+_PSKpath = None
+
+def PSKgen(ID, PSKpath):
+
+    # b2a_hqx output len is 4/3 input len
+    secret = os.urandom(192) # int(256/1.3333)
+    secretstring = b2a_hqx(secret)
+
+    PSKstring = ID+":"+secretstring
+    with open(PSKpath, 'w') as f:
+        f.write(PSKstring)
+    call(restart_stunnel_cmdline)
+
+def ensurePSK(ID, PSKpath):
+    global _PSKpath
+    _PSKpath = PSKpath
+    # check if already there
+    if not os.path.exists(PSKpath):
+        # create if needed
+        PSKgen(ID, PSKpath)
+
+def getPSKID():
+    if _PSKpath is not None :
+        if not os.path.exists(_PSKpath):
+            confnodesroot.logger.write_error(
+                'Error: Pre-Shared-Key Secret in %s is missing!\n' % _PSKpath)
+            return None
+        ID,_sep,PSK = open(_PSKpath).read().partition(':')
+        PSK = PSK.rstrip('\n\r')
+        return (ID,PSK)
+    return None
+    
--- a/runtime/WampClient.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/runtime/WampClient.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,133 +1,446 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+# This file is part of Beremiz runtime.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
 #
-# See COPYING file for copyrights details.
+# See COPYING.Runtime file for copyrights details.
 #
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+
+# This library is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-import sys
-#from twisted.python import log
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+from __future__ import absolute_import
+from __future__ import print_function
+import time
+import json
+import os
+import re
+from builtins import str as text
 from autobahn.twisted import wamp
 from autobahn.twisted.websocket import WampWebSocketClientFactory, connectWS
-from twisted.internet.defer import inlineCallbacks
-from autobahn.wamp import types
+from autobahn.wamp import types, auth
 from autobahn.wamp.serializer import MsgPackSerializer
 from twisted.internet.protocol import ReconnectingClientFactory
-import json
-
+from twisted.python.components import registerAdapter
+
+from formless import annotate, webform
+import formless
+from nevow import tags, url, static
+from runtime import GetPLCObjectSingleton
+
+mandatoryConfigItems = ["ID", "active", "realm", "url"]
+
+_transportFactory = None
 _WampSession = None
 _PySrv = None
-
-ExposedCalls = ["StartPLC",
-                "StopPLC",
-                "ForceReload",
-                "GetPLCstatus",
-                "NewPLC",
-                "MatchMD5",
-                "SetTraceVariablesList",
-                "GetTraceVariables",
-                "RemoteExec",
-                "GetLogMessage",
-                "ResetLogCount",
-                ]
-
+WorkingDir = None
+
+# Find pre-existing project WAMP config file
+_WampConf = None
+_WampSecret = None
+
+ExposedCalls = [
+    ("StartPLC", {}),
+    ("StopPLC", {}),
+    ("GetPLCstatus", {}),
+    ("GetPLCID", {}),
+    ("AppendChunkToBlob", {}),
+    ("PurgeBlobs", {}),
+    ("NewPLC", {}),
+    ("MatchMD5", {}),
+    ("SetTraceVariablesList", {}),
+    ("GetTraceVariables", {}),
+    ("RemoteExec", {}),
+    ("GetLogMessage", {}),
+    ("ResetLogCount", {})
+]
+
+# de-activated dumb wamp config
+defaultWampConfig = {
+    "ID": "wamptest",
+    "active": False,
+    "realm": "Automation",
+    "url": "ws://127.0.0.1:8888"
+}
+
+# Those two lists are meant to be filled by customized runtime
+# or User python code.
+
+""" crossbar Events to register to """
 SubscribedEvents = []
 
+""" things to do on join (callables) """
 DoOnJoin = []
 
+lastKnownConfig = None
+
+
 def GetCallee(name):
     """ Get Callee or Subscriber corresponding to '.' spearated object path """
-    global _PySrv
     names = name.split('.')
-    obj = _PySrv.plcobj
-    while names: obj = getattr(obj, names.pop(0))
+    obj = GetPLCObjectSingleton()
+    while names:
+        obj = getattr(obj, names.pop(0))
     return obj
 
+
 class WampSession(wamp.ApplicationSession):
 
-    @inlineCallbacks
+    def onConnect(self):
+        if "secret" in self.config.extra:
+            user = self.config.extra["ID"]
+            self.join(u"Automation", [u"wampcra"], user)
+        else:
+            self.join(u"Automation")
+
+    def onChallenge(self, challenge):
+        if challenge.method == u"wampcra":
+            if "secret" in self.config.extra:
+                secret = self.config.extra["secret"].encode('utf8')
+                signature = auth.compute_wcs(
+                    secret, challenge.extra['challenge'].encode('utf8'))
+                return signature.decode("ascii")
+            else:
+                raise Exception("no secret given for authentication")
+        else:
+            raise Exception(
+                "don't know how to handle authmethod {}".format(challenge.method))
+
     def onJoin(self, details):
         global _WampSession
         _WampSession = self
         ID = self.config.extra["ID"]
-        print 'WAMP session joined by :', ID
-        for name in ExposedCalls:
-            reg = yield self.register(GetCallee(name), '.'.join((ID,name)))
+
+        for name, kwargs in ExposedCalls:
+            try:
+                registerOptions = types.RegisterOptions(**kwargs)
+            except TypeError as e:
+                registerOptions = None
+                print(_("TypeError register option: {}".format(e)))
+
+            self.register(GetCallee(name), u'.'.join((ID, name)), registerOptions)
 
         for name in SubscribedEvents:
-            reg = yield self.subscribe(GetCallee(name), name)
+            self.subscribe(GetCallee(name), unicode(name))
 
         for func in DoOnJoin:
-            yield func(self)
+            func(self)
+
+        print(_('WAMP session joined (%s) by:' % time.ctime()), ID)
 
     def onLeave(self, details):
-        global _WampSession
+        global _WampSession, _transportFactory
+        super(WampSession, self).onLeave(details)
         _WampSession = None
-        print 'WAMP session left'
+        _transportFactory = None
+        print(_('WAMP session left'))
+
+    def publishWithOwnID(self, eventID, value):
+        ID = self.config.extra["ID"]
+        self.publish(unicode(ID+'.'+eventID), value)
+
 
 class ReconnectingWampWebSocketClientFactory(WampWebSocketClientFactory, ReconnectingClientFactory):
+
+    def __init__(self, config, *args, **kwargs):
+        global _transportFactory
+        WampWebSocketClientFactory.__init__(self, *args, **kwargs)
+
+        try:
+            protocolOptions = config.extra.get('protocolOptions', None)
+            if protocolOptions:
+                self.setProtocolOptions(**protocolOptions)
+            _transportFactory = self
+        except Exception as e:
+            print(_("Custom protocol options failed :"), e)
+            _transportFactory = None
+
+    def buildProtocol(self, addr):
+        self.resetDelay()
+        return ReconnectingClientFactory.buildProtocol(self, addr)
+
     def clientConnectionFailed(self, connector, reason):
-        print("WAMP Client connection failed .. retrying ..")
-        self.retry(connector)
+        print(_("WAMP Client connection failed (%s) .. retrying ..") %
+              time.ctime())
+        super(ReconnectingWampWebSocketClientFactory,
+              self).clientConnectionFailed(connector, reason)
+
     def clientConnectionLost(self, connector, reason):
-        print("WAMP Client connection lost .. retrying ..")
-        self.retry(connector)
-
-def LoadWampClientConf(wampconf):
-
-    WSClientConf = json.load(open(wampconf))
-    return WSClientConf
-
-def RegisterWampClient(wampconf):
-
-    WSClientConf = LoadWampClientConf(wampconf)
-
-    ## start logging to console
-    # log.startLogging(sys.stdout)
+        print(_("WAMP Client connection lost (%s) .. retrying ..") %
+              time.ctime())
+        super(ReconnectingWampWebSocketClientFactory,
+              self).clientConnectionFailed(connector, reason)
+
+
+def CheckConfiguration(WampClientConf):
+    url = WampClientConf["url"]
+    if not IsCorrectUri(url):
+        raise annotate.ValidateError(
+            {"url": "Invalid URL: {}".format(url)},
+            _("WAMP configuration error:"))
+
+
+def GetConfiguration():
+    global lastKnownConfig
+
+    if os.path.exists(_WampConf):
+        WampClientConf = json.load(open(_WampConf))
+    else:
+        WampClientConf = defaultWampConfig.copy()
+
+    for itemName in mandatoryConfigItems:
+        if WampClientConf.get(itemName, None) is None:
+            raise Exception(
+                _("WAMP configuration error : missing '{}' parameter.").format(itemName))
+
+    CheckConfiguration(WampClientConf)
+
+    lastKnownConfig = WampClientConf.copy()
+    return WampClientConf
+
+
+def SetWampSecret(wampSecret):
+    with open(os.path.realpath(_WampSecret), 'w') as f:
+        f.write(wampSecret)
+
+
+def SetConfiguration(WampClientConf):
+    global lastKnownConfig
+
+    CheckConfiguration(WampClientConf)
+
+    lastKnownConfig = WampClientConf.copy()
+
+    with open(os.path.realpath(_WampConf), 'w') as f:
+        json.dump(WampClientConf, f, sort_keys=True, indent=4)
+    StopReconnectWampClient()
+    if 'active' in WampClientConf and WampClientConf['active']:
+        StartReconnectWampClient()
+
+    return WampClientConf
+
+
+def LoadWampSecret(secretfname):
+    WSClientWampSecret = open(secretfname, 'rb').read()
+    if len(WSClientWampSecret) == 0:
+        raise Exception(_("WAMP secret empty"))
+    return WSClientWampSecret
+
+
+def IsCorrectUri(uri):
+    return re.match(r'wss?://[^\s?:#-]+(:[0-9]+)?(/[^\s]*)?$', uri) is not None
+
+
+def RegisterWampClient(wampconf=None, wampsecret=None):
+    global _WampConf, _WampSecret
+    _WampConfDefault = os.path.join(WorkingDir, "wampconf.json")
+    _WampSecretDefault = os.path.join(WorkingDir, "wamp.secret")
+
+    # set config file path only if not already set
+    if _WampConf is None:
+        # default project's wampconf has precedance over commandline given
+        if os.path.exists(_WampConfDefault) or wampconf is None:
+            _WampConf = _WampConfDefault
+        else:
+            _WampConf = wampconf
+
+    WampClientConf = GetConfiguration()
+
+    # set secret file path only if not already set
+    if _WampSecret is None:
+        # default project's wamp secret also
+        # has precedance over commandline given
+        if os.path.exists(_WampSecretDefault):
+            _WampSecret = _WampSecretDefault
+        else:
+            _WampSecret = wampsecret
+
+    if _WampSecret is not None:
+        WampClientConf["secret"] = LoadWampSecret(_WampSecret)
+    else:
+        print(_("WAMP authentication has no secret configured"))
+        _WampSecret = _WampSecretDefault
+
+    if not WampClientConf["active"]:
+        print(_("WAMP deactivated in configuration"))
+        return
 
     # create a WAMP application session factory
     component_config = types.ComponentConfig(
-        realm = WSClientConf["realm"],
-        extra = {"ID":WSClientConf["ID"]})
+        realm=WampClientConf["realm"],
+        extra=WampClientConf)
     session_factory = wamp.ApplicationSessionFactory(
-        config = component_config)
+        config=component_config)
     session_factory.session = WampSession
 
     # create a WAMP-over-WebSocket transport client factory
-    transport_factory = ReconnectingWampWebSocketClientFactory(
+    ReconnectingWampWebSocketClientFactory(
+        component_config,
         session_factory,
-        url = WSClientConf["url"],
-        serializers = [MsgPackSerializer()],
-        debug = False,
-        debug_wamp = False)
+        url=WampClientConf["url"],
+        serializers=[MsgPackSerializer()])
 
     # start the client from a Twisted endpoint
-    conn = connectWS(transport_factory)
-    print "WAMP client connecting to :",WSClientConf["url"]
-    return conn
+    if _transportFactory:
+        connectWS(_transportFactory)
+        print(_("WAMP client connecting to :"), WampClientConf["url"])
+        return True
+    else:
+        print(_("WAMP client can not connect to :"), WampClientConf["url"])
+        return False
+
+
+def StopReconnectWampClient():
+    if _transportFactory is not None:
+        _transportFactory.stopTrying()
+    if _WampSession is not None:
+        _WampSession.leave()
+
+
+def StartReconnectWampClient():
+    if _WampSession:
+        # do reconnect
+        _WampSession.disconnect()
+        return True
+    else:
+        # do connect
+        RegisterWampClient()
+        return True
+
 
 def GetSession():
-    global _WampSession
     return _WampSession
 
+
+def getWampStatus():
+    if _transportFactory is not None:
+        if _WampSession is not None:
+            if _WampSession.is_attached():
+                return "Attached"
+            return "Established"
+        return "Connecting"
+    return "Disconnected"
+
+
 def SetServer(pysrv):
     global _PySrv
     _PySrv = pysrv
 
+
+def PublishEvent(eventID, value):
+    if getWampStatus() == "Attached":
+        _WampSession.publish(unicode(eventID), value)
+
+
+def PublishEventWithOwnID(eventID, value):
+    if getWampStatus() == "Attached":
+        _WampSession.publishWithOwnID(unicode(eventID), value)
+
+
+# WEB CONFIGURATION INTERFACE
+WAMP_SECRET_URL = "secret"
+webExposedConfigItems = ['active', 'url', 'ID']
+
+
+def wampConfigDefault(ctx, argument):
+    if lastKnownConfig is not None:
+        return lastKnownConfig.get(argument.name, None)
+
+
+def wampConfig(**kwargs):
+    secretfile_field = kwargs["secretfile"]
+    if secretfile_field is not None:
+        secretfile = getattr(secretfile_field, "file", None)
+        if secretfile is not None:
+            secret = secretfile_field.file.read()
+            SetWampSecret(secret)
+
+    newConfig = lastKnownConfig.copy()
+    for argname in webExposedConfigItems:
+        arg = kwargs.get(argname, None)
+        if arg is not None:
+            newConfig[argname] = arg
+
+    SetConfiguration(newConfig)
+
+
+class FileUploadDownload(annotate.FileUpload):
+    pass
+
+
+class FileUploadDownloadRenderer(webform.FileUploadRenderer):
+
+    def input(self, context, slot, data, name, value):
+        # pylint: disable=expression-not-assigned
+        slot[_("Upload:")]
+        slot = webform.FileUploadRenderer.input(
+            self, context, slot, data, name, value)
+        download_url = data.typedValue.getAttribute('download_url')
+        return slot[tags.a(href=download_url)[_("Download")]]
+
+
+registerAdapter(FileUploadDownloadRenderer, FileUploadDownload,
+                formless.iformless.ITypedRenderer)
+
+
+def getDownloadUrl(ctx, argument):
+    if lastKnownConfig is not None:
+        return url.URL.fromContext(ctx).\
+            child(WAMP_SECRET_URL).\
+            child(lastKnownConfig["ID"] + ".secret")
+
+
+webFormInterface = [
+    ("status",
+     annotate.String(label=_("Current status"),
+                     immutable=True,
+                     default=lambda *k:getWampStatus())),
+    ("ID",
+     annotate.String(label=_("ID"),
+                     default=wampConfigDefault)),
+    ("secretfile",
+     FileUploadDownload(label=_("File containing secret for that ID"),
+                        download_url=getDownloadUrl)),
+    ("active",
+     annotate.Boolean(label=_("Enable WAMP connection"),
+                      default=wampConfigDefault)),
+    ("url",
+     annotate.String(label=_("WAMP Server URL"),
+                     default=wampConfigDefault))]
+
+
+def deliverWampSecret(ctx, segments):
+    # filename = segments[1].decode('utf-8')
+
+    # FIXME: compare filename to ID+".secret"
+    # for now all url under /secret returns the secret
+
+    # TODO: make beautifull message in case of exception
+    # while loading secret (if empty or dont exist)
+    secret = LoadWampSecret(_WampSecret)
+    return static.Data(secret, 'application/octet-stream'), ()
+
+
+def RegisterWebSettings(NS):
+
+    NS.ConfigurableSettings.addSettings(
+        "wamp",
+        _("Wamp Settings"),
+        webFormInterface,
+        _("Set"),
+        wampConfig)
+
+    NS.customSettingsURLs[WAMP_SECRET_URL] = deliverWampSecret
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/Worker.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,121 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz runtime.
+#
+# Copyright (C) 2018: Edouard TISSERANT
+#
+# See COPYING.Runtime file for copyrights details.
+
+from __future__ import absolute_import
+import sys
+import six
+import thread
+from threading import Lock, Condition
+
+
+class job(object):
+    """
+    job to be executed by a worker
+    """
+    def __init__(self, call, *args, **kwargs):
+        self.job = (call, args, kwargs)
+        self.result = None
+        self.success = False
+        self.exc_info = None
+
+    def do(self):
+        """
+        do the job by executing the call, and deal with exceptions
+        """
+        try:
+            call, args, kwargs = self.job
+            self.result = call(*args, **kwargs)
+            self.success = True
+        except Exception:
+            self.success = False
+            self.exc_info = sys.exc_info()
+
+
+class worker(object):
+    """
+    serialize main thread load/unload of PLC shared objects
+    """
+    def __init__(self):
+        # Only one job at a time
+        self._finish = False
+        self._threadID = None
+        self.mutex = Lock()
+        self.todo = Condition(self.mutex)
+        self.done = Condition(self.mutex)
+        self.free = Condition(self.mutex)
+        self.job = None
+
+    def runloop(self, *args, **kwargs):
+        """
+        meant to be called by worker thread (blocking)
+        """
+        self._threadID = thread.get_ident()
+        self.mutex.acquire()
+        if args or kwargs:
+            _job = job(*args, **kwargs)
+            _job.do()
+            if _job.success:
+                # result is ignored
+                pass
+            else:
+                raise _job.exc_info[0], _job.exc_info[1], _job.exc_info[2]
+        while not self._finish:
+            self.todo.wait()
+            if self.job is not None:
+                self.job.do()
+                self.done.notify()
+            else:
+                self.free.notify()
+        self.mutex.release()
+
+    def call(self, *args, **kwargs):
+        """
+        creates a job, execute it in worker thread, and deliver result.
+        if job execution raise exception, re-raise same exception
+        meant to be called by non-worker threads, but this is accepted.
+        blocking until job done
+        """
+
+        _job = job(*args, **kwargs)
+
+        if self._threadID == thread.get_ident():
+            # if caller is worker thread execute immediately
+            _job.do()
+        else:
+            # otherwise notify and wait for completion
+            self.mutex.acquire()
+
+            while self.job is not None:
+                self.free.wait()
+
+            self.job = _job
+            self.todo.notify()
+            self.done.wait()
+            _job = self.job
+            self.job = None
+            self.mutex.release()
+
+        if _job.success:
+            return _job.result
+        else:
+            exc_type = _job.exc_info[0]
+            exc_value = _job.exc_info[1]
+            exc_traceback = _job.exc_info[2]
+            six.reraise(exc_type, exc_value, exc_traceback)
+
+    def quit(self):
+        """
+        unblocks main thread, and terminate execution of runloop()
+        """
+        # mark queue
+        self._finish = True
+        self.mutex.acquire()
+        self.job = None
+        self.todo.notify()
+        self.mutex.release()
--- a/runtime/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/runtime/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,30 +1,32 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-#
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-#
-# See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+from __future__ import absolute_import
+from __future__ import print_function
+import traceback
+import sys
 
-# module which import C files as strings
+from runtime.Worker import worker
+MainWorker = worker()
 
-import os
+_PLCObjectSingleton = None
 
-from PLCObject import PLCObject, PLCprint
-import ServicePublisher
+
+def GetPLCObjectSingleton():
+    assert _PLCObjectSingleton is not None
+    return _PLCObjectSingleton
+
+
+def LogMessageAndException(msg, exp=None):
+    if exp is None:
+        exp = sys.exc_info()
+    if _PLCObjectSingleton is not None:
+        _PLCObjectSingleton.LogMessage(0, msg + '\n'.join(traceback.format_exception(*exp)))
+    print(msg)
+    traceback.print_exception(*exp)
+
+
+def CreatePLCObjectSingleton(*args, **kwargs):
+    global _PLCObjectSingleton
+    from runtime.PLCObject import PLCObject  # noqa # pylint: disable=wrong-import-position
+    _PLCObjectSingleton = PLCObject(*args, **kwargs)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/loglevels.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,9 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# See COPYING.Runtime file for copyrights details.
+
+LogLevels = ["CRITICAL", "WARNING", "INFO", "DEBUG"]
+LogLevelsCount = len(LogLevels)
+LogLevelsDict = dict(zip(LogLevels, range(LogLevelsCount)))
+LogLevelsDefault = LogLevelsDict["DEBUG"]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/spawn_subprocess.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,132 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# subset of subprocess built-in module using posix_spawn rather than fork.
+
+import posix_spawn
+import os
+import signal
+
+PIPE = "42"
+
+class Popen(object):
+    def __init__(self, args,stdin=None, stdout=None):
+        self.returncode = None
+        self.stdout = None
+        self.stdin = None
+        # TODO: stderr
+        file_actions = posix_spawn.FileActions()
+        if stdout is not None:
+            # child's stdout, child 2 parent pipe
+            c2pread, c2pwrite = os.pipe()
+            # attach child's stdout to writing en of c2p pipe
+            file_actions.add_dup2(c2pwrite, 1)
+            # close other end
+            file_actions.add_close(c2pread)
+        if stdin is not None:
+            # child's stdin, parent to child pipe
+            p2cread, p2cwrite = os.pipe()
+            # attach child's stdin to reading en of p2c pipe
+            file_actions.add_dup2(p2cread, 0)
+            # close other end
+            file_actions.add_close(p2cwrite)
+        self.pid = posix_spawn.posix_spawnp(args[0], args, file_actions=file_actions)
+        if stdout is not None:
+            self.stdout = os.fdopen(c2pread)
+            os.close(c2pwrite)
+        if stdin is not None:
+            self.stdin = os.fdopen(p2cwrite, 'w')
+            os.close(p2cread)
+
+    def _wait(self):
+        if self.returncode is None:
+            self.returncode = os.waitpid(self.pid,0)[1]
+
+    def communicate(self):
+        if self.stdin is not None:
+            self.stdin.close()
+            self.stdin = None
+        if self.stdout is not None:
+            stdoutdata = self.stdout.read()
+        else:
+            stdoutdata = ""
+        
+        # TODO
+        stderrdata = ""
+
+        self._wait()
+        if self.stdout is not None:
+            self.stdout.close()
+            self.stdout = None
+        
+        return (stdoutdata, stderrdata)
+
+    def wait(self):
+        if self.stdin is not None:
+            self.stdin.close()
+            self.stdin = None
+        self._wait()
+        if self.stdout is not None:
+            self.stdout.close()
+            self.stdout = None
+        return self.returncode
+
+    def poll(self):
+        if self.returncode is None:
+            pid, ret = os.waitpid(self.pid, os.WNOHANG)
+            if (pid,ret) != (0,0):
+                self.returncode = ret
+
+                if self.stdin is not None:
+                    self.stdin.close()
+                    self.stdin = None
+                if self.stdout is not None:
+                    self.stdout.close()
+                    self.stdout = None
+
+        return self.returncode
+        
+    def kill(self):
+        os.kill(self.pid, signal.SIGKILL)
+
+        if self.stdin is not None:
+            self.stdin.close()
+            self.stdin = None
+        if self.stdout is not None:
+            self.stdout.close()
+            self.stdout = None
+
+        
+
+def call(*args):
+    cmd = []
+    if isinstance(args[0], str):
+        if len(args)==1:
+            # oversimplified splitting of arguments,
+            # TODO: care about use of simple and double quotes
+            cmd = args[0].split()
+        else:
+            cmd = args
+    elif isinstance(args[0], list) and len(args)==1:
+        cmd = args[0]
+    else:
+        raise Exception("Wrong arguments passed to subprocess.call")
+    pid = posix_spawn.posix_spawnp(cmd[0], cmd)
+    return os.waitpid(pid,0)
+
+if __name__ == '__main__':
+    # unit test
+
+    p = Popen(["tr", "abc", "def"], stdin=PIPE, stdout=PIPE)
+    p.stdin.write("blah")
+    p.stdin.close()
+    print p.stdout.read()
+    p.wait()
+
+    p = Popen(["tr", "abc", "def"], stdin=PIPE, stdout=PIPE)
+    p.stdin.write("blah")
+    print p.communicate()
+
+    call("echo blah0")
+    call(["echo", "blah1"])
+    call("echo", "blah2")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/typemapping.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,98 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# See COPYING.Runtime file for copyrights details.
+#
+
+from __future__ import absolute_import
+import ctypes
+from ctypes import *
+from datetime import timedelta as td
+
+ctypes.pythonapi.PyString_AsString.argtypes = (ctypes.c_void_p,)
+ctypes.pythonapi.PyString_AsString.restype = ctypes.POINTER(ctypes.c_char)
+
+
+class IEC_STRING(Structure):
+    """
+    Must be changed according to changes in iec_types.h
+    """
+    _fields_ = [("len", c_uint8),
+                ("body", c_char * 126)]
+
+
+class IEC_TIME(Structure):
+    """
+    Must be changed according to changes in iec_types.h
+    """
+    _fields_ = [("s", c_long),   # tv_sec
+                ("ns", c_long)]  # tv_nsec
+
+
+def _t(t, u=lambda x: x.value, p=lambda t, x: t(x)):
+    return (t, u, p)
+
+
+def _ttime():
+    return (IEC_TIME,
+            lambda x: td(0, x.s, x.ns/1000.0),
+            lambda t, x: t(x.days * 24 * 3600 + x.seconds, x.microseconds*1000))
+
+
+SameEndianessTypeTranslator = {
+    "BOOL":       _t(c_uint8, lambda x: x.value != 0),
+    "STEP":       _t(c_uint8),
+    "TRANSITION": _t(c_uint8),
+    "ACTION":     _t(c_uint8),
+    "SINT":       _t(c_int8),
+    "USINT":      _t(c_uint8),
+    "BYTE":       _t(c_uint8),
+    "STRING":     (IEC_STRING,
+                   lambda x: x.body[:x.len],
+                   lambda t, x: t(len(x), x)),
+    "INT":        _t(c_int16),
+    "UINT":       _t(c_uint16),
+    "WORD":       _t(c_uint16),
+    "DINT":       _t(c_int32),
+    "UDINT":      _t(c_uint32),
+    "DWORD":      _t(c_uint32),
+    "LINT":       _t(c_int64),
+    "ULINT":      _t(c_uint64),
+    "LWORD":      _t(c_uint64),
+    "REAL":       _t(c_float),
+    "LREAL":      _t(c_double),
+    "TIME":       _ttime(),
+    "TOD":        _ttime(),
+    "DATE":       _ttime(),
+    "DT":         _ttime(),
+    }
+
+SwapedEndianessTypeTranslator = {
+    # TODO
+    }
+
+TypeTranslator = SameEndianessTypeTranslator
+
+# Construct debugger natively supported types
+DebugTypesSize = dict([(key, sizeof(t)) for key, (t, p, u) in SameEndianessTypeTranslator.iteritems() if t is not None])
+
+
+def UnpackDebugBuffer(buff, indexes):
+    res = []
+    buffoffset = 0
+    buffsize = len(buff)
+    buffptr = cast(ctypes.pythonapi.PyString_AsString(id(buff)), c_void_p).value
+    for iectype in indexes:
+        c_type, unpack_func, _pack_func = \
+            TypeTranslator.get(iectype, (None, None, None))
+        if c_type is not None and buffoffset < buffsize:
+            cursor = c_void_p(buffptr + buffoffset)
+            value = unpack_func(cast(cursor,
+                                     POINTER(c_type)).contents)
+            buffoffset += sizeof(c_type) if iectype != "STRING" else len(value)+1
+            res.append(value)
+        else:
+            break
+    if buffoffset and buffoffset == buffsize:
+        return res
+    return None
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/webinterface.css	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,6 @@
+
+.freeform-label {
+    float: left;
+    width: 30%;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/xenomai.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# See COPYING.Runtime file for copyrights details.
+#
+
+from __future__ import absolute_import
+from ctypes import CDLL, RTLD_GLOBAL, pointer, c_int, POINTER, c_char, create_string_buffer
+
+
+def TryPreloadXenomai():
+    """
+    Xenomai 3 (at least for version <= 3.0.6) do not handle properly dlclose
+    of shared objects whose dlopen did trigger xenomai_init.
+    As a workaround, this pre-loads xenomai libraries that need to be
+    initialized and call xenomai_init once for all.
+
+    Xenomai auto init of libs MUST be disabled (see --auto-init-solib in xeno-config)
+    """
+    try:
+        for name in ["cobalt", "modechk", "copperplate", "alchemy"]:
+            globals()[name] = CDLL("lib"+name+".so", mode=RTLD_GLOBAL)
+        cobalt.xenomai_init(pointer(c_int(0)), pointer((POINTER(c_char)*2)(create_string_buffer("prog_name"), None)))
+    except Exception:
+        pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime_files.list	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,19 @@
+# those files are used in runtime
+# licensed according to LGPL, see COPYING.runtime 
+
+images/icostop24.png
+images/icoplay24.png
+images/brz.png
+util/__init__.py
+util/paths.py
+runtime/WampClient.py
+runtime/PLCObject.py
+runtime/NevowServer.py
+runtime/webinterface.js
+runtime/webinterface.css
+runtime/__init__.py
+runtime/ServicePublisher.py
+runtime/typemapping.py 
+runtime/loglevels.py 
+Beremiz_service.py
+version.py
\ No newline at end of file
--- a/svgui/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/svgui/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,4 +22,5 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-from svgui import *
+from __future__ import absolute_import
+from svgui.svgui import *
--- a/svgui/pyjs/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/svgui/pyjs/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,2 +1,2 @@
-from pyjs import *
-
+from __future__ import absolute_import
+from svgui.pyjs.pyjs import *
--- a/svgui/pyjs/build.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/svgui/pyjs/build.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,19 +1,19 @@
 #!/usr/bin/env python
 
+
+from __future__ import absolute_import
+from __future__ import print_function
 import sys
+import shutil
+import re
 import os
-import shutil
-from copy import copy
-from os.path import join, dirname, basename, abspath, split, isfile, isdir
+from os.path import join, basename, abspath, split, isfile, isdir
+from hashlib import md5
 from optparse import OptionParser
-import pyjs
-from cStringIO import StringIO
-try:
-    # Python 2.5 and above
-    from hashlib import md5
-except:
-    import md5
-import re
+from six.moves import cStringIO
+
+from svgui.pyjs import pyjs
+
 
 usage = """
   usage: %prog [options] <application module name or path>
@@ -45,7 +45,7 @@
 
 
 # .cache.html files produces look like this
-CACHE_HTML_PAT=re.compile('^[a-z]*.[0-9a-f]{32}\.cache\.html$')
+CACHE_HTML_PAT = re.compile(r'^[a-z]*.[0-9a-f]{32}\.cache\.html$')
 
 # ok these are the three "default" library directories, containing
 # the builtins (str, List, Dict, ord, round, len, range etc.)
@@ -63,6 +63,7 @@
 def read_boilerplate(data_dir, filename):
     return open(join(data_dir, "builder/boilerplate", filename)).read()
 
+
 def copy_boilerplate(data_dir, filename, output_dir):
     filename = join(data_dir, "builder/boilerplate", filename)
     shutil.copy(filename, output_dir)
@@ -76,7 +77,7 @@
     names = os.listdir(src)
     try:
         os.mkdir(dst)
-    except:
+    except Exception:
         pass
 
     errors = []
@@ -98,10 +99,11 @@
                 copytree_exists(srcname, dstname, symlinks)
             else:
                 shutil.copy2(srcname, dstname)
-        except (IOError, os.error), why:
+        except (IOError, os.error) as why:
             errors.append((srcname, dstname, why))
     if errors:
-        print errors
+        print(errors)
+
 
 def check_html_file(source_file, dest_path):
     """ Checks if a base HTML-file is available in the PyJamas
@@ -136,19 +138,17 @@
 </html>
 """
 
-    filename = os.path.split    ( source_file )[1]
-    mod_name = os.path.splitext ( filename    )[0]
-    file_name = os.path.join     ( dest_path, mod_name + '.html' )
+    filename = os.path.split(source_file)[1]
+    mod_name = os.path.splitext(filename)[0]
+    file_name = os.path.join(dest_path, mod_name + '.html')
 
     # if html file in output directory exists, leave it alone.
-    if os.path.exists ( file_name ):
+    if os.path.exists(file_name):
         return 0
 
-    if os.path.exists (
-        os.path.join ( dest_path, mod_name + '.css' ) ) :
+    if os.path.exists(os.path.join(dest_path, mod_name + '.css')):
         css = "<link rel='stylesheet' href='" + mod_name + ".css'>"
-    elif os.path.exists (
-        os.path.join ( dest_path, 'pyjamas_default.css' ) ) :
+    elif os.path.exists(os.path.join(dest_path, 'pyjamas_default.css')):
         css = "<link rel='stylesheet' href='pyjamas_default.css'>"
 
     else:
@@ -158,9 +158,9 @@
 
     base_html = base_html % {'modulename': mod_name, 'title': title, 'css': css}
 
-    fh = open (file_name, 'w')
-    fh.write  (base_html)
-    fh.close  ()
+    fh = open(file_name, 'w')
+    fh.write(base_html)
+    fh.close()
 
     return 1
 
@@ -174,27 +174,27 @@
     msg = "Building '%(app_name)s' to output directory '%(output)s'" % locals()
     if debug:
         msg += " with debugging statements"
-    print msg
+    print(msg)
 
     # check the output directory
     if os.path.exists(output) and not os.path.isdir(output):
-        print >>sys.stderr, "Output destination %s exists and is not a directory" % output
+        print("Output destination %s exists and is not a directory" % output, file=sys.stderr)
         return
     if not os.path.isdir(output):
         try:
-            print "Creating output directory"
+            print("Creating output directory")
             os.mkdir(output)
-        except StandardError, e:
-            print >>sys.stderr, "Exception creating output directory %s: %s" % (output, e)
-
-    ## public dir
+        except OSError as e:
+            print("Exception creating output directory %s: %s" % (output, e), file=sys.stderr)
+
+    # public dir
     for p in pyjs.path:
         pub_dir = join(p, 'public')
         if isdir(pub_dir):
-            print "Copying: public directory of library %r" % p
+            print("Copying: public directory of library %r" % p)
             copytree_exists(pub_dir, output)
 
-    ## AppName.html - can be in current or public directory
+    # AppName.html - can be in current or public directory
     html_input_filename = app_name + ".html"
     html_output_filename = join(output, basename(html_input_filename))
     if os.path.isfile(html_input_filename):
@@ -203,28 +203,28 @@
                os.path.getmtime(html_output_filename):
             try:
                 shutil.copy(html_input_filename, html_output_filename)
-            except:
-                print >>sys.stderr, "Warning: Missing module HTML file %s" % html_input_filename
-
-            print "Copying: %(html_input_filename)s" % locals()
+            except Exception:
+                print("Warning: Missing module HTML file %s" % html_input_filename, file=sys.stderr)
+
+            print("Copying: %(html_input_filename)s" % locals())
 
     if check_html_file(html_input_filename, output):
-        print >>sys.stderr, "Warning: Module HTML file %s has been auto-generated" % html_input_filename
-
-    ## pygwt.js
-
-    print "Copying: pygwt.js"
+        print("Warning: Module HTML file %s has been auto-generated" % html_input_filename, file=sys.stderr)
+
+    # pygwt.js
+
+    print("Copying: pygwt.js")
 
     pygwt_js_template = read_boilerplate(data_dir, "pygwt.js")
     pygwt_js_output = open(join(output, "pygwt.js"), "w")
 
-    print >>pygwt_js_output, pygwt_js_template
+    print(pygwt_js_template, file=pygwt_js_output)
 
     pygwt_js_output.close()
 
-    ## Images
-
-    print "Copying: Images and History"
+    # Images
+
+    print("Copying: Images and History")
     copy_boilerplate(data_dir, "corner_dialog_topleft_black.png", output)
     copy_boilerplate(data_dir, "corner_dialog_topright_black.png", output)
     copy_boilerplate(data_dir, "corner_dialog_bottomright_black.png", output)
@@ -240,14 +240,13 @@
     copy_boilerplate(data_dir, "tree_white.gif", output)
     copy_boilerplate(data_dir, "history.html", output)
 
-
-    ## all.cache.html
+    # all.cache.html
     app_files = generateAppFiles(data_dir, js_includes, app_name, debug,
                                  output, dynamic, cache_buster, optimize)
 
-    ## AppName.nocache.html
-
-    print "Creating: %(app_name)s.nocache.html" % locals()
+    # AppName.nocache.html
+
+    print("Creating: %(app_name)s.nocache.html" % locals())
 
     home_nocache_html_template = read_boilerplate(data_dir, "home.nocache.html")
     home_nocache_html_output = open(join(output, app_name + ".nocache.html"),
@@ -255,19 +254,20 @@
 
     # the selector templ is added to the selectScript function
     select_tmpl = """O(["true","%s"],"%s");"""
-    script_selectors = StringIO()
+    script_selectors = cStringIO()
 
     for platform, file_prefix in app_files:
-        print >> script_selectors, select_tmpl % (platform, file_prefix)
-
-    print >>home_nocache_html_output, home_nocache_html_template % dict(
-        app_name = app_name,
-        script_selectors = script_selectors.getvalue(),
-    )
+        print(select_tmpl % (platform, file_prefix), file=script_selectors)
+
+    print(
+        home_nocache_html_template % dict(
+            app_name=app_name,
+            script_selectors=script_selectors.getvalue(),
+        ), file=home_nocache_html_output)
 
     home_nocache_html_output.close()
 
-    print "Done. You can run your app by opening '%(html_output_filename)s' in a browser" % locals()
+    print("Done. You can run your app by opening '%(html_output_filename)s' in a browser" % locals())
 
 
 def generateAppFiles(data_dir, js_includes, app_name, debug, output, dynamic,
@@ -280,15 +280,14 @@
     for name in os.listdir(output):
         if CACHE_HTML_PAT.match(name):
             p = join(output, name)
-            print "Deleting existing app file %s" % p
+            print("Deleting existing app file %s" % p)
             os.unlink(p)
 
     app_files = []
-    tmpl = read_boilerplate(data_dir, "all.cache.html")
     parser = pyjs.PlatformParser("platform")
     app_headers = ''
-    scripts = ['<script type="text/javascript" src="%s"></script>'%script \
-                                                  for script in js_includes]
+    scripts = ['<script type="text/javascript" src="%s"></script>' %
+               script for script in js_includes]
     app_body = '\n'.join(scripts)
 
     mod_code = {}
@@ -306,7 +305,7 @@
     # Second, (dynamic only), post-analyse the places where modules
     # haven't changed
     # Third, write everything out.
-    
+
     for platform in app_platforms:
 
         mod_code[platform] = {}
@@ -324,24 +323,24 @@
         app_translator = pyjs.AppTranslator(
             parser=parser, dynamic=dynamic, optimize=optimize)
         early_app_libs[platform], appcode = \
-                     app_translator.translate(None, is_app=False,
-                                              debug=debug,
-                                      library_modules=['dynamicajax.js',
-                                                    '_pyjs.js', 'sys',
-                                                     'pyjslib'])
+            app_translator.translate(None, is_app=False,
+                                     debug=debug,
+                                     library_modules=['dynamicajax.js',
+                                                      '_pyjs.js', 'sys',
+                                                      'pyjslib'])
         pover[platform].update(app_translator.overrides.items())
         for mname, name in app_translator.overrides.items():
             pd = overrides.setdefault(mname, {})
             pd[platform] = name
 
-        print appcode
-        #mod_code[platform][app_name] = appcode
-
-        # platform.Module.cache.js 
+        print(appcode)
+        # mod_code[platform][app_name] = appcode
+
+        # platform.Module.cache.js
 
         modules_done = ['pyjslib', 'sys', '_pyjs.js']
-        #modules_to_do = [app_name] + app_translator.library_modules
-        modules_to_do = [app_name] + app_translator.library_modules 
+        # modules_to_do = [app_name] + app_translator.library_modules
+        modules_to_do = [app_name] + app_translator.library_modules
 
         dependencies = {}
 
@@ -350,13 +349,13 @@
             sublist = add_subdeps(dependencies, d)
             modules_to_do += sublist
         deps = uniquify(deps)
-        #dependencies[app_name] = deps
+        # dependencies[app_name] = deps
 
         modules[platform] = modules_done + modules_to_do
 
         while modules_to_do:
 
-            #print "modules to do", modules_to_do
+            # print "modules to do", modules_to_do
 
             mn = modules_to_do.pop()
             mod_name = pyjs.strip_py(mn)
@@ -371,9 +370,9 @@
             parser.setPlatform(platform)
             mod_translator = pyjs.AppTranslator(parser=parser, optimize=optimize)
             mod_libs[platform][mod_name], mod_code[platform][mod_name] = \
-                              mod_translator.translate(mod_name,
-                                                  is_app=False,
-                                                  debug=debug)
+                mod_translator.translate(mod_name,
+                                         is_app=False,
+                                         debug=debug)
             pover[platform].update(mod_translator.overrides.items())
             for mname, name in mod_translator.overrides.items():
                 pd = overrides.setdefault(mname, {})
@@ -390,22 +389,22 @@
             while mod_name in deps:
                 deps.remove(mod_name)
 
-            #print
-            #print
-            #print "modname preadd:", mod_name, deps
-            #print
-            #print
+            # print
+            # print
+            # print "modname preadd:", mod_name, deps
+            # print
+            # print
             for d in deps:
                 sublist = add_subdeps(dependencies, d)
                 modules_to_do += sublist
             modules_to_do += add_subdeps(dependencies, mod_name)
-            #print "modname:", mod_name, deps
+            # print "modname:", mod_name, deps
             deps = uniquify(deps)
-            #print "modname:", mod_name, deps
+            # print "modname:", mod_name, deps
             dependencies[mod_name] = deps
-            
+
         # work out the dependency ordering of the modules
-    
+
         mod_levels[platform] = make_deps(None, dependencies, modules_done)
 
     # now write everything out
@@ -415,7 +414,7 @@
         early_app_libs_ = early_app_libs[platform]
         app_libs_ = app_libs[platform]
         app_code_ = app_code[platform]
-        #modules_ = filter_mods(app_name, modules[platform])
+        # modules_ = filter_mods(app_name, modules[platform])
         mods = flattenlist(mod_levels[platform])
         mods.reverse()
         modules_ = filter_mods(None, mods)
@@ -427,12 +426,12 @@
             mod_name = pyjs.strip_py(mod_name)
 
             override_name = "%s.%s" % (platform.lower(), mod_name)
-            if pover[platform].has_key(override_name):
+            if override_name in pover[platform]:
                 mod_cache_name = "%s.cache.js" % (override_name)
             else:
                 mod_cache_name = "%s.cache.js" % (mod_name)
 
-            print "Creating: " + mod_cache_name
+            print("Creating: " + mod_cache_name)
 
             modlevels = make_deps(None, dependencies, dependencies[mod_name])
 
@@ -454,17 +453,17 @@
             if dynamic:
                 mod_cache_html_output = open(join(output, mod_cache_name), "w")
             else:
-                mod_cache_html_output = StringIO()
-
-            print >>mod_cache_html_output, mod_cache_html_template % dict(
-                mod_name = mod_name,
-                app_name = app_name,
-                modnames = modnames,
-                overrides = overnames,
-                mod_libs = mod_libs[platform][mod_name],
-                dynamic = dynamic,
-                mod_code = mod_code_,
-            )
+                mod_cache_html_output = cStringIO()
+
+            print(mod_cache_html_template % dict(
+                mod_name=mod_name,
+                app_name=app_name,
+                modnames=modnames,
+                overrides=overnames,
+                mod_libs=mod_libs[platform][mod_name],
+                dynamic=dynamic,
+                mod_code=mod_code_,
+            ), file=mod_cache_html_output)
 
             if dynamic:
                 mod_cache_html_output.close()
@@ -473,7 +472,7 @@
                 app_libs_ += mod_cache_html_output.read()
 
         # write out the dependency ordering of the modules
-    
+
         app_modnames = []
 
         for md in mod_levels[platform]:
@@ -489,83 +488,90 @@
         overnames = map(lambda x: "'%s': '%s'" % x, pover[platform].items())
         overnames = "new pyjslib.Dict({\n\t\t%s\n\t})" % ',\n\t\t'.join(overnames)
 
-        #print "platform names", platform, overnames
-        #print pover
+        # print "platform names", platform, overnames
+        # print pover
 
         # now write app.allcache including dependency-ordered list of
         # library modules
 
         file_contents = all_cache_html_template % dict(
-            app_name = app_name,
-            early_app_libs = early_app_libs_,
-            app_libs = app_libs_,
-            app_code = app_code_,
-            app_body = app_body,
-            overrides = overnames,
-            platform = platform.lower(),
-            dynamic = dynamic,
-            app_modnames = app_modnames,
-            app_headers = app_headers
+            app_name=app_name,
+            early_app_libs=early_app_libs_,
+            app_libs=app_libs_,
+            app_code=app_code_,
+            app_body=app_body,
+            overrides=overnames,
+            platform=platform.lower(),
+            dynamic=dynamic,
+            app_modnames=app_modnames,
+            app_headers=app_headers
         )
         if cache_buster:
             digest = md5.new(file_contents).hexdigest()
             file_name = "%s.%s.%s" % (platform.lower(), app_name, digest)
         else:
             file_name = "%s.%s" % (platform.lower(), app_name)
-        file_name += ".cache.html" 
+        file_name += ".cache.html"
         out_path = join(output, file_name)
         out_file = open(out_path, 'w')
         out_file.write(file_contents)
         out_file.close()
         app_files.append((platform.lower(), file_name))
-        print "Created app file %s:%s: %s" % (
-            app_name, platform, out_path)
+        print("Created app file %s:%s: %s" % (
+            app_name, platform, out_path))
 
     return app_files
 
+
 def flattenlist(ll):
     res = []
     for l in ll:
         res += l
     return res
 
-# creates sub-dependencies e.g. pyjamas.ui.Widget
-# creates pyjamas.ui.Widget, pyjamas.ui and pyjamas.
+
 def subdeps(m):
+    """
+    creates sub-dependencies e.g. pyjamas.ui.Widget
+    creates pyjamas.ui.Widget, pyjamas.ui and pyjamas.
+    """
     d = []
     m = m.split(".")
     for i in range(0, len(m)):
         d.append('.'.join(m[:i+1]))
     return d
 
-import time
 
 def add_subdeps(deps, mod_name):
     sd = subdeps(mod_name)
     if len(sd) == 1:
         return []
-    #print "subdeps", mod_name, sd
-    #print "deps", deps
+    # print "subdeps", mod_name, sd
+    # print "deps", deps
     res = []
     for i in range(0, len(sd)-1):
         parent = sd[i]
         child = sd[i+1]
-        l = deps.get(child, [])
-        l.append(parent)
-        deps[child] = l
+        k = deps.get(child, [])
+        k.append(parent)
+        deps[child] = k
         if parent not in res:
             res.append(parent)
-    #print deps
+    # print deps
     return res
 
-# makes unique and preserves list order
+
 def uniquify(md):
+    """
+    makes unique and preserves list order
+    """
     res = []
     for m in md:
         if m not in res:
             res.append(m)
     return res
 
+
 def filter_mods(app_name, md):
     while 'sys' in md:
         md.remove('sys')
@@ -578,6 +584,7 @@
 
     return uniquify(md)
 
+
 def filter_deps(app_name, deps):
 
     res = {}
@@ -588,18 +595,20 @@
         res[k] = mods
     return res
 
+
 def has_nodeps(mod, deps):
-    if not deps.has_key(mod) or not deps[mod]:
+    if mod not in deps or not deps[mod]:
         return True
     return False
 
+
 def nodeps_list(mod_list, deps):
     res = []
     for mod in mod_list:
         if has_nodeps(mod, deps):
             res.append(mod)
     return res
-        
+
 # this function takes a dictionary of dependent modules and
 # creates a list of lists.  the first list will be modules
 # that have no dependencies; the second list will be those
@@ -609,33 +618,33 @@
 
 
 def make_deps(app_name, deps, mod_list):
-    print "Calculating Dependencies ..."
+    print("Calculating Dependencies ...")
     mod_list = filter_mods(app_name, mod_list)
     deps = filter_deps(app_name, deps)
 
     if not mod_list:
         return []
 
-    #print mod_list
-    #print deps
+    # print mod_list
+    # print deps
 
     ordered_deps = []
     last_len = -1
     while deps:
         l_deps = len(deps)
-        #print l_deps
-        if l_deps==last_len:
+        # print l_deps
+        if l_deps == last_len:
             for m, dl in deps.items():
                 for d in dl:
                     if m in deps.get(d, []):
                         raise Exception('Circular Imports found: \n%s %s -> %s %s'
                                         % (m, dl, d, deps[d]))
-            #raise Exception('Could not calculate dependencies: \n%s' % deps)
+            # raise Exception('Could not calculate dependencies: \n%s' % deps)
             break
         last_len = l_deps
-        #print "modlist", mod_list
+        # print "modlist", mod_list
         nodeps = nodeps_list(mod_list, deps)
-        #print "nodeps", nodeps
+        # print "nodeps", nodeps
         mod_list = filter(lambda x: x not in nodeps, mod_list)
         newdeps = {}
         for k in deps.keys():
@@ -643,45 +652,86 @@
             depslist = filter(lambda x: x not in nodeps, depslist)
             if depslist:
                 newdeps[k] = depslist
-        #print "newdeps", newdeps
+        # print "newdeps", newdeps
         deps = newdeps
         ordered_deps.append(nodeps)
-        #time.sleep(0)
+        # time.sleep(0)
 
     if mod_list:
-        ordered_deps.append(mod_list) # last dependencies - usually the app(s)
+        ordered_deps.append(mod_list)  # last dependencies - usually the app(s)
 
     ordered_deps.reverse()
 
     return ordered_deps
 
+
 def main():
     global app_platforms
 
-    parser = OptionParser(usage = usage, version = version)
-    parser.add_option("-o", "--output", dest="output",
-        help="directory to which the webapp should be written")
-    parser.add_option("-j", "--include-js", dest="js_includes", action="append",
-        help="javascripts to load into the same frame as the rest of the script")
-    parser.add_option("-I", "--library_dir", dest="library_dirs",
-        action="append", help="additional paths appended to PYJSPATH")
-    parser.add_option("-D", "--data_dir", dest="data_dir",
-        help="path for data directory")
-    parser.add_option("-m", "--dynamic-modules", action="store_true",
-        dest="dynamic", default=False,
-        help="Split output into separate dynamically-loaded modules (experimental)")
-    parser.add_option("-P", "--platforms", dest="platforms",
-        help="platforms to build for, comma-separated")
-    parser.add_option("-d", "--debug", action="store_true", dest="debug")
-    parser.add_option("-O", "--optimize", action="store_true",
-                      dest="optimize", default=False,
-                      help="Optimize generated code (removes all print statements)",
-                      )
-    parser.add_option("-c", "--cache_buster", action="store_true",
-                  dest="cache_buster",
-        help="Enable browser cache-busting (MD5 hash added to output filenames)")
-
-    parser.set_defaults(output = "output", js_includes=[], library_dirs=[],
+    parser = OptionParser(usage=usage, version=version)
+    parser.add_option(
+        "-o",
+        "--output",
+        dest="output",
+        help="directory to which the webapp should be written"
+    )
+    parser.add_option(
+        "-j",
+        "--include-js",
+        dest="js_includes",
+        action="append",
+        help="javascripts to load into the same frame as the rest of the script"
+    )
+    parser.add_option(
+        "-I",
+        "--library_dir",
+        dest="library_dirs",
+        action="append",
+        help="additional paths appended to PYJSPATH"
+    )
+    parser.add_option(
+        "-D",
+        "--data_dir",
+        dest="data_dir",
+        help="path for data directory"
+    )
+    parser.add_option(
+        "-m",
+        "--dynamic-modules",
+        action="store_true",
+        dest="dynamic",
+        default=False,
+        help="Split output into separate dynamically-loaded modules (experimental)"
+    )
+    parser.add_option(
+        "-P",
+        "--platforms",
+        dest="platforms",
+        help="platforms to build for, comma-separated"
+    )
+    parser.add_option(
+        "-d",
+        "--debug",
+        action="store_true",
+        dest="debug"
+    )
+    parser.add_option(
+        "-O",
+        "--optimize",
+        action="store_true",
+        dest="optimize",
+        default=False,
+        help="Optimize generated code (removes all print statements)",
+    )
+    parser.add_option(
+        "-c",
+        "--cache_buster",
+        action="store_true",
+        dest="cache_buster",
+        help="Enable browser cache-busting (MD5 hash added to output filenames)"
+    )
+
+    parser.set_defaults(output="output", js_includes=[], library_dirs=[],
                         platforms=(','.join(app_platforms)),
                         data_dir=os.path.join(sys.prefix, "share/pyjamas"),
                         dynamic=False,
@@ -710,7 +760,7 @@
         pyjs.path.append(abspath(d))
 
     if options.platforms:
-       app_platforms = options.platforms.split(',')
+        app_platforms = options.platforms.split(',')
 
     # this is mostly for getting boilerplate stuff
     data_dir = os.path.abspath(options.data_dir)
@@ -719,6 +769,6 @@
           options.debug, options.dynamic and 1 or 0, data_dir,
           options.cache_buster, options.optimize)
 
+
 if __name__ == "__main__":
     main()
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svgui/pyjs/jsonrpc/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,1 @@
+# module jsonrpc
--- a/svgui/pyjs/jsonrpc/django/jsonrpc.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/svgui/pyjs/jsonrpc/django/jsonrpc.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,11 +1,15 @@
 # jsonrpc.py
 #   original code: http://trac.pyworks.org/pyjamas/wiki/DjangoWithPyJamas
 #   also from: http://www.pimentech.fr/technologies/outils
-from django.utils import simplejson
-from django.http import HttpResponse
-import sys
-
-from pyjs.jsonrpc import JSONRPCServiceBase
+
+from __future__ import absolute_import
+import datetime
+from builtins import str as text
+
+from django.core.serializers import serialize
+
+
+from svgui.pyjs.jsonrpc.jsonrpc import JSONRPCServiceBase
 # JSONRPCService and jsonremote are used in combination to drastically
 # simplify the provision of JSONRPC services.  use as follows:
 #
@@ -18,14 +22,16 @@
 # dump jsonservice into urlpatterns:
 #  (r'^service1/$', 'djangoapp.views.jsonservice'),
 
+
 class JSONRPCService(JSONRPCServiceBase):
-    
+
     def __call__(self, request, extra=None):
         return self.process(request.raw_post_data)
 
+
 def jsonremote(service):
     """Make JSONRPCService a decorator so that you can write :
-    
+
     from jsonrpc import JSONRPCService
     chatservice = JSONRPCService()
 
@@ -38,7 +44,7 @@
             service.add_method(func.__name__, func)
         else:
             emsg = 'Service "%s" not found' % str(service.__name__)
-            raise NotImplementedError, emsg
+            raise NotImplementedError(emsg)
         return func
     return remotify
 
@@ -62,7 +68,6 @@
 # part of the app:
 #  (r'^formsservice/$', 'djangoapp.views.processor'),
 
-from django import forms 
 
 def builderrors(form):
     d = {}
@@ -70,38 +75,40 @@
         if error not in d:
             d[error] = []
         for errorval in form.errors[error]:
-            d[error].append(unicode(errorval))
+            d[error].append(text(errorval))
     return d
 
 
 # contains the list of arguments in each field
 field_names = {
- 'CharField': ['max_length', 'min_length'],
- 'IntegerField': ['max_value', 'min_value'],
- 'FloatField': ['max_value', 'min_value'],
- 'DecimalField': ['max_value', 'min_value', 'max_digits', 'decimal_places'],
- 'DateField': ['input_formats'],
- 'DateTimeField': ['input_formats'],
- 'TimeField': ['input_formats'],
- 'RegexField': ['max_length', 'min_length'], # sadly we can't get the expr
- 'EmailField': ['max_length', 'min_length'],
- 'URLField': ['max_length', 'min_length', 'verify_exists', 'user_agent'],
- 'ChoiceField': ['choices'],
- 'FilePathField': ['path', 'match', 'recursive', 'choices'],
- 'IPAddressField': ['max_length', 'min_length'],
- }
+    'CharField': ['max_length', 'min_length'],
+    'IntegerField': ['max_value', 'min_value'],
+    'FloatField': ['max_value', 'min_value'],
+    'DecimalField': ['max_value', 'min_value', 'max_digits', 'decimal_places'],
+    'DateField': ['input_formats'],
+    'DateTimeField': ['input_formats'],
+    'TimeField': ['input_formats'],
+    'RegexField': ['max_length', 'min_length'],  # sadly we can't get the expr
+    'EmailField': ['max_length', 'min_length'],
+    'URLField': ['max_length', 'min_length', 'verify_exists', 'user_agent'],
+    'ChoiceField': ['choices'],
+    'FilePathField': ['path', 'match', 'recursive', 'choices'],
+    'IPAddressField': ['max_length', 'min_length'],
+}
+
 
 def describe_field_errors(field):
     res = {}
     field_type = field.__class__.__name__
     msgs = {}
     for n, m in field.error_messages.items():
-        msgs[n] = unicode(m)
+        msgs[n] = text(m)
     res['error_messages'] = msgs
     if field_type in ['ComboField', 'MultiValueField', 'SplitDateTimeField']:
         res['fields'] = map(describe_field, field.fields)
     return res
 
+
 def describe_fields_errors(fields, field_names):
     res = {}
     if not field_names:
@@ -111,16 +118,18 @@
         res[name] = describe_field_errors(field)
     return res
 
+
 def describe_field(field):
     res = {}
     field_type = field.__class__.__name__
-    for fname in field_names.get(field_type, []) + \
-          ['help_text', 'label', 'initial', 'required']:
+    for fname in (field_names.get(field_type, []) +
+                  ['help_text', 'label', 'initial', 'required']):
         res[fname] = getattr(field, fname)
     if field_type in ['ComboField', 'MultiValueField', 'SplitDateTimeField']:
         res['fields'] = map(describe_field, field.fields)
     return res
 
+
 def describe_fields(fields, field_names):
     res = {}
     if not field_names:
@@ -130,13 +139,14 @@
         res[name] = describe_field(field)
     return res
 
+
 class FormProcessor(JSONRPCService):
     def __init__(self, forms, _formcls=None):
 
         if _formcls is None:
             JSONRPCService.__init__(self)
             for k in forms.keys():
-                s  = FormProcessor({}, forms[k])
+                s = FormProcessor({}, forms[k])
                 self.add_method(k, s.__process)
         else:
             JSONRPCService.__init__(self, forms)
@@ -146,33 +156,30 @@
 
         f = self.formcls(params)
 
-        if command is None: # just validate
+        if command is None:  # just validate
             if not f.is_valid():
-                return {'success':False, 'errors': builderrors(f)}
-            return {'success':True}
-
-        elif command.has_key('describe_errors'):
+                return {'success': False, 'errors': builderrors(f)}
+            return {'success': True}
+
+        elif 'describe_errors' in command:
             field_names = command['describe_errors']
             return describe_fields_errors(f.fields, field_names)
 
-        elif command.has_key('describe'):
+        elif 'describe' in command:
             field_names = command['describe']
             return describe_fields(f.fields, field_names)
 
-        elif command.has_key('save'):
+        elif 'save' in command:
             if not f.is_valid():
-                return {'success':False, 'errors': builderrors(f)}
-            instance = f.save() # XXX: if you want more, over-ride save.
-            return {'success': True, 'instance': json_convert(instance) }
-
-        elif command.has_key('html'):
+                return {'success': False, 'errors': builderrors(f)}
+            instance = f.save()  # XXX: if you want more, over-ride save.
+            return {'success': True, 'instance': json_convert(instance)}
+
+        elif 'html' in command:
             return {'success': True, 'html': f.as_table()}
 
         return "unrecognised command"
 
-
-
-
 # The following is incredibly convenient for saving vast amounts of
 # coding, avoiding doing silly things like this:
 #     jsonresult = {'field1': djangoobject.field1,
@@ -202,9 +209,6 @@
 # list_some_model and list_another_model part of the django app:
 #  (r'^service1/$', 'djangoapp.views.jsonservice'),
 
-from django.core.serializers import serialize
-import datetime
-from datetime import date
 
 def dict_datetimeflatten(item):
     d = {}
@@ -218,9 +222,9 @@
             d[k] = v
     return d
 
+
 def json_convert(l, fields=None):
     res = []
     for item in serialize('python', l, fields=fields):
         res.append(dict_datetimeflatten(item))
     return res
-
--- a/svgui/pyjs/jsonrpc/jsonrpc.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/svgui/pyjs/jsonrpc/jsonrpc.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,23 +1,25 @@
+from __future__ import absolute_import
+import sys
 import gluon.contrib.simplejson as simplejson
-import types
-import sys
 
-class JSONRPCServiceBase:
+
+class JSONRPCServiceBase(object):
 
     def __init__(self):
-        self.methods={}
+        self.methods = {}
 
     def response(self, id, result):
-        return simplejson.dumps({'version': '1.1', 'id':id,
-                                 'result':result, 'error':None})
+        return simplejson.dumps({'version': '1.1', 'id': id,
+                                 'result': result, 'error': None})
+
     def error(self, id, code, message):
-        return simplejson.dumps({'id': id,
-                                 'version': '1.1',
-                                 'error': {'name': 'JSONRPCError',
-                                           'code': code,
-                                           'message': message
-                                           }
-                                     })
+        return simplejson.dumps({
+            'id': id,
+            'version': '1.1',
+            'error': {'name': 'JSONRPCError',
+                      'code': code,
+                      'message': message}
+        })
 
     def add_method(self, name, method):
         self.methods[name] = method
@@ -27,17 +29,16 @@
         id, method, params = data["id"], data["method"], data["params"]
         if method in self.methods:
             try:
-                result =self.methods[method](*params)
+                result = self.methods[method](*params)
                 return self.response(id, result)
+            except Exception:
+                etype, eval, _etb = sys.exc_info()
+                return self.error(id, 100, 'Exception %s: %s' % (etype, eval))
             except BaseException:
-                etype, eval, etb = sys.exc_info()
-                return self.error(id, 100, '%s: %s' %(etype.__name__, eval))
-            except:
-                etype, eval, etb = sys.exc_info()
-                return self.error(id, 100, 'Exception %s: %s' %(etype, eval))
+                etype, eval, _etb = sys.exc_info()
+                return self.error(id, 100, '%s: %s' % (etype.__name__, eval))
         else:
             return self.error(id, 100, 'method "%s" does not exist' % method)
 
     def listmethods(self):
-        return self.methods.keys() 
-
+        return self.methods.keys()
--- a/svgui/pyjs/jsonrpc/web2py/jsonrpc.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/svgui/pyjs/jsonrpc/web2py/jsonrpc.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,11 +1,14 @@
-from pyjs.jsonrpc import JSONRPCServiceBase
+# pylint: disable=undefined-variable
+
+from __future__ import absolute_import
+from svgui.pyjs.jsonrpc.jsonrpc import JSONRPCServiceBase
+
 
 class JSONRPCService(JSONRPCServiceBase):
 
     def serve(self):
         return self.process(request.body.read())
 
-    def __call__(self,func):
-        self.methods[func.__name__]=func
+    def __call__(self, func):
+        self.methods[func.__name__] = func
         return func
-
--- a/svgui/pyjs/lib/pyjslib.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/svgui/pyjs/lib/pyjslib.py	Mon Jan 07 13:50:39 2019 +0100
@@ -12,6 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+# pylint: disable=too-many-function-args,undefined-variable,no-absolute-import,assign-to-new-keyword,nonzero-method,next-method-called,next-method-defined
 
 # iteration from Bob Ippolito's Iteration in JavaScript
 
@@ -19,9 +20,8 @@
 
 # must declare import _before_ importing sys
 
+
 def import_module(path, parent_module, module_name, dynamic=1, async=False):
-    """ 
-    """
 
     JS("""
         var cache_file;
@@ -38,7 +38,7 @@
         }
 
         var override_name = sys.platform + "." + module_name;
-        if (((sys.overrides != null) && 
+        if (((sys.overrides != null) &&
              (sys.overrides.has_key(override_name))))
         {
             cache_file =  sys.overrides.__getitem__(override_name) ;
@@ -67,7 +67,7 @@
             module_load_request[module_name] = 1;
         }
 
-        /* following a load, this first executes the script 
+        /* following a load, this first executes the script
          * "preparation" function MODULENAME_loaded_fn()
          * and then sets up the loaded module in the namespace
          * of the parent.
@@ -105,6 +105,7 @@
 
     """)
 
+
 JS("""
 function import_wait(proceed_fn, parent_mod, dynamic) {
 
@@ -184,11 +185,16 @@
 }
 """)
 
+
+# pylint: disable=old-style-class
 class Object:
-    pass
+    def __init__(self):
+        pass
+
 
 object = Object
 
+
 class Modload:
 
     def __init__(self, path, app_modlist, app_imported_fn, dynamic,
@@ -196,15 +202,15 @@
         self.app_modlist = app_modlist
         self.app_imported_fn = app_imported_fn
         self.path = path
-        self.idx = 0;
+        self.idx = 0
         self.dynamic = dynamic
         self.parent_mod = parent_mod
 
     def next(self):
-        
+
         for i in range(len(self.app_modlist[self.idx])):
             app = self.app_modlist[self.idx][i]
-            import_module(self.path, self.parent_mod, app, self.dynamic, True);
+            import_module(self.path, self.parent_mod, app, self.dynamic, True)
         self.idx += 1
 
         if self.idx >= len(self.app_modlist):
@@ -212,18 +218,24 @@
         else:
             import_wait(getattr(self, "next"), self.parent_mod, self.dynamic)
 
+
 def get_module(module_name):
-    ev = "__mod = %s;" % module_name
-    JS("pyjs_eval(ev);")
+    _ev = "__mod = %s;" % module_name
+    JS("pyjs_eval(_ev);")
     return __mod
 
+
 def preload_app_modules(path, app_modnames, app_imported_fn, dynamic,
                         parent_mod=None):
 
     loader = Modload(path, app_modnames, app_imported_fn, dynamic, parent_mod)
     loader.next()
 
-import sys
+
+# as comment on line 20 says
+# import sys should be below
+import sys  # noqa # pylint: disable=wrong-import-order,unused-import,wrong-import-position
+
 
 class BaseException:
 
@@ -242,33 +254,38 @@
     def toString(self):
         return str(self)
 
+
 class Exception(BaseException):
-
     name = "Exception"
 
+
 class TypeError(BaseException):
     name = "TypeError"
 
+
 class StandardError(Exception):
     name = "StandardError"
 
+
 class LookupError(StandardError):
     name = "LookupError"
 
     def toString(self):
         return self.name + ": " + self.args[0]
 
+
 class KeyError(LookupError):
     name = "KeyError"
 
+
 class AttributeError(StandardError):
-
     name = "AttributeError"
 
     def toString(self):
         return "AttributeError: %s of %s" % (self.args[1], self.args[0])
 
-JS("""
+
+JS(r"""
 pyjslib.StopIteration = function () { };
 pyjslib.StopIteration.prototype = new Error();
 pyjslib.StopIteration.name = 'StopIteration';
@@ -407,6 +424,7 @@
 
 """)
 
+
 class Class:
     def __init__(self, name):
         self.name = name
@@ -414,7 +432,8 @@
     def __str___(self):
         return self.name
 
-def eq(a,b):
+
+def eq(a, b):
     JS("""
     if (pyjslib.hasattr(a, "__cmp__")) {
         return a.__cmp__(b) == 0;
@@ -424,7 +443,8 @@
     return a == b;
     """)
 
-def cmp(a,b):
+
+def cmp(a, b):
     if hasattr(a, "__cmp__"):
         return a.__cmp__(b)
     elif hasattr(b, "__cmp__"):
@@ -436,6 +456,7 @@
     else:
         return 0
 
+
 def bool(v):
     # this needs to stay in native code without any dependencies here,
     # because this is used by if and while, we need to prevent
@@ -456,6 +477,7 @@
     return Boolean(v);
     """)
 
+
 class List:
     def __init__(self, data=None):
         JS("""
@@ -511,7 +533,7 @@
     def insert(self, index, value):
         JS("""    var a = this.l; this.l=a.slice(0, index).concat(value, a.slice(index));""")
 
-    def pop(self, index = -1):
+    def pop(self, index=-1):
         JS("""
         if (index<0) index = this.l.length + index;
         var a = this.l[index];
@@ -577,18 +599,17 @@
 
     def sort(self, compareFunc=None, keyFunc=None, reverse=False):
         if not compareFunc:
-            global cmp
             compareFunc = cmp
         if keyFunc and reverse:
-            def thisSort1(a,b):
+            def thisSort1(a, b):
                 return -compareFunc(keyFunc(a), keyFunc(b))
             self.l.sort(thisSort1)
         elif keyFunc:
-            def thisSort2(a,b):
+            def thisSort2(a, b):
                 return compareFunc(keyFunc(a), keyFunc(b))
             self.l.sort(thisSort2)
         elif reverse:
-            def thisSort3(a,b):
+            def thisSort3(a, b):
                 return -compareFunc(a, b)
             self.l.sort(thisSort3)
         else:
@@ -603,8 +624,10 @@
     def __str__(self):
         return repr(self)
 
+
 list = List
 
+
 class Tuple:
     def __init__(self, data=None):
         JS("""
@@ -660,7 +683,7 @@
     def insert(self, index, value):
         JS("""    var a = this.l; this.l=a.slice(0, index).concat(value, a.slice(index));""")
 
-    def pop(self, index = -1):
+    def pop(self, index=-1):
         JS("""
         if (index<0) index = this.l.length + index;
         var a = this.l[index];
@@ -726,18 +749,17 @@
 
     def sort(self, compareFunc=None, keyFunc=None, reverse=False):
         if not compareFunc:
-            global cmp
             compareFunc = cmp
         if keyFunc and reverse:
-            def thisSort1(a,b):
+            def thisSort1(a, b):
                 return -compareFunc(keyFunc(a), keyFunc(b))
             self.l.sort(thisSort1)
         elif keyFunc:
-            def thisSort2(a,b):
+            def thisSort2(a, b):
                 return compareFunc(keyFunc(a), keyFunc(b))
             self.l.sort(thisSort2)
         elif reverse:
-            def thisSort3(a,b):
+            def thisSort3(a, b):
                 return -compareFunc(a, b)
             self.l.sort(thisSort3)
         else:
@@ -752,6 +774,7 @@
     def __str__(self):
         return repr(self)
 
+
 tuple = Tuple
 
 
@@ -866,22 +889,22 @@
         return self.__iter__()
 
     def itervalues(self):
-        return self.values().__iter__();
+        return self.values().__iter__()
 
     def iteritems(self):
-        return self.items().__iter__();
+        return self.items().__iter__()
 
     def setdefault(self, key, default_value):
-        if not self.has_key(key):
+        if key not in self:
             self[key] = default_value
 
     def get(self, key, default_=None):
-        if not self.has_key(key):
+        if key not in self:
             return default_
         return self[key]
 
     def update(self, d):
-        for k,v in d.iteritems():
+        for k, v in d.iteritems():
             self[k] = v
 
     def getObject(self):
@@ -897,9 +920,12 @@
     def __str__(self):
         return repr(self)
 
+
 dict = Dict
 
 # taken from mochikit: range( [start,] stop[, step] )
+
+
 def range():
     JS("""
     var start = 0;
@@ -930,6 +956,7 @@
         }
     """)
 
+
 def slice(object, lower, upper):
     JS("""
     if (pyjslib.isString(object)) {
@@ -948,6 +975,7 @@
     return null;
     """)
 
+
 def str(text):
     JS("""
     if (pyjslib.hasattr(text,"__str__")) {
@@ -956,8 +984,9 @@
     return String(text);
     """)
 
+
 def ord(x):
-    if(isString(x) and len(x) is 1):
+    if isString(x) and len(x) is 1:
         JS("""
             return x.charCodeAt(0);
         """)
@@ -967,11 +996,13 @@
         """)
     return None
 
+
 def chr(x):
     JS("""
         return String.fromCharCode(x)
     """)
 
+
 def is_basetype(x):
     JS("""
        var t = typeof(x);
@@ -983,6 +1014,7 @@
        ;
     """)
 
+
 def get_pyjs_classtype(x):
     JS("""
        if (pyjslib.hasattr(x, "__class__"))
@@ -992,6 +1024,7 @@
        return null;
     """)
 
+
 def repr(x):
     """ Return the string representation of 'x'.
     """
@@ -1088,16 +1121,19 @@
        return "<" + constructor + " object>";
     """)
 
+
 def float(text):
     JS("""
     return parseFloat(text);
     """)
 
+
 def int(text, radix=0):
     JS("""
     return parseInt(text, radix);
     """)
 
+
 def len(object):
     JS("""
     if (object==null) return 0;
@@ -1105,11 +1141,12 @@
     return object.length;
     """)
 
+
 def isinstance(object_, classinfo):
     if pyjslib.isUndefined(object_):
         return False
     if not pyjslib.isObject(object_):
-        
+
         return False
     if _isinstance(classinfo, Tuple):
         for ci in classinfo:
@@ -1119,6 +1156,7 @@
     else:
         return _isinstance(object_, classinfo)
 
+
 def _isinstance(object_, classinfo):
     if not pyjslib.isObject(object_):
         return False
@@ -1130,7 +1168,8 @@
     return false;
     """)
 
-def getattr(obj, name, default_):
+
+def getattr(obj, name, default_=None):
     JS("""
     if ((!pyjslib.isObject(obj))||(pyjslib.isUndefined(obj[name]))){
         if (pyjslib.isUndefined(default_)){
@@ -1151,6 +1190,7 @@
     return fnwrap;
     """)
 
+
 def setattr(obj, name, value):
     JS("""
     if (!pyjslib.isObject(obj)) return null;
@@ -1159,6 +1199,7 @@
 
     """)
 
+
 def hasattr(obj, name):
     JS("""
     if (!pyjslib.isObject(obj)) return false;
@@ -1167,6 +1208,7 @@
     return true;
     """)
 
+
 def dir(obj):
     JS("""
     var properties=new pyjslib.List();
@@ -1174,6 +1216,7 @@
     return properties;
     """)
 
+
 def filter(obj, method, sequence=None):
     # object context is LOST when a method is passed, hence object must be passed separately
     # to emulate python behaviour, should generate this code inline rather than as a function call
@@ -1240,6 +1283,7 @@
 
 next_hash_id = 0
 
+
 def hash(obj):
     JS("""
     if (obj == null) return null;
@@ -1259,41 +1303,49 @@
     return (a != null && (typeof a == 'object')) || pyjslib.isFunction(a);
     """)
 
+
 def isFunction(a):
     JS("""
     return typeof a == 'function';
     """)
 
+
 def isString(a):
     JS("""
     return typeof a == 'string';
     """)
 
+
 def isNull(a):
     JS("""
     return typeof a == 'object' && !a;
     """)
 
+
 def isArray(a):
     JS("""
     return pyjslib.isObject(a) && a.constructor == Array;
     """)
 
+
 def isUndefined(a):
     JS("""
     return typeof a == 'undefined';
     """)
 
+
 def isIteratable(a):
     JS("""
     return pyjslib.isString(a) || (pyjslib.isObject(a) && a.__iter__);
     """)
 
+
 def isNumber(a):
     JS("""
     return typeof a == 'number' && isFinite(a);
     """)
 
+
 def toJSObjects(x):
     """
        Convert the pyjs pythonic List and Dict objects into javascript Object and Array
@@ -1337,6 +1389,7 @@
          """)
     return x
 
+
 def printFunc(objs):
     JS("""
     if ($wnd.console==undefined)  return;
@@ -1348,6 +1401,7 @@
     console.debug(s)
     """)
 
+
 def type(clsname, bases=None, methods=None):
     """ creates a class, derived from bases, with methods and variables
     """
@@ -1355,11 +1409,10 @@
     JS(" var mths = {}; ")
     if methods:
         for k in methods.keys():
-            mth = methods[k]
-            JS(" mths[k] = mth; ")
+            _mth = methods[k]
+            JS(" mths[k] = _mth; ")
 
     JS(" var bss = null; ")
     if bases:
         JS("bss = bases.l;")
     JS(" return pyjs_type(clsname, bss, mths); ")
-
--- a/svgui/pyjs/lib/sys.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/svgui/pyjs/lib/sys.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,32 +1,35 @@
 # the platform name (PyV8, smjs, Mozilla, IE6, Opera, Safari etc.)
-platform = '' # to be updated by app, on compile
+platform = ''  # to be updated by app, on compile
 
 # a dictionary of module override names (platform-specific)
-overrides = None # to be updated by app, on compile
+overrides = {}  # to be updated by app, on compile
 
 # the remote path for loading modules
-loadpath = None 
+loadpath = None
 
-stacktrace = None 
+stacktrace = None
 
-appname = None 
+appname = None
+
 
 def setloadpath(lp):
     global loadpath
     loadpath = lp
 
+
 def setappname(an):
     global appname
     appname = an
 
+
 def getloadpath():
-    global loadpath
     return loadpath
 
+
 def addoverride(module_name, path):
-    global overrides
     overrides[module_name] = path
 
+
 def addstack(linedebug):
     JS("""
         if (pyjslib.bool((sys.stacktrace === null))) {
@@ -34,11 +37,14 @@
         }
         sys.stacktrace.append(linedebug);
     """)
+
+
 def popstack():
     JS("""
         sys.stacktrace.pop()
     """)
 
+
 def printstack():
     JS("""
         var res = '';
--- a/svgui/pyjs/pyjs.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/svgui/pyjs/pyjs.py	Mon Jan 07 13:50:39 2019 +0100
@@ -12,14 +12,18 @@
 # 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.
-
-
+#
+# pylint: disable=no-absolute-import,bad-python3-import
+
+from __future__ import print_function
 import sys
-from types import StringType
 import compiler
 from compiler import ast
 import os
 import copy
+from builtins import str as text
+from past.builtins import basestring
+from six.moves import cStringIO
 
 # the standard location for builtins (e.g. pyjslib) can be
 # over-ridden by changing this.  it defaults to sys.prefix
@@ -31,7 +35,7 @@
 
 prefix = sys.prefix
 
-if os.environ.has_key('PYJSPREFIX'):
+if 'PYJSPREFIX' in os.environ:
     prefix = os.environ['PYJSPREFIX']
 
 # pyjs.path is the list of paths, just like sys.path, from which
@@ -41,7 +45,7 @@
 
 path = [os.path.abspath('')]
 
-if os.environ.has_key('PYJSPATH'):
+if 'PYJSPATH' in os.environ:
     for p in os.environ['PYJSPATH'].split(os.pathsep):
         p = os.path.abspath(p)
         if os.path.isdir(p):
@@ -52,43 +56,43 @@
 
 UU = ""
 
-PYJSLIB_BUILTIN_FUNCTIONS=("cmp",
-                           "map",
-                           "filter",
-                           "dir",
-                           "getattr",
-                           "setattr",
-                           "hasattr",
-                           "int",
-                           "float",
-                           "str",
-                           "repr",
-                           "range",
-                           "len",
-                           "hash",
-                           "abs",
-                           "ord",
-                           "chr",
-                           "enumerate",
-                           "min",
-                           "max",
-                           "bool",
-                           "type",
-                           "isinstance")
-
-PYJSLIB_BUILTIN_CLASSES=("BaseException",
-                         "Exception",
-                         "StandardError",
-                         "StopIteration",
-                         "AttributeError",
-                         "TypeError",
-                         "KeyError",
-                         "LookupError",
-                         "list",
-                         "dict",
-                         "object",
-                         "tuple",
-                        )
+PYJSLIB_BUILTIN_FUNCTIONS = ("cmp",
+                             "map",
+                             "filter",
+                             "dir",
+                             "getattr",
+                             "setattr",
+                             "hasattr",
+                             "int",
+                             "float",
+                             "str",
+                             "repr",
+                             "range",
+                             "len",
+                             "hash",
+                             "abs",
+                             "ord",
+                             "chr",
+                             "enumerate",
+                             "min",
+                             "max",
+                             "bool",
+                             "type",
+                             "isinstance")
+
+PYJSLIB_BUILTIN_CLASSES = ("BaseException",
+                           "Exception",
+                           "StandardError",
+                           "StopIteration",
+                           "AttributeError",
+                           "TypeError",
+                           "KeyError",
+                           "LookupError",
+                           "list",
+                           "dict",
+                           "object",
+                           "tuple")
+
 
 def pyjs_builtin_remap(name):
     # XXX HACK!
@@ -102,10 +106,11 @@
         name = 'Tuple'
     return name
 
+
 # XXX: this is a hack: these should be dealt with another way
 # however, console is currently the only global name which is causing
 # problems.
-PYJS_GLOBAL_VARS=("console")
+PYJS_GLOBAL_VARS = ("console")
 
 # This is taken from the django project.
 # Escape every ASCII character with a value less than 32.
@@ -119,18 +124,21 @@
     (';', r'\x3B')
     ) + tuple([('%c' % z, '\\x%02X' % z) for z in range(32)])
 
+
 def escapejs(value):
     """Hex encodes characters for use in JavaScript strings."""
     for bad, good in JS_ESCAPES:
         value = value.replace(bad, good)
     return value
 
+
 def uuprefix(name, leave_alone=0):
     name = name.split(".")
     name = name[:leave_alone] + map(lambda x: "__%s" % x, name[leave_alone:])
     return '.'.join(name)
 
-class Klass:
+
+class Klass(object):
 
     klasses = {}
 
@@ -149,14 +157,17 @@
 
 class TranslationError(Exception):
     def __init__(self, message, node):
+        Exception.__init__(self)
         self.message = "line %s:\n%s\n%s" % (node.lineno, message, node)
 
     def __str__(self):
         return self.message
 
+
 def strip_py(name):
     return name
 
+
 def mod_var_name_decl(raw_module_name):
     """ function to get the last component of the module e.g.
         pyjamas.ui.DOM into the "namespace".  i.e. doing
@@ -174,14 +185,16 @@
     child_name = name[-1]
     return "var %s = %s;\n" % (child_name, raw_module_name)
 
+
 def gen_mod_import(parentName, importName, dynamic=1):
-    #pyjs_ajax_eval("%(n)s.cache.js", null, true);
+    # pyjs_ajax_eval("%(n)s.cache.js", null, true);
     return """
     pyjslib.import_module(sys.loadpath, '%(p)s', '%(n)s', %(d)d, false);
     """ % ({'p': parentName, 'd': dynamic, 'n': importName}) + \
-    mod_var_name_decl(importName)
-
-class Translator:
+        mod_var_name_decl(importName)
+
+
+class Translator(object):
 
     def __init__(self, mn, module_name, raw_module_name, src, debug, mod, output,
                  dynamic=0, optimize=False,
@@ -217,37 +230,36 @@
             vdec = ''
         else:
             vdec = 'var '
-        print >>self.output, UU+"%s%s = function (__mod_name__) {" % (vdec, module_name)
-
-        print >>self.output, "    if("+module_name+".__was_initialized__) return;"
-        print >>self.output, "    "+UU+module_name+".__was_initialized__ = true;"
-        print >>self.output, UU+"if (__mod_name__ == null) __mod_name__ = '%s';" % (mn)
-        print >>self.output, UU+"%s.__name__ = __mod_name__;" % (raw_module_name)
+        self.printo(UU+"%s%s = function (__mod_name__) {" % (vdec, module_name))
+
+        self.printo("    if("+module_name+".__was_initialized__) return;")
+        self.printo("    "+UU+module_name+".__was_initialized__ = true;")
+        self.printo(UU+"if (__mod_name__ == null) __mod_name__ = '%s';" % (mn))
+        self.printo(UU+"%s.__name__ = __mod_name__;" % (raw_module_name))
 
         decl = mod_var_name_decl(raw_module_name)
         if decl:
-            print >>self.output, decl
-
+            self.printo(decl)
 
         if self.debug:
             haltException = self.module_prefix + "HaltException"
-            print >>self.output, haltException + ' = function () {'
-            print >>self.output, '  this.message = "Program Halted";'
-            print >>self.output, '  this.name = "' + haltException + '";'
-            print >>self.output, '}'
-            print >>self.output, ''
-            print >>self.output, haltException + ".prototype.__str__ = function()"
-            print >>self.output, '{'
-            print >>self.output, 'return this.message ;'
-            print >>self.output, '}'
-
-            print >>self.output, haltException + ".prototype.toString = function()"
-            print >>self.output, '{'
-            print >>self.output, 'return this.name + ": \\"" + this.message + "\\"";'
-            print >>self.output, '}'
+            self.printo(haltException + ' = function () {')
+            self.printo('  this.message = "Program Halted";')
+            self.printo('  this.name = "' + haltException + '";')
+            self.printo('}')
+            self.printo('')
+            self.printo(haltException + ".prototype.__str__ = function()")
+            self.printo('{')
+            self.printo('return this.message ;')
+            self.printo('}')
+
+            self.printo(haltException + ".prototype.toString = function()")
+            self.printo('{')
+            self.printo('return this.name + ": \\"" + this.message + "\\"";')
+            self.printo('}')
 
             isHaltFunction = self.module_prefix + "IsHaltException"
-            print >>self.output, """
+            self.printo(""")
     %s = function (s) {
       var suffix="HaltException";
       if (s.length < suffix.length) {
@@ -259,7 +271,7 @@
         return ss == suffix;
       }
     }
-                """ % isHaltFunction
+                """ % isHaltFunction)
         for child in mod.node:
             if isinstance(child, ast.Function):
                 self.top_level_functions.add(child.name)
@@ -273,14 +285,14 @@
                 self._class(child)
             elif isinstance(child, ast.Import):
                 importName = child.names[0][0]
-                if importName == '__pyjamas__': # special module to help make pyjamas modules loadable in the python interpreter
+                if importName == '__pyjamas__':  # special module to help make pyjamas modules loadable in the python interpreter
                     pass
                 elif importName.endswith('.js'):
-                   self.imported_js.add(importName)
+                    self.imported_js.add(importName)
                 else:
-                   self.add_imported_module(strip_py(importName))
+                    self.add_imported_module(strip_py(importName))
             elif isinstance(child, ast.From):
-                if child.modname == '__pyjamas__': # special module to help make pyjamas modules loadable in the python interpreter
+                if child.modname == '__pyjamas__':  # special module to help make pyjamas modules loadable in the python interpreter
                     pass
                 else:
                     self.add_imported_module(child.modname)
@@ -302,9 +314,9 @@
             elif isinstance(child, ast.Global):
                 self._global(child, None)
             elif isinstance(child, ast.Printnl):
-               self._print(child, None)
+                self._print(child, None)
             elif isinstance(child, ast.Print):
-               self._print(child, None)
+                self._print(child, None)
             elif isinstance(child, ast.TryExcept):
                 self._tryExcept(child, None)
             elif isinstance(child, ast.Raise):
@@ -315,14 +327,17 @@
                 raise TranslationError("unsupported type (in __init__)", child)
 
         # Initialize all classes for this module
-        #print >> self.output, "__"+self.modpfx()+\
-        #          "classes_initialize = function() {\n"
-        #for className in self.top_level_classes:
-        #    print >> self.output, "\t"+UU+self.modpfx()+"__"+className+"_initialize();"
-        #print >> self.output, "};\n"
-
-        print >> self.output, "return this;\n"
-        print >> self.output, "}; /* end %s */ \n"  % module_name
+        # self.printo("__"+self.modpfx()+\
+        #          "classes_initialize = function() {\n")
+        # for className in self.top_level_classes:
+        #    self.printo("\t"+UU+self.modpfx()+"__"+className+"_initialize();")
+        # self.printo("};\n")
+
+        self.printo("return this;\n")
+        self.printo("}; /* end %s */ \n" % module_name)
+
+    def printo(self, *args):
+        print(*args, file=self.output)
 
     def module_imports(self):
         return self.imported_modules + self.imported_modules_as
@@ -345,10 +360,10 @@
             # added to the dependencies, and it's half way up the
             # module import directory structure!
             child_name = name[-1]
-            self.imported_modules_as.append(child_name) 
-        print >> self.output, gen_mod_import(self.raw_module_name,
-                                             strip_py(importName),
-                                             self.dynamic)
+            self.imported_modules_as.append(child_name)
+        self.printo(gen_mod_import(self.raw_module_name,
+                                   strip_py(importName),
+                                   self.dynamic))
 
     def _default_args_handler(self, node, arg_names, current_klass,
                               output=None):
@@ -369,45 +384,46 @@
 
                 default_name = arg_names[default_pos]
                 default_pos += 1
-                print >> output, "    if (typeof %s == 'undefined') %s=%s;" % (default_name, default_name, default_value)
+                self.printo("    if (typeof %s == 'undefined') %s=%s;" % (default_name, default_name, default_value))
 
     def _varargs_handler(self, node, varargname, arg_names, current_klass):
-        print >>self.output, "    var", varargname, '= new pyjslib.Tuple();'
-        print >>self.output, "    for(var __va_arg="+str(len(arg_names))+"; __va_arg < arguments.length; __va_arg++) {"
-        print >>self.output, "        var __arg = arguments[__va_arg];"
-        print >>self.output, "        "+varargname+".append(__arg);"
-        print >>self.output, "    }"
+        self.printo("    var", varargname, '= new pyjslib.Tuple();')
+        self.printo("    for(var __va_arg="+str(len(arg_names))+"; __va_arg < arguments.length; __va_arg++) {")
+        self.printo("        var __arg = arguments[__va_arg];")
+        self.printo("        "+varargname+".append(__arg);")
+        self.printo("    }")
 
     def _kwargs_parser(self, node, function_name, arg_names, current_klass):
         if len(node.defaults) or node.kwargs:
             default_pos = len(arg_names) - len(node.defaults)
             if arg_names and arg_names[0] == self.method_self:
                 default_pos -= 1
-            print >>self.output, function_name+'.parse_kwargs = function (', ", ".join(["__kwargs"]+arg_names), ") {"
-            for default_node in node.defaults:
-                default_value = self.expr(default_node, current_klass)
-#                if isinstance(default_node, ast.Const):
-#                    default_value = self._const(default_node)
-#                elif isinstance(default_node, ast.Name):
-#                    default_value = self._name(default_node)
-#                elif isinstance(default_node, ast.UnarySub):
-#                    default_value = self._unarysub(default_node, current_klass)
-#                else:
-#                    raise TranslationError("unsupported type (in _method)", default_node)
+            self.printo(function_name+'.parse_kwargs = function (', ", ".join(["__kwargs"]+arg_names), ") {")
+            for _default_node in node.defaults:
+                # default_value = self.expr(default_node, current_klass)
+                # if isinstance(default_node, ast.Const):
+                #     default_value = self._const(default_node)
+                # elif isinstance(default_node, ast.Name):
+                #     default_value = self._name(default_node)
+                # elif isinstance(default_node, ast.UnarySub):
+                #     default_value = self._unarysub(default_node, current_klass)
+                # else:
+                #     raise TranslationError("unsupported type (in _method)", default_node)
 
                 default_name = arg_names[default_pos]
-                print >>self.output, "    if (typeof %s == 'undefined')"%(default_name)
-                print >>self.output, "        %s=__kwargs.%s;"% (default_name, default_name)
+                self.printo("    if (typeof %s == 'undefined')" % (default_name))
+                self.printo("        %s=__kwargs.%s;" % (default_name, default_name))
                 default_pos += 1
 
-            #self._default_args_handler(node, arg_names, current_klass)
-            if node.kwargs: arg_names += ["pyjslib.Dict(__kwargs)"]
-            print >>self.output, "    var __r = "+"".join(["[", ", ".join(arg_names), "]"])+";"
+            # self._default_args_handler(node, arg_names, current_klass)
+            if node.kwargs:
+                arg_names += ["pyjslib.Dict(__kwargs)"]
+            self.printo("    var __r = "+"".join(["[", ", ".join(arg_names), "]"])+";")
             if node.varargs:
                 self._varargs_handler(node, "__args", arg_names, current_klass)
-                print >>self.output, "    __r.push.apply(__r, __args.getArray())"
-            print >>self.output, "    return __r;"
-            print >>self.output, "};"
+                self.printo("    __r.push.apply(__r, __args.getArray())")
+            self.printo("    return __r;")
+            self.printo("};")
 
     def _function(self, node, local=False):
         if local:
@@ -418,16 +434,19 @@
 
         arg_names = list(node.argnames)
         normal_arg_names = list(arg_names)
-        if node.kwargs: kwargname = normal_arg_names.pop()
-        if node.varargs: varargname = normal_arg_names.pop()
+        if node.kwargs:
+            kwargname = normal_arg_names.pop()
+        if node.varargs:
+            varargname = normal_arg_names.pop()
         declared_arg_names = list(normal_arg_names)
-        if node.kwargs: declared_arg_names.append(kwargname)
+        if node.kwargs:
+            declared_arg_names.append(kwargname)
 
         function_args = "(" + ", ".join(declared_arg_names) + ")"
-        print >>self.output, "%s = function%s {" % (function_name, function_args)
+        self.printo("%s = function%s {" % (function_name, function_args))
         self._default_args_handler(node, normal_arg_names, None)
 
-        local_arg_names = normal_arg_names + declared_arg_names 
+        local_arg_names = normal_arg_names + declared_arg_names
 
         if node.varargs:
             self._varargs_handler(node, varargname, declared_arg_names, None)
@@ -446,29 +465,24 @@
         lastStmt = [p for p in node.code][-1]
         if not isinstance(lastStmt, ast.Return):
             if not self._isNativeFunc(lastStmt):
-                print >>self.output, "    return null;"
-
-        print >>self.output, "};"
-        print >>self.output, "%s.__name__ = '%s';\n" % (function_name, node.name)
-
+                self.printo("    return null;")
+
+        self.printo("};")
+        self.printo("%s.__name__ = '%s';\n" % (function_name, node.name))
 
         self._kwargs_parser(node, function_name, normal_arg_names, None)
 
-
     def _return(self, node, current_klass):
         expr = self.expr(node.value, current_klass)
         # in python a function call always returns None, so we do it
         # here too
-        print >>self.output, "    return " + expr + ";"
-
+        self.printo("    return " + expr + ";")
 
     def _break(self, node, current_klass):
-        print >>self.output, "    break;"
-
+        self.printo("    break;")
 
     def _continue(self, node, current_klass):
-        print >>self.output, "    continue;"
-
+        self.printo("    continue;")
 
     def _callfunc(self, v, current_klass):
 
@@ -477,7 +491,7 @@
                 call_name = self.modpfx() + v.node.name
             elif v.node.name in self.top_level_classes:
                 call_name = self.modpfx() + v.node.name
-            elif self.imported_classes.has_key(v.node.name):
+            elif v.node.name in self.imported_classes:
                 call_name = self.imported_classes[v.node.name] + '.' + v.node.name
             elif v.node.name in PYJSLIB_BUILTIN_FUNCTIONS:
                 call_name = 'pyjslib.' + v.node.name
@@ -535,18 +549,15 @@
         if kwargs or star_arg_name:
             if not star_arg_name:
                 star_arg_name = 'null'
-            try: call_this, method_name = call_name.rsplit(".", 1)
+            try:
+                call_this, method_name = call_name.rsplit(".", 1)
             except ValueError:
                 # Must be a function call ...
-                return ("pyjs_kwargs_function_call("+call_name+", "
-                                  + star_arg_name 
-                                  + ", ["+fn_args+"]"
-                                  + ")" )
-            else:
-                return ("pyjs_kwargs_method_call("+call_this+", '"+method_name+"', "
-                                  + star_arg_name 
-                                  + ", ["+fn_args+"]"
-                                  + ")")
+                return ("pyjs_kwargs_function_call("+call_name+", " +
+                        star_arg_name + ", ["+fn_args+"]" + ")")
+            else:
+                return ("pyjs_kwargs_method_call("+call_this+", '"+method_name+"', " +
+                        star_arg_name + ", ["+fn_args+"]" + ")")
         else:
             return call_name + "(" + ", ".join(call_args) + ")"
 
@@ -558,7 +569,7 @@
             arg = self.expr(ch4, current_klass)
             call_args.append(arg)
 
-        print >>self.output, "pyjslib.printFunc([", ', '.join(call_args), "],", int(isinstance(node, ast.Printnl)), ");"
+        self.printo("pyjslib.printFunc([", ', '.join(call_args), "],", int(isinstance(node, ast.Printnl)), ");")
 
     def _tryExcept(self, node, current_klass):
         if len(node.handlers) != 1:
@@ -576,28 +587,28 @@
         # local scope, temporary to the function.  oh dearie me.
         self.add_local_arg(errName)
 
-        print >>self.output, "    try {"
+        self.printo("    try {")
         for stmt in node.body.nodes:
             self._stmt(stmt, current_klass)
-        print >> self.output, "    } catch(%s) {" % errName
+        self.printo("    } catch(%s) {" % errName)
         if expr:
-            l = []
+            k = []
             if isinstance(expr, ast.Tuple):
                 for x in expr.nodes:
-                    l.append("(%(err)s.__name__ == %(expr)s.__name__)" % dict (err=errName, expr=self.expr(x, current_klass)))
-            else:
-                l = [ " (%(err)s.__name__ == %(expr)s.__name__) " % dict (err=errName, expr=self.expr(expr, current_klass)) ]
-            print >> self.output, "   if(%s) {" % '||\n\t\t'.join(l)
+                    k.append("(%(err)s.__name__ == %(expr)s.__name__)" % dict(err=errName, expr=self.expr(x, current_klass)))
+            else:
+                k = [" (%(err)s.__name__ == %(expr)s.__name__) " % dict(err=errName, expr=self.expr(expr, current_klass))]
+            self.printo("   if(%s) {" % '||\n\t\t'.join(k))
         for stmt in node.handlers[0][2]:
             self._stmt(stmt, current_klass)
         if expr:
-            #print >> self.output, "} else { throw(%s); } " % errName
-            print >> self.output, "}"
-        if node.else_ != None:
-            print >>self.output, "    } finally {"
+            # self.printo("} else { throw(%s); } " % errName)
+            self.printo("}")
+        if node.else_ is not None:
+            self.printo("    } finally {")
             for stmt in node.else_:
                 self._stmt(stmt, current_klass)
-        print >>self.output, "    }"
+        self.printo("    }")
 
     # XXX: change use_getattr to True to enable "strict" compilation
     # but incurring a 100% performance penalty. oops.
@@ -605,13 +616,13 @@
         attr_name = v.attrname
         if isinstance(v.expr, ast.Name):
             obj = self._name(v.expr, current_klass, return_none_for_module=True)
-            if obj == None and v.expr.name in self.module_imports():
+            if obj is None and v.expr.name in self.module_imports():
                 # XXX TODO: distinguish between module import classes
                 # and variables.  right now, this is a hack to get
                 # the sys module working.
-                #if v.expr.name == 'sys':
+                # if v.expr.name == 'sys':
                 return v.expr.name+'.'+attr_name
-                #return v.expr.name+'.__'+attr_name+'.prototype.__class__'
+                # return v.expr.name+'.__'+attr_name+'.prototype.__class__'
             if not use_getattr or attr_name == '__class__' or \
                     attr_name == '__name__':
                 return obj + "." + attr_name
@@ -625,19 +636,18 @@
         else:
             raise TranslationError("unsupported type (in _getattr)", v.expr)
 
-
     def modpfx(self):
         return strip_py(self.module_prefix)
-        
+
     def _name(self, v, current_klass, top_level=False,
-                                      return_none_for_module=False):
+              return_none_for_module=False):
 
         if v.name == 'ilikesillynamesfornicedebugcode':
-            print top_level, current_klass, repr(v)
-            print self.top_level_vars
-            print self.top_level_functions
-            print self.local_arg_stack
-            print "error..."
+            print(top_level, current_klass, repr(v))
+            print(self.top_level_vars)
+            print(self.top_level_functions)
+            print(self.local_arg_stack)
+            print("error...")
 
         local_var_names = None
         las = len(self.local_arg_stack)
@@ -662,14 +672,14 @@
             return UU+self.modpfx() + v.name
         elif v.name in local_var_names:
             return v.name
-        elif self.imported_classes.has_key(v.name):
+        elif v.name in self.imported_classes:
             return UU+self.imported_classes[v.name] + '.__' + v.name + ".prototype.__class__"
         elif v.name in self.top_level_classes:
             return UU+self.modpfx() + "__" + v.name + ".prototype.__class__"
         elif v.name in self.module_imports() and return_none_for_module:
             return None
         elif v.name in PYJSLIB_BUILTIN_CLASSES:
-            return "pyjslib." + pyjs_builtin_remap( v.name )
+            return "pyjslib." + pyjs_builtin_remap(v.name)
         elif current_klass:
             if v.name not in local_var_names and \
                v.name not in self.top_level_vars and \
@@ -681,9 +691,8 @@
                     cls_name_ = cls_name.name_
                     cls_name = cls_name.name
                 else:
-                    cls_name_ = current_klass + "_" # XXX ???
-                name = UU+cls_name_ + ".prototype.__class__." \
-                                   + v.name
+                    cls_name_ = current_klass + "_"  # XXX ???
+                name = UU+cls_name_ + ".prototype.__class__." + v.name
                 if v.name == 'listener':
                     name = 'listener+' + name
                 return name
@@ -695,33 +704,31 @@
 
         if obj in self.method_imported_globals:
             call_name = UU+self.modpfx() + obj + "." + attr_name
-        elif self.imported_classes.has_key(obj):
-            #attr_str = ""
-            #if attr_name != "__init__":
+        elif obj in self.imported_classes:
+            # attr_str = ""
+            # if attr_name != "__init__":
             attr_str = ".prototype.__class__." + attr_name
             call_name = UU+self.imported_classes[obj] + '.__' + obj + attr_str
         elif obj in self.module_imports():
             call_name = obj + "." + attr_name
-        elif obj[0] == obj[0].upper(): # XXX HACK ALERT
+        elif obj[0] == obj[0].upper():  # XXX HACK ALERT
             call_name = UU + self.modpfx() + "__" + obj + ".prototype.__class__." + attr_name
         else:
             call_name = UU+self._name(v, current_klass) + "." + attr_name
 
         return call_name
 
-
     def _getattr2(self, v, current_klass, attr_name):
         if isinstance(v.expr, ast.Getattr):
             call_name = self._getattr2(v.expr, current_klass, v.attrname + "." + attr_name)
         elif isinstance(v.expr, ast.Name) and v.expr.name in self.module_imports():
-            call_name = UU+v.expr.name + '.__' +v.attrname+".prototype.__class__."+attr_name
+            call_name = UU+v.expr.name + '.__' + v.attrname+".prototype.__class__."+attr_name
         else:
             obj = self.expr(v.expr, current_klass)
             call_name = obj + "." + v.attrname + "." + attr_name
 
         return call_name
 
-
     def _class(self, node):
         """
         Handle a class definition.
@@ -761,12 +768,11 @@
                 if child.name == "__init__":
                     init_method = child
 
-
         if len(node.bases) == 0:
             base_class = "pyjslib.__Object"
         elif len(node.bases) == 1:
             if isinstance(node.bases[0], ast.Name):
-                if self.imported_classes.has_key(node.bases[0].name):
+                if node.bases[0].name in self.imported_classes:
                     base_class_ = self.imported_classes[node.bases[0].name] + '.__' + node.bases[0].name
                     base_class = self.imported_classes[node.bases[0].name] + '.' + node.bases[0].name
                 else:
@@ -777,8 +783,9 @@
                 # pass our class to self._name
                 base_class_ = self._name(node.bases[0].expr, None) + \
                              ".__" + node.bases[0].attrname
-                base_class = self._name(node.bases[0].expr, None) + \
-                             "." + node.bases[0].attrname
+                base_class = \
+                    self._name(node.bases[0].expr, None) + \
+                    "." + node.bases[0].attrname
             else:
                 raise TranslationError("unsupported type (in _class)", node.bases[0])
 
@@ -786,50 +793,50 @@
         else:
             raise TranslationError("more than one base (in _class)", node)
 
-        print >>self.output, UU+class_name_ + " = function () {"
+        self.printo(UU+class_name_ + " = function () {")
         # call superconstructor
-        #if base_class:
-        #    print >>self.output, "    __" + base_class + ".call(this);"
-        print >>self.output, "}"
+        # if base_class:
+        #    self.printo("    __" + base_class + ".call(this);")
+        self.printo("}")
 
         if not init_method:
             init_method = ast.Function([], "__init__", ["self"], [], 0, None, [])
-            #self._method(init_method, current_klass, class_name)
+            # self._method(init_method, current_klass, class_name)
 
         # Generate a function which constructs the object
-        clsfunc = ast.Function([],
-           node.name,
-           init_method.argnames[1:],
-           init_method.defaults,
-           init_method.flags,
-           None,
-           [ast.Discard(ast.CallFunc(ast.Name("JS"), [ast.Const(
-#            I attempted lazy initialization, but then you can't access static class members
-#            "    if(!__"+base_class+".__was_initialized__)"+
-#            "        __" + class_name + "_initialize();\n" +
-            "    var instance = new " + UU + class_name_ + "();\n" +
-            "    if(instance.__init__) instance.__init__.apply(instance, arguments);\n" +
-            "    return instance;"
+        clsfunc = ast.Function(
+            [], node.name,
+            init_method.argnames[1:],
+            init_method.defaults,
+            init_method.flags,
+            None,
+            [ast.Discard(ast.CallFunc(ast.Name("JS"), [ast.Const(
+                #            I attempted lazy initialization, but then you can't access static class members
+                #            "    if(!__"+base_class+".__was_initialized__)"+
+                #            "        __" + class_name + "_initialize();\n" +
+                "    var instance = new " + UU + class_name_ + "();\n" +
+                "    if(instance.__init__) instance.__init__.apply(instance, arguments);\n" +
+                "    return instance;"
             )]))])
 
         self._function(clsfunc, False)
-        print >>self.output, UU+class_name_ + ".__initialize__ = function () {"
-        print >>self.output, "    if("+UU+class_name_+".__was_initialized__) return;"
-        print >>self.output, "    "+UU+class_name_+".__was_initialized__ = true;"
+        self.printo(UU+class_name_ + ".__initialize__ = function () {")
+        self.printo("    if("+UU+class_name_+".__was_initialized__) return;")
+        self.printo("    "+UU+class_name_+".__was_initialized__ = true;")
         cls_obj = UU+class_name_ + '.prototype.__class__'
 
         if class_name == "pyjslib.__Object":
-            print >>self.output, "    "+cls_obj+" = {};"
+            self.printo("    "+cls_obj+" = {};")
         else:
             if base_class and base_class not in ("object", "pyjslib.__Object"):
-                print >>self.output, "    if(!"+UU+base_class_+".__was_initialized__)"
-                print >>self.output, "        "+UU+base_class_+".__initialize__();"
-                print >>self.output, "    pyjs_extend(" + UU+class_name_ + ", "+UU+base_class_+");"
-            else:
-                print >>self.output, "    pyjs_extend(" + UU+class_name_ + ", "+UU+"pyjslib.__Object);"
-
-        print >>self.output, "    "+cls_obj+".__new__ = "+UU+class_name+";"
-        print >>self.output, "    "+cls_obj+".__name__ = '"+UU+node.name+"';"
+                self.printo("    if(!"+UU+base_class_+".__was_initialized__)")
+                self.printo("        "+UU+base_class_+".__initialize__();")
+                self.printo("    pyjs_extend(" + UU+class_name_ + ", "+UU+base_class_+");")
+            else:
+                self.printo("    pyjs_extend(" + UU+class_name_ + ", "+UU+"pyjslib.__Object);")
+
+        self.printo("    "+cls_obj+".__new__ = "+UU+class_name+";")
+        self.printo("    "+cls_obj+".__name__ = '"+UU+node.name+"';")
 
         for child in node.code:
             if isinstance(child, ast.Pass):
@@ -843,10 +850,9 @@
                 pass
             else:
                 raise TranslationError("unsupported type (in _class)", child)
-        print >>self.output, "}"
-
-        print >> self.output, class_name_+".__initialize__();"
-
+        self.printo("}")
+
+        self.printo(class_name_+".__initialize__();")
 
     def classattr(self, node, current_klass):
         self._assign(node, current_klass, True)
@@ -855,8 +861,8 @@
         if node.expr2:
             raise TranslationError("More than one expression unsupported",
                                    node)
-        print >> self.output, "throw (%s);" % self.expr(
-            node.expr1, current_klass)
+        self.printo("throw (%s);" % self.expr(
+            node.expr1, current_klass))
 
     def _method(self, node, current_klass, class_name, class_name_):
         # reset global var scope
@@ -876,22 +882,25 @@
         if staticmethod:
             staticfunc = ast.Function([], class_name_+"."+node.name, node.argnames, node.defaults, node.flags, node.doc, node.code, node.lineno)
             self._function(staticfunc, True)
-            print >>self.output, "    " + UU+class_name_ + ".prototype.__class__." + node.name + " = " + class_name_+"."+node.name+";";
-            print >>self.output, "    " + UU+class_name_ + ".prototype.__class__." + node.name + ".static_method = true;";
+            self.printo("    " + UU+class_name_ + ".prototype.__class__." + node.name + " = " + class_name_+"."+node.name+";")
+            self.printo("    " + UU+class_name_ + ".prototype.__class__." + node.name + ".static_method = true;")
             return
         else:
             if len(arg_names) == 0:
                 raise TranslationError("methods must take an argument 'self' (in _method)", node)
             self.method_self = arg_names[0]
 
-            #if not classmethod and arg_names[0] != "self":
+            # if not classmethod and arg_names[0] != "self":
             #    raise TranslationError("first arg not 'self' (in _method)", node)
 
         normal_arg_names = arg_names[1:]
-        if node.kwargs: kwargname = normal_arg_names.pop()
-        if node.varargs: varargname = normal_arg_names.pop()
+        if node.kwargs:
+            kwargname = normal_arg_names.pop()
+        if node.varargs:
+            varargname = normal_arg_names.pop()
         declared_arg_names = list(normal_arg_names)
-        if node.kwargs: declared_arg_names.append(kwargname)
+        if node.kwargs:
+            declared_arg_names.append(kwargname)
 
         function_args = "(" + ", ".join(declared_arg_names) + ")"
 
@@ -899,18 +908,17 @@
             fexpr = UU + class_name_ + ".prototype.__class__." + node.name
         else:
             fexpr = UU + class_name_ + ".prototype." + node.name
-        print >>self.output, "    "+fexpr + " = function" + function_args + " {"
+        self.printo("    "+fexpr + " = function" + function_args + " {")
 
         # default arguments
         self._default_args_handler(node, normal_arg_names, current_klass)
 
-        local_arg_names = normal_arg_names + declared_arg_names 
+        local_arg_names = normal_arg_names + declared_arg_names
 
         if node.varargs:
             self._varargs_handler(node, varargname, declared_arg_names, current_klass)
             local_arg_names.append(varargname)
 
-
         # stack of local variable names for this function call
         self.local_arg_stack.append(local_arg_names)
 
@@ -920,7 +928,7 @@
         # remove the top local arg names
         self.local_arg_stack.pop()
 
-        print >>self.output, "    };"
+        self.printo("    };")
 
         self._kwargs_parser(node, fexpr, normal_arg_names, current_klass)
 
@@ -928,26 +936,26 @@
             # Have to create a version on the instances which automatically passes the
             # class as "self"
             altexpr = UU + class_name_ + ".prototype." + node.name
-            print >>self.output, "    "+altexpr + " = function() {"
-            print >>self.output, "        return " + fexpr + ".apply(this.__class__, arguments);"
-            print >>self.output, "    };"
-            print >>self.output, "    "+fexpr+".class_method = true;"
-            print >>self.output, "    "+altexpr+".instance_method = true;"
+            self.printo("    "+altexpr + " = function() {")
+            self.printo("        return " + fexpr + ".apply(this.__class__, arguments);")
+            self.printo("    };")
+            self.printo("    "+fexpr+".class_method = true;")
+            self.printo("    "+altexpr+".instance_method = true;")
         else:
             # For instance methods, we need an unbound version in the class object
             altexpr = UU + class_name_ + ".prototype.__class__." + node.name
-            print >>self.output, "    "+altexpr + " = function() {"
-            print >>self.output, "        return " + fexpr + ".call.apply("+fexpr+", arguments);"
-            print >>self.output, "    };"
-            print >>self.output, "    "+altexpr+".unbound_method = true;"
-            print >>self.output, "    "+fexpr+".instance_method = true;"
-            print >>self.output, "    "+altexpr+".__name__ = '%s';" % node.name
-
-        print >>self.output, UU + class_name_ + ".prototype.%s.__name__ = '%s';" % \
-                (node.name, node.name)
+            self.printo("    "+altexpr + " = function() {")
+            self.printo("        return " + fexpr + ".call.apply("+fexpr+", arguments);")
+            self.printo("    };")
+            self.printo("    "+altexpr+".unbound_method = true;")
+            self.printo("    "+fexpr+".instance_method = true;")
+            self.printo("    "+altexpr+".__name__ = '%s';" % node.name)
+
+        self.printo(UU + class_name_ + ".prototype.%s.__name__ = '%s';" %
+                    (node.name, node.name))
 
         if node.kwargs or len(node.defaults):
-            print >>self.output, "    "+altexpr + ".parse_kwargs = " + fexpr + ".parse_kwargs;"
+            self.printo("    "+altexpr + ".parse_kwargs = " + fexpr + ".parse_kwargs;")
 
         self.method_self = None
         self.method_imported_globals = set()
@@ -963,7 +971,7 @@
     def _stmt(self, node, current_klass):
         debugStmt = self.debug and not self._isNativeFunc(node)
         if debugStmt:
-            print >>self.output, '  try {'
+            self.printo('  try {')
 
         if isinstance(node, ast.Return):
             self._return(node, current_klass)
@@ -992,9 +1000,9 @@
         elif isinstance(node, ast.Function):
             self._function(node, True)
         elif isinstance(node, ast.Printnl):
-           self._print(node, current_klass)
+            self._print(node, current_klass)
         elif isinstance(node, ast.Print):
-           self._print(node, current_klass)
+            self._print(node, current_klass)
         elif isinstance(node, ast.TryExcept):
             self._tryExcept(node, current_klass)
         elif isinstance(node, ast.Raise):
@@ -1005,34 +1013,30 @@
         if debugStmt:
 
             lt = self.get_line_trace(node)
-
-            haltException = self.module_prefix + "HaltException"
             isHaltFunction = self.module_prefix + "IsHaltException"
 
-            print >>self.output, '  } catch (__err) {'
-            print >>self.output, '      if (' + isHaltFunction + '(__err.name)) {'
-            print >>self.output, '          throw __err;'
-            print >>self.output, '      } else {'
-            print >>self.output, "          st = sys.printstack() + "\
-                                                + '"%s"' % lt + "+ '\\n' ;"
-            print >>self.output, '          alert("' + "Error in " \
-                                                + lt + '"' \
-                                                + '+"\\n"+__err.name+": "+__err.message'\
-                                                + '+"\\n\\nStack trace:\\n"' \
-                                                + '+st' \
-                                                + ');'
-            print >>self.output, '          debugger;'
-
-            print >>self.output, '          throw new ' + self.module_prefix + "HaltException();"
-            print >>self.output, '      }'
-            print >>self.output, '  }'
-
+            out = (
+                '  } catch (__err) {',
+                '      if (' + isHaltFunction + '(__err.name)) {',
+                '          throw __err;',
+                '      } else {',
+                '          st = sys.printstack() + ' + '"%s"' % lt + "+ '\\n' ;"
+                '          alert("' + 'Error in ' + lt + '"' +
+                '+"\\n"+__err.name+": "+__err.message' +
+                '+"\\n\\nStack trace:\\n"' + '+st' + ');',
+                '          debugger;',
+                '          throw new ' + self.module_prefix + 'HaltException();',
+                '      }',
+                '  }'
+            )
+            for s in out:
+                self.printo(s)
 
     def get_line_trace(self, node):
         lineNum = "Unknown"
         srcLine = ""
         if hasattr(node, "lineno"):
-            if node.lineno != None:
+            if node.lineno is not None:
                 lineNum = node.lineno
                 srcLine = self.src[min(lineNum, len(self.src))-1]
                 srcLine = srcLine.replace('\\', '\\\\')
@@ -1040,9 +1044,9 @@
                 srcLine = srcLine.replace("'", "\\'")
 
         return self.raw_module_name + ".py, line " \
-               + str(lineNum) + ":"\
-               + "\\n" \
-               + "    " + srcLine
+            + str(lineNum) + ":"\
+            + "\\n" \
+            + "    " + srcLine
 
     def _augassign(self, node, current_klass):
         v = node.node
@@ -1054,17 +1058,16 @@
             lhs = self._name(node.node, current_klass)
         op = node.op
         rhs = self.expr(node.expr, current_klass)
-        print >>self.output, "    " + lhs + " " + op + " " + rhs + ";"
-
-
-    def _assign(self, node, current_klass, top_level = False):
+        self.printo("    " + lhs + " " + op + " " + rhs + ";")
+
+    def _assign(self, node, current_klass, top_level=False):
         if len(node.nodes) != 1:
             tempvar = '__temp'+str(node.lineno)
             tnode = ast.Assign([ast.AssName(tempvar, "OP_ASSIGN", node.lineno)], node.expr, node.lineno)
             self._assign(tnode, current_klass, top_level)
             for v in node.nodes:
-               tnode2 = ast.Assign([v], ast.Name(tempvar, node.lineno), node.lineno)
-               self._assign(tnode2, current_klass, top_level)
+                tnode2 = ast.Assign([v], ast.Name(tempvar, node.lineno), node.lineno)
+                self._assign(tnode2, current_klass, top_level)
             return
 
         local_var_names = None
@@ -1074,7 +1077,6 @@
         def _lhsFromAttr(v, current_klass):
             attr_name = v.attrname
             if isinstance(v.expr, ast.Name):
-                obj = v.expr.name
                 lhs = self._name(v.expr, current_klass) + "." + attr_name
             elif isinstance(v.expr, ast.Getattr):
                 lhs = self._getattr(v, current_klass)
@@ -1093,7 +1095,7 @@
                     self.top_level_vars.add(v.name)
                     vname = self.modpfx() + v.name
                     if not self.modpfx() and v.name not in\
-                           self.method_imported_globals:
+                       self.method_imported_globals:
                         lhs = "var " + vname
                     else:
                         lhs = UU + vname
@@ -1130,7 +1132,7 @@
                     raise TranslationError("must have one sub (in _assign)", v)
                 idx = self.expr(v.subs[0], current_klass)
                 value = self.expr(node.expr, current_klass)
-                print >>self.output, "    " + obj + ".__setitem__(" + idx + ", " + value + ");"
+                self.printo("    " + obj + ".__setitem__(" + idx + ", " + value + ");")
                 return
             else:
                 raise TranslationError("unsupported flag (in _assign)", v)
@@ -1138,9 +1140,8 @@
             uniqueID = self.nextTupleAssignID
             self.nextTupleAssignID += 1
             tempName = "__tupleassign" + str(uniqueID) + "__"
-            print >>self.output, "    var " + tempName + " = " + \
-                                 self.expr(node.expr, current_klass) + ";"
-            for index,child in enumerate(v.getChildNodes()):
+            self.printo("    var " + tempName + " = " + self.expr(node.expr, current_klass) + ";")
+            for index, child in enumerate(v.getChildNodes()):
                 rhs = tempName + ".__getitem__(" + str(index) + ")"
 
                 if isinstance(child, ast.AssAttr):
@@ -1155,51 +1156,48 @@
                                                    "(in _assign)", child)
                         idx = self.expr(child.subs[0], current_klass)
                         value = self.expr(node.expr, current_klass)
-                        print >>self.output, "    " + obj + ".__setitem__(" \
-                                           + idx + ", " + rhs + ");"
+                        self.printo("    " + obj + ".__setitem__(" + idx + ", " + rhs + ");")
                         continue
-                print >>self.output, "    " + lhs + " = " + rhs + ";"
+                self.printo("    " + lhs + " = " + rhs + ";")
             return
         else:
             raise TranslationError("unsupported type (in _assign)", v)
 
         rhs = self.expr(node.expr, current_klass)
         if dbg:
-            print "b", repr(node.expr), rhs
-        print >>self.output, "    " + lhs + " " + op + " " + rhs + ";"
-
+            print("b", repr(node.expr), rhs)
+        self.printo("    " + lhs + " " + op + " " + rhs + ";")
 
     def _discard(self, node, current_klass):
-        
+
         if isinstance(node.expr, ast.CallFunc):
             debugStmt = self.debug and not self._isNativeFunc(node)
             if debugStmt and isinstance(node.expr.node, ast.Name) and \
                node.expr.node.name == 'import_wait':
-               debugStmt = False
+                debugStmt = False
             if debugStmt:
                 st = self.get_line_trace(node)
-                print >>self.output, "sys.addstack('%s');\n" % st
+                self.printo("sys.addstack('%s');\n" % st)
             if isinstance(node.expr.node, ast.Name) and node.expr.node.name == NATIVE_JS_FUNC_NAME:
                 if len(node.expr.args) != 1:
                     raise TranslationError("native javascript function %s must have one arg" % NATIVE_JS_FUNC_NAME, node.expr)
                 if not isinstance(node.expr.args[0], ast.Const):
                     raise TranslationError("native javascript function %s must have constant arg" % NATIVE_JS_FUNC_NAME, node.expr)
                 raw_js = node.expr.args[0].value
-                print >>self.output, raw_js
+                self.printo(raw_js)
             else:
                 expr = self._callfunc(node.expr, current_klass)
-                print >>self.output, "    " + expr + ";"
+                self.printo("    " + expr + ";")
 
             if debugStmt:
-                print >>self.output, "sys.popstack();\n"
+                self.printo("sys.popstack();\n")
 
         elif isinstance(node.expr, ast.Const):
-            if node.expr.value is not None: # Empty statements generate ignore None
-                print >>self.output, self._const(node.expr)
+            if node.expr.value is not None:  # Empty statements generate ignore None
+                self.printo(self._const(node.expr))
         else:
             raise TranslationError("unsupported type (in _discard)", node.expr)
 
-
     def _if(self, node, current_klass):
         for i in range(len(node.tests)):
             test, consequence = node.tests[i]
@@ -1217,14 +1215,13 @@
 
             self._if_test(keyword, test, consequence, current_klass)
 
-
     def _if_test(self, keyword, test, consequence, current_klass):
         if test:
             expr = self.expr(test, current_klass)
 
-            print >>self.output, "    " + keyword + " (pyjslib.bool(" + expr + ")) {"
-        else:
-            print >>self.output, "    " + keyword + " {"
+            self.printo("    " + keyword + " (pyjslib.bool(" + expr + ")) {")
+        else:
+            self.printo("    " + keyword + " {")
 
         if isinstance(consequence, ast.Stmt):
             for child in consequence.nodes:
@@ -1232,8 +1229,7 @@
         else:
             raise TranslationError("unsupported type (in _if_test)", consequence)
 
-        print >>self.output, "    }"
-
+        self.printo("    }")
 
     def _from(self, node):
         for name in node.names:
@@ -1248,7 +1244,6 @@
             else:
                 self.imported_classes[name[0]] = node.modname
 
-
     def _compare(self, node, current_klass):
         lhs = self.expr(node.expr, current_klass)
 
@@ -1272,7 +1267,6 @@
 
         return "(" + lhs + " " + op + " " + rhs + ")"
 
-
     def _not(self, node, current_klass):
         expr = self.expr(node.expr, current_klass)
 
@@ -1323,35 +1317,41 @@
         lhs = "var " + assign_name
         iterator_name = "__" + assign_name
 
-        print >>self.output, """
+        loc_dict = {
+            "iterator_name": iterator_name,
+            "list_expr": list_expr,
+            "lhs": lhs,
+            "op": op,
+            "assign_tuple": assign_tuple,
+        }
+
+        self.printo("""
         var %(iterator_name)s = %(list_expr)s.__iter__();
         try {
             while (true) {
                 %(lhs)s %(op)s %(iterator_name)s.next();
                 %(assign_tuple)s
-        """ % locals()
-        for node in node.body.nodes:
-            self._stmt(node, current_klass)
-        print >>self.output, """
+        """ % loc_dict)
+        for n in node.body.nodes:
+            self._stmt(n, current_klass)
+        self.printo("""
             }
         } catch (e) {
             if (e.__name__ != pyjslib.StopIteration.__name__) {
                 throw e;
             }
         }
-        """ % locals()
-
+        """)
 
     def _while(self, node, current_klass):
         test = self.expr(node.test, current_klass)
-        print >>self.output, "    while (pyjslib.bool(" + test + ")) {"
+        self.printo("    while (pyjslib.bool(" + test + ")) {")
         if isinstance(node.body, ast.Stmt):
             for child in node.body.nodes:
                 self._stmt(child, current_klass)
         else:
             raise TranslationError("unsupported type (in _while)", node.body)
-        print >>self.output, "    }"
-
+        self.printo("    }")
 
     def _const(self, node):
         if isinstance(node.value, int):
@@ -1360,9 +1360,9 @@
             return str(node.value)
         elif isinstance(node.value, basestring):
             v = node.value
-            if isinstance(node.value, unicode):
+            if isinstance(node.value, text):
                 v = v.encode('utf-8')
-            return  "String('%s')" % escapejs(v)
+            return "String('%s')" % escapejs(v)
         elif node.value is None:
             return "null"
         else:
@@ -1387,9 +1387,9 @@
         return self.expr(node.left, current_klass) + " * " + self.expr(node.right, current_klass)
 
     def _mod(self, node, current_klass):
-        if isinstance(node.left, ast.Const) and isinstance(node.left.value, StringType):
-           self.imported_js.add("sprintf.js") # Include the sprintf functionality if it is used
-           return "sprintf("+self.expr(node.left, current_klass) + ", " + self.expr(node.right, current_klass)+")"
+        if isinstance(node.left, ast.Const) and isinstance(node.left.value, str):
+            self.imported_js.add("sprintf.js")  # Include the sprintf functionality if it is used
+            return "sprintf("+self.expr(node.left, current_klass) + ", " + self.expr(node.right, current_klass)+")"
         return self.expr(node.left, current_klass) + " % " + self.expr(node.right, current_klass)
 
     def _invert(self, node, current_klass):
@@ -1404,7 +1404,7 @@
     def _bitshiftright(self, node, current_klass):
         return self.expr(node.left, current_klass) + " >>> " + self.expr(node.right, current_klass)
 
-    def _bitxor(self,node, current_klass):
+    def _bitxor(self, node, current_klass):
         return " ^ ".join([self.expr(child, current_klass) for child in node.nodes])
 
     def _bitor(self, node, current_klass):
@@ -1421,7 +1421,7 @@
 
     def _subscript_stmt(self, node, current_klass):
         if node.flags == "OP_DELETE":
-            print >>self.output, "    " + self.expr(node.expr, current_klass) + ".__delitem__(" + self.expr(node.subs[0], current_klass) + ");"
+            self.printo("    " + self.expr(node.expr, current_klass) + ".__delitem__(" + self.expr(node.subs[0], current_klass) + ");")
         else:
             raise TranslationError("unsupported flag (in _subscript)", node)
 
@@ -1444,26 +1444,26 @@
             raise TranslationError("varargs are not supported in Lambdas", node)
         if node.kwargs:
             raise TranslationError("kwargs are not supported in Lambdas", node)
-        res = cStringIO.StringIO()
+        res = cStringIO()
         arg_names = list(node.argnames)
         function_args = ", ".join(arg_names)
         for child in node.getChildNodes():
             expr = self.expr(child, None)
-        print >> res, "function (%s){" % function_args
+        print("function (%s){" % function_args, file=res)
         self._default_args_handler(node, arg_names, None,
                                    output=res)
-        print >> res, 'return %s;}' % expr
+        print('return %s;}' % expr, file=res)
         return res.getvalue()
 
     def _slice(self, node, current_klass):
         if node.flags == "OP_APPLY":
             lower = "null"
             upper = "null"
-            if node.lower != None:
+            if node.lower is not None:
                 lower = self.expr(node.lower, current_klass)
-            if node.upper != None:
+            if node.upper is not None:
                 upper = self.expr(node.upper, current_klass)
-            return  "pyjslib.slice(" + self.expr(node.expr, current_klass) + ", " + lower + ", " + upper + ")"
+            return "pyjslib.slice(" + self.expr(node.expr, current_klass) + ", " + lower + ", " + upper + ")"
         else:
             raise TranslationError("unsupported flag (in _slice)", node)
 
@@ -1499,7 +1499,7 @@
             return self._invert(node, current_klass)
         elif isinstance(node, ast.Bitand):
             return "("+self._bitand(node, current_klass)+")"
-        elif isinstance(node,ast.LeftShift):
+        elif isinstance(node, ast.LeftShift):
             return self._bitshiftleft(node, current_klass)
         elif isinstance(node, ast.RightShift):
             return self._bitshiftright(node, current_klass)
@@ -1531,21 +1531,18 @@
             raise TranslationError("unsupported type (in expr)", node)
 
 
-
-import cStringIO
-
 def translate(file_name, module_name, debug=False):
-    f = file(file_name, "r")
+    f = open(file_name, "r")
     src = f.read()
     f.close()
-    output = cStringIO.StringIO()
+    output = cStringIO()
     mod = compiler.parseFile(file_name)
-    t = Translator(module_name, module_name, module_name, src, debug, mod, output)
+    Translator(module_name, module_name, module_name, src, debug, mod, output)
     return output.getvalue()
 
 
-class PlatformParser:
-    def __init__(self, platform_dir = "", verbose=True):
+class PlatformParser(object):
+    def __init__(self, platform_dir="", verbose=True):
         self.platform_dir = platform_dir
         self.parse_cache = {}
         self.platform = ""
@@ -1557,7 +1554,7 @@
     def parseModule(self, module_name, file_name):
 
         importing = False
-        if not self.parse_cache.has_key(file_name):
+        if file_name not in self.parse_cache:
             importing = True
             mod = compiler.parseFile(file_name)
             self.parse_cache[file_name] = mod
@@ -1574,9 +1571,9 @@
 
         if self.verbose:
             if override:
-                print "Importing %s (Platform %s)" % (module_name, self.platform)
+                print("Importing %s (Platform %s)" % (module_name, self.platform))
             elif importing:
-                print "Importing %s" % (module_name)
+                print("Importing %s" % (module_name))
 
         return mod, override
 
@@ -1631,20 +1628,23 @@
         target.code = source.code
         target.argnames = source.argnames
         target.defaults = source.defaults
-        target.doc = source.doc # @@@ not sure we need to do this any more
+        target.doc = source.doc  # @@@ not sure we need to do this any more
+
 
 def dotreplace(fname):
     path, ext = os.path.splitext(fname)
     return path.replace(".", "/") + ext
 
-class AppTranslator:
-
-    def __init__(self, library_dirs=[], parser=None, dynamic=False,
+
+class AppTranslator(object):
+
+    def __init__(self, library_dirs=None, parser=None, dynamic=False,
                  optimize=False, verbose=True):
         self.extension = ".py"
         self.optimize = optimize
         self.library_modules = []
         self.overrides = {}
+        library_dirs = [] if library_dirs is None else library_dirs
         self.library_dirs = path + library_dirs
         self.dynamic = dynamic
         self.verbose = verbose
@@ -1667,7 +1667,7 @@
             if os.path.isfile(full_file_name):
                 return full_file_name
 
-            fnameinit, ext = os.path.splitext(file_name)
+            fnameinit, _ext = os.path.splitext(file_name)
             fnameinit = fnameinit + "/__init__.py"
 
             full_file_name = os.path.join(
@@ -1678,22 +1678,22 @@
         raise Exception("file not found: " + file_name)
 
     def _translate(self, module_name, is_app=True, debug=False,
-                   imported_js=set()):
+                   imported_js=None):
         if module_name not in self.library_modules:
             self.library_modules.append(module_name)
 
         file_name = self.findFile(module_name + self.extension)
 
-        output = cStringIO.StringIO()
-
-        f = file(file_name, "r")
+        output = cStringIO()
+
+        f = open(file_name, "r")
         src = f.read()
         f.close()
 
         mod, override = self.parser.parseModule(module_name, file_name)
         if override:
             override_name = "%s.%s" % (self.parser.platform.lower(),
-                                           module_name)
+                                       module_name)
             self.overrides[override_name] = override_name
         if is_app:
             mn = '__main__'
@@ -1704,74 +1704,77 @@
                        self.findFile)
 
         module_str = output.getvalue()
+        if imported_js is None:
+            imported_js = set()
         imported_js.update(set(t.imported_js))
         imported_modules_str = ""
         for module in t.imported_modules:
             if module not in self.library_modules:
                 self.library_modules.append(module)
-                #imported_js.update(set(t.imported_js))
-                #imported_modules_str += self._translate(
+                # imported_js.update(set(t.imported_js))
+                # imported_modules_str += self._translate(
                 #    module, False, debug=debug, imported_js=imported_js)
 
         return imported_modules_str + module_str
 
-
     def translate(self, module_name, is_app=True, debug=False,
-                  library_modules=[]):
-        app_code = cStringIO.StringIO()
-        lib_code = cStringIO.StringIO()
+                  library_modules=None):
+        app_code = cStringIO()
+        lib_code = cStringIO()
         imported_js = set()
         self.library_modules = []
         self.overrides = {}
-        for library in library_modules:
-            if library.endswith(".js"):
-                imported_js.add(library)
-                continue
-            self.library_modules.append(library)
-            if self.verbose:
-                print 'Including LIB', library
-            print >> lib_code, '\n//\n// BEGIN LIB '+library+'\n//\n'
-            print >> lib_code, self._translate(
-                library, False, debug=debug, imported_js=imported_js)
-
-            print >> lib_code, "/* initialize static library */"
-            print >> lib_code, "%s%s();\n" % (UU, library)
-
-            print >> lib_code, '\n//\n// END LIB '+library+'\n//\n'
+        if library_modules is not None:
+            for library in library_modules:
+                if library.endswith(".js"):
+                    imported_js.add(library)
+                    continue
+                self.library_modules.append(library)
+                if self.verbose:
+                    print('Including LIB', library)
+                print('\n//\n// BEGIN LIB '+library+'\n//\n', file=lib_code)
+                print(self._translate(library, False, debug=debug, imported_js=imported_js),
+                      file=lib_code)
+
+                print("/* initialize static library */", file=lib_code)
+                print("%s%s();\n" % (UU, library), file=lib_code)
+
+                print('\n//\n// END LIB '+library+'\n//\n', file=lib_code)
         if module_name:
-            print >> app_code, self._translate(
-                module_name, is_app, debug=debug, imported_js=imported_js)
+            print(self._translate(module_name, is_app, debug=debug, imported_js=imported_js),
+                  file=app_code)
         for js in imported_js:
-           path = self.findFile(js)
-           if os.path.isfile(path):
-              if self.verbose:
-                  print 'Including JS', js
-              print >> lib_code,  '\n//\n// BEGIN JS '+js+'\n//\n'
-              print >> lib_code, file(path).read()
-              print >> lib_code,  '\n//\n// END JS '+js+'\n//\n'
-           else:
-              print >>sys.stderr, 'Warning: Unable to find imported javascript:', js
+            path = self.findFile(js)
+            if os.path.isfile(path):
+                if self.verbose:
+                    print('Including JS', js)
+                print('\n//\n// BEGIN JS '+js+'\n//\n', file=lib_code)
+                print(open(path).read(), file=lib_code)
+                print('\n//\n// END JS '+js+'\n//\n', file=lib_code)
+            else:
+                print('Warning: Unable to find imported javascript:', js, file=sys.stderr)
         return lib_code.getvalue(), app_code.getvalue()
 
+
 usage = """
   usage: %s file_name [module_name]
 """
 
+
 def main():
-    import sys
-    if len(sys.argv)<2:
-        print >> sys.stderr, usage % sys.argv[0]
+    if len(sys.argv) < 2:
+        print(usage % sys.argv[0], file=sys.stderr)
         sys.exit(1)
     file_name = os.path.abspath(sys.argv[1])
     if not os.path.isfile(file_name):
-        print >> sys.stderr, "File not found %s" % file_name
+        print("File not found %s" % file_name, file=sys.stderr)
         sys.exit(1)
     if len(sys.argv) > 2:
         module_name = sys.argv[2]
     else:
         module_name = None
-    print translate(file_name, module_name),
+    print(translate(file_name, module_name), end="")
+
 
 if __name__ == "__main__":
     main()
-
--- a/svgui/svgui.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/svgui/svgui.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -22,34 +23,44 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
+import os
+import shutil
+
 import wx
-import os, sys, shutil
+from svgui.pyjs import translate
 
-from pyjs import translate
-
+import util.paths as paths
 from POULibrary import POULibrary
 from docutil import open_svg
 from py_ext import PythonFileCTNMixin
 
+
 class SVGUILibrary(POULibrary):
     def GetLibraryPath(self):
-        return os.path.join(os.path.split(__file__)[0], "pous.xml") 
+        return paths.AbsNeighbourFile(__file__, "pous.xml")
+
 
 class SVGUI(PythonFileCTNMixin):
 
     ConfNodeMethods = [
-        {"bitmap" : "ImportSVG",
-         "name" : _("Import SVG"),
-         "tooltip" : _("Import SVG"),
-         "method" : "_ImportSVG"},
-        {"bitmap" : "ImportSVG", # should be something different
-         "name" : _("Inkscape"),
-         "tooltip" : _("Create HMI"),
-         "method" : "_StartInkscape"},
+        {
+            "bitmap":    "ImportSVG",
+            "name":    _("Import SVG"),
+            "tooltip": _("Import SVG"),
+            "method":   "_ImportSVG"
+        },
+        {
+            "bitmap":    "ImportSVG",  # should be something different
+            "name":    _("Inkscape"),
+            "tooltip": _("Create HMI"),
+            "method":   "_StartInkscape"
+        },
     ]
 
     def ConfNodePath(self):
-        return os.path.join(os.path.dirname(__file__))
+        return paths.AbsDir(__file__)
 
     def _getSVGpath(self, project_path=None):
         if project_path is None:
@@ -58,7 +69,7 @@
         return os.path.join(project_path, "gui.svg")
 
     def _getSVGUIserverpath(self):
-        return os.path.join(os.path.dirname(__file__), "svgui_server.py")
+        return paths.AbsNeighbourFile(__file__, "svgui_server.py")
 
     def OnCTNSave(self, from_project_path=None):
         if from_project_path is not None:
@@ -68,21 +79,21 @@
 
     def CTNGenerate_C(self, buildpath, locations):
         """
-        Return C code generated by iec2c compiler 
+        Return C code generated by iec2c compiler
         when _generate_softPLC have been called
         @param locations: ignored
         @return: [(C_file_name, CFLAGS),...] , LDFLAGS_TO_APPEND
         """
-        
+
         current_location = self.GetCurrentLocation()
         # define a unique name for the generated C file
-        location_str = "_".join(map(lambda x:str(x), current_location))
-        
+        location_str = "_".join(map(str, current_location))
+
         res = ([], "", False)
-        
-        svgfile=self._getSVGpath()
+
+        svgfile = self._getSVGpath()
         if os.path.exists(svgfile):
-            res += (("gui.svg", file(svgfile,"rb")),)
+            res += (("gui.svg", open(svgfile, "rb")),)
 
         svguiserverfile = open(self._getSVGUIserverpath(), 'r')
         svguiservercode = svguiserverfile.read()
@@ -90,35 +101,35 @@
 
         svguilibpath = os.path.join(self._getBuildPath(), "svguilib.js")
         svguilibfile = open(svguilibpath, 'w')
-        svguilibfile.write(translate(os.path.join(os.path.dirname(__file__), "pyjs", "lib", "sys.py"), "sys"))
-        svguilibfile.write(open(os.path.join(os.path.dirname(__file__), "pyjs", "lib", "_pyjs.js"), 'r').read())
-        svguilibfile.write(translate(os.path.join(os.path.dirname(__file__), "pyjs", "lib", "pyjslib.py"), "pyjslib"))
-        svguilibfile.write(translate(os.path.join(os.path.dirname(__file__), "svguilib.py"), "svguilib"))
+        fpath = paths.AbsDir(__file__)
+        svguilibfile.write(translate(os.path.join(fpath, "pyjs", "lib", "sys.py"), "sys"))
+        svguilibfile.write(open(os.path.join(fpath, "pyjs", "lib", "_pyjs.js"), 'r').read())
+        svguilibfile.write(translate(os.path.join(fpath, "pyjs", "lib", "pyjslib.py"), "pyjslib"))
+        svguilibfile.write(translate(os.path.join(fpath, "svguilib.py"), "svguilib"))
         svguilibfile.write("pyjslib();\nsvguilib();\n")
-        svguilibfile.write(open(os.path.join(os.path.dirname(__file__), "pyjs", "lib", "json.js"), 'r').read())
-        svguilibfile.write(open(os.path.join(os.path.dirname(__file__), "livesvg.js"), 'r').read())
+        svguilibfile.write(open(os.path.join(fpath, "pyjs", "lib", "json.js"), 'r').read())
+        svguilibfile.write(open(os.path.join(fpath, "livesvg.js"), 'r').read())
         svguilibfile.close()
         jsmodules = {"LiveSVGPage": "svguilib.js"}
-        res += (("svguilib.js", file(svguilibpath,"rb")),)
-        
-        runtimefile_path = os.path.join(buildpath, "runtime_%s.py"%location_str)
+        res += (("svguilib.js", open(svguilibpath, "rb")),)
+
+        runtimefile_path = os.path.join(buildpath, "runtime_%s.py" % location_str)
         runtimefile = open(runtimefile_path, 'w')
-        runtimefile.write(svguiservercode % {"svgfile" : "gui.svg"})
+        runtimefile.write(svguiservercode % {"svgfile": "gui.svg"})
         runtimefile.write("""
 def _runtime_%(location)s_start():
     website.LoadHMI(%(svgui_class)s, %(jsmodules)s)
-    
+
 def _runtime_%(location)s_stop():
     website.UnLoadHMI()
-    
-""" % {"location": location_str,
-       "svgui_class": "SVGUI_HMI",
-       "jsmodules" : str(jsmodules),
-      })
+
+        """ % {"location": location_str,
+               "svgui_class": "SVGUI_HMI",
+               "jsmodules": str(jsmodules)})
         runtimefile.close()
-        
-        res += (("runtime_%s.py"%location_str, file(runtimefile_path,"rb")),)
-        
+
+        res += (("runtime_%s.py" % location_str, open(runtimefile_path, "rb")),)
+
         return res
 
     def _ImportSVG(self):
@@ -128,8 +139,8 @@
             if os.path.isfile(svgpath):
                 shutil.copy(svgpath, self._getSVGpath())
             else:
-                self.GetCTRoot().logger.write_error(_("No such SVG file: %s\n")%svgpath)
-        dialog.Destroy()  
+                self.GetCTRoot().logger.write_error(_("No such SVG file: %s\n") % svgpath)
+        dialog.Destroy()
 
     def _StartInkscape(self):
         svgfile = self._getSVGpath()
@@ -138,7 +149,7 @@
             dialog = wx.MessageDialog(self.GetCTRoot().AppFrame,
                                       _("You don't have write permissions.\nOpen Inkscape anyway ?"),
                                       _("Open Inkscape"),
-                                      wx.YES_NO|wx.ICON_QUESTION)
+                                      wx.YES_NO | wx.ICON_QUESTION)
             open_inkscape = dialog.ShowModal() == wx.ID_YES
             dialog.Destroy()
         if open_inkscape:
--- a/svgui/svgui_server.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/svgui/svgui_server.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,23 +22,30 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import os
+from builtins import str as text
 
-from nevow import rend, appserver, inevow, tags, loaders, athena
-import simplejson as json
+from nevow import tags, loaders
+import simplejson as json  # pylint: disable=import-error
+import runtime.NevowServer as NS
 
 svgfile = '%(svgfile)s'
 
 svguiWidgets = {}
 
 currentId = 0
+
+
 def getNewId():
     global currentId
     currentId += 1
     return currentId
 
-class SvguiWidget:
-    
+
+class SvguiWidget(object):
+
     def __init__(self, classname, id, **kwargs):
         self.classname = classname
         self.id = id
@@ -50,9 +57,9 @@
 
     def setinput(self, attrname, value):
         self.inputs[attrname] = value
-        
+
     def getinput(self, attrname, default=None):
-        if not self.inputs.has_key(attrname):
+        if attrname not in self.inputs:
             self.inputs[attrname] = default
         return self.inputs[attrname]
 
@@ -61,14 +68,14 @@
             self.outputs[attrname] = value
             self.changed = True
             self.RefreshInterface()
-        
+
     def updateoutputs(self, **kwargs):
         for attrname, value in kwargs.iteritems():
             if self.outputs.get(attrname) != value:
                 self.outputs[attrname] = value
                 self.changed = True
         self.RefreshInterface()
-        
+
     def RefreshInterface(self):
         interface = website.getHMI()
         if isinstance(interface, SVGUI_HMI) and self.changed and not self.inhibit:
@@ -77,75 +84,83 @@
             if d is not None:
                 self.inhibit = True
                 d.addCallback(self.InterfaceRefreshed)
-    
+
     def InterfaceRefreshed(self, result):
         self.inhibit = False
         if self.changed:
             self.RefreshInterface()
 
+
 def get_object_init_state(obj):
     # Convert objects to a dictionary of their representation
     attrs = obj.attrs.copy()
     attrs.update(obj.inputs)
-    d = { '__class__': obj.classname,
-          'id': obj.id,
-          'kwargs': json.dumps(attrs),
-          }
+    d = {
+        '__class__': obj.classname,
+        'id': obj.id,
+        'kwargs': json.dumps(attrs),
+    }
     return d
 
+
 def get_object_current_state(obj):
     # Convert objects to a dictionary of their representation
-    d = { '__class__': obj.classname,
-          'id': obj.id,
-          'kwargs': json.dumps(obj.outputs),
-          }
+    d = {
+        '__class__': obj.classname,
+        'id': obj.id,
+        'kwargs': json.dumps(obj.outputs),
+    }
     return d
 
+
 class SVGUI_HMI(website.PLCHMI):
     jsClass = u"LiveSVGPage.LiveSVGWidget"
-    
-    docFactory = loaders.stan(tags.div(render=tags.directive('liveElement'))[                                    
-                                         tags.xml(loaders.xmlfile(os.path.join(WorkingDir, svgfile))),
-                                         ])
-    
+
+    docFactory = loaders.stan(tags.div(render=tags.directive('liveElement'))[
+        tags.xml(loaders.xmlfile(os.path.join(NS.WorkingDir, svgfile))),
+    ])
+
     def HMIinitialisation(self):
         gadgets = []
         for gadget in svguiWidgets.values():
-            gadgets.append(unicode(json.dumps(gadget, default=get_object_init_state, indent=2), 'ascii'))
+            gadgets.append(text(json.dumps(gadget, default=get_object_init_state, indent=2), 'ascii'))
         d = self.callRemote('init', gadgets)
         d.addCallback(self.HMIinitialised)
-    
-    def sendData(self,data):
+
+    def sendData(self, data):
         if self.initialised:
-            return self.callRemote('receiveData',unicode(json.dumps(data, default=get_object_current_state, indent=2), 'ascii'))
+            return self.callRemote('receiveData', text(json.dumps(data, default=get_object_current_state, indent=2), 'ascii'))
         return None
-        
+
     def setattr(self, id, attrname, value):
         svguiWidgets[id].setinput(attrname, value)
 
+
 def createSVGUIControl(*args, **kwargs):
     id = getNewId()
     gad = SvguiWidget(args[0], id, **kwargs)
     svguiWidgets[id] = gad
-    gadget = [unicode(json.dumps(gad, default=get_object_init_state, indent=2), 'ascii')]
+    gadget = [text(json.dumps(gad, default=get_object_init_state, indent=2), 'ascii')]
     interface = website.getHMI()
     if isinstance(interface, SVGUI_HMI) and interface.initialised:
         interface.callRemote('init', gadget)
     return id
 
+
 def setAttr(id, attrname, value):
     gad = svguiWidgets.get(id, None)
     if gad is not None:
         gad.setoutput(attrname, value)
 
+
 def updateAttr(id, **kwargs):
     gad = svguiWidgets.get(id, None)
     if gad is not None:
         gad.updateoutput(**kwargs)
 
+
 def getAttr(id, attrname, default=None):
     gad = svguiWidgets.get(id, None)
     if gad is not None:
         return gad.getinput(attrname, default)
     return default
-
--- a/svgui/svguilib.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/svgui/svguilib.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,8 +22,12 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+# pylint: disable=old-style-class,undefined-variable
+
+
 class button:
-    
+
     def __init__(self, parent, id, args):
         self.parent = parent
         self.id = id
@@ -40,19 +44,19 @@
             self.up = not self.state
         else:
             self.up = True
-        
+
         # Add event on each element of the button
         if self.active:
             self.back_elt.addEventListener("mouseup", self, False)
             self.back_elt.addEventListener("mousedown", self, False)
             self.back_elt.addEventListener("mouseover", self, False)
             self.back_elt.addEventListener("mouseout", self, False)
-            
+
             self.sele_elt.addEventListener("mouseup", self, False)
             self.sele_elt.addEventListener("mousedown", self, False)
             self.sele_elt.addEventListener("mouseover", self, False)
             self.sele_elt.addEventListener("mouseout", self, False)
-        
+
         blockSVGElementDrag(self.back_elt)
         blockSVGElementDrag(self.sele_elt)
 
@@ -66,7 +70,7 @@
         else:
             self.sele_elt.removeAttribute("display")
             self.back_elt.setAttribute("display", "none")
-            
+
     def updateValues(self, values):
         if values.state != self.state:
             self.state = values.state
@@ -80,9 +84,9 @@
         if evt.type == "mousedown":
             evt.stopPropagation()
             setCurrentObject(self)
-            
+
             self.dragging = True
-            
+
             if self.toggle:
                 self.up = self.state
             else:
@@ -90,18 +94,18 @@
                 self.state = True
                 updateAttr(self.id, 'state', self.state)
             self.updateElements()
-        
+
         if isCurrentObject(self) and self.dragging:
             # Quand le bouton est survole
             if evt.type == "mouseover" and self.toggle:
                 self.up = self.state
                 self.updateElements()
-            
+
             # Quand le curseur quitte la zone du bouton
-            elif evt.type == "mouseout" and self.toggle:       
+            elif evt.type == "mouseout" and self.toggle:
                 self.up = not self.state
                 self.updateElements()
-            
+
             # Quand le bouton de la souris est relache
             elif evt.type == "mouseup":
                 evt.stopPropagation()
@@ -115,8 +119,9 @@
                     self.updateElements()
                 self.dragging = False
 
+
 class textControl:
-    
+
     def __init__(self, parent, id, args):
         self.parent = parent
         self.id = id
@@ -126,17 +131,15 @@
         else:
             self.text = ""
         self.updateElements()
-    
+
     def updateValues(self, values):
         if values.text != self.value:
             self.text = values.text
             updateAttr(self.id, 'text', self.text)
             self.updateElements()
-    
+
     def updateElements(self):
         self.back_elt.firstChild.firstChild.textContent = self.text
-    
+
     def handleEvent(self, evt):
         pass
-    
-
--- a/targets/Generic/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/Generic/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,7 +22,10 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 from ..toolchain_makefile import toolchain_makefile
 
+
 class Generic_target(toolchain_makefile):
     pass
--- a/targets/Linux/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/Linux/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,12 +22,17 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 from ..toolchain_gcc import toolchain_gcc
 
+
 class Linux_target(toolchain_gcc):
     dlopen_prefix = "./"
     extension = ".so"
+
     def getBuilderCFLAGS(self):
         return toolchain_gcc.getBuilderCFLAGS(self) + ["-fPIC"]
+
     def getBuilderLDFLAGS(self):
         return toolchain_gcc.getBuilderLDFLAGS(self) + ["-shared", "-lrt"]
--- a/targets/Linux/plc_Linux_main.c	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/Linux/plc_Linux_main.c	Mon Jan 07 13:50:39 2019 +0100
@@ -82,6 +82,10 @@
 
 int PLC_shutdown = 0;
 
+int ForceSaveRetainReq(void) {
+    return PLC_shutdown;
+}
+
 void PLC_thread_proc(void *arg)
 {
     while (!PLC_shutdown) {
@@ -117,7 +121,7 @@
     pthread_mutex_lock(&debug_wait_mutex);
     pthread_mutex_lock(&python_wait_mutex);
 
-    timer_create (CLOCK_REALTIME, &sigev, &PLC_timer);
+    timer_create (CLOCK_MONOTONIC, &sigev, &PLC_timer);
     if(  __init(argc,argv) == 0 ){
         PLC_SetTimer(common_ticktime__,common_ticktime__);
 
@@ -231,32 +235,3 @@
 {
     pthread_mutex_lock(&python_mutex);
 }
-
-void InitRetain(void)
-{
-}
-
-void CleanupRetain(void)
-{
-}
-
-int CheckRetainBuffer(void)
-{
-	return 1;
-}
-
-void ValidateRetainBuffer(void)
-{
-}
-
-void InValidateRetainBuffer(void)
-{
-}
-
-void Retain(unsigned int offset, unsigned int count, void *p)
-{
-}
-
-void Remind(unsigned int offset, unsigned int count, void *p)
-{
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/Linux/plc_Linux_main_retain.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,311 @@
+/*
+  This file is part of Beremiz, a Integrated Development Environment for
+  programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+
+  See COPYING.runtime
+
+  Copyright (C) 2018: Sergey Surkov <surkov.sv@summatechnology.ru>
+  Copyright (C) 2018: Andrey Skvortsov <andrej.skvortzov@gmail.com>
+
+*/
+
+#ifndef HAVE_RETAIN
+#include <stdio.h>
+#include <stdint.h>
+#include <unistd.h>
+#include "iec_types.h"
+
+int GetRetainSize(void);
+
+/* Retain buffer.  */
+FILE *retain_buffer;
+const char rb_file[]      = "retain_buffer_file";
+const char rb_file_bckp[] = "retain_buffer_file.bak";
+
+
+/* Retain header struct.  */
+struct retain_info_t {
+	uint32_t retain_size;
+	uint32_t hash_size;
+	uint8_t* hash;
+	uint32_t header_offset;
+	uint32_t header_crc;
+};
+
+/* Init retain info structure.  */
+struct retain_info_t retain_info;
+
+/* CRC lookup table and initial state.  */
+uint32_t crc32_table[256];
+uint32_t retain_crc;
+
+
+/* Generate CRC32 lookup table.  */
+void GenerateCRC32Table(void)
+{
+	unsigned int i, j;
+	/* Use CRC-32-IEEE 802.3 polynomial 0x04C11DB7 (bit reflected).  */
+	uint32_t poly = 0xEDB88320;
+
+	for (i = 0; i <= 0xFF; i++)
+	{
+		uint32_t c = i;
+		for (j = 0 ; j < 8 ; j++)
+			c = (c & 1) ? (c >> 1 ) ^ poly : (c >> 1);
+		crc32_table[i] = c;
+	}
+}
+
+
+/* Calculate CRC32 for len bytes from pointer buf with init starting value.  */
+uint32_t GenerateCRC32Sum(const void* buf, unsigned int len, uint32_t init)
+{
+	uint32_t crc = ~init;
+	unsigned char* current = (unsigned char*) buf;
+	while (len--)
+		crc = crc32_table[(crc ^ *current++) & 0xFF] ^ (crc >> 8);
+	return ~crc;
+}
+
+/* Calc CRC32 for retain file byte by byte.  */
+int CheckFileCRC(FILE* file_buffer)
+{
+	/* Set the magic constant for one-pass CRC calc according to ZIP CRC32.  */
+	const uint32_t magic_number = 0x2144df1c;
+
+	/* CRC initial state.  */
+	uint32_t calc_crc32 = 0;
+	char data_block = 0;
+
+	while(!feof(file_buffer)){
+		if (fread(&data_block, sizeof(data_block), 1, file_buffer))
+			calc_crc32 = GenerateCRC32Sum(&data_block, sizeof(char), calc_crc32);
+	}
+
+	/* Compare crc result with a magic number.  */
+	return (calc_crc32 == magic_number) ? 1 : 0;
+}
+
+/* Compare current hash with hash from file byte by byte.  */
+int CheckFilehash(void)
+{
+	int k;
+	int offset = sizeof(retain_info.retain_size);
+
+	rewind(retain_buffer);
+	fseek(retain_buffer, offset , SEEK_SET);
+
+	uint32_t size;
+	fread(&size, sizeof(size), 1, retain_buffer);
+	if (size != retain_info.hash_size)
+		return 0;
+
+	for(k = 0; k < retain_info.hash_size; k++){
+		uint8_t file_digit;
+		fread(&file_digit, sizeof(char), 1, retain_buffer);
+		if (file_digit != *(retain_info.hash+k))
+			return 0;
+	}
+
+	return 1;
+}
+
+void InitRetain(void)
+{
+	int i;
+
+	/* Generate CRC32 lookup table.  */
+	GenerateCRC32Table();
+
+	/* Get retain size in bytes */
+	retain_info.retain_size = GetRetainSize();
+
+	/* Hash stored in retain file as array of char in hex digits
+	   (that's why we divide strlen in two).  */
+	retain_info.hash_size = PLC_ID ? strlen(PLC_ID)/2 : 0;
+	//retain_info.hash_size = 0;
+	retain_info.hash = malloc(retain_info.hash_size);
+
+	/* Transform hash string into byte sequence.  */
+	for (i = 0; i < retain_info.hash_size; i++) {
+		int byte = 0;
+		sscanf((PLC_ID + i*2), "%02X", &byte);
+		retain_info.hash[i] = byte;
+	}
+
+	/* Calc header offset.  */
+	retain_info.header_offset = sizeof(retain_info.retain_size) + \
+		sizeof(retain_info.hash_size) + \
+		retain_info.hash_size;
+
+	/*  Set header CRC initial state.  */
+	retain_info.header_crc = 0;
+
+	/* Calc crc for header.  */
+	retain_info.header_crc = GenerateCRC32Sum(
+		&retain_info.retain_size,
+		sizeof(retain_info.retain_size),
+		retain_info.header_crc);
+
+	retain_info.header_crc = GenerateCRC32Sum(
+		&retain_info.hash_size,
+		sizeof(retain_info.hash_size),
+		retain_info.header_crc);
+
+	retain_info.header_crc = GenerateCRC32Sum(
+		retain_info.hash,
+		retain_info.hash_size,
+		retain_info.header_crc);
+}
+
+void CleanupRetain(void)
+{
+	/* Free hash memory.  */
+	free(retain_info.hash);
+}
+
+int CheckRetainFile(const char * file)
+{
+	retain_buffer = fopen(file, "rb");
+	if (retain_buffer) {
+		/* Check CRC32 and hash.  */
+		if (CheckFileCRC(retain_buffer))
+			if (CheckFilehash())
+				return 1;
+		fclose(retain_buffer);
+		retain_buffer = NULL;
+	}
+	return 0;
+}
+
+int CheckRetainBuffer(void)
+{
+	retain_buffer = NULL;
+	if (!retain_info.retain_size)
+		return 1;
+
+	/* Check latest retain file.  */
+	if (CheckRetainFile(rb_file))
+		return 1;
+
+	/* Check if we have backup.  */
+	if (CheckRetainFile(rb_file_bckp))
+		return 1;
+
+	/* We don't have any valid retain buffer - nothing to remind.  */
+	return 0;
+}
+
+#ifndef FILE_RETAIN_SAVE_PERIOD_S
+#define FILE_RETAIN_SAVE_PERIOD_S 1.0
+#endif
+
+static double CalcDiffSeconds(IEC_TIME* t1, IEC_TIME *t2)
+{
+	IEC_TIME dt ={
+		t1->tv_sec  - t2->tv_sec,
+		t1->tv_nsec - t2->tv_nsec
+	};
+
+	if ((dt.tv_nsec < -1000000000) || ((dt.tv_sec > 0) && (dt.tv_nsec < 0))){
+		dt.tv_sec--;
+		dt.tv_nsec += 1000000000;
+	}
+	if ((dt.tv_nsec > +1000000000) || ((dt.tv_sec < 0) && (dt.tv_nsec > 0))){
+		dt.tv_sec++;
+		dt.tv_nsec -= 1000000000;
+	}
+	return dt.tv_sec + 1e-9*dt.tv_nsec;
+}
+
+
+int RetainSaveNeeded(void)
+{
+	int ret = 0;
+	static IEC_TIME last_save;
+	IEC_TIME now;
+	double diff_s;
+
+	/* no retain */
+	if (!retain_info.retain_size)
+		return 0;
+
+	/* periodic retain flush to avoid high I/O load */
+	PLC_GetTime(&now);
+
+	diff_s = CalcDiffSeconds(&now, &last_save);
+
+	if ((diff_s > FILE_RETAIN_SAVE_PERIOD_S) || ForceSaveRetainReq()) {
+		ret = 1;
+		last_save = now;
+	}
+	return ret;
+}
+
+void ValidateRetainBuffer(void)
+{
+	if (!retain_buffer)
+		return;
+
+	/* Add retain data CRC to the end of buffer file.  */
+	fseek(retain_buffer, 0, SEEK_END);
+	fwrite(&retain_crc, sizeof(uint32_t), 1, retain_buffer);
+
+	/* Sync file buffer and close file.  */
+#ifdef __WIN32
+	fflush(retain_buffer);
+#else
+	fsync(fileno(retain_buffer));
+#endif
+
+	fclose(retain_buffer);
+	retain_buffer = NULL;
+}
+
+void InValidateRetainBuffer(void)
+{
+	if (!RetainSaveNeeded())
+		return;
+
+	/* Rename old retain file into *.bak if it exists.  */
+	rename(rb_file, rb_file_bckp);
+
+	/* Set file CRC initial value.  */
+	retain_crc = retain_info.header_crc;
+
+	/* Create new retain file.  */
+	retain_buffer = fopen(rb_file, "wb+");
+	if (!retain_buffer) {
+		fprintf(stderr, "Failed to create retain file : %s\n", rb_file);
+		return;
+	}
+
+	/* Write header to the new file.  */
+	fwrite(&retain_info.retain_size,
+		sizeof(retain_info.retain_size), 1, retain_buffer);
+	fwrite(&retain_info.hash_size,
+		sizeof(retain_info.hash_size),   1, retain_buffer);
+	fwrite(retain_info.hash ,
+		sizeof(char), retain_info.hash_size, retain_buffer);
+}
+
+void Retain(unsigned int offset, unsigned int count, void *p)
+{
+	if (!retain_buffer)
+		return;
+
+	/* Generate CRC 32 for each data block.  */
+	retain_crc = GenerateCRC32Sum(p, count, retain_crc);
+
+	/* Save current var in file.  */
+	fseek(retain_buffer, retain_info.header_offset+offset, SEEK_SET);
+	fwrite(p, count, 1, retain_buffer);
+}
+
+void Remind(unsigned int offset, unsigned int count, void *p)
+{
+	/* Remind variable from file.  */
+	fseek(retain_buffer, retain_info.header_offset+offset, SEEK_SET);
+	fread((void *)p, count, 1, retain_buffer);
+}
+#endif // !HAVE_RETAIN
--- a/targets/Win32/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/Win32/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,10 +22,14 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 from ..toolchain_gcc import toolchain_gcc
 
+
 class Win32_target(toolchain_gcc):
     dlopen_prefix = ""
     extension = ".dll"
+
     def getBuilderLDFLAGS(self):
         return toolchain_gcc.getBuilderLDFLAGS(self) + ["-shared", "-lwinmm"]
--- a/targets/Win32/plc_Win32_main.c	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/Win32/plc_Win32_main.c	Mon Jan 07 13:50:39 2019 +0100
@@ -54,11 +54,19 @@
     }
 }
 
+int PLC_shutdown;
+
+int ForceSaveRetainReq(void) {
+    return PLC_shutdown;
+}
+
 /* Variable used to stop plcloop thread */
 void PlcLoop()
 {
-    while(WaitForSingleObject(PLC_timer, INFINITE) == WAIT_OBJECT_0)
-    {
+    PLC_shutdown = 0;
+    while(!PLC_shutdown) {
+        if (WaitForSingleObject(PLC_timer, INFINITE) != WAIT_OBJECT_0)
+            PLC_shutdown = 1;
         PLC_timer_notify();
     }
 }
@@ -241,41 +249,6 @@
 	WaitForSingleObject(python_sem, INFINITE);
 }
 
-void InitRetain(void)
-{
-}
-
-void CleanupRetain(void)
-{
-}
-
-int CheckRetainBuffer(void)
-{
-	return 1;
-}
-
-void ValidateRetainBuffer(void)
-{
-}
-
-void InValidateRetainBuffer(void)
-{
-}
-
-void Retain(unsigned int offset, unsigned int count, void * p)
-{
-    /*
-    unsigned int position;
-    for(position=0; position<count; position++ ){
-        printf("%d : 0x%2.2x\n", offset+position, ((char*)p)[position]);
-    }
-    */
-}
-
-void Remind(unsigned int offset, unsigned int count, void *p)
-{
-}
-
 static void __attribute__((constructor))
 beremiz_dll_init(void)
 {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/Win32/plc_Win32_main_retain.c	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,311 @@
+/*
+  This file is part of Beremiz, a Integrated Development Environment for
+  programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+
+  See COPYING.runtime
+
+  Copyright (C) 2018: Sergey Surkov <surkov.sv@summatechnology.ru>
+  Copyright (C) 2018: Andrey Skvortsov <andrej.skvortzov@gmail.com>
+
+*/
+
+#ifndef HAVE_RETAIN
+#include <stdio.h>
+#include <stdint.h>
+#include <unistd.h>
+#include "iec_types.h"
+
+int GetRetainSize(void);
+
+/* Retain buffer.  */
+FILE *retain_buffer;
+const char rb_file[]      = "retain_buffer_file";
+const char rb_file_bckp[] = "retain_buffer_file.bak";
+
+
+/* Retain header struct.  */
+struct retain_info_t {
+	uint32_t retain_size;
+	uint32_t hash_size;
+	uint8_t* hash;
+	uint32_t header_offset;
+	uint32_t header_crc;
+};
+
+/* Init retain info structure.  */
+struct retain_info_t retain_info;
+
+/* CRC lookup table and initial state.  */
+uint32_t crc32_table[256];
+uint32_t retain_crc;
+
+
+/* Generate CRC32 lookup table.  */
+void GenerateCRC32Table(void)
+{
+	unsigned int i, j;
+	/* Use CRC-32-IEEE 802.3 polynomial 0x04C11DB7 (bit reflected).  */
+	uint32_t poly = 0xEDB88320;
+
+	for (i = 0; i <= 0xFF; i++)
+	{
+		uint32_t c = i;
+		for (j = 0 ; j < 8 ; j++)
+			c = (c & 1) ? (c >> 1 ) ^ poly : (c >> 1);
+		crc32_table[i] = c;
+	}
+}
+
+
+/* Calculate CRC32 for len bytes from pointer buf with init starting value.  */
+uint32_t GenerateCRC32Sum(const void* buf, unsigned int len, uint32_t init)
+{
+	uint32_t crc = ~init;
+	unsigned char* current = (unsigned char*) buf;
+	while (len--)
+		crc = crc32_table[(crc ^ *current++) & 0xFF] ^ (crc >> 8);
+	return ~crc;
+}
+
+/* Calc CRC32 for retain file byte by byte.  */
+int CheckFileCRC(FILE* file_buffer)
+{
+	/* Set the magic constant for one-pass CRC calc according to ZIP CRC32.  */
+	const uint32_t magic_number = 0x2144df1c;
+
+	/* CRC initial state.  */
+	uint32_t calc_crc32 = 0;
+	char data_block = 0;
+
+	while(!feof(file_buffer)){
+		if (fread(&data_block, sizeof(data_block), 1, file_buffer))
+			calc_crc32 = GenerateCRC32Sum(&data_block, sizeof(data_block), calc_crc32);
+	}
+
+	/* Compare crc result with a magic number.  */
+	return (calc_crc32 == magic_number) ? 1 : 0;
+}
+
+/* Compare current hash with hash from file byte by byte.  */
+int CheckFilehash(void)
+{
+	unsigned int k;
+	int offset = sizeof(retain_info.retain_size);
+
+	rewind(retain_buffer);
+	fseek(retain_buffer, offset , SEEK_SET);
+
+	uint32_t size;
+	fread(&size, sizeof(size), 1, retain_buffer);
+	if (size != retain_info.hash_size)
+		return 0;
+
+	for(k = 0; k < retain_info.hash_size; k++){
+		uint8_t file_digit;
+		fread(&file_digit, sizeof(file_digit), 1, retain_buffer);
+		if (file_digit != *(retain_info.hash+k))
+			return 0;
+	}
+
+	return 1;
+}
+
+void InitRetain(void)
+{
+	unsigned int i;
+
+	/* Generate CRC32 lookup table.  */
+	GenerateCRC32Table();
+
+	/* Get retain size in bytes */
+	retain_info.retain_size = GetRetainSize();
+
+	/* Hash stored in retain file as array of char in hex digits
+	   (that's why we divide strlen in two).  */
+	retain_info.hash_size = PLC_ID ? strlen(PLC_ID)/2 : 0;
+	//retain_info.hash_size = 0;
+	retain_info.hash = malloc(retain_info.hash_size);
+
+	/* Transform hash string into byte sequence.  */
+	for (i = 0; i < retain_info.hash_size; i++) {
+		int byte = 0;
+		sscanf((PLC_ID + i*2), "%02X", &byte);
+		retain_info.hash[i] = byte;
+	}
+
+	/* Calc header offset.  */
+	retain_info.header_offset = sizeof(retain_info.retain_size) + \
+		sizeof(retain_info.hash_size) + \
+		retain_info.hash_size;
+
+	/*  Set header CRC initial state.  */
+	retain_info.header_crc = 0;
+
+	/* Calc crc for header.  */
+	retain_info.header_crc = GenerateCRC32Sum(
+		&retain_info.retain_size,
+		sizeof(retain_info.retain_size),
+		retain_info.header_crc);
+
+	retain_info.header_crc = GenerateCRC32Sum(
+		&retain_info.hash_size,
+		sizeof(retain_info.hash_size),
+		retain_info.header_crc);
+
+	retain_info.header_crc = GenerateCRC32Sum(
+		retain_info.hash,
+		retain_info.hash_size,
+		retain_info.header_crc);
+}
+
+void CleanupRetain(void)
+{
+	/* Free hash memory.  */
+	free(retain_info.hash);
+}
+
+int CheckRetainFile(const char * file)
+{
+	retain_buffer = fopen(file, "rb");
+	if (retain_buffer) {
+		/* Check CRC32 and hash.  */
+		if (CheckFileCRC(retain_buffer))
+			if (CheckFilehash())
+				return 1;
+		fclose(retain_buffer);
+		retain_buffer = NULL;
+	}
+	return 0;
+}
+
+int CheckRetainBuffer(void)
+{
+	retain_buffer = NULL;
+	if (!retain_info.retain_size)
+		return 1;
+
+	/* Check latest retain file.  */
+	if (CheckRetainFile(rb_file))
+		return 1;
+
+	/* Check if we have backup.  */
+	if (CheckRetainFile(rb_file_bckp))
+		return 1;
+
+	/* We don't have any valid retain buffer - nothing to remind.  */
+	return 0;
+}
+
+#ifndef FILE_RETAIN_SAVE_PERIOD_S
+#define FILE_RETAIN_SAVE_PERIOD_S 1.0
+#endif
+
+static double CalcDiffSeconds(IEC_TIME* t1, IEC_TIME *t2)
+{
+	IEC_TIME dt ={
+		t1->tv_sec  - t2->tv_sec,
+		t1->tv_nsec - t2->tv_nsec
+	};
+
+	if ((dt.tv_nsec < -1000000000) || ((dt.tv_sec > 0) && (dt.tv_nsec < 0))){
+		dt.tv_sec--;
+		dt.tv_nsec += 1000000000;
+	}
+	if ((dt.tv_nsec > +1000000000) || ((dt.tv_sec < 0) && (dt.tv_nsec > 0))){
+		dt.tv_sec++;
+		dt.tv_nsec -= 1000000000;
+	}
+	return dt.tv_sec + 1e-9*dt.tv_nsec;
+}
+
+
+int RetainSaveNeeded(void)
+{
+	int ret = 0;
+	static IEC_TIME last_save;
+	IEC_TIME now;
+	double diff_s;
+
+	/* no retain */
+	if (!retain_info.retain_size)
+		return 0;
+
+	/* periodic retain flush to avoid high I/O load */
+	PLC_GetTime(&now);
+
+	diff_s = CalcDiffSeconds(&now, &last_save);
+
+	if ((diff_s > FILE_RETAIN_SAVE_PERIOD_S) || ForceSaveRetainReq()) {
+		ret = 1;
+		last_save = now;
+	}
+	return ret;
+}
+
+void ValidateRetainBuffer(void)
+{
+	if (!retain_buffer)
+		return;
+
+	/* Add retain data CRC to the end of buffer file.  */
+	fseek(retain_buffer, 0, SEEK_END);
+	fwrite(&retain_crc, sizeof(retain_crc), 1, retain_buffer);
+
+	/* Sync file buffer and close file.  */
+#ifdef __WIN32
+	fflush(retain_buffer);
+#else
+	fsync(fileno(retain_buffer));
+#endif
+
+	fclose(retain_buffer);
+	retain_buffer = NULL;
+}
+
+void InValidateRetainBuffer(void)
+{
+	if (!RetainSaveNeeded())
+		return;
+
+	/* Rename old retain file into *.bak if it exists.  */
+	rename(rb_file, rb_file_bckp);
+
+	/* Set file CRC initial value.  */
+	retain_crc = retain_info.header_crc;
+
+	/* Create new retain file.  */
+	retain_buffer = fopen(rb_file, "wb+");
+	if (!retain_buffer) {
+		fprintf(stderr, "Failed to create retain file : %s\n", rb_file);
+		return;
+	}
+
+	/* Write header to the new file.  */
+	fwrite(&retain_info.retain_size,
+		sizeof(retain_info.retain_size), 1, retain_buffer);
+	fwrite(&retain_info.hash_size,
+		sizeof(retain_info.hash_size),   1, retain_buffer);
+	fwrite(retain_info.hash ,
+		sizeof(char), retain_info.hash_size, retain_buffer);
+}
+
+void Retain(unsigned int offset, unsigned int count, void *p)
+{
+	if (!retain_buffer)
+		return;
+
+	/* Generate CRC 32 for each data block.  */
+	retain_crc = GenerateCRC32Sum(p, count, retain_crc);
+
+	/* Save current var in file.  */
+	fseek(retain_buffer, retain_info.header_offset+offset, SEEK_SET);
+	fwrite(p, count, 1, retain_buffer);
+}
+
+void Remind(unsigned int offset, unsigned int count, void *p)
+{
+	/* Remind variable from file.  */
+	fseek(retain_buffer, retain_info.header_offset+offset, SEEK_SET);
+	fread((void *)p, count, 1, retain_buffer);
+}
+#endif // !HAVE_RETAIN
--- a/targets/Xenomai/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/Xenomai/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,24 +22,28 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 from ..toolchain_gcc import toolchain_gcc
 
+
 class Xenomai_target(toolchain_gcc):
     dlopen_prefix = "./"
     extension = ".so"
+
     def getXenoConfig(self, flagsname):
         """ Get xeno-config from target parameters """
-        xeno_config=self.CTRInstance.GetTarget().getcontent().getXenoConfig()
+        xeno_config = self.CTRInstance.GetTarget().getcontent().getXenoConfig()
         if xeno_config:
             from util.ProcessLogger import ProcessLogger
-            status, result, err_result = ProcessLogger(self.CTRInstance.logger,
-                                                       xeno_config + " --skin=native --"+flagsname,
-                                                       no_stdout=True).spin()
+            status, result, _err_result = ProcessLogger(self.CTRInstance.logger,
+                                                        xeno_config + " --skin=posix --skin=alchemy --no-auto-init --"+flagsname,
+                                                        no_stdout=True).spin()
             if status:
-                self.CTRInstance.logger.write_error(_("Unable to get Xenomai's %s \n")%flagsname)
+                self.CTRInstance.logger.write_error(_("Unable to get Xenomai's %s \n") % flagsname)
             return [result.strip()]
         return []
-    
+
     def getBuilderLDFLAGS(self):
         xeno_ldflags = self.getXenoConfig("ldflags")
         return toolchain_gcc.getBuilderLDFLAGS(self) + xeno_ldflags + ["-shared"]
@@ -47,4 +51,3 @@
     def getBuilderCFLAGS(self):
         xeno_cflags = self.getXenoConfig("cflags")
         return toolchain_gcc.getBuilderCFLAGS(self) + xeno_cflags + ["-fPIC"]
-        
--- a/targets/Xenomai/plc_Xenomai_main.c	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/Xenomai/plc_Xenomai_main.c	Mon Jan 07 13:50:39 2019 +0100
@@ -11,10 +11,10 @@
 #include <sys/mman.h>
 #include <sys/fcntl.h>
 
-#include <native/task.h>
-#include <native/timer.h>
-#include <native/sem.h>
-#include <native/pipe.h>
+#include <alchemy/task.h>
+#include <alchemy/timer.h>
+#include <alchemy/sem.h>
+#include <alchemy/pipe.h>
 
 unsigned int PLC_state = 0;
 #define PLC_STATE_TASK_CREATED                 1
@@ -37,6 +37,15 @@
 #define PYTHON_PIPE_MINOR            3
 #define PIPE_SIZE                    1 
 
+// rt-pipes commands
+
+#define PYTHON_PENDING_COMMAND 1
+#define PYTHON_FINISH 2
+
+#define DEBUG_FINISH 2
+
+#define DEBUG_PENDING_DATA 1
+#define DEBUG_UNLOCK 1
 
 long AtomicCompareExchange(long* atomicvar,long compared, long exchange)
 {
@@ -82,6 +91,18 @@
         if (PLC_shutdown) break;
         rt_task_wait_period(NULL);
     }
+    /* since xenomai 3 it is not enough to close() 
+       file descriptor to unblock read()... */
+    {
+        /* explicitely finish python thread */
+        char msg = PYTHON_FINISH;
+        rt_pipe_write(&WaitPython_pipe, &msg, sizeof(msg), P_NORMAL);
+    }
+    {
+        /* explicitely finish debug thread */
+        char msg = DEBUG_FINISH;
+        rt_pipe_write(&WaitDebug_pipe, &msg, sizeof(msg), P_NORMAL);
+    }
 }
 
 static unsigned long __debug_tick;
@@ -159,6 +180,15 @@
     exit(0);
 }
 
+#define _startPLCLog(text) \
+    {\
+    	char mstr[] = text;\
+        LogMessage(LOG_CRITICAL, mstr, sizeof(mstr));\
+        goto error;\
+    }
+
+#define FO "Failed opening "
+
 #define max_val(a,b) ((a>b)?a:b)
 int startPLC(int argc,char **argv)
 {
@@ -171,49 +201,55 @@
 
     /*** RT Pipes creation and opening ***/
     /* create Debug_pipe */
-    if(rt_pipe_create(&Debug_pipe, "Debug_pipe", DEBUG_PIPE_MINOR, PIPE_SIZE)) 
-        goto error;
+    if(rt_pipe_create(&Debug_pipe, "Debug_pipe", DEBUG_PIPE_MINOR, PIPE_SIZE) < 0) 
+        _startPLCLog(FO "Debug_pipe real-time end");
     PLC_state |= PLC_STATE_DEBUG_PIPE_CREATED;
 
     /* open Debug_pipe*/
-    if((Debug_pipe_fd = open(DEBUG_PIPE_DEVICE, O_RDWR)) == -1) goto error;
+    if((Debug_pipe_fd = open(DEBUG_PIPE_DEVICE, O_RDWR)) == -1)
+        _startPLCLog(FO DEBUG_PIPE_DEVICE);
     PLC_state |= PLC_STATE_DEBUG_FILE_OPENED;
 
     /* create Python_pipe */
-    if(rt_pipe_create(&Python_pipe, "Python_pipe", PYTHON_PIPE_MINOR, PIPE_SIZE)) 
-        goto error;
+    if(rt_pipe_create(&Python_pipe, "Python_pipe", PYTHON_PIPE_MINOR, PIPE_SIZE) < 0) 
+        _startPLCLog(FO "Python_pipe real-time end");
     PLC_state |= PLC_STATE_PYTHON_PIPE_CREATED;
 
     /* open Python_pipe*/
-    if((Python_pipe_fd = open(PYTHON_PIPE_DEVICE, O_RDWR)) == -1) goto error;
+    if((Python_pipe_fd = open(PYTHON_PIPE_DEVICE, O_RDWR)) == -1)
+        _startPLCLog(FO PYTHON_PIPE_DEVICE);
     PLC_state |= PLC_STATE_PYTHON_FILE_OPENED;
 
     /* create WaitDebug_pipe */
-    if(rt_pipe_create(&WaitDebug_pipe, "WaitDebug_pipe", WAITDEBUG_PIPE_MINOR, PIPE_SIZE))
-        goto error;
+    if(rt_pipe_create(&WaitDebug_pipe, "WaitDebug_pipe", WAITDEBUG_PIPE_MINOR, PIPE_SIZE) < 0)
+        _startPLCLog(FO "WaitDebug_pipe real-time end");
     PLC_state |= PLC_STATE_WAITDEBUG_PIPE_CREATED;
 
     /* open WaitDebug_pipe*/
-    if((WaitDebug_pipe_fd = open(WAITDEBUG_PIPE_DEVICE, O_RDWR)) == -1) goto error;
+    if((WaitDebug_pipe_fd = open(WAITDEBUG_PIPE_DEVICE, O_RDWR)) == -1)
+        _startPLCLog(FO WAITDEBUG_PIPE_DEVICE);
     PLC_state |= PLC_STATE_WAITDEBUG_FILE_OPENED;
 
     /* create WaitPython_pipe */
-    if(rt_pipe_create(&WaitPython_pipe, "WaitPython_pipe", WAITPYTHON_PIPE_MINOR, PIPE_SIZE))
-        goto error;
+    if(rt_pipe_create(&WaitPython_pipe, "WaitPython_pipe", WAITPYTHON_PIPE_MINOR, PIPE_SIZE) < 0)
+        _startPLCLog(FO "WaitPython_pipe real-time end");
     PLC_state |= PLC_STATE_WAITPYTHON_PIPE_CREATED;
 
     /* open WaitPython_pipe*/
-    if((WaitPython_pipe_fd = open(WAITPYTHON_PIPE_DEVICE, O_RDWR)) == -1) goto error;
+    if((WaitPython_pipe_fd = open(WAITPYTHON_PIPE_DEVICE, O_RDWR)) == -1)
+        _startPLCLog(FO WAITPYTHON_PIPE_DEVICE);
     PLC_state |= PLC_STATE_WAITPYTHON_FILE_OPENED;
 
     /*** create PLC task ***/
-    if(rt_task_create(&PLC_task, "PLC_task", 0, 50, T_JOINABLE)) goto error;
+    if(rt_task_create(&PLC_task, "PLC_task", 0, 50, T_JOINABLE))
+        _startPLCLog("Failed creating PLC task");
     PLC_state |= PLC_STATE_TASK_CREATED;
 
     if(__init(argc,argv)) goto error;
 
     /* start PLC task */
-    if(rt_task_start(&PLC_task, &PLC_task_proc, NULL)) goto error;
+    if(rt_task_start(&PLC_task, &PLC_task_proc, NULL))
+        _startPLCLog("Failed starting PLC task");
 
     return 0;
 
@@ -241,7 +277,6 @@
     return 0;
 }
 
-#define DEBUG_UNLOCK 1
 void LeaveDebugSection(void)
 {
     if(AtomicCompareExchange( &debug_state, 
@@ -254,7 +289,6 @@
 
 extern unsigned long __tick;
 
-#define DEBUG_PENDING_DATA 1
 int WaitDebugData(unsigned long *tick)
 {
     char cmd;
@@ -304,8 +338,6 @@
     AtomicCompareExchange( &debug_state, DEBUG_BUSY, DEBUG_FREE);
 }
 
-#define PYTHON_PENDING_COMMAND 1
-
 #define PYTHON_FREE 0
 #define PYTHON_BUSY 1
 static long python_state = PYTHON_FREE;
@@ -363,3 +395,33 @@
     }    /* as plc does not wait for lock. */
 }
 
+#ifndef HAVE_RETAIN
+int CheckRetainBuffer(void)
+{
+	return 1;
+}
+
+void ValidateRetainBuffer(void)
+{
+}
+
+void InValidateRetainBuffer(void)
+{
+}
+
+void Retain(unsigned int offset, unsigned int count, void *p)
+{
+}
+
+void Remind(unsigned int offset, unsigned int count, void *p)
+{
+}
+
+void CleanupRetain(void)
+{
+}
+
+void InitRetain(void)
+{
+}
+#endif // !HAVE_RETAIN
--- a/targets/Xenomai/plc_Xenomai_noretain.c	Sat Jun 02 11:56:01 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-int CheckRetainBuffer(void)
-{
-	return 1;
-}
-
-void ValidateRetainBuffer(void)
-{
-}
-
-void InValidateRetainBuffer(void)
-{
-}
-
-void Retain(unsigned int offset, unsigned int count, void *p)
-{
-}
-
-void Remind(unsigned int offset, unsigned int count, void *p)
-{
-}
--- a/targets/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,87 +1,97 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-#
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-#
-# See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-# Package initialisation
-#import targets
-
-"""
-Beremiz Targets
-
-- Target are python packages, containing at least one "XSD" file
-- Target class may inherit from a toolchain_(toolchainname)
-- The target folder's name must match to name define in the XSD for TargetType
-"""
-
-from os import listdir, path
-
-_base_path = path.split(__file__)[0]
-def _GetLocalTargetClassFactory(name):
-    return lambda:getattr(__import__(name,globals(),locals()), name+"_target")
-
-targets = dict([(name, {"xsd":path.join(_base_path, name, "XSD"), 
-                        "class":_GetLocalTargetClassFactory(name),
-                        "code": { fname: path.join(_base_path, name, fname) 
-                           for fname in listdir(path.join(_base_path, name))
-                             if fname.startswith("plc_%s_main"%name) and
-                               fname.endswith(".c")}})
-                for name in listdir(_base_path) 
-                    if path.isdir(path.join(_base_path, name)) 
-                       and not name.startswith("__")])
-
-toolchains = {"gcc":  path.join(_base_path, "XSD_toolchain_gcc"),
-              "makefile":  path.join(_base_path, "XSD_toolchain_makefile")}
-
-def GetBuilder(targetname):
-    return targets[targetname]["class"]()
-
-def GetTargetChoices():
-    DictXSD_toolchain = {}
-    targetchoices = ""
-
-    # Get all xsd toolchains
-    for toolchainname,xsdfilename in toolchains.iteritems() :
-         if path.isfile(xsdfilename):
-             DictXSD_toolchain["toolchain_"+toolchainname] = \
-                open(xsdfilename).read()
-
-    # Get all xsd targets 
-    for targetname,nfo in targets.iteritems():
-        xsd_string = open(nfo["xsd"]).read()
-        targetchoices +=  xsd_string%DictXSD_toolchain
-
-    return targetchoices
-
-def GetTargetCode(targetname):
-    codedesc = targets[targetname]["code"]
-    code = "\n".join([open(fpath).read() for fname, fpath in sorted(codedesc.items())])
-    return code
-
-def GetHeader():
-    filename = path.join(path.split(__file__)[0],"beremiz.h")
-    return open(filename).read()
-
-def GetCode(name):
-    filename = path.join(path.split(__file__)[0],name)
-    return open(filename).read()
-
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+# Package initialisation
+
+
+"""
+Beremiz Targets
+
+- Target are python packages, containing at least one "XSD" file
+- Target class may inherit from a toolchain_(toolchainname)
+- The target folder's name must match to name define in the XSD for TargetType
+"""
+
+
+from __future__ import absolute_import
+from os import listdir, path
+import util.paths as paths
+
+_base_path = paths.AbsDir(__file__)
+
+
+def _GetLocalTargetClassFactory(name):
+    return lambda: getattr(__import__(name, globals(), locals()), name+"_target")
+
+
+targets = dict([(name, {"xsd":   path.join(_base_path, name, "XSD"),
+                        "class": _GetLocalTargetClassFactory(name),
+                        "code":  {fname: path.join(_base_path, name, fname)
+                                  for fname in listdir(path.join(_base_path, name))
+                                  if (fname.startswith("plc_%s_main" % name) and
+                                      fname.endswith(".c"))}})
+                for name in listdir(_base_path)
+                if (path.isdir(path.join(_base_path, name)) and
+                    not name.startswith("__"))])
+
+toolchains = {"gcc":  path.join(_base_path, "XSD_toolchain_gcc"),
+              "makefile":  path.join(_base_path, "XSD_toolchain_makefile")}
+
+
+def GetBuilder(targetname):
+    return targets[targetname]["class"]()
+
+
+def GetTargetChoices():
+    DictXSD_toolchain = {}
+    targetchoices = ""
+
+    # Get all xsd toolchains
+    for toolchainname, xsdfilename in toolchains.iteritems():
+        if path.isfile(xsdfilename):
+            DictXSD_toolchain["toolchain_"+toolchainname] = open(xsdfilename).read()
+
+    # Get all xsd targets
+    for _targetname, nfo in targets.iteritems():
+        xsd_string = open(nfo["xsd"]).read()
+        targetchoices += xsd_string % DictXSD_toolchain
+
+    return targetchoices
+
+
+def GetTargetCode(targetname):
+    codedesc = targets[targetname]["code"]
+    code = "\n".join([open(fpath).read() for _fname, fpath in sorted(codedesc.items())])
+    return code
+
+
+def GetHeader():
+    filename = paths.AbsNeighbourFile(__file__, "beremiz.h")
+    return open(filename).read()
+
+
+def GetCode(name):
+    filename = paths.AbsNeighbourFile(__file__, name)
+    return open(filename).read()
--- a/targets/beremiz.h	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/beremiz.h	Mon Jan 07 13:50:39 2019 +0100
@@ -9,6 +9,12 @@
 #define LOG_DEBUG 3
 
 extern unsigned long long common_ticktime__;
-int LogMessage(uint8_t level, char* buf, uint32_t size);
+
+#ifdef TARGET_LOGGING_DISABLE
+#define LogMessage(level, buf, size)
+#else
+int     LogMessage(uint8_t level, char* buf, uint32_t size);
+#endif
+
 long AtomicCompareExchange(long* atomicvar,long compared, long exchange);
 
--- a/targets/plc_debug.c	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/plc_debug.c	Mon Jan 07 13:50:39 2019 +0100
@@ -10,6 +10,16 @@
  *  
  * 
  * */
+
+#ifdef TARGET_DEBUG_DISABLE
+
+void __init_debug    (void){}
+void __cleanup_debug (void){}
+void __retrieve_debug(void){}
+void __publish_debug (void){}
+
+#else
+
 #include "iec_types_all.h"
 #include "POUS.h"
 /*for memcpy*/
@@ -51,7 +61,7 @@
 typedef void(*__for_each_variable_do_fp)(dbgvardsc_t*);
 void __for_each_variable_do(__for_each_variable_do_fp fp)
 {
-    int i;
+    unsigned int i;
     for(i = 0; i < sizeof(dbgvardsc)/sizeof(dbgvardsc_t); i++){
         dbgvardsc_t *dsc = &dbgvardsc[i];
         if(dsc->type != UNKNOWN_ENUM) 
@@ -165,7 +175,9 @@
                 /* compute next cursor positon.
                    No need to check overflow, as BUFFER_SIZE
                    is computed large enough */
-                if(dsc->type == STRING_ENUM){
+		if((dsc->type == STRING_ENUM)   ||
+		   (dsc->type == STRING_P_ENUM) ||
+		   (dsc->type == STRING_O_ENUM)){
                     /* optimization for strings */
                     size = ((STRING*)visible_value_p)->len + 1;
                 }
@@ -199,6 +211,31 @@
     BufferIterator(dsc, 0);
 }
 
+
+unsigned int retain_size = 0;
+
+/* GetRetainSizeIterator */
+void GetRetainSizeIterator(dbgvardsc_t *dsc)
+{
+    void *real_value_p = NULL;
+    char flags = 0;
+    UnpackVar(dsc, &real_value_p, &flags);
+
+    if(flags & __IEC_RETAIN_FLAG){
+        USINT size = __get_type_enum_size(dsc->type);
+        /* Calc retain buffer size */
+        retain_size += size;
+    }
+}
+
+/* Return size of all retain variables */
+unsigned int GetRetainSize(void)
+{
+    __for_each_variable_do(GetRetainSizeIterator);
+    return retain_size;
+}
+
+
 extern void PLC_GetTime(IEC_TIME*);
 extern int TryEnterDebugSection(void);
 extern long AtomicCompareExchange(long*, long, long);
@@ -262,7 +299,7 @@
              *(((__IEC_##TYPENAME##_p *)varp)->value) = *((TYPENAME *)force);\
             }\
             break;
-void RegisterDebugVariable(int idx, void* force)
+void RegisterDebugVariable(unsigned int idx, void* force)
 {
     if(idx  < sizeof(dbgvardsc)/sizeof(dbgvardsc_t)){
         unsigned char flags = force ?
@@ -326,3 +363,5 @@
     return wait_error;
 }
 
+#endif
+
--- a/targets/plc_main_head.c	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/plc_main_head.c	Mon Jan 07 13:50:39 2019 +0100
@@ -35,6 +35,9 @@
 /* Help to quit cleanly when init fail at a certain level */
 static int init_level = 0;
 
+/* Prototype for Logging to help spotting errors at init */
+int LogMessage(uint8_t level, char* buf, uint32_t size);
+
 /*
  * Prototypes of functions exported by plugins
  **/
--- a/targets/plc_main_tail.c	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/plc_main_tail.c	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 /** 
  * LOGGING
  **/
+#ifndef TARGET_LOGGING_DISABLE
 
 #ifndef LOG_BUFFER_SIZE
 #define LOG_BUFFER_SIZE (1<<14) /*16Ko*/
@@ -134,6 +135,10 @@
     return 0;
 }
 
+#endif
+
+#ifndef TARGET_EXT_SYNC_DISABLE
+
 #define CALIBRATED -2
 #define NOT_CALIBRATED -1
 static int calibration_count = NOT_CALIBRATED;
@@ -219,3 +224,5 @@
 		}
 	}
 }
+
+#endif
--- a/targets/toolchain_gcc.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/toolchain_gcc.py	Mon Jan 07 13:50:39 2019 +0100
@@ -1,202 +1,235 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-#
-# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
-#
-# See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-import os, re, operator
-from util.ProcessLogger import ProcessLogger
-import hashlib
-
-includes_re =  re.compile('\s*#include\s*["<]([^">]*)[">].*')
-
-class toolchain_gcc():
-    """
-    This abstract class contains GCC specific code.
-    It cannot be used as this and should be inherited in a target specific
-    class such as target_linux or target_win32
-    """
-    def __init__(self, CTRInstance):
-        self.CTRInstance = CTRInstance
-        self.buildpath = None
-        self.SetBuildPath(self.CTRInstance._getBuildPath())
-    
-    def getBuilderCFLAGS(self):
-        """
-        Returns list of builder specific CFLAGS
-        """
-        return [self.CTRInstance.GetTarget().getcontent().getCFLAGS()]
-
-    def getBuilderLDFLAGS(self):
-        """
-        Returns list of builder specific LDFLAGS
-        """
-        return self.CTRInstance.LDFLAGS + \
-               [self.CTRInstance.GetTarget().getcontent().getLDFLAGS()]
-
-    def GetBinaryCode(self):
-        try:
-            return open(self.exe_path, "rb").read()
-        except Exception, e:
-            return None
-        
-    def _GetMD5FileName(self):
-        return os.path.join(self.buildpath, "lastbuildPLC.md5")
-
-    def ResetBinaryCodeMD5(self):
-        self.md5key = None
-        try:
-            os.remove(self._GetMD5FileName())
-        except Exception, e:
-            pass
-    
-    def GetBinaryCodeMD5(self):
-        if self.md5key is not None:
-            return self.md5key
-        else:
-            try:
-                return open(self._GetMD5FileName(), "r").read()
-            except Exception, e:
-                return None
-    
-    def SetBuildPath(self, buildpath):
-        if self.buildpath != buildpath:
-            self.buildpath = buildpath
-            self.exe = self.CTRInstance.GetProjectName() + self.extension
-            self.exe_path = os.path.join(self.buildpath, self.exe)
-            self.md5key = None
-            self.srcmd5 = {}
-    
-    def check_and_update_hash_and_deps(self, bn):
-        # Get latest computed hash and deps
-        oldhash, deps = self.srcmd5.get(bn,(None,[]))
-        # read source
-        src = open(os.path.join(self.buildpath, bn)).read()
-        # compute new hash
-        newhash = hashlib.md5(src).hexdigest()
-        # compare
-        match = (oldhash == newhash)
-        if not match:
-            # file have changed
-            # update direct dependencies
-            deps = []
-            for l in src.splitlines():
-                res = includes_re.match(l)
-                if res is not None:
-                    depfn = res.groups()[0]
-                    if os.path.exists(os.path.join(self.buildpath, depfn)):
-                        #print bn + " depends on "+depfn
-                        deps.append(depfn)
-            # store that hashand deps
-            self.srcmd5[bn] = (newhash, deps)
-        # recurse through deps
-        # TODO detect cicular deps.
-        return reduce(operator.and_, map(self.check_and_update_hash_and_deps, deps), match)
-                
-    def build(self):
-        # Retrieve toolchain user parameters
-        toolchain_params = self.CTRInstance.GetTarget().getcontent()
-        self.compiler = toolchain_params.getCompiler()
-        self.linker = toolchain_params.getLinker()
-
-        Builder_CFLAGS = ' '.join(self.getBuilderCFLAGS())
-
-        ######### GENERATE OBJECT FILES ########################################
-        obns = []
-        objs = []
-        relink = self.GetBinaryCode() is None
-        for Location, CFilesAndCFLAGS, DoCalls in self.CTRInstance.LocationCFilesAndCFLAGS:
-            if CFilesAndCFLAGS:
-                if Location :
-                    self.CTRInstance.logger.write(".".join(map(str,Location))+" :\n")
-                else:
-                    self.CTRInstance.logger.write(_("PLC :\n"))
-                
-            for CFile, CFLAGS in CFilesAndCFLAGS:
-                if CFile.endswith(".c"):
-                    bn = os.path.basename(CFile)
-                    obn = os.path.splitext(bn)[0]+".o"
-                    objectfilename = os.path.splitext(CFile)[0]+".o"
-
-                    match = self.check_and_update_hash_and_deps(bn)
-                    
-                    if match:
-                        self.CTRInstance.logger.write("   [pass]  "+bn+" -> "+obn+"\n")
-                    else:
-                        relink = True
-
-                        self.CTRInstance.logger.write("   [CC]  "+bn+" -> "+obn+"\n")
-                        
-                        status, result, err_result = ProcessLogger(
-                               self.CTRInstance.logger,
-                               "\"%s\" -c \"%s\" -o \"%s\" %s %s"%
-                                   (self.compiler, CFile, objectfilename, Builder_CFLAGS, CFLAGS)
-                               ).spin()
-
-                        if status :
-                            self.srcmd5.pop(bn)
-                            self.CTRInstance.logger.write_error(_("C compilation of %s failed.\n")%bn)
-                            return False
-                    obns.append(obn)
-                    objs.append(objectfilename)
-                elif CFile.endswith(".o"):
-                    obns.append(os.path.basename(CFile))
-                    objs.append(CFile)
-
-        ######### GENERATE library FILE ########################################
-        # Link all the object files into one binary file
-        self.CTRInstance.logger.write(_("Linking :\n"))
-        if relink:
-            objstring = []
-    
-            # Generate list .o files
-            listobjstring = '"' + '"  "'.join(objs) + '"'
-    
-            ALLldflags = ' '.join(self.getBuilderLDFLAGS())
-    
-            self.CTRInstance.logger.write("   [CC]  " + ' '.join(obns)+" -> " + self.exe + "\n")
-    
-            status, result, err_result = ProcessLogger(
-                   self.CTRInstance.logger,
-                   "\"%s\" %s -o \"%s\" %s"%
-                       (self.linker,
-                        listobjstring,
-                        self.exe_path,
-                        ALLldflags)
-                   ).spin()
-            
-            if status :
-                return False
-                
-        else:
-            self.CTRInstance.logger.write("   [pass]  " + ' '.join(obns)+" -> " + self.exe + "\n")
-        
-        # Calculate md5 key and get data for the new created PLC
-        data=self.GetBinaryCode()
-        self.md5key = hashlib.md5(data).hexdigest()
-
-        # Store new PLC filename based on md5 key
-        f = open(self._GetMD5FileName(), "w")
-        f.write(self.md5key)
-        f.close()
-        
-        return True
-
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Paul Beltyukov
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+
+from __future__ import absolute_import
+import os
+import re
+import operator
+import hashlib
+from functools import reduce
+from util.ProcessLogger import ProcessLogger
+
+
+includes_re = re.compile(r'\s*#include\s*["<]([^">]*)[">].*')
+
+
+class toolchain_gcc(object):
+    """
+    This abstract class contains GCC specific code.
+    It cannot be used as this and should be inherited in a target specific
+    class such as target_linux or target_win32
+    """
+    def __init__(self, CTRInstance):
+        self.CTRInstance = CTRInstance
+        self.buildpath = None
+        self.SetBuildPath(self.CTRInstance._getBuildPath())
+
+    def getBuilderCFLAGS(self):
+        """
+        Returns list of builder specific CFLAGS
+        """
+        return [self.CTRInstance.GetTarget().getcontent().getCFLAGS()]
+
+    def getBuilderLDFLAGS(self):
+        """
+        Returns list of builder specific LDFLAGS
+        """
+        return self.CTRInstance.LDFLAGS + \
+            [self.CTRInstance.GetTarget().getcontent().getLDFLAGS()]
+
+    def getCompiler(self):
+        """
+        Returns compiler
+        """
+        return self.CTRInstance.GetTarget().getcontent().getCompiler()
+
+    def getLinker(self):
+        """
+        Returns linker
+        """
+        return self.CTRInstance.GetTarget().getcontent().getLinker()
+
+    def GetBinaryPath(self):
+        return self.bin_path
+
+    def _GetMD5FileName(self):
+        return os.path.join(self.buildpath, "lastbuildPLC.md5")
+
+    def ResetBinaryMD5(self):
+        self.md5key = None
+        try:
+            os.remove(self._GetMD5FileName())
+        except Exception:
+            pass
+
+    def GetBinaryMD5(self):
+        if self.md5key is not None:
+            return self.md5key
+        else:
+            try:
+                return open(self._GetMD5FileName(), "r").read()
+            except Exception:
+                return None
+
+    def SetBuildPath(self, buildpath):
+        if self.buildpath != buildpath:
+            self.buildpath = buildpath
+            self.bin = self.CTRInstance.GetProjectName() + self.extension
+            self.bin_path = os.path.join(self.buildpath, self.bin)
+            self.md5key = None
+            self.srcmd5 = {}
+
+    def append_cfile_deps(self, src, deps):
+        for l in src.splitlines():
+            res = includes_re.match(l)
+            if res is not None:
+                depfn = res.groups()[0]
+                if os.path.exists(os.path.join(self.buildpath, depfn)):
+                    deps.append(depfn)
+
+    def concat_deps(self, bn):
+        # read source
+        src = open(os.path.join(self.buildpath, bn), "r").read()
+        # update direct dependencies
+        deps = []
+        self.append_cfile_deps(src, deps)
+        # recurse through deps
+        # TODO detect cicular deps.
+        return reduce(operator.concat, map(self.concat_deps, deps), src)
+
+    def check_and_update_hash_and_deps(self, bn):
+        # Get latest computed hash and deps
+        oldhash, deps = self.srcmd5.get(bn, (None, []))
+        # read source
+        src = open(os.path.join(self.buildpath, bn)).read()
+        # compute new hash
+        newhash = hashlib.md5(src).hexdigest()
+        # compare
+        match = (oldhash == newhash)
+        if not match:
+            # file have changed
+            # update direct dependencies
+            deps = []
+            self.append_cfile_deps(src, deps)
+            # store that hashand deps
+            self.srcmd5[bn] = (newhash, deps)
+        # recurse through deps
+        # TODO detect cicular deps.
+        return reduce(operator.and_, map(self.check_and_update_hash_and_deps, deps), match)
+
+    def calc_source_md5(self):
+        wholesrcdata = ""
+        for _Location, CFilesAndCFLAGS, _DoCalls in self.CTRInstance.LocationCFilesAndCFLAGS:
+            # Get CFiles list to give it to makefile
+            for CFile, _CFLAGS in CFilesAndCFLAGS:
+                CFileName = os.path.basename(CFile)
+                wholesrcdata += self.concat_deps(CFileName)
+        return hashlib.md5(wholesrcdata).hexdigest()
+
+    def build(self):
+        # Retrieve compiler and linker
+        self.compiler = self.getCompiler()
+        self.linker = self.getLinker()
+
+        Builder_CFLAGS = ' '.join(self.getBuilderCFLAGS())
+
+        # ----------------- GENERATE OBJECT FILES ------------------------
+        obns = []
+        objs = []
+        relink = not os.path.exists(self.bin_path)
+        for Location, CFilesAndCFLAGS, _DoCalls in self.CTRInstance.LocationCFilesAndCFLAGS:
+            if CFilesAndCFLAGS:
+                if Location:
+                    self.CTRInstance.logger.write(".".join(map(str, Location))+" :\n")
+                else:
+                    self.CTRInstance.logger.write(_("PLC :\n"))
+
+            for CFile, CFLAGS in CFilesAndCFLAGS:
+                if CFile.endswith(".c"):
+                    bn = os.path.basename(CFile)
+                    obn = os.path.splitext(bn)[0]+".o"
+                    objectfilename = os.path.splitext(CFile)[0]+".o"
+
+                    match = self.check_and_update_hash_and_deps(bn)
+
+                    if match:
+                        self.CTRInstance.logger.write("   [pass]  "+bn+" -> "+obn+"\n")
+                    else:
+                        relink = True
+
+                        self.CTRInstance.logger.write("   [CC]  "+bn+" -> "+obn+"\n")
+
+                        status, _result, _err_result = ProcessLogger(
+                            self.CTRInstance.logger,
+                            "\"%s\" -c \"%s\" -o \"%s\" -O2 %s %s" %
+                            (self.compiler, CFile, objectfilename, Builder_CFLAGS, CFLAGS)
+                        ).spin()
+
+                        if status:
+                            self.srcmd5.pop(bn)
+                            self.CTRInstance.logger.write_error(_("C compilation of %s failed.\n") % bn)
+                            return False
+                    obns.append(obn)
+                    objs.append(objectfilename)
+                elif CFile.endswith(".o"):
+                    obns.append(os.path.basename(CFile))
+                    objs.append(CFile)
+
+        # ---------------- GENERATE OUTPUT FILE --------------------------
+        # Link all the object files into one binary file
+        self.CTRInstance.logger.write(_("Linking :\n"))
+        if relink:
+            # Generate list .o files
+            listobjstring = '"' + '"  "'.join(objs) + '"'
+
+            ALLldflags = ' '.join(self.getBuilderLDFLAGS())
+
+            self.CTRInstance.logger.write("   [CC]  " + ' '.join(obns)+" -> " + self.bin + "\n")
+
+            status, _result, _err_result = ProcessLogger(
+                self.CTRInstance.logger,
+                "\"%s\" %s -o \"%s\" %s" %
+                (self.linker,
+                 listobjstring,
+                 self.bin_path,
+                 ALLldflags)
+            ).spin()
+
+            if status:
+                return False
+
+        else:
+            self.CTRInstance.logger.write("   [pass]  " + ' '.join(obns)+" -> " + self.bin + "\n")
+
+        # Calculate md5 key and get data for the new created PLC
+        self.md5key = hashlib.md5(open(self.bin_path, "rb").read()).hexdigest()
+
+        # Store new PLC filename based on md5 key
+        f = open(self._GetMD5FileName(), "w")
+        f.write(self.md5key)
+        f.close()
+
+        return True
--- a/targets/toolchain_makefile.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/targets/toolchain_makefile.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,18 +22,23 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import os, re, operator
+
+from __future__ import absolute_import
+import os
+import re
+import operator
+import hashlib
+from functools import reduce
 from util.ProcessLogger import ProcessLogger
-import hashlib
 
-import time
 
-includes_re =  re.compile('\s*#include\s*["<]([^">]*)[">].*')
+includes_re = re.compile(r'\s*#include\s*["<]([^">]*)[">].*')
 
-class toolchain_makefile():
+
+class toolchain_makefile(object):
     def __init__(self, CTRInstance):
         self.CTRInstance = CTRInstance
-        self.md5key = None 
+        self.md5key = None
         self.buildpath = None
         self.SetBuildPath(self.CTRInstance._getBuildPath())
 
@@ -42,31 +47,31 @@
             self.buildpath = buildpath
             self.md5key = None
 
-    def GetBinaryCode(self):
+    def GetBinaryPath(self):
         return None
 
     def _GetMD5FileName(self):
         return os.path.join(self.buildpath, "lastbuildPLC.md5")
 
-    def ResetBinaryCodeMD5(self):
+    def ResetBinaryMD5(self):
         self.md5key = None
         try:
             os.remove(self._GetMD5FileName())
-        except Exception, e:
+        except Exception:
             pass
 
-    def GetBinaryCodeMD5(self):
+    def GetBinaryMD5(self):
         if self.md5key is not None:
             return self.md5key
         else:
             try:
                 return open(self._GetMD5FileName(), "r").read()
-            except IOError, e:
+            except IOError:
                 return None
 
     def concat_deps(self, bn):
         # read source
-        src = open(os.path.join(self.buildpath, bn),"r").read()
+        src = open(os.path.join(self.buildpath, bn), "r").read()
         # update direct dependencies
         deps = []
         for l in src.splitlines():
@@ -74,17 +79,17 @@
             if res is not None:
                 depfn = res.groups()[0]
                 if os.path.exists(os.path.join(self.buildpath, depfn)):
-                    #print bn + " depends on "+depfn
+                    # print bn + " depends on "+depfn
                     deps.append(depfn)
         # recurse through deps
         # TODO detect cicular deps.
         return reduce(operator.concat, map(self.concat_deps, deps), src)
 
     def build(self):
-        srcfiles= []
+        srcfiles = []
         cflags = []
-        wholesrcdata = "" 
-        for Location, CFilesAndCFLAGS, DoCalls in self.CTRInstance.LocationCFilesAndCFLAGS:
+        wholesrcdata = ""
+        for _Location, CFilesAndCFLAGS, _DoCalls in self.CTRInstance.LocationCFilesAndCFLAGS:
             # Get CFiles list to give it to makefile
             for CFile, CFLAGS in CFilesAndCFLAGS:
                 CFileName = os.path.basename(CFile)
@@ -92,7 +97,7 @@
                 srcfiles.append(CFileName)
                 if CFLAGS not in cflags:
                     cflags.append(CFLAGS)
-                        
+
         oldmd5 = self.md5key
         self.md5key = hashlib.md5(wholesrcdata).hexdigest()
 
@@ -101,28 +106,26 @@
         f.write(self.md5key)
         f.close()
 
-        if oldmd5 != self.md5key :
+        if oldmd5 != self.md5key:
             target = self.CTRInstance.GetTarget().getcontent()
             beremizcommand = {"src": ' '.join(srcfiles),
                               "cflags": ' '.join(cflags),
                               "md5": self.md5key,
-                              "buildpath": self.buildpath
-                             }
-            
-            # clean sequence of multiple whitespaces 
-            cmd = re.sub(r"[ ]+", " ", target.getCommand())
+                              "buildpath": self.buildpath}
 
-            command = [ token % beremizcommand for token in cmd.split(' ')]
+            # clean sequence of multiple whitespaces
+            cmd = re.sub(r"[ ]+", " ", target.getCommand().strip())
+
+            command = [token % beremizcommand for token in cmd.split(' ')]
 
             # Call Makefile to build PLC code and link it with target specific code
-            status, result, err_result = ProcessLogger(self.CTRInstance.logger,
-                                                       command).spin()
-            if status :
+            status, _result, _err_result = ProcessLogger(self.CTRInstance.logger,
+                                                         command).spin()
+            if status:
                 self.md5key = None
                 self.CTRInstance.logger.write_error(_("C compilation failed.\n"))
                 return False
             return True
-        else :
+        else:
             self.CTRInstance.logger.write(_("Source didn't change, no build.\n"))
             return True
-
--- a/targets/typemapping.py	Sat Jun 02 11:56:01 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# This file is part of Beremiz, a Integrated Development Environment for
-# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
-#
-# Copyright (C) 2011: Edouard TISSERANT and Laurent BESSARD
-#
-# See COPYING file for copyrights details.
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-
-import ctypes
-ctypes.pythonapi.PyString_AsString.argtypes = (ctypes.c_void_p,)
-ctypes.pythonapi.PyString_AsString.restype = ctypes.POINTER(ctypes.c_char)
-
-
-from ctypes import *
-from datetime import timedelta as td
-
-class IEC_STRING(Structure):
-    """
-    Must be changed according to changes in iec_types.h
-    """
-    _fields_ = [("len", c_uint8),
-                ("body", c_char * 126)]
-
-class IEC_TIME(Structure):
-    """
-    Must be changed according to changes in iec_types.h
-    """
-    _fields_ = [("s", c_long), #tv_sec
-                ("ns", c_long)] #tv_nsec
-
-def _t(t, u=lambda x:x.value, p=lambda t,x:t(x)): return  (t, u, p)
-def _ttime(): return (IEC_TIME,
-                      lambda x:td(0, x.s, x.ns/1000),
-                      lambda t,x:t(x.days * 24 * 3600 + x.seconds, x.microseconds*1000))
-
-SameEndianessTypeTranslator = {
-    "BOOL" :       _t(c_uint8,  lambda x:x.value!=0),
-    "STEP" :       _t(c_uint8),
-    "TRANSITION" : _t(c_uint8),
-    "ACTION" :     _t(c_uint8),
-    "SINT" :       _t(c_int8),
-    "USINT" :      _t(c_uint8),
-    "BYTE" :       _t(c_uint8),
-    "STRING" :     (IEC_STRING,
-                      lambda x:x.body[:x.len],
-                      lambda t,x:t(len(x),x)),
-    "INT" :        _t(c_int16),
-    "UINT" :       _t(c_uint16),
-    "WORD" :       _t(c_uint16),
-    "DINT" :       _t(c_int32),
-    "UDINT" :      _t(c_uint32),
-    "DWORD" :      _t(c_uint32),
-    "LINT" :       _t(c_int64),
-    "ULINT" :      _t(c_uint64),
-    "LWORD" :      _t(c_uint64),
-    "REAL" :       _t(c_float),
-    "LREAL" :      _t(c_double),
-    "TIME" :       _ttime(),
-    "TOD" :        _ttime(),
-    "DATE" :       _ttime(),
-    "DT" :         _ttime(),
-    }
-
-SwapedEndianessTypeTranslator = {
-    #TODO
-    }
-
-TypeTranslator=SameEndianessTypeTranslator
-
-# Construct debugger natively supported types
-DebugTypesSize =  dict([(key,sizeof(t)) for key,(t,p,u) in SameEndianessTypeTranslator.iteritems() if t is not None])
-
-def UnpackDebugBuffer(buff, indexes):
-    res =  []
-    buffoffset = 0
-    buffsize = len(buff)
-    buffptr = cast(ctypes.pythonapi.PyString_AsString(id(buff)),c_void_p).value
-    for iectype in indexes:
-        c_type,unpack_func, pack_func = \
-            TypeTranslator.get(iectype,
-                                    (None,None,None))
-        if c_type is not None and buffoffset < buffsize:
-            cursor = c_void_p( buffptr + buffoffset)
-            value = unpack_func( cast(cursor,
-                         POINTER(c_type)).contents)
-            buffoffset += sizeof(c_type) if iectype != "STRING" else len(value)+1
-            res.append(value)
-        else:
-            break
-    if buffoffset and buffoffset == buffsize:
-        return res
-    return None
-
-
-
-LogLevels = ["CRITICAL","WARNING","INFO","DEBUG"]
-LogLevelsCount = len(LogLevels)
-LogLevelsDict = dict(zip(LogLevels,range(LogLevelsCount)))
-LogLevelsDefault = LogLevelsDict["DEBUG"]
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/BACnet/bacnet_0@bacnet/bacnet_slave	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,202 @@
+(dp0
+S'BV_Obj'
+p1
+(lp2
+sS'AV_Obj'
+p3
+(lp4
+(dp5
+S'loc'
+p6
+S'MD0_2'
+p7
+sS'Description'
+p8
+S''
+p9
+sS'Unit ID'
+p10
+I19
+sS'Object Identifier'
+p11
+I0
+sS'Ctype'
+p12
+S'float'
+p13
+sS'BACnetObjTypeID'
+p14
+I2
+sS'Settable'
+p15
+S'Y'
+p16
+sS'Engineering Units'
+p17
+V(Energy) kilowatt-hours (19)
+p18
+sS'Object Name'
+p19
+VEnergyCounter
+p20
+sasS'AO_Obj'
+p21
+(lp22
+(dp23
+g6
+S'QD0_1'
+p24
+sg8
+V
+p25
+sS'Unit ID'
+p26
+I62
+sS'Object Identifier'
+p27
+V0
+p28
+sg12
+g13
+sg14
+I1
+sg15
+g16
+sS'Object Name'
+p29
+VTemperatureSetPoint
+p30
+sS'Engineering Units'
+p31
+V(Temperature) degrees-celsius (62)
+p32
+sasS'MSI_Obj'
+p33
+(lp34
+sS'BO_Obj'
+p35
+(lp36
+(dp37
+g6
+S'QX0_4'
+p38
+sg8
+g9
+sS'Object Identifier'
+p39
+I2
+sg12
+S'uint8_t'
+p40
+sg14
+I4
+sg15
+g16
+sS'Object Name'
+p41
+VBlockClimateControl
+p42
+sasS'MSO_Obj'
+p43
+(lp44
+sS'EDEfile_parm'
+p45
+(dp46
+S'next_EDE_file_version'
+p47
+I1
+ssS'BI_Obj'
+p48
+(lp49
+(dp50
+g6
+S'IX0_3'
+p51
+sg8
+g9
+sS'Object Identifier'
+p52
+I0
+sg12
+g40
+sg14
+I3
+sg15
+S'N'
+p53
+sS'Object Name'
+p54
+VHeater
+p55
+sa(dp56
+g6
+g51
+sg8
+g9
+sg52
+I1
+sg12
+g40
+sg14
+I3
+sg15
+g53
+sg54
+VCooler
+p57
+sasS'AI_Obj'
+p58
+(lp59
+(dp60
+g6
+S'ID0_0'
+p61
+sg8
+VCurrent termperature in Beremiz lab
+p62
+sS'Unit ID'
+p63
+I62
+sS'Object Identifier'
+p64
+I0
+sg12
+g13
+sg14
+I0
+sg15
+g53
+sS'Engineering Units'
+p65
+V(Temperature) degrees-celsius (62)
+p66
+sS'Object Name'
+p67
+VTemperature
+p68
+sa(dp69
+g6
+g61
+sg8
+VCurrent humidity in Beremiz lab
+p70
+sg63
+I29
+sg64
+I1
+sg12
+g13
+sg14
+I0
+sg15
+g53
+sg67
+VHumidity
+p71
+sg65
+V(Humidity) percent-relative-humidity (29)
+p72
+sasS'MSV_Obj'
+p73
+(lp74
+s.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/BACnet/bacnet_0@bacnet/baseconfnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="bacnet_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/BACnet/bacnet_0@bacnet/confnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BACnetServerNode xmlns:xsd="http://www.w3.org/2001/XMLSchema" UDP_Port_Number="47808" BACnet_Device_ID="3" BACnet_Communication_Control_Password=" " BACnet_Device_Location="Beremiz lab" Network_Interface="virbr0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/BACnet/beremiz.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,4 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
+  <TargetType/>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/BACnet/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,601 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2018-07-28T02:24:08"/>
+  <contentHeader name="BACnet" modificationDateTime="2018-09-26T14:00:21">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="0" y="0"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="program0" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="EnergyCounter" address="%MD0.2.0">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+            <variable name="Temperature" address="%ID0.0.0">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+            <variable name="Humidity" address="%ID0.0.1">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+          </localVars>
+          <localVars>
+            <variable name="TempSimulation">
+              <type>
+                <derived name="Simulator"/>
+              </type>
+            </variable>
+            <variable name="HumiditySimulation">
+              <type>
+                <derived name="Simulator"/>
+              </type>
+            </variable>
+          </localVars>
+          <localVars>
+            <variable name="TemperatureSetPoint" address="%QD0.1.0">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+            <variable name="ControlDisable" address="%QX0.4.2">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Heater" address="%IX0.3.0">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Cooler" address="%IX0.3.1">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <inVariable localId="1" executionOrderId="0" height="30" width="114" negated="false">
+              <position x="299" y="521"/>
+              <connectionPointOut>
+                <relPosition x="114" y="15"/>
+              </connectionPointOut>
+              <expression>EnergyCounter</expression>
+            </inVariable>
+            <outVariable localId="2" executionOrderId="0" height="30" width="114" negated="false">
+              <position x="654" y="521"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="3" formalParameter="OUT">
+                  <position x="654" y="536"/>
+                  <position x="533" y="536"/>
+                </connection>
+              </connectionPointIn>
+              <expression>EnergyCounter</expression>
+            </outVariable>
+            <block localId="3" typeName="ADD" executionOrderId="0" height="60" width="67">
+              <position x="466" y="506"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="1">
+                      <position x="466" y="536"/>
+                      <position x="404" y="536"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="4">
+                      <position x="466" y="556"/>
+                      <position x="436" y="556"/>
+                      <position x="436" y="585"/>
+                      <position x="401" y="585"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="4" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="296" y="570"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>0.00131</expression>
+            </inVariable>
+            <comment localId="5" height="67" width="229">
+              <position x="27" y="525"/>
+              <content>
+                <xhtml:p><![CDATA[Always consume some energy]]></xhtml:p>
+              </content>
+            </comment>
+            <block localId="6" typeName="Simulator" instanceName="TempSimulation" executionOrderId="0" height="128" width="143">
+              <position x="188" y="648"/>
+              <inputVariables>
+                <variable formalParameter="MinVal">
+                  <connectionPointIn>
+                    <relPosition x="0" y="38"/>
+                    <connection refLocalId="8">
+                      <position x="188" y="686"/>
+                      <position x="138" y="686"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="MaxVal">
+                  <connectionPointIn>
+                    <relPosition x="0" y="74"/>
+                    <connection refLocalId="9">
+                      <position x="188" y="722"/>
+                      <position x="138" y="722"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="PeriodSeconds">
+                  <connectionPointIn>
+                    <relPosition x="0" y="110"/>
+                    <connection refLocalId="10">
+                      <position x="188" y="758"/>
+                      <position x="138" y="758"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Out">
+                  <connectionPointOut>
+                    <relPosition x="143" y="38"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="7" executionOrderId="0" height="30" width="98" negated="false">
+              <position x="421" y="671"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="6" formalParameter="Out">
+                  <position x="421" y="686"/>
+                  <position x="331" y="686"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Temperature</expression>
+            </outVariable>
+            <inVariable localId="8" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="33" y="671"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>18.0</expression>
+            </inVariable>
+            <inVariable localId="9" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="33" y="707"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>30.0</expression>
+            </inVariable>
+            <inVariable localId="10" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="33" y="743"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>120</expression>
+            </inVariable>
+            <block localId="11" typeName="Simulator" instanceName="HumiditySimulation" executionOrderId="0" height="137" width="143">
+              <position x="185" y="803"/>
+              <inputVariables>
+                <variable formalParameter="MinVal">
+                  <connectionPointIn>
+                    <relPosition x="0" y="39"/>
+                    <connection refLocalId="13">
+                      <position x="185" y="842"/>
+                      <position x="135" y="842"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="MaxVal">
+                  <connectionPointIn>
+                    <relPosition x="0" y="78"/>
+                    <connection refLocalId="14">
+                      <position x="185" y="881"/>
+                      <position x="135" y="881"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="PeriodSeconds">
+                  <connectionPointIn>
+                    <relPosition x="0" y="117"/>
+                    <connection refLocalId="15">
+                      <position x="185" y="920"/>
+                      <position x="135" y="920"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Out">
+                  <connectionPointOut>
+                    <relPosition x="143" y="39"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="12" executionOrderId="0" height="30" width="111" negated="false">
+              <position x="418" y="827"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="11" formalParameter="Out">
+                  <position x="418" y="842"/>
+                  <position x="328" y="842"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Humidity</expression>
+            </outVariable>
+            <inVariable localId="13" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="30" y="827"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>55.0</expression>
+            </inVariable>
+            <inVariable localId="14" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="30" y="866"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>78.0</expression>
+            </inVariable>
+            <inVariable localId="15" executionOrderId="0" height="30" width="105" negated="false">
+              <position x="30" y="905"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
+              </connectionPointOut>
+              <expression>58</expression>
+            </inVariable>
+            <block localId="16" typeName="GT" executionOrderId="0" height="60" width="67">
+              <position x="231" y="1103"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="18">
+                      <position x="231" y="1133"/>
+                      <position x="132" y="1133"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="22">
+                      <position x="231" y="1153"/>
+                      <position x="208" y="1153"/>
+                      <position x="208" y="1169"/>
+                      <position x="185" y="1169"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="18" executionOrderId="0" height="30" width="98" negated="false">
+              <position x="40" y="1118"/>
+              <connectionPointOut>
+                <relPosition x="98" y="15"/>
+              </connectionPointOut>
+              <expression>Temperature</expression>
+            </inVariable>
+            <block localId="19" typeName="AND" executionOrderId="0" height="60" width="67">
+              <position x="347" y="1059"/>
+              <inputVariables>
+                <variable formalParameter="IN1" negated="true">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="20">
+                      <position x="347" y="1089"/>
+                      <position x="263" y="1089"/>
+                      <position x="263" y="1074"/>
+                      <position x="145" y="1074"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="16" formalParameter="OUT">
+                      <position x="347" y="1109"/>
+                      <position x="337" y="1109"/>
+                      <position x="337" y="1133"/>
+                      <position x="298" y="1133"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="20" executionOrderId="0" height="30" width="122" negated="false">
+              <position x="41" y="1059"/>
+              <connectionPointOut>
+                <relPosition x="122" y="15"/>
+              </connectionPointOut>
+              <expression>ControlDisable</expression>
+            </inVariable>
+            <outVariable localId="21" executionOrderId="0" height="30" width="92" negated="false">
+              <position x="468" y="1074"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="19" formalParameter="OUT">
+                  <position x="468" y="1089"/>
+                  <position x="414" y="1089"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Cooler</expression>
+            </outVariable>
+            <inVariable localId="22" executionOrderId="0" height="30" width="162" negated="false">
+              <position x="39" y="1154"/>
+              <connectionPointOut>
+                <relPosition x="162" y="15"/>
+              </connectionPointOut>
+              <expression>TemperatureSetPoint</expression>
+            </inVariable>
+            <block localId="17" typeName="LT" executionOrderId="0" height="60" width="67">
+              <position x="228" y="1278"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="23">
+                      <position x="228" y="1308"/>
+                      <position x="129" y="1308"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="27">
+                      <position x="228" y="1328"/>
+                      <position x="205" y="1328"/>
+                      <position x="205" y="1344"/>
+                      <position x="182" y="1344"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="23" executionOrderId="0" height="30" width="98" negated="false">
+              <position x="37" y="1293"/>
+              <connectionPointOut>
+                <relPosition x="98" y="15"/>
+              </connectionPointOut>
+              <expression>Temperature</expression>
+            </inVariable>
+            <block localId="24" typeName="AND" executionOrderId="0" height="60" width="67">
+              <position x="344" y="1234"/>
+              <inputVariables>
+                <variable formalParameter="IN1" negated="true">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="25">
+                      <position x="344" y="1264"/>
+                      <position x="260" y="1264"/>
+                      <position x="260" y="1249"/>
+                      <position x="142" y="1249"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="17" formalParameter="OUT">
+                      <position x="344" y="1284"/>
+                      <position x="334" y="1284"/>
+                      <position x="334" y="1308"/>
+                      <position x="295" y="1308"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="67" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="25" executionOrderId="0" height="30" width="122" negated="false">
+              <position x="38" y="1234"/>
+              <connectionPointOut>
+                <relPosition x="122" y="15"/>
+              </connectionPointOut>
+              <expression>ControlDisable</expression>
+            </inVariable>
+            <outVariable localId="26" executionOrderId="0" height="30" width="92" negated="false">
+              <position x="465" y="1249"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="24" formalParameter="OUT">
+                  <position x="465" y="1264"/>
+                  <position x="411" y="1264"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Heater</expression>
+            </outVariable>
+            <inVariable localId="27" executionOrderId="0" height="30" width="162" negated="false">
+              <position x="36" y="1329"/>
+              <connectionPointOut>
+                <relPosition x="162" y="15"/>
+              </connectionPointOut>
+              <expression>TemperatureSetPoint</expression>
+            </inVariable>
+            <comment localId="28" height="67" width="229">
+              <position x="343" y="734"/>
+              <content>
+                <xhtml:p><![CDATA[Simple sensor simulation]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="29" height="67" width="229">
+              <position x="37" y="978"/>
+              <content>
+                <xhtml:p><![CDATA[Climate control]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="30" height="464" width="773">
+              <position x="14" y="16"/>
+              <content>
+                <xhtml:p><![CDATA[This examples shows how to work with BACnet extension.
+
+Extensions requires native BACnet stack to be installed nearby Beremiz.
+Following directory structure is expected:
+<Parent directory>
+  "beremiz"
+  "BACnet"
+
+If library is installed elsewhere, then place corresponding paths
+in CFLAGS/LDFLAGS in project settings.
+
+For GNU/Linux to install BACnet library in parent directory run following commands:
+$ svn checkout https://svn.code.sf.net/p/bacnet/code/trunk/bacnet-stack/ BACnet
+$ cd BACnet
+$ make
+
+After that BACnet extension is ready to be used in Beremiz projects.
+BACnet stack implementation contains a lot of test tools. They could be useful during 
+debugging and BACnet investigation. See "BACnet/bin/readme.txt" for more information about them.]]></xhtml:p>
+              </content>
+            </comment>
+          </FBD>
+        </body>
+      </pou>
+      <pou name="Simulator" pouType="functionBlock">
+        <interface>
+          <outputVars>
+            <variable name="Out">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+          </outputVars>
+          <inputVars>
+            <variable name="MinVal">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+            <variable name="MaxVal">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+            <variable name="PeriodSeconds">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="TON0">
+              <type>
+                <derived name="TON"/>
+              </type>
+            </variable>
+            <variable name="seconds">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="BaseVal">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+            <variable name="VarVal">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <ST>
+            <xhtml:p><![CDATA[(* pseudo-random variations *)
+TON0(IN := TRUE, PT := T#3120s);
+IF TON0.Q THEN
+  TON0(IN := FALSE);
+END_IF;
+seconds := TIME_TO_INT(TON0.ET);
+
+BaseVal := (MaxVal + MinVal)/2.0;
+VarVal  := (MaxVal-MinVal)*INT_TO_REAL((seconds MOD PeriodSeconds) - (PeriodSeconds/2))/INT_TO_REAL(PeriodSeconds);
+
+Out :=  BaseVal + VarVal;]]></xhtml:p>
+          </ST>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="config">
+        <resource name="resource1">
+          <task name="task0" priority="0" interval="T#20ms">
+            <pouInstance name="instance0" typeName="program0"/>
+          </task>
+        </resource>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
--- a/tests/canopen_master/plc.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/canopen_master/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,15 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xmlns="http://www.plcopen.org/xml/tc6.xsd"
-         xmlns:xhtml="http://www.w3.org/1999/xhtml"
-         xsi:schemaLocation="http://www.plcopen.org/xml/tc6.xsd">
-  <fileHeader companyName="beremiz"
-              productName="beremiz"
-              productVersion="1"
-              creationDateTime="2008-06-24T18:44:00"/>
-  <contentHeader name="canopen_master"
-                 modificationDateTime="2009-10-07T18:45:11"
-                 language="en-US">
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="beremiz" productName="beremiz" productVersion="1" creationDateTime="2008-06-24T18:44:00"/>
+  <contentHeader name="canopen_master" modificationDateTime="2018-09-26T13:31:52" language="en-US">
     <coordinateInfo>
       <fbd>
         <scaling x="0" y="0"/>
@@ -42,14 +34,12 @@
         </interface>
         <body>
           <FBD>
-            <outVariable localId="1" height="29" width="80">
-              <position x="362" y="140"/>
+            <outVariable localId="1" height="29" width="80" executionOrderId="0" negated="false">
+              <position x="362" y="139"/>
               <connectionPointIn>
                 <relPosition x="0" y="14"/>
                 <connection refLocalId="4" formalParameter="OUT">
-                  <position x="362" y="154"/>
-                  <position x="330" y="154"/>
-                  <position x="330" y="153"/>
+                  <position x="362" y="153"/>
                   <position x="299" y="153"/>
                 </connection>
               </connectionPointIn>
--- a/tests/canopen_slave/plc.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/canopen_slave/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,15 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xmlns="http://www.plcopen.org/xml/tc6.xsd"
-         xmlns:xhtml="http://www.w3.org/1999/xhtml"
-         xsi:schemaLocation="http://www.plcopen.org/xml/tc6.xsd">
-  <fileHeader companyName="beremiz"
-              productName="beremiz"
-              productVersion="1"
-              creationDateTime="2008-06-24T18:44:00"/>
-  <contentHeader name="canopen_slave"
-                 modificationDateTime="2008-10-24T09:32:01"
-                 language="en-US">
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="beremiz" productName="beremiz" productVersion="1" creationDateTime="2008-06-24T18:44:00"/>
+  <contentHeader name="canopen_slave" modificationDateTime="2018-09-26T13:32:23" language="en-US">
     <coordinateInfo>
       <fbd>
         <scaling x="0" y="0"/>
@@ -42,14 +34,12 @@
         </interface>
         <body>
           <FBD>
-            <outVariable localId="1" height="29" width="80">
-              <position x="362" y="140"/>
+            <outVariable localId="1" height="29" width="80" executionOrderId="0" negated="false">
+              <position x="362" y="139"/>
               <connectionPointIn>
                 <relPosition x="0" y="14"/>
                 <connection refLocalId="4" formalParameter="OUT">
-                  <position x="362" y="154"/>
-                  <position x="330" y="154"/>
-                  <position x="330" y="153"/>
+                  <position x="362" y="153"/>
                   <position x="299" y="153"/>
                 </connection>
               </connectionPointIn>
@@ -113,8 +103,8 @@
     <configurations>
       <configuration name="conf">
         <resource name="res">
-          <task name="tache" interval="00:00:00.010000" priority="0">
-            <pouInstance name="toto" type="test_main"/>
+          <task name="tache" interval="T#10ms" priority="0">
+            <pouInstance name="toto" typeName="test_main"/>
           </task>
         </resource>
       </configuration>
--- a/tests/first_steps/beremiz.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/first_steps/beremiz.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,6 +1,4 @@
 <?xml version='1.0' encoding='utf-8'?>
 <BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
-  <TargetType>
-    <Linux/>
-  </TargetType>
+  <TargetType/>
 </BeremizRoot>
--- a/tests/first_steps/plc.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/first_steps/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,7 @@
 <?xml version='1.0' encoding='utf-8'?>
 <project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
   <fileHeader companyName="Beremiz" productName="Beremiz" productVersion="1" creationDateTime="2016-10-24T18:09:22"/>
-  <contentHeader name="First Steps" modificationDateTime="2016-10-26T20:18:02">
+  <contentHeader name="First Steps" modificationDateTime="2018-09-26T12:52:51">
     <coordinateInfo>
       <fbd>
         <scaling x="0" y="0"/>
@@ -17,6 +17,58 @@
   <types>
     <dataTypes/>
     <pous>
+      <pou name="AverageVal" pouType="function">
+        <interface>
+          <returnType>
+            <REAL/>
+          </returnType>
+          <inputVars>
+            <variable name="Cnt1">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Cnt2">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Cnt3">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Cnt4">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="Cnt5">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="InputsNumber">
+              <type>
+                <REAL/>
+              </type>
+              <initialValue>
+                <simpleValue value="5.0"/>
+              </initialValue>
+              <documentation>
+                <xhtml:p><![CDATA[Количество входных значений]]></xhtml:p>
+              </documentation>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <ST>
+            <xhtml:p><![CDATA[AverageVal := INT_TO_REAL(Cnt1+Cnt2+Cnt3+Cnt4+Cnt5)/InputsNumber;]]></xhtml:p>
+          </ST>
+        </body>
+      </pou>
       <pou name="plc_prg" pouType="program">
         <interface>
           <inputVars>
@@ -79,6 +131,11 @@
                 <derived name="CounterLD"/>
               </type>
             </variable>
+            <variable name="AVCnt">
+              <type>
+                <REAL/>
+              </type>
+            </variable>
           </localVars>
         </interface>
         <body>
@@ -105,33 +162,22 @@
                 </variable>
               </outputVariables>
             </block>
-            <inVariable localId="2" executionOrderId="0" height="24" width="79" negated="false">
-              <position x="35" y="81"/>
-              <connectionPointOut>
-                <relPosition x="79" y="12"/>
+            <inVariable localId="2" executionOrderId="0" height="30" width="79" negated="false">
+              <position x="35" y="78"/>
+              <connectionPointOut>
+                <relPosition x="79" y="15"/>
               </connectionPointOut>
               <expression>Reset</expression>
             </inVariable>
-            <outVariable localId="3" executionOrderId="0" height="24" width="106" negated="false">
-              <position x="424" y="81"/>
-              <connectionPointIn>
-                <relPosition x="0" y="12"/>
-                <connection refLocalId="1" formalParameter="OUT">
-                  <position x="424" y="93"/>
-                  <position x="332" y="93"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Cnt1</expression>
-            </outVariable>
             <block localId="4" typeName="CounterFBD" instanceName="CounterFBD0" executionOrderId="0" height="54" width="121">
-              <position x="211" y="145"/>
+              <position x="211" y="146"/>
               <inputVariables>
                 <variable formalParameter="Reset">
                   <connectionPointIn>
                     <relPosition x="0" y="37"/>
                     <connection refLocalId="13">
-                      <position x="211" y="182"/>
-                      <position x="115" y="182"/>
+                      <position x="211" y="183"/>
+                      <position x="115" y="183"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -145,19 +191,8 @@
                 </variable>
               </outputVariables>
             </block>
-            <outVariable localId="5" executionOrderId="0" height="24" width="103" negated="false">
-              <position x="426" y="170"/>
-              <connectionPointIn>
-                <relPosition x="0" y="12"/>
-                <connection refLocalId="4" formalParameter="OUT">
-                  <position x="426" y="182"/>
-                  <position x="332" y="182"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Cnt2</expression>
-            </outVariable>
-            <comment localId="6" height="264" width="417">
-              <position x="569" y="55"/>
+            <comment localId="6" height="365" width="569">
+              <position x="620" y="130"/>
               <content>
                 <xhtml:p><![CDATA[In this example function block with the same functionality 
 is created using all five IEC 61131-3 programing languages:
@@ -199,17 +234,6 @@
                 </variable>
               </outputVariables>
             </block>
-            <outVariable localId="8" executionOrderId="0" height="24" width="97" negated="false">
-              <position x="431" y="261"/>
-              <connectionPointIn>
-                <relPosition x="0" y="12"/>
-                <connection refLocalId="7" formalParameter="OUT">
-                  <position x="431" y="273"/>
-                  <position x="332" y="273"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Cnt3</expression>
-            </outVariable>
             <block localId="9" typeName="CounterIL" instanceName="CounterIL0" executionOrderId="0" height="62" width="121">
               <position x="211" y="322"/>
               <inputVariables>
@@ -232,47 +256,36 @@
                 </variable>
               </outputVariables>
             </block>
-            <inVariable localId="10" executionOrderId="0" height="24" width="67" negated="false">
-              <position x="34" y="351"/>
-              <connectionPointOut>
-                <relPosition x="67" y="12"/>
+            <inVariable localId="10" executionOrderId="0" height="30" width="67" negated="false">
+              <position x="34" y="348"/>
+              <connectionPointOut>
+                <relPosition x="67" y="15"/>
               </connectionPointOut>
               <expression>Reset</expression>
             </inVariable>
-            <outVariable localId="11" executionOrderId="0" height="24" width="91" negated="false">
-              <position x="434" y="351"/>
-              <connectionPointIn>
-                <relPosition x="0" y="12"/>
-                <connection refLocalId="9" formalParameter="OUT">
-                  <position x="434" y="363"/>
-                  <position x="332" y="363"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Cnt4</expression>
-            </outVariable>
-            <inVariable localId="12" executionOrderId="0" height="24" width="67" negated="false">
-              <position x="36" y="261"/>
-              <connectionPointOut>
-                <relPosition x="67" y="12"/>
+            <inVariable localId="12" executionOrderId="0" height="30" width="67" negated="false">
+              <position x="36" y="258"/>
+              <connectionPointOut>
+                <relPosition x="67" y="15"/>
               </connectionPointOut>
               <expression>Reset</expression>
             </inVariable>
-            <inVariable localId="13" executionOrderId="0" height="24" width="79" negated="false">
-              <position x="36" y="170"/>
-              <connectionPointOut>
-                <relPosition x="79" y="12"/>
+            <inVariable localId="13" executionOrderId="0" height="30" width="79" negated="false">
+              <position x="36" y="168"/>
+              <connectionPointOut>
+                <relPosition x="79" y="15"/>
               </connectionPointOut>
               <expression>Reset</expression>
             </inVariable>
             <block localId="14" typeName="CounterLD" instanceName="CounterLD0" executionOrderId="0" height="62" width="124">
-              <position x="210" y="411"/>
+              <position x="210" y="412"/>
               <inputVariables>
                 <variable formalParameter="Reset">
                   <connectionPointIn>
                     <relPosition x="0" y="41"/>
                     <connection refLocalId="16">
-                      <position x="210" y="452"/>
-                      <position x="100" y="452"/>
+                      <position x="210" y="453"/>
+                      <position x="100" y="453"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -286,24 +299,152 @@
                 </variable>
               </outputVariables>
             </block>
-            <outVariable localId="15" executionOrderId="0" height="24" width="88" negated="false">
-              <position x="437" y="440"/>
-              <connectionPointIn>
-                <relPosition x="0" y="12"/>
-                <connection refLocalId="14" formalParameter="Out">
-                  <position x="437" y="452"/>
-                  <position x="334" y="452"/>
-                </connection>
-              </connectionPointIn>
-              <expression>Cnt5</expression>
-            </outVariable>
-            <inVariable localId="16" executionOrderId="0" height="24" width="64" negated="false">
-              <position x="36" y="440"/>
-              <connectionPointOut>
-                <relPosition x="64" y="12"/>
+            <inVariable localId="16" executionOrderId="0" height="30" width="64" negated="false">
+              <position x="36" y="438"/>
+              <connectionPointOut>
+                <relPosition x="64" y="15"/>
               </connectionPointOut>
               <expression>Reset</expression>
             </inVariable>
+            <block localId="17" typeName="AverageVal" executionOrderId="0" height="470" width="100">
+              <position x="514" y="28"/>
+              <inputVariables>
+                <variable formalParameter="Cnt1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="65"/>
+                    <connection refLocalId="3">
+                      <position x="514" y="93"/>
+                      <position x="474" y="93"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Cnt2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="155"/>
+                    <connection refLocalId="5">
+                      <position x="514" y="183"/>
+                      <position x="473" y="183"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Cnt3">
+                  <connectionPointIn>
+                    <relPosition x="0" y="245"/>
+                    <connection refLocalId="8">
+                      <position x="514" y="273"/>
+                      <position x="472" y="273"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Cnt4">
+                  <connectionPointIn>
+                    <relPosition x="0" y="335"/>
+                    <connection refLocalId="11">
+                      <position x="514" y="363"/>
+                      <position x="469" y="363"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Cnt5">
+                  <connectionPointIn>
+                    <relPosition x="0" y="425"/>
+                    <connection refLocalId="15">
+                      <position x="514" y="453"/>
+                      <position x="469" y="453"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="100" y="65"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="18" executionOrderId="0" height="30" width="55" negated="false">
+              <position x="649" y="78"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="17" formalParameter="OUT">
+                  <position x="649" y="93"/>
+                  <position x="614" y="93"/>
+                </connection>
+              </connectionPointIn>
+              <expression>AVCnt</expression>
+            </outVariable>
+            <inOutVariable localId="3" executionOrderId="0" height="30" width="106" negatedOut="false" negatedIn="false">
+              <position x="368" y="78"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="1" formalParameter="OUT">
+                  <position x="368" y="93"/>
+                  <position x="332" y="93"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="106" y="15"/>
+              </connectionPointOut>
+              <expression>Cnt1</expression>
+            </inOutVariable>
+            <inOutVariable localId="5" executionOrderId="0" height="30" width="103" negatedOut="false" negatedIn="false">
+              <position x="370" y="168"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="4" formalParameter="OUT">
+                  <position x="370" y="183"/>
+                  <position x="332" y="183"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="103" y="15"/>
+              </connectionPointOut>
+              <expression>Cnt2</expression>
+            </inOutVariable>
+            <inOutVariable localId="8" executionOrderId="0" height="30" width="97" negatedOut="false" negatedIn="false">
+              <position x="375" y="258"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="7" formalParameter="OUT">
+                  <position x="375" y="273"/>
+                  <position x="332" y="273"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="97" y="15"/>
+              </connectionPointOut>
+              <expression>Cnt3</expression>
+            </inOutVariable>
+            <inOutVariable localId="11" executionOrderId="0" height="30" width="91" negatedOut="false" negatedIn="false">
+              <position x="378" y="348"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="9" formalParameter="OUT">
+                  <position x="378" y="363"/>
+                  <position x="332" y="363"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="91" y="15"/>
+              </connectionPointOut>
+              <expression>Cnt4</expression>
+            </inOutVariable>
+            <inOutVariable localId="15" executionOrderId="0" height="30" width="88" negatedOut="false" negatedIn="false">
+              <position x="381" y="438"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="14" formalParameter="Out">
+                  <position x="381" y="453"/>
+                  <position x="334" y="453"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="88" y="15"/>
+              </connectionPointOut>
+              <expression>Cnt5</expression>
+            </inOutVariable>
           </FBD>
         </body>
       </pou>
@@ -383,41 +524,41 @@
         </interface>
         <body>
           <FBD>
-            <inVariable localId="1" executionOrderId="0" height="24" width="61" negated="false">
+            <inVariable localId="1" executionOrderId="0" height="30" width="61" negated="false">
               <position x="321" y="58"/>
               <connectionPointOut>
-                <relPosition x="61" y="12"/>
+                <relPosition x="61" y="15"/>
               </connectionPointOut>
               <expression>Reset</expression>
             </inVariable>
-            <outVariable localId="2" executionOrderId="0" height="24" width="34" negated="false">
+            <outVariable localId="2" executionOrderId="0" height="30" width="39" negated="false">
               <position x="675" y="137"/>
               <connectionPointIn>
-                <relPosition x="0" y="12"/>
+                <relPosition x="0" y="15"/>
                 <connection refLocalId="3">
-                  <position x="675" y="149"/>
-                  <position x="586" y="149"/>
+                  <position x="675" y="152"/>
+                  <position x="589" y="152"/>
                 </connection>
               </connectionPointIn>
               <expression>OUT</expression>
             </outVariable>
-            <inOutVariable localId="3" executionOrderId="0" height="24" width="29" negatedOut="false" negatedIn="false">
+            <inOutVariable localId="3" executionOrderId="0" height="30" width="37" negatedOut="false" negatedIn="false">
               <position x="557" y="137"/>
               <connectionPointIn>
-                <relPosition x="0" y="12"/>
+                <relPosition x="0" y="15"/>
                 <connection refLocalId="7" formalParameter="OUT">
-                  <position x="557" y="149"/>
-                  <position x="524" y="149"/>
-                  <position x="524" y="130"/>
-                  <position x="505" y="130"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="29" y="12"/>
+                  <position x="557" y="152"/>
+                  <position x="527" y="152"/>
+                  <position x="527" y="130"/>
+                  <position x="517" y="130"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="37" y="15"/>
               </connectionPointOut>
               <expression>Cnt</expression>
             </inOutVariable>
-            <block localId="4" typeName="ADD" executionOrderId="0" height="80" width="57">
+            <block localId="4" typeName="ADD" executionOrderId="0" height="80" width="69">
               <position x="328" y="115"/>
               <inputVariables>
                 <variable formalParameter="IN1">
@@ -436,9 +577,9 @@
                       <position x="328" y="180"/>
                       <position x="317" y="180"/>
                       <position x="317" y="213"/>
-                      <position x="596" y="213"/>
-                      <position x="596" y="149"/>
-                      <position x="586" y="149"/>
+                      <position x="604" y="213"/>
+                      <position x="604" y="152"/>
+                      <position x="594" y="152"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -447,26 +588,26 @@
               <outputVariables>
                 <variable formalParameter="OUT">
                   <connectionPointOut>
-                    <relPosition x="57" y="35"/>
+                    <relPosition x="69" y="35"/>
                   </connectionPointOut>
                 </variable>
               </outputVariables>
             </block>
-            <inVariable localId="5" executionOrderId="0" height="24" width="158" negated="false">
+            <inVariable localId="5" executionOrderId="0" height="30" width="163" negated="false">
               <position x="222" y="256"/>
               <connectionPointOut>
-                <relPosition x="158" y="12"/>
+                <relPosition x="163" y="15"/>
               </connectionPointOut>
               <expression>ResetCounterValue</expression>
             </inVariable>
-            <inVariable localId="6" executionOrderId="0" height="24" width="21" negated="false">
-              <position x="254" y="138"/>
-              <connectionPointOut>
-                <relPosition x="21" y="12"/>
+            <inVariable localId="6" executionOrderId="0" height="30" width="21" negated="false">
+              <position x="254" y="135"/>
+              <connectionPointOut>
+                <relPosition x="21" y="15"/>
               </connectionPointOut>
               <expression>1</expression>
             </inVariable>
-            <block localId="7" typeName="SEL" executionOrderId="0" height="80" width="57">
+            <block localId="7" typeName="SEL" executionOrderId="0" height="80" width="69">
               <position x="448" y="100"/>
               <inputVariables>
                 <variable formalParameter="G">
@@ -475,8 +616,8 @@
                     <connection refLocalId="1">
                       <position x="448" y="130"/>
                       <position x="415" y="130"/>
-                      <position x="415" y="70"/>
-                      <position x="382" y="70"/>
+                      <position x="415" y="73"/>
+                      <position x="382" y="73"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -485,7 +626,7 @@
                     <relPosition x="0" y="50"/>
                     <connection refLocalId="4" formalParameter="OUT">
                       <position x="448" y="150"/>
-                      <position x="385" y="150"/>
+                      <position x="397" y="150"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -495,8 +636,8 @@
                     <connection refLocalId="5">
                       <position x="448" y="170"/>
                       <position x="414" y="170"/>
-                      <position x="414" y="268"/>
-                      <position x="380" y="268"/>
+                      <position x="414" y="271"/>
+                      <position x="385" y="271"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -505,7 +646,7 @@
               <outputVariables>
                 <variable formalParameter="OUT">
                   <connectionPointOut>
-                    <relPosition x="57" y="30"/>
+                    <relPosition x="69" y="30"/>
                   </connectionPointOut>
                 </variable>
               </outputVariables>
@@ -547,10 +688,10 @@
         <actions/>
         <body>
           <SFC>
-            <step localId="1" name="Start" initialStep="true" height="28" width="90">
+            <step localId="1" name="Start" initialStep="true" height="34" width="90">
               <position x="241" y="14"/>
               <connectionPointOut formalParameter="">
-                <relPosition x="45" y="28"/>
+                <relPosition x="45" y="34"/>
               </connectionPointOut>
             </step>
             <selectionDivergence localId="2" height="1" width="431">
@@ -609,29 +750,29 @@
                 </inline>
               </condition>
             </transition>
-            <step localId="5" name="ResetCounter" initialStep="false" height="24" width="104">
-              <position x="449" y="190"/>
-              <connectionPointIn>
-                <relPosition x="52" y="0"/>
+            <step localId="5" name="ResetCounter" initialStep="false" height="30" width="134">
+              <position x="434" y="190"/>
+              <connectionPointIn>
+                <relPosition x="67" y="0"/>
                 <connection refLocalId="3">
                   <position x="501" y="190"/>
                   <position x="501" y="134"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut formalParameter="">
-                <relPosition x="52" y="24"/>
+                <relPosition x="67" y="30"/>
               </connectionPointOut>
               <connectionPointOutAction formalParameter="">
-                <relPosition x="104" y="12"/>
+                <relPosition x="134" y="15"/>
               </connectionPointOutAction>
             </step>
-            <actionBlock localId="6" height="63" width="222">
-              <position x="600" y="187"/>
+            <actionBlock localId="6" height="63" width="254">
+              <position x="641" y="190"/>
               <connectionPointIn>
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="5">
-                  <position x="600" y="202"/>
-                  <position x="553" y="202"/>
+                  <position x="641" y="205"/>
+                  <position x="568" y="205"/>
                 </connection>
               </connectionPointIn>
               <action localId="0">
@@ -651,7 +792,7 @@
                 </inline>
               </action>
             </actionBlock>
-            <step localId="7" name="Count" initialStep="false" height="24" width="85" executionOrderId="0">
+            <step localId="7" name="Count" initialStep="false" height="30" width="85" executionOrderId="0">
               <position x="28" y="191"/>
               <connectionPointIn>
                 <relPosition x="42" y="0"/>
@@ -661,19 +802,19 @@
                 </connection>
               </connectionPointIn>
               <connectionPointOut formalParameter="">
-                <relPosition x="42" y="24"/>
+                <relPosition x="42" y="30"/>
               </connectionPointOut>
               <connectionPointOutAction formalParameter="">
-                <relPosition x="85" y="12"/>
+                <relPosition x="85" y="15"/>
               </connectionPointOutAction>
             </step>
-            <actionBlock localId="8" height="52" width="148" executionOrderId="0">
-              <position x="135" y="188"/>
+            <actionBlock localId="8" height="52" width="164" executionOrderId="0">
+              <position x="154" y="191"/>
               <connectionPointIn>
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="7">
-                  <position x="135" y="203"/>
-                  <position x="113" y="203"/>
+                  <position x="154" y="206"/>
+                  <position x="113" y="206"/>
                 </connection>
               </connectionPointIn>
               <action localId="0">
@@ -749,7 +890,7 @@
                 <relPosition x="10" y="0"/>
                 <connection refLocalId="5">
                   <position x="501" y="248"/>
-                  <position x="501" y="214"/>
+                  <position x="501" y="220"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut>
@@ -852,32 +993,32 @@
         </interface>
         <body>
           <LD>
-            <outVariable localId="2" executionOrderId="0" height="24" width="34" negated="false">
-              <position x="527" y="90"/>
-              <connectionPointIn>
-                <relPosition x="0" y="12"/>
+            <outVariable localId="2" executionOrderId="0" height="30" width="34" negated="false">
+              <position x="527" y="87"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
                 <connection refLocalId="3">
                   <position x="527" y="102"/>
-                  <position x="438" y="102"/>
+                  <position x="443" y="102"/>
                 </connection>
               </connectionPointIn>
               <expression>Out</expression>
             </outVariable>
-            <inOutVariable localId="3" executionOrderId="0" height="24" width="29" negatedOut="false" negatedIn="false">
-              <position x="409" y="90"/>
-              <connectionPointIn>
-                <relPosition x="0" y="12"/>
+            <inOutVariable localId="3" executionOrderId="0" height="30" width="34" negatedOut="false" negatedIn="false">
+              <position x="409" y="87"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
                 <connection refLocalId="7" formalParameter="OUT">
                   <position x="409" y="102"/>
-                  <position x="357" y="102"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="29" y="12"/>
+                  <position x="367" y="102"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="34" y="15"/>
               </connectionPointOut>
               <expression>Cnt</expression>
             </inOutVariable>
-            <block localId="4" typeName="ADD" executionOrderId="0" height="80" width="57">
+            <block localId="4" typeName="ADD" executionOrderId="0" height="80" width="67">
               <position x="180" y="87"/>
               <inputVariables>
                 <variable formalParameter="IN1">
@@ -896,9 +1037,9 @@
                       <position x="180" y="152"/>
                       <position x="169" y="152"/>
                       <position x="169" y="185"/>
-                      <position x="448" y="185"/>
-                      <position x="448" y="102"/>
-                      <position x="438" y="102"/>
+                      <position x="453" y="185"/>
+                      <position x="453" y="102"/>
+                      <position x="443" y="102"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -907,26 +1048,26 @@
               <outputVariables>
                 <variable formalParameter="OUT">
                   <connectionPointOut>
-                    <relPosition x="57" y="35"/>
+                    <relPosition x="67" y="35"/>
                   </connectionPointOut>
                 </variable>
               </outputVariables>
             </block>
-            <inVariable localId="5" executionOrderId="0" height="24" width="158" negated="false">
+            <inVariable localId="5" executionOrderId="0" height="30" width="158" negated="false">
               <position x="74" y="228"/>
               <connectionPointOut>
-                <relPosition x="158" y="12"/>
+                <relPosition x="158" y="15"/>
               </connectionPointOut>
               <expression>ResetCounterValue</expression>
             </inVariable>
-            <inVariable localId="6" executionOrderId="0" height="24" width="21" negated="false">
-              <position x="106" y="110"/>
-              <connectionPointOut>
-                <relPosition x="21" y="12"/>
+            <inVariable localId="6" executionOrderId="0" height="30" width="21" negated="false">
+              <position x="106" y="107"/>
+              <connectionPointOut>
+                <relPosition x="21" y="15"/>
               </connectionPointOut>
               <expression>1</expression>
             </inVariable>
-            <block localId="7" typeName="SEL" executionOrderId="0" height="80" width="57">
+            <block localId="7" typeName="SEL" executionOrderId="0" height="80" width="67">
               <position x="300" y="72"/>
               <inputVariables>
                 <variable formalParameter="G">
@@ -945,7 +1086,7 @@
                     <relPosition x="0" y="50"/>
                     <connection refLocalId="4" formalParameter="OUT">
                       <position x="300" y="122"/>
-                      <position x="237" y="122"/>
+                      <position x="247" y="122"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -955,8 +1096,8 @@
                     <connection refLocalId="5">
                       <position x="300" y="142"/>
                       <position x="266" y="142"/>
-                      <position x="266" y="240"/>
-                      <position x="232" y="240"/>
+                      <position x="266" y="243"/>
+                      <position x="232" y="243"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -965,7 +1106,7 @@
               <outputVariables>
                 <variable formalParameter="OUT">
                   <connectionPointOut>
-                    <relPosition x="57" y="30"/>
+                    <relPosition x="67" y="30"/>
                   </connectionPointOut>
                 </variable>
               </outputVariables>
--- a/tests/genericmake/plc.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/genericmake/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,7 @@
 <?xml version='1.0' encoding='utf-8'?>
 <project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
   <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2014-01-19T11:14:47" contentDescription="This example shows how you can customize build process by using 'make'.&#10;"/>
-  <contentHeader name="Makefile Example" modificationDateTime="2016-10-14T14:00:01">
+  <contentHeader name="Makefile Example" modificationDateTime="2018-08-24T13:12:10">
     <coordinateInfo>
       <fbd>
         <scaling x="0" y="0"/>
@@ -34,25 +34,25 @@
         </interface>
         <body>
           <FBD>
-            <inVariable localId="1" executionOrderId="0" height="27" width="77" negated="false">
-              <position x="52" y="368"/>
+            <inVariable localId="1" executionOrderId="0" height="30" width="77" negated="false">
+              <position x="52" y="424"/>
               <connectionPointOut>
-                <relPosition x="77" y="13"/>
+                <relPosition x="77" y="15"/>
               </connectionPointOut>
               <expression>LocalVara</expression>
             </inVariable>
-            <outVariable localId="2" executionOrderId="0" height="27" width="77" negated="false">
-              <position x="167" y="368"/>
+            <outVariable localId="2" executionOrderId="0" height="30" width="77" negated="false">
+              <position x="167" y="424"/>
               <connectionPointIn>
-                <relPosition x="0" y="13"/>
+                <relPosition x="0" y="15"/>
                 <connection refLocalId="1">
-                  <position x="167" y="381"/>
-                  <position x="129" y="381"/>
+                  <position x="167" y="439"/>
+                  <position x="129" y="439"/>
                 </connection>
               </connectionPointIn>
               <expression>LocalVarb</expression>
             </outVariable>
-            <comment localId="3" height="310" width="760">
+            <comment localId="3" height="385" width="760">
               <position x="32" y="23"/>
               <content>
                 <xhtml:p><![CDATA[This example shows how you can customize build process by using 'make'.
--- a/tests/logging/beremiz.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/logging/beremiz.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version='1.0' encoding='utf-8'?>
 <BeremizRoot URI_location="LOCAL://">
   <TargetType/>
+  <Libraries Enable_Native_Library="true"/>
 </BeremizRoot>
--- a/tests/logging/plc.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/logging/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,7 @@
 <?xml version='1.0' encoding='utf-8'?>
 <project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
   <fileHeader companyName="Unknown" productName="Generic PLC" productVersion="1" creationDateTime="2013-01-29T14:01:00" contentDescription="This example shows logging functionality in Beremiz.&#10;Here are shown two ways of logging:&#10;- from IEC PLC program;&#10;- from python extension.&#10;"/>
-  <contentHeader name="Logging example" modificationDateTime="2016-09-09T17:54:15">
+  <contentHeader name="Logging example" modificationDateTime="2018-09-26T13:10:14">
     <coordinateInfo>
       <fbd>
         <scaling x="0" y="0"/>
@@ -52,22 +52,22 @@
         </interface>
         <body>
           <FBD>
-            <inVariable localId="2" height="30" width="170" executionOrderId="0" negated="false">
-              <position x="507" y="347"/>
-              <connectionPointOut>
-                <relPosition x="170" y="15"/>
+            <inVariable localId="2" height="30" width="218" executionOrderId="0" negated="false">
+              <position x="459" y="365"/>
+              <connectionPointOut>
+                <relPosition x="218" y="15"/>
               </connectionPointOut>
               <expression>'IEC side logging: beat #'</expression>
             </inVariable>
             <block localId="3" width="59" height="40" typeName="NOT" executionOrderId="0">
-              <position x="241" y="269"/>
+              <position x="241" y="287"/>
               <inputVariables>
                 <variable formalParameter="IN">
                   <connectionPointIn>
                     <relPosition x="0" y="30"/>
                     <connection refLocalId="14" formalParameter="Q">
-                      <position x="241" y="299"/>
-                      <position x="195" y="299"/>
+                      <position x="241" y="317"/>
+                      <position x="197" y="317"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -81,37 +81,37 @@
                 </variable>
               </outputVariables>
             </block>
-            <inOutVariable localId="4" height="27" width="51" executionOrderId="0" negatedOut="false" negatedIn="false">
-              <position x="66" y="286"/>
+            <inOutVariable localId="4" height="30" width="60" executionOrderId="0" negatedOut="false" negatedIn="false">
+              <position x="57" y="302"/>
               <connectionPointIn>
-                <relPosition x="0" y="13"/>
+                <relPosition x="0" y="15"/>
                 <connection refLocalId="3" formalParameter="OUT">
-                  <position x="66" y="299"/>
-                  <position x="37" y="299"/>
-                  <position x="37" y="372"/>
-                  <position x="314" y="372"/>
-                  <position x="314" y="299"/>
-                  <position x="300" y="299"/>
+                  <position x="57" y="317"/>
+                  <position x="37" y="317"/>
+                  <position x="37" y="390"/>
+                  <position x="314" y="390"/>
+                  <position x="314" y="317"/>
+                  <position x="300" y="317"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut>
-                <relPosition x="51" y="13"/>
+                <relPosition x="60" y="15"/>
               </connectionPointOut>
               <expression>beat</expression>
             </inOutVariable>
             <block localId="5" width="68" height="98" typeName="ADD" executionOrderId="0">
-              <position x="463" y="385"/>
+              <position x="463" y="403"/>
               <inputVariables>
                 <variable formalParameter="IN1">
                   <connectionPointIn>
                     <relPosition x="0" y="39"/>
                     <connection refLocalId="10" formalParameter="OUT">
-                      <position x="463" y="424"/>
-                      <position x="452" y="424"/>
-                      <position x="452" y="424"/>
-                      <position x="454" y="424"/>
-                      <position x="454" y="424"/>
-                      <position x="444" y="424"/>
+                      <position x="463" y="442"/>
+                      <position x="452" y="442"/>
+                      <position x="452" y="442"/>
+                      <position x="455" y="442"/>
+                      <position x="455" y="442"/>
+                      <position x="439" y="442"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -119,8 +119,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="78"/>
                     <connection refLocalId="6">
-                      <position x="463" y="463"/>
-                      <position x="444" y="463"/>
+                      <position x="463" y="481"/>
+                      <position x="438" y="481"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -134,33 +134,35 @@
                 </variable>
               </outputVariables>
             </block>
-            <inOutVariable localId="6" height="27" width="103" executionOrderId="0" negatedOut="false" negatedIn="false">
-              <position x="341" y="450"/>
+            <inOutVariable localId="6" height="30" width="103" executionOrderId="0" negatedOut="false" negatedIn="false">
+              <position x="335" y="466"/>
               <connectionPointIn>
-                <relPosition x="0" y="13"/>
+                <relPosition x="0" y="15"/>
                 <connection refLocalId="5" formalParameter="OUT">
-                  <position x="341" y="463"/>
-                  <position x="320" y="463"/>
-                  <position x="320" y="500"/>
-                  <position x="544" y="500"/>
-                  <position x="544" y="424"/>
-                  <position x="531" y="424"/>
+                  <position x="335" y="481"/>
+                  <position x="320" y="481"/>
+                  <position x="320" y="518"/>
+                  <position x="544" y="518"/>
+                  <position x="544" y="442"/>
+                  <position x="531" y="442"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut>
-                <relPosition x="103" y="13"/>
+                <relPosition x="103" y="15"/>
               </connectionPointOut>
               <expression>count</expression>
             </inOutVariable>
             <block localId="8" width="67" height="144" typeName="CONCAT" executionOrderId="0">
-              <position x="727" y="311"/>
+              <position x="727" y="329"/>
               <inputVariables>
                 <variable formalParameter="IN1">
                   <connectionPointIn>
                     <relPosition x="0" y="51"/>
                     <connection refLocalId="2">
-                      <position x="727" y="362"/>
-                      <position x="677" y="362"/>
+                      <position x="727" y="380"/>
+                      <position x="717" y="380"/>
+                      <position x="717" y="380"/>
+                      <position x="677" y="380"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -168,8 +170,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="113"/>
                     <connection refLocalId="9" formalParameter="OUT">
-                      <position x="727" y="424"/>
-                      <position x="677" y="424"/>
+                      <position x="727" y="442"/>
+                      <position x="680" y="442"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -183,70 +185,70 @@
                 </variable>
               </outputVariables>
             </block>
-            <block localId="9" width="116" height="40" typeName="INT_TO_STRING" executionOrderId="0">
-              <position x="561" y="394"/>
+            <block localId="9" width="119" height="40" typeName="INT_TO_STRING" executionOrderId="0">
+              <position x="561" y="412"/>
               <inputVariables>
                 <variable formalParameter="IN">
                   <connectionPointIn>
                     <relPosition x="0" y="30"/>
                     <connection refLocalId="5" formalParameter="OUT">
-                      <position x="561" y="424"/>
-                      <position x="531" y="424"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="116" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="10" width="105" height="40" typeName="BOOL_TO_INT" executionOrderId="0">
-              <position x="339" y="394"/>
+                      <position x="561" y="442"/>
+                      <position x="531" y="442"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="119" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="10" width="106" height="40" typeName="BOOL_TO_INT" executionOrderId="0">
+              <position x="333" y="412"/>
               <inputVariables>
                 <variable formalParameter="IN" edge="rising">
                   <connectionPointIn>
                     <relPosition x="0" y="30"/>
                     <connection refLocalId="3" formalParameter="OUT">
-                      <position x="339" y="424"/>
-                      <position x="314" y="424"/>
-                      <position x="314" y="299"/>
-                      <position x="300" y="299"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="105" y="30"/>
+                      <position x="333" y="442"/>
+                      <position x="314" y="442"/>
+                      <position x="314" y="317"/>
+                      <position x="300" y="317"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="106" y="30"/>
                   </connectionPointOut>
                 </variable>
               </outputVariables>
             </block>
             <block localId="11" width="65" height="209" typeName="LOGGER" instanceName="LOGGER0" executionOrderId="0">
-              <position x="907" y="248"/>
+              <position x="907" y="266"/>
               <inputVariables>
                 <variable formalParameter="TRIG">
                   <connectionPointIn>
-                    <relPosition x="0" y="52"/>
+                    <relPosition x="0" y="51"/>
                     <connection refLocalId="3" formalParameter="OUT">
-                      <position x="907" y="300"/>
-                      <position x="300" y="300"/>
+                      <position x="907" y="317"/>
+                      <position x="300" y="317"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
                 <variable formalParameter="MSG">
                   <connectionPointIn>
-                    <relPosition x="0" y="112"/>
+                    <relPosition x="0" y="114"/>
                     <connection refLocalId="8" formalParameter="OUT">
-                      <position x="907" y="360"/>
-                      <position x="794" y="360"/>
+                      <position x="907" y="380"/>
+                      <position x="794" y="380"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -254,8 +256,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="177"/>
                     <connection refLocalId="12">
-                      <position x="907" y="425"/>
-                      <position x="879" y="425"/>
+                      <position x="907" y="443"/>
+                      <position x="880" y="443"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -263,22 +265,22 @@
               <inOutVariables/>
               <outputVariables/>
             </block>
-            <inVariable localId="12" height="27" width="79" executionOrderId="0" negated="false">
-              <position x="800" y="412"/>
-              <connectionPointOut>
-                <relPosition x="79" y="13"/>
+            <inVariable localId="12" height="30" width="79" executionOrderId="0" negated="false">
+              <position x="801" y="428"/>
+              <connectionPointOut>
+                <relPosition x="79" y="15"/>
               </connectionPointOut>
               <expression>lvl</expression>
             </inVariable>
-            <block localId="14" typeName="TOF" instanceName="Timer" executionOrderId="0" height="98" width="45">
-              <position x="150" y="260"/>
+            <block localId="14" typeName="TOF" instanceName="Timer" executionOrderId="0" height="98" width="47">
+              <position x="150" y="278"/>
               <inputVariables>
                 <variable formalParameter="IN">
                   <connectionPointIn>
                     <relPosition x="0" y="39"/>
                     <connection refLocalId="4">
-                      <position x="150" y="299"/>
-                      <position x="117" y="299"/>
+                      <position x="150" y="317"/>
+                      <position x="117" y="317"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -286,8 +288,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="78"/>
                     <connection refLocalId="1">
-                      <position x="150" y="338"/>
-                      <position x="117" y="338"/>
+                      <position x="150" y="356"/>
+                      <position x="117" y="356"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -296,25 +298,25 @@
               <outputVariables>
                 <variable formalParameter="Q">
                   <connectionPointOut>
-                    <relPosition x="45" y="39"/>
+                    <relPosition x="47" y="39"/>
                   </connectionPointOut>
                 </variable>
                 <variable formalParameter="ET">
                   <connectionPointOut>
-                    <relPosition x="45" y="78"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="1" executionOrderId="0" height="24" width="52" negated="false">
-              <position x="65" y="326"/>
-              <connectionPointOut>
-                <relPosition x="52" y="12"/>
+                    <relPosition x="47" y="78"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="1" executionOrderId="0" height="30" width="61" negated="false">
+              <position x="56" y="341"/>
+              <connectionPointOut>
+                <relPosition x="61" y="15"/>
               </connectionPointOut>
               <expression>T#3s</expression>
             </inVariable>
-            <comment localId="15" height="212" width="675">
-              <position x="27" y="16"/>
+            <comment localId="15" height="249" width="682">
+              <position x="19" y="8"/>
               <content>
                 <xhtml:p><![CDATA[This example shows logging functionality in Beremiz.
 Here are shown two ways of logging:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/beremiz.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="LOCAL://">
+  <TargetType>
+    <Linux/>
+  </TargetType>
+</BeremizRoot>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/ModbusRequest_0@ModbusRequest/baseconfnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="ModbusRequest_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/ModbusRequest_0@ModbusRequest/confnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<ModbusRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema" Function="16 - Write Multiple Registers" SlaveID="0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/ModbusRequest_1@ModbusRequest/baseconfnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="1" Name="ModbusRequest_1"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/ModbusRequest_1@ModbusRequest/confnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<ModbusRequest xmlns:xsd="http://www.w3.org/2001/XMLSchema" Function="04 - Read Input Registers" SlaveID="0" Start_Address="0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/baseconfnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="ModbusTCPclient_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/ModbusTCPclient_0@ModbusTCPclient/confnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<ModbusTCPclient xmlns:xsd="http://www.w3.org/2001/XMLSchema" Remote_Port_Number="1502"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/HoldingRegs@MemoryArea/baseconfnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="HoldingRegs"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/HoldingRegs@MemoryArea/confnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<MemoryArea xmlns:xsd="http://www.w3.org/2001/XMLSchema" MemoryAreaType="03 - Holding Registers" Nr_of_Channels="1"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/InputRegs@MemoryArea/baseconfnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="1" Name="InputRegs"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/InputRegs@MemoryArea/confnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<MemoryArea xmlns:xsd="http://www.w3.org/2001/XMLSchema" MemoryAreaType="04 - Input Registers"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/baseconfnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="1" Name="ModbusTCPserver_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/ModbusTCPserver_0@ModbusTCPserver/confnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<ModbusServerNode xmlns:xsd="http://www.w3.org/2001/XMLSchema" Local_Port_Number="1502" Local_IP_Address="127.0.0.1"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/baseconfnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams xmlns:xsd="http://www.w3.org/2001/XMLSchema" IEC_Channel="0" Name="modbus_0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/modbus_0@modbus/confnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<ModbusRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/modbus/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,314 @@
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="Beremiz" productName="Beremiz" productVersion="1" creationDateTime="2018-07-27T13:19:12"/>
+  <contentHeader name="Modbus" modificationDateTime="2018-07-27T15:43:56">
+    <coordinateInfo>
+      <fbd>
+        <scaling x="0" y="0"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="program0" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="Counter">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="CounterReadBack">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </localVars>
+          <localVars>
+            <variable name="MasterWriteToReg0" address="%QW0.0.0.0">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="MasterReadFromReg1" address="%IW0.0.1.0">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="SlaveHoldReg0" address="%IW0.1.0.0">
+              <type>
+                <WORD/>
+              </type>
+            </variable>
+            <variable name="SlaveInputReg0" address="%QW0.1.1.0">
+              <type>
+                <WORD/>
+              </type>
+            </variable>
+          </localVars>
+          <localVars>
+            <variable name="CTU0">
+              <type>
+                <derived name="CTU"/>
+              </type>
+            </variable>
+            <variable name="Generator0">
+              <type>
+                <derived name="Generator"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <comment localId="4" height="109" width="350">
+              <position x="102" y="438"/>
+              <content>
+                <xhtml:p><![CDATA[Modbus TCP Master writes counter value to one holding register on Modbus TCP Slave and reads it back from other input register.]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="3" height="407" width="680">
+              <position x="21" y="15"/>
+              <content>
+                <xhtml:p><![CDATA[This examples shows how to work with Modbus extension. It uses Modbus TCP, but the same functions are available for Modbus RTU as well. Buth protocols are supported.
+
+Modbus extensions requires native Modbus RTU/TCP library to be installed nearby Beremiz.
+Following directory structure is expected:
+<Parent directory>
+  "beremiz"
+  "Modbus"
+
+If Modbus library is installed elsewhere, then place corresponding paths
+in CFLAGS/LDFLAGS in project settings.
+
+For GNU/Linux to install Modbus library in parent directory run following commands:
+$ hg clone https://bitbucket.org/mjsousa/modbus Modbus
+$ cd Modbus
+$ make
+
+After that Modbus extension is ready to be used in Beremiz projects.]]></xhtml:p>
+              </content>
+            </comment>
+            <block localId="5" typeName="CTU" instanceName="CTU0" executionOrderId="0" height="80" width="52">
+              <position x="346" y="605"/>
+              <inputVariables>
+                <variable formalParameter="CU" edge="rising">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="6" formalParameter="OUT">
+                      <position x="346" y="635"/>
+                      <position x="303" y="635"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="R">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="PV">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="7">
+                      <position x="346" y="675"/>
+                      <position x="324" y="675"/>
+                      <position x="324" y="703"/>
+                      <position x="302" y="703"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q">
+                  <connectionPointOut>
+                    <relPosition x="52" y="30"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="CV">
+                  <connectionPointOut>
+                    <relPosition x="52" y="50"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="6" typeName="Generator" instanceName="Generator0" executionOrderId="0" height="60" width="79">
+              <position x="224" y="605"/>
+              <inputVariables>
+                <variable formalParameter="PON">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="1">
+                      <position x="224" y="635"/>
+                      <position x="154" y="635"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="POFF">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="1">
+                      <position x="224" y="655"/>
+                      <position x="189" y="655"/>
+                      <position x="189" y="635"/>
+                      <position x="154" y="635"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="79" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="1" executionOrderId="0" height="30" width="138" negated="false">
+              <position x="16" y="620"/>
+              <connectionPointOut>
+                <relPosition x="138" y="15"/>
+              </connectionPointOut>
+              <expression>T#1s</expression>
+            </inVariable>
+            <inVariable localId="7" executionOrderId="0" height="30" width="138" negated="false">
+              <position x="164" y="688"/>
+              <connectionPointOut>
+                <relPosition x="138" y="15"/>
+              </connectionPointOut>
+              <expression>32767</expression>
+            </inVariable>
+            <inOutVariable localId="2" executionOrderId="0" height="30" width="138" negatedOut="false" negatedIn="false">
+              <position x="544" y="640"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="5" formalParameter="CV">
+                  <position x="544" y="655"/>
+                  <position x="398" y="655"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="138" y="15"/>
+              </connectionPointOut>
+              <expression>Counter</expression>
+            </inOutVariable>
+            <outVariable localId="8" executionOrderId="0" height="30" width="138" negated="false">
+              <position x="762" y="640"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="2">
+                  <position x="762" y="655"/>
+                  <position x="682" y="655"/>
+                </connection>
+              </connectionPointIn>
+              <expression>MasterWriteToReg0</expression>
+            </outVariable>
+            <inVariable localId="9" executionOrderId="0" height="30" width="152" negated="false">
+              <position x="81" y="747"/>
+              <connectionPointOut>
+                <relPosition x="152" y="15"/>
+              </connectionPointOut>
+              <expression>MasterReadFromReg1</expression>
+            </inVariable>
+            <outVariable localId="10" executionOrderId="0" height="30" width="137" negated="false">
+              <position x="547" y="747"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="9">
+                  <position x="547" y="762"/>
+                  <position x="233" y="762"/>
+                </connection>
+              </connectionPointIn>
+              <expression>CounterReadBack</expression>
+            </outVariable>
+            <comment localId="11" height="109" width="350">
+              <position x="85" y="825"/>
+              <content>
+                <xhtml:p><![CDATA[Modbus TCP Slave just copies received register value from holding register to input register.]]></xhtml:p>
+              </content>
+            </comment>
+            <inVariable localId="12" executionOrderId="0" height="30" width="152" negated="false">
+              <position x="82" y="970"/>
+              <connectionPointOut>
+                <relPosition x="152" y="15"/>
+              </connectionPointOut>
+              <expression>SlaveHoldReg0</expression>
+            </inVariable>
+            <outVariable localId="13" executionOrderId="0" height="30" width="123" negated="false">
+              <position x="548" y="970"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="12">
+                  <position x="548" y="985"/>
+                  <position x="234" y="985"/>
+                </connection>
+              </connectionPointIn>
+              <expression>SlaveInputReg0</expression>
+            </outVariable>
+          </FBD>
+        </body>
+      </pou>
+      <pou name="Generator" pouType="functionBlock">
+        <interface>
+          <outputVars>
+            <variable name="OUT">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </outputVars>
+          <inputVars>
+            <variable name="PON">
+              <type>
+                <TIME/>
+              </type>
+            </variable>
+            <variable name="POFF">
+              <type>
+                <TIME/>
+              </type>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="T1">
+              <type>
+                <derived name="TON"/>
+              </type>
+            </variable>
+            <variable name="T2">
+              <type>
+                <derived name="TOF"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <ST>
+            <xhtml:p><![CDATA[T1( IN := NOT T2.Q, PT := POFF);
+T2( IN := T1.Q,     PT := PON);
+OUT := T2.Q;]]></xhtml:p>
+          </ST>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="config">
+        <resource name="resource1">
+          <task name="task0" priority="0" interval="T#20ms">
+            <pouInstance name="instance0" typeName="program0"/>
+          </task>
+        </resource>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
--- a/tests/python/beremiz.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/python/beremiz.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,4 +1,5 @@
 <?xml version='1.0' encoding='utf-8'?>
 <BeremizRoot URI_location="LOCAL://">
   <TargetType/>
+  <Libraries Enable_Python_Library="true"/>
 </BeremizRoot>
--- a/tests/python/plc.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/python/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,7 @@
 <?xml version='1.0' encoding='utf-8'?>
 <project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
   <fileHeader companyName="" productName="Beremiz" productVersion="0.0" creationDateTime="2008-12-14T16:21:19" contentDescription="This example shows many features in Beremiz:&#10;&#10;   1. How to implement python extensions.&#10;   2. How to implement basic C extension.&#10;   3. How to use C code in IEC POUs.&#10;   4. How to call C functions from python code.&#10;   5. How to avoid race conditions between IEC, C and python code.&#10;   6. How to convert betweet different IEC types.&#10;"/>
-  <contentHeader name="Beremiz Python Support Tests" modificationDateTime="2016-10-12T14:15:35">
+  <contentHeader name="Beremiz Python Support Tests" modificationDateTime="2018-09-26T13:15:28">
     <coordinateInfo>
       <pageSize x="1024" y="1024"/>
       <fbd>
@@ -245,13 +245,13 @@
               <expression>'time.sleep(1)'</expression>
             </inVariable>
             <block localId="5" width="125" height="80" typeName="python_eval" instanceName="py1" executionOrderId="0">
-              <position x="650" y="400"/>
+              <position x="686" y="400"/>
               <inputVariables>
                 <variable formalParameter="TRIG">
                   <connectionPointIn>
                     <relPosition x="0" y="35"/>
                     <connection refLocalId="7" formalParameter="OUT">
-                      <position x="650" y="435"/>
+                      <position x="686" y="435"/>
                       <position x="285" y="435"/>
                       <position x="285" y="480"/>
                       <position x="250" y="480"/>
@@ -262,7 +262,7 @@
                   <connectionPointIn>
                     <relPosition x="0" y="65"/>
                     <connection refLocalId="4">
-                      <position x="650" y="465"/>
+                      <position x="686" y="465"/>
                       <position x="455" y="465"/>
                     </connection>
                   </connectionPointIn>
@@ -323,14 +323,14 @@
               <expression>pytest_var2</expression>
             </inOutVariable>
             <block localId="8" width="125" height="80" typeName="python_eval" instanceName="Block1" executionOrderId="0">
-              <position x="650" y="515"/>
+              <position x="686" y="545"/>
               <inputVariables>
                 <variable formalParameter="TRIG">
                   <connectionPointIn>
                     <relPosition x="0" y="35"/>
                     <connection refLocalId="7" formalParameter="OUT">
-                      <position x="650" y="550"/>
-                      <position x="285" y="550"/>
+                      <position x="686" y="580"/>
+                      <position x="285" y="580"/>
                       <position x="285" y="480"/>
                       <position x="250" y="480"/>
                     </connection>
@@ -340,8 +340,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="65"/>
                     <connection refLocalId="9">
-                      <position x="650" y="580"/>
-                      <position x="585" y="580"/>
+                      <position x="686" y="610"/>
+                      <position x="665" y="610"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -360,29 +360,29 @@
                 </variable>
               </outputVariables>
             </block>
-            <inVariable localId="9" height="30" width="290" executionOrderId="0" negated="false">
-              <position x="295" y="565"/>
+            <inVariable localId="9" height="30" width="370" executionOrderId="0" negated="false">
+              <position x="295" y="595"/>
+              <connectionPointOut>
+                <relPosition x="370" y="15"/>
+              </connectionPointOut>
+              <expression>'sys.stdout.write("FBID :"+str(FBID)+"\n")'</expression>
+            </inVariable>
+            <inVariable localId="11" height="30" width="290" executionOrderId="0" negated="false">
+              <position x="295" y="735"/>
               <connectionPointOut>
                 <relPosition x="290" y="15"/>
               </connectionPointOut>
-              <expression>'sys.stdout.write("FBID :"+str(FBID)+"\n")'</expression>
-            </inVariable>
-            <inVariable localId="11" height="30" width="290" executionOrderId="0" negated="false">
-              <position x="295" y="685"/>
-              <connectionPointOut>
-                <relPosition x="290" y="15"/>
-              </connectionPointOut>
               <expression>'PLCBinary.Simple_C_Call(5678)'</expression>
             </inVariable>
             <block localId="12" width="125" height="80" typeName="python_eval" instanceName="Block2" executionOrderId="0">
-              <position x="650" y="637"/>
+              <position x="686" y="687"/>
               <inputVariables>
                 <variable formalParameter="TRIG">
                   <connectionPointIn>
                     <relPosition x="0" y="33"/>
                     <connection refLocalId="7" formalParameter="OUT">
-                      <position x="650" y="670"/>
-                      <position x="285" y="670"/>
+                      <position x="686" y="720"/>
+                      <position x="285" y="720"/>
                       <position x="285" y="480"/>
                       <position x="250" y="480"/>
                     </connection>
@@ -392,8 +392,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="63"/>
                     <connection refLocalId="11">
-                      <position x="650" y="700"/>
-                      <position x="585" y="700"/>
+                      <position x="686" y="750"/>
+                      <position x="585" y="750"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -413,21 +413,21 @@
               </outputVariables>
             </block>
             <inVariable localId="14" height="30" width="290" executionOrderId="0" negated="false">
-              <position x="290" y="810"/>
+              <position x="290" y="885"/>
               <connectionPointOut>
                 <relPosition x="290" y="15"/>
               </connectionPointOut>
               <expression>'MyPythonFunc(42)'</expression>
             </inVariable>
             <block localId="15" width="125" height="80" typeName="python_eval" instanceName="Block3" executionOrderId="0">
-              <position x="650" y="762"/>
+              <position x="686" y="837"/>
               <inputVariables>
                 <variable formalParameter="TRIG">
                   <connectionPointIn>
                     <relPosition x="0" y="33"/>
                     <connection refLocalId="7" formalParameter="OUT">
-                      <position x="650" y="795"/>
-                      <position x="285" y="795"/>
+                      <position x="686" y="870"/>
+                      <position x="285" y="870"/>
                       <position x="285" y="480"/>
                       <position x="250" y="480"/>
                     </connection>
@@ -437,8 +437,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="63"/>
                     <connection refLocalId="14">
-                      <position x="650" y="825"/>
-                      <position x="580" y="825"/>
+                      <position x="686" y="900"/>
+                      <position x="580" y="900"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -464,16 +464,16 @@
               </content>
             </comment>
             <block localId="17" width="80" height="120" typeName="MUX" executionOrderId="0">
-              <position x="1065" y="715"/>
+              <position x="1101" y="790"/>
               <inputVariables>
                 <variable formalParameter="K">
                   <connectionPointIn>
                     <relPosition x="0" y="30"/>
                     <connection refLocalId="18">
-                      <position x="1065" y="745"/>
-                      <position x="1040" y="745"/>
-                      <position x="1040" y="735"/>
-                      <position x="1015" y="735"/>
+                      <position x="1101" y="820"/>
+                      <position x="1076" y="820"/>
+                      <position x="1076" y="810"/>
+                      <position x="1060" y="810"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -481,10 +481,10 @@
                   <connectionPointIn>
                     <relPosition x="0" y="50"/>
                     <connection refLocalId="5" formalParameter="RESULT">
-                      <position x="1065" y="765"/>
-                      <position x="905" y="765"/>
-                      <position x="905" y="465"/>
-                      <position x="775" y="465"/>
+                      <position x="1101" y="840"/>
+                      <position x="941" y="840"/>
+                      <position x="941" y="465"/>
+                      <position x="811" y="465"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -492,10 +492,10 @@
                   <connectionPointIn>
                     <relPosition x="0" y="70"/>
                     <connection refLocalId="8" formalParameter="RESULT">
-                      <position x="1065" y="785"/>
-                      <position x="890" y="785"/>
-                      <position x="890" y="580"/>
-                      <position x="775" y="580"/>
+                      <position x="1101" y="860"/>
+                      <position x="926" y="860"/>
+                      <position x="926" y="610"/>
+                      <position x="811" y="610"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -503,10 +503,10 @@
                   <connectionPointIn>
                     <relPosition x="0" y="90"/>
                     <connection refLocalId="12" formalParameter="RESULT">
-                      <position x="1065" y="805"/>
-                      <position x="875" y="805"/>
-                      <position x="875" y="700"/>
-                      <position x="775" y="700"/>
+                      <position x="1101" y="880"/>
+                      <position x="911" y="880"/>
+                      <position x="911" y="750"/>
+                      <position x="811" y="750"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -514,8 +514,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="110"/>
                     <connection refLocalId="15" formalParameter="RESULT">
-                      <position x="1065" y="825"/>
-                      <position x="775" y="825"/>
+                      <position x="1101" y="900"/>
+                      <position x="811" y="900"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -530,27 +530,27 @@
               </outputVariables>
             </block>
             <outVariable localId="19" height="35" width="125" executionOrderId="0" negated="false">
-              <position x="1235" y="730"/>
+              <position x="1271" y="805"/>
               <connectionPointIn>
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="17" formalParameter="OUT">
-                  <position x="1235" y="745"/>
-                  <position x="1145" y="745"/>
+                  <position x="1271" y="820"/>
+                  <position x="1181" y="820"/>
                 </connection>
               </connectionPointIn>
               <expression>pytest_var1</expression>
             </outVariable>
             <block localId="21" width="80" height="120" typeName="MUX" executionOrderId="0">
-              <position x="1070" y="385"/>
+              <position x="1106" y="385"/>
               <inputVariables>
                 <variable formalParameter="K">
                   <connectionPointIn>
                     <relPosition x="0" y="30"/>
                     <connection refLocalId="22">
-                      <position x="1070" y="415"/>
-                      <position x="1040" y="415"/>
-                      <position x="1040" y="405"/>
-                      <position x="1010" y="405"/>
+                      <position x="1106" y="415"/>
+                      <position x="1076" y="415"/>
+                      <position x="1076" y="405"/>
+                      <position x="1055" y="405"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -558,8 +558,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="50"/>
                     <connection refLocalId="5" formalParameter="ACK">
-                      <position x="1070" y="435"/>
-                      <position x="775" y="435"/>
+                      <position x="1106" y="435"/>
+                      <position x="811" y="435"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -567,10 +567,10 @@
                   <connectionPointIn>
                     <relPosition x="0" y="70"/>
                     <connection refLocalId="8" formalParameter="ACK">
-                      <position x="1070" y="455"/>
-                      <position x="805" y="455"/>
-                      <position x="805" y="550"/>
-                      <position x="775" y="550"/>
+                      <position x="1106" y="455"/>
+                      <position x="841" y="455"/>
+                      <position x="841" y="580"/>
+                      <position x="811" y="580"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -578,10 +578,10 @@
                   <connectionPointIn>
                     <relPosition x="0" y="90"/>
                     <connection refLocalId="12" formalParameter="ACK">
-                      <position x="1070" y="475"/>
-                      <position x="820" y="475"/>
-                      <position x="820" y="670"/>
-                      <position x="775" y="670"/>
+                      <position x="1106" y="475"/>
+                      <position x="856" y="475"/>
+                      <position x="856" y="720"/>
+                      <position x="811" y="720"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -589,10 +589,10 @@
                   <connectionPointIn>
                     <relPosition x="0" y="110"/>
                     <connection refLocalId="15" formalParameter="ACK">
-                      <position x="1070" y="495"/>
-                      <position x="835" y="495"/>
-                      <position x="835" y="795"/>
-                      <position x="775" y="795"/>
+                      <position x="1106" y="495"/>
+                      <position x="871" y="495"/>
+                      <position x="871" y="870"/>
+                      <position x="811" y="870"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -606,20 +606,20 @@
                 </variable>
               </outputVariables>
             </block>
-            <inVariable localId="22" height="30" width="65" executionOrderId="0" negated="false">
-              <position x="945" y="390"/>
-              <connectionPointOut>
-                <relPosition x="65" y="15"/>
+            <inVariable localId="22" height="30" width="74" executionOrderId="0" negated="false">
+              <position x="981" y="390"/>
+              <connectionPointOut>
+                <relPosition x="74" y="15"/>
               </connectionPointOut>
               <expression>mux1_sel</expression>
             </inVariable>
             <outVariable localId="23" height="35" width="125" executionOrderId="0" negated="false">
-              <position x="1235" y="400"/>
+              <position x="1271" y="400"/>
               <connectionPointIn>
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="21" formalParameter="OUT">
-                  <position x="1235" y="415"/>
-                  <position x="1150" y="415"/>
+                  <position x="1271" y="415"/>
+                  <position x="1186" y="415"/>
                 </connection>
               </connectionPointIn>
               <expression>pytest_var3</expression>
@@ -700,44 +700,44 @@
               </connectionPointOut>
               <expression>10</expression>
             </inVariable>
-            <comment localId="30" height="75" width="465">
-              <position x="50" y="945"/>
+            <comment localId="30" height="105" width="465">
+              <position x="50" y="925"/>
               <content>
                 <xhtml:p><![CDATA[You will be ready to use beremiz with C and Python when you will understand why "FromInput" is equal  to 75.
 Happy hacking! ]]></xhtml:p>
               </content>
             </comment>
-            <comment localId="31" height="60" width="345">
+            <comment localId="31" height="90" width="345">
               <position x="295" y="485"/>
               <content>
                 <xhtml:p><![CDATA[Sleep here is bad. It blocks other py_eval instances. Whith a wxGlade GUI, GUI freeze for a second.]]></xhtml:p>
               </content>
             </comment>
-            <comment localId="6" height="60" width="345">
-              <position x="295" y="600"/>
+            <comment localId="6" height="80" width="345">
+              <position x="295" y="630"/>
               <content>
                 <xhtml:p><![CDATA[Prints FBID to stdout of PLC runtime. FBID is a unique reference to py_eval instance.]]></xhtml:p>
               </content>
             </comment>
-            <comment localId="10" height="60" width="345">
-              <position x="295" y="720"/>
+            <comment localId="10" height="85" width="345">
+              <position x="295" y="770"/>
               <content>
                 <xhtml:p><![CDATA[Simple_C_Call is declared in C_File "1.x:c_code". See python ctypes manual for details on typing.]]></xhtml:p>
               </content>
             </comment>
-            <comment localId="32" height="105" width="235">
+            <comment localId="32" height="145" width="235">
               <position x="25" y="505"/>
               <content>
                 <xhtml:p><![CDATA[Fast clock, at least faster that sleep(1). See what happens when python takes time to answer : PLC continues.]]></xhtml:p>
               </content>
             </comment>
-            <outVariable localId="33" height="30" width="130" executionOrderId="0" negated="false">
+            <outVariable localId="33" height="30" width="133" executionOrderId="0" negated="false">
               <position x="580" y="1564"/>
               <connectionPointIn>
                 <relPosition x="0" y="16"/>
                 <connection refLocalId="35" formalParameter="OUT">
                   <position x="580" y="1580"/>
-                  <position x="370" y="1580"/>
+                  <position x="371" y="1580"/>
                 </connection>
               </connectionPointIn>
               <expression>Test_BCD_RESULT</expression>
@@ -749,7 +749,7 @@
               </connectionPointOut>
               <expression>Test_BCD</expression>
             </inVariable>
-            <block localId="35" width="105" height="60" typeName="BCD_TO_UINT" executionOrderId="0">
+            <block localId="35" width="106" height="60" typeName="BCD_TO_UINT" executionOrderId="0">
               <position x="265" y="1539"/>
               <inputVariables>
                 <variable formalParameter="IN">
@@ -766,15 +766,15 @@
               <outputVariables>
                 <variable formalParameter="OUT">
                   <connectionPointOut>
-                    <relPosition x="105" y="41"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="36" height="30" width="65" executionOrderId="0" negated="false">
+                    <relPosition x="106" y="41"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="36" height="30" width="66" executionOrderId="0" negated="false">
               <position x="60" y="1774"/>
               <connectionPointOut>
-                <relPosition x="65" y="16"/>
+                <relPosition x="66" y="16"/>
               </connectionPointOut>
               <expression>Test_DT</expression>
             </inVariable>
@@ -824,7 +824,7 @@
                 </variable>
               </outputVariables>
             </block>
-            <outVariable localId="40" height="30" width="80" executionOrderId="0" negated="false">
+            <outVariable localId="40" height="30" width="82" executionOrderId="0" negated="false">
               <position x="580" y="1849"/>
               <connectionPointIn>
                 <relPosition x="0" y="16"/>
@@ -835,7 +835,7 @@
               </connectionPointIn>
               <expression>Test_Date</expression>
             </outVariable>
-            <outVariable localId="42" height="30" width="90" executionOrderId="0" negated="false">
+            <outVariable localId="42" height="30" width="98" executionOrderId="0" negated="false">
               <position x="465" y="1944"/>
               <connectionPointIn>
                 <relPosition x="0" y="16"/>
@@ -846,7 +846,7 @@
               </connectionPointIn>
               <expression>Test_String</expression>
             </outVariable>
-            <outVariable localId="43" height="30" width="80" executionOrderId="0" negated="false">
+            <outVariable localId="43" height="30" width="82" executionOrderId="0" negated="false">
               <position x="465" y="2014"/>
               <connectionPointIn>
                 <relPosition x="0" y="16"/>
@@ -879,10 +879,10 @@
                 </variable>
               </outputVariables>
             </block>
-            <inVariable localId="45" height="30" width="55" executionOrderId="0" negated="false">
+            <inVariable localId="45" height="30" width="58" executionOrderId="0" negated="false">
               <position x="60" y="2014"/>
               <connectionPointOut>
-                <relPosition x="55" y="16"/>
+                <relPosition x="58" y="16"/>
               </connectionPointOut>
               <expression>'True'</expression>
             </inVariable>
@@ -908,10 +908,10 @@
                 </variable>
               </outputVariables>
             </block>
-            <inVariable localId="50" height="30" width="105" executionOrderId="0" negated="false">
+            <inVariable localId="50" height="30" width="106" executionOrderId="0" negated="false">
               <position x="75" y="2275"/>
               <connectionPointOut>
-                <relPosition x="105" y="15"/>
+                <relPosition x="106" y="15"/>
               </connectionPointOut>
               <expression>Global_RS.Q1</expression>
             </inVariable>
@@ -964,7 +964,7 @@
               </connectionPointIn>
               <expression>Global_RS.S</expression>
             </outVariable>
-            <outVariable localId="20" height="30" width="105" executionOrderId="0" negated="false">
+            <outVariable localId="20" height="30" width="106" executionOrderId="0" negated="false">
               <position x="385" y="2390"/>
               <connectionPointIn>
                 <relPosition x="0" y="15"/>
@@ -975,10 +975,10 @@
               </connectionPointIn>
               <expression>Global_RS.R1</expression>
             </outVariable>
-            <inVariable localId="24" height="30" width="105" executionOrderId="0" negated="false">
+            <inVariable localId="24" height="30" width="106" executionOrderId="0" negated="false">
               <position x="75" y="2390"/>
               <connectionPointOut>
-                <relPosition x="105" y="15"/>
+                <relPosition x="106" y="15"/>
               </connectionPointOut>
               <expression>Global_RS.Q1</expression>
             </inVariable>
@@ -1098,14 +1098,14 @@
               </connectionPointIn>
               <expression>TUTU</expression>
             </outVariable>
-            <inVariable localId="58" height="30" width="145" executionOrderId="0" negated="false">
+            <inVariable localId="58" height="30" width="146" executionOrderId="0" negated="false">
               <position x="60" y="1944"/>
               <connectionPointOut>
-                <relPosition x="145" y="16"/>
+                <relPosition x="146" y="16"/>
               </connectionPointOut>
               <expression>Second_Python_Var</expression>
             </inVariable>
-            <outVariable localId="47" height="30" width="125" executionOrderId="0" negated="false">
+            <outVariable localId="47" height="30" width="130" executionOrderId="0" negated="false">
               <position x="200" y="1385"/>
               <connectionPointIn>
                 <relPosition x="0" y="15"/>
@@ -1123,7 +1123,7 @@
               </connectionPointOut>
               <expression>23</expression>
             </inVariable>
-            <block localId="61" typeName="function0" executionOrderId="0" height="45" width="110">
+            <block localId="61" typeName="function0" executionOrderId="0" height="45" width="111">
               <position x="760" y="1170"/>
               <inputVariables>
                 <variable formalParameter="LocalVar0">
@@ -1131,7 +1131,7 @@
                     <relPosition x="0" y="30"/>
                     <connection refLocalId="62">
                       <position x="760" y="1200"/>
-                      <position x="720" y="1200"/>
+                      <position x="723" y="1200"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1140,39 +1140,39 @@
               <outputVariables>
                 <variable formalParameter="OUT">
                   <connectionPointOut>
-                    <relPosition x="110" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="62" executionOrderId="0" height="30" width="55" negated="false">
+                    <relPosition x="111" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="62" executionOrderId="0" height="30" width="58" negated="false">
               <position x="665" y="1185"/>
               <connectionPointOut>
-                <relPosition x="55" y="15"/>
+                <relPosition x="58" y="15"/>
               </connectionPointOut>
               <expression>fefvsd</expression>
             </inVariable>
-            <outVariable localId="63" executionOrderId="0" height="30" width="55" negated="false">
+            <outVariable localId="63" executionOrderId="0" height="30" width="58" negated="false">
               <position x="905" y="1185"/>
               <connectionPointIn>
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="61" formalParameter="OUT">
                   <position x="905" y="1200"/>
-                  <position x="870" y="1200"/>
+                  <position x="871" y="1200"/>
                 </connection>
               </connectionPointIn>
               <expression>fefvsd</expression>
             </outVariable>
-            <comment localId="53" height="65" width="420">
+            <comment localId="53" height="80" width="420">
               <position x="75" y="2160"/>
               <content>
                 <xhtml:p><![CDATA[Shows global variables access from resource configuration (res_pytest) and from project's configuration.]]></xhtml:p>
               </content>
             </comment>
-            <inVariable localId="18" height="30" width="65" executionOrderId="0" negated="false">
-              <position x="950" y="720"/>
-              <connectionPointOut>
-                <relPosition x="65" y="15"/>
+            <inVariable localId="18" height="30" width="74" executionOrderId="0" negated="false">
+              <position x="986" y="795"/>
+              <connectionPointOut>
+                <relPosition x="74" y="15"/>
               </connectionPointOut>
               <expression>mux2_sel</expression>
             </inVariable>
@@ -1194,14 +1194,14 @@
                 <xhtml:p><![CDATA[Shows access variable defined in python extension. ]]></xhtml:p>
               </content>
             </comment>
-            <inVariable localId="66" height="30" width="130" executionOrderId="0" negated="false">
+            <inVariable localId="66" height="30" width="137" executionOrderId="0" negated="false">
               <position x="60" y="1685"/>
               <connectionPointOut>
-                <relPosition x="130" y="15"/>
+                <relPosition x="137" y="15"/>
               </connectionPointOut>
               <expression>Test_BCD_WRONG</expression>
             </inVariable>
-            <block localId="67" width="105" height="100" typeName="BCD_TO_UINT" executionOrderId="0">
+            <block localId="67" width="106" height="100" typeName="BCD_TO_UINT" executionOrderId="0">
               <position x="265" y="1620"/>
               <inputVariables>
                 <variable formalParameter="EN">
@@ -1218,7 +1218,7 @@
                       <position x="255" y="1700"/>
                       <position x="345" y="1700"/>
                       <position x="345" y="1700"/>
-                      <position x="190" y="1700"/>
+                      <position x="197" y="1700"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1227,28 +1227,28 @@
               <outputVariables>
                 <variable formalParameter="ENO">
                   <connectionPointOut>
-                    <relPosition x="105" y="40"/>
+                    <relPosition x="106" y="40"/>
                   </connectionPointOut>
                 </variable>
                 <variable formalParameter="OUT">
                   <connectionPointOut>
-                    <relPosition x="105" y="80"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <outVariable localId="68" height="30" width="185" executionOrderId="0" negated="false">
+                    <relPosition x="106" y="80"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="68" height="30" width="196" executionOrderId="0" negated="false">
               <position x="580" y="1685"/>
               <connectionPointIn>
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="67" formalParameter="OUT">
                   <position x="580" y="1700"/>
-                  <position x="370" y="1700"/>
+                  <position x="371" y="1700"/>
                 </connection>
               </connectionPointIn>
               <expression>Test_BCD_WRONG_RESULT</expression>
             </outVariable>
-            <comment localId="69" height="135" width="375">
+            <comment localId="69" height="165" width="375">
               <position x="795" y="1590"/>
               <content>
                 <xhtml:p><![CDATA[Incorrect BCD number is not converted to UINT.
@@ -1273,7 +1273,7 @@
               </connectionPointIn>
               <expression>Test_BCD_CONVERTED</expression>
             </outVariable>
-            <comment localId="71" height="170" width="680">
+            <comment localId="71" height="215" width="680">
               <position x="35" y="30"/>
               <content>
                 <xhtml:p><![CDATA[This example shows many features in Beremiz:
--- a/tests/svgui/beremiz.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/svgui/beremiz.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version='1.0' encoding='utf-8'?>
 <BeremizRoot URI_location="LOCAL://">
   <TargetType/>
+  <Libraries Enable_SVGUI_Library="true" Enable_Python_Library="true"/>
 </BeremizRoot>
--- a/tests/svgui/plc.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/svgui/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,7 @@
 <?xml version='1.0' encoding='utf-8'?>
 <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
   <fileHeader companyName="beremiz" productName="Beremiz" productVersion="0.0" creationDateTime="2008-12-14T16:21:19"/>
-  <contentHeader name="Beremiz SVGUI Test" modificationDateTime="2016-10-20T12:38:31">
+  <contentHeader name="Beremiz SVGUI Test" modificationDateTime="2018-09-26T13:18:53">
     <coordinateInfo>
       <pageSize x="1024" y="1024"/>
       <fbd>
@@ -46,14 +46,14 @@
         <body>
           <FBD>
             <block localId="32" width="80" height="110" typeName="ADD" executionOrderId="0">
-              <position x="649" y="241"/>
+              <position x="649" y="285"/>
               <inputVariables>
                 <variable formalParameter="EN">
                   <connectionPointIn>
                     <relPosition x="0" y="35"/>
                     <connection refLocalId="5">
-                      <position x="649" y="276"/>
-                      <position x="594" y="276"/>
+                      <position x="649" y="320"/>
+                      <position x="594" y="320"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -61,8 +61,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="65"/>
                     <connection refLocalId="100" formalParameter="OUT">
-                      <position x="649" y="306"/>
-                      <position x="474" y="306"/>
+                      <position x="649" y="350"/>
+                      <position x="474" y="350"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -70,12 +70,12 @@
                   <connectionPointIn>
                     <relPosition x="0" y="95"/>
                     <connection refLocalId="33">
-                      <position x="649" y="336"/>
-                      <position x="629" y="336"/>
-                      <position x="629" y="374"/>
-                      <position x="854" y="374"/>
-                      <position x="854" y="306"/>
-                      <position x="839" y="306"/>
+                      <position x="649" y="380"/>
+                      <position x="629" y="380"/>
+                      <position x="629" y="418"/>
+                      <position x="854" y="418"/>
+                      <position x="854" y="350"/>
+                      <position x="839" y="350"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -95,12 +95,12 @@
               </outputVariables>
             </block>
             <inOutVariable localId="33" height="35" width="85" executionOrderId="0" negatedOut="false" negatedIn="false">
-              <position x="754" y="289"/>
+              <position x="754" y="333"/>
               <connectionPointIn>
                 <relPosition x="0" y="17"/>
                 <connection refLocalId="32" formalParameter="OUT">
-                  <position x="754" y="306"/>
-                  <position x="729" y="306"/>
+                  <position x="754" y="350"/>
+                  <position x="729" y="350"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut>
@@ -109,56 +109,56 @@
               <expression>counter</expression>
             </inOutVariable>
             <inVariable localId="39" height="35" width="89" executionOrderId="0" negated="false">
-              <position x="55" y="289"/>
+              <position x="55" y="333"/>
               <connectionPointOut>
                 <relPosition x="89" y="17"/>
               </connectionPointOut>
               <expression>BOOL#1</expression>
             </inVariable>
             <inVariable localId="41" height="30" width="120" executionOrderId="0" negated="false">
-              <position x="21" y="575"/>
+              <position x="21" y="619"/>
               <connectionPointOut>
                 <relPosition x="120" y="15"/>
               </connectionPointOut>
               <expression>'stop_back'</expression>
             </inVariable>
             <inVariable localId="42" height="30" width="120" executionOrderId="0" negated="false">
-              <position x="21" y="617"/>
+              <position x="21" y="661"/>
               <connectionPointOut>
                 <relPosition x="120" y="15"/>
               </connectionPointOut>
               <expression>'stop_sele'</expression>
             </inVariable>
-            <inVariable localId="46" height="30" width="121" executionOrderId="0" negated="false">
-              <position x="694" y="755"/>
-              <connectionPointOut>
-                <relPosition x="121" y="15"/>
+            <inVariable localId="46" height="30" width="122" executionOrderId="0" negated="false">
+              <position x="694" y="799"/>
+              <connectionPointOut>
+                <relPosition x="122" y="15"/>
               </connectionPointOut>
               <expression>'text_counter'</expression>
             </inVariable>
             <inVariable localId="51" height="30" width="119" executionOrderId="0" negated="false">
-              <position x="692" y="568"/>
+              <position x="692" y="612"/>
               <connectionPointOut>
                 <relPosition x="119" y="15"/>
               </connectionPointOut>
               <expression>'led_stop'</expression>
             </inVariable>
             <inVariable localId="52" height="30" width="120" executionOrderId="0" negated="false">
-              <position x="691" y="604"/>
+              <position x="691" y="648"/>
               <connectionPointOut>
                 <relPosition x="120" y="15"/>
               </connectionPointOut>
               <expression>'led_start'</expression>
             </inVariable>
             <block localId="83" width="145" height="60" typeName="INT_TO_STRING" executionOrderId="0">
-              <position x="537" y="812"/>
+              <position x="537" y="856"/>
               <inputVariables>
                 <variable formalParameter="IN">
                   <connectionPointIn>
                     <relPosition x="0" y="40"/>
                     <connection refLocalId="4">
-                      <position x="537" y="852"/>
-                      <position x="504" y="852"/>
+                      <position x="537" y="896"/>
+                      <position x="504" y="896"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -173,14 +173,14 @@
               </outputVariables>
             </block>
             <block localId="92" width="187" height="230" typeName="Button" instanceName="Start_Stop" executionOrderId="0">
-              <position x="201" y="549"/>
+              <position x="201" y="593"/>
               <inputVariables>
                 <variable formalParameter="back_id">
                   <connectionPointIn>
                     <relPosition x="0" y="41"/>
                     <connection refLocalId="41">
-                      <position x="201" y="590"/>
-                      <position x="141" y="590"/>
+                      <position x="201" y="634"/>
+                      <position x="141" y="634"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -188,8 +188,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="83"/>
                     <connection refLocalId="42">
-                      <position x="201" y="632"/>
-                      <position x="141" y="632"/>
+                      <position x="201" y="676"/>
+                      <position x="141" y="676"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -197,8 +197,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="125"/>
                     <connection refLocalId="93">
-                      <position x="201" y="674"/>
-                      <position x="141" y="674"/>
+                      <position x="201" y="718"/>
+                      <position x="141" y="718"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -223,21 +223,21 @@
               </outputVariables>
             </block>
             <inVariable localId="93" height="30" width="120" executionOrderId="0" negated="false">
-              <position x="21" y="659"/>
+              <position x="21" y="703"/>
               <connectionPointOut>
                 <relPosition x="120" y="15"/>
               </connectionPointOut>
               <expression>BOOL#1</expression>
             </inVariable>
             <block localId="94" width="100" height="145" typeName="TextCtrl" instanceName="Counter_TextCtrl" executionOrderId="0">
-              <position x="876" y="730"/>
+              <position x="876" y="774"/>
               <inputVariables>
                 <variable formalParameter="back_id">
                   <connectionPointIn>
                     <relPosition x="0" y="40"/>
                     <connection refLocalId="46">
-                      <position x="876" y="770"/>
-                      <position x="815" y="770"/>
+                      <position x="876" y="814"/>
+                      <position x="816" y="814"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -245,8 +245,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="81"/>
                     <connection refLocalId="3">
-                      <position x="876" y="811"/>
-                      <position x="815" y="811"/>
+                      <position x="876" y="855"/>
+                      <position x="815" y="855"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -254,8 +254,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="122"/>
                     <connection refLocalId="83" formalParameter="OUT">
-                      <position x="876" y="852"/>
-                      <position x="682" y="852"/>
+                      <position x="876" y="896"/>
+                      <position x="682" y="896"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -264,21 +264,21 @@
               <outputVariables/>
             </block>
             <inVariable localId="1" height="30" width="88" executionOrderId="0" negated="false">
-              <position x="59" y="220"/>
+              <position x="59" y="272"/>
               <connectionPointOut>
                 <relPosition x="88" y="15"/>
               </connectionPointOut>
               <expression>BOOL#1</expression>
             </inVariable>
             <block localId="95" width="100" height="130" typeName="Led" instanceName="State_LedCtrl" executionOrderId="0">
-              <position x="876" y="545"/>
+              <position x="876" y="589"/>
               <inputVariables>
                 <variable formalParameter="back_id">
                   <connectionPointIn>
                     <relPosition x="0" y="38"/>
                     <connection refLocalId="51">
-                      <position x="876" y="583"/>
-                      <position x="811" y="583"/>
+                      <position x="876" y="627"/>
+                      <position x="811" y="627"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -286,8 +286,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="74"/>
                     <connection refLocalId="52">
-                      <position x="876" y="619"/>
-                      <position x="811" y="619"/>
+                      <position x="876" y="663"/>
+                      <position x="811" y="663"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -295,8 +295,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="110"/>
                     <connection refLocalId="2">
-                      <position x="876" y="655"/>
-                      <position x="811" y="655"/>
+                      <position x="876" y="699"/>
+                      <position x="811" y="699"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -305,18 +305,18 @@
               <outputVariables/>
             </block>
             <block localId="96" width="80" height="65" typeName="AND" executionOrderId="0">
-              <position x="200" y="182"/>
+              <position x="200" y="234"/>
               <inputVariables>
                 <variable formalParameter="IN1" negated="true">
                   <connectionPointIn>
                     <relPosition x="0" y="31"/>
                     <connection refLocalId="96" formalParameter="OUT">
-                      <position x="200" y="213"/>
-                      <position x="175" y="213"/>
-                      <position x="175" y="167"/>
-                      <position x="305" y="167"/>
-                      <position x="305" y="213"/>
-                      <position x="280" y="213"/>
+                      <position x="200" y="265"/>
+                      <position x="175" y="265"/>
+                      <position x="175" y="219"/>
+                      <position x="305" y="219"/>
+                      <position x="305" y="265"/>
+                      <position x="280" y="265"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -324,8 +324,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="53"/>
                     <connection refLocalId="1">
-                      <position x="200" y="235"/>
-                      <position x="147" y="235"/>
+                      <position x="200" y="287"/>
+                      <position x="147" y="287"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -340,53 +340,53 @@
               </outputVariables>
             </block>
             <connector name="CLOCK" localId="97" height="30" width="90">
-              <position x="345" y="198"/>
+              <position x="345" y="250"/>
               <connectionPointIn>
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="96" formalParameter="OUT">
-                  <position x="345" y="213"/>
-                  <position x="280" y="213"/>
+                  <position x="345" y="265"/>
+                  <position x="280" y="265"/>
                 </connection>
               </connectionPointIn>
             </connector>
             <connector name="COUNT" localId="98" height="30" width="90">
-              <position x="461" y="575"/>
+              <position x="461" y="619"/>
               <connectionPointIn>
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="92" formalParameter="state_out">
-                  <position x="461" y="590"/>
-                  <position x="388" y="590"/>
+                  <position x="461" y="634"/>
+                  <position x="388" y="634"/>
                 </connection>
               </connectionPointIn>
             </connector>
             <continuation name="COUNT" localId="2" height="30" width="120">
-              <position x="691" y="640"/>
+              <position x="691" y="684"/>
               <connectionPointOut>
                 <relPosition x="120" y="15"/>
               </connectionPointOut>
             </continuation>
             <inVariable localId="4" height="35" width="85" executionOrderId="0" negated="false">
-              <position x="419" y="835"/>
+              <position x="419" y="879"/>
               <connectionPointOut>
                 <relPosition x="85" y="17"/>
               </connectionPointOut>
               <expression>counter</expression>
             </inVariable>
             <continuation name="COUNT" localId="5" height="30" width="90">
-              <position x="504" y="261"/>
+              <position x="504" y="305"/>
               <connectionPointOut>
                 <relPosition x="90" y="15"/>
               </connectionPointOut>
             </continuation>
             <block localId="99" width="80" height="110" typeName="AND" executionOrderId="0">
-              <position x="199" y="264"/>
+              <position x="199" y="308"/>
               <inputVariables>
                 <variable formalParameter="IN1">
                   <connectionPointIn>
                     <relPosition x="0" y="42"/>
                     <connection refLocalId="39">
-                      <position x="199" y="306"/>
-                      <position x="144" y="306"/>
+                      <position x="199" y="350"/>
+                      <position x="144" y="350"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -394,8 +394,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="87"/>
                     <connection refLocalId="6">
-                      <position x="199" y="351"/>
-                      <position x="144" y="351"/>
+                      <position x="199" y="395"/>
+                      <position x="144" y="395"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -410,20 +410,20 @@
               </outputVariables>
             </block>
             <continuation name="CLOCK" localId="6" height="30" width="90">
-              <position x="54" y="336"/>
+              <position x="54" y="380"/>
               <connectionPointOut>
                 <relPosition x="90" y="15"/>
               </connectionPointOut>
             </continuation>
             <block localId="100" width="125" height="45" typeName="BOOL_TO_INT" executionOrderId="0">
-              <position x="349" y="274"/>
+              <position x="349" y="318"/>
               <inputVariables>
                 <variable formalParameter="IN">
                   <connectionPointIn>
                     <relPosition x="0" y="32"/>
                     <connection refLocalId="99" formalParameter="OUT">
-                      <position x="349" y="306"/>
-                      <position x="279" y="306"/>
+                      <position x="349" y="350"/>
+                      <position x="279" y="350"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -438,13 +438,13 @@
               </outputVariables>
             </block>
             <continuation name="CLOCK" localId="3" height="30" width="122">
-              <position x="693" y="796"/>
+              <position x="693" y="840"/>
               <connectionPointOut>
                 <relPosition x="122" y="15"/>
               </connectionPointOut>
             </continuation>
-            <comment localId="101" height="152" width="816">
-              <position x="27" y="8"/>
+            <comment localId="101" height="197" width="1001">
+              <position x="11" y="12"/>
               <content>
                 <xhtml:p><![CDATA[This example shows how IEC program in PLC can interact with web interface. 
 
@@ -458,8 +458,8 @@
 ]]></xhtml:p>
               </content>
             </comment>
-            <comment localId="102" height="101" width="544">
-              <position x="17" y="409"/>
+            <comment localId="102" height="126" width="641">
+              <position x="17" y="441"/>
               <content>
                 <xhtml:p><![CDATA[In this example basic elements like 'Button', 'Led' and 'Text' are used. 
 Back_id and sele_id inputs of these blocks are IDs  of graphic primitives in SVG file. 
--- a/tests/svgui/svgui@svgui/gui.svg	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/svgui/svgui@svgui/gui.svg	Mon Jan 07 13:50:39 2019 +0100
@@ -615,7 +615,7 @@
          ry="5.029737" />
       <text
          sodipodi:linespacing="125%"
-         id="text_compteur"
+         id="text_counter"
          y="102.99694"
          x="154.30698"
          style="font-size:36px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:#655fdb;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/tools/check_source.sh	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,482 @@
+#!/bin/sh
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2017: Andrey Skvortsov
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+
+exit_code=0
+set_exit_error()
+{
+    if [ $exit_code -eq 0 ]; then
+       exit_code=1
+    fi
+}
+
+version_gt()
+{
+    test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1";
+}
+
+
+compile_checks()
+{
+    echo "Syntax checking using python ..."
+    python --version
+
+    # remove compiled Python files
+    find . -name '*.pyc' -exec rm -f {} \;
+
+    for i in $py_files; do
+        # echo $i
+        python -m py_compile $i
+        if [ $? -ne 0 ]; then
+            echo "Syntax error in $i"
+            set_exit_error
+        fi
+    done
+    echo "DONE"
+    echo ""
+}
+
+
+python3_compile_checks()
+{
+    echo "Syntax checking using python3 ..."
+    python3 --version
+
+    # remove compiled Python files
+    find . -name '*.pyc' -exec rm -f {} \;
+
+    for i in $py_files; do
+        # echo $i
+        python3 -m py_compile $i
+        if [ $? -ne 0 ]; then
+            echo "Syntax error in $i"
+            set_exit_error
+        fi
+    done
+
+    # remove compiled Python files
+    find . -name '*.pyc' -exec rm -f {} \;
+
+    echo "DONE"
+    echo ""
+}
+
+localization_checks()
+{
+    echo "Check correct localization formats"
+    xgettext --version
+    
+    for i in $py_files; do
+        xgettext -s --language=Python --package-name Beremiz --output=/tmp/m.pot $i 2>&1 | grep 'warning'
+        if [ $? -eq 0 ]; then
+            echo "Syntax error in $i"
+            set_exit_error
+        fi
+    done
+    echo "DONE"
+    echo ""
+}
+
+# pep8 was renamed to pycodestyle
+# detect existed version
+pep8_detect()
+{
+    test -n $pep8 && (which pep8 > /dev/null) && pep8="pep8"
+    test -n $pep8 && (which pycodestyle > /dev/null) && pep8="pycodestyle"
+    if [ -z $pep8 ]; then
+        echo "pep8/pycodestyle is not found"
+        set_exit_error
+    fi
+    echo -n "pep8 version: "
+    $pep8 --version
+}
+
+pep8_checks_default()
+{
+    echo "Check basic code-style problems for PEP-8"
+
+    test -n $pep8 && pep8_detect
+    test -z $pep8 && return
+
+    user_ignore=
+    user_ignore=$user_ignore,W606  # W606 'async' and 'await' are reserved keywords starting with Python 3.7
+
+    # ignored by default,
+    default_ignore=
+    default_ignore=$default_ignore,E121  # E121 continuation line under-indented for hanging indent
+    default_ignore=$default_ignore,E123  # E123 closing bracket does not match indentation of opening bracket’s line
+    default_ignore=$default_ignore,E126  # E126 continuation line over-indented for hanging indent
+    default_ignore=$default_ignore,E133  # E133 closing bracket is missing indentation
+    default_ignore=$default_ignore,E226  # E226 missing whitespace around arithmetic operator
+    default_ignore=$default_ignore,E241  # E241 multiple spaces after ':'
+    default_ignore=$default_ignore,E242  # E242 tab after ‘,’
+    default_ignore=$default_ignore,E704  # E704 multiple statements on one line (def)
+    default_ignore=$default_ignore,W503  # W503 line break occurred before a binary operator
+    default_ignore=$default_ignore,W504  # W504 line break occurred after a binary operator
+    default_ignore=$default_ignore,W505  # W505 doc line too long (82 > 79 characters)
+    ignore=$user_ignore,$default_ignore
+
+    $pep8 --max-line-length 300 --ignore=$ignore --exclude build $py_files
+    if [ $? -ne 0 ]; then
+        set_exit_error
+    fi
+
+    echo "DONE"
+    echo ""
+}
+
+
+pep8_checks_selected()
+{
+    echo "Check basic code-style problems for PEP-8 (selective)"
+
+    test -n $pep8 && pep8_detect
+    test -z $pep8 && return
+
+    # select checks:
+    user_select=
+    user_select=$user_select,W291   # W291 trailing whitespace
+    user_select=$user_select,E401   # E401 multiple imports on one line
+    user_select=$user_select,E265   # E265 block comment should start with '# '
+    user_select=$user_select,E228   # E228 missing whitespace around modulo operator
+    user_select=$user_select,W293   # W293 blank line contains whitespace
+    user_select=$user_select,E302   # E302 expected 2 blank lines, found 1
+    user_select=$user_select,E301   # E301 expected 2 blank lines, found 1
+    user_select=$user_select,E261   # E261 at least two spaces before inline comment
+    user_select=$user_select,E271   # E271 multiple spaces after keyword
+    user_select=$user_select,E231   # E231 missing whitespace after ','
+    user_select=$user_select,E303   # E303 too many blank lines (2)
+    user_select=$user_select,E225   # E225 missing whitespace around operator
+    user_select=$user_select,E711   # E711 comparison to None should be 'if cond is not None:'
+    user_select=$user_select,E251   # E251 unexpected spaces around keyword / parameter equals
+    user_select=$user_select,E227   # E227 missing whitespace around bitwise or shift operator
+    user_select=$user_select,E202   # E202 whitespace before ')'
+    user_select=$user_select,E201   # E201 whitespace after '{'
+    user_select=$user_select,W391   # W391 blank line at end of file
+    user_select=$user_select,E305   # E305 expected 2 blank lines after class or function definition, found X
+    user_select=$user_select,E306   # E306 expected 1 blank line before a nested definition, found X
+    user_select=$user_select,E703   # E703 statement ends with a semicolon
+    user_select=$user_select,E701   # E701 multiple statements on one line (colon)
+    user_select=$user_select,E221   # E221 multiple spaces before operator
+    user_select=$user_select,E741   # E741 ambiguous variable name 'l'
+    user_select=$user_select,E111   # E111 indentation is not a multiple of four
+    user_select=$user_select,E222   # E222 multiple spaces after operator
+    user_select=$user_select,E712   # E712 comparison to True should be 'if cond is True:' or 'if cond:'
+    user_select=$user_select,E262   # E262 inline comment should start with '# '
+    user_select=$user_select,E203   # E203 whitespace before ','
+    user_select=$user_select,E731   # E731 do not assign a lambda expression, use a def
+    user_select=$user_select,W601   # W601 .has_key() is deprecated, use 'in'
+    user_select=$user_select,E502   # E502 the backslash is redundant between brackets
+    user_select=$user_select,W602   # W602 deprecated form of raising exception
+    user_select=$user_select,E129   # E129 visually indented line with same indent as next logical line
+    user_select=$user_select,E127   # E127 continuation line over-indented for visual indent
+    user_select=$user_select,E128   # E128 continuation line under-indented for visual indent
+    user_select=$user_select,E125   # E125 continuation line with same indent as next logical line
+    user_select=$user_select,E114   # E114 indentation is not a multiple of four (comment)
+    user_select=$user_select,E211   # E211 whitespace before '['
+    user_select=$user_select,W191   # W191 indentation contains tabs
+    user_select=$user_select,E101   # E101 indentation contains mixed spaces and tabs
+    user_select=$user_select,E124   # E124 closing bracket does not match visual indentation
+    user_select=$user_select,E272   # E272 multiple spaces before keyword
+    user_select=$user_select,E713   # E713 test for membership should be 'not in'
+    user_select=$user_select,E122   # E122 continuation line missing indentation or outdented
+    user_select=$user_select,E131   # E131 continuation line unaligned for hanging indent
+    user_select=$user_select,E721   # E721 do not compare types, use 'isinstance()'
+    user_select=$user_select,E115   # E115 expected an indented block (comment)
+    user_select=$user_select,E722   # E722 do not use bare except'
+    user_select=$user_select,E266   # E266 too many leading '#' for block comment
+    user_select=$user_select,E402   # E402 module level import not at top of file
+    user_select=$user_select,W503   # W503 line break before binary operator
+
+    $pep8 --select $user_select --exclude=build $py_files
+    if [ $? -ne 0 ]; then
+        set_exit_error
+    fi
+
+    echo "DONE"
+    echo ""
+}
+
+flake8_checks()
+{
+    echo "Check for problems using flake8 ..."
+
+    which flake8 > /dev/null
+    if [ $? -ne 0 ]; then
+        echo "flake8 is not found"
+        set_exit_error
+        return
+    fi
+
+    echo -n "flake8 version: "
+    flake8 --version
+
+    flake8 --max-line-length=300  --exclude=build --builtins="_" $py_files
+    if [ $? -ne 0 ]; then
+        set_exit_error
+    fi
+
+    echo "DONE"
+    echo ""
+}
+
+pylint_checks()
+
+{
+    echo "Check for problems using pylint ..."
+
+    which pylint > /dev/null
+    if [ $? -ne 0 ]; then
+        echo "pylint is not found"
+        set_exit_error
+        return
+    fi
+    pylint --version
+
+    export PYTHONPATH="$PWD/../CanFestival-3/objdictgen":$PYTHONPATH
+
+    disable=
+    # These warnings most likely will not be fixed
+
+    disable=$disable,C0103        # invalid-name
+    disable=$disable,C0326        # bad whitespace
+    disable=$disable,W0110        # (deprecated-lambda) map/filter on lambda could be replaced by comprehension
+    disable=$disable,W0613        # (unused-argument) Unused argument 'X'
+    disable=$disable,W0622        # (redefined-builtin) Redefining built-in
+    disable=$disable,W0621        # (redefined-outer-name) Redefining name 'Y' from outer scope (line X)
+    disable=$disable,W0122        # (exec-used) Use of exec
+    disable=$disable,W0123        # (eval-used) Use of eval
+    disable=$disable,I0011        # (locally-disabled) Locally disabling ungrouped-imports (C0412)
+    disable=$disable,R0204        # (redefined-variable-type) Redefinition of current type from X to Y
+    disable=$disable,R0201        # (no-self-use) Method could be a function
+    disable=$disable,W0221        # (arguments-differ) Arguments number differs from overridden 'X' method
+    disable=$disable,C0201        # (consider-iterating-dictionary) Consider iterating the dictionary directly instead of calling .keys()
+    disable=$disable,W0201        # (attribute-defined-outside-init) Attribute 'X' defined outside __init__
+    disable=$disable,I1101        # (c-extension-no-member) Module 'lxml.etree' has not 'X' member,
+                                  # but source is unavailable. Consider adding this module to extension-pkg-whitelist
+                                  # if you want to perform analysis based on run-time introspection of living objects.
+
+    # It'd be nice to fix warnings below some day
+    disable=$disable,C0111        # missing-docstring
+    disable=$disable,W0703        # broad-except
+    disable=$disable,C0301        # Line too long
+    disable=$disable,C0302        # Too many lines in module
+    disable=$disable,W0511        # fixme
+    disable=$disable,R0901        # (too-many-ancestors) Too many ancestors (9/7)
+    disable=$disable,R0902        # (too-many-instance-attributes) Too many instance attributes (10/7)
+    disable=$disable,R0903        # (too-few-public-methods) Too few public methods (0/2)
+    disable=$disable,R0904        # (too-many-public-methods) Too many public methods (41/20)
+    disable=$disable,R0911        # (too-many-return-statements) Too many return statements (7/6)
+    disable=$disable,R0912        # (too-many-branches) Too many branches (61/12)
+    disable=$disable,R0913        # (too-many-arguments) Too many arguments (6/5)
+    disable=$disable,R0914        # (too-many-locals) Too many local variables (18/15)
+    disable=$disable,R0915        # (too-many-statements) Too many statements (57/50)
+    disable=$disable,R0916        # (too-many-boolean-expressions) Too many boolean expressions in if statement (6/5)
+    disable=$disable,R0101        # (too-many-nested-blocks) Too many nested blocks (7/5)
+    disable=$disable,R0801        # (duplicate-code) Similar lines in N files
+    disable=$disable,W0401        # (wildcard-import) Wildcard import 
+    disable=$disable,W0614        # (unused-wildcard-import), ] Unused import X from wildcard import
+    disable=$disable,W0212        # (protected-access) Access to a protected member X of a Y class
+    disable=$disable,E1101        # (no-member) Instance of 'X' has no 'Y' member
+    
+    enable=
+    enable=$enable,E1601          # print statement used
+    enable=$enable,C0325          # (superfluous-parens) Unnecessary parens after keyword
+    enable=$enable,W0404          # reimported module
+    enable=$enable,C0411          # (wrong-import-order) standard import "import x" comes before "import y"
+    enable=$enable,W0108          # (unnecessary-lambda) Lambda may not be necessary
+    enable=$enable,C0412          # (ungrouped-imports) Imports from package X are not grouped
+    enable=$enable,C0321          # (multiple-statements) More than one statement on a single line
+    enable=$enable,W0231          # (super-init-not-called) __init__ method from base class is not called
+    enable=$enable,W0105          # (pointless-string-statement) String statement has no effect
+    enable=$enable,W0311          # (bad-indentation) Bad indentation. Found 16 spaces, expected 12
+    enable=$enable,W0101          # (unreachable) Unreachable code
+    enable=$enable,E0102          # (function-redefined) method already defined
+    enable=$enable,W0602          # (global-variable-not-assigned) Using global for 'X' but no assignment is done
+    enable=$enable,W0611          # (unused-import) Unused import X
+    enable=$enable,C1001          # (old-style-class) Old-style class defined. Problem with PyJS
+    enable=$enable,W0102          # (dangerous-default-value) Dangerous default value {} as argument
+    enable=$enable,C0112          # (empty-docstring)
+    enable=$enable,W0631          # (undefined-loop-variable) Using possibly undefined loop variable 'X'
+    enable=$enable,W0104          # (pointless-statement) Statement seems to have no effect
+    enable=$enable,W0107          # (unnecessary-pass) Unnecessary pass statement
+    enable=$enable,W0406          # (import-self) Module import itself
+    enable=$enable,C0413          # (wrong-import-position) Import "import X" should be placed at the top of the module
+    enable=$enable,E1305          # (too-many-format-args) Too many arguments for format string
+    enable=$enable,E0704          # (misplaced-bare-raise) The raise statement is not inside an except clause
+    enable=$enable,C0123          # (unidiomatic-typecheck) Using type() instead of isinstance() for a typecheck.
+    enable=$enable,E0601          # (used-before-assignment) Using variable 'X' before assignment
+    enable=$enable,E1120          # (no-value-for-parameter) No value for argument 'X' in function call
+    enable=$enable,E0701          # (bad-except-order) Bad except clauses order (X is an ancestor class of Y)
+    enable=$enable,E0611          # (no-name-in-module) No name 'X' in module 'Y'
+    enable=$enable,E0213          # (no-self-argument) Method should have "self" as first argument
+    enable=$enable,E0401          # (import-error) Unable to import 'X'
+    enable=$enable,E1121          # (too-many-function-args) Too many positional arguments for function call
+    enable=$enable,W0232          # (no-init) Class has no __init__ method
+    enable=$enable,W0233          # (non-parent-init-called) __init__ method from a non direct base class 'X' is called
+    enable=$enable,W0601          # (global-variable-undefined) Global variable 'X' undefined at the module level
+    enable=$enable,W0111          # (assign-to-new-keyword) Name async will become a keyword in Python 3.7
+    enable=$enable,W0623          # (redefine-in-handler) Redefining name 'X' from outer scope (line Y) in exception handler
+    enable=$enable,W0109          # (duplicate-key) Duplicate key 'X' in dictionary
+    enable=$enable,E1310          # (bad-str-strip-call) Suspicious argument in str.strip call
+    enable=$enable,E1300          # (bad-format-character) Unsupported format character '"' (0x22) at index 17
+    enable=$enable,E1304          # (missing-format-string-key) Missing key 'X_name' in format string dictionary
+    enable=$enable,R1701          # (consider-merging-isinstance) Consider merging these isinstance calls to isinstance(CTNLDFLAGS, (str, unicode))
+    enable=$enable,R1704          # (redefined-argument-from-local) Redefining argument with the local name 'Y'
+    enable=$enable,W0106          # (expression-not-assigned) Expression "X" is assigned to nothing
+    enable=$enable,E1136          # (unsubscriptable-object) Value 'X' is unsubscriptable
+    enable=$enable,E0602          # (undefined-variable) Undefined variable 'X'
+    enable=$enable,W1618          # (no-absolute-import) import missing `from __future__ import absolute_import`
+    enable=$enable,W0403          # (relative-import) Relative import 'Y', should be 'X.Y '
+    enable=$enable,W0612          # (unused-variable) Unused variable 'X'
+    enable=$enable,C0330          # (bad-continuation) Wrong hanging indentation before block
+    enable=$enable,R0123          # (literal-comparison) Comparison to literal
+
+    # python3 compatibility checks
+    enable=$enable,W1648          # (bad-python3-import) Module moved in Python 3
+    enable=$enable,W1613          # (xrange-builtin) xrange built-in referenced
+    enable=$enable,W1612          # (unicode-builtin) unicode built-in referenced
+    enable=$enable,W1619          # (old-division) division w/o __future__ statement
+    enable=$enable,W1601          # (apply-builtin) apply built-in referenced
+    enable=$enable,W1659          # (xreadlines-attribute) Accessing a removed xreadlines attribute
+    enable=$enable,W1607          # (file-builtin) file built-in referenced
+    enable=$enable,W1606          # (execfile-builtin) execfile built-in referenced
+    enable=$enable,W1629          # (nonzero-method) __nonzero__ method defined
+    enable=$enable,W1602          # (basestring-builtin) basestring built-in referenced
+    enable=$enable,W1646          # (invalid-str-codec) non-text encoding used in str.decode
+    enable=$enable,W1645          # (exception-message-attribute) Exception.message removed in Python 3
+    enable=$enable,W1649          # (deprecated-string-function) Accessing a deprecated function on the string module
+    enable=$enable,W1651          # (deprecated-itertools-function) Accessing a deprecated function on the itertools module
+    enable=$enable,W1652          # (deprecated-types-field) Accessing a deprecated fields on the types module
+    enable=$enable,W1611          # (standarderror-builtin) StandardError built-in referenced
+    enable=$enable,W1624          # (indexing-exception) Indexing exceptions will not work on Python 3
+    enable=$enable,W1625          # (raising-string) Raising a string exception
+    enable=$enable,W1622          # (next-method-called) Called a next() method on an object
+    enable=$enable,W1653          # (next-method-defined) next method defined
+    enable=$enable,W1610          # (reduce-builtin) reduce built-in referenced
+    enable=$enable,W1633          # (round-builtin) round built-in referenced
+    # enable=
+
+    options=
+
+    ver=$(pylint --version 2>&1 | grep pylint  | awk '{ print $2 }')
+    if version_gt $ver '1.6.8'; then
+	echo "Use multiple threads for pylint"
+	options="$options --jobs=0 "
+    fi
+    options="$options --rcfile=.pylint"
+    # options="$options --py3k"   # report errors for Python 3 porting
+
+    if [ -n "$enable" ]; then
+        options="$options --disable=all"
+        options="$options --enable=$enable"
+    else
+        options="$options --disable=$disable"
+    fi
+    # echo $options
+
+    echo $py_files | xargs pylint $options
+    if [ $? -ne 0 ]; then
+        set_exit_error
+    fi
+
+    echo "DONE"
+    echo ""
+}
+
+
+get_files_to_check()
+{
+    py_files=$(find . -name '*.py' -not -path '*/build/*')
+    if [ -e .hg/skiphook ]; then
+	echo "Skipping checks in the hook ..."
+	exit 0
+    fi
+    if [ "$1" = "--only-changes" ]; then
+        if which hg > /dev/null; then
+            if [ ! -z "$HG_NODE" ]; then
+                hg_change="--change $HG_NODE"
+                msg="for commit $HG_NODE"
+            else
+                hg_change=""
+                msg="in local repository"
+            fi
+            echo "Only changes ${msg} will be checked"
+            echo ""
+            py_files=$(hg status -m -a -n -I '**.py' $hg_change)
+            if [ $? -ne 0 ]; then
+                exit 1;
+            fi
+       fi
+    fi
+    if [ "$1" = "--files-to-check" ]; then
+        list="$2"
+        if [ -z "$list" ]; then
+            echo "--files-to-check requires filename as argument"
+            print_help
+        fi
+        if [ -e "$list" ]; then
+            py_files=$(cat $2 | grep '\.py$')
+        fi
+    fi
+    if [ -z "$py_files" ]; then
+        echo "No files to check"
+        exit 0;
+    fi
+}
+
+
+print_help()
+{
+    echo "Usage: check_source.sh [--only-changes | --files-to-check <filename> ]"
+    echo ""
+    echo "By default without arguments script checks all python source files"
+    echo ""
+    echo "--only-changes"
+    echo "                only files with local changes are checked. "
+    echo "                If script is called from mercurial pretxncommit hook,"
+    echo "                then only commited files are checked"
+    echo ""
+    echo "--files-to-check <file.lst>"
+    echo "                script read list of files to check from file.lst"
+
+    exit 1
+}
+
+main()
+{
+    get_files_to_check $@
+    python3_compile_checks
+    compile_checks
+    localization_checks
+    pep8_checks_default
+    # pep8_checks_selected
+
+    # flake8_checks
+    pylint_checks
+    exit $exit_code
+}
+
+[ "$1" = "--help" -o "$1" = "-h" ] && print_help
+main $@
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/tools/conftest.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2017: Andrey Skvortsov
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+
+from __future__ import absolute_import
+import os
+import sys
+
+# import pytest
+# import xvfbwrapper
+
+
+def init_environment():
+    """Append module root directory to sys.path"""
+    try:
+        import Beremiz as _Beremiz
+    except ImportError:
+        sys.path.append(
+            os.path.abspath(
+                os.path.join(
+                    os.path.dirname(__file__), '..', '..')
+            )
+        )
+
+
+init_environment()
+
+#
+# Something seems to be broken in Beremiz application,
+# because after tests in test_application.py during Xvfb shutdown
+# pytest returns error message:
+# pytest: Fatal IO error 11 (Die Ressource ist zur Zeit nicht verfügbar) on X server :2821.
+#
+# As a result of that pytest returns code 1 as some tests were failed,
+# but they aren't.
+#
+# To avoid this Xvfb is launched and killed not by pytest.
+# $ Xvfb :42 -screen 0 1280x1024x24 &
+# $ export DISPLAY=:42
+# $ pytest --timeout=10 ./tests/tools
+# $ pkill -9 Xvfb
+#
+# TODO: find root of this problem.
+
+
+# vdisplay = None
+#
+# @pytest.fixture(scope="session", autouse=True)
+# def start_xvfb_server(request):
+#     global vdisplay
+#     vdisplay = xvfbwrapper.Xvfb(width=1280, height=720)
+#     vdisplay.start()
+#     request.addfinalizer(stop_xvfb_server)
+#
+# def stop_xvfb_server():
+#     if vdisplay is not None:
+#         vdisplay.stop()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/tools/run_python_tests.sh	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+
+
+cleanup()
+{
+    find $PYTEST_DIR -name '*.pyc' -delete
+}
+
+
+
+print_help()
+{
+    echo "Usage: run_python_tests.sh [--on-local-xserver]"
+    echo ""
+    echo "--on-local-xserver"
+    echo "                all tests are run on local X-server. "
+    echo "                User can see test in action."
+    echo "                Any interaction (mouse, keyboard) should be avoided"
+    echo "                By default without arguments script runs pytest on virtual X serverf."
+    echo ""
+
+    exit 1
+}
+
+main()
+{
+    LC_ALL=ru_RU.utf-8
+    PYTEST_DIR=./tests/tools
+
+    if [ ! -d $PYTEST_DIR ]; then
+	echo "Script should be run from top directory in repository"
+	exit 1;
+    fi
+
+    use_xvfb=0
+    if [ "$1" != "--on-local-xserver" ]; then
+	export DISPLAY=:42
+	use_xvfb=1
+	Xvfb $DISPLAY -screen 0 1280x1024x24 &
+	sleep 1
+    fi
+
+
+    cleanup
+
+    ret=0
+    DELAY=400
+    KILL_DELAY=$(($DELAY + 30))
+    timeout -k $KILL_DELAY $DELAY pytest --timeout=10 ./tests/tools
+    ret=$?
+
+    cleanup
+
+    [ $use_xvfb = 1 ] && pkill -9 Xvfb
+    exit $ret
+}
+
+
+[ "$1" = "--help" -o "$1" = "-h" ] && print_help
+main $@
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/tools/test_CustomIntCtrl.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,140 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2017: Andrey Skvortsov
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+
+from __future__ import absolute_import
+from __future__ import division
+import unittest
+import time
+
+import wx
+import conftest
+import controls.CustomIntCtrl
+
+
+class TestCustomIntCtrl(unittest.TestCase):
+    def setUp(self):
+        self.app = wx.App()
+        self.frame = wx.Frame(None)
+
+    def tearDown(self):
+        self.frame.Destroy()
+        wx.CallAfter(self.app.Exit)
+        self.app.MainLoop()
+
+    def testMaxLimit(self):
+        """Test working upper bound"""
+        self.AddControls()
+        self.int_ctrl.SetValue(self.max_val + 100)
+        self.ProcessEvents()
+
+        self.txt_ctrl.SetFocus()
+        self.ProcessEvents()
+        self.assertEqual(self.int_ctrl.GetValue(), self.max_val)
+
+    def testMinLimit(self):
+        """Test working lower bound"""
+        self.AddControls()
+        self.int_ctrl.SetValue(self.min_val - 100)
+        self.ProcessEvents()
+
+        self.txt_ctrl.SetFocus()
+        self.ProcessEvents()
+
+        self.assertEqual(self.int_ctrl.GetValue(), self.min_val)
+
+    def testCorrectValue(self):
+        """Test case if no limiting is necessary"""
+        self.AddControls()
+        val = (self.max_val + self.min_val) // 2
+        self.int_ctrl.SetValue(val)
+        self.ProcessEvents()
+
+        self.txt_ctrl.SetFocus()
+        self.ProcessEvents()
+
+        self.assertEqual(self.int_ctrl.GetValue(), val)
+
+    def testEventBinding(self):
+        """Test event sending after edit and bound checks are done"""
+        self.AddControls()
+        self.event_happend = False
+
+        def EventHandler(event):
+            self.event_happend = True
+            event.Skip()
+
+        self.int_ctrl.Bind(controls.CustomIntCtrl.EVT_CUSTOM_INT, EventHandler)
+
+        val = (self.max_val + self.min_val) // 2
+
+        self.int_ctrl.SetValue(val)
+        self.ProcessEvents()
+        self.txt_ctrl.SetFocus()
+
+        self.ProcessEvents()
+        self.txt_ctrl.SetFocus()
+        self.ProcessEvents()
+
+        self.assertEqual(self.int_ctrl.GetValue(), val)
+        self.assertTrue(self.event_happend)
+
+    def testLongNumbers(self):
+        """Test support of long integer"""
+        self.AddControls()
+        val = 40000000000
+        self.int_ctrl.SetMax(val)
+        self.int_ctrl.SetValue(val)
+        self.ProcessEvents()
+
+        self.txt_ctrl.SetFocus()
+        self.ProcessEvents()
+
+        self.assertEqual(val, val)
+
+    def ProcessEvents(self):
+        for dummy in range(0, 10):
+            wx.Yield()
+            time.sleep(0.01)
+
+    def AddControls(self):
+        vs = wx.BoxSizer(wx.VERTICAL)
+        self.int_ctrl = controls.CustomIntCtrl(self.frame)
+        self.txt_ctrl = wx.TextCtrl(self.frame)
+        vs.Add(self.int_ctrl, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
+        vs.Add(self.txt_ctrl, 0, wx.ALIGN_CENTRE | wx.ALL, 5)
+        self.frame.SetSizer(vs)
+        vs.Fit(self.frame)
+        self.frame.Show()
+        self.frame.Raise()
+
+        self.min_val = 50
+        self.max_val = 100
+        self.int_ctrl.SetBounds(self.min_val, self.max_val)
+        self.ProcessEvents()
+
+
+if __name__ == '__main__':
+    conftest.init_environment()
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/tools/test_application.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,232 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2017: Andrey Skvortsov
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+
+from __future__ import absolute_import
+from __future__ import print_function
+import os
+import sys
+import unittest
+import time
+
+import six
+import pytest
+import wx
+import ddt
+
+import conftest
+import Beremiz
+import PLCOpenEditor
+
+
+class UserApplicationTest(unittest.TestCase):
+    def InstallExceptionHandler(self):
+        def handle_exception(e_type, e_value, e_traceback, exit=False):
+            # traceback.print_exception(e_type, e_value, e_traceback)
+            self.exc_info = [e_type, e_value, e_traceback]
+        self.exc_info = None
+        self.old_excepthook = sys.excepthook
+        sys.excepthook = handle_exception
+
+    def StartApp(self):
+        self.app = None
+
+    def FinishApp(self):
+        wx.CallAfter(self.app.frame.Close)
+        self.app.MainLoop()
+        self.app = None
+
+    def setUp(self):
+        self.app = None
+
+    def tearDown(self):
+        if self.app is not None and self.app.frame is not None:
+            self.FinishApp()
+
+    def RunUIActions(self, actions):
+        for act in actions:
+            wx.CallAfter(*act)
+            self.ProcessEvents()
+
+    def CheckForErrors(self):
+        if self.exc_info is not None:
+            # reraise catched previously exception
+            exc_type = self.exc_info[0]
+            exc_value = self.exc_info[1]
+            exc_traceback = self.exc_info[2]
+            six.reraise(exc_type, exc_value, exc_traceback)
+
+    def ProcessEvents(self):
+        for dummy in range(0, 30):
+            self.CheckForErrors()
+            wx.Yield()
+            time.sleep(0.01)
+
+
+@ddt.ddt
+class BeremizApplicationTest(UserApplicationTest):
+    """Test Beremiz as whole application"""
+
+    def StartApp(self):
+        self.app = Beremiz.BeremizIDELauncher()
+        # disable default exception handler in Beremiz
+        self.app.InstallExceptionHandler = lambda: None
+        self.InstallExceptionHandler()
+        self.app.handle_exception = sys.excepthook
+        self.app.PreStart()
+        self.ProcessEvents()
+        self.app.frame.Show()
+        self.ProcessEvents()
+        self.app.frame.ShowFullScreen(True)
+        self.ProcessEvents()
+
+    def FinishApp(self):
+        wx.CallAfter(self.app.frame.Close)
+        self.app.MainLoop()
+        time.sleep(1)
+        self.app = None
+
+    def GetSkippedProjectTreeItems(self):
+        """
+        Returns the list of skipped items in the project tree.
+
+        Beremiz test don't need to skip any elemnts in the project tree.
+        """
+        return []
+
+    def OpenAllProjectElements(self):
+        """Open editor for every object in the project tree"""
+        self.app.frame.ProjectTree.ExpandAll()
+        self.ProcessEvents()
+        item = self.app.frame.ProjectTree.GetRootItem()
+        skip = self.GetSkippedProjectTreeItems()
+        tree_id = self.app.frame.ProjectTree.GetId()
+        while item is not None:
+            self.app.frame.ProjectTree.SelectItem(item, True)
+            self.ProcessEvents()
+            if item not in skip:
+                event = wx.lib.agw.customtreectrl.TreeEvent(
+                    wx.lib.agw.customtreectrl.wxEVT_TREE_ITEM_ACTIVATED,
+                    tree_id, item)
+                self.app.frame.OnProjectTreeItemActivated(event)
+            self.ProcessEvents()
+            item = self.app.frame.ProjectTree.GetNextVisible(item)
+
+    def CheckTestProject(self, project):
+        sys.argv = ["", project]
+        self.StartApp()
+        self.OpenAllProjectElements()
+        user_actions = self.GetUserActions()
+        self.RunUIActions(user_actions)
+        self.FinishApp()
+
+    def GetProjectPath(self, project):
+        return os.path.abspath(os.path.join(os.path.dirname(__file__), "..", project))
+
+    def GetUserActions(self):
+        """
+        Returns list of user actions that will be executed
+        on every test project by testCheckProject test.
+        """
+        user_actions = [
+            [self.app.frame.SwitchFullScrMode, None],
+            [self.app.frame.SwitchFullScrMode, None],
+            [self.app.frame.CTR._Clean],
+            [self.app.frame.CTR._Build],
+            [self.app.frame.CTR._Connect],
+            [self.app.frame.CTR._Transfer],
+            [self.app.frame.CTR._Run],
+            [self.app.frame.CTR._Stop],
+            [self.app.frame.CTR._Disconnect],
+            [self.app.frame.CTR._Clean],
+        ]
+        return user_actions
+
+    def testStartUp(self):
+        """Checks whether the app starts and finishes correctly"""
+        sys.argv = [""]
+        self.StartApp()
+        self.FinishApp()
+
+    @ddt.data(
+        "first_steps",
+        "logging",
+        "svgui",
+        "traffic_lights",
+        "wxGlade",
+        "python",
+        "wiimote",
+        "wxHMI",
+    )
+    @pytest.mark.timeout(30)
+    def testCheckProject(self, name):
+        """
+        Checks that test PLC project can be open,
+        compiled and run on SoftPLC.
+        """
+        project = self.GetProjectPath(name)
+        print("Testing example " + name)
+        self.CheckTestProject(project)
+
+
+class PLCOpenEditorApplicationTest(BeremizApplicationTest):
+    """Test PLCOpenEditor as whole application"""
+
+    def StartApp(self):
+        self.app = PLCOpenEditor.PLCOpenEditorApp()
+        # disable default exception handler in application
+        self.app.InstallExceptionHandler = lambda: None
+        self.InstallExceptionHandler()
+        self.app.Show()
+        self.ProcessEvents()
+        self.app.frame.ShowFullScreen(True)
+        self.ProcessEvents()
+
+    def FinishApp(self):
+        wx.CallAfter(self.app.frame.Close)
+        self.app.MainLoop()
+        time.sleep(1)
+        self.app = None
+
+    def GetSkippedProjectTreeItems(self):
+        """
+        Returns the list of skipped items in the project tree.
+
+        Root item opens dialog window for project settings.
+        To avoid code that handles closing dialog windows just skip this item.
+        """
+        return [self.app.frame.ProjectTree.GetRootItem()]
+
+    def GetUserActions(self):
+        return []
+
+    def GetProjectPath(self, project):
+        """Open PLC program in every Beremiz test project"""
+        project_dir = BeremizApplicationTest.GetProjectPath(self, project)
+        return os.path.join(project_dir, "plc.xml")
+
+
+if __name__ == '__main__':
+    conftest.init_environment()
+    unittest.main()
--- a/tests/traffic_lights/beremiz.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/traffic_lights/beremiz.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,4 +1,5 @@
 <?xml version='1.0' encoding='utf-8'?>
 <BeremizRoot URI_location="LOCAL://">
   <TargetType/>
+  <Libraries Enable_SVGUI_Library="true" Enable_Python_Library="true"/>
 </BeremizRoot>
--- a/tests/traffic_lights/plc.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/traffic_lights/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,7 @@
 <?xml version='1.0' encoding='utf-8'?>
 <project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
   <fileHeader companyName="Beremiz" productName="Unnamed" productVersion="1" creationDateTime="2012-09-04T16:16:33"/>
-  <contentHeader name="traffic_lights" modificationDateTime="2016-10-20T13:08:53">
+  <contentHeader name="traffic_lights" modificationDateTime="2018-09-26T17:49:02">
     <coordinateInfo>
       <fbd>
         <scaling x="0" y="0"/>
@@ -120,10 +120,10 @@
           <action name="BLINK_ORANGE_LIGHT">
             <body>
               <LD>
-                <leftPowerRail localId="1" height="40" width="2">
+                <leftPowerRail localId="1" height="40" width="3">
                   <position x="54" y="123"/>
                   <connectionPointOut formalParameter="">
-                    <relPosition x="2" y="20"/>
+                    <relPosition x="3" y="20"/>
                   </connectionPointOut>
                 </leftPowerRail>
                 <contact localId="2" height="15" width="21" negated="true">
@@ -176,10 +176,10 @@
                     </variable>
                   </outputVariables>
                 </block>
-                <inVariable localId="4" height="27" width="72">
-                  <position x="79" y="171"/>
+                <inVariable localId="4" height="37" width="76" negated="false">
+                  <position x="75" y="166"/>
                   <connectionPointOut>
-                    <relPosition x="72" y="13"/>
+                    <relPosition x="76" y="18"/>
                   </connectionPointOut>
                   <expression>T#500ms</expression>
                 </inVariable>
@@ -233,7 +233,7 @@
                   </connectionPointOut>
                   <variable>ORANGE_LIGHT</variable>
                 </coil>
-                <rightPowerRail localId="7" height="40" width="2">
+                <rightPowerRail localId="7" height="40" width="3">
                   <position x="598" y="123"/>
                   <connectionPointIn>
                     <relPosition x="0" y="20"/>
@@ -257,13 +257,13 @@
                   </connectionPointOut>
                   <variable>ORANGE_LIGHT</variable>
                 </coil>
-                <comment localId="9" height="39" width="308">
-                  <position x="54" y="26"/>
+                <comment localId="9" height="52" width="318">
+                  <position x="51" y="11"/>
                   <content>
                     <xhtml:p><![CDATA[This action makes the orange light blink]]></xhtml:p>
                   </content>
                 </comment>
-                <block localId="10" width="57" height="40" typeName="R_TRIG" instanceName="R_TRIG0">
+                <block localId="10" width="58" height="40" typeName="R_TRIG" instanceName="R_TRIG0">
                   <position x="370" y="262"/>
                   <inputVariables>
                     <variable formalParameter="CLK">
@@ -280,12 +280,12 @@
                   <outputVariables>
                     <variable formalParameter="Q">
                       <connectionPointOut>
-                        <relPosition x="57" y="30"/>
+                        <relPosition x="58" y="30"/>
                       </connectionPointOut>
                     </variable>
                   </outputVariables>
                 </block>
-                <block localId="11" width="57" height="40" typeName="R_TRIG" instanceName="R_TRIG1">
+                <block localId="11" width="58" height="40" typeName="R_TRIG" instanceName="R_TRIG1">
                   <position x="371" y="113"/>
                   <inputVariables>
                     <variable formalParameter="CLK">
@@ -302,12 +302,12 @@
                   <outputVariables>
                     <variable formalParameter="Q">
                       <connectionPointOut>
-                        <relPosition x="57" y="30"/>
+                        <relPosition x="58" y="30"/>
                       </connectionPointOut>
                     </variable>
                   </outputVariables>
                 </block>
-                <rightPowerRail localId="12" height="40" width="2">
+                <rightPowerRail localId="12" height="40" width="3">
                   <position x="597" y="272"/>
                   <connectionPointIn>
                     <relPosition x="0" y="20"/>
@@ -317,10 +317,10 @@
                     </connection>
                   </connectionPointIn>
                 </rightPowerRail>
-                <leftPowerRail localId="13" height="40" width="2">
+                <leftPowerRail localId="13" height="40" width="3">
                   <position x="67" y="272"/>
                   <connectionPointOut formalParameter="">
-                    <relPosition x="2" y="20"/>
+                    <relPosition x="3" y="20"/>
                   </connectionPointOut>
                 </leftPowerRail>
                 <contact localId="14" height="15" width="21">
@@ -337,10 +337,10 @@
                   </connectionPointOut>
                   <variable>ORANGE_LIGHT</variable>
                 </contact>
-                <inVariable localId="15" height="27" width="72">
-                  <position x="90" y="322"/>
+                <inVariable localId="15" height="36" width="77" negated="false">
+                  <position x="85" y="317"/>
                   <connectionPointOut>
-                    <relPosition x="72" y="13"/>
+                    <relPosition x="77" y="18"/>
                   </connectionPointOut>
                   <expression>T#500ms</expression>
                 </inVariable>
@@ -352,15 +352,15 @@
           <transition name="STOP">
             <body>
               <FBD>
-                <block localId="42" width="59" height="40" typeName="NOT">
-                  <position x="230" y="40"/>
+                <block localId="42" width="59" height="53" typeName="NOT" executionOrderId="0">
+                  <position x="237" y="31"/>
                   <inputVariables>
                     <variable formalParameter="IN">
                       <connectionPointIn>
-                        <relPosition x="0" y="30"/>
+                        <relPosition x="0" y="36"/>
                         <connection refLocalId="43">
-                          <position x="230" y="70"/>
-                          <position x="202" y="70"/>
+                          <position x="237" y="67"/>
+                          <position x="202" y="67"/>
                         </connection>
                       </connectionPointIn>
                     </variable>
@@ -369,25 +369,25 @@
                   <outputVariables>
                     <variable formalParameter="OUT">
                       <connectionPointOut>
-                        <relPosition x="59" y="30"/>
+                        <relPosition x="59" y="36"/>
                       </connectionPointOut>
                     </variable>
                   </outputVariables>
                 </block>
-                <inVariable localId="43" height="27" width="156">
-                  <position x="46" y="57"/>
+                <inVariable localId="43" height="39" width="164" executionOrderId="0" negated="false">
+                  <position x="38" y="48"/>
                   <connectionPointOut>
-                    <relPosition x="156" y="13"/>
+                    <relPosition x="164" y="19"/>
                   </connectionPointOut>
                   <expression>SWITCH_BUTTON</expression>
                 </inVariable>
-                <outVariable localId="44" height="27" width="46">
-                  <position x="351" y="57"/>
-                  <connectionPointIn>
-                    <relPosition x="0" y="13"/>
+                <outVariable localId="44" height="40" width="46" executionOrderId="0" negated="false">
+                  <position x="351" y="47"/>
+                  <connectionPointIn>
+                    <relPosition x="0" y="20"/>
                     <connection refLocalId="42" formalParameter="OUT">
-                      <position x="351" y="70"/>
-                      <position x="289" y="70"/>
+                      <position x="351" y="67"/>
+                      <position x="296" y="67"/>
                     </connection>
                   </connectionPointIn>
                   <expression>STOP</expression>
@@ -398,32 +398,32 @@
         </transitions>
         <body>
           <SFC>
-            <step localId="1" height="37" width="78" name="Standstill" initialStep="true">
-              <position x="530" y="31"/>
-              <connectionPointIn>
-                <relPosition x="39" y="0"/>
+            <step localId="1" height="37" width="121" name="Standstill" initialStep="true">
+              <position x="509" y="31"/>
+              <connectionPointIn>
+                <relPosition x="60" y="0"/>
                 <connection refLocalId="39">
                   <position x="569" y="31"/>
                   <position x="569" y="11"/>
-                  <position x="980" y="11"/>
-                  <position x="980" y="1151"/>
+                  <position x="963" y="11"/>
+                  <position x="963" y="1151"/>
                   <position x="776" y="1151"/>
                   <position x="776" y="1097"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut formalParameter="">
-                <relPosition x="39" y="37"/>
+                <relPosition x="60" y="37"/>
               </connectionPointOut>
               <connectionPointOutAction formalParameter="">
-                <relPosition x="78" y="18"/>
+                <relPosition x="121" y="18"/>
               </connectionPointOutAction>
             </step>
             <transition localId="2" height="2" width="20">
-              <position x="559" y="225"/>
+              <position x="559" y="222"/>
               <connectionPointIn>
                 <relPosition x="10" y="0"/>
                 <connection refLocalId="1">
-                  <position x="569" y="225"/>
+                  <position x="569" y="222"/>
                   <position x="569" y="68"/>
                 </connection>
               </connectionPointIn>
@@ -438,20 +438,20 @@
                 </inline>
               </condition>
             </transition>
-            <step localId="3" height="27" width="69" name="ORANGE">
-              <position x="535" y="252"/>
-              <connectionPointIn>
-                <relPosition x="34" y="0"/>
+            <step localId="3" height="30" width="118" name="ORANGE">
+              <position x="510" y="250"/>
+              <connectionPointIn>
+                <relPosition x="59" y="0"/>
                 <connection refLocalId="2">
-                  <position x="569" y="252"/>
-                  <position x="569" y="227"/>
+                  <position x="569" y="250"/>
+                  <position x="569" y="224"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut formalParameter="">
-                <relPosition x="34" y="27"/>
+                <relPosition x="59" y="30"/>
               </connectionPointOut>
               <connectionPointOutAction formalParameter="">
-                <relPosition x="69" y="13"/>
+                <relPosition x="118" y="15"/>
               </connectionPointOutAction>
             </step>
             <transition localId="6" height="2" width="20">
@@ -480,7 +480,7 @@
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="1">
                   <position x="711" y="49"/>
-                  <position x="608" y="49"/>
+                  <position x="630" y="49"/>
                 </connection>
               </connectionPointIn>
               <action localId="0" qualifier="P">
@@ -518,7 +518,7 @@
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="3">
                   <position x="711" y="265"/>
-                  <position x="604" y="265"/>
+                  <position x="628" y="265"/>
                 </connection>
               </connectionPointIn>
               <action localId="0" qualifier="R">
@@ -538,20 +538,20 @@
                 <reference name="STOP_CARS"/>
               </action>
             </actionBlock>
-            <step localId="10" height="34" width="37" name="RED">
-              <position x="551" y="411"/>
-              <connectionPointIn>
-                <relPosition x="18" y="0"/>
+            <step localId="10" height="34" width="92" name="RED">
+              <position x="523" y="411"/>
+              <connectionPointIn>
+                <relPosition x="46" y="0"/>
                 <connection refLocalId="6">
                   <position x="569" y="411"/>
                   <position x="569" y="378"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut formalParameter="">
-                <relPosition x="18" y="34"/>
+                <relPosition x="46" y="34"/>
               </connectionPointOut>
               <connectionPointOutAction formalParameter="">
-                <relPosition x="37" y="17"/>
+                <relPosition x="92" y="17"/>
               </connectionPointOutAction>
             </step>
             <actionBlock localId="11" width="235" height="103">
@@ -560,7 +560,7 @@
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="10">
                   <position x="710" y="428"/>
-                  <position x="588" y="428"/>
+                  <position x="615" y="428"/>
                 </connection>
               </connectionPointIn>
               <action localId="0" qualifier="R">
@@ -602,7 +602,7 @@
                 <relPosition x="154" y="0"/>
                 <connection refLocalId="3">
                   <position x="569" y="335"/>
-                  <position x="569" y="279"/>
+                  <position x="569" y="280"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut formalParameter="">
@@ -655,11 +655,11 @@
               </condition>
             </transition>
             <jumpStep localId="5" height="13" width="12" targetName="Standstill">
-              <position x="404" y="569"/>
+              <position x="404" y="553"/>
               <connectionPointIn>
                 <relPosition x="6" y="0"/>
                 <connection refLocalId="4">
-                  <position x="410" y="569"/>
+                  <position x="410" y="553"/>
                   <position x="410" y="530"/>
                 </connection>
               </connectionPointIn>
@@ -680,29 +680,29 @@
                 <relPosition x="159" y="1"/>
               </connectionPointOut>
             </selectionDivergence>
-            <step localId="18" height="27" width="148" name="PEDESTRIAN_GREEN">
-              <position x="495" y="575"/>
-              <connectionPointIn>
-                <relPosition x="74" y="0"/>
+            <step localId="18" height="32" width="177" name="PEDESTRIAN_GREEN">
+              <position x="481" y="572"/>
+              <connectionPointIn>
+                <relPosition x="88" y="0"/>
                 <connection refLocalId="12">
-                  <position x="569" y="575"/>
+                  <position x="569" y="572"/>
                   <position x="569" y="535"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut formalParameter="">
-                <relPosition x="74" y="27"/>
+                <relPosition x="88" y="32"/>
               </connectionPointOut>
               <connectionPointOutAction formalParameter="">
-                <relPosition x="148" y="13"/>
+                <relPosition x="177" y="16"/>
               </connectionPointOutAction>
             </step>
-            <actionBlock localId="19" width="236" height="110">
+            <actionBlock localId="19" width="247" height="110">
               <position x="708" y="573"/>
               <connectionPointIn>
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="18">
                   <position x="708" y="588"/>
-                  <position x="643" y="588"/>
+                  <position x="658" y="588"/>
                 </connection>
               </connectionPointIn>
               <action localId="0" qualifier="S">
@@ -754,7 +754,9 @@
                 <relPosition x="159" y="0"/>
                 <connection refLocalId="18">
                   <position x="569" y="625"/>
-                  <position x="569" y="602"/>
+                  <position x="569" y="615"/>
+                  <position x="569" y="615"/>
+                  <position x="569" y="604"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut formalParameter="">
@@ -784,23 +786,23 @@
                 </inline>
               </condition>
             </transition>
-            <step localId="24" height="27" width="148" name="PEDESTRIAN_RED">
-              <position x="495" y="750"/>
+            <step localId="24" height="30" width="148" name="PEDESTRIAN_RED">
+              <position x="495" y="748"/>
               <connectionPointIn>
                 <relPosition x="74" y="0"/>
                 <connection refLocalId="23">
-                  <position x="569" y="750"/>
+                  <position x="569" y="748"/>
                   <position x="569" y="711"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut formalParameter="">
-                <relPosition x="74" y="27"/>
+                <relPosition x="74" y="30"/>
               </connectionPointOut>
               <connectionPointOutAction formalParameter="">
-                <relPosition x="148" y="13"/>
+                <relPosition x="148" y="15"/>
               </connectionPointOutAction>
             </step>
-            <actionBlock localId="25" width="233" height="110">
+            <actionBlock localId="25" width="239" height="110">
               <position x="708" y="748"/>
               <connectionPointIn>
                 <relPosition x="0" y="15"/>
@@ -859,7 +861,7 @@
                 <relPosition x="159" y="0"/>
                 <connection refLocalId="24">
                   <position x="569" y="815"/>
-                  <position x="569" y="777"/>
+                  <position x="569" y="778"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut formalParameter="">
@@ -889,20 +891,20 @@
                 </inline>
               </condition>
             </transition>
-            <step localId="30" height="27" width="56" name="GREEN">
-              <position x="541" y="933"/>
-              <connectionPointIn>
-                <relPosition x="28" y="0"/>
+            <step localId="30" height="33" width="92" name="GREEN">
+              <position x="523" y="930"/>
+              <connectionPointIn>
+                <relPosition x="46" y="0"/>
                 <connection refLocalId="29">
-                  <position x="569" y="933"/>
+                  <position x="569" y="930"/>
                   <position x="569" y="881"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut formalParameter="">
-                <relPosition x="28" y="27"/>
+                <relPosition x="46" y="33"/>
               </connectionPointOut>
               <connectionPointOutAction formalParameter="">
-                <relPosition x="56" y="13"/>
+                <relPosition x="92" y="16"/>
               </connectionPointOutAction>
             </step>
             <actionBlock localId="31" width="227" height="110">
@@ -911,7 +913,7 @@
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="30">
                   <position x="709" y="946"/>
-                  <position x="597" y="946"/>
+                  <position x="615" y="946"/>
                 </connection>
               </connectionPointIn>
               <action localId="0" qualifier="S">
@@ -937,7 +939,7 @@
                       <position x="308" y="1091"/>
                       <position x="291" y="1091"/>
                       <position x="291" y="1065"/>
-                      <position x="274" y="1065"/>
+                      <position x="275" y="1065"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -965,17 +967,17 @@
                 </variable>
               </outputVariables>
             </block>
-            <inVariable localId="33" height="27" width="159">
-              <position x="24" y="1052"/>
-              <connectionPointOut>
-                <relPosition x="159" y="13"/>
+            <inVariable localId="33" height="36" width="168" negated="false">
+              <position x="15" y="1047"/>
+              <connectionPointOut>
+                <relPosition x="168" y="18"/>
               </connectionPointOut>
               <expression>PEDESTRIAN_BUTTON</expression>
             </inVariable>
-            <inVariable localId="34" height="27" width="43">
-              <position x="227" y="1115"/>
-              <connectionPointOut>
-                <relPosition x="43" y="13"/>
+            <inVariable localId="34" height="33" width="53" negated="false">
+              <position x="217" y="1112"/>
+              <connectionPointOut>
+                <relPosition x="53" y="16"/>
               </connectionPointOut>
               <expression>T#2s</expression>
             </inVariable>
@@ -1012,10 +1014,10 @@
                 </variable>
               </outputVariables>
             </block>
-            <inVariable localId="36" height="27" width="97">
+            <inVariable localId="36" height="30" width="97" negated="false">
               <position x="163" y="1182"/>
               <connectionPointOut>
-                <relPosition x="97" y="13"/>
+                <relPosition x="97" y="15"/>
               </connectionPointOut>
               <expression>WARN_CARS</expression>
             </inVariable>
@@ -1046,7 +1048,7 @@
                 <relPosition x="0" y="0"/>
                 <connection refLocalId="30">
                   <position x="569" y="1059"/>
-                  <position x="569" y="960"/>
+                  <position x="569" y="963"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut formalParameter="">
@@ -1086,7 +1088,7 @@
                 </connection>
               </connectionPointIn>
             </jumpStep>
-            <block localId="44" width="50" height="60" typeName="SR" instanceName="SR0">
+            <block localId="44" width="51" height="60" typeName="SR" instanceName="SR0">
               <position x="224" y="1035"/>
               <inputVariables>
                 <variable formalParameter="S1">
@@ -1116,13 +1118,13 @@
               <outputVariables>
                 <variable formalParameter="Q1">
                   <connectionPointOut>
-                    <relPosition x="50" y="30"/>
+                    <relPosition x="51" y="30"/>
                   </connectionPointOut>
                 </variable>
               </outputVariables>
             </block>
-            <comment localId="45" height="681" width="645">
-              <position x="1021" y="21"/>
+            <comment localId="45" height="767" width="753">
+              <position x="973" y="21"/>
               <content>
                 <xhtml:p><![CDATA[*** Description of SFC action qualifiers ***
 
@@ -1168,7 +1170,7 @@
 ]]></xhtml:p>
               </content>
             </comment>
-            <comment localId="46" height="160" width="375">
+            <comment localId="46" height="224" width="375">
               <position x="8" y="326"/>
               <content>
                 <xhtml:p><![CDATA[Conditions can be written in any IEC 61131-3 language.
@@ -1200,11 +1202,10 @@
               </connectionPointOut>
               <variable>SWITCH_BUTTON</variable>
             </contact>
-            <comment localId="13" height="66" width="375">
+            <comment localId="13" height="86" width="379">
               <position x="9" y="28"/>
               <content>
-                <xhtml:p><![CDATA[
-Sequential function chart (SFC) is commonly used to describe state machines.]]></xhtml:p>
+                <xhtml:p><![CDATA[Sequential function chart (SFC) is commonly used to describe state machines.]]></xhtml:p>
               </content>
             </comment>
           </SFC>
@@ -1257,15 +1258,15 @@
         </interface>
         <body>
           <FBD>
-            <block localId="1" width="349" height="836" typeName="traffic_light_sequence" instanceName="trafic_light_sequence0" executionOrderId="0">
-              <position x="470" y="406"/>
+            <block localId="1" width="350" height="836" typeName="traffic_light_sequence" instanceName="trafic_light_sequence0" executionOrderId="0">
+              <position x="494" y="462"/>
               <inputVariables>
                 <variable formalParameter="SWITCH_BUTTON">
                   <connectionPointIn>
                     <relPosition x="0" y="101"/>
                     <connection refLocalId="2" formalParameter="state_out">
-                      <position x="470" y="507"/>
-                      <position x="333" y="507"/>
+                      <position x="494" y="563"/>
+                      <position x="349" y="563"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1273,10 +1274,10 @@
                   <connectionPointIn>
                     <relPosition x="0" y="264"/>
                     <connection refLocalId="3" formalParameter="state_out">
-                      <position x="470" y="670"/>
-                      <position x="402" y="670"/>
-                      <position x="402" y="721"/>
-                      <position x="335" y="721"/>
+                      <position x="494" y="726"/>
+                      <position x="402" y="726"/>
+                      <position x="402" y="777"/>
+                      <position x="351" y="777"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1285,40 +1286,40 @@
               <outputVariables>
                 <variable formalParameter="RED_LIGHT">
                   <connectionPointOut>
-                    <relPosition x="349" y="101"/>
+                    <relPosition x="350" y="101"/>
                   </connectionPointOut>
                 </variable>
                 <variable formalParameter="ORANGE_LIGHT">
                   <connectionPointOut>
-                    <relPosition x="349" y="264"/>
+                    <relPosition x="350" y="264"/>
                   </connectionPointOut>
                 </variable>
                 <variable formalParameter="GREEN_LIGHT">
                   <connectionPointOut>
-                    <relPosition x="349" y="427"/>
+                    <relPosition x="350" y="427"/>
                   </connectionPointOut>
                 </variable>
                 <variable formalParameter="PEDESTRIAN_RED_LIGHT">
                   <connectionPointOut>
-                    <relPosition x="349" y="590"/>
+                    <relPosition x="350" y="590"/>
                   </connectionPointOut>
                 </variable>
                 <variable formalParameter="PEDESTRIAN_GREEN_LIGHT">
                   <connectionPointOut>
-                    <relPosition x="349" y="753"/>
+                    <relPosition x="350" y="753"/>
                   </connectionPointOut>
                 </variable>
               </outputVariables>
             </block>
-            <block localId="2" width="143" height="183" typeName="Button" instanceName="SwitchButton" executionOrderId="0">
-              <position x="190" y="471"/>
+            <block localId="2" width="159" height="183" typeName="Button" instanceName="SwitchButton" executionOrderId="0">
+              <position x="190" y="527"/>
               <inputVariables>
                 <variable formalParameter="back_id">
                   <connectionPointIn>
                     <relPosition x="0" y="36"/>
                     <connection refLocalId="5">
-                      <position x="190" y="507"/>
-                      <position x="136" y="507"/>
+                      <position x="190" y="563"/>
+                      <position x="137" y="563"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1326,8 +1327,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="68"/>
                     <connection refLocalId="6">
-                      <position x="190" y="539"/>
-                      <position x="136" y="539"/>
+                      <position x="190" y="595"/>
+                      <position x="136" y="595"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1335,8 +1336,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="100"/>
                     <connection refLocalId="4">
-                      <position x="190" y="571"/>
-                      <position x="136" y="571"/>
+                      <position x="190" y="627"/>
+                      <position x="136" y="627"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1355,20 +1356,20 @@
               <outputVariables>
                 <variable formalParameter="state_out">
                   <connectionPointOut>
-                    <relPosition x="143" y="36"/>
+                    <relPosition x="159" y="36"/>
                   </connectionPointOut>
                 </variable>
               </outputVariables>
             </block>
-            <block localId="3" width="143" height="198" typeName="Button" instanceName="PedestrianButton" executionOrderId="0">
-              <position x="192" y="684"/>
+            <block localId="3" width="159" height="198" typeName="Button" instanceName="PedestrianButton" executionOrderId="0">
+              <position x="192" y="740"/>
               <inputVariables>
                 <variable formalParameter="back_id">
                   <connectionPointIn>
                     <relPosition x="0" y="37"/>
                     <connection refLocalId="7">
-                      <position x="192" y="721"/>
-                      <position x="159" y="721"/>
+                      <position x="192" y="777"/>
+                      <position x="160" y="777"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1376,8 +1377,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="72"/>
                     <connection refLocalId="8">
-                      <position x="192" y="756"/>
-                      <position x="159" y="756"/>
+                      <position x="192" y="812"/>
+                      <position x="159" y="812"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1401,55 +1402,55 @@
               <outputVariables>
                 <variable formalParameter="state_out">
                   <connectionPointOut>
-                    <relPosition x="143" y="37"/>
+                    <relPosition x="159" y="37"/>
                   </connectionPointOut>
                 </variable>
               </outputVariables>
             </block>
-            <inVariable localId="4" height="27" width="18" executionOrderId="0" negated="false">
-              <position x="118" y="558"/>
-              <connectionPointOut>
-                <relPosition x="18" y="13"/>
+            <inVariable localId="4" height="30" width="18" executionOrderId="0" negated="false">
+              <position x="118" y="612"/>
+              <connectionPointOut>
+                <relPosition x="18" y="15"/>
               </connectionPointOut>
               <expression>1</expression>
             </inVariable>
-            <inVariable localId="5" height="27" width="105" executionOrderId="0" negated="false">
-              <position x="31" y="494"/>
-              <connectionPointOut>
-                <relPosition x="105" y="13"/>
+            <inVariable localId="5" height="30" width="106" executionOrderId="0" negated="false">
+              <position x="31" y="548"/>
+              <connectionPointOut>
+                <relPosition x="106" y="15"/>
               </connectionPointOut>
               <expression>'SWITCH_OFF'</expression>
             </inVariable>
-            <inVariable localId="6" height="27" width="105" executionOrderId="0" negated="false">
-              <position x="31" y="526"/>
-              <connectionPointOut>
-                <relPosition x="105" y="13"/>
+            <inVariable localId="6" height="30" width="105" executionOrderId="0" negated="false">
+              <position x="31" y="580"/>
+              <connectionPointOut>
+                <relPosition x="105" y="15"/>
               </connectionPointOut>
               <expression>'SWITCH_ON'</expression>
             </inVariable>
-            <inVariable localId="7" height="27" width="137" executionOrderId="0" negated="false">
-              <position x="22" y="708"/>
-              <connectionPointOut>
-                <relPosition x="137" y="13"/>
+            <inVariable localId="7" height="30" width="138" executionOrderId="0" negated="false">
+              <position x="22" y="762"/>
+              <connectionPointOut>
+                <relPosition x="138" y="15"/>
               </connectionPointOut>
               <expression>'PEDESTRIAN_OFF'</expression>
             </inVariable>
-            <inVariable localId="8" height="27" width="137" executionOrderId="0" negated="false">
-              <position x="22" y="743"/>
-              <connectionPointOut>
-                <relPosition x="137" y="13"/>
+            <inVariable localId="8" height="30" width="137" executionOrderId="0" negated="false">
+              <position x="22" y="797"/>
+              <connectionPointOut>
+                <relPosition x="137" y="15"/>
               </connectionPointOut>
               <expression>'PEDESTRIAN_ON'</expression>
             </inVariable>
             <block localId="9" width="115" height="133" typeName="Led" instanceName="RedLight" executionOrderId="0">
-              <position x="1057" y="395"/>
+              <position x="1057" y="451"/>
               <inputVariables>
                 <variable formalParameter="back_id">
                   <connectionPointIn>
                     <relPosition x="0" y="38"/>
                     <connection refLocalId="10">
-                      <position x="1057" y="433"/>
-                      <position x="1010" y="433"/>
+                      <position x="1057" y="489"/>
+                      <position x="1013" y="489"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1457,8 +1458,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="75"/>
                     <connection refLocalId="11">
-                      <position x="1057" y="470"/>
-                      <position x="1010" y="470"/>
+                      <position x="1057" y="526"/>
+                      <position x="1010" y="526"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1466,8 +1467,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="112"/>
                     <connection refLocalId="1" formalParameter="RED_LIGHT">
-                      <position x="1057" y="507"/>
-                      <position x="819" y="507"/>
+                      <position x="1057" y="563"/>
+                      <position x="844" y="563"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1475,29 +1476,29 @@
               <inOutVariables/>
               <outputVariables/>
             </block>
-            <inVariable localId="10" height="27" width="79" executionOrderId="0" negated="false">
-              <position x="931" y="420"/>
-              <connectionPointOut>
-                <relPosition x="79" y="13"/>
+            <inVariable localId="10" height="30" width="82" executionOrderId="0" negated="false">
+              <position x="931" y="474"/>
+              <connectionPointOut>
+                <relPosition x="82" y="15"/>
               </connectionPointOut>
               <expression>'RED_OFF'</expression>
             </inVariable>
-            <inVariable localId="11" height="27" width="79" executionOrderId="0" negated="false">
-              <position x="931" y="457"/>
-              <connectionPointOut>
-                <relPosition x="79" y="13"/>
+            <inVariable localId="11" height="30" width="79" executionOrderId="0" negated="false">
+              <position x="931" y="511"/>
+              <connectionPointOut>
+                <relPosition x="79" y="15"/>
               </connectionPointOut>
               <expression>'RED_ON'</expression>
             </inVariable>
             <block localId="12" width="115" height="133" typeName="Led" instanceName="OrangeLight" executionOrderId="0">
-              <position x="1058" y="558"/>
+              <position x="1058" y="614"/>
               <inputVariables>
                 <variable formalParameter="back_id">
                   <connectionPointIn>
                     <relPosition x="0" y="38"/>
                     <connection refLocalId="13">
-                      <position x="1058" y="596"/>
-                      <position x="1010" y="596"/>
+                      <position x="1058" y="652"/>
+                      <position x="1010" y="652"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1505,8 +1506,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="75"/>
                     <connection refLocalId="14">
-                      <position x="1058" y="633"/>
-                      <position x="1010" y="633"/>
+                      <position x="1058" y="689"/>
+                      <position x="1010" y="689"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1514,8 +1515,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="112"/>
                     <connection refLocalId="1" formalParameter="ORANGE_LIGHT">
-                      <position x="1058" y="670"/>
-                      <position x="819" y="670"/>
+                      <position x="1058" y="726"/>
+                      <position x="844" y="726"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1523,29 +1524,29 @@
               <inOutVariables/>
               <outputVariables/>
             </block>
-            <inVariable localId="13" height="27" width="111" executionOrderId="0" negated="false">
-              <position x="899" y="583"/>
-              <connectionPointOut>
-                <relPosition x="111" y="13"/>
+            <inVariable localId="13" height="30" width="111" executionOrderId="0" negated="false">
+              <position x="899" y="637"/>
+              <connectionPointOut>
+                <relPosition x="111" y="15"/>
               </connectionPointOut>
               <expression>'ORANGE_OFF'</expression>
             </inVariable>
-            <inVariable localId="14" height="27" width="106" executionOrderId="0" negated="false">
-              <position x="904" y="620"/>
-              <connectionPointOut>
-                <relPosition x="106" y="13"/>
+            <inVariable localId="14" height="30" width="106" executionOrderId="0" negated="false">
+              <position x="904" y="674"/>
+              <connectionPointOut>
+                <relPosition x="106" y="15"/>
               </connectionPointOut>
               <expression>'ORANGE_ON'</expression>
             </inVariable>
             <block localId="15" width="115" height="133" typeName="Led" instanceName="GreenLight" executionOrderId="0">
-              <position x="1058" y="721"/>
+              <position x="1058" y="777"/>
               <inputVariables>
                 <variable formalParameter="back_id">
                   <connectionPointIn>
                     <relPosition x="0" y="38"/>
                     <connection refLocalId="16">
-                      <position x="1058" y="759"/>
-                      <position x="1010" y="759"/>
+                      <position x="1058" y="815"/>
+                      <position x="1010" y="815"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1553,8 +1554,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="75"/>
                     <connection refLocalId="17">
-                      <position x="1058" y="796"/>
-                      <position x="1010" y="796"/>
+                      <position x="1058" y="852"/>
+                      <position x="1010" y="852"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1562,8 +1563,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="112"/>
                     <connection refLocalId="1" formalParameter="GREEN_LIGHT">
-                      <position x="1058" y="833"/>
-                      <position x="819" y="833"/>
+                      <position x="1058" y="889"/>
+                      <position x="844" y="889"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1571,29 +1572,29 @@
               <inOutVariables/>
               <outputVariables/>
             </block>
-            <inVariable localId="16" height="27" width="111" executionOrderId="0" negated="false">
-              <position x="899" y="746"/>
-              <connectionPointOut>
-                <relPosition x="111" y="13"/>
+            <inVariable localId="16" height="30" width="111" executionOrderId="0" negated="false">
+              <position x="899" y="800"/>
+              <connectionPointOut>
+                <relPosition x="111" y="15"/>
               </connectionPointOut>
               <expression>'GREEN_OFF'</expression>
             </inVariable>
-            <inVariable localId="17" height="27" width="106" executionOrderId="0" negated="false">
-              <position x="904" y="783"/>
-              <connectionPointOut>
-                <relPosition x="106" y="13"/>
+            <inVariable localId="17" height="30" width="106" executionOrderId="0" negated="false">
+              <position x="904" y="837"/>
+              <connectionPointOut>
+                <relPosition x="106" y="15"/>
               </connectionPointOut>
               <expression>'GREEN_ON'</expression>
             </inVariable>
             <block localId="18" width="115" height="133" typeName="Led" instanceName="PedestrianRedLight" executionOrderId="0">
-              <position x="1059" y="884"/>
+              <position x="1059" y="940"/>
               <inputVariables>
                 <variable formalParameter="back_id">
                   <connectionPointIn>
                     <relPosition x="0" y="38"/>
                     <connection refLocalId="19">
-                      <position x="1059" y="922"/>
-                      <position x="1020" y="922"/>
+                      <position x="1059" y="978"/>
+                      <position x="1020" y="978"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1601,8 +1602,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="75"/>
                     <connection refLocalId="20">
-                      <position x="1059" y="959"/>
-                      <position x="1020" y="959"/>
+                      <position x="1059" y="1015"/>
+                      <position x="1020" y="1015"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1610,8 +1611,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="112"/>
                     <connection refLocalId="1" formalParameter="PEDESTRIAN_RED_LIGHT">
-                      <position x="1059" y="996"/>
-                      <position x="819" y="996"/>
+                      <position x="1059" y="1052"/>
+                      <position x="844" y="1052"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1619,29 +1620,29 @@
               <inOutVariables/>
               <outputVariables/>
             </block>
-            <inVariable localId="19" height="27" width="171" executionOrderId="0" negated="false">
-              <position x="849" y="909"/>
-              <connectionPointOut>
-                <relPosition x="171" y="13"/>
+            <inVariable localId="19" height="30" width="171" executionOrderId="0" negated="false">
+              <position x="849" y="963"/>
+              <connectionPointOut>
+                <relPosition x="171" y="15"/>
               </connectionPointOut>
               <expression>'PEDESTRIAN_RED_OFF'</expression>
             </inVariable>
-            <inVariable localId="20" height="27" width="166" executionOrderId="0" negated="false">
-              <position x="854" y="946"/>
-              <connectionPointOut>
-                <relPosition x="166" y="13"/>
+            <inVariable localId="20" height="30" width="166" executionOrderId="0" negated="false">
+              <position x="854" y="1000"/>
+              <connectionPointOut>
+                <relPosition x="166" y="15"/>
               </connectionPointOut>
               <expression>'PEDESTRIAN_RED_ON'</expression>
             </inVariable>
             <block localId="21" width="115" height="133" typeName="Led" instanceName="PedestrianGreenLight" executionOrderId="0">
-              <position x="1059" y="1047"/>
+              <position x="1059" y="1103"/>
               <inputVariables>
                 <variable formalParameter="back_id">
                   <connectionPointIn>
                     <relPosition x="0" y="38"/>
                     <connection refLocalId="22">
-                      <position x="1059" y="1085"/>
-                      <position x="1035" y="1085"/>
+                      <position x="1059" y="1141"/>
+                      <position x="1035" y="1141"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1649,8 +1650,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="75"/>
                     <connection refLocalId="23">
-                      <position x="1059" y="1122"/>
-                      <position x="1035" y="1122"/>
+                      <position x="1059" y="1178"/>
+                      <position x="1035" y="1178"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1658,8 +1659,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="112"/>
                     <connection refLocalId="1" formalParameter="PEDESTRIAN_GREEN_LIGHT">
-                      <position x="1059" y="1159"/>
-                      <position x="819" y="1159"/>
+                      <position x="1059" y="1215"/>
+                      <position x="844" y="1215"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -1667,21 +1668,21 @@
               <inOutVariables/>
               <outputVariables/>
             </block>
-            <inVariable localId="22" height="27" width="190" executionOrderId="0" negated="false">
-              <position x="845" y="1072"/>
-              <connectionPointOut>
-                <relPosition x="190" y="13"/>
+            <inVariable localId="22" height="30" width="190" executionOrderId="0" negated="false">
+              <position x="845" y="1126"/>
+              <connectionPointOut>
+                <relPosition x="190" y="15"/>
               </connectionPointOut>
               <expression>'PEDESTRIAN_GREEN_OFF'</expression>
             </inVariable>
-            <inVariable localId="23" height="27" width="185" executionOrderId="0" negated="false">
-              <position x="850" y="1109"/>
-              <connectionPointOut>
-                <relPosition x="185" y="13"/>
+            <inVariable localId="23" height="30" width="185" executionOrderId="0" negated="false">
+              <position x="850" y="1163"/>
+              <connectionPointOut>
+                <relPosition x="185" y="15"/>
               </connectionPointOut>
               <expression>'PEDESTRIAN_GREEN_ON'</expression>
             </inVariable>
-            <comment localId="24" height="262" width="804">
+            <comment localId="24" height="287" width="1008">
               <position x="22" y="13"/>
               <content>
                 <xhtml:p><![CDATA[This example implements control of traffic lights.
@@ -1703,14 +1704,13 @@
 ]]></xhtml:p>
               </content>
             </comment>
-            <comment localId="102" height="126" width="411">
-              <position x="20" y="319"/>
+            <comment localId="102" height="134" width="734">
+              <position x="21" y="303"/>
               <content>
                 <xhtml:p><![CDATA[In this example FB like 'Button', 'Led' and 'Text' are used. 
-Back_id and sele_id inputs of these blocks are IDs  of 
-graphic primitives in SVG file. 
-This is the way how elements in SVG are bound to elements 
-in PLC program.  You can find out or edit these IDs in Inkscape.]]></xhtml:p>
+Back_id and sele_id inputs of these blocks are IDs  of graphic primitives in SVG file.
+This is the way how elements in SVG are bound to elements in PLC program.
+You can find out or edit these IDs in Inkscape.]]></xhtml:p>
               </content>
             </comment>
           </FBD>
--- a/tests/wamp/.crossbar/config.json	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/wamp/.crossbar/config.json	Mon Jan 07 13:50:39 2019 +0100
@@ -1,43 +1,56 @@
-
 {
-   "controller": {
-   },
-   "workers": [
-      {
-         "type": "router",
-         "options": {
-            "pythonpath": [".."]
-         },
-         "realms": [
-            {
-               "name": "Automation",
-               "roles": [
-                  {
-                     "name": "anonymous",
-                     "permissions": [
+    "version": 2,
+    "controller": {},
+    "workers": [
+        {
+            "type": "router",
+            "options": {
+                "pythonpath": [
+                    ".."
+                ]
+            },
+            "realms": [
+                {
+                    "name": "Automation",
+                    "roles": [
                         {
-                           "uri": "*",
-                           "publish": true,
-                           "subscribe": true,
-                           "call": true,
-                           "register": true
+                            "name": "anonymous",
+                            "permissions": [
+                                {
+                                    "uri": "",
+                                    "match": "prefix",
+                                    "allow": {
+                                        "call": true,
+                                        "register": true,
+                                        "publish": true,
+                                        "subscribe": true
+                                    },
+                                    "disclose": {
+                                        "caller": false,
+                                        "publisher": false
+                                    },
+                                    "cache": true
+                                }
+                            ]
                         }
-                     ]
-                  }
-               ]
-            }
-         ],
-         "transports": [
-            {
-               "type": "websocket",
-               "endpoint": {
-                  "type": "tcp",
-                  "port": 8888
-               },
-               "url": "ws://127.0.0.1:8888/",
-               "serializers" : ["msgpack"]
-            }
-         ]
-      }
-   ]
+                    ]
+                }
+            ],
+            "transports": [
+                {
+                    "type": "websocket",
+                    "debug": true,
+                    "endpoint": {
+                        "type": "tcp",
+                        "port": 8888
+                    },
+                    "url": "ws://127.0.0.1:8888/",
+                    "serializers": [
+                        "msgpack",
+                        "json"
+                    ]
+                }
+            ]
+        }
+    ]
 }
--- a/tests/wamp/README	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/wamp/README	Mon Jan 07 13:50:39 2019 +0100
@@ -1,12 +1,42 @@
-This project contains wamp client config to be loaded at runtime startup.  
-
-project_files/wampconf.json
+/* This project contains wamp client config to be loaded at runtime startup. */
+./project_files/wampconf.json
 
 wampconf.json is in "Project Files", so it is copied to runtime's working directory, and then loaded after program transfer + runtime restart.
 
 Otherwise, wamp config file path can be forced :
-./Beremiz_service.py -c  /path/to/my/wampconf.json /working/dir
+./Beremiz_service.py -c /path/to/my/wampconf.json /working/dir
 
-Crossbar test router configuration is available in .crossbar directory. Start with :
-crossbar -d start
+/* Crossbar install */
+#sudo apt-get update
+#sudo apt-get -y dist-upgrade
+sudo apt-get -y install build-essential libssl-dev libffi-dev libreadline-dev libbz2-dev libsqlite3-dev libncurses5dev
+sudo apt-get -y install python3-pip
+sudo python3 -m pip install -U pip
+sudo pip3 install crossbar
+crossbar version
 
+/* Start Crossbar command: */
+crossbar start
+
+/* Crossbar test router configuration is available in .crossbar directory. */
+Tested on version:
+
+    :::::::::::::::::
+          :::::          _____                      __
+    :::::   :   :::::   / ___/____ ___   ___  ___  / /  ___ _ ____
+    :::::::   :::::::  / /__ / __// _ \ (_-< (_-< / _ \/ _ `// __/
+    :::::   :   :::::  \___//_/   \___//___//___//_.__/\_,_//_/
+          :::::
+    :::::::::::::::::   Crossbar v18.7.2
+
+    Copyright (c) 2013-2018 Crossbar.io Technologies GmbH, licensed under AGPL 3.0.
+
+ Crossbar.io        : 18.7.2
+   Autobahn         : 18.7.1
+   Twisted          : 18.7.0-EPollReactor
+   LMDB             : 0.94/lmdb-0.9.22
+   Python           : 3.6.6/CPython
+ Frozen executable  : no
+ Operating system   : Linux-4.16.0-2-rt-amd64-x86_64-with-debian-buster-sid
+ Host machine       : x86_64
+ Release key        : RWS9T4NltFjmKSMbEtETnOMxRjLhOEZ6e80T5MYzTTh/+NP9Jk20sJmA
--- a/tests/wamp/beremiz.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/wamp/beremiz.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,4 +1,4 @@
 <?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="WAMP://127.0.0.1:8888#Automation#2534667845">
+<BeremizRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" URI_location="WAMP://127.0.0.1:8888#Automation#wamptest">
   <TargetType/>
 </BeremizRoot>
--- a/tests/wamp/plc.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/wamp/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,7 @@
 <?xml version='1.0' encoding='utf-8'?>
 <project xmlns:ns1="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.plcopen.org/xml/tc6_0201">
   <fileHeader companyName="Beremiz" productName="Beremiz" productVersion="1" creationDateTime="2015-02-05T11:44:55" contentDescription=" &#10;&#10;"/>
-  <contentHeader name="WAMPTest" modificationDateTime="2015-02-18T23:59:50">
+  <contentHeader name="WAMPTest" modificationDateTime="2018-08-27T11:11:30">
     <coordinateInfo>
       <fbd>
         <scaling x="0" y="0"/>
@@ -24,6 +24,9 @@
               <type>
                 <DINT/>
               </type>
+              <initialValue>
+                <simpleValue value="1"/>
+              </initialValue>
             </variable>
           </localVars>
           <externalVars>
@@ -41,22 +44,22 @@
         </interface>
         <body>
           <FBD>
-            <inVariable localId="1" executionOrderId="0" height="25" width="55" negated="false">
-              <position x="144" y="70"/>
+            <inVariable localId="1" executionOrderId="0" height="30" width="55" negated="false">
+              <position x="57" y="540"/>
               <connectionPointOut>
-                <relPosition x="55" y="12"/>
+                <relPosition x="55" y="15"/>
               </connectionPointOut>
               <expression>PyVar0</expression>
             </inVariable>
-            <block localId="3" typeName="ADD" executionOrderId="0" height="60" width="65">
-              <position x="245" y="52"/>
+            <block localId="3" typeName="ADD" executionOrderId="0" height="60" width="67">
+              <position x="168" y="525"/>
               <inputVariables>
                 <variable formalParameter="IN1">
                   <connectionPointIn>
                     <relPosition x="0" y="30"/>
                     <connection refLocalId="1">
-                      <position x="245" y="82"/>
-                      <position x="199" y="82"/>
+                      <position x="168" y="555"/>
+                      <position x="112" y="555"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -64,10 +67,10 @@
                   <connectionPointIn>
                     <relPosition x="0" y="50"/>
                     <connection refLocalId="4">
-                      <position x="245" y="102"/>
-                      <position x="228" y="102"/>
-                      <position x="228" y="113"/>
-                      <position x="198" y="113"/>
+                      <position x="168" y="575"/>
+                      <position x="151" y="575"/>
+                      <position x="151" y="595"/>
+                      <position x="112" y="595"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -76,28 +79,63 @@
               <outputVariables>
                 <variable formalParameter="OUT">
                   <connectionPointOut>
-                    <relPosition x="65" y="30"/>
+                    <relPosition x="67" y="30"/>
                   </connectionPointOut>
                 </variable>
               </outputVariables>
             </block>
-            <inVariable localId="4" executionOrderId="0" height="25" width="73" negated="false">
-              <position x="125" y="101"/>
+            <inVariable localId="4" executionOrderId="0" height="30" width="73" negated="false">
+              <position x="39" y="580"/>
               <connectionPointOut>
-                <relPosition x="73" y="12"/>
+                <relPosition x="73" y="15"/>
               </connectionPointOut>
               <expression>LocalVar0</expression>
             </inVariable>
-            <outVariable localId="2" executionOrderId="0" height="25" width="55" negated="false">
-              <position x="344" y="70"/>
+            <comment localId="5" height="459" width="788">
+              <position x="23" y="10"/>
+              <content>
+                <xhtml:p><![CDATA[Communication between Beremiz and PLC runtime isn't bound to any specific protocol and could be extended by writing corresponding connector (see 'connectors' directory).
+Beremiz reference runtime implementation supports PYRO and WAMP protocols.
+This example shows how to use Web Application Messaging Protocol (WAMP).
+
+WAMP can be used to build distributed systems out of application components which are loosely coupled and communicate in real-time. No direct connection between IDE and PLC are necessary.
+
+WAMP is in a process to be published as official IETF standard. Draft specification is already available on IETF website.
+	
+To use this example you need WAMP router and standalone running Beremiz_service.
+1. See README file in project's directory with detailed instructions for
+setup Crossbar.io, router for open Web Application Messaging Protocol (WAMP).
+2. Run crossbar
+3. Create service working directory and copy wampconf.json from project_files to created directory
+4. Run Beremiz_service:
+./Beremiz_service.py -x 0 <working directory>
+]]></xhtml:p>
+              </content>
+            </comment>
+            <inOutVariable localId="2" executionOrderId="0" height="30" width="55" negatedOut="false" negatedIn="false">
+              <position x="270" y="540"/>
               <connectionPointIn>
-                <relPosition x="0" y="12"/>
+                <relPosition x="0" y="15"/>
                 <connection refLocalId="3" formalParameter="OUT">
-                  <position x="344" y="82"/>
-                  <position x="310" y="82"/>
+                  <position x="270" y="555"/>
+                  <position x="235" y="555"/>
                 </connection>
               </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="55" y="15"/>
+              </connectionPointOut>
               <expression>PyVar1</expression>
+            </inOutVariable>
+            <outVariable localId="6" executionOrderId="0" height="30" width="55" negated="false">
+              <position x="362" y="540"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="2">
+                  <position x="362" y="555"/>
+                  <position x="325" y="555"/>
+                </connection>
+              </connectionPointIn>
+              <expression>PyVar0</expression>
             </outVariable>
           </FBD>
         </body>
--- a/tests/wamp/project_files/wampconf.json	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/wamp/project_files/wampconf.json	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,10 @@
 {
-    "url":"ws://127.0.0.1:8888",
-    "realm":"Automation",
-    "ID":"wamptest",
-    "password":"1234567890",
-    "key":"ABCDEFGHIJ"
+    "ID": "wamptest", 
+    "active": true, 
+    "protocolOptions": {
+        "autoPingInterval": 60, 
+        "autoPingTimeout": 20
+    }, 
+    "realm": "Automation", 
+    "url": "ws://127.0.0.1:8888"
 }
--- a/tests/wiimote/plc.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/wiimote/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,14 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://www.plcopen.org/xml/tc6.xsd"
-         xsi:schemaLocation="http://www.plcopen.org/xml/tc6.xsd"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xmlns:xhtml="http://www.w3.org/1999/xhtml">
-  <fileHeader companyName="Unknown"
-              productName="Unnamed"
-              productVersion="1"
-              creationDateTime="2012-09-12T23:30:19"/>
-  <contentHeader name="Unnamed"
-                 modificationDateTime="2013-05-28T18:28:14">
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="Beremiz" productName="Beremiz" productVersion="1" creationDateTime="2012-09-12T23:30:19"/>
+  <contentHeader name="Wiimote example" modificationDateTime="2017-06-06T13:10:31">
     <coordinateInfo>
       <fbd>
         <scaling x="5" y="5"/>
@@ -229,10 +222,18 @@
               </connectionPointIn>
               <expression>c</expression>
             </outVariable>
+            <comment localId="17" height="125" width="500">
+              <position x="450" y="30"/>
+              <content>
+                <xhtml:p><![CDATA[This example shows interaction of PLC program with Nintendo Wii Remote controller.
+
+To work this example requires python-cwiid library to be installed.]]></xhtml:p>
+              </content>
+            </comment>
           </FBD>
         </body>
         <documentation>
-<![CDATA[]]>
+          <xhtml:p><![CDATA[]]></xhtml:p>
         </documentation>
       </pou>
     </pous>
--- a/tests/wxGlade/HMIFrame@wxglade_hmi/hmi.wxg	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/wxGlade/HMIFrame@wxglade_hmi/hmi.wxg	Mon Jan 07 13:50:39 2019 +0100
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
-<!-- generated by wxGlade 0.6.3 on Fri Aug  7 18:16:44 2009 -->
+<!-- generated by wxGlade 0.7.2 on Mon Jun  5 14:18:29 2017 -->
 
-<application path="" name="" class="" option="0" language="python" top_window="HMIFrame" encoding="UTF-8" use_gettext="0" overwrite="0" use_new_namespace="1" for_version="2.8" is_template="0">
+<application class="" encoding="UTF-8" for_version="2.8" header_extension=".h" indent_amount="4" indent_symbol="space" is_template="0" language="python" name="" option="0" overwrite="0" path="..py.py" source_extension=".cpp" top_window="HMIFrame" use_gettext="0" use_new_namespace="1">
     <object class="Class_HMIFrame" name="HMIFrame" base="EditFrame">
         <style>wxDEFAULT_FRAME_STYLE</style>
         <title>HMIFrame</title>
@@ -26,7 +26,7 @@
                 <option>0</option>
                 <object class="wxStaticText" name="label_1" base="EditStaticText">
                     <attribute>1</attribute>
-                    <label>GUI modifiée !</label>
+                    <label>GUI changed!</label>
                 </object>
             </object>
         </object>
--- a/tests/wxGlade/beremiz.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/wxGlade/beremiz.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version='1.0' encoding='utf-8'?>
 <BeremizRoot URI_location="LOCAL://">
   <TargetType/>
+  <Libraries Enable_Python_Library="true"/>
 </BeremizRoot>
--- a/tests/wxGlade/plc.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/wxGlade/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,14 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xmlns="http://www.plcopen.org/xml/tc6.xsd"
-         xmlns:xhtml="http://www.w3.org/1999/xhtml"
-         xsi:schemaLocation="http://www.plcopen.org/xml/tc6.xsd">
-  <fileHeader companyName="beremiz"
-              productName="Beremiz"
-              productVersion="0.0"
-              creationDateTime="2008-12-14T16:21:19"/>
-  <contentHeader name="Beremiz Python Support Tests"
-                 modificationDateTime="2009-10-08T10:58:12">
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="beremiz" productName="Beremiz" productVersion="0.0" creationDateTime="2008-12-14T16:21:19"/>
+  <contentHeader name="Beremiz wxHMI test" modificationDateTime="2017-06-05T14:01:40">
     <coordinateInfo>
       <pageSize x="1024" y="1024"/>
       <fbd>
@@ -28,7 +21,7 @@
       <pou name="main_pytest" pouType="program">
         <interface>
           <localVars>
-            <variable name="python1">
+            <variable name="getCheckBoxState">
               <type>
                 <derived name="python_poll"/>
               </type>
@@ -38,7 +31,7 @@
                 <INT/>
               </type>
             </variable>
-            <variable name="Block1">
+            <variable name="setSpinCtrlValue">
               <type>
                 <derived name="python_poll"/>
               </type>
@@ -47,15 +40,15 @@
         </interface>
         <body>
           <FBD>
-            <block localId="24" width="125" height="90" typeName="python_poll" instanceName="python1">
-              <position x="480" y="115"/>
+            <block localId="24" width="125" height="90" typeName="python_poll" instanceName="getCheckBoxState" executionOrderId="0">
+              <position x="480" y="215"/>
               <inputVariables>
                 <variable formalParameter="TRIG">
                   <connectionPointIn>
                     <relPosition x="0" y="35"/>
                     <connection refLocalId="25">
-                      <position x="480" y="150"/>
-                      <position x="420" y="150"/>
+                      <position x="480" y="250"/>
+                      <position x="420" y="250"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -63,8 +56,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="70"/>
                     <connection refLocalId="26">
-                      <position x="480" y="185"/>
-                      <position x="420" y="185"/>
+                      <position x="480" y="285"/>
+                      <position x="420" y="285"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -83,54 +76,52 @@
                 </variable>
               </outputVariables>
             </block>
-            <inVariable localId="25" height="30" width="100">
-              <position x="320" y="135"/>
+            <inVariable localId="25" height="30" width="100" executionOrderId="0" negated="false">
+              <position x="320" y="235"/>
               <connectionPointOut>
                 <relPosition x="100" y="15"/>
               </connectionPointOut>
               <expression>BOOL#TRUE</expression>
             </inVariable>
-            <inVariable localId="26" height="30" width="400">
-              <position x="20" y="170"/>
+            <inVariable localId="26" height="30" width="400" executionOrderId="0" negated="false">
+              <position x="20" y="270"/>
               <connectionPointOut>
                 <relPosition x="400" y="15"/>
               </connectionPointOut>
               <expression>'int(HMIFrame.checkbox_1.GetValue())'</expression>
             </inVariable>
-            <inVariable localId="27" height="30" width="40">
-              <position x="510" y="355"/>
+            <inVariable localId="27" height="30" width="40" executionOrderId="0" negated="false">
+              <position x="535" y="505"/>
               <connectionPointOut>
                 <relPosition x="40" y="15"/>
               </connectionPointOut>
               <expression>')'</expression>
             </inVariable>
-            <inVariable localId="28" height="30" width="330">
-              <position x="125" y="265"/>
+            <inVariable localId="28" height="30" width="330" executionOrderId="0" negated="false">
+              <position x="150" y="415"/>
               <connectionPointOut>
                 <relPosition x="330" y="15"/>
               </connectionPointOut>
               <expression>'HMIFrame.spin_ctrl_1.SetValue('</expression>
             </inVariable>
-            <block localId="30" width="145" height="60" typeName="STRING_TO_INT">
-              <position x="670" y="135"/>
+            <block localId="30" width="145" height="85" typeName="STRING_TO_INT" executionOrderId="0">
+              <position x="670" y="215"/>
               <inputVariables>
                 <variable formalParameter="EN">
                   <connectionPointIn>
-                    <relPosition x="0" y="30"/>
+                    <relPosition x="0" y="35"/>
                     <connection refLocalId="24" formalParameter="ACK">
-                      <position x="670" y="165"/>
-                      <position x="640" y="165"/>
-                      <position x="640" y="150"/>
-                      <position x="605" y="150"/>
+                      <position x="670" y="250"/>
+                      <position x="605" y="250"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
                 <variable formalParameter="IN">
                   <connectionPointIn>
-                    <relPosition x="0" y="50"/>
+                    <relPosition x="0" y="70"/>
                     <connection refLocalId="24" formalParameter="RESULT">
-                      <position x="670" y="185"/>
-                      <position x="605" y="185"/>
+                      <position x="670" y="285"/>
+                      <position x="605" y="285"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -139,29 +130,29 @@
               <outputVariables>
                 <variable formalParameter="ENO">
                   <connectionPointOut>
-                    <relPosition x="145" y="30"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="145" y="50"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <block localId="32" width="80" height="80" typeName="ADD">
-              <position x="110" y="300"/>
+                    <relPosition x="145" y="35"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="145" y="70"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="32" width="80" height="80" typeName="ADD" executionOrderId="0">
+              <position x="135" y="450"/>
               <inputVariables>
                 <variable formalParameter="EN">
                   <connectionPointIn>
                     <relPosition x="0" y="30"/>
                     <connection refLocalId="38" formalParameter="OUT">
-                      <position x="110" y="330"/>
+                      <position x="135" y="480"/>
+                      <position x="100" y="480"/>
                       <position x="100" y="330"/>
-                      <position x="100" y="230"/>
-                      <position x="1140" y="230"/>
-                      <position x="1140" y="165"/>
-                      <position x="1130" y="165"/>
+                      <position x="1140" y="330"/>
+                      <position x="1140" y="250"/>
+                      <position x="1130" y="250"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -169,8 +160,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="50"/>
                     <connection refLocalId="39">
-                      <position x="110" y="350"/>
-                      <position x="65" y="350"/>
+                      <position x="135" y="500"/>
+                      <position x="90" y="500"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -178,12 +169,12 @@
                   <connectionPointIn>
                     <relPosition x="0" y="70"/>
                     <connection refLocalId="33">
-                      <position x="110" y="370"/>
-                      <position x="100" y="370"/>
-                      <position x="100" y="390"/>
-                      <position x="315" y="390"/>
-                      <position x="315" y="350"/>
-                      <position x="295" y="350"/>
+                      <position x="135" y="520"/>
+                      <position x="125" y="520"/>
+                      <position x="125" y="540"/>
+                      <position x="340" y="540"/>
+                      <position x="340" y="500"/>
+                      <position x="320" y="500"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -202,17 +193,17 @@
                 </variable>
               </outputVariables>
             </block>
-            <block localId="34" width="80" height="100" typeName="CONCAT">
-              <position x="580" y="280"/>
+            <block localId="34" width="80" height="100" typeName="CONCAT" executionOrderId="0">
+              <position x="605" y="430"/>
               <inputVariables>
                 <variable formalParameter="EN">
                   <connectionPointIn>
                     <relPosition x="0" y="30"/>
                     <connection refLocalId="35" formalParameter="ENO">
-                      <position x="580" y="310"/>
-                      <position x="495" y="310"/>
-                      <position x="495" y="330"/>
-                      <position x="475" y="330"/>
+                      <position x="605" y="460"/>
+                      <position x="520" y="460"/>
+                      <position x="520" y="480"/>
+                      <position x="500" y="480"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -220,10 +211,10 @@
                   <connectionPointIn>
                     <relPosition x="0" y="50"/>
                     <connection refLocalId="28">
-                      <position x="580" y="330"/>
-                      <position x="537" y="330"/>
-                      <position x="537" y="280"/>
-                      <position x="455" y="280"/>
+                      <position x="605" y="480"/>
+                      <position x="562" y="480"/>
+                      <position x="562" y="430"/>
+                      <position x="480" y="430"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -231,8 +222,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="70"/>
                     <connection refLocalId="35" formalParameter="OUT">
-                      <position x="580" y="350"/>
-                      <position x="475" y="350"/>
+                      <position x="605" y="500"/>
+                      <position x="500" y="500"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -240,8 +231,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="90"/>
                     <connection refLocalId="27">
-                      <position x="580" y="370"/>
-                      <position x="550" y="370"/>
+                      <position x="605" y="520"/>
+                      <position x="575" y="520"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -260,13 +251,13 @@
                 </variable>
               </outputVariables>
             </block>
-            <inOutVariable localId="33" height="35" width="85">
-              <position x="210" y="335"/>
+            <inOutVariable localId="33" height="35" width="85" executionOrderId="0" negatedOut="false" negatedIn="false">
+              <position x="235" y="485"/>
               <connectionPointIn>
                 <relPosition x="0" y="15"/>
                 <connection refLocalId="32" formalParameter="OUT">
-                  <position x="210" y="350"/>
-                  <position x="190" y="350"/>
+                  <position x="235" y="500"/>
+                  <position x="215" y="500"/>
                 </connection>
               </connectionPointIn>
               <connectionPointOut>
@@ -274,15 +265,15 @@
               </connectionPointOut>
               <expression>counter</expression>
             </inOutVariable>
-            <block localId="35" width="145" height="60" typeName="INT_TO_STRING">
-              <position x="330" y="300"/>
+            <block localId="35" width="145" height="60" typeName="INT_TO_STRING" executionOrderId="0">
+              <position x="355" y="450"/>
               <inputVariables>
                 <variable formalParameter="EN">
                   <connectionPointIn>
                     <relPosition x="0" y="30"/>
                     <connection refLocalId="32" formalParameter="ENO">
-                      <position x="330" y="330"/>
-                      <position x="190" y="330"/>
+                      <position x="355" y="480"/>
+                      <position x="215" y="480"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -290,8 +281,8 @@
                   <connectionPointIn>
                     <relPosition x="0" y="50"/>
                     <connection refLocalId="33">
-                      <position x="330" y="350"/>
-                      <position x="295" y="350"/>
+                      <position x="355" y="500"/>
+                      <position x="320" y="500"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -310,15 +301,15 @@
                 </variable>
               </outputVariables>
             </block>
-            <block localId="36" width="125" height="90" typeName="python_poll" instanceName="Block1">
-              <position x="710" y="275"/>
+            <block localId="36" width="125" height="90" typeName="python_poll" instanceName="setSpinCtrlValue" executionOrderId="0">
+              <position x="735" y="425"/>
               <inputVariables>
                 <variable formalParameter="TRIG">
                   <connectionPointIn>
                     <relPosition x="0" y="35"/>
                     <connection refLocalId="34" formalParameter="ENO">
-                      <position x="710" y="310"/>
-                      <position x="660" y="310"/>
+                      <position x="735" y="460"/>
+                      <position x="685" y="460"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -326,10 +317,10 @@
                   <connectionPointIn>
                     <relPosition x="0" y="70"/>
                     <connection refLocalId="34" formalParameter="OUT">
-                      <position x="710" y="345"/>
-                      <position x="690" y="345"/>
-                      <position x="690" y="330"/>
-                      <position x="660" y="330"/>
+                      <position x="735" y="495"/>
+                      <position x="715" y="495"/>
+                      <position x="715" y="480"/>
+                      <position x="685" y="480"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -348,17 +339,15 @@
                 </variable>
               </outputVariables>
             </block>
-            <block localId="37" width="125" height="45" typeName="INT_TO_BOOL">
-              <position x="870" y="170"/>
+            <block localId="37" width="125" height="45" typeName="INT_TO_BOOL" executionOrderId="0">
+              <position x="870" y="255"/>
               <inputVariables>
                 <variable formalParameter="IN">
                   <connectionPointIn>
                     <relPosition x="0" y="30"/>
                     <connection refLocalId="30" formalParameter="OUT">
-                      <position x="870" y="200"/>
-                      <position x="845" y="200"/>
-                      <position x="845" y="185"/>
-                      <position x="815" y="185"/>
+                      <position x="870" y="285"/>
+                      <position x="815" y="285"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
@@ -372,46 +361,53 @@
                 </variable>
               </outputVariables>
             </block>
-            <block localId="38" width="80" height="65" typeName="AND">
-              <position x="1050" y="135"/>
+            <block localId="38" width="80" height="95" typeName="AND" executionOrderId="0">
+              <position x="1050" y="210"/>
               <inputVariables>
                 <variable formalParameter="IN1">
                   <connectionPointIn>
-                    <relPosition x="0" y="30"/>
+                    <relPosition x="0" y="40"/>
                     <connection refLocalId="30" formalParameter="ENO">
-                      <position x="1050" y="165"/>
-                      <position x="815" y="165"/>
+                      <position x="1050" y="250"/>
+                      <position x="815" y="250"/>
                     </connection>
                   </connectionPointIn>
                 </variable>
                 <variable formalParameter="IN2">
                   <connectionPointIn>
-                    <relPosition x="0" y="55"/>
+                    <relPosition x="0" y="75"/>
                     <connection refLocalId="37" formalParameter="OUT">
-                      <position x="1050" y="190"/>
-                      <position x="1025" y="190"/>
-                      <position x="1025" y="200"/>
-                      <position x="995" y="200"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="80" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="39" height="30" width="60">
-              <position x="5" y="335"/>
+                      <position x="1050" y="285"/>
+                      <position x="995" y="285"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="80" y="40"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="39" height="30" width="60" executionOrderId="0" negated="false">
+              <position x="30" y="485"/>
               <connectionPointOut>
                 <relPosition x="60" y="15"/>
               </connectionPointOut>
               <expression>INT#1</expression>
             </inVariable>
+            <comment localId="101" height="115" width="680">
+              <position x="10" y="30"/>
+              <content>
+                <xhtml:p><![CDATA[This example shows how IEC program in PLC can interact with UI created using wxGlade. 
+
+"WxGlade GUI" is extension to build user interface for PLC using wxGlade.
+To edit user interface click on "WxGlade" icon in extension settings.]]></xhtml:p>
+              </content>
+            </comment>
           </FBD>
         </body>
       </pou>
--- a/tests/wxHMI/HMI@wxglade_hmi/baseconfnode.xml	Sat Jun 02 11:56:01 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BaseParams Name="HMI" IEC_Channel="0"/>
--- a/tests/wxHMI/HMI@wxglade_hmi/hmi.wxg	Sat Jun 02 11:56:01 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-<?xml version="1.0"?>
-<!-- generated by wxGlade 0.6.8 on Thu Jun 18 15:19:02 2015 -->
-
-<application path="" name="" class="" option="0" language="python" top_window="wxglade_hmi" encoding="UTF-8" use_gettext="1" overwrite="0" use_new_namespace="1" for_version="2.8" is_template="0" indent_amount="4" indent_symbol="space" source_extension=".cpp" header_extension=".h">
-    <object class="Class_wxglade_hmi" name="wxglade_hmi" base="EditFrame">
-        <style>wxCAPTION|wxCLOSE_BOX|wxMINIMIZE_BOX|wxMAXIMIZE|wxMAXIMIZE_BOX|wxSYSTEM_MENU|wxRESIZE_BORDER|wxCLIP_CHILDREN</style>
-        <title>frame_1</title>
-        <object class="wxFlexGridSizer" name="grid_sizer_1" base="EditFlexGridSizer">
-            <hgap>0</hgap>
-            <growable_rows>0</growable_rows>
-            <rows>1</rows>
-            <growable_cols>0</growable_cols>
-            <cols>4</cols>
-            <vgap>0</vgap>
-            <object class="sizeritem">
-                <flag>wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL</flag>
-                <border>0</border>
-                <option>1</option>
-                <object class="ThreeDee" name="window_1" base="CustomWidget">
-                    <extracode># WHERE IS THAT ?\nprint "hello"\n</extracode>
-                    <arguments>
-                        <argument>$parent</argument>
-                        <argument>$id</argument>
-                    </arguments>
-                    <size>400,400</size>
-                </object>
-            </object>
-            <object class="sizeritem">
-                <flag>wxEXPAND</flag>
-                <border>0</border>
-                <option>1</option>
-                <object class="wxFlexGridSizer" name="sizer_1" base="EditFlexGridSizer">
-                    <hgap>0</hgap>
-                    <growable_rows>0</growable_rows>
-                    <rows>2</rows>
-                    <cols>1</cols>
-                    <vgap>0</vgap>
-                    <object class="sizeritem">
-                        <flag>wxEXPAND</flag>
-                        <border>0</border>
-                        <option>1</option>
-                        <object class="wxBoxSizer" name="sizer_2" base="EditBoxSizer">
-                            <orient>wxVERTICAL</orient>
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                        </object>
-                    </object>
-                    <object class="sizeritem">
-                        <flag>wxEXPAND</flag>
-                        <border>0</border>
-                        <option>1</option>
-                        <object class="wxGridSizer" name="sizer_3" base="EditGridSizer">
-                            <hgap>0</hgap>
-                            <rows>4</rows>
-                            <cols>2</cols>
-                            <vgap>0</vgap>
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                        </object>
-                    </object>
-                </object>
-            </object>
-            <object class="sizeritem">
-                <border>0</border>
-                <option>0</option>
-                <object class="wxToggleButton" name="DrawTestBt" base="EditToggleButton">
-                    <label>Please Draw !</label>
-                    <events>
-                        <handler event="EVT_TOGGLEBUTTON">SetPLCGlobalVar</handler>
-                    </events>
-                    <extraproperties>
-                        <property name="Name">"DrawTest"</property>
-                    </extraproperties>
-                </object>
-            </object>
-            <object class="sizeritem">
-                <border>0</border>
-                <option>0</option>
-                <object class="wxToggleButton" name="DrawTestBt_copy" base="EditToggleButton">
-                    <label>Please Draw copy !</label>
-                    <events>
-                        <handler event="EVT_TOGGLEBUTTON">SetPLCGlobalVar</handler>
-                    </events>
-                    <extraproperties>
-                        <property name="Name">"DrawEscher"</property>
-                    </extraproperties>
-                </object>
-            </object>
-        </object>
-    </object>
-</application>
--- a/tests/wxHMI/HMI@wxglade_hmi/hmi.wxg.bak	Sat Jun 02 11:56:01 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-<?xml version="1.0"?>
-<!-- generated by wxGlade HG on Wed Oct 02 23:48:24 2013 -->
-
-<application path="" name="" class="" option="0" language="python" top_window="wxglade_hmi" encoding="UTF-8" use_gettext="0" overwrite="0" use_new_namespace="1" for_version="2.8" is_template="0" indent_amount="4" indent_symbol="space" source_extension=".cpp" header_extension=".h">
-    <object class="Class_wxglade_hmi" name="wxglade_hmi" base="EditFrame">
-        <style>wxCAPTION|wxCLOSE_BOX|wxMINIMIZE_BOX|wxMAXIMIZE|wxMAXIMIZE_BOX|wxSYSTEM_MENU|wxRESIZE_BORDER|wxCLIP_CHILDREN</style>
-        <title>frame_1</title>
-        <object class="wxFlexGridSizer" name="grid_sizer_1" base="EditFlexGridSizer">
-            <hgap>0</hgap>
-            <growable_rows>0</growable_rows>
-            <rows>1</rows>
-            <growable_cols>0</growable_cols>
-            <cols>2</cols>
-            <vgap>0</vgap>
-            <object class="sizeritem">
-                <flag>wxEXPAND</flag>
-                <border>0</border>
-                <option>1</option>
-                <object class="ThreeDee" name="window_1" base="CustomWidget">
-                    <arguments>
-                        <argument>$parent</argument>
-                        <argument>$id</argument>
-                    </arguments>
-                    <size>400,400</size>
-                </object>
-            </object>
-            <object class="sizeritem">
-                <flag>wxEXPAND</flag>
-                <border>0</border>
-                <option>1</option>
-                <object class="wxFlexGridSizer" name="sizer_1" base="EditFlexGridSizer">
-                    <hgap>0</hgap>
-                    <rows>2</rows>
-                    <cols>1</cols>
-                    <vgap>0</vgap>
-                    <object class="sizeritem">
-                        <flag>wxEXPAND</flag>
-                        <border>0</border>
-                        <option>1</option>
-                        <object class="wxBoxSizer" name="sizer_2" base="EditBoxSizer">
-                            <orient>wxVERTICAL</orient>
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                        </object>
-                    </object>
-                    <object class="sizeritem">
-                        <flag>wxEXPAND</flag>
-                        <border>0</border>
-                        <option>1</option>
-                        <object class="wxGridSizer" name="sizer_3" base="EditGridSizer">
-                            <hgap>0</hgap>
-                            <rows>4</rows>
-                            <cols>2</cols>
-                            <vgap>0</vgap>
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                            <object class="sizerslot" />
-                        </object>
-                    </object>
-                </object>
-            </object>
-        </object>
-    </object>
-</application>
--- a/tests/wxHMI/HMI@wxglade_hmi/pyfile.xml	Sat Jun 02 11:56:01 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,134 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml">
-  <variables>
-    <variable name="Power_ON" type="BOOL"/>
-    <variable name="Power_OFF" type="BOOL"/>
-    <variable name="DrawTest" type="BOOL"/>
-    <variable name="DrawLogo" type="BOOL"/>
-    <variable name="DrawEscher" type="BOOL"/>
-    <variable name="Detect_Circle" type="BOOL"/>
-    <variable name="XaxisPos" type="INT"/>
-    <variable name="YaxisPos" type="INT"/>
-    <variable name="ZaxisPos" type="INT"/>
-    <variable name="TaxisPos" type="INT"/>
-    <variable name="XaxisMinus" type="BOOL"/>
-    <variable name="YaxisMinus" type="BOOL"/>
-    <variable name="ZaxisMinus" type="BOOL"/>
-    <variable name="TaxisMinus" type="BOOL"/>
-    <variable name="XaxisPlus" type="BOOL"/>
-    <variable name="YaxisPlus" type="BOOL"/>
-    <variable name="ZaxisPlus" type="BOOL"/>
-    <variable name="TaxisPlus" type="BOOL"/>
-  </variables>
-  <globals>
-    <xhtml:p><![CDATA[
-import ctypes
-import wx, sys
-
-AxisList = ["X","Y","Z","T"]
-
-PwrButtons = ['Power_ON',
-              'Power_OFF']
-
-ActionButtons = ['Detect_Circle',
-                 'DrawTest',
-                 'DrawLogo',
-                 'DrawEscher']
-
-class ThreeDee(wx.StaticText):
-    def __init__(self, *args, **kwargs):
-        self.initialized = False
-        kwargs["style"] = wx.ALIGN_CENTRE_HORIZONTAL
-        super(ThreeDee, self).__init__(*args, **kwargs)
-
-        self.SetFont(wx.Font(24, wx.SWISS, wx.NORMAL, wx.BOLD))
-        
-        self.positions = [0.]*4
-
-        self.Message = None
-        self.NegLimits = None
-        self.Disk = None
-
-
-    def UpdatePositions(self, positions):
-        # get globals from PLC
-        self.positions = positions
-        self.SetLabel(
-            ((self.Message  +'\n\n') if self.Message else '' )+
-            " ".join(["%s %+.2f"%(axis,self.positions[i])
-                          for i,axis in enumerate(AxisList)]))
-
-def MakeButtonFunc(window, sizer, btname):
-    def ButtonDown(event):
-        setattr(PLCGlobals,btname,1)
-        event.Skip()
-    def ButtonUp(event):
-        setattr(PLCGlobals,btname,0)
-        event.Skip()
-    obj = wx.BitmapButton(window, -1, wx.Bitmap('%s.png'%btname))
-    sizer.Add(obj, 2, wx.EXPAND, 0)
-    obj.Bind(wx.EVT_LEFT_DOWN, ButtonDown)
-    obj.Bind(wx.EVT_LEFT_UP, ButtonUp)
-    return obj
-
-def UpdPos(self):
-    positions = [getattr(PLCGlobals,axname+"axisPos") for axname in AxisList]
-
-    self.window_1.UpdatePositions(positions)
-
-Class_wxglade_hmi.UpdPos = UpdPos
-
-
-#def UpdatePositions(self, event):
-#
-#    positions = [getattr(PLCGlobals,axname+"axisPos") for axname in AxisList]
-#
-#    self.window_1.UpdatePositions(positions)
-#
-#    event.Skip()
-
-#Class_wxglade_hmi.UpdatePositions = UpdatePositions
-
-initorig = Class_wxglade_hmi.__init__
-def Init(self,*args,**kargs):
-    initorig(self,*args,**kargs)
-    sizer = self.GetSizer().GetItem(1).GetSizer().GetItem(0).GetSizer()
-    self.main_buttons = map(
-        lambda btname: MakeButtonFunc(self, sizer, btname), PwrButtons)
-    sizer = self.GetSizer().GetItem(1).GetSizer().GetItem(1).GetSizer()
-    self.main_buttons = map(
-        lambda btname: MakeButtonFunc(self, sizer, btname), ActionButtons)
-    self.axis_buttons = map(
-        lambda axis:( MakeButtonFunc(self, sizer, axis+"axisMinus"), 
-                        MakeButtonFunc(self, sizer, axis+"axisPlus")),
-        AxisList)
-    # self.timer = wx.Timer(self, -1)
-    # self.Bind(wx.EVT_TIMER, self.UpdatePositions, self.timer)
-    # self.ShowFullScreen(True,wx.FULLSCREEN_ALL)
-    # wx.CallAfter(self.timer.Start,200)
-    
-Class_wxglade_hmi.__init__ = Init
-
-def SetPLCGlobalVar(self, evt):
-    tglbtname = evt.GetEventObject().GetName()
-    setattr(PLCGlobals, tglbtname, evt.GetEventObject().GetValue())
-
-]]></xhtml:p>
-  </globals>
-  <init>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </init>
-  <cleanup>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </cleanup>
-  <start>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </start>
-  <stop>
-    <xhtml:p><![CDATA[
-]]></xhtml:p>
-  </stop>
-</PyFile>
--- a/tests/wxHMI/beremiz.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/wxHMI/beremiz.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,5 +1,5 @@
-<?xml version='1.0' encoding='utf-8'?>
-<BeremizRoot URI_location="LOCAL://">
-  <TargetType/>
-  <Libraries Enable_SVGUI_Library="false"/>
-</BeremizRoot>
+<?xml version='1.0' encoding='utf-8'?>
+<BeremizRoot URI_location="LOCAL://">
+  <TargetType/>
+  <Libraries Enable_Python_Library="true"/>
+</BeremizRoot>
--- a/tests/wxHMI/plc.xml	Sat Jun 02 11:56:01 2018 +0100
+++ b/tests/wxHMI/plc.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -1,592 +1,1639 @@
-<?xml version='1.0' encoding='utf-8'?>
-<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
-  <fileHeader companyName="Unknown" productName="Unnamed" productVersion="1" creationDateTime="2012-09-12T23:30:19"/>
-  <contentHeader name="Unnamed" modificationDateTime="2015-07-01T22:17:12">
-    <coordinateInfo>
-      <pageSize x="1050" y="1485"/>
-      <fbd>
-        <scaling x="5" y="5"/>
-      </fbd>
-      <ld>
-        <scaling x="0" y="0"/>
-      </ld>
-      <sfc>
-        <scaling x="0" y="0"/>
-      </sfc>
-    </coordinateInfo>
-  </contentHeader>
-  <types>
-    <dataTypes/>
-    <pous>
-      <pou name="main" pouType="program">
-        <interface>
-          <externalVars>
-            <variable name="Power_ON">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="Power_OFF">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="power">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="DrawTest">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="DrawLogo">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="DrawEscher">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="Detect_Circle">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-          </externalVars>
-          <localVars>
-            <variable name="RS0">
-              <type>
-                <derived name="RS"/>
-              </type>
-            </variable>
-          </localVars>
-          <externalVars>
-            <variable name="ZaxisPos">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </externalVars>
-        </interface>
-        <body>
-          <FBD>
-            <inVariable localId="286" executionOrderId="0" height="25" width="65" negated="false">
-              <position x="230" y="205"/>
-              <connectionPointOut>
-                <relPosition x="65" y="10"/>
-              </connectionPointOut>
-              <expression>Power_ON</expression>
-            </inVariable>
-            <block localId="287" typeName="RS" instanceName="RS0" executionOrderId="0" height="65" width="45">
-              <position x="395" y="190"/>
-              <inputVariables>
-                <variable formalParameter="S">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="286">
-                      <position x="395" y="220"/>
-                      <position x="315" y="220"/>
-                      <position x="315" y="215"/>
-                      <position x="295" y="215"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="R1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="55"/>
-                    <connection refLocalId="288">
-                      <position x="395" y="245"/>
-                      <position x="320" y="245"/>
-                      <position x="320" y="260"/>
-                      <position x="310" y="260"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="Q1">
-                  <connectionPointOut>
-                    <relPosition x="45" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="288" executionOrderId="0" height="25" width="70" negated="false">
-              <position x="240" y="250"/>
-              <connectionPointOut>
-                <relPosition x="70" y="10"/>
-              </connectionPointOut>
-              <expression>Power_OFF</expression>
-            </inVariable>
-            <outVariable localId="289" executionOrderId="0" height="25" width="45" negated="false">
-              <position x="510" y="220"/>
-              <connectionPointIn>
-                <relPosition x="0" y="10"/>
-                <connection refLocalId="287" formalParameter="Q1">
-                  <position x="510" y="230"/>
-                  <position x="475" y="230"/>
-                  <position x="475" y="220"/>
-                  <position x="440" y="220"/>
-                </connection>
-              </connectionPointIn>
-              <expression>power</expression>
-            </outVariable>
-            <inVariable localId="290" executionOrderId="0" height="25" width="60" negated="false">
-              <position x="75" y="55"/>
-              <connectionPointOut>
-                <relPosition x="60" y="10"/>
-              </connectionPointOut>
-              <expression>DrawTest</expression>
-            </inVariable>
-            <block localId="292" typeName="ADD" executionOrderId="0" height="65" width="60">
-              <position x="350" y="50"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="291">
-                      <position x="350" y="80"/>
-                      <position x="340" y="80"/>
-                      <position x="340" y="25"/>
-                      <position x="530" y="25"/>
-                      <position x="530" y="45"/>
-                      <position x="520" y="45"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="55"/>
-                    <connection refLocalId="293" formalParameter="OUT">
-                      <position x="350" y="105"/>
-                      <position x="287" y="105"/>
-                      <position x="287" y="65"/>
-                      <position x="225" y="65"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="60" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inOutVariable localId="291" executionOrderId="0" height="25" width="55" negatedOut="false" negatedIn="false">
-              <position x="465" y="35"/>
-              <connectionPointIn>
-                <relPosition x="0" y="10"/>
-                <connection refLocalId="292" formalParameter="OUT">
-                  <position x="465" y="45"/>
-                  <position x="437" y="45"/>
-                  <position x="437" y="80"/>
-                  <position x="410" y="80"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="55" y="10"/>
-              </connectionPointOut>
-              <expression>ZaxisPos</expression>
-            </inOutVariable>
-            <block localId="293" typeName="SEL" executionOrderId="0" height="85" width="60">
-              <position x="165" y="35"/>
-              <inputVariables>
-                <variable formalParameter="G">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="290">
-                      <position x="165" y="65"/>
-                      <position x="135" y="65"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN0">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="295">
-                      <position x="165" y="85"/>
-                      <position x="135" y="85"/>
-                      <position x="135" y="90"/>
-                      <position x="105" y="90"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="70"/>
-                    <connection refLocalId="294">
-                      <position x="165" y="105"/>
-                      <position x="135" y="105"/>
-                      <position x="135" y="115"/>
-                      <position x="105" y="115"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="60" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="294" executionOrderId="0" height="25" width="20" negated="false">
-              <position x="85" y="105"/>
-              <connectionPointOut>
-                <relPosition x="20" y="10"/>
-              </connectionPointOut>
-              <expression>1</expression>
-            </inVariable>
-            <inVariable localId="295" executionOrderId="0" height="25" width="20" negated="false">
-              <position x="85" y="80"/>
-              <connectionPointOut>
-                <relPosition x="20" y="10"/>
-              </connectionPointOut>
-              <expression>0</expression>
-            </inVariable>
-          </FBD>
-        </body>
-        <documentation>
-          <xhtml:p><![CDATA[]]></xhtml:p>
-        </documentation>
-      </pou>
-      <pou name="ReadGUIdata" pouType="program">
-        <interface>
-          <localVars>
-            <variable name="tmp">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </localVars>
-          <externalVars>
-            <variable name="power">
-              <type>
-                <BOOL/>
-              </type>
-            </variable>
-            <variable name="XaxisPos">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="YaxisPos">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="ZaxisPos">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-            <variable name="TaxisPos">
-              <type>
-                <INT/>
-              </type>
-            </variable>
-          </externalVars>
-          <localVars>
-            <variable name="python_poll0">
-              <type>
-                <derived name="python_poll"/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <outVariable localId="211" executionOrderId="0" height="25" width="60" negated="false">
-              <position x="565" y="195"/>
-              <connectionPointIn>
-                <relPosition x="0" y="10"/>
-                <connection refLocalId="215">
-                  <position x="565" y="205"/>
-                  <position x="370" y="205"/>
-                  <position x="370" y="195"/>
-                  <position x="330" y="195"/>
-                </connection>
-              </connectionPointIn>
-              <expression>XaxisPos</expression>
-            </outVariable>
-            <block localId="213" typeName="ADD" executionOrderId="0" height="65" width="60">
-              <position x="220" y="295"/>
-              <inputVariables>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="212">
-                      <position x="220" y="325"/>
-                      <position x="210" y="325"/>
-                      <position x="210" y="270"/>
-                      <position x="380" y="270"/>
-                      <position x="380" y="325"/>
-                      <position x="365" y="325"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN2">
-                  <connectionPointIn>
-                    <relPosition x="0" y="55"/>
-                    <connection refLocalId="217" formalParameter="OUT">
-                      <position x="220" y="350"/>
-                      <position x="180" y="350"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="60" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inOutVariable localId="212" executionOrderId="0" height="25" width="30" negatedOut="false" negatedIn="false">
-              <position x="335" y="315"/>
-              <connectionPointIn>
-                <relPosition x="0" y="10"/>
-                <connection refLocalId="213" formalParameter="OUT">
-                  <position x="335" y="325"/>
-                  <position x="280" y="325"/>
-                </connection>
-              </connectionPointIn>
-              <connectionPointOut>
-                <relPosition x="30" y="10"/>
-              </connectionPointOut>
-              <expression>tmp</expression>
-            </inOutVariable>
-            <inVariable localId="214" executionOrderId="0" height="25" width="20" negated="false">
-              <position x="65" y="385"/>
-              <connectionPointOut>
-                <relPosition x="20" y="10"/>
-              </connectionPointOut>
-              <expression>1</expression>
-            </inVariable>
-            <inVariable localId="215" executionOrderId="0" height="25" width="30" negated="false">
-              <position x="300" y="185"/>
-              <connectionPointOut>
-                <relPosition x="30" y="10"/>
-              </connectionPointOut>
-              <expression>tmp</expression>
-            </inVariable>
-            <outVariable localId="216" executionOrderId="0" height="25" width="60" negated="false">
-              <position x="540" y="310"/>
-              <connectionPointIn>
-                <relPosition x="0" y="10"/>
-                <connection refLocalId="215">
-                  <position x="540" y="320"/>
-                  <position x="435" y="320"/>
-                  <position x="435" y="195"/>
-                  <position x="330" y="195"/>
-                </connection>
-              </connectionPointIn>
-              <expression>YaxisPos</expression>
-            </outVariable>
-            <block localId="217" typeName="SEL" executionOrderId="0" height="85" width="60">
-              <position x="120" y="320"/>
-              <inputVariables>
-                <variable formalParameter="G">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="219">
-                      <position x="120" y="350"/>
-                      <position x="97" y="350"/>
-                      <position x="97" y="345"/>
-                      <position x="85" y="345"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN0">
-                  <connectionPointIn>
-                    <relPosition x="0" y="50"/>
-                    <connection refLocalId="218">
-                      <position x="120" y="370"/>
-                      <position x="85" y="370"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="IN1">
-                  <connectionPointIn>
-                    <relPosition x="0" y="70"/>
-                    <connection refLocalId="214">
-                      <position x="120" y="390"/>
-                      <position x="102" y="390"/>
-                      <position x="102" y="395"/>
-                      <position x="85" y="395"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="OUT">
-                  <connectionPointOut>
-                    <relPosition x="60" y="30"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="218" executionOrderId="0" height="25" width="20" negated="false">
-              <position x="65" y="360"/>
-              <connectionPointOut>
-                <relPosition x="20" y="10"/>
-              </connectionPointOut>
-              <expression>0</expression>
-            </inVariable>
-            <inVariable localId="219" executionOrderId="0" height="25" width="45" negated="false">
-              <position x="40" y="335"/>
-              <connectionPointOut>
-                <relPosition x="45" y="10"/>
-              </connectionPointOut>
-              <expression>power</expression>
-            </inVariable>
-            <block localId="220" typeName="python_poll" instanceName="python_poll0" executionOrderId="0" height="65" width="85">
-              <position x="640" y="370"/>
-              <inputVariables>
-                <variable formalParameter="TRIG">
-                  <connectionPointIn>
-                    <relPosition x="0" y="30"/>
-                    <connection refLocalId="221">
-                      <position x="640" y="400"/>
-                      <position x="595" y="400"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-                <variable formalParameter="CODE">
-                  <connectionPointIn>
-                    <relPosition x="0" y="55"/>
-                    <connection refLocalId="222">
-                      <position x="640" y="425"/>
-                      <position x="590" y="425"/>
-                    </connection>
-                  </connectionPointIn>
-                </variable>
-              </inputVariables>
-              <inOutVariables/>
-              <outputVariables>
-                <variable formalParameter="ACK">
-                  <connectionPointOut>
-                    <relPosition x="85" y="30"/>
-                  </connectionPointOut>
-                </variable>
-                <variable formalParameter="RESULT">
-                  <connectionPointOut>
-                    <relPosition x="85" y="55"/>
-                  </connectionPointOut>
-                </variable>
-              </outputVariables>
-            </block>
-            <inVariable localId="221" executionOrderId="0" height="25" width="75" negated="false">
-              <position x="520" y="390"/>
-              <connectionPointOut>
-                <relPosition x="75" y="10"/>
-              </connectionPointOut>
-              <expression>BOOL#TRUE</expression>
-            </inVariable>
-            <inVariable localId="222" executionOrderId="0" height="25" width="135" negated="false">
-              <position x="455" y="415"/>
-              <connectionPointOut>
-                <relPosition x="135" y="10"/>
-              </connectionPointOut>
-              <expression>'wxglade_hmi.UpdPos()'</expression>
-            </inVariable>
-          </FBD>
-        </body>
-        <documentation>
-          <xhtml:p><![CDATA[]]></xhtml:p>
-        </documentation>
-      </pou>
-      <pou name="Declarations" pouType="program">
-        <interface>
-          <localVars>
-            <variable name="LocalVar0">
-              <type>
-                <DINT/>
-              </type>
-            </variable>
-            <variable name="LocalVar1">
-              <type>
-                <DINT/>
-              </type>
-            </variable>
-          </localVars>
-        </interface>
-        <body>
-          <FBD>
-            <inVariable localId="127" executionOrderId="0" height="25" width="60" negated="false">
-              <position x="235" y="205"/>
-              <connectionPointOut>
-                <relPosition x="60" y="10"/>
-              </connectionPointOut>
-              <expression>LocalVar0</expression>
-            </inVariable>
-            <outVariable localId="128" executionOrderId="0" height="25" width="60" negated="false">
-              <position x="450" y="190"/>
-              <connectionPointIn>
-                <relPosition x="0" y="10"/>
-                <connection refLocalId="127">
-                  <position x="450" y="200"/>
-                  <position x="372" y="200"/>
-                  <position x="372" y="215"/>
-                  <position x="295" y="215"/>
-                </connection>
-              </connectionPointIn>
-              <expression>LocalVar1</expression>
-            </outVariable>
-          </FBD>
-        </body>
-        <documentation>
-          <xhtml:p><![CDATA[]]></xhtml:p>
-        </documentation>
-      </pou>
-    </pous>
-  </types>
-  <instances>
-    <configurations>
-      <configuration name="config">
-        <resource name="resource1">
-          <task name="InitOneShot" priority="0" single="Initialize">
-            <pouInstance name="Initializer" typeName="Declarations"/>
-          </task>
-          <task name="ControlTask" priority="0" interval="T#2ms">
-            <pouInstance name="MainInstance" typeName="main"/>
-          </task>
-          <task name="GUIupdate" priority="0" interval="T#200ms">
-            <pouInstance name="PosReader" typeName="ReadGUIdata"/>
-          </task>
-          <globalVars>
-            <variable name="Initialize">
-              <type>
-                <BOOL/>
-              </type>
-              <initialValue>
-                <simpleValue value="TRUE"/>
-              </initialValue>
-            </variable>
-            <variable name="power">
-              <type>
-                <BOOL/>
-              </type>
-              <initialValue>
-                <simpleValue value="TRUE"/>
-              </initialValue>
-            </variable>
-          </globalVars>
-        </resource>
-      </configuration>
-    </configurations>
-  </instances>
-</project>
+<?xml version='1.0' encoding='utf-8'?>
+<project xmlns="http://www.plcopen.org/xml/tc6_0201" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml" xsi:schemaLocation="http://www.plcopen.org/xml/tc6_0201">
+  <fileHeader companyName="Unknown" productName="Beremiz" productVersion="1" creationDateTime="2012-09-12T23:30:19"/>
+  <contentHeader name="extended wxHMI example" modificationDateTime="2018-09-26T14:07:02">
+    <coordinateInfo>
+      <pageSize x="1050" y="1485"/>
+      <fbd>
+        <scaling x="5" y="5"/>
+      </fbd>
+      <ld>
+        <scaling x="0" y="0"/>
+      </ld>
+      <sfc>
+        <scaling x="0" y="0"/>
+      </sfc>
+    </coordinateInfo>
+  </contentHeader>
+  <types>
+    <dataTypes/>
+    <pous>
+      <pou name="main" pouType="program">
+        <interface>
+          <externalVars>
+            <variable name="Power_ON">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Power_OFF">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </externalVars>
+          <localVars>
+            <variable name="power">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </localVars>
+          <externalVars>
+            <variable name="DrawTest">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="DrawTestBtn">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="DrawLogo">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="XaxisPos">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="YaxisPos">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="ZaxisPos">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+            <variable name="TaxisPos">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </externalVars>
+          <localVars>
+            <variable name="PowerCtrl">
+              <type>
+                <derived name="RS"/>
+              </type>
+            </variable>
+            <variable name="Xaxis">
+              <type>
+                <derived name="axis"/>
+              </type>
+            </variable>
+          </localVars>
+          <externalVars>
+            <variable name="XAxisMinus">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="XAxisPlus">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="YAxisPlus">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="YAxisMinus">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="ZAxisPlus">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="ZAxisMinus">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="TAxisPlus">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="TAxisMinus">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </externalVars>
+          <localVars>
+            <variable name="Yaxis">
+              <type>
+                <derived name="axis"/>
+              </type>
+            </variable>
+            <variable name="Taxis">
+              <type>
+                <derived name="axis"/>
+              </type>
+            </variable>
+            <variable name="Zaxis">
+              <type>
+                <derived name="axis"/>
+              </type>
+            </variable>
+            <variable name="DrawTestDo">
+              <type>
+                <derived name="RS"/>
+              </type>
+            </variable>
+            <variable name="DrawLogoDo">
+              <type>
+                <derived name="RS"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <comment localId="296" height="330" width="655">
+              <position x="390" y="10"/>
+              <content>
+                <xhtml:p><![CDATA[Example shows 
+- how to use wxGlade extension to create user interface and dynamically extend it using Python, 
+- how to respond to user actions in PLC program and 
+- how to use several PLC tasks to handle process of different speeds.
+
+Program has two tasks:
+1. Slow task that communicates with user interface created in wxGlade and updates axes state.
+2. Main task that drives virtual axes.
+
+When power is on, user can control axes.
+"Draw Logo" buttons starts X, Y, Z axes. "Draw Test" buttons  starts Z and T axes. 
+User can adjust position of axes using manual keys.
+
+
+Happy hacking!]]></xhtml:p>
+              </content>
+            </comment>
+            <inVariable localId="288" executionOrderId="0" height="30" width="85" negated="false">
+              <position x="35" y="190"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>Power_OFF</expression>
+            </inVariable>
+            <inVariable localId="286" executionOrderId="0" height="30" width="85" negated="false">
+              <position x="35" y="155"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>Power_ON</expression>
+            </inVariable>
+            <block localId="287" typeName="RS" instanceName="PowerCtrl" executionOrderId="0" height="95" width="55">
+              <position x="190" y="130"/>
+              <inputVariables>
+                <variable formalParameter="S">
+                  <connectionPointIn>
+                    <relPosition x="0" y="40"/>
+                    <connection refLocalId="286">
+                      <position x="190" y="170"/>
+                      <position x="120" y="170"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="R1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="75"/>
+                    <connection refLocalId="288">
+                      <position x="190" y="205"/>
+                      <position x="120" y="205"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q1">
+                  <connectionPointOut>
+                    <relPosition x="55" y="40"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="289" executionOrderId="0" height="30" width="50" negated="false">
+              <position x="290" y="155"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="287" formalParameter="Q1">
+                  <position x="290" y="170"/>
+                  <position x="241" y="170"/>
+                </connection>
+              </connectionPointIn>
+              <expression>power</expression>
+            </outVariable>
+            <block localId="297" typeName="axis" instanceName="Xaxis" executionOrderId="0" height="160" width="100">
+              <position x="300" y="770"/>
+              <inputVariables>
+                <variable formalParameter="Power">
+                  <connectionPointIn>
+                    <relPosition x="0" y="45"/>
+                    <connection refLocalId="1">
+                      <position x="300" y="815"/>
+                      <position x="265" y="815"/>
+                      <position x="265" y="755"/>
+                      <position x="255" y="755"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Up">
+                  <connectionPointIn>
+                    <relPosition x="0" y="90"/>
+                    <connection refLocalId="301" formalParameter="OUT">
+                      <position x="300" y="860"/>
+                      <position x="277" y="860"/>
+                      <position x="277" y="835"/>
+                      <position x="255" y="835"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Down">
+                  <connectionPointIn>
+                    <relPosition x="0" y="135"/>
+                    <connection refLocalId="299">
+                      <position x="300" y="905"/>
+                      <position x="110" y="905"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Out">
+                  <connectionPointOut>
+                    <relPosition x="100" y="45"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="298" executionOrderId="0" height="35" width="74" negated="false">
+              <position x="435" y="800"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="297" formalParameter="Out">
+                  <position x="435" y="815"/>
+                  <position x="375" y="815"/>
+                  <position x="375" y="815"/>
+                  <position x="416" y="815"/>
+                </connection>
+              </connectionPointIn>
+              <expression>XaxisPos</expression>
+            </outVariable>
+            <inVariable localId="1" executionOrderId="0" height="30" width="50" negated="false">
+              <position x="205" y="740"/>
+              <connectionPointOut>
+                <relPosition x="50" y="15"/>
+              </connectionPointOut>
+              <expression>power</expression>
+            </inVariable>
+            <inVariable localId="299" executionOrderId="0" height="35" width="90" negated="false">
+              <position x="25" y="890"/>
+              <connectionPointOut>
+                <relPosition x="90" y="15"/>
+              </connectionPointOut>
+              <expression>XAxisMinus</expression>
+            </inVariable>
+            <inVariable localId="300" executionOrderId="0" height="35" width="85" negated="false">
+              <position x="25" y="845"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>XAxisPlus</expression>
+            </inVariable>
+            <block localId="301" typeName="OR" executionOrderId="0" height="65" width="70">
+              <position x="185" y="805"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="2">
+                      <position x="185" y="835"/>
+                      <position x="162" y="835"/>
+                      <position x="162" y="805"/>
+                      <position x="140" y="805"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="55"/>
+                    <connection refLocalId="300">
+                      <position x="185" y="860"/>
+                      <position x="110" y="860"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="70" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="2" executionOrderId="0" height="35" width="115" negated="false">
+              <position x="25" y="790"/>
+              <connectionPointOut>
+                <relPosition x="115" y="15"/>
+              </connectionPointOut>
+              <expression>DrawTestDo.Q1</expression>
+            </inVariable>
+            <inVariable localId="3" executionOrderId="0" height="35" width="115" negated="false">
+              <position x="560" y="785"/>
+              <connectionPointOut>
+                <relPosition x="115" y="15"/>
+              </connectionPointOut>
+              <expression>DrawTestDo.Q1</expression>
+            </inVariable>
+            <inVariable localId="4" executionOrderId="0" height="30" width="50" negated="false">
+              <position x="735" y="735"/>
+              <connectionPointOut>
+                <relPosition x="50" y="15"/>
+              </connectionPointOut>
+              <expression>power</expression>
+            </inVariable>
+            <block localId="5" typeName="axis" instanceName="Yaxis" executionOrderId="0" height="160" width="100">
+              <position x="830" y="765"/>
+              <inputVariables>
+                <variable formalParameter="Power">
+                  <connectionPointIn>
+                    <relPosition x="0" y="45"/>
+                    <connection refLocalId="4">
+                      <position x="830" y="810"/>
+                      <position x="815" y="810"/>
+                      <position x="815" y="750"/>
+                      <position x="785" y="750"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Up">
+                  <connectionPointIn>
+                    <relPosition x="0" y="90"/>
+                    <connection refLocalId="9" formalParameter="OUT">
+                      <position x="830" y="855"/>
+                      <position x="807" y="855"/>
+                      <position x="807" y="830"/>
+                      <position x="785" y="830"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Down">
+                  <connectionPointIn>
+                    <relPosition x="0" y="135"/>
+                    <connection refLocalId="7">
+                      <position x="830" y="900"/>
+                      <position x="645" y="900"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Out">
+                  <connectionPointOut>
+                    <relPosition x="100" y="45"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="6" executionOrderId="0" height="35" width="74" negated="false">
+              <position x="955" y="795"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="5" formalParameter="Out">
+                  <position x="955" y="810"/>
+                  <position x="930" y="810"/>
+                </connection>
+              </connectionPointIn>
+              <expression>YaxisPos</expression>
+            </outVariable>
+            <inVariable localId="7" executionOrderId="0" height="35" width="90" negated="false">
+              <position x="560" y="885"/>
+              <connectionPointOut>
+                <relPosition x="90" y="15"/>
+              </connectionPointOut>
+              <expression>YAxisMinus</expression>
+            </inVariable>
+            <inVariable localId="8" executionOrderId="0" height="35" width="85" negated="false">
+              <position x="560" y="840"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>YAxisPlus</expression>
+            </inVariable>
+            <block localId="9" typeName="OR" executionOrderId="0" height="65" width="70">
+              <position x="715" y="800"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="3">
+                      <position x="715" y="830"/>
+                      <position x="657" y="830"/>
+                      <position x="657" y="800"/>
+                      <position x="645" y="800"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="55"/>
+                    <connection refLocalId="8">
+                      <position x="715" y="855"/>
+                      <position x="645" y="855"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="70" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="10" executionOrderId="0" height="35" width="115" negated="false">
+              <position x="25" y="1045"/>
+              <connectionPointOut>
+                <relPosition x="115" y="15"/>
+              </connectionPointOut>
+              <expression>DrawTestDo.Q1</expression>
+            </inVariable>
+            <inVariable localId="11" executionOrderId="0" height="35" width="115" negated="false">
+              <position x="560" y="1025"/>
+              <connectionPointOut>
+                <relPosition x="115" y="15"/>
+              </connectionPointOut>
+              <expression>DrawLogoDo.Q1</expression>
+            </inVariable>
+            <inVariable localId="12" executionOrderId="0" height="30" width="50" negated="false">
+              <position x="740" y="975"/>
+              <connectionPointOut>
+                <relPosition x="50" y="15"/>
+              </connectionPointOut>
+              <expression>power</expression>
+            </inVariable>
+            <block localId="13" typeName="axis" instanceName="Taxis" executionOrderId="0" height="160" width="100">
+              <position x="835" y="1005"/>
+              <inputVariables>
+                <variable formalParameter="Power">
+                  <connectionPointIn>
+                    <relPosition x="0" y="45"/>
+                    <connection refLocalId="12">
+                      <position x="835" y="1050"/>
+                      <position x="820" y="1050"/>
+                      <position x="820" y="990"/>
+                      <position x="790" y="990"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Up">
+                  <connectionPointIn>
+                    <relPosition x="0" y="90"/>
+                    <connection refLocalId="22" formalParameter="OUT">
+                      <position x="835" y="1095"/>
+                      <position x="812" y="1095"/>
+                      <position x="812" y="1070"/>
+                      <position x="790" y="1070"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Down">
+                  <connectionPointIn>
+                    <relPosition x="0" y="135"/>
+                    <connection refLocalId="23">
+                      <position x="835" y="1140"/>
+                      <position x="645" y="1140"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Out">
+                  <connectionPointOut>
+                    <relPosition x="100" y="45"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="14" executionOrderId="0" height="35" width="74" negated="false">
+              <position x="960" y="1035"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="13" formalParameter="Out">
+                  <position x="960" y="1050"/>
+                  <position x="935" y="1050"/>
+                </connection>
+              </connectionPointIn>
+              <expression>TaxisPos</expression>
+            </outVariable>
+            <inVariable localId="15" executionOrderId="0" height="30" width="50" negated="false">
+              <position x="200" y="980"/>
+              <connectionPointOut>
+                <relPosition x="50" y="15"/>
+              </connectionPointOut>
+              <expression>power</expression>
+            </inVariable>
+            <inVariable localId="16" executionOrderId="0" height="35" width="85" negated="false">
+              <position x="560" y="1080"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>TAxisPlus</expression>
+            </inVariable>
+            <block localId="17" typeName="axis" instanceName="Zaxis" executionOrderId="0" height="160" width="100">
+              <position x="300" y="1010"/>
+              <inputVariables>
+                <variable formalParameter="Power">
+                  <connectionPointIn>
+                    <relPosition x="0" y="45"/>
+                    <connection refLocalId="15">
+                      <position x="300" y="1055"/>
+                      <position x="285" y="1055"/>
+                      <position x="285" y="995"/>
+                      <position x="250" y="995"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Up">
+                  <connectionPointIn>
+                    <relPosition x="0" y="90"/>
+                    <connection refLocalId="21" formalParameter="OUT">
+                      <position x="300" y="1100"/>
+                      <position x="280" y="1100"/>
+                      <position x="280" y="1055"/>
+                      <position x="270" y="1055"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="Down">
+                  <connectionPointIn>
+                    <relPosition x="0" y="135"/>
+                    <connection refLocalId="19">
+                      <position x="300" y="1145"/>
+                      <position x="110" y="1145"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Out">
+                  <connectionPointOut>
+                    <relPosition x="100" y="45"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="18" executionOrderId="0" height="35" width="74" negated="false">
+              <position x="435" y="1040"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="17" formalParameter="Out">
+                  <position x="435" y="1055"/>
+                  <position x="400" y="1055"/>
+                </connection>
+              </connectionPointIn>
+              <expression>ZaxisPos</expression>
+            </outVariable>
+            <inVariable localId="19" executionOrderId="0" height="35" width="90" negated="false">
+              <position x="25" y="1130"/>
+              <connectionPointOut>
+                <relPosition x="90" y="15"/>
+              </connectionPointOut>
+              <expression>ZAxisMinus</expression>
+            </inVariable>
+            <inVariable localId="20" executionOrderId="0" height="35" width="85" negated="false">
+              <position x="25" y="1090"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>ZAxisPlus</expression>
+            </inVariable>
+            <block localId="21" typeName="OR" executionOrderId="0" height="100" width="70">
+              <position x="200" y="1020"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="35"/>
+                    <connection refLocalId="24">
+                      <position x="200" y="1055"/>
+                      <position x="170" y="1055"/>
+                      <position x="170" y="1015"/>
+                      <position x="140" y="1015"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="60"/>
+                    <connection refLocalId="10">
+                      <position x="200" y="1080"/>
+                      <position x="150" y="1080"/>
+                      <position x="150" y="1060"/>
+                      <position x="140" y="1060"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN3">
+                  <connectionPointIn>
+                    <relPosition x="0" y="85"/>
+                    <connection refLocalId="20">
+                      <position x="200" y="1105"/>
+                      <position x="110" y="1105"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="70" y="35"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="22" typeName="OR" executionOrderId="0" height="65" width="70">
+              <position x="720" y="1040"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="11">
+                      <position x="720" y="1070"/>
+                      <position x="657" y="1070"/>
+                      <position x="657" y="1040"/>
+                      <position x="645" y="1040"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="55"/>
+                    <connection refLocalId="16">
+                      <position x="720" y="1095"/>
+                      <position x="645" y="1095"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="70" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="23" executionOrderId="0" height="35" width="90" negated="false">
+              <position x="560" y="1125"/>
+              <connectionPointOut>
+                <relPosition x="90" y="15"/>
+              </connectionPointOut>
+              <expression>TAxisMinus</expression>
+            </inVariable>
+            <inVariable localId="24" executionOrderId="0" height="35" width="115" negated="false">
+              <position x="25" y="1000"/>
+              <connectionPointOut>
+                <relPosition x="115" y="15"/>
+              </connectionPointOut>
+              <expression>DrawLogoDo.Q1</expression>
+            </inVariable>
+            <inVariable localId="25" executionOrderId="0" height="30" width="85" negated="false">
+              <position x="40" y="450"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>DrawTest</expression>
+            </inVariable>
+            <block localId="26" typeName="RS" instanceName="DrawTestDo" executionOrderId="0" height="115" width="55">
+              <position x="280" y="445"/>
+              <inputVariables>
+                <variable formalParameter="S">
+                  <connectionPointIn>
+                    <relPosition x="0" y="45"/>
+                    <connection refLocalId="28" formalParameter="OUT">
+                      <position x="280" y="490"/>
+                      <position x="255" y="490"/>
+                      <position x="255" y="465"/>
+                      <position x="230" y="465"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="R1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="90"/>
+                    <connection refLocalId="33" formalParameter="OUT">
+                      <position x="280" y="535"/>
+                      <position x="255" y="535"/>
+                      <position x="255" y="560"/>
+                      <position x="230" y="560"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q1">
+                  <connectionPointOut>
+                    <relPosition x="55" y="45"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="27" executionOrderId="0" height="30" width="85" negated="false">
+              <position x="40" y="545"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>Power_OFF</expression>
+            </inVariable>
+            <block localId="28" typeName="OR" executionOrderId="0" height="85" width="70">
+              <position x="160" y="430"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="35"/>
+                    <connection refLocalId="25">
+                      <position x="160" y="465"/>
+                      <position x="125" y="465"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="29">
+                      <position x="160" y="500"/>
+                      <position x="135" y="500"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="70" y="35"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="29" executionOrderId="0" height="30" width="98" negated="false">
+              <position x="40" y="485"/>
+              <connectionPointOut>
+                <relPosition x="98" y="15"/>
+              </connectionPointOut>
+              <expression>DrawTestBtn</expression>
+            </inVariable>
+            <block localId="33" typeName="OR" executionOrderId="0" height="85" width="70">
+              <position x="160" y="525"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="35"/>
+                    <connection refLocalId="27">
+                      <position x="160" y="560"/>
+                      <position x="125" y="560"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="35">
+                      <position x="160" y="595"/>
+                      <position x="125" y="595"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="70" y="35"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="35" executionOrderId="0" height="30" width="85" negated="false">
+              <position x="40" y="580"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>DrawLogo</expression>
+            </inVariable>
+            <comment localId="36" height="45" width="215">
+              <position x="20" y="670"/>
+              <content>
+                <xhtml:p><![CDATA[Control virtual axes.]]></xhtml:p>
+              </content>
+            </comment>
+            <inVariable localId="30" executionOrderId="0" height="30" width="85" negated="false">
+              <position x="510" y="475"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>DrawLogo</expression>
+            </inVariable>
+            <block localId="31" typeName="RS" instanceName="DrawLogoDo" executionOrderId="0" height="115" width="55">
+              <position x="740" y="445"/>
+              <inputVariables>
+                <variable formalParameter="S">
+                  <connectionPointIn>
+                    <relPosition x="0" y="45"/>
+                    <connection refLocalId="30">
+                      <position x="740" y="490"/>
+                      <position x="595" y="490"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="R1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="90"/>
+                    <connection refLocalId="39" formalParameter="OUT">
+                      <position x="740" y="535"/>
+                      <position x="715" y="535"/>
+                      <position x="715" y="560"/>
+                      <position x="690" y="560"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q1">
+                  <connectionPointOut>
+                    <relPosition x="55" y="45"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="32" executionOrderId="0" height="30" width="85" negated="false">
+              <position x="500" y="545"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>Power_OFF</expression>
+            </inVariable>
+            <inVariable localId="38" executionOrderId="0" height="30" width="85" negated="false">
+              <position x="500" y="580"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>DrawTest</expression>
+            </inVariable>
+            <block localId="39" typeName="OR" executionOrderId="0" height="85" width="70">
+              <position x="620" y="525"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="35"/>
+                    <connection refLocalId="32">
+                      <position x="620" y="560"/>
+                      <position x="585" y="560"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="38">
+                      <position x="620" y="595"/>
+                      <position x="585" y="595"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="70" y="35"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <comment localId="34" height="45" width="365">
+              <position x="15" y="55"/>
+              <content>
+                <xhtml:p><![CDATA[Turn on/off power, Power on enables axes control.]]></xhtml:p>
+              </content>
+            </comment>
+            <comment localId="37" height="45" width="550">
+              <position x="35" y="360"/>
+              <content>
+                <xhtml:p><![CDATA[Only one mode can be selected at any time ("Draw Logo" or "Draw Test").]]></xhtml:p>
+              </content>
+            </comment>
+          </FBD>
+        </body>
+        <documentation>
+          <xhtml:p><![CDATA[]]></xhtml:p>
+        </documentation>
+      </pou>
+      <pou name="ReadGUIdata" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="python_poll0">
+              <type>
+                <derived name="python_poll"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <block localId="220" typeName="python_poll" instanceName="python_poll0" executionOrderId="0" height="85" width="104">
+              <position x="338" y="130"/>
+              <inputVariables>
+                <variable formalParameter="TRIG">
+                  <connectionPointIn>
+                    <relPosition x="0" y="35"/>
+                    <connection refLocalId="221">
+                      <position x="338" y="165"/>
+                      <position x="268" y="165"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="CODE">
+                  <connectionPointIn>
+                    <relPosition x="0" y="70"/>
+                    <connection refLocalId="222">
+                      <position x="338" y="200"/>
+                      <position x="296" y="200"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="ACK">
+                  <connectionPointOut>
+                    <relPosition x="104" y="35"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="RESULT">
+                  <connectionPointOut>
+                    <relPosition x="104" y="70"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="221" executionOrderId="0" height="30" width="93" negated="false">
+              <position x="175" y="150"/>
+              <connectionPointOut>
+                <relPosition x="93" y="15"/>
+              </connectionPointOut>
+              <expression>BOOL#TRUE</expression>
+            </inVariable>
+            <inVariable localId="222" executionOrderId="0" height="30" width="186" negated="false">
+              <position x="110" y="185"/>
+              <connectionPointOut>
+                <relPosition x="186" y="15"/>
+              </connectionPointOut>
+              <expression>'wxglade_hmi.UpdPos()'</expression>
+            </inVariable>
+            <comment localId="296" height="55" width="445">
+              <position x="35" y="25"/>
+              <content>
+                <xhtml:p><![CDATA[This is slow PLC task. It just updates state of axes on HMI.]]></xhtml:p>
+              </content>
+            </comment>
+          </FBD>
+        </body>
+        <documentation>
+          <xhtml:p><![CDATA[]]></xhtml:p>
+        </documentation>
+      </pou>
+      <pou name="Declarations" pouType="program">
+        <interface>
+          <localVars>
+            <variable name="InitValue">
+              <type>
+                <DINT/>
+              </type>
+              <initialValue>
+                <simpleValue value="17"/>
+              </initialValue>
+            </variable>
+            <variable name="NotInitializedVariable">
+              <type>
+                <DINT/>
+              </type>
+            </variable>
+            <variable name="counter">
+              <type>
+                <DINT/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <inVariable localId="127" executionOrderId="0" height="30" width="82" negated="false">
+              <position x="60" y="180"/>
+              <connectionPointOut>
+                <relPosition x="82" y="15"/>
+              </connectionPointOut>
+              <expression>InitValue</expression>
+            </inVariable>
+            <outVariable localId="128" executionOrderId="0" height="30" width="235" negated="false">
+              <position x="180" y="180"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="127">
+                  <position x="180" y="195"/>
+                  <position x="142" y="195"/>
+                </connection>
+              </connectionPointIn>
+              <expression>NotInitializedVariable</expression>
+            </outVariable>
+            <comment localId="129" height="90" width="395">
+              <position x="65" y="40"/>
+              <content>
+                <xhtml:p><![CDATA[This program called only once at start.
+See task configuration in config.resource1.]]></xhtml:p>
+              </content>
+            </comment>
+            <block localId="131" typeName="ADD" executionOrderId="0" height="95" width="70">
+              <position x="160" y="340"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="40"/>
+                    <connection refLocalId="130">
+                      <position x="160" y="380"/>
+                      <position x="125" y="380"/>
+                      <position x="125" y="325"/>
+                      <position x="380" y="325"/>
+                      <position x="380" y="380"/>
+                      <position x="365" y="380"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="75"/>
+                    <connection refLocalId="1">
+                      <position x="160" y="415"/>
+                      <position x="120" y="415"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="70" y="40"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="1" executionOrderId="0" height="35" width="60" negated="false">
+              <position x="60" y="400"/>
+              <connectionPointOut>
+                <relPosition x="60" y="15"/>
+              </connectionPointOut>
+              <expression>1</expression>
+            </inVariable>
+            <inOutVariable localId="130" executionOrderId="0" height="35" width="90" negatedOut="false" negatedIn="false">
+              <position x="275" y="365"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="131" formalParameter="OUT">
+                  <position x="275" y="380"/>
+                  <position x="230" y="380"/>
+                </connection>
+              </connectionPointIn>
+              <connectionPointOut>
+                <relPosition x="90" y="15"/>
+              </connectionPointOut>
+              <expression>counter</expression>
+            </inOutVariable>
+            <comment localId="2" height="75" width="390">
+              <position x="70" y="240"/>
+              <content>
+                <xhtml:p><![CDATA[Counts how many times the program is called.
+Check counter value in debugger.]]></xhtml:p>
+              </content>
+            </comment>
+          </FBD>
+        </body>
+        <documentation>
+          <xhtml:p><![CDATA[]]></xhtml:p>
+        </documentation>
+      </pou>
+      <pou name="clock" pouType="functionBlock">
+        <interface>
+          <localVars>
+            <variable name="TimerOn">
+              <type>
+                <derived name="TON"/>
+              </type>
+            </variable>
+          </localVars>
+          <outputVars>
+            <variable name="Out">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </outputVars>
+          <inputVars>
+            <variable name="Period">
+              <type>
+                <TIME/>
+              </type>
+              <initialValue>
+                <simpleValue value="T#3s"/>
+              </initialValue>
+            </variable>
+          </inputVars>
+          <localVars>
+            <variable name="TimerOff">
+              <type>
+                <derived name="TON"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <block localId="14" typeName="TON" instanceName="TimerOn" executionOrderId="0" height="100" width="50">
+              <position x="260" y="70"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="40"/>
+                    <connection refLocalId="2" formalParameter="Q">
+                      <position x="260" y="110"/>
+                      <position x="225" y="110"/>
+                      <position x="225" y="10"/>
+                      <position x="550" y="10"/>
+                      <position x="550" y="110"/>
+                      <position x="510" y="110"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="PT">
+                  <connectionPointIn>
+                    <relPosition x="0" y="80"/>
+                    <connection refLocalId="16" formalParameter="OUT">
+                      <position x="260" y="150"/>
+                      <position x="225" y="150"/>
+                      <position x="225" y="255"/>
+                      <position x="190" y="255"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q">
+                  <connectionPointOut>
+                    <relPosition x="50" y="40"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="ET">
+                  <connectionPointOut>
+                    <relPosition x="50" y="80"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="2" typeName="TON" instanceName="TimerOff" executionOrderId="0" height="100" width="50">
+              <position x="460" y="70"/>
+              <inputVariables>
+                <variable formalParameter="IN">
+                  <connectionPointIn>
+                    <relPosition x="0" y="40"/>
+                    <connection refLocalId="14" formalParameter="Q">
+                      <position x="460" y="110"/>
+                      <position x="310" y="110"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="PT">
+                  <connectionPointIn>
+                    <relPosition x="0" y="80"/>
+                    <connection refLocalId="16" formalParameter="OUT">
+                      <position x="460" y="150"/>
+                      <position x="350" y="150"/>
+                      <position x="350" y="255"/>
+                      <position x="190" y="255"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Q" negated="true">
+                  <connectionPointOut>
+                    <relPosition x="50" y="40"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="ET">
+                  <connectionPointOut>
+                    <relPosition x="50" y="80"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="15" executionOrderId="0" height="35" width="35" negated="false">
+              <position x="365" y="25"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="14" formalParameter="Q">
+                  <position x="365" y="40"/>
+                  <position x="340" y="40"/>
+                  <position x="340" y="110"/>
+                  <position x="310" y="110"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Out</expression>
+            </outVariable>
+            <block localId="16" typeName="DIV" executionOrderId="0" height="95" width="70">
+              <position x="120" y="215"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="40"/>
+                    <connection refLocalId="1">
+                      <position x="120" y="255"/>
+                      <position x="78" y="255"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="75"/>
+                    <connection refLocalId="4">
+                      <position x="120" y="290"/>
+                      <position x="75" y="290"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="70" y="40"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="1" executionOrderId="0" height="30" width="58" negated="false">
+              <position x="20" y="240"/>
+              <connectionPointOut>
+                <relPosition x="58" y="15"/>
+              </connectionPointOut>
+              <expression>Period</expression>
+            </inVariable>
+            <inVariable localId="4" executionOrderId="0" height="30" width="55" negated="false">
+              <position x="20" y="275"/>
+              <connectionPointOut>
+                <relPosition x="55" y="15"/>
+              </connectionPointOut>
+              <expression>2</expression>
+            </inVariable>
+          </FBD>
+        </body>
+      </pou>
+      <pou name="axis" pouType="functionBlock">
+        <interface>
+          <inputVars>
+            <variable name="Power">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Up">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+            <variable name="Down">
+              <type>
+                <BOOL/>
+              </type>
+            </variable>
+          </inputVars>
+          <outputVars>
+            <variable name="Out">
+              <type>
+                <INT/>
+              </type>
+            </variable>
+          </outputVars>
+          <localVars>
+            <variable name="axis_conuter">
+              <type>
+                <derived name="CTUD"/>
+              </type>
+            </variable>
+            <variable name="clock0">
+              <type>
+                <derived name="clock"/>
+              </type>
+            </variable>
+          </localVars>
+        </interface>
+        <body>
+          <FBD>
+            <block localId="297" typeName="CTUD" instanceName="axis_conuter" executionOrderId="0" height="310" width="70">
+              <position x="645" y="30"/>
+              <inputVariables>
+                <variable formalParameter="CU" edge="rising">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="303" formalParameter="OUT">
+                      <position x="645" y="80"/>
+                      <position x="580" y="80"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="CD" edge="rising">
+                  <connectionPointIn>
+                    <relPosition x="0" y="105"/>
+                    <connection refLocalId="2" formalParameter="OUT">
+                      <position x="645" y="135"/>
+                      <position x="612" y="135"/>
+                      <position x="612" y="150"/>
+                      <position x="580" y="150"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="R">
+                  <connectionPointIn>
+                    <relPosition x="0" y="165"/>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="LD">
+                  <connectionPointIn>
+                    <relPosition x="0" y="225"/>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="PV">
+                  <connectionPointIn>
+                    <relPosition x="0" y="280"/>
+                    <connection refLocalId="3">
+                      <position x="645" y="310"/>
+                      <position x="610" y="310"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="QU">
+                  <connectionPointOut>
+                    <relPosition x="70" y="50"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="QD">
+                  <connectionPointOut>
+                    <relPosition x="70" y="105"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="CV">
+                  <connectionPointOut>
+                    <relPosition x="70" y="165"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="CD_T">
+                  <connectionPointOut>
+                    <relPosition x="70" y="225"/>
+                  </connectionPointOut>
+                </variable>
+                <variable formalParameter="CU_T">
+                  <connectionPointOut>
+                    <relPosition x="70" y="280"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <outVariable localId="298" executionOrderId="0" height="35" width="35" negated="false">
+              <position x="750" y="180"/>
+              <connectionPointIn>
+                <relPosition x="0" y="15"/>
+                <connection refLocalId="297" formalParameter="CV">
+                  <position x="750" y="195"/>
+                  <position x="715" y="195"/>
+                </connection>
+              </connectionPointIn>
+              <expression>Out</expression>
+            </outVariable>
+            <block localId="299" typeName="clock" instanceName="clock0" executionOrderId="0" height="70" width="87">
+              <position x="165" y="270"/>
+              <inputVariables>
+                <variable formalParameter="Period">
+                  <connectionPointIn>
+                    <relPosition x="0" y="45"/>
+                    <connection refLocalId="1">
+                      <position x="165" y="315"/>
+                      <position x="110" y="315"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="Out">
+                  <connectionPointOut>
+                    <relPosition x="87" y="45"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="300" executionOrderId="0" height="35" width="55" negated="false">
+              <position x="35" y="205"/>
+              <connectionPointOut>
+                <relPosition x="55" y="15"/>
+              </connectionPointOut>
+              <expression>Power</expression>
+            </inVariable>
+            <inVariable localId="1" executionOrderId="0" height="35" width="75" negated="false">
+              <position x="35" y="300"/>
+              <connectionPointOut>
+                <relPosition x="75" y="15"/>
+              </connectionPointOut>
+              <expression>T#100ms</expression>
+            </inVariable>
+            <inVariable localId="301" executionOrderId="0" height="35" width="55" negated="false">
+              <position x="340" y="85"/>
+              <connectionPointOut>
+                <relPosition x="55" y="15"/>
+              </connectionPointOut>
+              <expression>Up</expression>
+            </inVariable>
+            <inVariable localId="302" executionOrderId="0" height="35" width="50" negated="false">
+              <position x="340" y="155"/>
+              <connectionPointOut>
+                <relPosition x="50" y="15"/>
+              </connectionPointOut>
+              <expression>Down</expression>
+            </inVariable>
+            <block localId="303" typeName="AND" executionOrderId="0" height="60" width="110">
+              <position x="470" y="50"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="4" formalParameter="OUT">
+                      <position x="470" y="80"/>
+                      <position x="432" y="80"/>
+                      <position x="432" y="275"/>
+                      <position x="395" y="275"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="301">
+                      <position x="470" y="100"/>
+                      <position x="395" y="100"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="110" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <block localId="2" typeName="AND" executionOrderId="0" height="60" width="110">
+              <position x="470" y="120"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="30"/>
+                    <connection refLocalId="4" formalParameter="OUT">
+                      <position x="470" y="150"/>
+                      <position x="432" y="150"/>
+                      <position x="432" y="275"/>
+                      <position x="395" y="275"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="50"/>
+                    <connection refLocalId="302">
+                      <position x="470" y="170"/>
+                      <position x="390" y="170"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="110" y="30"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+            <inVariable localId="3" executionOrderId="0" height="35" width="85" negated="false">
+              <position x="525" y="295"/>
+              <connectionPointOut>
+                <relPosition x="85" y="15"/>
+              </connectionPointOut>
+              <expression>INT#32767</expression>
+            </inVariable>
+            <block localId="4" typeName="AND" executionOrderId="0" height="100" width="110">
+              <position x="285" y="235"/>
+              <inputVariables>
+                <variable formalParameter="IN1">
+                  <connectionPointIn>
+                    <relPosition x="0" y="40"/>
+                    <connection refLocalId="300">
+                      <position x="285" y="275"/>
+                      <position x="265" y="275"/>
+                      <position x="265" y="220"/>
+                      <position x="90" y="220"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+                <variable formalParameter="IN2">
+                  <connectionPointIn>
+                    <relPosition x="0" y="80"/>
+                    <connection refLocalId="299" formalParameter="Out">
+                      <position x="285" y="315"/>
+                      <position x="250" y="315"/>
+                    </connection>
+                  </connectionPointIn>
+                </variable>
+              </inputVariables>
+              <inOutVariables/>
+              <outputVariables>
+                <variable formalParameter="OUT">
+                  <connectionPointOut>
+                    <relPosition x="110" y="40"/>
+                  </connectionPointOut>
+                </variable>
+              </outputVariables>
+            </block>
+          </FBD>
+        </body>
+      </pou>
+    </pous>
+  </types>
+  <instances>
+    <configurations>
+      <configuration name="config">
+        <resource name="resource1">
+          <task name="InitOneShot" priority="0" single="Initialize">
+            <pouInstance name="Initializer" typeName="Declarations"/>
+          </task>
+          <task name="ControlTask" priority="1" interval="T#2ms">
+            <pouInstance name="MainInstance" typeName="main"/>
+          </task>
+          <task name="GUIupdate" priority="0" interval="T#200ms">
+            <pouInstance name="PosReader" typeName="ReadGUIdata"/>
+          </task>
+          <globalVars>
+            <variable name="Initialize">
+              <type>
+                <BOOL/>
+              </type>
+              <initialValue>
+                <simpleValue value="TRUE"/>
+              </initialValue>
+            </variable>
+          </globalVars>
+        </resource>
+      </configuration>
+    </configurations>
+  </instances>
+</project>
Binary file tests/wxHMI/project_files/DrawLogo.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/wxHMI/wxglade_hmi@wxglade_hmi/baseconfnode.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,2 @@
+<?xml version='1.0' encoding='utf-8'?>
+<BaseParams Name="wxglade_hmi" IEC_Channel="0"/>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/wxHMI/wxglade_hmi@wxglade_hmi/hmi.wxg	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,96 @@
+<?xml version="1.0"?>
+<!-- generated by wxGlade 0.8.3 on Mon Aug 13 17:04:28 2018 -->
+
+<application encoding="UTF-8" for_version="3.0" header_extension=".h" indent_amount="4" indent_symbol="space" is_template="0" language="python" option="0" overwrite="0" path="..py.py" source_extension=".cpp" top_window="wxglade_hmi" use_gettext="1" use_new_namespace="1">
+    <object class="Class_wxglade_hmi" name="wxglade_hmi" base="EditFrame">
+        <title>frame_1</title>
+        <style>wxDEFAULT_FRAME_STYLE|wxMAXIMIZE</style>
+        <object class="wxFlexGridSizer" name="grid_sizer_1" base="EditFlexGridSizer">
+            <rows>1</rows>
+            <cols>4</cols>
+            <vgap>0</vgap>
+            <hgap>0</hgap>
+            <growable_rows>0</growable_rows>
+            <growable_cols>0</growable_cols>
+            <object class="sizeritem">
+                <option>1</option>
+                <border>0</border>
+                <flag>wxALIGN_CENTER</flag>
+                <object class="ThreeDee" name="window_1" base="CustomWidget">
+                    <size>400,400</size>
+                    <arguments>
+                        <argument>$parent</argument>
+                        <argument>$id</argument>
+                    </arguments>
+                </object>
+            </object>
+            <object class="sizeritem">
+                <option>1</option>
+                <border>0</border>
+                <flag>wxEXPAND</flag>
+                <object class="wxFlexGridSizer" name="sizer_1" base="EditFlexGridSizer">
+                    <rows>2</rows>
+                    <cols>1</cols>
+                    <vgap>0</vgap>
+                    <hgap>0</hgap>
+                    <growable_rows>0</growable_rows>
+                    <object class="sizeritem">
+                        <option>1</option>
+                        <border>0</border>
+                        <flag>wxEXPAND</flag>
+                        <object class="wxBoxSizer" name="sizer_2" base="EditBoxSizer">
+                            <orient>wxVERTICAL</orient>
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                        </object>
+                    </object>
+                    <object class="sizeritem">
+                        <option>1</option>
+                        <border>0</border>
+                        <flag>wxEXPAND</flag>
+                        <object class="wxGridSizer" name="sizer_3" base="EditGridSizer">
+                            <rows>6</rows>
+                            <cols>2</cols>
+                            <vgap>0</vgap>
+                            <hgap>0</hgap>
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                            <object class="sizerslot" />
+                        </object>
+                    </object>
+                </object>
+            </object>
+            <object class="sizeritem">
+                <option>0</option>
+                <border>0</border>
+                <object class="wxToggleButton" name="DrawTestBt" base="EditToggleButton">
+                    <events>
+                        <handler event="EVT_TOGGLEBUTTON">SetPLCTestBtnGlobalVar</handler>
+                    </events>
+                    <label>Please Draw!</label>
+                </object>
+            </object>
+            <object class="sizeritem">
+                <option>0</option>
+                <border>0</border>
+                <object class="wxToggleButton" name="DrawTestBt2" base="EditToggleButton">
+                    <events>
+                        <handler event="EVT_TOGGLEBUTTON">SetPLCTestBtn2GlobalVar</handler>
+                    </events>
+                    <label>Please Draw copy!</label>
+                </object>
+            </object>
+        </object>
+    </object>
+</application>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/wxHMI/wxglade_hmi@wxglade_hmi/pyfile.xml	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,148 @@
+<?xml version='1.0' encoding='utf-8'?>
+<PyFile xmlns:xhtml="http://www.w3.org/1999/xhtml">
+  <variables>
+    <variable name="Power_ON" type="BOOL"/>
+    <variable name="Power_OFF" type="BOOL"/>
+    <variable name="DrawTest" type="BOOL"/>
+    <variable name="DrawLogo" type="BOOL"/>
+    <variable name="DrawEscher" type="BOOL"/>
+    <variable name="Detect_Circle" type="BOOL"/>
+    <variable name="XaxisPos" type="INT"/>
+    <variable name="YaxisPos" type="INT"/>
+    <variable name="ZaxisPos" type="INT"/>
+    <variable name="TaxisPos" type="INT"/>
+    <variable name="XaxisMinus" type="BOOL"/>
+    <variable name="YaxisMinus" type="BOOL"/>
+    <variable name="ZaxisMinus" type="BOOL"/>
+    <variable name="TaxisMinus" type="BOOL"/>
+    <variable name="XaxisPlus" type="BOOL"/>
+    <variable name="YaxisPlus" type="BOOL"/>
+    <variable name="ZaxisPlus" type="BOOL"/>
+    <variable name="TaxisPlus" type="BOOL"/>
+    <variable name="DrawTestBtn" type="BOOL"/>
+    <variable name="DrawTestBtn2" type="BOOL"/>
+  </variables>
+  <globals>
+    <xhtml:p><![CDATA[
+import ctypes
+import wx, sys
+
+AxisList = ["X","Y","Z","T"]
+
+PwrButtons = ['Power_ON',
+              'Power_OFF']
+
+ActionButtons = ['Detect_Circle',
+                 'DrawTest',
+                 'DrawLogo',
+                 'DrawEscher']
+
+class ThreeDee(wx.StaticText):
+    def __init__(self, *args, **kwargs):
+        self.initialized = False
+        kwargs["style"] = wx.ALIGN_CENTRE_HORIZONTAL
+        super(ThreeDee, self).__init__(*args, **kwargs)
+
+        self.SetFont(wx.Font(24, wx.SWISS, wx.NORMAL, wx.BOLD))
+        
+        self.positions = [0.]*4
+
+        self.Message = None
+        self.NegLimits = None
+        self.Disk = None
+
+
+    def UpdatePositions(self, positions):
+        # get globals from PLC
+        self.positions = positions
+        self.SetLabel(
+            ((self.Message  +'\n\n') if self.Message else '' )+
+            " ".join(["%s %+.2f"%(axis,self.positions[i])
+                          for i,axis in enumerate(AxisList)]))
+
+def MakeButtonFunc(window, sizer, btname):
+    def ButtonDown(event):
+        setattr(PLCGlobals,btname,1)
+        event.Skip()
+    def ButtonUp(event):
+        setattr(PLCGlobals,btname,0)
+        event.Skip()
+    obj = wx.BitmapButton(window, -1, wx.Bitmap('%s.png'%btname))
+    sizer.Add(obj, 2, wx.EXPAND, 0)
+    obj.Bind(wx.EVT_LEFT_DOWN, ButtonDown)
+    obj.Bind(wx.EVT_LEFT_UP, ButtonUp)
+    return obj
+
+def UpdPos(self):
+    positions = [getattr(PLCGlobals,axname+"axisPos") for axname in AxisList]
+
+    self.window_1.UpdatePositions(positions)
+
+Class_wxglade_hmi.UpdPos = UpdPos
+
+
+#def UpdatePositions(self, event):
+#
+#    positions = [getattr(PLCGlobals,axname+"axisPos") for axname in AxisList]
+#
+#    self.window_1.UpdatePositions(positions)
+#
+#    event.Skip()
+
+#Class_wxglade_hmi.UpdatePositions = UpdatePositions
+
+def CleanSizer(sizer):
+    sizer_len = sizer.GetItemCount()
+    if sizer_len > 0:
+        for i in reversed(range(sizer_len)):
+            sizer.Remove(i)
+
+initorig = Class_wxglade_hmi.__init__
+def Init(self,*args,**kargs):
+    initorig(self,*args,**kargs)
+    sizer = self.GetSizer().GetItem(1).GetSizer().GetItem(0).GetSizer()
+    CleanSizer(sizer)
+    self.main_buttons = map(
+        lambda btname: MakeButtonFunc(self, sizer, btname), PwrButtons)
+    sizer = self.GetSizer().GetItem(1).GetSizer().GetItem(1).GetSizer()
+    CleanSizer(sizer)
+    self.main_buttons = map(
+        lambda btname: MakeButtonFunc(self, sizer, btname), ActionButtons)
+    self.axis_buttons = map(
+        lambda axis:( MakeButtonFunc(self, sizer, axis+"axisMinus"), 
+                        MakeButtonFunc(self, sizer, axis+"axisPlus")),
+        AxisList)
+
+    
+    # self.timer = wx.Timer(self, -1)
+    # self.Bind(wx.EVT_TIMER, self.UpdatePositions, self.timer)
+    # self.ShowFullScreen(True,wx.FULLSCREEN_ALL)
+    # wx.CallAfter(self.timer.Start,200)
+    
+Class_wxglade_hmi.__init__ = Init
+
+def SetPLCTestBtnGlobalVar(self, evt):
+    setattr(PLCGlobals, "DrawTestBtn", evt.GetEventObject().GetValue())
+
+def SetPLCTestBtn2GlobalVar(self, evt):
+    setattr(PLCGlobals, "DrawTestBtn2", evt.GetEventObject().GetValue())
+
+]]></xhtml:p>
+  </globals>
+  <init>
+    <xhtml:p><![CDATA[
+]]></xhtml:p>
+  </init>
+  <cleanup>
+    <xhtml:p><![CDATA[
+]]></xhtml:p>
+  </cleanup>
+  <start>
+    <xhtml:p><![CDATA[
+]]></xhtml:p>
+  </start>
+  <stop>
+    <xhtml:p><![CDATA[
+]]></xhtml:p>
+  </stop>
+</PyFile>
--- a/util/BitmapLibrary.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/util/BitmapLibrary.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,49 +22,54 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+
+from __future__ import absolute_import
 import os
 
 import wx
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                            Library Structures
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 BitmapLibrary = {}
 BitmapFolders = []
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                             Library Helpers
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 def AddBitmapFolder(path):
     if os.path.exists(path) and os.path.isdir(path) and path not in BitmapFolders:
         BitmapFolders.append(path)
 
+
 def SearchBitmap(bmp_name):
     for folder in BitmapFolders:
         bmp_path = os.path.join(folder, bmp_name + ".png")
         if os.path.isfile(bmp_path):
             return wx.Bitmap(bmp_path)
     return None
-    
+
+
 def GetBitmap(bmp_name1, bmp_name2=None, size=None):
     bmp = BitmapLibrary.get((bmp_name1, bmp_name2, size))
     if bmp is not None:
         return bmp
-    
+
     if bmp_name2 is None:
         bmp = SearchBitmap(bmp_name1)
     else:
         # Bitmap with two icon
         bmp1 = SearchBitmap(bmp_name1)
         bmp2 = SearchBitmap(bmp_name2)
-        
+
         if bmp1 is not None and bmp2 is not None:
             # Calculate bitmap size
             width = bmp1.GetWidth() + bmp2.GetWidth() - 1
             height = max(bmp1.GetHeight(), bmp2.GetHeight())
-            
+
             # Create bitmap with both icons
             bmp = wx.EmptyBitmap(width, height)
             dc = wx.MemoryDC()
@@ -73,13 +78,13 @@
             dc.DrawBitmap(bmp1, 0, 0)
             dc.DrawBitmap(bmp2, bmp1.GetWidth() - 1, 0)
             dc.Destroy()
-        
+
         elif bmp1 is not None:
             bmp = bmp1
         elif bmp2 is not None:
             bmp = bmp2
-    
+
     if bmp is not None:
         BitmapLibrary[(bmp_name1, bmp_name2, size)] = bmp
-        
+
     return bmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util/ExceptionHandler.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,161 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2007:      Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2016-2017: Andrey Skvortsov <andrej.skvortzov@gmail.com>
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+
+from __future__ import absolute_import
+import os
+import sys
+import time
+import tempfile
+import platform
+import traceback
+import threading
+import wx
+
+Max_Traceback_List_Size = 20
+
+
+def Display_Exception_Dialog(e_type, e_value, e_tb, bug_report_path, exit):
+    trcbck_lst = []
+    for i, line in enumerate(traceback.extract_tb(e_tb)):
+        trcbck = " " + str(i+1) + ". "
+        if line[0].find(os.getcwd()) == -1:
+            trcbck += "file : " + str(line[0]) + ",   "
+        else:
+            trcbck += "file : " + str(line[0][len(os.getcwd()):]) + ",   "
+        trcbck += "line : " + str(line[1]) + ",   " + "function : " + str(line[2])
+        trcbck_lst.append(trcbck)
+
+    # Allow clicking....
+    cap = wx.Window_GetCapture()
+    if cap:
+        cap.ReleaseMouse()
+
+    dlg = wx.SingleChoiceDialog(
+        None,
+        _("""
+An unhandled exception (bug) occured. Bug report saved at :
+(%s)
+
+Please be kind enough to send this file to:
+beremiz-devel@lists.sourceforge.net
+
+You should now restart program.
+
+Traceback:
+""") % bug_report_path +
+        repr(e_type) + " : " + repr(e_value),
+        _("Error"),
+        trcbck_lst)
+    try:
+        res = (dlg.ShowModal() == wx.ID_OK)
+    finally:
+        dlg.Destroy()
+
+    if exit:
+        sys.exit()  # wx.Exit()
+
+    return res
+
+
+def get_last_traceback(tb):
+    while tb.tb_next:
+        tb = tb.tb_next
+    return tb
+
+
+def format_namespace(d, indent='    '):
+    return '\n'.join(['%s%s: %s' % (indent, k, repr(v)[:10000]) for k, v in d.iteritems()])
+
+
+ignored_exceptions = []  # a problem with a line in a module is only reported once per session
+
+
+def AddExceptHook(app_version='[No version]'):
+
+    def save_bug_report(e_type, e_value, e_traceback, bug_report_path, date):
+        info = {
+            'app-title': wx.GetApp().GetAppName(),
+            'app-version': app_version,
+            'wx-version': wx.VERSION_STRING,
+            'wx-platform': wx.Platform,
+            'python-version': platform.python_version(),
+            'platform': platform.platform(),
+            'e-type': e_type,
+            'e-value': e_value,
+            'date': date,
+            'cwd': os.getcwd(),
+        }
+        if e_traceback:
+            info['traceback'] = ''.join(traceback.format_tb(e_traceback)) + '%s: %s' % (e_type, e_value)
+            last_tb = get_last_traceback(e_traceback)
+            exception_locals = last_tb.tb_frame.f_locals  # the locals at the level of the stack trace where the exception actually occurred
+            info['locals'] = format_namespace(exception_locals)
+            if 'self' in exception_locals:
+                try:
+                    info['self'] = format_namespace(exception_locals['self'].__dict__)
+                except Exception:
+                    pass
+        path = os.path.dirname(bug_report_path)
+        if not os.path.exists(path):
+            os.mkdir(path)
+        output = open(bug_report_path, 'w')
+        lst = info.keys()
+        lst.sort()
+        for a in lst:
+            output.write(a + ":\n" + str(info[a]) + "\n\n")
+        output.close()
+
+    def handle_exception(e_type, e_value, e_traceback, exit=False):
+        traceback.print_exception(e_type, e_value, e_traceback)  # this is very helpful when there's an exception in the rest of this func
+        last_tb = get_last_traceback(e_traceback)
+        ex = (last_tb.tb_frame.f_code.co_filename, last_tb.tb_frame.f_lineno)
+        if ex not in ignored_exceptions:
+            ignored_exceptions.append(ex)
+            date = time.ctime()
+            path = tempfile.gettempdir()+os.sep+wx.GetApp().GetAppName()
+            bug_report_path = path + os.sep + "bug_report_" + time.strftime("%Y_%m_%d__%H-%M-%S") + ".txt"
+            save_bug_report(e_type, e_value, e_traceback, bug_report_path, date)
+            wx.CallAfter(Display_Exception_Dialog, e_type, e_value, e_traceback, bug_report_path, exit)
+    # sys.excepthook = lambda *args: wx.CallAfter(handle_exception, *args)
+    sys.excepthook = handle_exception
+
+    init_old = threading.Thread.__init__
+
+    def init(self, *args, **kwargs):
+        init_old(self, *args, **kwargs)
+        run_old = self.run
+
+        def run_with_except_hook(*args, **kw):
+            try:
+                run_old(*args, **kw)
+            except (KeyboardInterrupt, SystemExit):
+                raise
+            except Exception:
+                sys.excepthook(*sys.exc_info())
+        self.run = run_with_except_hook
+    threading.Thread.__init__ = init
+
+    return handle_exception
--- a/util/MiniTextControler.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/util/MiniTextControler.py	Mon Jan 07 13:50:39 2019 +0100
@@ -26,51 +26,54 @@
 Minimal tab controller for a simple text editor
 """
 
+
+from __future__ import absolute_import
 import os
 
-class MiniTextControler:
-    
+
+class MiniTextControler(object):
+
     def __init__(self, filepath, controller):
         self.FilePath = filepath
         self.BaseController = controller
-    
+
     def __del__(self):
         self.BaseController = None
-    
+
     def CTNFullName(self):
         return ""
-    
+
     def SetEditedElementText(self, tagname, text):
         file = open(self.FilePath, "w")
         file.write(text)
         file.close()
-        
-    def GetEditedElementText(self, tagname, debug = False):
+
+    def GetEditedElementText(self, tagname, debug=False):
         if os.path.isfile(self.FilePath):
             file = open(self.FilePath, "r")
             text = file.read()
             file.close()
             return text
         return ""
-    
-    def GetEditedElementInterfaceVars(self, tagname, tree=False, debug = False):
+
+    def GetEditedElementInterfaceVars(self, tagname, tree=False, debug=False):
         return []
-    
-    def GetEditedElementType(self, tagname, debug = False):
+
+    def GetEditedElementType(self, tagname, debug=False):
         return "program"
-    
-    def GetBlockType(self, type, inputs = None, debug = False):
+
+    def GetBlockType(self, type, inputs=None, debug=False):
         return self.BaseController.GetBlockType(type, inputs, debug)
-    
-    def GetBlockTypes(self, tagname = "", debug = False):
+
+    def GetBlockTypes(self, tagname="", debug=False):
         return self.BaseController.GetBlockTypes(tagname, debug)
-    
-    def GetDataTypes(self, tagname = "", basetypes = True, only_locatables = False, debug = False):
+
+    def GetDataTypes(self, tagname="", basetypes=True, only_locatables=False, debug=False):
         return self.BaseController.GetDataTypes(tagname, basetypes, only_locatables, debug)
-    
-    def GetEnumeratedDataValues(self, debug = False):
+
+    def GetEnumeratedDataValues(self, debug=False):
         return self.BaseController.GetEnumeratedDataValues(debug)
-    
+
     def StartBuffering(self):
         pass
 
@@ -79,4 +82,3 @@
 
     def BufferProject(self):
         pass
-
--- a/util/ProcessLogger.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/util/ProcessLogger.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,13 +22,14 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import time
-import wx
-import subprocess, ctypes
+
+from __future__ import absolute_import
+import os
+import sys
+import subprocess
+import ctypes
 from threading import Timer, Lock, Thread, Semaphore
-import os, sys
-if os.name == 'posix':
-    from signal import SIGTERM, SIGKILL
+import signal
 
 
 class outputThread(Thread):
@@ -48,36 +49,39 @@
     def run(self):
         outchunk = None
         self.retval = None
-        while self.retval is None and not self.killed :
+        while self.retval is None and not self.killed:
             if self.endcallback:
                 self.retval = self.Proc.poll()
             else:
                 self.retval = self.Proc.returncode
-                
+
             outchunk = self.fd.readline()
-            if self.callback : self.callback(outchunk)
-        while outchunk != '' and not self.killed :
+            if self.callback:
+                self.callback(outchunk)
+        while outchunk != '' and not self.killed:
             outchunk = self.fd.readline()
-            if self.callback : self.callback(outchunk)
+            if self.callback:
+                self.callback(outchunk)
         if self.endcallback:
             try:
                 err = self.Proc.wait()
-            except:
+            except Exception:
                 err = self.retval
             self.finished = True
             self.endcallback(self.Proc.pid, err)
 
-class ProcessLogger:
-    def __init__(self, logger, Command, finish_callback = None,
-                 no_stdout = False, no_stderr = False, no_gui = True,
-                 timeout = None, outlimit = None, errlimit = None,
-                 endlog = None, keyword = None, kill_it = False, cwd = None,
-                 encoding = None):
+
+class ProcessLogger(object):
+    def __init__(self, logger, Command, finish_callback=None,
+                 no_stdout=False, no_stderr=False, no_gui=True,
+                 timeout=None, outlimit=None, errlimit=None,
+                 endlog=None, keyword=None, kill_it=False, cwd=None,
+                 encoding=None, output_encoding=None):
         self.logger = logger
         if not isinstance(Command, list):
             self.Command_str = Command
             self.Command = []
-            for i,word in enumerate(Command.replace("'",'"').split('"')):
+            for i, word in enumerate(Command.replace("'", '"').split('"')):
                 if i % 2 == 0:
                     word = word.strip()
                     if len(word) > 0:
@@ -89,6 +93,7 @@
             self.Command_str = subprocess.list2cmdline(self.Command)
 
         fsencoding = sys.getfilesystemencoding()
+        self.output_encoding = output_encoding
 
         if encoding is None:
             encoding = fsencoding
@@ -108,55 +113,59 @@
         self.errdata = []
         self.keyword = keyword
         self.kill_it = kill_it
-        self.startsem = Semaphore(0)        
+        self.startsem = Semaphore(0)
         self.finishsem = Semaphore(0)
         self.endlock = Lock()
 
-        popenargs= {
-               "cwd":os.getcwd() if cwd is None else cwd,
-               "stdin":subprocess.PIPE,
-               "stdout":subprocess.PIPE,
-               "stderr":subprocess.PIPE}
-
-        if no_gui == True and wx.Platform == '__WXMSW__':
+        popenargs = {
+            "cwd":    os.getcwd() if cwd is None else cwd,
+            "stdin":  subprocess.PIPE,
+            "stdout": subprocess.PIPE,
+            "stderr": subprocess.PIPE
+        }
+
+        if no_gui and os.name in ("nt", "ce"):
             self.startupinfo = subprocess.STARTUPINFO()
             self.startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
             popenargs["startupinfo"] = self.startupinfo
-        elif wx.Platform == '__WXGTK__':
+        elif os.name == 'posix':
             popenargs["shell"] = False
 
         if timeout:
-            self.timeout = Timer(timeout,self.endlog)
+            self.timeout = Timer(timeout, self.endlog)
             self.timeout.start()
         else:
             self.timeout = None
-            
-        self.Proc = subprocess.Popen( self.Command, **popenargs )
+
+        self.Proc = subprocess.Popen(self.Command, **popenargs)
 
         self.outt = outputThread(
-                      self.Proc,
-                      self.Proc.stdout,
-                      self.output,
-                      self.finish)
+            self.Proc,
+            self.Proc.stdout,
+            self.output,
+            self.finish)
         self.outt.start()
 
         self.errt = outputThread(
-                      self.Proc,
-                      self.Proc.stderr,
-                      self.errors)
+            self.Proc,
+            self.Proc.stderr,
+            self.errors)
         self.errt.start()
         self.startsem.release()
 
-
-    def output(self,v):
+    def output(self, v):
+        if v and self.output_encoding:
+            v = v.decode(self.output_encoding)
         self.outdata.append(v)
         self.outlen += 1
         if not self.no_stdout:
             self.logger.write(v)
-        if (self.keyword and v.find(self.keyword)!=-1) or (self.outlimit and self.outlen > self.outlimit):
+        if (self.keyword and v.find(self.keyword) != -1) or (self.outlimit and self.outlen > self.outlimit):
             self.endlog()
 
-    def errors(self,v):
+    def errors(self, v):
+        if v and self.output_encoding:
+            v = v.decode(self.output_encoding)
         self.errdata.append(v)
         self.errlen += 1
         if not self.no_stderr:
@@ -164,43 +173,44 @@
         if self.errlimit and self.errlen > self.errlimit:
             self.endlog()
 
-    def log_the_end(self,ecode,pid):
+    def log_the_end(self, ecode, pid):
         self.logger.write(self.Command_str + "\n")
-        self.logger.write_warning(_("exited with status {a1} (pid {a2})\n").format(a1 = str(ecode), a2 = str(pid)))
-
-    def finish(self, pid,ecode):
-        # avoid running function before start is finished        
+        self.logger.write_warning(_("exited with status {a1} (pid {a2})\n").format(a1=str(ecode), a2=str(pid)))
+
+    def finish(self, pid, ecode):
+        # avoid running function before start is finished
         self.startsem.acquire()
+        self.startsem.release()
         if self.timeout:
             self.timeout.cancel()
         self.exitcode = ecode
         if self.exitcode != 0:
-            self.log_the_end(ecode,pid)
+            self.log_the_end(ecode, pid)
         if self.finish_callback is not None:
-            self.finish_callback(self,ecode,pid)
+            self.finish_callback(self, ecode, pid)
         self.errt.join()
         self.finishsem.release()
 
-    def kill(self,gently=True):
+    def kill(self, gently=True):
         # avoid running kill before start is finished
         self.startsem.acquire()
         self.startsem.release()
-        
+
         self.outt.killed = True
         self.errt.killed = True
-        if wx.Platform == '__WXMSW__':
+        if os.name in ("nt", "ce"):
             PROCESS_TERMINATE = 1
             handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, self.Proc.pid)
             ctypes.windll.kernel32.TerminateProcess(handle, -1)
             ctypes.windll.kernel32.CloseHandle(handle)
         else:
             if gently:
-                sig=SIGTERM
+                sig = signal.SIGTERM
             else:
-                sig=SIGKILL
+                sig = signal.SIGKILL
             try:
                 os.kill(self.Proc.pid, sig)
-            except:
+            except Exception:
                 pass
         self.outt.join()
         self.errt.join()
@@ -208,11 +218,9 @@
     def endlog(self):
         if self.endlock.acquire(False):
             if not self.outt.finished and self.kill_it:
-               self.kill()
+                self.kill()
             self.finishsem.release()
 
-
     def spin(self):
         self.finishsem.acquire()
         return [self.exitcode, "".join(self.outdata), "".join(self.errdata)]
-
--- a/util/TranslationCatalogs.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/util/TranslationCatalogs.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,15 +22,18 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import os 
 
+from __future__ import absolute_import
+import os
+from six.moves import builtins
 import wx
 
-# Get the default language
-langid = wx.LANGUAGE_DEFAULT
 
-# Define locale for wx
-locale = wx.Locale(langid)
+locale = None
+
+
+builtins.__dict__['_'] = wx.GetTranslation
+
 
 def GetDomain(path):
     for name in os.listdir(path):
@@ -44,9 +47,21 @@
             return basename
     return None
 
+
 def AddCatalog(locale_dir):
     if os.path.exists(locale_dir) and os.path.isdir(locale_dir):
         domain = GetDomain(locale_dir)
         if domain is not None:
+            global locale
+            if locale is None:
+                # Define locale for wx
+                wx.LogGui.EnableLogging(False)
+                locale = wx.Locale(wx.LANGUAGE_DEFAULT)
+                wx.LogGui.EnableLogging(True)
+
             locale.AddCatalogLookupPathPrefix(locale_dir)
             locale.AddCatalog(domain)
+
+
+def NoTranslate(x):
+    return x
--- a/util/Zeroconf.py	Sat Jun 02 11:56:01 2018 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1559 +0,0 @@
-""" Multicast DNS Service Discovery for Python, v0.12
-    Copyright (C) 2003, Paul Scott-Murphy
-
-    This module provides a framework for the use of DNS Service Discovery
-    using IP multicast.  It has been tested against the JRendezvous
-    implementation from <a href="http://strangeberry.com">StrangeBerry</a>,
-    and against the mDNSResponder from Mac OS X 10.3.8.
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-    
-"""
-
-"""0.12 update - allow selection of binding interface
-         typo fix - Thanks A. M. Kuchlingi
-         removed all use of word 'Rendezvous' - this is an API change"""
-
-"""0.11 update - correction to comments for addListener method
-                 support for new record types seen from OS X
-                  - IPv6 address
-                  - hostinfo
-                 ignore unknown DNS record types
-                 fixes to name decoding
-                 works alongside other processes using port 5353 (e.g. on Mac OS X)
-                 tested against Mac OS X 10.3.2's mDNSResponder
-                 corrections to removal of list entries for service browser"""
-
-"""0.10 update - Jonathon Paisley contributed these corrections:
-                 always multicast replies, even when query is unicast
-                 correct a pointer encoding problem
-                 can now write records in any order
-                 traceback shown on failure
-                 better TXT record parsing
-                 server is now separate from name
-                 can cancel a service browser
-
-                 modified some unit tests to accommodate these changes"""
-
-"""0.09 update - remove all records on service unregistration
-                 fix DOS security problem with readName"""
-
-"""0.08 update - changed licensing to LGPL"""
-
-"""0.07 update - faster shutdown on engine
-                 pointer encoding of outgoing names
-                 ServiceBrowser now works
-                 new unit tests"""
-
-"""0.06 update - small improvements with unit tests
-                 added defined exception types
-                 new style objects
-                 fixed hostname/interface problem
-                 fixed socket timeout problem
-                 fixed addServiceListener() typo bug
-                 using select() for socket reads
-                 tested on Debian unstable with Python 2.2.2"""
-
-"""0.05 update - ensure case insensitivty on domain names
-                 support for unicast DNS queries"""
-
-"""0.04 update - added some unit tests
-                 added __ne__ adjuncts where required
-                 ensure names end in '.local.'
-                 timeout on receiving socket for clean shutdown"""
-
-__author__ = "Paul Scott-Murphy"
-__email__ = "paul at scott dash murphy dot com"
-__version__ = "0.12"
-
-import string
-import time
-import struct
-import socket
-import threading
-import select
-import traceback
-
-__all__ = ["Zeroconf", "ServiceInfo", "ServiceBrowser"]
-
-# hook for threads
-
-globals()['_GLOBAL_DONE'] = 0
-
-# Some timing constants
-
-_UNREGISTER_TIME = 125
-_CHECK_TIME = 175
-_REGISTER_TIME = 225
-_LISTENER_TIME = 200
-_BROWSER_TIME = 500
-
-# Some DNS constants
-    
-_MDNS_ADDR = '224.0.0.251'
-_MDNS_PORT = 5353;
-_DNS_PORT = 53;
-_DNS_TTL = 60 * 60; # one hour default TTL
-
-_MAX_MSG_TYPICAL = 1460 # unused
-_MAX_MSG_ABSOLUTE = 8972
-
-_FLAGS_QR_MASK = 0x8000 # query response mask
-_FLAGS_QR_QUERY = 0x0000 # query
-_FLAGS_QR_RESPONSE = 0x8000 # response
-
-_FLAGS_AA = 0x0400 # Authorative answer
-_FLAGS_TC = 0x0200 # Truncated
-_FLAGS_RD = 0x0100 # Recursion desired
-_FLAGS_RA = 0x8000 # Recursion available
-
-_FLAGS_Z = 0x0040 # Zero
-_FLAGS_AD = 0x0020 # Authentic data
-_FLAGS_CD = 0x0010 # Checking disabled
-
-_CLASS_IN = 1
-_CLASS_CS = 2
-_CLASS_CH = 3
-_CLASS_HS = 4
-_CLASS_NONE = 254
-_CLASS_ANY = 255
-_CLASS_MASK = 0x7FFF
-_CLASS_UNIQUE = 0x8000
-
-_TYPE_A = 1
-_TYPE_NS = 2
-_TYPE_MD = 3
-_TYPE_MF = 4
-_TYPE_CNAME = 5
-_TYPE_SOA = 6
-_TYPE_MB = 7
-_TYPE_MG = 8
-_TYPE_MR = 9
-_TYPE_NULL = 10
-_TYPE_WKS = 11
-_TYPE_PTR = 12
-_TYPE_HINFO = 13
-_TYPE_MINFO = 14
-_TYPE_MX = 15
-_TYPE_TXT = 16
-_TYPE_AAAA = 28
-_TYPE_SRV = 33
-_TYPE_ANY =  255
-
-# Mapping constants to names
-
-_CLASSES = { _CLASS_IN : "in",
-             _CLASS_CS : "cs",
-             _CLASS_CH : "ch",
-             _CLASS_HS : "hs",
-             _CLASS_NONE : "none",
-             _CLASS_ANY : "any" }
-
-_TYPES = { _TYPE_A : "a",
-           _TYPE_NS : "ns",
-           _TYPE_MD : "md",
-           _TYPE_MF : "mf",
-           _TYPE_CNAME : "cname",
-           _TYPE_SOA : "soa",
-           _TYPE_MB : "mb",
-           _TYPE_MG : "mg",
-           _TYPE_MR : "mr",
-           _TYPE_NULL : "null",
-           _TYPE_WKS : "wks",
-           _TYPE_PTR : "ptr",
-           _TYPE_HINFO : "hinfo",
-           _TYPE_MINFO : "minfo",
-           _TYPE_MX : "mx",
-           _TYPE_TXT : "txt",
-           _TYPE_AAAA : "quada",
-           _TYPE_SRV : "srv",
-           _TYPE_ANY : "any" }
-
-# utility functions
-
-def currentTimeMillis():
-    """Current system time in milliseconds"""
-    return time.time() * 1000
-
-# Exceptions
-
-class NonLocalNameException(Exception):
-    pass
-
-class NonUniqueNameException(Exception):
-    pass
-
-class NamePartTooLongException(Exception):
-    pass
-
-class AbstractMethodException(Exception):
-    pass
-
-class BadTypeInNameException(Exception):
-    pass
-
-# implementation classes
-
-class DNSEntry(object):
-    """A DNS entry"""
-    
-    def __init__(self, name, type, clazz):
-        self.key = string.lower(name)
-        self.name = name
-        self.type = type
-        self.clazz = clazz & _CLASS_MASK
-        self.unique = (clazz & _CLASS_UNIQUE) != 0
-
-    def __eq__(self, other):
-        """Equality test on name, type, and class"""
-        if isinstance(other, DNSEntry):
-            return self.name == other.name and self.type == other.type and self.clazz == other.clazz
-        return 0
-
-    def __ne__(self, other):
-        """Non-equality test"""
-        return not self.__eq__(other)
-
-    def getClazz(self, clazz):
-        """Class accessor"""
-        try:
-            return _CLASSES[clazz]
-        except:
-            return "?(%s)" % (clazz)
-
-    def getType(self, type):
-        """Type accessor"""
-        try:
-            return _TYPES[type]
-        except:
-            return "?(%s)" % (type)
-
-    def toString(self, hdr, other):
-        """String representation with additional information"""
-        result = "%s[%s,%s" % (hdr, self.getType(self.type), self.getClazz(self.clazz))
-        if self.unique:
-            result += "-unique,"
-        else:
-            result += ","
-        result += self.name
-        if other is not None:
-            result += ",%s]" % (other)
-        else:
-            result += "]"
-        return result
-
-class DNSQuestion(DNSEntry):
-    """A DNS question entry"""
-    
-    def __init__(self, name, type, clazz):
-        if not name.endswith(".local."):
-            raise NonLocalNameException
-        DNSEntry.__init__(self, name, type, clazz)
-
-    def answeredBy(self, rec):
-        """Returns true if the question is answered by the record"""
-        return self.clazz == rec.clazz and (self.type == rec.type or self.type == _TYPE_ANY) and self.name == rec.name
-
-    def __repr__(self):
-        """String representation"""
-        return DNSEntry.toString(self, "question", None)
-
-
-class DNSRecord(DNSEntry):
-    """A DNS record - like a DNS entry, but has a TTL"""
-    
-    def __init__(self, name, type, clazz, ttl):
-        DNSEntry.__init__(self, name, type, clazz)
-        self.ttl = ttl
-        self.created = currentTimeMillis()
-
-    def __eq__(self, other):
-        """Tests equality as per DNSRecord"""
-        if isinstance(other, DNSRecord):
-            return DNSEntry.__eq__(self, other)
-        return 0
-
-    def suppressedBy(self, msg):
-        """Returns true if any answer in a message can suffice for the
-        information held in this record."""
-        for record in msg.answers:
-            if self.suppressedByAnswer(record):
-                return 1
-        return 0
-
-    def suppressedByAnswer(self, other):
-        """Returns true if another record has same name, type and class,
-        and if its TTL is at least half of this record's."""
-        if self == other and other.ttl > (self.ttl / 2):
-            return 1
-        return 0
-
-    def getExpirationTime(self, percent):
-        """Returns the time at which this record will have expired
-        by a certain percentage."""
-        return self.created + (percent * self.ttl * 10)
-
-    def getRemainingTTL(self, now):
-        """Returns the remaining TTL in seconds."""
-        return max(0, (self.getExpirationTime(100) - now) / 1000)
-
-    def isExpired(self, now):
-        """Returns true if this record has expired."""
-        return self.getExpirationTime(100) <= now
-
-    def isStale(self, now):
-        """Returns true if this record is at least half way expired."""
-        return self.getExpirationTime(50) <= now
-
-    def resetTTL(self, other):
-        """Sets this record's TTL and created time to that of
-        another record."""
-        self.created = other.created
-        self.ttl = other.ttl
-
-    def write(self, out):
-        """Abstract method"""
-        raise AbstractMethodException
-
-    def toString(self, other):
-        """String representation with addtional information"""
-        arg = "%s/%s,%s" % (self.ttl, self.getRemainingTTL(currentTimeMillis()), other)
-        return DNSEntry.toString(self, "record", arg)
-
-class DNSAddress(DNSRecord):
-    """A DNS address record"""
-    
-    def __init__(self, name, type, clazz, ttl, address):
-        DNSRecord.__init__(self, name, type, clazz, ttl)
-        self.address = address
-
-    def write(self, out):
-        """Used in constructing an outgoing packet"""
-        out.writeString(self.address, len(self.address))
-
-    def __eq__(self, other):
-        """Tests equality on address"""
-        if isinstance(other, DNSAddress):
-            return self.address == other.address
-        return 0
-
-    def __repr__(self):
-        """String representation"""
-        try:
-            return socket.inet_ntoa(self.address)
-        except:
-            return self.address
-
-class DNSHinfo(DNSRecord):
-    """A DNS host information record"""
-
-    def __init__(self, name, type, clazz, ttl, cpu, os):
-        DNSRecord.__init__(self, name, type, clazz, ttl)
-        self.cpu = cpu
-        self.os = os
-
-    def write(self, out):
-        """Used in constructing an outgoing packet"""
-        out.writeString(self.cpu, len(self.cpu))
-        out.writeString(self.os, len(self.os))
-
-    def __eq__(self, other):
-        """Tests equality on cpu and os"""
-        if isinstance(other, DNSHinfo):
-            return self.cpu == other.cpu and self.os == other.os
-        return 0
-
-    def __repr__(self):
-        """String representation"""
-        return self.cpu + " " + self.os
-    
-class DNSPointer(DNSRecord):
-    """A DNS pointer record"""
-    
-    def __init__(self, name, type, clazz, ttl, alias):
-        DNSRecord.__init__(self, name, type, clazz, ttl)
-        self.alias = alias
-
-    def write(self, out):
-        """Used in constructing an outgoing packet"""
-        out.writeName(self.alias)
-
-    def __eq__(self, other):
-        """Tests equality on alias"""
-        if isinstance(other, DNSPointer):
-            return self.alias == other.alias
-        return 0
-
-    def __repr__(self):
-        """String representation"""
-        return self.toString(self.alias)
-
-class DNSText(DNSRecord):
-    """A DNS text record"""
-    
-    def __init__(self, name, type, clazz, ttl, text):
-        DNSRecord.__init__(self, name, type, clazz, ttl)
-        self.text = text
-
-    def write(self, out):
-        """Used in constructing an outgoing packet"""
-        out.writeString(self.text, len(self.text))
-
-    def __eq__(self, other):
-        """Tests equality on text"""
-        if isinstance(other, DNSText):
-            return self.text == other.text
-        return 0
-
-    def __repr__(self):
-        """String representation"""
-        if len(self.text) > 10:
-            return self.toString(self.text[:7] + "...")
-        else:
-            return self.toString(self.text)
-
-class DNSService(DNSRecord):
-    """A DNS service record"""
-    
-    def __init__(self, name, type, clazz, ttl, priority, weight, port, server):
-        DNSRecord.__init__(self, name, type, clazz, ttl)
-        self.priority = priority
-        self.weight = weight
-        self.port = port
-        self.server = server
-
-    def write(self, out):
-        """Used in constructing an outgoing packet"""
-        out.writeShort(self.priority)
-        out.writeShort(self.weight)
-        out.writeShort(self.port)
-        out.writeName(self.server)
-
-    def __eq__(self, other):
-        """Tests equality on priority, weight, port and server"""
-        if isinstance(other, DNSService):
-            return self.priority == other.priority and self.weight == other.weight and self.port == other.port and self.server == other.server
-        return 0
-
-    def __repr__(self):
-        """String representation"""
-        return self.toString("%s:%s" % (self.server, self.port))
-
-class DNSIncoming(object):
-    """Object representation of an incoming DNS packet"""
-    
-    def __init__(self, data):
-        """Constructor from string holding bytes of packet"""
-        self.offset = 0
-        self.data = data
-        self.questions = []
-        self.answers = []
-        self.numQuestions = 0
-        self.numAnswers = 0
-        self.numAuthorities = 0
-        self.numAdditionals = 0
-        
-        self.readHeader()
-        self.readQuestions()
-        self.readOthers()
-
-    def readHeader(self):
-        """Reads header portion of packet"""
-        format = '!HHHHHH'
-        length = struct.calcsize(format)
-        info = struct.unpack(format, self.data[self.offset:self.offset+length])
-        self.offset += length
-
-        self.id = info[0]
-        self.flags = info[1]
-        self.numQuestions = info[2]
-        self.numAnswers = info[3]
-        self.numAuthorities = info[4]
-        self.numAdditionals = info[5]
-
-    def readQuestions(self):
-        """Reads questions section of packet"""
-        format = '!HH'
-        length = struct.calcsize(format)
-        for i in range(0, self.numQuestions):
-            name = self.readName()
-            info = struct.unpack(format, self.data[self.offset:self.offset+length])
-            self.offset += length
-            
-            question = DNSQuestion(name, info[0], info[1])
-            self.questions.append(question)
-
-    def readInt(self):
-        """Reads an integer from the packet"""
-        format = '!I'
-        length = struct.calcsize(format)
-        info = struct.unpack(format, self.data[self.offset:self.offset+length])
-        self.offset += length
-        return info[0]
-
-    def readCharacterString(self):
-        """Reads a character string from the packet"""
-        length = ord(self.data[self.offset])
-        self.offset += 1
-        return self.readString(length)
-
-    def readString(self, len):
-        """Reads a string of a given length from the packet"""
-        format = '!' + str(len) + 's'
-        length =  struct.calcsize(format)
-        info = struct.unpack(format, self.data[self.offset:self.offset+length])
-        self.offset += length
-        return info[0]
-
-    def readUnsignedShort(self):
-        """Reads an unsigned short from the packet"""
-        format = '!H'
-        length = struct.calcsize(format)
-        info = struct.unpack(format, self.data[self.offset:self.offset+length])
-        self.offset += length
-        return info[0]
-
-    def readOthers(self):
-        """Reads the answers, authorities and additionals section of the packet"""
-        format = '!HHiH'
-        length = struct.calcsize(format)
-        n = self.numAnswers + self.numAuthorities + self.numAdditionals
-        for i in range(0, n):
-            domain = self.readName()
-            info = struct.unpack(format, self.data[self.offset:self.offset+length])
-            self.offset += length
-
-            rec = None
-            if info[0] == _TYPE_A:
-                rec = DNSAddress(domain, info[0], info[1], info[2], self.readString(4))
-            elif info[0] == _TYPE_CNAME or info[0] == _TYPE_PTR:
-                rec = DNSPointer(domain, info[0], info[1], info[2], self.readName())
-            elif info[0] == _TYPE_TXT:
-                rec = DNSText(domain, info[0], info[1], info[2], self.readString(info[3]))
-            elif info[0] == _TYPE_SRV:
-                rec = DNSService(domain, info[0], info[1], info[2], self.readUnsignedShort(), self.readUnsignedShort(), self.readUnsignedShort(), self.readName())
-            elif info[0] == _TYPE_HINFO:
-                rec = DNSHinfo(domain, info[0], info[1], info[2], self.readCharacterString(), self.readCharacterString())
-            elif info[0] == _TYPE_AAAA:
-                rec = DNSAddress(domain, info[0], info[1], info[2], self.readString(16))
-            else:
-                # Try to ignore types we don't know about
-                # this may mean the rest of the name is
-                # unable to be parsed, and may show errors
-                # so this is left for debugging.  New types
-                # encountered need to be parsed properly.
-                #
-                #print "UNKNOWN TYPE = " + str(info[0])
-                #raise BadTypeInNameException
-                pass
-
-            if rec is not None:
-                self.answers.append(rec)
-                
-    def isQuery(self):
-        """Returns true if this is a query"""
-        return (self.flags & _FLAGS_QR_MASK) == _FLAGS_QR_QUERY
-
-    def isResponse(self):
-        """Returns true if this is a response"""
-        return (self.flags & _FLAGS_QR_MASK) == _FLAGS_QR_RESPONSE
-
-    def readUTF(self, offset, len):
-        """Reads a UTF-8 string of a given length from the packet"""
-        result = self.data[offset:offset+len].decode('utf-8')
-        return result
-        
-    def readName(self):
-        """Reads a domain name from the packet"""
-        result = ''
-        off = self.offset
-        next = -1
-        first = off
-
-        while 1:
-            len = ord(self.data[off])
-            off += 1
-            if len == 0:
-                break
-            t = len & 0xC0
-            if t == 0x00:
-                result = ''.join((result, self.readUTF(off, len) + '.'))
-                off += len
-            elif t == 0xC0:
-                if next < 0:
-                    next = off + 1
-                off = ((len & 0x3F) << 8) | ord(self.data[off])
-                if off >= first:
-                    raise _("Bad domain name (circular) at ") + str(off)
-                first = off
-            else:
-                raise _("Bad domain name at ") + str(off)
-
-        if next >= 0:
-            self.offset = next
-        else:
-            self.offset = off
-
-        return result
-    
-        
-class DNSOutgoing(object):
-    """Object representation of an outgoing packet"""
-    
-    def __init__(self, flags, multicast = 1):
-        self.finished = 0
-        self.id = 0
-        self.multicast = multicast
-        self.flags = flags
-        self.names = {}
-        self.data = []
-        self.size = 12
-        
-        self.questions = []
-        self.answers = []
-        self.authorities = []
-        self.additionals = []
-
-    def addQuestion(self, record):
-        """Adds a question"""
-        self.questions.append(record)
-
-    def addAnswer(self, inp, record):
-        """Adds an answer"""
-        if not record.suppressedBy(inp):
-            self.addAnswerAtTime(record, 0)
-
-    def addAnswerAtTime(self, record, now):
-        """Adds an answer if if does not expire by a certain time"""
-        if record is not None:
-            if now == 0 or not record.isExpired(now):
-                self.answers.append((record, now))
-
-    def addAuthorativeAnswer(self, record):
-        """Adds an authoritative answer"""
-        self.authorities.append(record)
-
-    def addAdditionalAnswer(self, record):
-        """Adds an additional answer"""
-        self.additionals.append(record)
-
-    def writeByte(self, value):
-        """Writes a single byte to the packet"""
-        format = '!c'
-        self.data.append(struct.pack(format, chr(value)))
-        self.size += 1
-
-    def insertShort(self, index, value):
-        """Inserts an unsigned short in a certain position in the packet"""
-        format = '!H'
-        self.data.insert(index, struct.pack(format, value))
-        self.size += 2
-        
-    def writeShort(self, value):
-        """Writes an unsigned short to the packet"""
-        format = '!H'
-        self.data.append(struct.pack(format, value))
-        self.size += 2
-
-    def writeInt(self, value):
-        """Writes an unsigned integer to the packet"""
-        format = '!I'
-        self.data.append(struct.pack(format, int(value)))
-        self.size += 4
-
-    def writeString(self, value, length):
-        """Writes a string to the packet"""
-        format = '!' + str(length) + 's'
-        self.data.append(struct.pack(format, value))
-        self.size += length
-
-    def writeUTF(self, s):
-        """Writes a UTF-8 string of a given length to the packet"""
-        utfstr = s.encode('utf-8')
-        length = len(utfstr)
-        if length > 64:
-            raise NamePartTooLongException
-        self.writeByte(length)
-        self.writeString(utfstr, length)
-
-    def writeName(self, name):
-        """Writes a domain name to the packet"""
-
-        try:
-            # Find existing instance of this name in packet
-            #
-            index = self.names[name]
-        except KeyError:
-            # No record of this name already, so write it
-            # out as normal, recording the location of the name
-            # for future pointers to it.
-            #
-            self.names[name] = self.size
-            parts = name.split('.')
-            if parts[-1] == '':
-                parts = parts[:-1]
-            for part in parts:
-                self.writeUTF(part)
-            self.writeByte(0)
-            return
-
-        # An index was found, so write a pointer to it
-        #
-        self.writeByte((index >> 8) | 0xC0)
-        self.writeByte(index)
-
-    def writeQuestion(self, question):
-        """Writes a question to the packet"""
-        self.writeName(question.name)
-        self.writeShort(question.type)
-        self.writeShort(question.clazz)
-
-    def writeRecord(self, record, now):
-        """Writes a record (answer, authoritative answer, additional) to
-        the packet"""
-        self.writeName(record.name)
-        self.writeShort(record.type)
-        if record.unique and self.multicast:
-            self.writeShort(record.clazz | _CLASS_UNIQUE)
-        else:
-            self.writeShort(record.clazz)
-        if now == 0:
-            self.writeInt(record.ttl)
-        else:
-            self.writeInt(record.getRemainingTTL(now))
-        index = len(self.data)
-        # Adjust size for the short we will write before this record
-        #
-        self.size += 2
-        record.write(self)
-        self.size -= 2
-        
-        length = len(''.join(self.data[index:]))
-        self.insertShort(index, length) # Here is the short we adjusted for
-
-    def packet(self):
-        """Returns a string containing the packet's bytes
-
-        No further parts should be added to the packet once this
-        is done."""
-        if not self.finished:
-            self.finished = 1
-            for question in self.questions:
-                self.writeQuestion(question)
-            for answer, time in self.answers:
-                self.writeRecord(answer, time)
-            for authority in self.authorities:
-                self.writeRecord(authority, 0)
-            for additional in self.additionals:
-                self.writeRecord(additional, 0)
-        
-            self.insertShort(0, len(self.additionals))
-            self.insertShort(0, len(self.authorities))
-            self.insertShort(0, len(self.answers))
-            self.insertShort(0, len(self.questions))
-            self.insertShort(0, self.flags)
-            if self.multicast:
-                self.insertShort(0, 0)
-            else:
-                self.insertShort(0, self.id)
-        return ''.join(self.data)
-
-
-class DNSCache(object):
-    """A cache of DNS entries"""
-    
-    def __init__(self):
-        self.cache = {}
-
-    def add(self, entry):
-        """Adds an entry"""
-        try:
-            list = self.cache[entry.key]
-        except:
-            list = self.cache[entry.key] = []
-        list.append(entry)
-
-    def remove(self, entry):
-        """Removes an entry"""
-        try:
-            list = self.cache[entry.key]
-            list.remove(entry)
-        except:
-            pass
-
-    def get(self, entry):
-        """Gets an entry by key.  Will return None if there is no
-        matching entry."""
-        try:
-            list = self.cache[entry.key]
-            return list[list.index(entry)]
-        except:
-            return None
-
-    def getByDetails(self, name, type, clazz):
-        """Gets an entry by details.  Will return None if there is
-        no matching entry."""
-        entry = DNSEntry(name, type, clazz)
-        return self.get(entry)
-
-    def entriesWithName(self, name):
-        """Returns a list of entries whose key matches the name."""
-        try:
-            return self.cache[name]
-        except:
-            return []
-
-    def entries(self):
-        """Returns a list of all entries"""
-        def add(x, y): return x+y
-        try:
-            return reduce(add, self.cache.values())
-        except:
-            return []
-
-
-class Engine(threading.Thread):
-    """An engine wraps read access to sockets, allowing objects that
-    need to receive data from sockets to be called back when the
-    sockets are ready.
-
-    A reader needs a handle_read() method, which is called when the socket
-    it is interested in is ready for reading.
-
-    Writers are not implemented here, because we only send short
-    packets.
-    """
-
-    def __init__(self, zeroconf):
-        threading.Thread.__init__(self)
-        self.zeroconf = zeroconf
-        self.readers = {} # maps socket to reader
-        self.timeout = 5
-        self.condition = threading.Condition()
-        self.start()
-
-    def run(self):
-        while not globals()['_GLOBAL_DONE']:
-            rs = self.getReaders()
-            if len(rs) == 0:
-                # No sockets to manage, but we wait for the timeout
-                # or addition of a socket
-                #
-                self.condition.acquire()
-                self.condition.wait(self.timeout)
-                self.condition.release()
-            else:
-                try:
-                    rr, wr, er = select.select(rs, [], [], self.timeout)
-                    for socket in rr:
-                        try:
-                            self.readers[socket].handle_read()
-                        except:
-                            # Ignore errors that occur on shutdown
-                            pass
-                except:
-                    pass
-
-    def getReaders(self):
-        result = []
-        self.condition.acquire()
-        result = self.readers.keys()
-        self.condition.release()
-        return result
-    
-    def addReader(self, reader, socket):
-        self.condition.acquire()
-        self.readers[socket] = reader
-        self.condition.notify()
-        self.condition.release()
-
-    def delReader(self, socket):
-        self.condition.acquire()
-        del(self.readers[socket])
-        self.condition.notify()
-        self.condition.release()
-
-    def notify(self):
-        self.condition.acquire()
-        self.condition.notify()
-        self.condition.release()
-
-class Listener(object):
-    """A Listener is used by this module to listen on the multicast
-    group to which DNS messages are sent, allowing the implementation
-    to cache information as it arrives.
-
-    It requires registration with an Engine object in order to have
-    the read() method called when a socket is availble for reading."""
-    
-    def __init__(self, zeroconf):
-        self.zeroconf = zeroconf
-        self.zeroconf.engine.addReader(self, self.zeroconf.socket)
-
-    def handle_read(self):
-        data, (addr, port) = self.zeroconf.socket.recvfrom(_MAX_MSG_ABSOLUTE)
-        self.data = data
-        msg = DNSIncoming(data)
-        if msg.isQuery():
-            # Always multicast responses
-            #
-            if port == _MDNS_PORT:
-                self.zeroconf.handleQuery(msg, _MDNS_ADDR, _MDNS_PORT)
-            # If it's not a multicast query, reply via unicast
-            # and multicast
-            #
-            elif port == _DNS_PORT:
-                self.zeroconf.handleQuery(msg, addr, port)
-                self.zeroconf.handleQuery(msg, _MDNS_ADDR, _MDNS_PORT)
-        else:
-            self.zeroconf.handleResponse(msg)
-
-
-class Reaper(threading.Thread):
-    """A Reaper is used by this module to remove cache entries that
-    have expired."""
-    
-    def __init__(self, zeroconf):
-        threading.Thread.__init__(self)
-        self.zeroconf = zeroconf
-        self.start()
-
-    def run(self):
-        while 1:
-            self.zeroconf.wait(10 * 1000)
-            if globals()['_GLOBAL_DONE']:
-                return
-            now = currentTimeMillis()
-            for record in self.zeroconf.cache.entries():
-                if record.isExpired(now):
-                    self.zeroconf.updateRecord(now, record)
-                    self.zeroconf.cache.remove(record)
-
-
-class ServiceBrowser(threading.Thread):
-    """Used to browse for a service of a specific type.
-
-    The listener object will have its addService() and
-    removeService() methods called when this browser
-    discovers changes in the services availability."""
-    
-    def __init__(self, zeroconf, type, listener):
-        """Creates a browser for a specific type"""
-        threading.Thread.__init__(self)
-        self.zeroconf = zeroconf
-        self.type = type
-        self.listener = listener
-        self.services = {}
-        self.nextTime = currentTimeMillis()
-        self.delay = _BROWSER_TIME
-        self.list = []
-        
-        self.done = 0
-
-        self.zeroconf.addListener(self, DNSQuestion(self.type, _TYPE_PTR, _CLASS_IN))
-        self.start()
-
-    def updateRecord(self, zeroconf, now, record):
-        """Callback invoked by Zeroconf when new information arrives.
-
-        Updates information required by browser in the Zeroconf cache."""
-        if record.type == _TYPE_PTR and record.name == self.type:
-            expired = record.isExpired(now)
-            try:
-                oldrecord = self.services[record.alias.lower()]
-                if not expired:
-                    oldrecord.resetTTL(record)
-                else:
-                    del(self.services[record.alias.lower()])
-                    callback = lambda x: self.listener.removeService(x, self.type, record.alias)
-                    self.list.append(callback)
-                    return
-            except:
-                if not expired:
-                    self.services[record.alias.lower()] = record
-                    callback = lambda x: self.listener.addService(x, self.type, record.alias)
-                    self.list.append(callback)
-
-            expires = record.getExpirationTime(75)
-            if expires < self.nextTime:
-                self.nextTime = expires
-
-    def cancel(self):
-        self.done = 1
-        self.zeroconf.notifyAll()
-
-    def run(self):
-        while 1:
-            event = None
-            now = currentTimeMillis()
-            if len(self.list) == 0 and self.nextTime > now:
-                self.zeroconf.wait(self.nextTime - now)
-            if globals()['_GLOBAL_DONE'] or self.done:
-                return
-            now = currentTimeMillis()
-
-            if self.nextTime <= now:
-                out = DNSOutgoing(_FLAGS_QR_QUERY)
-                out.addQuestion(DNSQuestion(self.type, _TYPE_PTR, _CLASS_IN))
-                for record in self.services.values():
-                    if not record.isExpired(now):
-                        out.addAnswerAtTime(record, now)
-                self.zeroconf.send(out)
-                self.nextTime = now + self.delay
-                self.delay = min(20 * 1000, self.delay * 2)
-
-            if len(self.list) > 0:
-                event = self.list.pop(0)
-
-            if event is not None:
-                event(self.zeroconf)
-                
-
-class ServiceInfo(object):
-    """Service information"""
-    
-    def __init__(self, type, name, address=None, port=None, weight=0, priority=0, properties=None, server=None):
-        """Create a service description.
-
-        type: fully qualified service type name
-        name: fully qualified service name
-        address: IP address as unsigned short, network byte order
-        port: port that the service runs on
-        weight: weight of the service
-        priority: priority of the service
-        properties: dictionary of properties (or a string holding the bytes for the text field)
-        server: fully qualified name for service host (defaults to name)"""
-
-        if not name.endswith(type):
-            raise BadTypeInNameException
-        self.type = type
-        self.name = name
-        self.address = address
-        self.port = port
-        self.weight = weight
-        self.priority = priority
-        if server:
-            self.server = server
-        else:
-            self.server = name
-        self.setProperties(properties)
-
-    def setProperties(self, properties):
-        """Sets properties and text of this info from a dictionary"""
-        if isinstance(properties, dict):
-            self.properties = properties
-            list = []
-            result = ''
-            for key in properties:
-                value = properties[key]
-                if value is None:
-                    suffix = ''.encode('utf-8')
-                elif isinstance(value, str):
-                    suffix = value.encode('utf-8')
-                elif isinstance(value, int):
-                    if value:
-                        suffix = 'true'
-                    else:
-                        suffix = 'false'
-                else:
-                    suffix = ''.encode('utf-8')
-                list.append('='.join((key, suffix)))
-            for item in list:
-                result = ''.join((result, struct.pack('!c', chr(len(item))), item))
-            self.text = result
-        else:
-            self.text = properties
-
-    def setText(self, text):
-        """Sets properties and text given a text field"""
-        self.text = text
-        try:
-            result = {}
-            end = len(text)
-            index = 0
-            strs = []
-            while index < end:
-                length = ord(text[index])
-                index += 1
-                strs.append(text[index:index+length])
-                index += length
-            
-            for s in strs:
-                eindex = s.find('=')
-                if eindex == -1:
-                    # No equals sign at all
-                    key = s
-                    value = 0
-                else:
-                    key = s[:eindex]
-                    value = s[eindex+1:]
-                    if value == 'true':
-                        value = 1
-                    elif value == 'false' or not value:
-                        value = 0
-
-                # Only update non-existent properties
-                if key and result.get(key) == None:
-                    result[key] = value
-
-            self.properties = result
-        except:
-            traceback.print_exc()
-            self.properties = None
-            
-    def getType(self):
-        """Type accessor"""
-        return self.type
-
-    def getName(self):
-        """Name accessor"""
-        if self.type is not None and self.name.endswith("." + self.type):
-            return self.name[:len(self.name) - len(self.type) - 1]
-        return self.name
-
-    def getAddress(self):
-        """Address accessor"""
-        return self.address
-
-    def getPort(self):
-        """Port accessor"""
-        return self.port
-
-    def getPriority(self):
-        """Pirority accessor"""
-        return self.priority
-
-    def getWeight(self):
-        """Weight accessor"""
-        return self.weight
-
-    def getProperties(self):
-        """Properties accessor"""
-        return self.properties
-
-    def getText(self):
-        """Text accessor"""
-        return self.text
-
-    def getServer(self):
-        """Server accessor"""
-        return self.server
-
-    def updateRecord(self, zeroconf, now, record):
-        """Updates service information from a DNS record"""
-        if record is not None and not record.isExpired(now):
-            if record.type == _TYPE_A:
-                if record.name == self.server:
-                    self.address = record.address
-            elif record.type == _TYPE_SRV:
-                if record.name == self.name:
-                    self.server = record.server
-                    self.port = record.port
-                    self.weight = record.weight
-                    self.priority = record.priority
-                    self.updateRecord(zeroconf, now, zeroconf.cache.getByDetails(self.server, _TYPE_A, _CLASS_IN))
-            elif record.type == _TYPE_TXT:
-                if record.name == self.name:
-                    self.setText(record.text)
-
-    def request(self, zeroconf, timeout):
-        """Returns true if the service could be discovered on the
-        network, and updates this object with details discovered.
-        """
-        now = currentTimeMillis()
-        delay = _LISTENER_TIME
-        next = now + delay
-        last = now + timeout
-        result = 0
-        try:
-            zeroconf.addListener(self, DNSQuestion(self.name, _TYPE_ANY, _CLASS_IN))
-            while self.server is None or self.address is None or self.text is None:
-                if last <= now:
-                    return 0
-                if next <= now:
-                    out = DNSOutgoing(_FLAGS_QR_QUERY)
-                    out.addQuestion(DNSQuestion(self.name, _TYPE_SRV, _CLASS_IN))
-                    out.addAnswerAtTime(zeroconf.cache.getByDetails(self.name, _TYPE_SRV, _CLASS_IN), now)
-                    out.addQuestion(DNSQuestion(self.name, _TYPE_TXT, _CLASS_IN))
-                    out.addAnswerAtTime(zeroconf.cache.getByDetails(self.name, _TYPE_TXT, _CLASS_IN), now)
-                    if self.server is not None:
-                        out.addQuestion(DNSQuestion(self.server, _TYPE_A, _CLASS_IN))
-                        out.addAnswerAtTime(zeroconf.cache.getByDetails(self.server, _TYPE_A, _CLASS_IN), now)
-                    zeroconf.send(out)
-                    next = now + delay
-                    delay = delay * 2
-
-                zeroconf.wait(min(next, last) - now)
-                now = currentTimeMillis()
-            result = 1
-        finally:
-            zeroconf.removeListener(self)
-            
-        return result
-
-    def __eq__(self, other):
-        """Tests equality of service name"""
-        if isinstance(other, ServiceInfo):
-            return other.name == self.name
-        return 0
-
-    def __ne__(self, other):
-        """Non-equality test"""
-        return not self.__eq__(other)
-
-    def __repr__(self):
-        """String representation"""
-        result = "service[%s,%s:%s," % (self.name, socket.inet_ntoa(self.getAddress()), self.port)
-        if self.text is None:
-            result += "None"
-        else:
-            if len(self.text) < 20:
-                result += self.text
-            else:
-                result += self.text[:17] + "..."
-        result += "]"
-        return result
-                
-
-class Zeroconf(object):
-    """Implementation of Zeroconf Multicast DNS Service Discovery
-
-    Supports registration, unregistration, queries and browsing.
-    """
-    def __init__(self, bindaddress=None):
-        """Creates an instance of the Zeroconf class, establishing
-        multicast communications, listening and reaping threads."""
-        globals()['_GLOBAL_DONE'] = 0
-        self.intf = bindaddress
-        self.group = ('', _MDNS_PORT)
-        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-        try:
-            self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-            self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
-        except:
-            # SO_REUSEADDR should be equivalent to SO_REUSEPORT for
-            # multicast UDP sockets (p 731, "TCP/IP Illustrated,
-            # Volume 2"), but some BSD-derived systems require
-            # SO_REUSEPORT to be specified explicity.  Also, not all
-            # versions of Python have SO_REUSEPORT available.  So
-            # if you're on a BSD-based system, and haven't upgraded
-            # to Python 2.3 yet, you may find this library doesn't
-            # work as expected.
-            #
-            pass
-        self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 255)
-        self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
-        try:
-            self.socket.bind(self.group)
-        except:
-            # Some versions of linux raise an exception even though
-            # the SO_REUSE* options have been set, so ignore it
-            #
-            pass
-
-        if self.intf is not None:
-            self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(self.intf) + socket.inet_aton('0.0.0.0'))
-        self.socket.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(_MDNS_ADDR) + socket.inet_aton('0.0.0.0'))
-
-        self.listeners = []
-        self.browsers = []
-        self.services = {}
-
-        self.cache = DNSCache()
-
-        self.condition = threading.Condition()
-        
-        self.engine = Engine(self)
-        self.listener = Listener(self)
-        self.reaper = Reaper(self)
-
-    def isLoopback(self):
-        if self.intf is not None:
-            return self.intf.startswith("127.0.0.1")
-        return False
-
-    def isLinklocal(self):
-        if self.intf is not None:
-            return self.intf.startswith("169.254.")
-        return False
-
-    def wait(self, timeout):
-        """Calling thread waits for a given number of milliseconds or
-        until notified."""
-        self.condition.acquire()
-        self.condition.wait(timeout/1000)
-        self.condition.release()
-
-    def notifyAll(self):
-        """Notifies all waiting threads"""
-        self.condition.acquire()
-        self.condition.notifyAll()
-        self.condition.release()
-
-    def getServiceInfo(self, type, name, timeout=3000):
-        """Returns network's service information for a particular
-        name and type, or None if no service matches by the timeout,
-        which defaults to 3 seconds."""
-        info = ServiceInfo(type, name)
-        if info.request(self, timeout):
-            return info
-        return None
-
-    def addServiceListener(self, type, listener):
-        """Adds a listener for a particular service type.  This object
-        will then have its updateRecord method called when information
-        arrives for that type."""
-        self.removeServiceListener(listener)
-        self.browsers.append(ServiceBrowser(self, type, listener))
-
-    def removeServiceListener(self, listener):
-        """Removes a listener from the set that is currently listening."""
-        for browser in self.browsers:
-            if browser.listener == listener:
-                browser.cancel()
-                del(browser)
-
-    def registerService(self, info, ttl=_DNS_TTL):
-        """Registers service information to the network with a default TTL
-        of 60 seconds.  Zeroconf will then respond to requests for
-        information for that service.  The name of the service may be
-        changed if needed to make it unique on the network."""
-        self.checkService(info)
-        self.services[info.name.lower()] = info
-        now = currentTimeMillis()
-        nextTime = now
-        i = 0
-        while i < 3:
-            if now < nextTime:
-                self.wait(nextTime - now)
-                now = currentTimeMillis()
-                continue
-            out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
-            out.addAnswerAtTime(DNSPointer(info.type, _TYPE_PTR, _CLASS_IN, ttl, info.name), 0)
-            out.addAnswerAtTime(DNSService(info.name, _TYPE_SRV, _CLASS_IN, ttl, info.priority, info.weight, info.port, info.server), 0)
-            out.addAnswerAtTime(DNSText(info.name, _TYPE_TXT, _CLASS_IN, ttl, info.text), 0)
-            if info.address:
-                out.addAnswerAtTime(DNSAddress(info.server, _TYPE_A, _CLASS_IN, ttl, info.address), 0)
-            self.send(out)
-            i += 1
-            nextTime += _REGISTER_TIME
-
-    def unregisterService(self, info):
-        """Unregister a service."""
-        try:
-            del(self.services[info.name.lower()])
-        except:
-            pass
-        now = currentTimeMillis()
-        nextTime = now
-        i = 0
-        while i < 3:
-            if now < nextTime:
-                self.wait(nextTime - now)
-                now = currentTimeMillis()
-                continue
-            out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
-            out.addAnswerAtTime(DNSPointer(info.type, _TYPE_PTR, _CLASS_IN, 0, info.name), 0)
-            out.addAnswerAtTime(DNSService(info.name, _TYPE_SRV, _CLASS_IN, 0, info.priority, info.weight, info.port, info.name), 0)
-            out.addAnswerAtTime(DNSText(info.name, _TYPE_TXT, _CLASS_IN, 0, info.text), 0)
-            if info.address:
-                out.addAnswerAtTime(DNSAddress(info.server, _TYPE_A, _CLASS_IN, 0, info.address), 0)
-            self.send(out)
-            i += 1
-            nextTime += _UNREGISTER_TIME
-
-    def unregisterAllServices(self):
-        """Unregister all registered services."""
-        if len(self.services) > 0:
-            now = currentTimeMillis()
-            nextTime = now
-            i = 0
-            while i < 3:
-                if now < nextTime:
-                    self.wait(nextTime - now)
-                    now = currentTimeMillis()
-                    continue
-                out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
-                for info in self.services.values():
-                    out.addAnswerAtTime(DNSPointer(info.type, _TYPE_PTR, _CLASS_IN, 0, info.name), 0)
-                    out.addAnswerAtTime(DNSService(info.name, _TYPE_SRV, _CLASS_IN, 0, info.priority, info.weight, info.port, info.server), 0)
-                    out.addAnswerAtTime(DNSText(info.name, _TYPE_TXT, _CLASS_IN, 0, info.text), 0)
-                    if info.address:
-                        out.addAnswerAtTime(DNSAddress(info.server, _TYPE_A, _CLASS_IN, 0, info.address), 0)
-                self.send(out)
-                i += 1
-                nextTime += _UNREGISTER_TIME
-
-    def checkService(self, info):
-        """Checks the network for a unique service name, modifying the
-        ServiceInfo passed in if it is not unique."""
-        now = currentTimeMillis()
-        nextTime = now
-        i = 0
-        while i < 3:
-            for record in self.cache.entriesWithName(info.type):
-                if record.type == _TYPE_PTR and not record.isExpired(now) and record.alias == info.name:
-                    if (info.name.find('.') < 0):
-                        info.name = info.name + ".[" + info.address + ":" + info.port + "]." + info.type
-                        self.checkService(info)
-                        return
-                    raise NonUniqueNameException
-            if now < nextTime:
-                self.wait(nextTime - now)
-                now = currentTimeMillis()
-                continue
-            out = DNSOutgoing(_FLAGS_QR_QUERY | _FLAGS_AA)
-            self.debug = out
-            out.addQuestion(DNSQuestion(info.type, _TYPE_PTR, _CLASS_IN))
-            out.addAuthorativeAnswer(DNSPointer(info.type, _TYPE_PTR, _CLASS_IN, _DNS_TTL, info.name))
-            self.send(out)
-            i += 1
-            nextTime += _CHECK_TIME
-
-    def addListener(self, listener, question):
-        """Adds a listener for a given question.  The listener will have
-        its updateRecord method called when information is available to
-        answer the question."""
-        now = currentTimeMillis()
-        self.listeners.append(listener)
-        if question is not None:
-            for record in self.cache.entriesWithName(question.name):
-                if question.answeredBy(record) and not record.isExpired(now):
-                    listener.updateRecord(self, now, record)
-        self.notifyAll()
-
-    def removeListener(self, listener):
-        """Removes a listener."""
-        try:
-            self.listeners.remove(listener)
-            self.notifyAll()
-        except:
-            pass
-
-    def updateRecord(self, now, rec):
-        """Used to notify listeners of new information that has updated
-        a record."""
-        for listener in self.listeners:
-            listener.updateRecord(self, now, rec)
-        self.notifyAll()
-
-    def handleResponse(self, msg):
-        """Deal with incoming response packets.  All answers
-        are held in the cache, and listeners are notified."""
-        now = currentTimeMillis()
-        for record in msg.answers:
-            expired = record.isExpired(now)
-            if record in self.cache.entries():
-                if expired:
-                    self.cache.remove(record)
-                else:
-                    entry = self.cache.get(record)
-                    if entry is not None:
-                        entry.resetTTL(record)
-                        record = entry
-            else:
-                self.cache.add(record)
-                
-            self.updateRecord(now, record)
-
-    def handleQuery(self, msg, addr, port):
-        """Deal with incoming query packets.  Provides a response if
-        possible."""
-        out = None
-
-        # Support unicast client responses
-        #
-        if port != _MDNS_PORT:
-            out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA, 0)
-            for question in msg.questions:
-                out.addQuestion(question)
-        
-        for question in msg.questions:
-            if question.type == _TYPE_PTR:
-                for service in self.services.values():
-                    if question.name == service.type:
-                        if out is None:
-                            out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
-                        out.addAnswer(msg, DNSPointer(service.type, _TYPE_PTR, _CLASS_IN, _DNS_TTL, service.name))
-            else:
-                try:
-                    if out is None:
-                        out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
-                    
-                    # Answer A record queries for any service addresses we know
-                    if question.type == _TYPE_A or question.type == _TYPE_ANY:
-                        for service in self.services.values():
-                            if service.server == question.name.lower():
-                                out.addAnswer(msg, DNSAddress(question.name, _TYPE_A, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.address))
-                    
-                    service = self.services.get(question.name.lower(), None)
-                    if not service: continue
-                    
-                    if question.type == _TYPE_SRV or question.type == _TYPE_ANY:
-                        out.addAnswer(msg, DNSService(question.name, _TYPE_SRV, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.priority, service.weight, service.port, service.server))
-                    if question.type == _TYPE_TXT or question.type == _TYPE_ANY:
-                        out.addAnswer(msg, DNSText(question.name, _TYPE_TXT, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.text))
-                    if question.type == _TYPE_SRV:
-                        out.addAdditionalAnswer(DNSAddress(service.server, _TYPE_A, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.address))
-                except:
-                    traceback.print_exc()
-                
-        if out is not None and out.answers:
-            out.id = msg.id
-            self.send(out, addr, port)
-
-    def send(self, out, addr = _MDNS_ADDR, port = _MDNS_PORT):
-        """Sends an outgoing packet."""
-        # This is a quick test to see if we can parse the packets we generate
-        #temp = DNSIncoming(out.packet())
-        try:
-            bytes_sent = self.socket.sendto(out.packet(), 0, (addr, port))
-        except:
-            # Ignore this, it may be a temporary loss of network connection
-            pass
-
-    def close(self):
-        """Ends the background threads, and prevent this instance from
-        servicing further queries."""
-        if globals()['_GLOBAL_DONE'] == 0:
-            globals()['_GLOBAL_DONE'] = 1
-            self.notifyAll()
-            self.engine.notify()
-            self.unregisterAllServices()
-            self.socket.setsockopt(socket.SOL_IP, socket.IP_DROP_MEMBERSHIP, socket.inet_aton(_MDNS_ADDR) + socket.inet_aton('0.0.0.0'))
-            self.socket.close()
-            
-# Test a few module features, including service registration, service
-# query (for Zoe), and service unregistration.
-
-if __name__ == '__main__':    
-    print "Multicast DNS Service Discovery for Python, version", __version__
-    r = Zeroconf()
-    print "1. Testing registration of a service..."
-    desc = {'version':'0.10','a':'test value', 'b':'another value'}
-    info = ServiceInfo("_http._tcp.local.", "My Service Name._http._tcp.local.", socket.inet_aton("127.0.0.1"), 1234, 0, 0, desc)
-    print "   Registering service..."
-    r.registerService(info)
-    print "   Registration done."
-    print "2. Testing query of service information..."
-    print "   Getting ZOE service:", str(r.getServiceInfo("_http._tcp.local.", "ZOE._http._tcp.local."))
-    print "   Query done."
-    print "3. Testing query of own service..."
-    print "   Getting self:", str(r.getServiceInfo("_http._tcp.local.", "My Service Name._http._tcp.local."))
-    print "   Query done."
-    print "4. Testing unregister of service information..."
-    r.unregisterService(info)
-    print "   Unregister done."
-    r.close()
--- a/util/misc.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/util/misc.py	Mon Jan 07 13:50:39 2019 +0100
@@ -26,39 +26,48 @@
 Misc definitions
 """
 
-import os,sys
 
-# helper func to check path write permission
+from __future__ import absolute_import
+import os
+from functools import reduce
+
+from util.BitmapLibrary import AddBitmapFolder
+from util.TranslationCatalogs import AddCatalog
+
+
 def CheckPathPerm(path):
+    """ Helper func to check path write permission """
     if path is None or not os.path.isdir(path):
         return False
     for root, dirs, files in os.walk(path):
-         for name in files:
-             if os.access(root, os.W_OK) is not True or os.access(os.path.join(root, name), os.W_OK) is not True:
-                 return False
+        files = [f for f in files if not f[0] == '.']
+        dirs[:] = [d for d in dirs if not d[0] == '.']
+        for name in files:
+            if os.access(root, os.W_OK) is not True or os.access(os.path.join(root, name), os.W_OK) is not True:
+                return False
     return True
 
-def GetClassImporter(classpath):
-    if type(classpath)==str:
-        def fac():
-            mod=__import__(classpath.rsplit('.',1)[0])
-            return reduce(getattr, classpath.split('.')[1:], mod)
-        return fac
+
+def GetClassImporter(param):
+    """
+    is used to resolve library class names in features.py
+    if param is a string, returns a callable that return the class pointed by param
+    if a class is given, then returns a callable that returns the given class.
+    """
+
+    if isinstance(param, str):
+        def factory():
+            # on-demand import, only when using class
+            mod = __import__(param.rsplit('.', 1)[0])
+            return reduce(getattr, param.split('.')[1:], mod)
+        return factory
     else:
-        return classpath
+        return lambda: param
+
 
 def InstallLocalRessources(CWD):
-    from BitmapLibrary import AddBitmapFolder
-    from TranslationCatalogs import AddCatalog
-    import wx
-
     # Beremiz bitmaps
     AddBitmapFolder(os.path.join(CWD, "images"))
 
     # Internationalization
     AddCatalog(os.path.join(CWD, "locale"))
-    import gettext
-    import __builtin__
-    
-    __builtin__.__dict__['_'] = wx.GetTranslation
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util/paths.py	Mon Jan 07 13:50:39 2019 +0100
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# This file is part of Beremiz, a Integrated Development Environment for
+# programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
+#
+# Copyright (C) 2017: Andrey Skvortsov
+#
+# See COPYING file for copyrights details.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+from __future__ import absolute_import
+import os
+import sys
+from builtins import str as text
+
+
+def AbsFile(file):
+    if isinstance(file, str):
+        file = text(file, sys.getfilesystemencoding())
+    return file
+
+
+def AbsDir(file):
+    file = AbsFile(file)
+    return os.path.dirname(os.path.realpath(file))
+
+
+def AbsNeighbourFile(file, *args):
+    return os.path.join(AbsDir(file), *args)
+
+
+def AbsParentDir(file, level=1):
+    path = AbsDir(file)
+    for dummy in range(0, level):
+        path = os.path.dirname(path)
+    return path
--- a/version.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/version.py	Mon Jan 07 13:50:39 2019 +0100
@@ -23,90 +23,186 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 
 
-import subprocess, os
+from __future__ import absolute_import
+from __future__ import unicode_literals
+
+import subprocess
+import os
+
+import util.paths as paths
+
+
+def GetCommunityHelpMsg():
+    return _(
+        "The best place to ask questions about Beremiz/PLCOpenEditor\n"
+        "is project's mailing list: beremiz-devel@lists.sourceforge.net\n"
+        "\n"
+        "This is the main community support channel.\n"
+        "For posting it is required to be subscribed to the mailing list.\n"
+        "\n"
+        "You can subscribe to the list here:\n"
+        "https://lists.sourceforge.net/lists/listinfo/beremiz-devel"
+    )
+
 
 def GetAppRevision():
     rev = None
-    app_dir=os.path.dirname(os.path.realpath(__file__))    
+    app_dir = paths.AbsDir(__file__)
     try:
         pipe = subprocess.Popen(
             ["hg", "id", "-i"],
-            stdout = subprocess.PIPE,
-            cwd = app_dir
+            stdout=subprocess.PIPE,
+            cwd=app_dir
         )
         rev = pipe.communicate()[0]
         if pipe.returncode != 0:
             rev = None
-    except:
+    except Exception:
         pass
-    
+
     # if this is not mercurial repository
     # try to read revision from file
     if rev is None:
         try:
-            f = open(os.path.join(app_dir,"revision"))
+            f = open(os.path.join(app_dir, "revision"))
             rev = f.readline()
-        except:
+        except Exception:
             pass
     return rev
 
+
 def GetAboutDialogInfo():
     import wx
     info = wx.AboutDialogInfo()
 
     info.Name = "Beremiz"
     info.Version = app_version
-    
-    info.Copyright  = "(C) 2016 Andrey Skvortsov\n"
-    info.Copyright += "(C) 2008-2015 Eduard Tisserant\n"
+
+    info.Copyright = ""
+    info.Copyright += "(C) 2016-2018 Andrey Skvortsov\n"
+    info.Copyright += "(C) 2008-2018 Eduard Tisserant\n"
     info.Copyright += "(C) 2008-2015 Laurent Bessard"
 
     info.WebSite = ("http://beremiz.org", "beremiz.org")
-    
+
     info.Description = _("Open Source framework for automation, "
-                             "implemented IEC 61131 IDE with constantly growing set of extensions "
-                             "and flexible PLC runtime.")
-    
-    info.Developers = ("Andrey Skvortsov <andrej.skvortzov@gmail.com>",
-		       "Sergey Surkov <surkov.sv@summatechnology.ru>",
-		       "Edouard Tisserant <edouard.tisserant@gmail.com>",
-		       "Laurent Bessard <laurent.bessard@gmail.com>")
-
-
-    info.License = ('\n This program is free software; you can redistribute it and/or\n'
-    ' modify it under the terms of the GNU General Public License\n'
-    ' as published by the Free Software Foundation; either version 2\n'
-    ' of the License, or (at your option) any later version.\n'
-    '\n'
-    ' This program is distributed in the hope that it will be useful,\n'
-    ' but WITHOUT ANY WARRANTY; without even the implied warranty of\n'
-    ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n'
-    ' GNU General Public License below for more details.\n'
-    '\n'
-    '\n'
-    '\n'
-    '')
+                         "implemented IEC 61131 IDE with constantly growing set of extensions "
+                         "and flexible PLC runtime.")
+
+    info.Developers = (
+        "Andrey Skvortsov <andrej.skvortzov@gmail.com>",
+        "Sergey Surkov <surkov.sv@summatechnology.ru>",
+        "Edouard Tisserant <edouard.tisserant@gmail.com>",
+        "Laurent Bessard <laurent.bessard@gmail.com>")
+
+    info.License = (
+        '\n This program is free software; you can redistribute it and/or\n'
+        ' modify it under the terms of the GNU General Public License\n'
+        ' as published by the Free Software Foundation; either version 2\n'
+        ' of the License, or (at your option) any later version.\n'
+        '\n'
+        ' This program is distributed in the hope that it will be useful,\n'
+        ' but WITHOUT ANY WARRANTY; without even the implied warranty of\n'
+        ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n'
+        ' GNU General Public License below for more details.\n'
+        '\n'
+        '\n'
+        '\n'
+        ''
+    )
 
     # read license file
-    path=os.path.join(os.path.dirname(os.path.abspath(__file__)))
-    license_path = os.path.join(path, u"COPYING")
-    license=''
+    path = paths.AbsDir(__file__)
+    license_path = os.path.join(path, "COPYING")
     if os.path.exists(license_path):
         with open(license_path) as f:
             info.License += f.read()
 
     info.Icon = wx.Icon(os.path.join(path, "images", "about_brz_logo.png"), wx.BITMAP_TYPE_PNG)
 
-    info.Translators = ("Russian\t- Andrey Skvortsov <andrej.skvortzov@gmail.com>",
-	                "Korean\t- Reinhard Lee <lij3105@gmail.com>",
-	                "German\t- Mark Muzenhardt <mark.muzenhardt@gmail.com>",
-	                "French\t- Laurent Bessard <laurent.bessard@gmail.com>")
+    info.Translators = (
+        "Bengali (Bangladesh)",
+        "  Adhir Dutta <likhon52@gmail.com>, 2017",
+        "",
+
+        "Chinese",
+        "  Frank Guan <gpfrank@163.com>, 2018",
+        "  Tango Wu <wuyangtang@live.com>, 2017",
+        "  Yiwei Yan <523136664@qq.com>, 2018",
+        "",
+
+        "Dutch (Netherlands)",
+        "  Jordy van der Heijden <jordyvanderheijden@gmail.com>, 2018",
+        "",
+
+        "French",
+        "  Edouard Tisserant <edouard.tisserant@gmail.com>, 2018",
+        "  Fabien Marteau <mail@fabienm.eu>, 2017",
+        "  Laurent Bessard <laurent.bessard@gmail.com>, 2008",
+        "",
+
+        "German",
+        "  Andrey Skvortsov <andrej.skvortzov@gmail.com>, 2017",
+        "  Hendrik Knackstedt <h.knackstedt@stud.uni-hannover.de>, 2017 ",
+        "  Mark Muzenhardt <mark.muzenhardt@gmail.com>, 2012",
+        "",
+
+        "Hungarian",
+        "  Krisztián Veress <krive001@gmail.com>, 2018",
+        "  Gábor Véninger <veninger.gabor@gmail.com>, 2017",
+        "",
+
+        "Italian",
+        "  Luca Magnabosco <magnabosco.luca@gmail.com>, 2017",
+        "  Manuele Conti <manuele.conti@sirius-es.it>, 2017",
+        "",
+
+        "Korean",
+        "  Ikhwan Kim <duo821228@gmail.com>, 2018",
+        "  Reinhard Lee <lij3105@gmail.com>, 2012",
+        "",
+
+        "Portuguese",
+        "  Pedro Coimbra <pcoimbra310@gmail.com>, 2017",
+        "",
+
+        "Portuguese (Brazil)",
+        "  Rodrigo Rolle <ro_pita@hotmail.com>, 2018",
+        "  Thiago Alves <thiagoralves@gmail.com>, 2017",
+        "",
+
+        "Romanian",
+        "  Emil Saracutu <emil_saracutu@yahoo.com>, 2018",
+        "",
+
+        "Russian",
+        "  Andrey Skvortsov <andrej.skvortzov@gmail.com>, 2018",
+        "  Sergey Surkov <surkov.sv@summatechnology.ru>, 2018",
+        "  zx_alexis <zxalexis@gmail.com>, 2017",
+        "",
+
+        "Slovenian",
+        "  Janez Pregelj <janezpregelj@gmail.com>, 2018",
+        "  Andraz Gregorcic <andraz.gregorcic@smarteh.si>, 2017",
+        "",
+
+        "Spanish",
+        "  Carlos Guilarte <guilartec@gmail.com>, 2018",
+        "  Yegor Yefremov <yegorslists@googlemail.com>, 2018",
+        "  Jorge Rojas, 2018",
+        "  Marcial González de Armas <mgacod@gmail.com>, 2017",
+        "  Nelson Mambre <nmambre@gmail.com>, 2017",
+        "",
+
+        "Turkish",
+        "  Ibrahim Kilicarslan <ibrahimhalilkilicarslan@outlook.com>, 2018",
+        "",
+
+    )
     return info
 
-app_version =  "1.2"
+
+app_version = "1.2"
 rev = GetAppRevision()
 if rev is not None:
     app_version = app_version + "-" + rev.rstrip()
-    
-        
-
--- a/wxglade_hmi/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/wxglade_hmi/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,4 +22,5 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-from wxglade_hmi import *
+from __future__ import absolute_import
+from wxglade_hmi.wxglade_hmi import *
--- a/wxglade_hmi/wxglade_hmi.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/wxglade_hmi/wxglade_hmi.py	Mon Jan 07 13:50:39 2019 +0100
@@ -5,6 +5,7 @@
 # programming IEC 61131-3 automates supporting plcopen standard and CanFestival.
 #
 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
+# Copyright (C) 2017: Andrey Skvortsov
 #
 # See COPYING file for copyrights details.
 #
@@ -22,26 +23,35 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import wx
-import os, sys, shutil
+
+from __future__ import absolute_import
+import os
+import sys
+import shutil
 from xml.dom import minidom
 
+import wx
+
+import util.paths as paths
 from py_ext import PythonFileCTNMixin
 
+
 class WxGladeHMI(PythonFileCTNMixin):
 
     ConfNodeMethods = [
-        {"bitmap" : "editWXGLADE",
-         "name" : _("WXGLADE GUI"),
-         "tooltip" : _("Edit a WxWidgets GUI with WXGlade"),
-         "method" : "_editWXGLADE"},
+        {
+            "bitmap":    "editWXGLADE",
+            "name":    _("WXGLADE GUI"),
+            "tooltip": _("Edit a WxWidgets GUI with WXGlade"),
+            "method":   "_editWXGLADE"
+        },
     ]
 
     def GetIconName(self):
         return "wxGlade"
 
     def ConfNodePath(self):
-        return os.path.join(os.path.dirname(__file__))
+        return paths.AbsDir(__file__)
 
     def _getWXGLADEpath(self, project_path=None):
         if project_path is None:
@@ -49,14 +59,29 @@
         # define name for wxGlade gui file
         return os.path.join(project_path, "hmi.wxg")
 
+    def GetWxGladePath(self):
+        path = None
+        try:
+            from wxglade import __file__ as fileName
+            path = os.path.dirname(fileName)
+            return path
+        except ImportError:
+            pass
+
+        defLibDir = "/usr/share/wxglade"
+        if os.path.isdir(defLibDir):
+            path = defLibDir
+
+        return path
+
     def launch_wxglade(self, options, wait=False):
-        from wxglade import __file__ as fileName
-        path = os.path.dirname(fileName)
+        path = self.GetWxGladePath()
         glade = os.path.join(path, 'wxglade.py')
         if wx.Platform == '__WXMSW__':
-            glade = "\"%s\""%glade
-        mode = {False:os.P_NOWAIT, True:os.P_WAIT}[wait]
-        os.spawnv(mode, sys.executable, ["\"%s\""%sys.executable] + [glade] + options)
+            glade = "\"%s\"" % glade
+        mode = {False: os.P_NOWAIT, True: os.P_WAIT}[wait]
+        os.spawnv(mode, sys.executable,
+                  ["\"%s\"" % sys.executable] + [glade] + options)
 
     def OnCTNSave(self, from_project_path=None):
         if from_project_path is not None:
@@ -65,46 +90,54 @@
         return PythonFileCTNMixin.OnCTNSave(self, from_project_path)
 
     def CTNGenerate_C(self, buildpath, locations):
-        
-        hmi_frames = []
-        
-        wxgfile_path=self._getWXGLADEpath()
+
+        # list containing description of all objects declared in wxglade
+        hmi_objects = []
+        # list containing only description of the main frame object
+        main_frames = []
+
+        wxgfile_path = self._getWXGLADEpath()
         if os.path.exists(wxgfile_path):
             wxgfile = open(wxgfile_path, 'r')
             wxgtree = minidom.parse(wxgfile)
             wxgfile.close()
-            
+
             for node in wxgtree.childNodes[1].childNodes:
                 if node.nodeType == wxgtree.ELEMENT_NODE:
-                    hmi_frames.append({
-                        "name" : node.getAttribute("name"),
-                        "class" : node.getAttribute("class"),
-                        "handlers" : [
-                            hnode.firstChild.data for hnode in 
-                            node.getElementsByTagName("handler")]})
-                    
-            hmipyfile_path=os.path.join(self._getBuildPath(), "hmi.py")
+                    name = node.getAttribute("name")
+                    wxglade_object_desc = {
+                        "name": name,
+                        "class": node.getAttribute("class"),
+                        "handlers": [
+                            hnode.firstChild.data for hnode in
+                            node.getElementsByTagName("handler")]}
+
+                    hmi_objects.append(wxglade_object_desc)
+                    if name == self.CTNName():
+                        main_frames.append(wxglade_object_desc)
+
+            hmipyfile_path = os.path.join(self._getBuildPath(), "hmi.py")
             if wx.Platform == '__WXMSW__':
-                wxgfile_path = "\"%s\""%wxgfile_path
-                wxghmipyfile_path = "\"%s\""%hmipyfile_path
+                wxgfile_path = "\"%s\"" % wxgfile_path
+                wxghmipyfile_path = "\"%s\"" % hmipyfile_path
             else:
                 wxghmipyfile_path = hmipyfile_path
-            self.launch_wxglade(['-o', wxghmipyfile_path, '-g', 'python', wxgfile_path], wait=True)
-            
+            self.launch_wxglade(
+                ['-o', wxghmipyfile_path, '-g', 'python', wxgfile_path], wait=True)
+
             hmipyfile = open(hmipyfile_path, 'r')
             define_hmi = hmipyfile.read().decode('utf-8')
             hmipyfile.close()
-        
+
         else:
             define_hmi = ""
-        
-        declare_hmi = "\n".join(["%(name)s = None\n" % x + 
-                          "\n".join(["%(class)s.%(h)s = %(h)s"%
-                            dict(x,h=h) for h in x['handlers']])
-                                for x in hmi_frames])
-        global_hmi = ("global %s\n"%",".join(
-                         [x["name"] for x in hmi_frames]) 
-                      if len(hmi_frames) > 0 else "")
+
+        declare_hmi = "\n".join(["%(name)s = None\n" % x for x in main_frames])
+        declare_hmi += "\n".join(["\n".join(["%(class)s.%(h)s = %(h)s" %
+                                             dict(x, h=h) for h in x['handlers']])
+                                  for x in hmi_objects])
+        global_hmi = ("global %s\n" % ",".join(
+            [x["name"] for x in main_frames]) if len(main_frames) > 0 else "")
         init_hmi = "\n".join(["""\
 def OnCloseFrame(evt):
     wx.MessageBox(_("Please stop PLC to close"))
@@ -112,21 +145,26 @@
 %(name)s = %(class)s(None)
 %(name)s.Bind(wx.EVT_CLOSE, OnCloseFrame)
 %(name)s.Show()
-""" % x for x in hmi_frames])
+""" % x for x in main_frames])
         cleanup_hmi = "\n".join(
-            ["if %(name)s is not None: %(name)s.Destroy()" % x 
-                for x in hmi_frames])
-        
+            ["if %(name)s is not None: %(name)s.Destroy()" % x
+             for x in main_frames])
+
         self.PreSectionsTexts = {
-            "globals":define_hmi,
-            "start":global_hmi,
-            "stop":global_hmi + cleanup_hmi
+            "globals": define_hmi,
+            "start":   global_hmi,
+            "stop":    global_hmi + cleanup_hmi
         }
         self.PostSectionsTexts = {
-            "globals":declare_hmi,
-            "start":init_hmi,
+            "globals": declare_hmi,
+            "start":   init_hmi,
         }
 
+        if len(main_frames) == 0 and \
+           len(getattr(self.CodeFile, "start").getanyText().strip()) == 0:
+            self.GetCTRoot().logger.write_warning(
+                _("Warning: WxGlade HMI has no object with name identical to extension name, and no python code is provided in start section to create object.\n"))
+
         return PythonFileCTNMixin.CTNGenerate_C(self, buildpath, locations)
 
     def _editWXGLADE(self):
@@ -136,13 +174,13 @@
             dialog = wx.MessageDialog(self.GetCTRoot().AppFrame,
                                       _("You don't have write permissions.\nOpen wxGlade anyway ?"),
                                       _("Open wxGlade"),
-                                      wx.YES_NO|wx.ICON_QUESTION)
+                                      wx.YES_NO | wx.ICON_QUESTION)
             open_wxglade = dialog.ShowModal() == wx.ID_YES
             dialog.Destroy()
         if open_wxglade:
             if not os.path.exists(wxg_filename):
                 hmi_name = self.BaseParams.getName()
-                open(wxg_filename,"w").write("""<?xml version="1.0"?>
+                open(wxg_filename, "w").write("""<?xml version="1.0"?>
     <application path="" name="" class="" option="0" language="python" top_window="%(name)s" encoding="UTF-8" use_gettext="0" overwrite="0" use_new_namespace="1" for_version="2.8" is_template="0">
         <object class="%(class)s" name="%(name)s" base="EditFrame">
             <style>wxDEFAULT_FRAME_STYLE</style>
@@ -155,6 +193,5 @@
     </application>
     """ % {"name": hmi_name, "class": "Class_%s" % hmi_name})
             if wx.Platform == '__WXMSW__':
-                wxg_filename = "\"%s\""%wxg_filename
+                wxg_filename = "\"%s\"" % wxg_filename
             self.launch_wxglade([wxg_filename])
-
--- a/xmlclass/__init__.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/xmlclass/__init__.py	Mon Jan 07 13:50:39 2019 +0100
@@ -23,6 +23,13 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 # Package initialisation
-
-from xmlclass import ClassFactory, GenerateParser, DefaultElementClass, GetAttributeValue, time_model, CreateNode, NodeSetAttr, NodeRenameAttr
-from xsdschema import XSDClassFactory, GenerateParserFromXSD, GenerateParserFromXSDstring
+from __future__ import absolute_import
+from .xmlclass import (ClassFactory,
+                       GenerateParser,
+                       DefaultElementClass,
+                       GetAttributeValue,
+                       time_model,
+                       CreateNode,
+                       NodeSetAttr,
+                       NodeRenameAttr)
+from .xsdschema import XSDClassFactory, GenerateParserFromXSD, GenerateParserFromXSDstring
--- a/xmlclass/xmlclass.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/xmlclass/xmlclass.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,15 +22,22 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import os, sys
+
+from __future__ import absolute_import
+from __future__ import print_function
+import os
 import re
 import datetime
-from types import *
 from xml.dom import minidom
-from xml.sax.saxutils import escape, unescape, quoteattr
+from xml.sax.saxutils import unescape
+from collections import OrderedDict
+from builtins import str as text
+from functools import reduce
+
+from six import string_types
+from six.moves import xrange
 from lxml import etree
-from new import classobj
-from collections import OrderedDict
+
 
 def CreateNode(name):
     node = minidom.Node()
@@ -39,49 +46,52 @@
     node.childNodes = []
     return node
 
+
 def NodeRenameAttr(node, old_name, new_name):
     node._attrs[new_name] = node._attrs.pop(old_name)
 
+
 def NodeSetAttr(node, name, value):
     attr = minidom.Attr(name)
-    text = minidom.Text()
-    text.data = value
-    attr.childNodes[0] = text
+    txt = minidom.Text()
+    txt.data = value
+    attr.childNodes[0] = txt
     node._attrs[name] = attr
 
-"""
-Regular expression models for checking all kind of string values defined in XML
-standard
-"""
-Name_model = re.compile('([a-zA-Z_\:][\w\.\-\:]*)$')
-Names_model = re.compile('([a-zA-Z_\:][\w\.\-\:]*(?: [a-zA-Z_\:][\w\.\-\:]*)*)$')
-NMToken_model = re.compile('([\w\.\-\:]*)$')
-NMTokens_model = re.compile('([\w\.\-\:]*(?: [\w\.\-\:]*)*)$')
-QName_model = re.compile('((?:[a-zA-Z_][\w]*:)?[a-zA-Z_][\w]*)$')
-QNames_model = re.compile('((?:[a-zA-Z_][\w]*:)?[a-zA-Z_][\w]*(?: (?:[a-zA-Z_][\w]*:)?[a-zA-Z_][\w]*)*)$')
-NCName_model = re.compile('([a-zA-Z_][\w]*)$')
-URI_model = re.compile('((?:http://|/)?(?:[\w.-]*/?)*)$')
-LANGUAGE_model = re.compile('([a-zA-Z]{1,8}(?:-[a-zA-Z0-9]{1,8})*)$')
-
-ONLY_ANNOTATION = re.compile("((?:annotation )?)")
+
+# Regular expression models for checking all kind of
+# string values defined in XML standard
+
+Name_model = re.compile(r'([a-zA-Z_\:][\w\.\-\:]*)$')
+Names_model = re.compile(r'([a-zA-Z_\:][\w\.\-\:]*(?: [a-zA-Z_\:][\w\.\-\:]*)*)$')
+NMToken_model = re.compile(r'([\w\.\-\:]*)$')
+NMTokens_model = re.compile(r'([\w\.\-\:]*(?: [\w\.\-\:]*)*)$')
+QName_model = re.compile(r'((?:[a-zA-Z_][\w]*:)?[a-zA-Z_][\w]*)$')
+QNames_model = re.compile(r'((?:[a-zA-Z_][\w]*:)?[a-zA-Z_][\w]*(?: (?:[a-zA-Z_][\w]*:)?[a-zA-Z_][\w]*)*)$')
+NCName_model = re.compile(r'([a-zA-Z_][\w]*)$')
+URI_model = re.compile(r'((?:htt(p|ps)://|/)?(?:[\w.-]*/?)*)$')
+LANGUAGE_model = re.compile(r'([a-zA-Z]{1,8}(?:-[a-zA-Z0-9]{1,8})*)$')
+
+ONLY_ANNOTATION = re.compile(r"((?:annotation )?)")
 
 """
 Regular expression models for extracting dates and times from a string
 """
-time_model = re.compile('([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]*)?)(?:Z)?$')
-date_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})((?:[\-\+][0-9]{2}:[0-9]{2})|Z)?$')
-datetime_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})[ T]([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]*)?)((?:[\-\+][0-9]{2}:[0-9]{2})|Z)?$')
+time_model = re.compile(r'([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]*)?)(?:Z)?$')
+date_model = re.compile(r'([0-9]{4})-([0-9]{2})-([0-9]{2})((?:[\-\+][0-9]{2}:[0-9]{2})|Z)?$')
+datetime_model = re.compile(r'([0-9]{4})-([0-9]{2})-([0-9]{2})[ T]([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]*)?)((?:[\-\+][0-9]{2}:[0-9]{2})|Z)?$')
+
 
 class xml_timezone(datetime.tzinfo):
 
     def SetOffset(self, offset):
         if offset == "Z":
-            self.__offset = timedelta(minutes = 0)
+            self.__offset = datetime.timedelta(minutes=0)
             self.__name = "UTC"
         else:
-            sign = {"-" : -1, "+" : 1}[offset[0]]
+            sign = {"-": -1, "+": 1}[offset[0]]
             hours, minutes = [int(val) for val in offset[1:].split(":")]
-            self.__offset = timedelta(minutes=sign * (hours * 60 + minutes))
+            self.__offset = datetime.timedelta(minutes=sign * (hours * 60 + minutes))
             self.__name = ""
 
     def utcoffset(self, dt):
@@ -91,12 +101,15 @@
         return self.__name
 
     def dst(self, dt):
-        return ZERO
-
-[SYNTAXELEMENT, SYNTAXATTRIBUTE, SIMPLETYPE, COMPLEXTYPE, COMPILEDCOMPLEXTYPE, 
- ATTRIBUTESGROUP, ELEMENTSGROUP, ATTRIBUTE, ELEMENT, CHOICE, ANY, TAG, CONSTRAINT,
+        return datetime.timedelta(0)
+
+
+[
+    SYNTAXELEMENT, SYNTAXATTRIBUTE, SIMPLETYPE, COMPLEXTYPE, COMPILEDCOMPLEXTYPE,
+    ATTRIBUTESGROUP, ELEMENTSGROUP, ATTRIBUTE, ELEMENT, CHOICE, ANY, TAG, CONSTRAINT,
 ] = range(13)
 
+
 def NotSupportedYet(type):
     """
     Function that generates a function that point out to user that datatype
@@ -105,14 +118,14 @@
     @return: function generated
     """
     def GetUnknownValue(attr):
-        raise ValueError("\"%s\" type isn't supported by \"xmlclass\" yet!" % \
-                         type)
+        raise ValueError("\"%s\" type isn't supported by \"xmlclass\" yet!" % type)
     return GetUnknownValue
 
-"""
-This function calculates the number of whitespace for indentation
-"""
+
 def getIndent(indent, balise):
+    """
+    This function calculates the number of whitespace for indentation
+    """
     first = indent * 2
     second = first + len(balise) + 1
     return u'\t'.expandtabs(first), u'\t'.expandtabs(second)
@@ -128,19 +141,19 @@
     if not extract:
         return attr
     if len(attr.childNodes) == 1:
-        return unicode(unescape(attr.childNodes[0].data))
+        return text(unescape(attr.childNodes[0].data))
     else:
         # content is a CDATA
-        text = u''
+        txt = u''
         for node in attr.childNodes:
             if not (node.nodeName == "#text" and node.data.strip() == u''):
-                text += unicode(unescape(node.data))
+                txt += text(unescape(node.data))
         return text
 
 
 def GetNormalizedString(attr, extract=True):
     """
-    Function that normalizes a string according to XML 1.0. Replace  
+    Function that normalizes a string according to XML 1.0. Replace
     tabulations, line feed and carriage return by white space
     @param attr: tree node containing data to extract or data to normalize
     @param extract: attr is a tree node or not
@@ -155,14 +168,14 @@
 
 def GetToken(attr, extract=True):
     """
-    Function that tokenizes a string according to XML 1.0. Remove any leading  
-    and trailing white space and replace internal sequence of two or more 
+    Function that tokenizes a string according to XML 1.0. Remove any leading
+    and trailing white space and replace internal sequence of two or more
     spaces by only one white space
     @param attr: tree node containing data to extract or data to tokenize
     @param extract: attr is a tree node or not
     @return: data tokenized as string
     """
-    return " ".join([part for part in 
+    return " ".join([part for part in
                      GetNormalizedString(attr, extract).split(" ")
                      if part])
 
@@ -182,11 +195,11 @@
         raise ValueError("\"%s\" isn't a valid hexadecimal integer!" % value)
     try:
         return int(value, 16)
-    except:
+    except Exception:
         raise ValueError("\"%s\" isn't a valid hexadecimal integer!" % value)
 
 
-def GenerateIntegerExtraction(minInclusive=None, maxInclusive=None, 
+def GenerateIntegerExtraction(minInclusive=None, maxInclusive=None,
                               minExclusive=None, maxExclusive=None):
     """
     Function that generates an extraction function for integer defining min and
@@ -212,31 +225,33 @@
         try:
             # TODO: permit to write value like 1E2
             value = int(value)
-        except:
+        except Exception:
             raise ValueError("\"%s\" isn't a valid integer!" % value)
         if minInclusive is not None and value < minInclusive:
-            raise ValueError("\"%d\" isn't greater or equal to %d!" % \
+            raise ValueError("\"%d\" isn't greater or equal to %d!" %
                              (value, minInclusive))
         if maxInclusive is not None and value > maxInclusive:
-            raise ValueError("\"%d\" isn't lesser or equal to %d!" % \
+            raise ValueError("\"%d\" isn't lesser or equal to %d!" %
                              (value, maxInclusive))
         if minExclusive is not None and value <= minExclusive:
-            raise ValueError("\"%d\" isn't greater than %d!" % \
+            raise ValueError("\"%d\" isn't greater than %d!" %
                              (value, minExclusive))
         if maxExclusive is not None and value >= maxExclusive:
-            raise ValueError("\"%d\" isn't lesser than %d!" % \
+            raise ValueError("\"%d\" isn't lesser than %d!" %
                              (value, maxExclusive))
         return value
     return GetInteger
 
 
-def GenerateFloatExtraction(type, extra_values=[]):
+def GenerateFloatExtraction(type, extra_values=None):
     """
     Function that generates an extraction function for float
     @param type: name of the type of float
     @return: function generated
     """
-    def GetFloat(attr, extract = True):
+    extra_values = [] if extra_values is None else extra_values
+
+    def GetFloat(attr, extract=True):
         """
         Function that extracts a float from a tree node or a string
         @param attr: tree node containing data to extract or data as a string
@@ -251,7 +266,7 @@
             return value
         try:
             return float(value)
-        except:
+        except Exception:
             raise ValueError("\"%s\" isn't a valid %s!" % (value, type))
     return GetFloat
 
@@ -401,7 +416,7 @@
                 raise ValueError("Member limit can't be defined to \"unbounded\"!")
         try:
             limit = int(value)
-        except:
+        except Exception:
             raise ValueError("\"%s\" isn't a valid value for this member limit!" % value)
         if limit < 0:
             raise ValueError("Member limit can't be negative!")
@@ -435,8 +450,8 @@
         if value in list:
             return value
         else:
-            raise ValueError("\"%s\" isn't a valid value for %s!" % \
-                             (value, type))
+            raise ValueError(
+                "\"%s\" isn't a valid value for %s!" % (value, type))
     return GetEnumerated
 
 
@@ -497,8 +512,8 @@
                 if item in list:
                     values.append(item)
                 else:
-                    raise ValueError("\"%s\" isn't a valid value for %s!" % \
-                                     (value, type))
+                    raise ValueError(
+                        "\"%s\" isn't a valid value for %s!" % (value, type))
             return values
     return GetLists
 
@@ -517,7 +532,7 @@
         check that all extracted items match the model
         @param attr: tree node containing data to extract or data as a string
         @param extract: attr is a tree node or not
-        @return: data as a list of string if matching 
+        @return: data as a list of string if matching
         """
         if extract:
             value = GetAttributeValue(attr)
@@ -529,24 +544,24 @@
             if result is not None:
                 values.append(item)
             else:
-                raise ValueError("\"%s\" isn't a valid value for %s!" % \
-                                 (value, type))
+                raise ValueError("\"%s\" isn't a valid value for %s!" % (value, type))
         return values
     return GetModelNameList
 
+
 def GenerateAnyInfos(infos):
-    
+
     def GetTextElement(tree):
         if infos["namespace"][0] == "##any":
             return tree.xpath("p")[0]
         return tree.xpath("ns:p", namespaces={"ns": infos["namespace"][0]})[0]
-    
+
     def ExtractAny(tree):
         return GetTextElement(tree).text
-    
+
     def GenerateAny(tree, value):
         GetTextElement(tree).text = etree.CDATA(value)
-        
+
     def InitialAny():
         if infos["namespace"][0] == "##any":
             element_name = "p"
@@ -555,15 +570,16 @@
         p = etree.Element(element_name)
         p.text = etree.CDATA("")
         return p
-        
+
     return {
-        "type": COMPLEXTYPE, 
+        "type": COMPLEXTYPE,
         "extract": ExtractAny,
         "generate": GenerateAny,
         "initial": InitialAny,
-        "check": lambda x: isinstance(x, (StringType, UnicodeType, etree.ElementBase))
+        "check": lambda x: isinstance(x, (string_types, etree.ElementBase))
     }
 
+
 def GenerateTagInfos(infos):
     def ExtractTag(tree):
         if len(tree._attrs) > 0:
@@ -574,61 +590,65 @@
             return True
         else:
             return None
-    
+
     def GenerateTag(value, name=None, indent=0):
         if name is not None and not (infos["minOccurs"] == 0 and value is None):
-            ind1, ind2 = getIndent(indent, name)
+            ind1, _ind2 = getIndent(indent, name)
             return ind1 + "<%s/>\n" % name
         else:
             return ""
-    
+
     return {
-        "type": TAG, 
+        "type": TAG,
         "extract": ExtractTag,
         "generate": GenerateTag,
         "initial": lambda: None,
-        "check": lambda x: x == None or infos["minOccurs"] == 0 and value == True
+        "check": lambda x: x is None or infos["minOccurs"] == 0 and x
     }
 
+
 def FindTypeInfos(factory, infos):
-    if isinstance(infos, (UnicodeType, StringType)):
+    if isinstance(infos, string_types):
         namespace, name = DecomposeQualifiedName(infos)
         return factory.GetQualifiedNameInfos(name, namespace)
     return infos
-    
+
+
 def GetElementInitialValue(factory, infos):
     infos["elmt_type"] = FindTypeInfos(factory, infos["elmt_type"])
     if infos["minOccurs"] == 1:
         element_name = factory.etreeNamespaceFormat % infos["name"]
         if infos["elmt_type"]["type"] == SIMPLETYPE:
             def initial_value():
-                value = etree.Element(element_name)
+                value = factory.Parser.makeelement(element_name)
                 value.text = (infos["elmt_type"]["generate"](infos["elmt_type"]["initial"]()))
+                value._init_()
                 return value
         else:
             def initial_value():
                 value = infos["elmt_type"]["initial"]()
                 if infos["type"] != ANY:
                     DefaultElementClass.__setattr__(value, "tag", element_name)
-                    value._init_()
                 return value
-        return [initial_value() for i in xrange(infos["minOccurs"])]
+        return [initial_value() for dummy in xrange(infos["minOccurs"])]
     else:
         return []
 
+
 def GetContentInfos(name, choices):
     for choice_infos in choices:
-        if choices_infos["type"] == "sequence":
-            for element_infos in choices_infos["elements"]:
+        if choice_infos["type"] == "sequence":
+            for element_infos in choice_infos["elements"]:
                 if element_infos["type"] == CHOICE:
                     if GetContentInfos(name, element_infos["choices"]):
-                        return choices_infos
+                        return choice_infos
                 elif element_infos["name"] == name:
-                    return choices_infos
+                    return choice_infos
         elif choice_infos["name"] == name:
-            return choices_infos
+            return choice_infos
     return None
 
+
 def ComputeContentChoices(factory, name, infos):
     choices = []
     for choice in infos["choices"]:
@@ -649,6 +669,7 @@
         choices.append((choice["name"], choice))
     return choices
 
+
 def GenerateContentInfos(factory, name, choices):
     choices_dict = {}
     for choice_name, infos in choices:
@@ -656,60 +677,60 @@
             for element in infos["elements"]:
                 if element["type"] == CHOICE:
                     element["elmt_type"] = GenerateContentInfos(factory, name, ComputeContentChoices(factory, name, element))
-                elif choices_dict.has_key(element["name"]):
+                elif element["name"] in choices_dict:
                     raise ValueError("'%s' element defined two times in choice" % choice_name)
                 else:
                     choices_dict[element["name"]] = infos
         else:
-            if choices_dict.has_key(choice_name):
+            if choice_name in choices_dict:
                 raise ValueError("'%s' element defined two times in choice" % choice_name)
             choices_dict[choice_name] = infos
     prefix = ("%s:" % factory.TargetNamespace
               if factory.TargetNamespace is not None else "")
     choices_xpath = "|".join(map(lambda x: prefix + x, choices_dict.keys()))
-    
+
     def GetContentInitial():
         content_name, infos = choices[0]
         if content_name == "sequence":
             content_value = []
-            for i in xrange(infos["minOccurs"]):
+            for dummy in xrange(infos["minOccurs"]):
                 for element_infos in infos["elements"]:
                     content_value.extend(GetElementInitialValue(factory, element_infos))
         else:
             content_value = GetElementInitialValue(factory, infos)
         return content_value
-        
+
     return {
         "type": COMPLEXTYPE,
         "choices_xpath": etree.XPath(choices_xpath, namespaces=factory.NSMAP),
         "initial": GetContentInitial,
     }
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                           Structure extraction functions
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 
 def DecomposeQualifiedName(name):
     result = QName_model.match(name)
     if not result:
-        raise ValueError("\"%s\" isn't a valid QName value!" % name) 
+        raise ValueError("\"%s\" isn't a valid QName value!" % name)
     parts = result.groups()[0].split(':')
     if len(parts) == 1:
         return None, parts[0]
     return parts
-    
-def GenerateElement(element_name, attributes, elements_model, 
+
+
+def GenerateElement(element_name, attributes, elements_model,
                     accept_text=False):
     def ExtractElement(factory, node):
         attrs = factory.ExtractNodeAttrs(element_name, node, attributes)
         children_structure = ""
-        children_infos = []
         children = []
         for child in node.childNodes:
             if child.nodeName not in ["#comment", "#text"]:
                 namespace, childname = DecomposeQualifiedName(child.nodeName)
-                children_structure += "%s "%childname
+                children_structure += "%s " % childname
         result = elements_model.match(children_structure)
         if not result:
             raise ValueError("Invalid structure for \"%s\" children!. First element invalid." % node.nodeName)
@@ -725,8 +746,8 @@
                     namespace, childname = DecomposeQualifiedName(child.nodeName)
                     infos = factory.GetQualifiedNameInfos(childname, namespace)
                     if infos["type"] != SYNTAXELEMENT:
-                        raise ValueError("\"%s\" can't be a member child!" % name)
-                    if infos["extract"].has_key(element_name):
+                        raise ValueError("\"%s\" can't be a member child!" % childname)
+                    if element_name in infos["extract"]:
                         children.append(infos["extract"][element_name](factory, child))
                     else:
                         children.append(infos["extract"]["default"](factory, child))
@@ -734,10 +755,10 @@
     return ExtractElement
 
 
-"""
-Class that generate class from an XML Tree
-"""
-class ClassFactory:
+class ClassFactory(object):
+    """
+    Class that generate class from an XML Tree
+    """
 
     def __init__(self, document, filepath=None, debug=False):
         self.Document = document
@@ -746,20 +767,21 @@
         else:
             self.BaseFolder = self.FileName = None
         self.Debug = debug
-        
+
         # Dictionary for stocking Classes and Types definitions created from
         # the XML tree
         self.XMLClassDefinitions = {}
-        
+
         self.DefinedNamespaces = {}
         self.NSMAP = {}
         self.Namespaces = {}
         self.SchemaNamespace = None
         self.TargetNamespace = None
         self.etreeNamespaceFormat = "%s"
-        
+        self.Parser = None
+
         self.CurrentCompilations = []
-        
+
         # Dictionaries for stocking Classes and Types generated
         self.ComputeAfter = []
         if self.FileName is not None:
@@ -773,36 +795,36 @@
 
     def GetQualifiedNameInfos(self, name, namespace=None, canbenone=False):
         if namespace is None:
-            if self.Namespaces[self.SchemaNamespace].has_key(name):
+            if name in self.Namespaces[self.SchemaNamespace]:
                 return self.Namespaces[self.SchemaNamespace][name]
             for space, elements in self.Namespaces.iteritems():
-                if space != self.SchemaNamespace and elements.has_key(name):
+                if space != self.SchemaNamespace and name in elements:
                     return elements[name]
             parts = name.split("_", 1)
             if len(parts) > 1:
                 group = self.GetQualifiedNameInfos(parts[0], namespace)
                 if group is not None and group["type"] == ELEMENTSGROUP:
                     elements = []
-                    if group.has_key("elements"):
+                    if "elements" in group:
                         elements = group["elements"]
-                    elif group.has_key("choices"):
+                    elif "choices" in group:
                         elements = group["choices"]
                     for element in elements:
                         if element["name"] == parts[1]:
                             return element
             if not canbenone:
                 raise ValueError("Unknown element \"%s\" for any defined namespaces!" % name)
-        elif self.Namespaces.has_key(namespace):
-            if self.Namespaces[namespace].has_key(name):
+        elif namespace in self.Namespaces:
+            if name in self.Namespaces[namespace]:
                 return self.Namespaces[namespace][name]
             parts = name.split("_", 1)
             if len(parts) > 1:
                 group = self.GetQualifiedNameInfos(parts[0], namespace)
                 if group is not None and group["type"] == ELEMENTSGROUP:
                     elements = []
-                    if group.has_key("elements"):
+                    if "elements" in group:
                         elements = group["elements"]
-                    elif group.has_key("choices"):
+                    elif "choices" in group:
                         elements = group["choices"]
                     for element in elements:
                         if element["name"] == parts[1]:
@@ -815,36 +837,36 @@
 
     def SplitQualifiedName(self, name, namespace=None, canbenone=False):
         if namespace is None:
-            if self.Namespaces[self.SchemaNamespace].has_key(name):
+            if name in self.Namespaces[self.SchemaNamespace]:
                 return name, None
             for space, elements in self.Namespaces.items():
-                if space != self.SchemaNamespace and elements.has_key(name):
+                if space != self.SchemaNamespace and name in elements:
                     return name, None
             parts = name.split("_", 1)
             if len(parts) > 1:
                 group = self.GetQualifiedNameInfos(parts[0], namespace)
                 if group is not None and group["type"] == ELEMENTSGROUP:
                     elements = []
-                    if group.has_key("elements"):
+                    if "elements" in group:
                         elements = group["elements"]
-                    elif group.has_key("choices"):
+                    elif "choices" in group:
                         elements = group["choices"]
                     for element in elements:
                         if element["name"] == parts[1]:
-                            return part[1], part[0]
+                            return parts[1], parts[0]
             if not canbenone:
                 raise ValueError("Unknown element \"%s\" for any defined namespaces!" % name)
-        elif self.Namespaces.has_key(namespace):
-            if self.Namespaces[namespace].has_key(name):
+        elif namespace in self.Namespaces:
+            if name in self.Namespaces[namespace]:
                 return name, None
             parts = name.split("_", 1)
             if len(parts) > 1:
                 group = self.GetQualifiedNameInfos(parts[0], namespace)
                 if group is not None and group["type"] == ELEMENTSGROUP:
                     elements = []
-                    if group.has_key("elements"):
+                    if "elements" in group:
                         elements = group["elements"]
-                    elif group.has_key("choices"):
+                    elif "choices" in group:
                         elements = group["choices"]
                     for element in elements:
                         if element["name"] == parts[1]:
@@ -858,7 +880,7 @@
     def ExtractNodeAttrs(self, element_name, node, valid_attrs):
         attrs = {}
         for qualified_name, attr in node._attrs.items():
-            namespace, name =  DecomposeQualifiedName(qualified_name)
+            namespace, name = DecomposeQualifiedName(qualified_name)
             if name in valid_attrs:
                 infos = self.GetQualifiedNameInfos(name, namespace)
                 if infos["type"] != SYNTAXATTRIBUTE:
@@ -878,9 +900,9 @@
                 raise ValueError("Invalid attribute \"%s\" for member \"%s\"!" % (qualified_name, node.nodeName))
         for attr in valid_attrs:
             if attr not in attrs and \
-               self.Namespaces[self.SchemaNamespace].has_key(attr) and \
-               self.Namespaces[self.SchemaNamespace][attr].has_key("default"):
-                if self.Namespaces[self.SchemaNamespace][attr]["default"].has_key(element_name):
+               attr in self.Namespaces[self.SchemaNamespace] and \
+               "default" in self.Namespaces[self.SchemaNamespace][attr]:
+                if element_name in self.Namespaces[self.SchemaNamespace][attr]["default"]:
                     default = self.Namespaces[self.SchemaNamespace][attr]["default"][element_name]
                 else:
                     default = self.Namespaces[self.SchemaNamespace][attr]["default"]["default"]
@@ -892,7 +914,7 @@
         result = []
         for child_infos in elements:
             if child_infos is not None:
-                if child_infos[1].has_key("name") and schema:
+                if "name" in child_infos[1] and schema:
                     self.CurrentCompilations.append(child_infos[1]["name"])
                 namespace, name = DecomposeQualifiedName(child_infos[0])
                 infos = self.GetQualifiedNameInfos(name, namespace)
@@ -901,7 +923,7 @@
                 element = infos["reduce"](self, child_infos[1], child_infos[2])
                 if element is not None:
                     result.append(element)
-                if child_infos[1].has_key("name") and schema:
+                if "name" in child_infos[1] and schema:
                     self.CurrentCompilations.pop(-1)
         annotations = []
         children = []
@@ -913,42 +935,42 @@
         return annotations, children
 
     def AddComplexType(self, typename, infos):
-        if not self.XMLClassDefinitions.has_key(typename):
+        if typename not in self.XMLClassDefinitions:
             self.XMLClassDefinitions[typename] = infos
         else:
             raise ValueError("\"%s\" class already defined. Choose another name!" % typename)
 
     def ParseSchema(self):
         pass
-    
+
     def AddEquivalentClass(self, name, base):
         if name != base:
             equivalences = self.EquivalentClassesParent.setdefault(self.etreeNamespaceFormat % base, {})
             equivalences[self.etreeNamespaceFormat % name] = True
-    
+
     def AddDistinctionBetweenParentsInLookupClass(
-                                    self, lookup_classes, parent, typeinfos):
-        parent = (self.etreeNamespaceFormat % parent 
+            self, lookup_classes, parent, typeinfos):
+        parent = (self.etreeNamespaceFormat % parent
                   if parent is not None else None)
         parent_class = lookup_classes.get(parent)
         if parent_class is not None:
-            if isinstance(parent_class, ListType):
+            if isinstance(parent_class, list):
                 if typeinfos not in parent_class:
                     lookup_classes[parent].append(typeinfos)
             elif parent_class != typeinfos:
                 lookup_classes[parent] = [typeinfos, parent_class]
         else:
             lookup_classes[parent] = typeinfos
-    
+
     def AddToLookupClass(self, name, parent, typeinfos):
         lookup_name = self.etreeNamespaceFormat % name
-        if isinstance(typeinfos, (StringType, UnicodeType)):
+        if isinstance(typeinfos, string_types):
             self.AddEquivalentClass(name, typeinfos)
             typeinfos = self.etreeNamespaceFormat % typeinfos
         lookup_classes = self.ComputedClassesLookUp.get(lookup_name)
         if lookup_classes is None:
             self.ComputedClassesLookUp[lookup_name] = (typeinfos, parent)
-        elif isinstance(lookup_classes, DictType):
+        elif isinstance(lookup_classes, dict):
             self.AddDistinctionBetweenParentsInLookupClass(
                 lookup_classes, parent, typeinfos)
         else:
@@ -958,9 +980,9 @@
             self.AddDistinctionBetweenParentsInLookupClass(
                 lookup_classes, parent, typeinfos)
             self.ComputedClassesLookUp[lookup_name] = lookup_classes
-    
+
     def ExtractTypeInfos(self, name, parent, typeinfos):
-        if isinstance(typeinfos, (StringType, UnicodeType)):
+        if isinstance(typeinfos, string_types):
             namespace, type_name = DecomposeQualifiedName(typeinfos)
             infos = self.GetQualifiedNameInfos(type_name, namespace)
             if name != "base":
@@ -971,13 +993,13 @@
             if infos["type"] == COMPLEXTYPE:
                 type_name, parent = self.SplitQualifiedName(type_name, namespace)
                 result = self.CreateClass(type_name, parent, infos)
-                if result is not None and not isinstance(result, (UnicodeType, StringType)):
+                if result is not None and not isinstance(result, string_types):
                     self.Namespaces[self.TargetNamespace][result["name"]] = result
                 return result
             elif infos["type"] == ELEMENT and infos["elmt_type"]["type"] == COMPLEXTYPE:
                 type_name, parent = self.SplitQualifiedName(type_name, namespace)
                 result = self.CreateClass(type_name, parent, infos["elmt_type"])
-                if result is not None and not isinstance(result, (UnicodeType, StringType)):
+                if result is not None and not isinstance(result, string_types):
                     self.Namespaces[self.TargetNamespace][result["name"]] = result
                 return result
             else:
@@ -986,51 +1008,51 @@
             return self.CreateClass(name, parent, typeinfos)
         elif typeinfos["type"] == SIMPLETYPE:
             return typeinfos
-    
+
     def GetEquivalentParents(self, parent):
         return reduce(lambda x, y: x + y,
-            [[p] + self.GetEquivalentParents(p)
-             for p in self.EquivalentClassesParent.get(parent, {}).keys()], [])
-    
-    """
-    Methods that generates the classes
-    """
+                      [[p] + self.GetEquivalentParents(p)
+                       for p in self.EquivalentClassesParent.get(parent, {}).keys()], [])
+
     def CreateClasses(self):
+        """
+        Method that generates the classes
+        """
         self.ParseSchema()
         for name, infos in self.Namespaces[self.TargetNamespace].items():
             if infos["type"] == ELEMENT:
-                if not isinstance(infos["elmt_type"], (UnicodeType, StringType)) and \
+                if not isinstance(infos["elmt_type"], string_types) and \
                    infos["elmt_type"]["type"] == COMPLEXTYPE:
                     self.ComputeAfter.append((name, None, infos["elmt_type"], True))
                     while len(self.ComputeAfter) > 0:
                         result = self.CreateClass(*self.ComputeAfter.pop(0))
-                        if result is not None and not isinstance(result, (UnicodeType, StringType)):
+                        if result is not None and not isinstance(result, string_types):
                             self.Namespaces[self.TargetNamespace][result["name"]] = result
             elif infos["type"] == COMPLEXTYPE:
                 self.ComputeAfter.append((name, None, infos))
                 while len(self.ComputeAfter) > 0:
                     result = self.CreateClass(*self.ComputeAfter.pop(0))
                     if result is not None and \
-                       not isinstance(result, (UnicodeType, StringType)):
+                       not isinstance(result, string_types):
                         self.Namespaces[self.TargetNamespace][result["name"]] = result
             elif infos["type"] == ELEMENTSGROUP:
                 elements = []
-                if infos.has_key("elements"):
+                if "elements" in infos:
                     elements = infos["elements"]
-                elif infos.has_key("choices"):
+                elif "choices" in infos:
                     elements = infos["choices"]
                 for element in elements:
-                    if not isinstance(element["elmt_type"], (UnicodeType, StringType)) and \
+                    if not isinstance(element["elmt_type"], string_types) and \
                        element["elmt_type"]["type"] == COMPLEXTYPE:
                         self.ComputeAfter.append((element["name"], infos["name"], element["elmt_type"]))
                         while len(self.ComputeAfter) > 0:
                             result = self.CreateClass(*self.ComputeAfter.pop(0))
                             if result is not None and \
-                               not isinstance(result, (UnicodeType, StringType)):
+                               not isinstance(result, string_types):
                                 self.Namespaces[self.TargetNamespace][result["name"]] = result
-        
+
         for name, parents in self.ComputedClassesLookUp.iteritems():
-            if isinstance(parents, DictType):
+            if isinstance(parents, dict):
                 computed_classes = parents.items()
             elif parents[1] is not None:
                 computed_classes = [(self.etreeNamespaceFormat % parents[1], parents[0])]
@@ -1038,23 +1060,23 @@
                 computed_classes = []
             for parent, computed_class in computed_classes:
                 for equivalent_parent in self.GetEquivalentParents(parent):
-                    if not isinstance(parents, DictType):
+                    if not isinstance(parents, dict):
                         parents = dict(computed_classes)
                         self.ComputedClassesLookUp[name] = parents
                     parents[equivalent_parent] = computed_class
-        
+
         return self.ComputedClasses
 
-    def CreateClass(self, name, parent, classinfos, baseclass = False):
+    def CreateClass(self, name, parent, classinfos, baseclass=False):
         if parent is not None:
             classname = "%s_%s" % (parent, name)
         else:
             classname = name
-        
+
         # Checks that classe haven't been generated yet
         if self.AlreadyComputed.get(classname, False):
             return self.ComputedClassesInfos.get(classname, None)
-        
+
         # If base classes haven't been generated
         bases = []
         base_infos = classinfos.get("base", None)
@@ -1088,29 +1110,29 @@
         bases.append(DefaultElementClass)
         bases = tuple(bases)
         classmembers = {"__doc__": classinfos.get("doc", ""), "IsBaseClass": baseclass}
-        
+
         self.AlreadyComputed[classname] = True
-        
+
         for attribute in classinfos["attributes"]:
             infos = self.ExtractTypeInfos(attribute["name"], name, attribute["attr_type"])
-            if infos is not None:                    
+            if infos is not None:
                 if infos["type"] != SIMPLETYPE:
                     raise ValueError("\"%s\" type is not a simple type!" % attribute["attr_type"])
                 attrname = attribute["name"]
                 if attribute["use"] == "optional":
-                    classmembers["add%s"%attrname] = generateAddMethod(attrname, self, attribute)
-                    classmembers["delete%s"%attrname] = generateDeleteMethod(attrname)
-                classmembers["set%s"%attrname] = generateSetMethod(attrname)
-                classmembers["get%s"%attrname] = generateGetMethod(attrname)
+                    classmembers["add%s" % attrname] = generateAddMethod(attrname, self, attribute)
+                    classmembers["delete%s" % attrname] = generateDeleteMethod(attrname)
+                classmembers["set%s" % attrname] = generateSetMethod(attrname)
+                classmembers["get%s" % attrname] = generateGetMethod(attrname)
             else:
                 raise ValueError("\"%s\" type unrecognized!" % attribute["attr_type"])
             attribute["attr_type"] = infos
-        
+
         for element in classinfos["elements"]:
             if element["type"] == CHOICE:
                 elmtname = element["name"]
                 choices = ComputeContentChoices(self, name, element)
-                classmembers["get%schoices"%elmtname] = generateGetChoicesMethod(element["choices"])
+                classmembers["get%schoices" % elmtname] = generateGetChoicesMethod(element["choices"])
                 if element["maxOccurs"] == "unbounded" or element["maxOccurs"] > 1:
                     classmembers["append%sbytype" % elmtname] = generateAppendChoiceByTypeMethod(element["maxOccurs"], self, element["choices"])
                     classmembers["insert%sbytype" % elmtname] = generateInsertChoiceByTypeMethod(element["maxOccurs"], self, element["choices"])
@@ -1141,60 +1163,61 @@
                     classmembers["delete%s" % elmtname] = generateDeleteMethod(elmtname)
             classmembers["set%s" % elmtname] = generateSetMethod(elmtname)
             classmembers["get%s" % elmtname] = generateGetMethod(elmtname)
-            
+
         classmembers["_init_"] = generateInitMethod(self, classinfos)
         classmembers["StructurePattern"] = GetStructurePattern(classinfos)
         classmembers["getElementAttributes"] = generateGetElementAttributes(self, classinfos)
         classmembers["getElementInfos"] = generateGetElementInfos(self, classinfos)
         classmembers["setElementValue"] = generateSetElementValue(self, classinfos)
-        
-        class_definition = classobj(str(name), bases, classmembers)
+
+        class_definition = type(str(name), bases, classmembers)
         setattr(class_definition, "__getattr__", generateGetattrMethod(self, class_definition, classinfos))
         setattr(class_definition, "__setattr__", generateSetattrMethod(self, class_definition, classinfos))
-        class_infos = {"type": COMPILEDCOMPLEXTYPE,
-                       "name": classname,
-                       "initial": generateClassCreateFunction(class_definition),
+        class_infos = {
+            "type": COMPILEDCOMPLEXTYPE,
+            "name": classname,
+            "initial": generateClassCreateFunction(self, class_definition),
         }
-        
         if self.FileName is not None:
             self.ComputedClasses[self.FileName][classname] = class_definition
         else:
             self.ComputedClasses[classname] = class_definition
         self.ComputedClassesInfos[classname] = class_infos
-        
+
         self.AddToLookupClass(name, parent, class_definition)
         self.AddToLookupClass(classname, None, class_definition)
-            
+
         return class_infos
 
-    """
-    Methods that print the classes generated
-    """
     def PrintClasses(self):
+        """
+        Method that print the classes generated
+        """
         items = self.ComputedClasses.items()
         items.sort()
         if self.FileName is not None:
             for filename, classes in items:
-                print "File '%s':" % filename
+                print("File '%s':" % filename)
                 class_items = classes.items()
                 class_items.sort()
                 for classname, xmlclass in class_items:
-                    print "%s: %s" % (classname, str(xmlclass))
+                    print("%s: %s" % (classname, str(xmlclass)))
         else:
             for classname, xmlclass in items:
-                print "%s: %s" % (classname, str(xmlclass))
-        
+                print("%s: %s" % (classname, str(xmlclass)))
+
     def PrintClassNames(self):
         classnames = self.XMLClassDefinitions.keys()
         classnames.sort()
         for classname in classnames:
-            print classname
-
-"""
-Method that generate the method for generating the xml tree structure model by 
-following the attributes list defined
-"""
+            print(classname)
+
+
 def ComputeMultiplicity(name, infos):
+    """
+    Method that generate the method for generating the xml tree structure model by
+    following the attributes list defined
+    """
     if infos["minOccurs"] == 0:
         if infos["maxOccurs"] == "unbounded":
             return "(?:%s)*" % name
@@ -1211,21 +1234,23 @@
             return "(?:%s){1,%d}" % (name, infos["maxOccurs"])
     else:
         if infos["maxOccurs"] == "unbounded":
-            return "(?:%s){%d,}" % (name, infos["minOccurs"], name)
-        else:
-            return "(?:%s){%d,%d}" % (name, infos["minOccurs"], 
-                                       infos["maxOccurs"])
+            return "(?:%s){%d,}" % (name, infos["minOccurs"])
+        else:
+            return "(?:%s){%d,%d}" % (name,
+                                      infos["minOccurs"],
+                                      infos["maxOccurs"])
+
 
 def GetStructurePattern(classinfos):
     base_structure_pattern = (
         classinfos["base"].StructurePattern.pattern[:-1]
-        if classinfos.has_key("base") else "")
+        if "base" in classinfos else "")
     elements = []
     for element in classinfos["elements"]:
         if element["type"] == ANY:
             infos = element.copy()
             infos["minOccurs"] = 0
-            elements.append(ComputeMultiplicity("#text |#cdata-section |\w* ", infos))
+            elements.append(ComputeMultiplicity(r"#text |#cdata-section |\w* ", infos))
         elif element["type"] == CHOICE:
             choices = []
             for infos in element["choices"]:
@@ -1244,33 +1269,34 @@
     else:
         raise ValueError("XSD structure not yet supported!")
 
-"""
-Method that generate the method for creating a class instance
-"""
-def generateClassCreateFunction(class_definition):
+
+def generateClassCreateFunction(factory, class_definition):
+    """
+    Method that generate the method for creating a class instance
+    """
     def classCreatefunction():
-        return class_definition()
+        return factory.Parser.CreateElementFromClass(class_definition)
     return classCreatefunction
 
+
 def generateGetattrMethod(factory, class_definition, classinfos):
     attributes = dict([(attr["name"], attr) for attr in classinfos["attributes"] if attr["use"] != "prohibited"])
-    optional_attributes = dict([(attr["name"], True) for attr in classinfos["attributes"] if attr["use"] == "optional"])
     elements = dict([(element["name"], element) for element in classinfos["elements"]])
-    
+
     def getattrMethod(self, name):
-        if attributes.has_key(name):
+        if name in attributes:
             attribute_infos = attributes[name]
             attribute_infos["attr_type"] = FindTypeInfos(factory, attribute_infos["attr_type"])
             value = self.get(name)
             if value is not None:
                 return attribute_infos["attr_type"]["extract"](value, extract=False)
-            elif attribute_infos.has_key("fixed"):
+            elif "fixed" in attribute_infos:
                 return attribute_infos["attr_type"]["extract"](attribute_infos["fixed"], extract=False)
-            elif attribute_infos.has_key("default"):
+            elif "default" in attribute_infos:
                 return attribute_infos["attr_type"]["extract"](attribute_infos["default"], extract=False)
             return None
-        
-        elif elements.has_key(name):
+
+        elif name in elements:
             element_infos = elements[name]
             element_infos["elmt_type"] = FindTypeInfos(factory, element_infos["elmt_type"])
             if element_infos["type"] == CHOICE:
@@ -1279,7 +1305,7 @@
                     return content
                 elif len(content) > 0:
                     return content[0]
-                return None 
+                return None
             elif element_infos["type"] == ANY:
                 return element_infos["elmt_type"]["extract"](self)
             elif name == "content" and element_infos["elmt_type"]["type"] == SIMPLETYPE:
@@ -1290,29 +1316,30 @@
                     values = self.findall(element_name)
                     if element_infos["elmt_type"]["type"] == SIMPLETYPE:
                         return map(lambda value:
-                            element_infos["elmt_type"]["extract"](value.text, extract=False), 
-                            values)
+                                   element_infos["elmt_type"]["extract"](value.text, extract=False),
+                                   values)
                     return values
                 else:
                     value = self.find(element_name)
                     if element_infos["elmt_type"]["type"] == SIMPLETYPE:
                         return element_infos["elmt_type"]["extract"](value.text, extract=False)
                     return value
-            
-        elif classinfos.has_key("base"):
+
+        elif "base" in classinfos:
             return classinfos["base"].__getattr__(self, name)
-        
+
         return DefaultElementClass.__getattribute__(self, name)
-    
+
     return getattrMethod
 
+
 def generateSetattrMethod(factory, class_definition, classinfos):
     attributes = dict([(attr["name"], attr) for attr in classinfos["attributes"] if attr["use"] != "prohibited"])
     optional_attributes = dict([(attr["name"], True) for attr in classinfos["attributes"] if attr["use"] == "optional"])
     elements = OrderedDict([(element["name"], element) for element in classinfos["elements"]])
-    
+
     def setattrMethod(self, name, value):
-        if attributes.has_key(name):
+        if name in attributes:
             attribute_infos = attributes[name]
             attribute_infos["attr_type"] = FindTypeInfos(factory, attribute_infos["attr_type"])
             if optional_attributes.get(name, False):
@@ -1320,65 +1347,66 @@
                 if value is None or value == default:
                     self.attrib.pop(name, None)
                     return
-            elif attribute_infos.has_key("fixed"):
+            elif "fixed" in attribute_infos:
                 return
             return self.set(name, attribute_infos["attr_type"]["generate"](value))
-        
-        elif elements.has_key(name):
+
+        elif name in elements:
             element_infos = elements[name]
             element_infos["elmt_type"] = FindTypeInfos(factory, element_infos["elmt_type"])
             if element_infos["type"] == ANY:
                 element_infos["elmt_type"]["generate"](self, value)
-            
+
             elif name == "content" and element_infos["elmt_type"]["type"] == SIMPLETYPE:
                 self.text = element_infos["elmt_type"]["generate"](value)
-            
+
             else:
                 prefix = ("%s:" % factory.TargetNamespace
                           if factory.TargetNamespace is not None else "")
                 element_xpath = (prefix + name
                                  if name != "content"
                                  else elements["content"]["elmt_type"]["choices_xpath"].path)
-                
+
                 for element in self.xpath(element_xpath, namespaces=factory.NSMAP):
                     self.remove(element)
-                
+
                 if value is not None:
                     element_idx = elements.keys().index(name)
                     if element_idx > 0:
                         previous_elements_xpath = "|".join(map(
                             lambda x: prefix + x
-                                      if x != "content"
-                                      else elements["content"]["elmt_type"]["choices_xpath"].path,
+                            if x != "content"
+                            else elements["content"]["elmt_type"]["choices_xpath"].path,
                             elements.keys()[:element_idx]))
-                        
+
                         insertion_point = len(self.xpath(previous_elements_xpath, namespaces=factory.NSMAP))
                     else:
                         insertion_point = 0
-                    
-                    if not isinstance(value, ListType):
+
+                    if not isinstance(value, list):
                         value = [value]
-                    
+
                     for element in reversed(value):
                         if element_infos["elmt_type"]["type"] == SIMPLETYPE:
-                            tmp_element = etree.Element(factory.etreeNamespaceFormat % name)
+                            tmp_element = factory.Parser.makeelement(factory.etreeNamespaceFormat % name)
                             tmp_element.text = element_infos["elmt_type"]["generate"](element)
                             element = tmp_element
                         self.insert(insertion_point, element)
-        
-        elif classinfos.has_key("base"):
+
+        elif "base" in classinfos:
             return classinfos["base"].__setattr__(self, name, value)
-        
+
         else:
             raise AttributeError("'%s' can't have an attribute '%s'." % (self.__class__.__name__, name))
-        
+
     return setattrMethod
 
+
 def gettypeinfos(name, facets):
-    if facets.has_key("enumeration") and facets["enumeration"][0] is not None:
+    if "enumeration" in facets and facets["enumeration"][0] is not None:
         return facets["enumeration"][0]
-    elif facets.has_key("maxInclusive"):
-        limits = {"max" : None, "min" : None}
+    elif "maxInclusive" in facets:
+        limits = {"max": None, "min": None}
         if facets["maxInclusive"][0] is not None:
             limits["max"] = facets["maxInclusive"][0]
         elif facets["maxExclusive"][0] is not None:
@@ -1391,24 +1419,28 @@
             return limits
     return name
 
+
 def generateGetElementAttributes(factory, classinfos):
     def getElementAttributes(self):
         attr_list = []
-        if classinfos.has_key("base"):
+        if "base" in classinfos:
             attr_list.extend(classinfos["base"].getElementAttributes(self))
         for attr in classinfos["attributes"]:
             if attr["use"] != "prohibited":
-                attr_params = {"name" : attr["name"], "use" : attr["use"], 
-                    "type" : gettypeinfos(attr["attr_type"]["basename"], attr["attr_type"]["facets"]),
-                    "value" : getattr(self, attr["name"], "")}
+                attr_params = {
+                    "name": attr["name"],
+                    "use": attr["use"],
+                    "type": gettypeinfos(attr["attr_type"]["basename"], attr["attr_type"]["facets"]),
+                    "value": getattr(self, attr["name"], "")}
                 attr_list.append(attr_params)
         return attr_list
     return getElementAttributes
 
+
 def generateGetElementInfos(factory, classinfos):
     attributes = dict([(attr["name"], attr) for attr in classinfos["attributes"] if attr["use"] != "prohibited"])
     elements = dict([(element["name"], element) for element in classinfos["elements"]])
-    
+
     def getElementInfos(self, name, path=None, derived=False):
         attr_type = "element"
         value = None
@@ -1416,17 +1448,17 @@
         children = []
         if path is not None:
             parts = path.split(".", 1)
-            if attributes.has_key(parts[0]):
+            if parts[0] in attributes:
                 if len(parts) != 1:
                     raise ValueError("Wrong path!")
-                attr_type = gettypeinfos(attributes[parts[0]]["attr_type"]["basename"], 
+                attr_type = gettypeinfos(attributes[parts[0]]["attr_type"]["basename"],
                                          attributes[parts[0]]["attr_type"]["facets"])
                 value = getattr(self, parts[0], "")
-            elif elements.has_key(parts[0]):
+            elif parts[0] in elements:
                 if elements[parts[0]]["elmt_type"]["type"] == SIMPLETYPE:
                     if len(parts) != 1:
                         raise ValueError("Wrong path!")
-                    attr_type = gettypeinfos(elements[parts[0]]["elmt_type"]["basename"], 
+                    attr_type = gettypeinfos(elements[parts[0]]["elmt_type"]["basename"],
                                              elements[parts[0]]["elmt_type"]["facets"])
                     value = getattr(self, parts[0], "")
                 elif parts[0] == "content":
@@ -1439,17 +1471,17 @@
                         return attr.getElementInfos(parts[0])
                     else:
                         return attr.getElementInfos(parts[0], parts[1])
-            elif elements.has_key("content"):
+            elif "content" in elements:
                 if len(parts) > 0:
                     return self.content.getElementInfos(name, path)
-            elif classinfos.has_key("base"):
+            elif "base" in classinfos:
                 classinfos["base"].getElementInfos(name, path)
             else:
                 raise ValueError("Wrong path!")
         else:
             if not derived:
                 children.extend(self.getElementAttributes())
-            if classinfos.has_key("base"):
+            if "base" in classinfos:
                 children.extend(classinfos["base"].getElementInfos(self, name, derived=True)["children"])
             for element_name, element in elements.items():
                 if element["minOccurs"] == 0:
@@ -1463,8 +1495,10 @@
                         if self.content is not None:
                             children.extend(self.content.getElementInfos(value)["children"])
                 elif element["elmt_type"]["type"] == SIMPLETYPE:
-                    children.append({"name": element_name, "require": element["minOccurs"] != 0, 
-                        "type": gettypeinfos(element["elmt_type"]["basename"], 
+                    children.append({
+                        "name": element_name,
+                        "require": element["minOccurs"] != 0,
+                        "type": gettypeinfos(element["elmt_type"]["basename"],
                                              element["elmt_type"]["facets"]),
                         "value": getattr(self, element_name, None)})
                 else:
@@ -1475,28 +1509,29 @@
         return {"name": name, "type": attr_type, "value": value, "use": use, "children": children}
     return getElementInfos
 
+
 def generateSetElementValue(factory, classinfos):
     attributes = dict([(attr["name"], attr) for attr in classinfos["attributes"] if attr["use"] != "prohibited"])
     elements = dict([(element["name"], element) for element in classinfos["elements"]])
-    
+
     def setElementValue(self, path, value):
         if path is not None:
             parts = path.split(".", 1)
-            if attributes.has_key(parts[0]):
+            if parts[0] in attributes:
                 if len(parts) != 1:
                     raise ValueError("Wrong path!")
                 if attributes[parts[0]]["attr_type"]["basename"] == "boolean":
                     setattr(self, parts[0], value)
                 elif attributes[parts[0]]["use"] == "optional" and value == "":
-                    if attributes[parts[0]].has_key("default"):
-                        setattr(self, parts[0], 
-                            attributes[parts[0]]["attr_type"]["extract"](
-                                attributes[parts[0]]["default"], False))
+                    if "default" in attributes[parts[0]]:
+                        setattr(self, parts[0],
+                                attributes[parts[0]]["attr_type"]["extract"](
+                                    attributes[parts[0]]["default"], False))
                     else:
                         setattr(self, parts[0], None)
                 else:
                     setattr(self, parts[0], attributes[parts[0]]["attr_type"]["extract"](value, False))
-            elif elements.has_key(parts[0]):
+            elif parts[0] in elements:
                 if elements[parts[0]]["elmt_type"]["type"] == SIMPLETYPE:
                     if len(parts) != 1:
                         raise ValueError("Wrong path!")
@@ -1511,17 +1546,17 @@
                     if instance is None and elements[parts[0]]["minOccurs"] == 0:
                         instance = elements[parts[0]]["elmt_type"]["initial"]()
                         setattr(self, parts[0], instance)
-                    if instance != None:
+                    if instance is not None:
                         if len(parts) > 1:
                             instance.setElementValue(parts[1], value)
                         else:
                             instance.setElementValue(None, value)
-            elif elements.has_key("content"):
+            elif "content" in elements:
                 if len(parts) > 0:
                     self.content.setElementValue(path, value)
-            elif classinfos.has_key("base"):
+            elif "base" in classinfos:
                 classinfos["base"].setElementValue(self, path, value)
-        elif elements.has_key("content"):
+        elif "content" in elements:
             if value == "":
                 if elements["content"]["minOccurs"] == 0:
                     self.setcontent([])
@@ -1531,12 +1566,14 @@
                 self.setcontentbytype(value)
     return setElementValue
 
-"""
-Methods that generates the different methods for setting and getting the attributes
-"""
+
 def generateInitMethod(factory, classinfos):
+    """
+    Methods that generates the different methods for setting and getting the attributes
+    """
+
     def initMethod(self):
-        if classinfos.has_key("base"):
+        if "base" in classinfos:
             classinfos["base"]._init_(self)
         for attribute in classinfos["attributes"]:
             attribute["attr_type"] = FindTypeInfos(factory, attribute["attr_type"])
@@ -1544,30 +1581,29 @@
                 self.set(attribute["name"], attribute["attr_type"]["generate"](attribute["attr_type"]["initial"]()))
         for element in classinfos["elements"]:
             if element["type"] != CHOICE:
-                element_name = (
-                    etree.QName(factory.NSMAP["xhtml"], "p")
-                    if element["type"] == ANY
-                    else factory.etreeNamespaceFormat % element["name"])
                 initial = GetElementInitialValue(factory, element)
                 if initial is not None:
                     map(self.append, initial)
     return initMethod
 
+
 def generateSetMethod(attr):
     def setMethod(self, value):
         setattr(self, attr, value)
     return setMethod
 
+
 def generateGetMethod(attr):
     def getMethod(self):
         return getattr(self, attr, None)
     return getMethod
 
+
 def generateAddMethod(attr, factory, infos):
     def addMethod(self):
         if infos["type"] == ATTRIBUTE:
             infos["attr_type"] = FindTypeInfos(factory, infos["attr_type"])
-            if not infos.has_key("default"):
+            if "default" not in infos:
                 setattr(self, attr, infos["attr_type"]["initial"]())
         elif infos["type"] == ELEMENT:
             infos["elmt_type"] = FindTypeInfos(factory, infos["elmt_type"])
@@ -1579,11 +1615,13 @@
             raise ValueError("Invalid class attribute!")
     return addMethod
 
+
 def generateDeleteMethod(attr):
     def deleteMethod(self):
         setattr(self, attr, None)
     return deleteMethod
 
+
 def generateAppendMethod(attr, maxOccurs, factory, infos):
     def appendMethod(self, value):
         infos["elmt_type"] = FindTypeInfos(factory, infos["elmt_type"])
@@ -1597,6 +1635,7 @@
             raise ValueError("There can't be more than %d values in \"%s\"!" % (maxOccurs, attr))
     return appendMethod
 
+
 def generateInsertMethod(attr, maxOccurs, factory, infos):
     def insertMethod(self, index, value):
         infos["elmt_type"] = FindTypeInfos(factory, infos["elmt_type"])
@@ -1612,15 +1651,18 @@
             raise ValueError("There can't be more than %d values in \"%s\"!" % (maxOccurs, attr))
     return insertMethod
 
+
 def generateGetChoicesMethod(choice_types):
     def getChoicesMethod(self):
         return [choice["name"] for choice in choice_types]
     return getChoicesMethod
 
+
 def generateSetChoiceByTypeMethod(factory, choice_types):
     choices = dict([(choice["name"], choice) for choice in choice_types])
+
     def setChoiceMethod(self, content_type):
-        if not choices.has_key(content_type):
+        if content_type not in choices:
             raise ValueError("Unknown \"%s\" choice type for \"content\"!" % content_type)
         choices[content_type]["elmt_type"] = FindTypeInfos(factory, choices[content_type]["elmt_type"])
         new_content = choices[content_type]["elmt_type"]["initial"]()
@@ -1629,10 +1671,12 @@
         return new_content
     return setChoiceMethod
 
+
 def generateAppendChoiceByTypeMethod(maxOccurs, factory, choice_types):
     choices = dict([(choice["name"], choice) for choice in choice_types])
+
     def appendChoiceMethod(self, content_type):
-        if not choices.has_key(content_type):
+        if content_type not in choices:
             raise ValueError("Unknown \"%s\" choice type for \"content\"!" % content_type)
         choices[content_type]["elmt_type"] = FindTypeInfos(factory, choices[content_type]["elmt_type"])
         if maxOccurs == "unbounded" or len(self.content) < maxOccurs:
@@ -1644,10 +1688,12 @@
             raise ValueError("There can't be more than %d values in \"content\"!" % maxOccurs)
     return appendChoiceMethod
 
+
 def generateInsertChoiceByTypeMethod(maxOccurs, factory, choice_types):
     choices = dict([(choice["name"], choice) for choice in choice_types])
+
     def insertChoiceMethod(self, index, content_type):
-        if not choices.has_key(content_type):
+        if content_type not in choices:
             raise ValueError("Unknown \"%s\" choice type for \"content\"!" % content_type)
         choices[type]["elmt_type"] = FindTypeInfos(factory, choices[content_type]["elmt_type"])
         if maxOccurs == "unbounded" or len(self.content) < maxOccurs:
@@ -1659,6 +1705,7 @@
             raise ValueError("There can't be more than %d values in \"content\"!" % maxOccurs)
     return insertChoiceMethod
 
+
 def generateRemoveMethod(attr, minOccurs):
     def removeMethod(self, index):
         attr_list = getattr(self, attr)
@@ -1668,68 +1715,121 @@
             raise ValueError("There can't be less than %d values in \"%s\"!" % (minOccurs, attr))
     return removeMethod
 
+
 def generateCountMethod(attr):
     def countMethod(self):
         return len(getattr(self, attr))
     return countMethod
 
-"""
-This function generate a xml parser from a class factory
-"""
-
-NAMESPACE_PATTERN = re.compile("xmlns(?:\:[^\=]*)?=\"[^\"]*\" ")
+
+NAMESPACE_PATTERN = re.compile(r"xmlns(?:\:[^\=]*)?=\"[^\"]*\" ")
+
 
 class DefaultElementClass(etree.ElementBase):
-    
+
     StructurePattern = re.compile("$")
-    
+
     def _init_(self):
         pass
-    
+
     def getLocalTag(self):
         return etree.QName(self.tag).localname
-        
+
     def tostring(self):
         return NAMESPACE_PATTERN.sub("", etree.tostring(self, pretty_print=True, encoding='utf-8')).decode('utf-8')
 
+
 class XMLElementClassLookUp(etree.PythonElementClassLookup):
-    
+
     def __init__(self, classes, *args, **kwargs):
         etree.PythonElementClassLookup.__init__(self, *args, **kwargs)
         self.LookUpClasses = classes
-    
+        self.ElementTag = None
+        self.ElementClass = None
+
     def GetElementClass(self, element_tag, parent_tag=None, default=DefaultElementClass):
         element_class = self.LookUpClasses.get(element_tag, (default, None))
-        if not isinstance(element_class, DictType):
-            if isinstance(element_class[0], (StringType, UnicodeType)):
+        if not isinstance(element_class, dict):
+            if isinstance(element_class[0], string_types):
                 return self.GetElementClass(element_class[0], default=default)
             return element_class[0]
-        
+
         element_with_parent_class = element_class.get(parent_tag, default)
-        if isinstance(element_with_parent_class, (StringType, UnicodeType)):
+        if isinstance(element_with_parent_class, string_types):
             return self.GetElementClass(element_with_parent_class, default=default)
         return element_with_parent_class
-        
+
+    def SetLookupResult(self, element, element_class):
+        """
+        Set lookup result for the next 'lookup' callback made by lxml backend.
+        Lookup result is used only if element matches with tag's name submited to 'lookup'.
+        This is done, because there is no way to submit extra search parameters for
+        etree.PythonElementClassLookup.lookup() from etree.XMLParser.makeelement()
+        It's valid only for a signle 'lookup' call.
+
+        :param element:
+            element's tag name
+        :param element_class:
+            element class that should be returned on
+            match in the next 'lookup' call.
+        :return:
+            Nothing
+        """
+        self.ElementTag = element
+        self.ElementClass = element_class
+
+    def ResetLookupResult(self):
+        """Reset lookup result, so it don't influence next lookups"""
+        self.ElementTag = None
+        self.ElementClass = None
+
+    def GetLookupResult(self, element):
+        """Returns previously set SetLookupResult() lookup result"""
+        element_class = None
+        if self.ElementTag is not None and self.ElementTag == element.tag:
+            element_class = self.ElementClass
+        self.ResetLookupResult()
+        return element_class
+
     def lookup(self, document, element):
+        """
+        Lookup for element class for given element tag.
+        If return None from this method, the fallback is called.
+
+        :param document:
+            opaque document instance that contains the Element
+        :param element:
+            lightweight Element proxy implementation that is only valid during the lookup.
+            Do not try to keep a reference to it.
+            Once the lookup is done, the proxy will be invalid.
+        :return:
+            Returns element class corresponding to given element.
+        """
+        element_class = self.GetLookupResult(element)
+        if element_class is not None:
+            return element_class
+
         parent = element.getparent()
-        element_class = self.GetElementClass(element.tag, 
-            parent.tag if parent is not None else None)
-        if isinstance(element_class, ListType):
+        element_class = self.GetElementClass(
+            element.tag, parent.tag if parent is not None else None)
+        if isinstance(element_class, list):
             children = "".join([
                 "%s " % etree.QName(child.tag).localname
                 for child in element])
             for possible_class in element_class:
-                if isinstance(possible_class, (StringType, UnicodeType)):
+                if isinstance(possible_class, string_types):
                     possible_class = self.GetElementClass(possible_class)
                 if possible_class.StructurePattern.match(children) is not None:
                     return possible_class
             return element_class[0]
         return element_class
 
+
 class XMLClassParser(etree.XMLParser):
-
-    def __init__(self, namespaces, default_namespace_format, base_class, xsd_schema, *args, **kwargs):
+    def __init__(self, *args, **kwargs):
         etree.XMLParser.__init__(self, *args, **kwargs)
+
+    def initMembers(self, namespaces, default_namespace_format, base_class, xsd_schema):
         self.DefaultNamespaceFormat = default_namespace_format
         self.NSMAP = namespaces
         targetNamespace = etree.QName(default_namespace_format % "d").namespace
@@ -1741,24 +1841,24 @@
             self.RootNSMAP = namespaces
         self.BaseClass = base_class
         self.XSDSchema = xsd_schema
-    
+
     def set_element_class_lookup(self, class_lookup):
         etree.XMLParser.set_element_class_lookup(self, class_lookup)
         self.ClassLookup = class_lookup
-    
+
     def LoadXMLString(self, xml_string):
         tree = etree.fromstring(xml_string, self)
         if not self.XSDSchema.validate(tree):
             error = self.XSDSchema.error_log.last_error
             return tree, (error.line, error.message)
-        return tree, None 
-    
+        return tree, None
+
     def Dumps(self, xml_obj):
         return etree.tostring(xml_obj, encoding='utf-8')
-    
+
     def Loads(self, xml_string):
         return etree.fromstring(xml_string, self)
-    
+
     def CreateRoot(self):
         if self.BaseClass is not None:
             root = self.makeelement(
@@ -1767,42 +1867,87 @@
             root._init_()
             return root
         return None
-    
+
     def GetElementClass(self, element_tag, parent_tag=None):
         return self.ClassLookup.GetElementClass(
-            self.DefaultNamespaceFormat % element_tag, 
-            self.DefaultNamespaceFormat % parent_tag 
-            if parent_tag is not None else parent_tag, 
+            self.DefaultNamespaceFormat % element_tag,
+            self.DefaultNamespaceFormat % parent_tag
+            if parent_tag is not None else parent_tag,
             None)
-    
+
     def CreateElement(self, element_tag, parent_tag=None, class_idx=None):
+        """
+        Create XML element based on elements and parent's tag names.
+
+        :param element_tag:
+            element's tag name
+        :param parent_tag:
+            optional parent's tag name. Default value is None.
+        :param class_idx:
+            optional index of class in list of founded classes
+            with same element and parent. Default value is None.
+        :return:
+            created XML element
+            (subclass of lxml.etree._Element created by class factory)
+        """
         element_class = self.GetElementClass(element_tag, parent_tag)
-        if isinstance(element_class, ListType):
+        if isinstance(element_class, list):
             if class_idx is not None and class_idx < len(element_class):
-                new_element = element_class[class_idx]()
+                element_class = element_class[class_idx]
             else:
-                raise ValueError, "No corresponding class found!"
-        else:
-            new_element = element_class()
+                raise ValueError("No corresponding class found!")
+        return self.CreateElementFromClass(element_class, element_tag)
+
+    def CreateElementFromClass(self, element_class, element_tag=None):
+        """
+        Create XML element instance of submitted element's class.
+        Submitted class should be subclass of lxml.etree._Element.
+
+        element_class shouldn't be used to create XML element
+        directly using element_class(), because lxml backend
+        should be aware what class handles what xml element,
+        otherwise default lxml.etree._Element will be used.
+
+        :param element_class:
+            element class
+        :param element_tag:
+            optional element's tag name.
+            If omitted it's calculated from element_class instance.
+        :return:
+            created XML element
+            (subclass of lxml.etree._Element created by class factory)
+        """
+        if element_tag is None:
+            element_tag = element_class().tag
+        etag = self.DefaultNamespaceFormat % element_tag
+        self.ClassLookup.SetLookupResult(etag, element_class)
+        new_element = self.makeelement(etag)
+        self.ClassLookup.ResetLookupResult()
         DefaultElementClass.__setattr__(new_element, "tag", self.DefaultNamespaceFormat % element_tag)
         new_element._init_()
         return new_element
-    
+
+
 def GenerateParser(factory, xsdstring):
+    """
+    This function generate a xml parser from a class factory
+    """
+
+    parser = XMLClassParser(strip_cdata=False, remove_blank_text=True)
+    factory.Parser = parser
+
     ComputedClasses = factory.CreateClasses()
-    
     if factory.FileName is not None:
         ComputedClasses = ComputedClasses[factory.FileName]
     BaseClass = [(name, XSDclass) for name, XSDclass in ComputedClasses.items() if XSDclass.IsBaseClass]
-       
-    parser = XMLClassParser(
+
+    parser.initMembers(
         factory.NSMAP,
         factory.etreeNamespaceFormat,
         BaseClass[0] if len(BaseClass) == 1 else None,
-        etree.XMLSchema(etree.fromstring(xsdstring)),
-        strip_cdata = False, remove_blank_text=True)
+        etree.XMLSchema(etree.fromstring(xsdstring)))
+
     class_lookup = XMLElementClassLookUp(factory.ComputedClassesLookUp)
     parser.set_element_class_lookup(class_lookup)
-    
+
     return parser
-
--- a/xmlclass/xsdschema.py	Sat Jun 02 11:56:01 2018 +0100
+++ b/xmlclass/xsdschema.py	Mon Jan 07 13:50:39 2019 +0100
@@ -22,21 +22,30 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
-import os, re
+
+from __future__ import absolute_import
+from __future__ import print_function
+import os
+import re
 import datetime
+from types import FunctionType
 from xml.dom import minidom
-from types import *
-
-from xmlclass import *
+from future.builtins import round
+from six import string_types
+from past.builtins import long
+
+from xmlclass.xmlclass import *
+
 
 def GenerateDictFacets(facets):
     return dict([(name, (None, False)) for name in facets])
 
+
 def GenerateSimpleTypeXMLText(function):
     def generateXMLTextMethod(value, name=None, indent=0):
         text = ""
         if name is not None:
-            ind1, ind2 = getIndent(indent, name)
+            ind1, _ind2 = getIndent(indent, name)
             text += ind1 + "<%s>" % name
         text += function(value)
         if name is not None:
@@ -44,15 +53,18 @@
         return text
     return generateXMLTextMethod
 
-def GenerateFloatXMLText(extra_values=[], decimal=None):
+
+def GenerateFloatXMLText(extra_values=None, decimal=None):
     float_format = (lambda x: "{:.{width}f}".format(x, width=decimal).rstrip('0')
                     if decimal is not None else str)
+    extra_values = [] if extra_values is None else extra_values
+
     def generateXMLTextMethod(value, name=None, indent=0):
         text = ""
         if name is not None:
-            ind1, ind2 = getIndent(indent, name)
+            ind1, _ind2 = getIndent(indent, name)
             text += ind1 + "<%s>" % name
-        if isinstance(value, IntType):
+        if isinstance(value, int):
             text += str(value)
         elif value in extra_values or value % 1 != 0:
             text += float_format(value)
@@ -62,46 +74,47 @@
             text += "</%s>\n" % name
         return text
     return generateXMLTextMethod
-        
+
+
 DEFAULT_FACETS = GenerateDictFacets(["pattern", "whiteSpace", "enumeration"])
 NUMBER_FACETS = GenerateDictFacets(DEFAULT_FACETS.keys() + ["maxInclusive", "maxExclusive", "minInclusive", "minExclusive"])
 DECIMAL_FACETS = GenerateDictFacets(NUMBER_FACETS.keys() + ["totalDigits", "fractionDigits"])
 STRING_FACETS = GenerateDictFacets(DEFAULT_FACETS.keys() + ["length", "minLength", "maxLength"])
 
-ALL_FACETS = ["pattern", "whiteSpace", "enumeration", "maxInclusive", 
-    "maxExclusive", "minInclusive", "minExclusive", "totalDigits", 
-    "fractionDigits", "length", "minLength", "maxLength"]
-
-
-#-------------------------------------------------------------------------------
+ALL_FACETS = ["pattern", "whiteSpace", "enumeration", "maxInclusive",
+              "maxExclusive", "minInclusive", "minExclusive", "totalDigits",
+              "fractionDigits", "length", "minLength", "maxLength"]
+
+
+# -------------------------------------------------------------------------------
 #                           Structure reducing functions
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 
 # Documentation elements
 
 def ReduceAppInfo(factory, attributes, elements):
-    return {"type": "appinfo", "source": attributes.get("source", None), 
+    return {"type": "appinfo", "source": attributes.get("source", None),
             "content": "\n".join(elements)}
 
 
 def ReduceDocumentation(factory, attributes, elements):
-    return {"type": "documentation", "source": attributes.get("source", None), 
+    return {"type": "documentation", "source": attributes.get("source", None),
             "language": attributes.get("lang", "any"), "content": "\n".join(elements)}
 
 
 def ReduceAnnotation(factory, attributes, elements):
-    annotations, children = factory.ReduceElements(elements)
+    _annotations, children = factory.ReduceElements(elements)
     annotation = {"type": "annotation", "appinfo": [], "documentation": {}}
     for child in children:
         if child["type"] == "appinfo":
             annotation["appinfo"].append((child["source"], child["content"]))
         elif child["type"] == "documentation":
             if child["source"] is not None:
-                text = "(source: %(source)s):\n%(content)s\n\n"%child
+                text = "(source: %(source)s):\n%(content)s\n\n" % child
             else:
                 text = child["content"] + "\n\n"
-            if not annotation["documentation"].has_key(child["language"]):
+            if not child["language"] in annotation["documentation"]:
                 annotation["documentation"] = text
             else:
                 annotation["documentation"] += text
@@ -109,10 +122,11 @@
 
 # Simple type elements
 
+
 def GenerateFacetReducing(facetname, canbefixed):
     def ReduceFacet(factory, attributes, elements):
-        annotations, children = factory.ReduceElements(elements)
-        if attributes.has_key("value"):
+        annotations, _children = factory.ReduceElements(elements)
+        if "value" in attributes:
             facet = {"type": facetname, "value": attributes["value"], "doc": annotations}
             if canbefixed:
                 facet["fixed"] = attributes.get("fixed", False)
@@ -124,7 +138,7 @@
 def ReduceList(factory, attributes, elements):
     annotations, children = factory.ReduceElements(elements)
     list = {"type": "list", "itemType": attributes.get("itemType", None), "doc": annotations}
-    
+
     if len(children) > 0 and children[0]["type"] == SIMPLETYPE:
         if list["itemType"] is None:
             list["itemType"] = children[0]
@@ -138,10 +152,10 @@
 def ReduceUnion(factory, attributes, elements):
     annotations, children = factory.ReduceElements(elements)
     union = {"type": "union", "memberTypes": attributes.get("memberTypes", []), "doc": annotations}
-    
+
     for child in children:
         if child["type"] == SIMPLETYPE:
-            union["memberTypes"].appendchild
+            union["memberTypes"].append(child)
     if len(union["memberTypes"]) == 0:
         raise ValueError("No base type has been defined for union!")
     return union
@@ -151,35 +165,35 @@
     # Initialize type informations
     facets = {}
     simpleType = {"type": SIMPLETYPE, "final": attributes.get("final", [])}
-    if attributes.has_key("name"):
+    if "name" in attributes:
         simpleType["name"] = attributes["name"]
-    
+
     if typeinfos["type"] in ["restriction", "extension"]:
         # Search for base type definition
-        if isinstance(typeinfos["base"], (StringType, UnicodeType)):
+        if isinstance(typeinfos["base"], string_types):
             basetypeinfos = factory.FindSchemaElement(typeinfos["base"], SIMPLETYPE)
             if basetypeinfos is None:
-                raise "\"%s\" isn't defined!" % typeinfos["base"] 
+                raise "\"%s\" isn't defined!" % typeinfos["base"]
         else:
             basetypeinfos = typeinfos["base"]
-        
+
         # Check that base type is a simple type
         if basetypeinfos["type"] != SIMPLETYPE:
             raise ValueError("Base type given isn't a simpleType!")
-        
+
         simpleType["basename"] = basetypeinfos["basename"]
-        
+
         # Check that derivation is allowed
-        if basetypeinfos.has_key("final"):
+        if "final" in basetypeinfos:
             if "#all" in basetypeinfos["final"]:
                 raise ValueError("Base type can't be derivated!")
             if "restriction" in basetypeinfos["final"] and typeinfos["type"] == "restriction":
                 raise ValueError("Base type can't be derivated by restriction!")
-        
+
         # Extract simple type facets
         for facet in typeinfos.get("facets", []):
             facettype = facet["type"]
-            if not basetypeinfos["facets"].has_key(facettype):
+            if facettype not in basetypeinfos["facets"]:
                 raise ValueError("\"%s\" facet can't be defined for \"%s\" type!" % (facettype, type))
             elif basetypeinfos["facets"][facettype][1]:
                 raise ValueError("\"%s\" facet is fixed on base type!" % facettype)
@@ -195,107 +209,107 @@
                     continue
                 else:
                     raise ValueError("\"%s\" facet can't be defined with another facet type!" % facettype)
-            elif facets.has_key("enumeration"):
+            elif "enumeration" in facets:
                 raise ValueError("\"enumeration\" facet can't be defined with another facet type!")
-            elif facets.has_key("pattern"):
+            elif "pattern" in facets:
                 raise ValueError("\"pattern\" facet can't be defined with another facet type!")
-            elif facets.has_key(facettype):
+            elif facettype in facets:
                 raise ValueError("\"%s\" facet can't be defined two times!" % facettype)
             elif facettype == "length":
-                if facets.has_key("minLength"):
+                if "minLength" in facets:
                     raise ValueError("\"length\" and \"minLength\" facets can't be defined at the same time!")
-                if facets.has_key("maxLength"):
+                if "maxLength" in facets:
                     raise ValueError("\"length\" and \"maxLength\" facets can't be defined at the same time!")
                 try:
                     value = int(value)
-                except:
+                except Exception:
                     raise ValueError("\"length\" must be an integer!")
                 if value < 0:
                     raise ValueError("\"length\" can't be negative!")
                 elif basevalue is not None and basevalue != value:
                     raise ValueError("\"length\" can't be different from \"length\" defined in base type!")
             elif facettype == "minLength":
-                if facets.has_key("length"):
+                if "length" in facets:
                     raise ValueError("\"length\" and \"minLength\" facets can't be defined at the same time!")
                 try:
                     value = int(value)
-                except:
+                except Exception:
                     raise ValueError("\"minLength\" must be an integer!")
                 if value < 0:
                     raise ValueError("\"minLength\" can't be negative!")
-                elif facets.has_key("maxLength") and value > facets["maxLength"]:
+                elif "maxLength" in facets and value > facets["maxLength"]:
                     raise ValueError("\"minLength\" must be lesser than or equal to \"maxLength\"!")
                 elif basevalue is not None and basevalue < value:
                     raise ValueError("\"minLength\" can't be lesser than \"minLength\" defined in base type!")
             elif facettype == "maxLength":
-                if facets.has_key("length"):
+                if "length" in facets:
                     raise ValueError("\"length\" and \"maxLength\" facets can't be defined at the same time!")
                 try:
                     value = int(value)
-                except:
+                except Exception:
                     raise ValueError("\"maxLength\" must be an integer!")
                 if value < 0:
                     raise ValueError("\"maxLength\" can't be negative!")
-                elif facets.has_key("minLength") and value < facets["minLength"]:
+                elif "minLength" in facets and value < facets["minLength"]:
                     raise ValueError("\"minLength\" must be lesser than or equal to \"maxLength\"!")
                 elif basevalue is not None and basevalue > value:
                     raise ValueError("\"maxLength\" can't be greater than \"maxLength\" defined in base type!")
             elif facettype == "minInclusive":
-                if facets.has_key("minExclusive"):
+                if "minExclusive" in facets:
                     raise ValueError("\"minExclusive\" and \"minInclusive\" facets can't be defined at the same time!")
                 value = basetypeinfos["extract"](facet["value"], False)
-                if facets.has_key("maxInclusive") and value > facets["maxInclusive"][0]:
+                if "maxInclusive" in facets and value > facets["maxInclusive"][0]:
                     raise ValueError("\"minInclusive\" must be lesser than or equal to \"maxInclusive\"!")
-                elif facets.has_key("maxExclusive") and value >= facets["maxExclusive"][0]:
+                elif "maxExclusive" in facets and value >= facets["maxExclusive"][0]:
                     raise ValueError("\"minInclusive\" must be lesser than \"maxExclusive\"!")
             elif facettype == "minExclusive":
-                if facets.has_key("minInclusive"):
+                if "minInclusive" in facets:
                     raise ValueError("\"minExclusive\" and \"minInclusive\" facets can't be defined at the same time!")
                 value = basetypeinfos["extract"](facet["value"], False)
-                if facets.has_key("maxInclusive") and value >= facets["maxInclusive"][0]:
+                if "maxInclusive" in facets and value >= facets["maxInclusive"][0]:
                     raise ValueError("\"minExclusive\" must be lesser than \"maxInclusive\"!")
-                elif facets.has_key("maxExclusive") and value >= facets["maxExclusive"][0]:
+                elif "maxExclusive" in facets and value >= facets["maxExclusive"][0]:
                     raise ValueError("\"minExclusive\" must be lesser than \"maxExclusive\"!")
             elif facettype == "maxInclusive":
-                if facets.has_key("maxExclusive"):
+                if "maxExclusive" in facets:
                     raise ValueError("\"maxExclusive\" and \"maxInclusive\" facets can't be defined at the same time!")
                 value = basetypeinfos["extract"](facet["value"], False)
-                if facets.has_key("minInclusive") and value < facets["minInclusive"][0]:
+                if "minInclusive" in facets and value < facets["minInclusive"][0]:
                     raise ValueError("\"minInclusive\" must be lesser than or equal to \"maxInclusive\"!")
-                elif facets.has_key("minExclusive") and value <= facets["minExclusive"][0]:
+                elif "minExclusive" in facets and value <= facets["minExclusive"][0]:
                     raise ValueError("\"minExclusive\" must be lesser than \"maxInclusive\"!")
             elif facettype == "maxExclusive":
-                if facets.has_key("maxInclusive"):
+                if "maxInclusive" in facets:
                     raise ValueError("\"maxExclusive\" and \"maxInclusive\" facets can't be defined at the same time!")
                 value = basetypeinfos["extract"](facet["value"], False)
-                if facets.has_key("minInclusive") and value <= facets["minInclusive"][0]:
+                if "minInclusive" in facets and value <= facets["minInclusive"][0]:
                     raise ValueError("\"minInclusive\" must be lesser than \"maxExclusive\"!")
-                elif facets.has_key("minExclusive") and value <= facets["minExclusive"][0]:
+                elif "minExclusive" in facets and value <= facets["minExclusive"][0]:
                     raise ValueError("\"minExclusive\" must be lesser than \"maxExclusive\"!")
             elif facettype == "whiteSpace":
                 if basevalue == "collapse" and value in ["preserve", "replace"] or basevalue == "replace" and value == "preserve":
-                   raise ValueError("\"whiteSpace\" is incompatible with \"whiteSpace\" defined in base type!")
+                    raise ValueError("\"whiteSpace\" is incompatible with \"whiteSpace\" defined in base type!")
             elif facettype == "totalDigits":
-                if facets.has_key("fractionDigits") and value <= facets["fractionDigits"][0]:
+                if "fractionDigits" in facets and value <= facets["fractionDigits"][0]:
                     raise ValueError("\"fractionDigits\" must be lesser than or equal to \"totalDigits\"!")
                 elif basevalue is not None and value > basevalue:
                     raise ValueError("\"totalDigits\" can't be greater than \"totalDigits\" defined in base type!")
             elif facettype == "fractionDigits":
-                if facets.has_key("totalDigits") and value <= facets["totalDigits"][0]:
+                if "totalDigits" in facets and value <= facets["totalDigits"][0]:
                     raise ValueError("\"fractionDigits\" must be lesser than or equal to \"totalDigits\"!")
                 elif basevalue is not None and value > basevalue:
                     raise ValueError("\"totalDigits\" can't be greater than \"totalDigits\" defined in base type!")
             facets[facettype] = (value, facet.get("fixed", False))
-        
-        # Report not redefined facet from base type to new created type 
+
+        # Report not redefined facet from base type to new created type
         for facettype, facetvalue in basetypeinfos["facets"].items():
-            if not facets.has_key(facettype):
+            if facettype not in facets:
                 facets[facettype] = facetvalue
-        
+
         # Generate extract value for new created type
         def ExtractSimpleTypeValue(attr, extract=True):
             value = basetypeinfos["extract"](attr, extract)
-            for facetname, (facetvalue, facetfixed) in facets.items():
+            for facetname, (facetvalue, _facetfixed) in facets.items():
                 if facetvalue is not None:
                     if facetname == "enumeration" and value not in facetvalue:
                         raise ValueError("\"%s\" not in enumerated values" % value)
@@ -311,13 +325,13 @@
                         raise ValueError("value must be greater than %s" % str(facetvalue))
                     elif facetname == "maxInclusive" and value > facetvalue:
                         raise ValueError("value must be lesser than or equal to %s" % str(facetvalue))
-                    elif facetname == "maxExclusive"  and value >= facetvalue:
+                    elif facetname == "maxExclusive" and value >= facetvalue:
                         raise ValueError("value must be lesser than %s" % str(facetvalue))
                     elif facetname == "pattern":
                         model = re.compile("(?:%s)?$" % "|".join(map(lambda x: "(?:%s)" % x, facetvalue)))
                         result = model.match(value)
                         if result is None:
-                            if len(facetvalue) > 1:   
+                            if len(facetvalue) > 1:
                                 raise ValueError("value doesn't follow any of the patterns %s" % ",".join(facetvalue))
                             else:
                                 raise ValueError("value doesn't follow the pattern %s" % facetvalue[0])
@@ -327,9 +341,9 @@
                         elif facetvalue == "collapse":
                             value = GetToken(value, False)
             return value
-        
+
         def CheckSimpleTypeValue(value):
-            for facetname, (facetvalue, facetfixed) in facets.items():
+            for facetname, (facetvalue, _facetfixed) in facets.items():
                 if facetvalue is not None:
                     if facetname == "enumeration" and value not in facetvalue:
                         return False
@@ -345,139 +359,136 @@
                         return False
                     elif facetname == "maxInclusive" and value > facetvalue:
                         return False
-                    elif facetname == "maxExclusive"  and value >= facetvalue:
+                    elif facetname == "maxExclusive" and value >= facetvalue:
                         return False
                     elif facetname == "pattern":
                         model = re.compile("(?:%s)?$" % "|".join(map(lambda x: "(?:%s)" % x, facetvalue)))
                         result = model.match(value)
                         if result is None:
-                            if len(facetvalue) > 1:   
+                            if len(facetvalue) > 1:
                                 raise ValueError("value doesn't follow any of the patterns %s" % ",".join(facetvalue))
                             else:
                                 raise ValueError("value doesn't follow the pattern %s" % facetvalue[0])
             return True
-        
+
         def SimpleTypeInitialValue():
-            for facetname, (facetvalue, facetfixed) in facets.items():
+            for facetname, (facetvalue, _facetfixed) in facets.items():
                 if facetvalue is not None:
                     if facetname == "enumeration":
                         return facetvalue[0]
                     elif facetname == "length":
                         return " "*facetvalue
                     elif facetname == "minLength":
-                        return " "*minLength
+                        return " "*facetvalue
                     elif facetname == "minInclusive" and facetvalue > 0:
                         return facetvalue
                     elif facetname == "minExclusive" and facetvalue >= 0:
                         return facetvalue + 1
                     elif facetname == "maxInclusive" and facetvalue < 0:
                         return facetvalue
-                    elif facetname == "maxExclusive"  and facetvalue <= 0:
+                    elif facetname == "maxExclusive" and facetvalue <= 0:
                         return facetvalue - 1
             return basetypeinfos["initial"]()
-        
+
         GenerateSimpleType = basetypeinfos["generate"]
-        
+
     elif typeinfos["type"] == "list":
         # Search for item type definition
-        if isinstance(typeinfos["itemType"], (StringType, UnicodeType)):
+        if isinstance(typeinfos["itemType"], string_types):
             itemtypeinfos = factory.FindSchemaElement(typeinfos["itemType"], SIMPLETYPE)
             if itemtypeinfos is None:
                 raise "\"%s\" isn't defined!" % typeinfos["itemType"]
         else:
             itemtypeinfos = typeinfos["itemType"]
-        
+
         # Check that item type is a simple type
         if itemtypeinfos["type"] != SIMPLETYPE:
-            raise ValueError, "Item type given isn't a simpleType!"
-        
+            raise ValueError("Item type given isn't a simpleType!")
+
         simpleType["basename"] = "list"
-        
+
         # Check that derivation is allowed
-        if itemtypeinfos.has_key("final"):
-            if itemtypeinfos["final"].has_key("#all"):
+        if "final" in itemtypeinfos:
+            if "#all" in itemtypeinfos["final"]:
                 raise ValueError("Item type can't be derivated!")
-            if itemtypeinfos["final"].has_key("list"):
+            if "list" in itemtypeinfos["final"]:
                 raise ValueError("Item type can't be derivated by list!")
-        
+
         # Generate extract value for new created type
-        def ExtractSimpleTypeValue(attr, extract = True):
+        def ExtractSimpleTypeValue(attr, extract=True):
             values = []
             for value in GetToken(attr, extract).split(" "):
                 values.append(itemtypeinfos["extract"](value, False))
             return values
-        
+
         def CheckSimpleTypeValue(value):
             for item in value:
                 result = itemtypeinfos["check"](item)
                 if not result:
                     return result
             return True
-        
-        SimpleTypeInitialValue = lambda: []
-        
+
+        def SimpleTypeInitialValue():
+            return []
+
         GenerateSimpleType = GenerateSimpleTypeXMLText(lambda x: " ".join(map(itemtypeinfos["generate"], x)))
-        
+
         facets = GenerateDictFacets(["length", "maxLength", "minLength", "enumeration", "pattern"])
         facets["whiteSpace"] = ("collapse", False)
-    
+
     elif typeinfos["type"] == "union":
         # Search for member types definition
         membertypesinfos = []
         for membertype in typeinfos["memberTypes"]:
-            if isinstance(membertype, (StringType, UnicodeType)):
+            if isinstance(membertype, string_types):
                 infos = factory.FindSchemaElement(membertype, SIMPLETYPE)
                 if infos is None:
                     raise ValueError("\"%s\" isn't defined!" % membertype)
             else:
                 infos = membertype
-            
+
             # Check that member type is a simple type
             if infos["type"] != SIMPLETYPE:
                 raise ValueError("Member type given isn't a simpleType!")
-            
+
             # Check that derivation is allowed
-            if infos.has_key("final"):
-                if infos["final"].has_key("#all"):
+            if "final" in infos:
+                if "#all" in infos["final"]:
                     raise ValueError("Item type can't be derivated!")
-                if infos["final"].has_key("union"):
+                if "union" in infos["final"]:
                     raise ValueError("Member type can't be derivated by union!")
-            
+
             membertypesinfos.append(infos)
-        
+
         simpleType["basename"] = "union"
-        
+
         # Generate extract value for new created type
-        def ExtractSimpleTypeValue(attr, extract = True):
-            if extract:
-                value = GetAttributeValue(attr)
-            else:
-                value = attr
+        def ExtractSimpleTypeValue(attr, extract=True):
             for infos in membertypesinfos:
                 try:
                     return infos["extract"](attr, False)
-                except:
+                except Exception:
                     pass
             raise ValueError("\"%s\" isn't valid for type defined for union!")
-        
+
         def CheckSimpleTypeValue(value):
             for infos in membertypesinfos:
                 result = infos["check"](value)
                 if result:
                     return result
             return False
-        
+
         SimpleTypeInitialValue = membertypesinfos[0]["initial"]
-        
+
         def GenerateSimpleTypeFunction(value):
-            if isinstance(value, BooleanType):
+            if isinstance(value, bool):
                 return {True: "true", False: "false"}[value]
             else:
                 return str(value)
         GenerateSimpleType = GenerateSimpleTypeXMLText(GenerateSimpleTypeFunction)
-        
+
         facets = GenerateDictFacets(["pattern", "enumeration"])
-    
+
     simpleType["facets"] = facets
     simpleType["extract"] = ExtractSimpleTypeValue
     simpleType["initial"] = SimpleTypeInitialValue
@@ -485,25 +496,27 @@
     simpleType["generate"] = GenerateSimpleType
     return simpleType
 
+
 def ReduceSimpleType(factory, attributes, elements):
     # Reduce all the simple type children
     annotations, children = factory.ReduceElements(elements)
-    
+
     simpleType = CreateSimpleType(factory, attributes, children[0])
     simpleType["doc"] = annotations
-    
+
     return simpleType
 
 # Complex type
 
+
 def ExtractAttributes(factory, elements, base=None):
     attrs = []
     attrnames = {}
     if base is not None:
         basetypeinfos = factory.FindSchemaElement(base)
-        if not isinstance(basetypeinfos, (UnicodeType, StringType)) and basetypeinfos["type"] == COMPLEXTYPE:
-            attrnames = dict(map(lambda x:(x["name"], True), basetypeinfos["attributes"]))
-        
+        if not isinstance(basetypeinfos, string_types) and basetypeinfos["type"] == COMPLEXTYPE:
+            attrnames = dict(map(lambda x: (x["name"], True), basetypeinfos["attributes"]))
+
     for element in elements:
         if element["type"] == ATTRIBUTE:
             if attrnames.get(element["name"], False):
@@ -534,7 +547,7 @@
             raise ValueError("Only one base type can be defined for restriction!")
     if restriction["base"] is None:
         raise ValueError("No base type has been defined for restriction!")
-    
+
     while len(children) > 0 and children[0]["type"] in ALL_FACETS:
         restriction["facets"].append(children.pop(0))
     restriction["attributes"] = ExtractAttributes(factory, children, restriction["base"])
@@ -543,7 +556,7 @@
 
 def ReduceExtension(factory, attributes, elements):
     annotations, children = factory.ReduceElements(elements)
-    if not attributes.has_key("base"):
+    if "base" not in attributes:
         raise ValueError("No base type has been defined for extension!")
     extension = {"type": "extension", "attributes": [], "elements": [], "base": attributes["base"], "doc": annotations}
     if len(children) > 0:
@@ -557,8 +570,8 @@
                 content["name"] = "content"
                 extension["elements"].append(content)
             elif group["type"] == "group":
-                elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP)
-                if elmtgroup.has_key("elements"):
+                elmtgroup = factory.FindSchemaElement(group["ref"], ELEMENTSGROUP)
+                if "elements" in elmtgroup:
                     extension["elements"] = elmtgroup["elements"]
                     extension["order"] = elmtgroup["order"]
                 else:
@@ -571,24 +584,24 @@
 
 def ReduceSimpleContent(factory, attributes, elements):
     annotations, children = factory.ReduceElements(elements)
-    
+
     simpleContent = children[0].copy()
-    
+
     basetypeinfos = factory.FindSchemaElement(simpleContent["base"])
     if basetypeinfos["type"] == SIMPLETYPE:
         contenttypeinfos = simpleContent.copy()
         simpleContent.pop("base")
-    elif basetypeinfos["type"] == COMPLEXTYPE and \
-         len(basetypeinfos["elements"]) == 1 and \
-         basetypeinfos["elements"][0]["name"] == "content" and \
-         basetypeinfos["elements"][0].has_key("elmt_type") and \
-         basetypeinfos["elements"][0]["elmt_type"]["type"] == SIMPLETYPE:
+    elif (basetypeinfos["type"] == COMPLEXTYPE and
+          len(basetypeinfos["elements"]) == 1 and
+          basetypeinfos["elements"][0]["name"] == "content" and
+          "elmt_type" in basetypeinfos["elements"][0] and
+          basetypeinfos["elements"][0]["elmt_type"]["type"] == SIMPLETYPE):
         contenttypeinfos = simpleContent.copy()
         contenttypeinfos["base"] = basetypeinfos["elements"][0]["elmt_type"]
     else:
         raise ValueError("No compatible base type defined for simpleContent!")
     contenttypeinfos = CreateSimpleType(factory, attributes, contenttypeinfos)
-    
+
     simpleContent["elements"] = [{"name": "content", "type": ELEMENT,
                                   "elmt_type": contenttypeinfos, "doc": annotations,
                                   "minOccurs": 1, "maxOccurs": 1}]
@@ -597,7 +610,7 @@
 
 
 def ReduceComplexContent(factory, attributes, elements):
-    annotations, children = factory.ReduceElements(elements)
+    _annotations, children = factory.ReduceElements(elements)
     complexContent = children[0].copy()
     complexContent["type"] = "complexContent"
     return complexContent
@@ -605,7 +618,7 @@
 
 def ReduceComplexType(factory, attributes, elements):
     annotations, children = factory.ReduceElements(elements)
-    
+
     if len(children) > 0:
         if children[0]["type"] in ["simpleContent", "complexContent"]:
             complexType = children[0].copy()
@@ -640,8 +653,8 @@
                 content["name"] = "content"
                 complexType["elements"].append(content)
             elif group["type"] == "group":
-                elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP)
-                if elmtgroup.has_key("elements"):
+                elmtgroup = factory.FindSchemaElement(group["ref"], ELEMENTSGROUP)
+                if "elements" in elmtgroup:
                     complexType["elements"] = elmtgroup["elements"]
                     complexType["order"] = elmtgroup["order"]
                 else:
@@ -661,36 +674,36 @@
 # Attribute elements
 
 def ReduceAnyAttribute(factory, attributes, elements):
-    return {"type" : "anyAttribute"}
+    return {"type": "anyAttribute"}
 
 
 def ReduceAttribute(factory, attributes, elements):
     annotations, children = factory.ReduceElements(elements)
-    
-    if attributes.has_key("default"):
-        if attributes.has_key("fixed"):
+
+    if "default" in attributes:
+        if "fixed" in attributes:
             raise ValueError("\"default\" and \"fixed\" can't be defined at the same time!")
         elif attributes.get("use", "optional") != "optional":
             raise ValueError("if \"default\" present, \"use\" can only have the value \"optional\"!")
-    
+
     attribute = {"type": ATTRIBUTE, "attr_type": attributes.get("type", None), "doc": annotations}
     if len(children) > 0:
         if attribute["attr_type"] is None:
             attribute["attr_type"] = children[0]
         else:
             raise ValueError("Only one type can be defined for attribute!")
-    
-    if attributes.has_key("ref"):
-        if attributes.has_key("name"):
+
+    if "ref" in attributes:
+        if "name" in attributes:
             raise ValueError("\"ref\" and \"name\" can't be defined at the same time!")
-        elif attributes.has_key("form"):
+        elif "form" in attributes:
             raise ValueError("\"ref\" and \"form\" can't be defined at the same time!")
         elif attribute["attr_type"] is not None:
             raise ValueError("if \"ref\" is present, no type can be defined!")
     elif attribute["attr_type"] is None:
         raise ValueError("No type has been defined for attribute \"%s\"!" % attributes["name"])
-    
-    if attributes.has_key("type"):
+
+    if "type" in attributes:
         tmp_attrs = attributes.copy()
         tmp_attrs.pop("type")
         attribute.update(tmp_attrs)
@@ -701,7 +714,7 @@
 
 def ReduceAttributeGroup(factory, attributes, elements):
     annotations, children = factory.ReduceElements(elements)
-    if attributes.has_key("ref"):
+    if "ref" in attributes:
         return {"type": "attributeGroup", "ref": attributes["ref"], "doc": annotations}
     else:
         return {"type": ATTRIBUTESGROUP, "attributes": ExtractAttributes(factory, children), "doc": annotations}
@@ -710,15 +723,16 @@
 # Elements groups
 
 def ReduceAny(factory, attributes, elements):
-    annotations, children = factory.ReduceElements(elements)
-    
+    annotations, _children = factory.ReduceElements(elements)
+
     any = {"type": ANY, "doc": annotations}
     any.update(attributes)
     return any
 
+
 def ReduceElement(factory, attributes, elements):
     annotations, children = factory.ReduceElements(elements)
-    
+
     types = []
     constraints = []
     for child in children:
@@ -726,19 +740,19 @@
             constraints.append(child)
         else:
             types.append(child)
-    
-    if attributes.has_key("default") and attributes.has_key("fixed"):
+
+    if "default" in attributes and "fixed" in attributes:
         raise ValueError("\"default\" and \"fixed\" can't be defined at the same time!")
-    
-    if attributes.has_key("ref"):
+
+    if "ref" in attributes:
         for attr in ["name", "default", "fixed", "form", "block", "type"]:
-            if attributes.has_key(attr):
+            if attr in attributes:
                 raise ValueError("\"ref\" and \"%s\" can't be defined at the same time!" % attr)
-        if attributes.has_key("nillable"):
+        if "nillable" in attributes:
             raise ValueError("\"ref\" and \"nillable\" can't be defined at the same time!")
         if len(types) > 0:
             raise ValueError("No type and no constraints can be defined where \"ref\" is defined!")
-    
+
         infos = factory.FindSchemaElement(attributes["ref"], ELEMENT)
         if infos is not None:
             element = infos.copy()
@@ -747,9 +761,9 @@
             element["maxOccurs"] = attributes["maxOccurs"]
             return element
         else:
-            raise ValueError("\"%s\" base type isn't defined or circular referenced!" % name)
-    
-    elif attributes.has_key("name"):
+            raise ValueError("\"%s\" base type isn't defined or circular referenced!" % attributes["ref"])
+
+    elif "name" in attributes:
         element = {"type": ELEMENT, "elmt_type": attributes.get("type", None), "constraints": constraints, "doc": annotations}
         if len(types) > 0:
             if element["elmt_type"] is None:
@@ -759,8 +773,8 @@
         elif element["elmt_type"] is None:
             element["elmt_type"] = "tag"
             element["type"] = TAG
-        
-        if attributes.has_key("type"):
+
+        if "type" in attributes:
             tmp_attrs = attributes.copy()
             tmp_attrs.pop("type")
             element.update(tmp_attrs)
@@ -770,20 +784,21 @@
     else:
         raise ValueError("\"Element\" must have at least a \"ref\" or a \"name\" defined!")
 
+
 def ReduceAll(factory, attributes, elements):
     annotations, children = factory.ReduceElements(elements)
-    
+
     for child in children:
-        if children["maxOccurs"] == "unbounded" or children["maxOccurs"] > 1:
+        if child["maxOccurs"] == "unbounded" or child["maxOccurs"] > 1:
             raise ValueError("\"all\" item can't have \"maxOccurs\" attribute greater than 1!")
-    
+
     return {"type": "all", "elements": children, "minOccurs": attributes["minOccurs"],
             "maxOccurs": attributes["maxOccurs"], "order": False, "doc": annotations}
 
 
 def ReduceChoice(factory, attributes, elements):
     annotations, children = factory.ReduceElements(elements)
-    
+
     choices = []
     for child in children:
         if child["type"] in [ELEMENT, ANY, TAG]:
@@ -791,16 +806,16 @@
         elif child["type"] == "sequence":
             child["minOccurs"] = child["maxOccurs"] = 1
             choices.append(child)
-            #raise ValueError("\"sequence\" in \"choice\" is not supported. Create instead a new complex type!")
+            # raise ValueError("\"sequence\" in \"choice\" is not supported. Create instead a new complex type!")
         elif child["type"] == CHOICE:
             choices.extend(child["choices"])
         elif child["type"] == "group":
-            elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP) 
-            if not elmtgroup.has_key("choices"):
+            elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP)
+            if "choices" not in elmtgroup:
                 raise ValueError("Only group composed of \"choice\" can be referenced in \"choice\" element!")
             choices_tmp = []
             for choice in elmtgroup["choices"]:
-                if not isinstance(choice["elmt_type"], (UnicodeType, StringType)) and choice["elmt_type"]["type"] == COMPLEXTYPE:
+                if not isinstance(choice["elmt_type"], string_types) and choice["elmt_type"]["type"] == COMPLEXTYPE:
                     elmt_type = "%s_%s" % (elmtgroup["name"], choice["name"])
                     if factory.TargetNamespace is not None:
                         elmt_type = "%s:%s" % (factory.TargetNamespace, elmt_type)
@@ -810,18 +825,18 @@
                 else:
                     choices_tmp.append(choice)
             choices.extend(choices_tmp)
-    
+
     for choice in choices:
         attributes["minOccurs"] = min(attributes["minOccurs"], choice["minOccurs"])
         choice["minOccurs"] = 1
-    
+
     return {"type": CHOICE, "choices": choices, "minOccurs": attributes["minOccurs"],
             "maxOccurs": attributes["maxOccurs"], "doc": annotations}
 
 
 def ReduceSequence(factory, attributes, elements):
     annotations, children = factory.ReduceElements(elements)
-    
+
     sequence = []
     for child in children:
         if child["type"] in [ELEMENT, ANY, TAG, CHOICE]:
@@ -830,12 +845,12 @@
             sequence.extend(child["elements"])
         elif child["type"] == "group":
             elmtgroup = factory.FindSchemaElement(child["ref"], ELEMENTSGROUP)
-            if not elmtgroup.has_key("elements") or not elmtgroup["order"]:
+            if "elements" not in elmtgroup or not elmtgroup["order"]:
                 raise ValueError("Only group composed of \"sequence\" can be referenced in \"sequence\" element!")
             elements_tmp = []
             for element in elmtgroup["elements"]:
-                if not isinstance(element["elmt_type"], (UnicodeType, StringType)) and element["elmt_type"]["type"] == COMPLEXTYPE:
-                    elmt_type = "%s_%s"%(elmtgroup["name"], element["name"])
+                if not isinstance(element["elmt_type"], string_types) and element["elmt_type"]["type"] == COMPLEXTYPE:
+                    elmt_type = "%s_%s" % (elmtgroup["name"], element["name"])
                     if factory.TargetNamespace is not None:
                         elmt_type = "%s:%s" % (factory.TargetNamespace, elmt_type)
                     new_element = element.copy()
@@ -844,15 +859,15 @@
                 else:
                     elements_tmp.append(element)
             sequence.extend(elements_tmp)
-            
+
     return {"type": "sequence", "elements": sequence, "minOccurs": attributes["minOccurs"],
             "maxOccurs": attributes["maxOccurs"], "order": True, "doc": annotations}
-    
-    
+
+
 def ReduceGroup(factory, attributes, elements):
     annotations, children = factory.ReduceElements(elements)
-    
-    if attributes.has_key("ref"):
+
+    if "ref" in attributes:
         return {"type": "group", "ref": attributes["ref"], "doc": annotations}
     else:
         element = children[0]
@@ -860,57 +875,63 @@
         if element["type"] == CHOICE:
             group["choices"] = element["choices"]
         else:
-            group.update({"elements": element["elements"], "order": group["order"]})
+            group.update({"elements": element["elements"], "order": element["order"]})
         group.update(attributes)
         return group
 
 # Constraint elements
 
+
 def ReduceUnique(factory, attributes, elements):
-    annotations, children = factory.ReduceElements(elements)
-    
+    _annotations, children = factory.ReduceElements(elements)
+
     unique = {"type": CONSTRAINT, "const_type": "unique", "selector": children[0], "fields": children[1:]}
     unique.update(attributes)
     return unique
-    
+
+
 def ReduceKey(factory, attributes, elements):
-    annotations, children = factory.ReduceElements(elements)
-    
+    _annotations, children = factory.ReduceElements(elements)
+
     key = {"type": CONSTRAINT, "const_type": "key", "selector": children[0], "fields": children[1:]}
     key.update(attributes)
     return key
 
+
 def ReduceKeyRef(factory, attributes, elements):
-    annotations, children = factory.ReduceElements(elements)
-    
+    _annotations, children = factory.ReduceElements(elements)
+
     keyref = {"type": CONSTRAINT, "const_type": "keyref", "selector": children[0], "fields": children[1:]}
     keyref.update(attributes)
     return keyref
-    
+
+
 def ReduceSelector(factory, attributes, elements):
-    annotations, children = factory.ReduceElements(elements)
-    
+    factory.ReduceElements(elements)
+
     selector = {"type": CONSTRAINT, "const_type": "selector"}
     selector.update(attributes)
     return selector
 
+
 def ReduceField(factory, attributes, elements):
-    annotations, children = factory.ReduceElements(elements)
-    
+    factory.ReduceElements(elements)
+
     field = {"type": CONSTRAINT, "const_type": "field"}
     field.update(attributes)
     return field
-    
+
 
 # Inclusion elements
 
 def ReduceImport(factory, attributes, elements):
-    annotations, children = factory.ReduceElements(elements)
+    factory.ReduceElements(elements)
     raise ValueError("\"import\" element isn't supported yet!")
 
+
 def ReduceInclude(factory, attributes, elements):
-    annotations, children = factory.ReduceElements(elements)
-    
+    factory.ReduceElements(elements)
+
     if factory.FileName is None:
         raise ValueError("Include in XSD string not yet supported")
     filepath = attributes["schemaLocation"]
@@ -922,7 +943,7 @@
     include_factory = XSDClassFactory(minidom.parse(xsdfile), filepath)
     xsdfile.close()
     include_factory.CreateClasses()
-    
+
     if factory.TargetNamespace == include_factory.TargetNamespace:
         factory.Namespaces[factory.TargetNamespace].update(include_factory.Namespaces[include_factory.TargetNamespace])
     else:
@@ -931,9 +952,10 @@
     factory.ComputedClassesLookUp.update(include_factory.ComputedClassesLookUp)
     factory.EquivalentClassesParent.update(include_factory.EquivalentClassesParent)
     return None
-    
+
+
 def ReduceRedefine(factory, attributes, elements):
-    annotations, children = factory.ReduceElements(elements)
+    factory.ReduceElements(elements)
     raise ValueError("\"redefine\" element isn't supported yet!")
 
 
@@ -944,38 +966,39 @@
     factory.ElementFormDefault = attributes["elementFormDefault"]
     factory.BlockDefault = attributes["blockDefault"]
     factory.FinalDefault = attributes["finalDefault"]
-    
+
     targetNamespace = attributes.get("targetNamespace", None)
     factory.TargetNamespace = factory.DefinedNamespaces.get(targetNamespace, None)
     if factory.TargetNamespace is not None:
         factory.etreeNamespaceFormat = "{%s}%%s" % targetNamespace
     factory.Namespaces[factory.TargetNamespace] = {}
-    
-    annotations, children = factory.ReduceElements(elements, True)
-    
+
+    _annotations, children = factory.ReduceElements(elements, True)
+
     for child in children:
-        if child.has_key("name"):
+        if "name" in child:
             infos = factory.GetQualifiedNameInfos(child["name"], factory.TargetNamespace, True)
             if infos is None:
                 factory.Namespaces[factory.TargetNamespace][child["name"]] = child
             elif not CompareSchema(infos, child):
                 raise ValueError("\"%s\" is defined twice in targetNamespace!" % child["name"])
 
+
 def CompareSchema(schema, reference):
-    if isinstance(schema, ListType):
-        if not isinstance(reference, ListType) or len(schema) != len(reference):
+    if isinstance(schema, list):
+        if not isinstance(reference, list) or len(schema) != len(reference):
             return False
         for i, value in enumerate(schema):
             result = CompareSchema(value, reference[i])
             if not result:
                 return result
         return True
-    elif isinstance(schema, DictType):
-        if not isinstance(reference, DictType) or len(schema) != len(reference):
+    elif isinstance(schema, dict):
+        if not isinstance(reference, dict) or len(schema) != len(reference):
             return False
         for name, value in schema.items():
             ref_value = reference.get(name, None)
-            if ref_value is None and value != None:
+            if ref_value is None and value is not None:
                 return False
             result = CompareSchema(value, ref_value)
             if not result:
@@ -987,10 +1010,11 @@
         else:
             return True
     return schema == reference
-    
-#-------------------------------------------------------------------------------
+
+
+# -------------------------------------------------------------------------------
 #                       Base class for XSD schema extraction
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 
 
 class XSDClassFactory(ClassFactory):
@@ -999,7 +1023,7 @@
         ClassFactory.__init__(self, document, filepath, debug)
         self.Namespaces["xml"] = {
             "lang": {
-                "type": SYNTAXATTRIBUTE, 
+                "type": SYNTAXATTRIBUTE,
                 "extract": {
                     "default": GenerateModelNameExtraction("lang", LANGUAGE_model)
                 }
@@ -1007,31 +1031,31 @@
         }
         self.Namespaces["xsi"] = {
             "noNamespaceSchemaLocation": {
-                "type": SYNTAXATTRIBUTE, 
+                "type": SYNTAXATTRIBUTE,
                 "extract": {
                     "default": NotSupportedYet("noNamespaceSchemaLocation")
                 }
             },
             "nil": {
-                "type": SYNTAXATTRIBUTE, 
+                "type": SYNTAXATTRIBUTE,
                 "extract": {
                     "default": NotSupportedYet("nil")
                 }
             },
             "schemaLocation": {
-                "type": SYNTAXATTRIBUTE, 
+                "type": SYNTAXATTRIBUTE,
                 "extract": {
                     "default": NotSupportedYet("schemaLocation")
                 }
             },
             "type": {
-                "type": SYNTAXATTRIBUTE, 
+                "type": SYNTAXATTRIBUTE,
                 "extract": {
                     "default": NotSupportedYet("type")
                 }
             }
         }
-        
+
     def ParseSchema(self):
         for child in self.Document.childNodes:
             if child.nodeType == self.Document.ELEMENT_NODE:
@@ -1061,16 +1085,16 @@
         if element is None:
             if name in self.CurrentCompilations:
                 if self.Debug:
-                    print "Warning : \"%s\" is circular referenced!" % element_name
+                    print("Warning : \"%s\" is circular referenced!" % element_name)
             else:
                 raise ValueError("\"%s\" isn't defined!" % element_name)
         if element_type is not None and element["type"] != element_type:
             raise ValueError("\"%s\" isn't of the expected type!" % element_name)
         return element
-    
+
     def CreateSchemaElement(self, element_name, element_type):
         for type, attributes, elements in self.Schema[2]:
-            namespace, name = DecomposeQualifiedName(type)
+            _namespace, name = DecomposeQualifiedName(type)
             if attributes.get("name", None) == element_name:
                 element_infos = None
                 if element_type in (ATTRIBUTE, None) and name == "attribute":
@@ -1090,11 +1114,12 @@
                     return element_infos
         return None
 
-"""
-This function opens the xsd file and generate a xml parser with class lookup from 
-the xml tree
-"""
+
 def GenerateParserFromXSD(filepath):
+    """
+    This function opens the xsd file and generate a xml parser with class lookup from
+    the xml tree
+    """
     xsdfile = open(filepath, 'r')
     xsdstring = xsdfile.read()
     xsdfile.close()
@@ -1104,24 +1129,27 @@
     os.chdir(cwd)
     return parser
 
-"""
-This function generate a xml from the xsd given as a string
-"""
+
 def GenerateParserFromXSDstring(xsdstring):
+    """
+    This function generate a xml from the xsd given as a string
+    """
     return GenerateParser(XSDClassFactory(minidom.parseString(xsdstring)), xsdstring)
 
 
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
 #                           XSD schema syntax elements
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
+
 
 XSD_NAMESPACE = {
 
-#-------------------------------------------------------------------------------
-#                           Syntax elements definition
-#-------------------------------------------------------------------------------
-
-    "all": {"struct": """
+    # -------------------------------------------------------------------------------
+    #                           Syntax elements definition
+    # -------------------------------------------------------------------------------
+
+    "all": {
+        "struct": """
         <all
           id = ID
           maxOccurs = 1 : 1
@@ -1129,29 +1157,33 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, element*)
         </all>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("all", ["id", "maxOccurs", "minOccurs"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "all", ["id", "maxOccurs", "minOccurs"],
                 re.compile("((?:annotation )?(?:element )*)"))
         },
         "reduce": ReduceAll
     },
 
-    "annotation": {"struct": """
+    "annotation": {
+        "struct": """
         <annotation
           id = ID
           {any attributes with non-schema namespace . . .}>
           Content: (appinfo | documentation)*
         </annotation>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("annotation", ["id"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "annotation", ["id"],
                 re.compile("((?:app_info |documentation )*)"))
         },
         "reduce": ReduceAnnotation
     },
 
-    "any": {"struct": """
+    "any": {
+        "struct": """
         <any
           id = ID
           maxOccurs = (nonNegativeInteger | unbounded)  : 1
@@ -1161,16 +1193,18 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </any>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("any", 
-                ["id", "maxOccurs", "minOccurs", "namespace", "processContents"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "any",
+                ["id", "maxOccurs", "minOccurs", "namespace", "processContents"],
                 re.compile("((?:annotation )?(?:simpleType )*)"))
         },
         "reduce": ReduceAny
     },
 
-    "anyAttribute": {"struct": """
+    "anyAttribute": {
+        "struct": """
         <anyAttribute
           id = ID
           namespace = ((##any | ##other) | List of (anyURI | (##targetNamespace | ##local)) )  : ##any
@@ -1178,28 +1212,30 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </anyAttribute>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("anyAttribute",
-                ["id", "namespace", "processContents"], ONLY_ANNOTATION)
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "anyAttribute", ["id", "namespace", "processContents"], ONLY_ANNOTATION)
         },
         "reduce": ReduceAnyAttribute
     },
 
-    "appinfo": {"struct": """
+    "appinfo": {
+        "struct": """
         <appinfo
           source = anyURI
           {any attributes with non-schema namespace . . .}>
           Content: ({any})*
         </appinfo>""",
-        "type": SYNTAXELEMENT, 
+        "type": SYNTAXELEMENT,
         "extract": {
             "default": GenerateElement("appinfo", ["source"], re.compile("(.*)"), True)
         },
         "reduce": ReduceAppInfo
     },
 
-    "attribute": {"struct": """
+    "attribute": {
+        "struct": """
         <attribute
           default = string
           fixed = string
@@ -1212,19 +1248,22 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, simpleType?)
         </attribute>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("attribute", 
-                ["default", "fixed", "form", "id", "name", "ref", "type", "use"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "attribute",
+                ["default", "fixed", "form", "id", "name", "ref", "type", "use"],
                 re.compile("((?:annotation )?(?:simpleType )?)")),
-            "schema": GenerateElement("attribute", 
-                ["default", "fixed", "form", "id", "name", "type"], 
+            "schema": GenerateElement(
+                "attribute",
+                ["default", "fixed", "form", "id", "name", "type"],
                 re.compile("((?:annotation )?(?:simpleType )?)"))
         },
         "reduce": ReduceAttribute
     },
 
-    "attributeGroup": {"struct": """
+    "attributeGroup": {
+        "struct": """
         <attributeGroup
           id = ID
           name = NCName
@@ -1232,18 +1271,21 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, ((attribute | attributeGroup)*, anyAttribute?))
         </attributeGroup>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("attributeGroup", 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "attributeGroup",
                 ["id", "ref"], ONLY_ANNOTATION),
-            "schema": GenerateElement("attributeGroup",
-                ["id", "name"], 
+            "schema": GenerateElement(
+                "attributeGroup",
+                ["id", "name"],
                 re.compile("((?:annotation )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))"))
         },
         "reduce": ReduceAttributeGroup
     },
 
-    "choice": {"struct": """
+    "choice": {
+        "struct": """
         <choice
           id = ID
           maxOccurs = (nonNegativeInteger | unbounded)  : 1
@@ -1251,30 +1293,36 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, (element | group | choice | sequence | any)*)
         </choice>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("choice", ["id", "maxOccurs", "minOccurs"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "choice",
+                ["id", "maxOccurs", "minOccurs"],
                 re.compile("((?:annotation )?(?:element |group |choice |sequence |any )*)"))
         },
         "reduce": ReduceChoice
     },
 
-    "complexContent": {"struct": """
+    "complexContent": {
+        "struct": """
         <complexContent
           id = ID
           mixed = boolean
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, (restriction | extension))
         </complexContent>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("complexContent", ["id", "mixed"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "complexContent",
+                ["id", "mixed"],
                 re.compile("((?:annotation )?(?:restriction |extension ))"))
         },
         "reduce": ReduceComplexContent
     },
 
-    "complexType": {"struct": """
+    "complexType": {
+        "struct": """
         <complexType
           abstract = boolean : false
           block = (#all | List of (extension | restriction))
@@ -1285,31 +1333,36 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, (simpleContent | complexContent | ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))))
         </complexType>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("complexType", 
-                ["abstract", "block", "final", "id", "mixed", "name"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "complexType",
+                ["abstract", "block", "final", "id", "mixed", "name"],
                 re.compile("((?:annotation )?(?:simpleContent |complexContent |(?:(?:group |all |choice |sequence )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))))"))
         },
         "reduce": ReduceComplexType
     },
 
-    "documentation": {"struct" : """
+    "documentation": {
+        "struct": """
         <documentation
           source = anyURI
           xml:lang = language
           {any attributes with non-schema namespace . . .}>
           Content: ({any})*
         </documentation>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("documentation", 
-                ["source", "lang"], re.compile("(.*)"), True)
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "documentation",
+                ["source", "lang"],
+                re.compile("(.*)"), True)
         },
         "reduce": ReduceDocumentation
     },
 
-    "element": {"struct": """
+    "element": {
+        "struct": """
         <element
           abstract = boolean : false
           block = (#all | List of (extension | restriction | substitution))
@@ -1328,64 +1381,74 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, ((simpleType | complexType)?, (unique | key | keyref)*))
         </element>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("element", 
-                ["abstract", "block", "default", "final", "fixed", "form", "id", "maxOccurs", "minOccurs", "name", "nillable", "ref", "substitutionGroup", "type"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "element",
+                ["abstract", "block", "default", "final", "fixed", "form", "id", "maxOccurs", "minOccurs", "name", "nillable", "ref", "substitutionGroup", "type"],
                 re.compile("((?:annotation )?(?:simpleType |complexType )?(?:unique |key |keyref )*)")),
-            "schema": GenerateElement("element", 
-                ["abstract", "block", "default", "final", "fixed", "form", "id", "name", "nillable", "substitutionGroup", "type"], 
+            "schema": GenerateElement(
+                "element",
+                ["abstract", "block", "default", "final", "fixed", "form", "id", "name", "nillable", "substitutionGroup", "type"],
                 re.compile("((?:annotation )?(?:simpleType |complexType )?(?:unique |key |keyref )*)"))
         },
         "reduce": ReduceElement
     },
 
-    "enumeration": {"struct": """
+    "enumeration": {
+        "struct": """
         <enumeration
           id = ID
           value = anySimpleType
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </enumeration>""",
-        "type": SYNTAXELEMENT, 
+        "type": SYNTAXELEMENT,
         "extract": {
             "default": GenerateElement("enumeration", ["id", "value"], ONLY_ANNOTATION)
         },
         "reduce": GenerateFacetReducing("enumeration", False)
     },
 
-    "extension": {"struct": """
+    "extension": {
+        "struct": """
         <extension
           base = QName
           id = ID
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)))
         </extension>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("extension", ["base", "id"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "extension",
+                ["base", "id"],
                 re.compile("((?:annotation )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))")),
-            "complexContent": GenerateElement("extension", ["base", "id"], 
+            "complexContent": GenerateElement(
+                "extension",
+                ["base", "id"],
                 re.compile("((?:annotation )?(?:group |all |choice |sequence )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?))"))
         },
         "reduce": ReduceExtension
     },
 
-    "field": {"struct": """
+    "field": {
+        "struct": """
         <field
           id = ID
           xpath = a subset of XPath expression, see below
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </field>""",
-        "type": SYNTAXELEMENT, 
+        "type": SYNTAXELEMENT,
         "extract": {
             "default": GenerateElement("field", ["id", "xpath"], ONLY_ANNOTATION)
         },
         "reduce": ReduceField
     },
 
-    "fractionDigits": {"struct": """
+    "fractionDigits": {
+        "struct": """
         <fractionDigits
           fixed = boolean : false
           id = ID
@@ -1393,15 +1456,18 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </fractionDigits>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("fractionDigits", 
-                ["fixed", "id", "value"], ONLY_ANNOTATION)
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "fractionDigits",
+                ["fixed", "id", "value"],
+                ONLY_ANNOTATION)
         },
         "reduce": GenerateFacetReducing("fractionDigits", True)
     },
 
-    "group": {"struct": """
+    "group": {
+        "struct": """
         <group
           id = ID
           maxOccurs = (nonNegativeInteger | unbounded)  : 1
@@ -1411,19 +1477,22 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, (all | choice | sequence)?)
         </group>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("group",
-                ["id", "maxOccurs", "minOccurs", "ref"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "group",
+                ["id", "maxOccurs", "minOccurs", "ref"],
                 re.compile("((?:annotation )?(?:all |choice |sequence )?)")),
-            "schema": GenerateElement("group",
-                ["id", "name"], 
+            "schema": GenerateElement(
+                "group",
+                ["id", "name"],
                 re.compile("((?:annotation )?(?:all |choice |sequence )?)"))
         },
         "reduce": ReduceGroup
     },
 
-    "import": {"struct": """
+    "import": {
+        "struct": """
         <import
           id = ID
           namespace = anyURI
@@ -1431,45 +1500,53 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </import>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("import",
-                ["id", "namespace", "schemaLocation"], ONLY_ANNOTATION)
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "import",
+                ["id", "namespace", "schemaLocation"],
+                ONLY_ANNOTATION)
         },
         "reduce": ReduceImport
     },
 
-    "include": {"struct": """
+    "include": {
+        "struct": """
         <include
           id = ID
           schemaLocation = anyURI
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </include>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("include",
-                ["id", "schemaLocation"], ONLY_ANNOTATION)
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "include",
+                ["id", "schemaLocation"],
+                ONLY_ANNOTATION)
         },
         "reduce": ReduceInclude
     },
 
-    "key": {"struct": """
+    "key": {
+        "struct": """
         <key
           id = ID
           name = NCName
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, (selector, field+))
         </key>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("key", ["id", "name"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "key", ["id", "name"],
                 re.compile("((?:annotation )?(?:selector (?:field )+))"))
         },
         "reduce": ReduceKey
     },
 
-    "keyref": {"struct": """
+    "keyref": {
+        "struct": """
         <keyref
           id = ID
           name = NCName
@@ -1477,15 +1554,17 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, (selector, field+))
         </keyref>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("keyref", ["id", "name", "refer"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "keyref", ["id", "name", "refer"],
                 re.compile("((?:annotation )?(?:selector (?:field )+))"))
         },
         "reduce": ReduceKeyRef
     },
 
-    "length": {"struct" : """
+    "length": {
+        "struct": """
         <length
           fixed = boolean : false
           id = ID
@@ -1493,30 +1572,33 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </length>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("length", 
-                ["fixed", "id", "value"], ONLY_ANNOTATION)
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "length", ["fixed", "id", "value"], ONLY_ANNOTATION)
         },
         "reduce": GenerateFacetReducing("length", True)
     },
 
-    "list": {"struct": """
+    "list": {
+        "struct": """
         <list
           id = ID
           itemType = QName
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, simpleType?)
         </list>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("list", ["id", "itemType"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "list", ["id", "itemType"],
                 re.compile("((?:annotation )?(?:simpleType )?)$"))
         },
         "reduce": ReduceList
     },
 
-    "maxExclusive": {"struct": """
+    "maxExclusive": {
+        "struct": """
         <maxInclusive
           fixed = boolean : false
           id = ID
@@ -1524,15 +1606,16 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </maxInclusive>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("maxExclusive",
-                ["fixed", "id", "value"], ONLY_ANNOTATION)
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "maxExclusive", ["fixed", "id", "value"], ONLY_ANNOTATION)
         },
         "reduce": GenerateFacetReducing("maxExclusive", True)
     },
 
-    "maxInclusive": {"struct": """
+    "maxInclusive": {
+        "struct": """
         <maxExclusive
           fixed = boolean : false
           id = ID
@@ -1540,15 +1623,16 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </maxExclusive>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("maxInclusive", 
-                ["fixed", "id", "value"], ONLY_ANNOTATION)
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "maxInclusive", ["fixed", "id", "value"], ONLY_ANNOTATION)
         },
         "reduce": GenerateFacetReducing("maxInclusive", True)
     },
 
-    "maxLength": {"struct": """
+    "maxLength": {
+        "struct": """
         <maxLength
           fixed = boolean : false
           id = ID
@@ -1556,15 +1640,16 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </maxLength>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("maxLength", 
-                ["fixed", "id", "value"], ONLY_ANNOTATION)
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "maxLength", ["fixed", "id", "value"], ONLY_ANNOTATION)
         },
         "reduce": GenerateFacetReducing("maxLength", True)
     },
 
-    "minExclusive": {"struct": """
+    "minExclusive": {
+        "struct": """
         <minExclusive
           fixed = boolean : false
           id = ID
@@ -1572,15 +1657,16 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </minExclusive>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("minExclusive", 
-                ["fixed", "id", "value"], ONLY_ANNOTATION)
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "minExclusive", ["fixed", "id", "value"], ONLY_ANNOTATION)
         },
         "reduce": GenerateFacetReducing("minExclusive", True)
     },
 
-    "minInclusive": {"struct": """
+    "minInclusive": {
+        "struct": """
         <minInclusive
           fixed = boolean : false
           id = ID
@@ -1588,15 +1674,16 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </minInclusive>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("minInclusive", 
-                ["fixed", "id", "value"], ONLY_ANNOTATION)
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "minInclusive", ["fixed", "id", "value"], ONLY_ANNOTATION)
         },
         "reduce": GenerateFacetReducing("minInclusive", True)
     },
 
-    "minLength": {"struct": """
+    "minLength": {
+        "struct": """
         <minLength
           fixed = boolean : false
           id = ID
@@ -1604,63 +1691,74 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </minLength>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("minLength",
-                ["fixed", "id", "value"], ONLY_ANNOTATION)
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "minLength", ["fixed", "id", "value"], ONLY_ANNOTATION)
         },
         "reduce": GenerateFacetReducing("minLength", True)
     },
 
-    "pattern": {"struct": """
+    "pattern": {
+        "struct": """
         <pattern
           id = ID
           value = string
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </pattern>""",
-        "type": SYNTAXELEMENT, 
+        "type": SYNTAXELEMENT,
         "extract": {
             "default": GenerateElement("pattern", ["id", "value"], ONLY_ANNOTATION)
         },
         "reduce": GenerateFacetReducing("pattern", False)
     },
 
-    "redefine": {"struct": """
+    "redefine": {
+        "struct": """
         <redefine
           id = ID
           schemaLocation = anyURI
           {any attributes with non-schema namespace . . .}>
           Content: (annotation | (simpleType | complexType | group | attributeGroup))*
         </redefine>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("refine", ["id", "schemaLocation"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "refine", ["id", "schemaLocation"],
                 re.compile("((?:annotation |(?:simpleType |complexType |group |attributeGroup ))*)"))
         },
         "reduce": ReduceRedefine
     },
 
-    "restriction": {"struct": """
+    "restriction": {
+        "struct": """
         <restriction
           base = QName
           id = ID
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, (group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))
         </restriction>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("restriction", ["base", "id"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "restriction",
+                ["base", "id"],
                 re.compile("((?:annotation )?(?:(?:simpleType )?(?:(?:minExclusive |minInclusive |maxExclusive |maxInclusive |totalDigits |fractionDigits |length |minLength |maxLength |enumeration |whiteSpace |pattern )*)))")),
-            "simpleContent": GenerateElement("restriction", ["base", "id"], 
+            "simpleContent": GenerateElement(
+                "restriction",
+                ["base", "id"],
                 re.compile("((?:annotation )?(?:(?:simpleType )?(?:(?:minExclusive |minInclusive |maxExclusive |maxInclusive |totalDigits |fractionDigits |length |minLength |maxLength |enumeration |whiteSpace |pattern )*)?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?)))")),
-            "complexContent": GenerateElement("restriction", ["base", "id"], 
+            "complexContent": GenerateElement(
+                "restriction",
+                ["base", "id"],
                 re.compile("((?:annotation )?(?:(?:simpleType )?(?:group |all |choice |sequence )?(?:(?:attribute |attributeGroup )*(?:anyAttribute )?)))")),
         },
         "reduce": ReduceRestriction
     },
 
-    "schema": {"struct": """
+    "schema": {
+        "struct": """
         <schema
           attributeFormDefault = (qualified | unqualified) : unqualified
           blockDefault = (#all | List of (extension | restriction | substitution))  : ''
@@ -1673,29 +1771,39 @@
           {any attributes with non-schema namespace . . .}>
           Content: ((include | import | redefine | annotation)*, (((simpleType | complexType | group | attributeGroup) | element | attribute | notation), annotation*)*)
         </schema>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("schema",
-                ["attributeFormDefault", "blockDefault", "elementFormDefault", "finalDefault", "id", "targetNamespace", "version", "lang"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "schema",
+                ["attributeFormDefault",
+                 "blockDefault",
+                 "elementFormDefault",
+                 "finalDefault",
+                 "id",
+                 "targetNamespace",
+                 "version",
+                 "lang"],
                 re.compile("((?:include |import |redefine |annotation )*(?:(?:(?:simpleType |complexType |group |attributeGroup )|element |attribute |annotation )(?:annotation )*)*)"))
         }
     },
 
-    "selector": {"struct": """
+    "selector": {
+        "struct": """
         <selector
           id = ID
           xpath = a subset of XPath expression, see below
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </selector>""",
-        "type": SYNTAXELEMENT, 
+        "type": SYNTAXELEMENT,
         "extract": {
             "default": GenerateElement("selector", ["id", "xpath"], ONLY_ANNOTATION)
         },
         "reduce": ReduceSelector
     },
 
-    "sequence": {"struct": """
+    "sequence": {
+        "struct": """
         <sequence
           id = ID
           maxOccurs = (nonNegativeInteger | unbounded)  : 1
@@ -1703,29 +1811,33 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, (element | group | choice | sequence | any)*)
         </sequence>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("sequence", ["id", "maxOccurs", "minOccurs"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "sequence", ["id", "maxOccurs", "minOccurs"],
                 re.compile("((?:annotation )?(?:element |group |choice |sequence |any )*)"))
         },
         "reduce": ReduceSequence
     },
 
-    "simpleContent": {"struct" : """
+    "simpleContent": {
+        "struct": """
         <simpleContent
           id = ID
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, (restriction | extension))
         </simpleContent>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("simpleContent", ["id"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "simpleContent", ["id"],
                 re.compile("((?:annotation )?(?:restriction |extension ))"))
         },
         "reduce": ReduceSimpleContent
     },
 
-    "simpleType": {"struct" : """
+    "simpleType": {
+        "struct": """
         <simpleType
           final = (#all | List of (list | union | restriction))
           id = ID
@@ -1733,15 +1845,17 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, (restriction | list | union))
         </simpleType>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("simpleType", ["final", "id", "name"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "simpleType", ["final", "id", "name"],
                 re.compile("((?:annotation )?(?:restriction |list |union ))"))
         },
         "reduce": ReduceSimpleType
     },
 
-    "totalDigits": {"struct" : """
+    "totalDigits": {
+        "struct": """
         <totalDigits
           fixed = boolean : false
           id = ID
@@ -1749,45 +1863,50 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </totalDigits>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("totalDigits", 
-                ["fixed", "id", "value"], ONLY_ANNOTATION),
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "totalDigits", ["fixed", "id", "value"], ONLY_ANNOTATION),
         },
         "reduce": GenerateFacetReducing("totalDigits", True)
     },
 
-    "union": {"struct": """
+    "union": {
+        "struct": """
         <union
           id = ID
           memberTypes = List of QName
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, simpleType*)
         </union>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("union", ["id", "memberTypes"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "union", ["id", "memberTypes"],
                 re.compile("((?:annotation )?(?:simpleType )*)"))
         },
         "reduce": ReduceUnion
     },
 
-    "unique": {"struct": """
+    "unique": {
+        "struct": """
         <unique
           id = ID
           name = NCName
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?, (selector, field+))
         </unique>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("unique", ["id", "name"], 
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "unique", ["id", "name"],
                 re.compile("((?:annotation )?(?:selector |(?:field )+))"))
         },
         "reduce": ReduceUnique
     },
-    
-    "whiteSpace": {"struct" : """
+
+    "whiteSpace": {
+        "struct": """
         <whiteSpace
           fixed = boolean : false
           id = ID
@@ -1795,20 +1914,20 @@
           {any attributes with non-schema namespace . . .}>
           Content: (annotation?)
         </whiteSpace>""",
-        "type": SYNTAXELEMENT, 
-        "extract": {
-            "default": GenerateElement("whiteSpace", 
-                ["fixed", "id", "value"], ONLY_ANNOTATION)
+        "type": SYNTAXELEMENT,
+        "extract": {
+            "default": GenerateElement(
+                "whiteSpace", ["fixed", "id", "value"], ONLY_ANNOTATION)
         },
         "reduce": GenerateFacetReducing("whiteSpace", True)
     },
 
-#-------------------------------------------------------------------------------
-#                       Syntax attributes definition
-#-------------------------------------------------------------------------------
+    # -------------------------------------------------------------------------------
+    #                       Syntax attributes definition
+    # -------------------------------------------------------------------------------
 
     "abstract": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GetBoolean
         },
@@ -1818,31 +1937,32 @@
     },
 
     "attributeFormDefault": {
-        "type": SYNTAXATTRIBUTE, 
-        "extract": {
-            "default": GenerateEnumeratedExtraction("member attributeFormDefault", ["qualified", "unqualified"])
+        "type": SYNTAXATTRIBUTE,
+        "extract": {
+            "default": GenerateEnumeratedExtraction(
+                "member attributeFormDefault", ["qualified", "unqualified"])
         },
         "default": {
             "default": "unqualified"
         }
     },
-    
+
     "base": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateModelNameExtraction("member base", QName_model)
         }
     },
-    
+
     "block": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateGetList("block", ["restriction", "extension", "substitution"])
         }
     },
-    
+
     "blockDefault": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateGetList("block", ["restriction", "extension", "substitution"])
         },
@@ -1850,16 +1970,16 @@
             "default": ""
         }
     },
-    
+
     "default": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GetAttributeValue
         }
     },
 
     "elementFormDefault": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateEnumeratedExtraction("member elementFormDefault", ["qualified", "unqualified"])
         },
@@ -1867,9 +1987,9 @@
             "default": "unqualified"
         }
     },
-    
+
     "final": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateGetList("final", ["restriction", "extension", "substitution"]),
             "simpleType": GenerateGetList("final", ["list", "union", "restriction"])
@@ -1877,7 +1997,7 @@
     },
 
     "finalDefault": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateGetList("finalDefault", ["restriction", "extension", "list", "union"])
         },
@@ -1885,9 +2005,9 @@
             "default": ""
         }
     },
-    
+
     "fixed": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GetBoolean,
             "attribute": GetAttributeValue,
@@ -1901,35 +2021,35 @@
     },
 
     "form": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateEnumeratedExtraction("member form", ["qualified", "unqualified"])
         }
     },
 
     "id": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateModelNameExtraction("member id", NCName_model)
         }
     },
-    
+
     "itemType": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateModelNameExtraction("member itemType", QName_model)
         }
     },
 
     "memberTypes": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateModelNameListExtraction("member memberTypes", QNames_model)
         },
     },
-    
+
     "maxOccurs": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateLimitExtraction(),
             "all": GenerateLimitExtraction(1, 1, False)
@@ -1940,9 +2060,9 @@
     },
 
     "minOccurs": {
-        "type": SYNTAXATTRIBUTE, 
-        "extract": {
-            "default": GenerateLimitExtraction(unbounded = False),
+        "type": SYNTAXATTRIBUTE,
+        "extract": {
+            "default": GenerateLimitExtraction(unbounded=False),
             "all": GenerateLimitExtraction(0, 1, False)
         },
         "default": {
@@ -1951,7 +2071,7 @@
     },
 
     "mixed": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GetBoolean
         },
@@ -1960,16 +2080,16 @@
             "complexType": False
         }
     },
-    
+
     "name": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateModelNameExtraction("member name", NCName_model)
         }
     },
-    
+
     "namespace": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateModelNameExtraction("member namespace", URI_model),
             "any": GetNamespaces
@@ -1981,14 +2101,14 @@
     },
 
     "nillable": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GetBoolean
         },
     },
-    
+
     "processContents": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateEnumeratedExtraction("member processContents", ["lax", "skip", "strict"])
         },
@@ -1996,9 +2116,9 @@
             "default": "strict"
         }
     },
-    
+
     "ref": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateModelNameExtraction("member ref", QName_model)
         }
@@ -2010,44 +2130,44 @@
             "default": GenerateModelNameExtraction("member refer", QName_model)
         }
     },
-    
+
     "schemaLocation": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateModelNameExtraction("member schemaLocation", URI_model)
         }
     },
-    
+
     "source": {
         "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateModelNameExtraction("member source", URI_model)
         }
     },
-    
+
     "substitutionGroup": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateModelNameExtraction("member substitutionGroup", QName_model)
         }
     },
 
     "targetNamespace": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateModelNameExtraction("member targetNamespace", URI_model)
         }
     },
-    
+
     "type": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateModelNameExtraction("member type", QName_model)
         }
     },
 
     "use": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GenerateEnumeratedExtraction("member usage", ["required", "optional", "prohibited"])
         },
@@ -2057,7 +2177,7 @@
     },
 
     "value": {
-        "type": SYNTAXATTRIBUTE, 
+        "type": SYNTAXATTRIBUTE,
         "extract": {
             "default": GetAttributeValue,
             "fractionDigits": GenerateIntegerExtraction(minInclusive=0),
@@ -2077,87 +2197,86 @@
     },
 
     "xpath": {
-        "type": SYNTAXATTRIBUTE, 
-        "extract": {
-#            "default": NotSupportedYet("xpath")
+        "type": SYNTAXATTRIBUTE,
+        "extract": {
+            # "default": NotSupportedYet("xpath")
             "default": GetAttributeValue
         }
     },
-    
-#-------------------------------------------------------------------------------
-#                           Simple types definition
-#-------------------------------------------------------------------------------
+
+    # -------------------------------------------------------------------------------
+    #                           Simple types definition
+    # -------------------------------------------------------------------------------
 
     "string": {
         "type": SIMPLETYPE,
         "basename": "string",
         "extract": GetAttributeValue,
         "facets": STRING_FACETS,
-        "generate": GenerateSimpleTypeXMLText(lambda x : x),
+        "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
-    },
+        "check": lambda x: isinstance(x, string_types)},
 
     "normalizedString": {
         "type": SIMPLETYPE,
         "basename": "normalizedString",
         "extract": GetNormalizedString,
         "facets": STRING_FACETS,
-        "generate": GenerateSimpleTypeXMLText(lambda x : x),
+        "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "token": {
         "type": SIMPLETYPE,
-        "basename": "token",  
+        "basename": "token",
         "extract": GetToken,
         "facets": STRING_FACETS,
-        "generate": GenerateSimpleTypeXMLText(lambda x : x),
+        "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
-    },
-    
+        "check": lambda x: isinstance(x, string_types)
+    },
+
     "base64Binary": {
-        "type": SIMPLETYPE, 
-        "basename": "base64Binary", 
+        "type": SIMPLETYPE,
+        "basename": "base64Binary",
         "extract": NotSupportedYet("base64Binary"),
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: 0,
-        "check": lambda x: isinstance(x, (IntType, LongType))
-    },
-    
+        "check": lambda x: isinstance(x, (int, long))
+    },
+
     "hexBinary": {
         "type": SIMPLETYPE,
-        "basename": "hexBinary", 
+        "basename": "hexBinary",
         "extract": GetHexInteger,
         "facets": STRING_FACETS,
-        "generate": GenerateSimpleTypeXMLText(lambda x: ("%."+str(int(round(len("%X"%x)/2.)*2))+"X")%x),
+        "generate": GenerateSimpleTypeXMLText(lambda x: ("%."+str(int(round(len("%X" % x)/2.)*2))+"X") % x),
         "initial": lambda: 0,
-        "check": lambda x: isinstance(x, (IntType, LongType))
+        "check": lambda x: isinstance(x, (int, long))
     },
 
     "integer": {
         "type": SIMPLETYPE,
-        "basename": "integer", 
+        "basename": "integer",
         "extract": GenerateIntegerExtraction(),
         "facets": DECIMAL_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: 0,
-        "check": lambda x: isinstance(x, IntType)
-    },
-    
+        "check": lambda x: isinstance(x, int)
+    },
+
     "positiveInteger": {
         "type": SIMPLETYPE,
-        "basename": "positiveInteger", 
+        "basename": "positiveInteger",
         "extract": GenerateIntegerExtraction(minExclusive=0),
         "facets": DECIMAL_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: 1,
-        "check": lambda x: isinstance(x, IntType)
-    },
-    
+        "check": lambda x: isinstance(x, int)
+    },
+
     "negativeInteger": {
         "type": SIMPLETYPE,
         "basename": "negativeInteger",
@@ -2165,107 +2284,107 @@
         "facets": DECIMAL_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: -1,
-        "check": lambda x: isinstance(x, IntType)
-    },
-    
+        "check": lambda x: isinstance(x, int)
+    },
+
     "nonNegativeInteger": {
-        "type": SIMPLETYPE, 
-        "basename": "nonNegativeInteger", 
+        "type": SIMPLETYPE,
+        "basename": "nonNegativeInteger",
         "extract": GenerateIntegerExtraction(minInclusive=0),
         "facets": DECIMAL_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: 0,
-        "check": lambda x: isinstance(x, IntType)
-    },
-    
+        "check": lambda x: isinstance(x, int)
+    },
+
     "nonPositiveInteger": {
         "type": SIMPLETYPE,
-        "basename": "nonPositiveInteger", 
+        "basename": "nonPositiveInteger",
         "extract": GenerateIntegerExtraction(maxInclusive=0),
         "facets": DECIMAL_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: 0,
-        "check": lambda x: isinstance(x, IntType)
-    },
-    
+        "check": lambda x: isinstance(x, int)
+    },
+
     "long": {
         "type": SIMPLETYPE,
         "basename": "long",
-        "extract": GenerateIntegerExtraction(minInclusive=-2**63,maxExclusive=2**63),
+        "extract": GenerateIntegerExtraction(minInclusive=-2**63, maxExclusive=2**63),
         "facets": DECIMAL_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: 0,
-        "check": lambda x: isinstance(x, IntType)
-    },
-    
+        "check": lambda x: isinstance(x, int)
+    },
+
     "unsignedLong": {
         "type": SIMPLETYPE,
         "basename": "unsignedLong",
-        "extract": GenerateIntegerExtraction(minInclusive=0,maxExclusive=2**64),
+        "extract": GenerateIntegerExtraction(minInclusive=0, maxExclusive=2**64),
         "facets": DECIMAL_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: 0,
-        "check": lambda x: isinstance(x, IntType)
+        "check": lambda x: isinstance(x, int)
     },
 
     "int": {
         "type": SIMPLETYPE,
         "basename": "int",
-        "extract": GenerateIntegerExtraction(minInclusive=-2**31,maxExclusive=2**31),
+        "extract": GenerateIntegerExtraction(minInclusive=-2**31, maxExclusive=2**31),
         "facets": DECIMAL_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: 0,
-        "check": lambda x: isinstance(x, IntType)
+        "check": lambda x: isinstance(x, int)
     },
 
     "unsignedInt": {
         "type": SIMPLETYPE,
         "basename": "unsignedInt",
-        "extract": GenerateIntegerExtraction(minInclusive=0,maxExclusive=2**32),
+        "extract": GenerateIntegerExtraction(minInclusive=0, maxExclusive=2**32),
         "facets": DECIMAL_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: 0,
-        "check": lambda x: isinstance(x, IntType)
+        "check": lambda x: isinstance(x, int)
     },
 
     "short": {
         "type": SIMPLETYPE,
         "basename": "short",
-        "extract": GenerateIntegerExtraction(minInclusive=-2**15,maxExclusive=2**15),
+        "extract": GenerateIntegerExtraction(minInclusive=-2**15, maxExclusive=2**15),
         "facets": DECIMAL_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: 0,
-        "check": lambda x: isinstance(x, IntType)
+        "check": lambda x: isinstance(x, int)
     },
 
     "unsignedShort": {
         "type": SIMPLETYPE,
-        "basename": "unsignedShort", 
-        "extract": GenerateIntegerExtraction(minInclusive=0,maxExclusive=2**16),
+        "basename": "unsignedShort",
+        "extract": GenerateIntegerExtraction(minInclusive=0, maxExclusive=2**16),
         "facets": DECIMAL_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: 0,
-        "check": lambda x: isinstance(x, IntType)
+        "check": lambda x: isinstance(x, int)
     },
 
     "byte": {
         "type": SIMPLETYPE,
         "basename": "byte",
-        "extract": GenerateIntegerExtraction(minInclusive=-2**7,maxExclusive=2**7),
+        "extract": GenerateIntegerExtraction(minInclusive=-2**7, maxExclusive=2**7),
         "facets": DECIMAL_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: 0,
-        "check": lambda x: isinstance(x, IntType)
+        "check": lambda x: isinstance(x, int)
     },
 
     "unsignedByte": {
         "type": SIMPLETYPE,
         "basename": "unsignedByte",
-        "extract": GenerateIntegerExtraction(minInclusive=0,maxExclusive=2**8),
+        "extract": GenerateIntegerExtraction(minInclusive=0, maxExclusive=2**8),
         "facets": DECIMAL_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: 0,
-        "check": lambda x: isinstance(x, IntType)
+        "check": lambda x: isinstance(x, int)
     },
 
     "decimal": {
@@ -2275,7 +2394,7 @@
         "facets": DECIMAL_FACETS,
         "generate": GenerateFloatXMLText(decimal=3),
         "initial": lambda: 0.,
-        "check": lambda x: isinstance(x, (IntType, FloatType))
+        "check": lambda x: isinstance(x, (int, float))
     },
 
     "float": {
@@ -2285,7 +2404,7 @@
         "facets": NUMBER_FACETS,
         "generate": GenerateFloatXMLText(["INF", "-INF", "NaN"]),
         "initial": lambda: 0.,
-        "check": lambda x: {"INF" : True, "-INF" : True, "NaN" : True}.get(x, isinstance(x, (IntType, FloatType)))
+        "check": lambda x: {"INF": True, "-INF": True, "NaN": True}.get(x, isinstance(x, (int, float)))
     },
 
     "double": {
@@ -2295,7 +2414,7 @@
         "facets": NUMBER_FACETS,
         "generate": GenerateFloatXMLText(["INF", "-INF", "NaN"]),
         "initial": lambda: 0.,
-        "check": lambda x: {"INF" : True, "-INF" : True, "NaN" : True}.get(x, isinstance(x, (IntType, FloatType)))
+        "check": lambda x: {"INF": True, "-INF": True, "NaN": True}.get(x, isinstance(x, (int, float)))
     },
 
     "boolean": {
@@ -2303,10 +2422,10 @@
         "basename": "boolean",
         "extract": GetBoolean,
         "facets": GenerateDictFacets(["pattern", "whiteSpace"]),
-        "generate": GenerateSimpleTypeXMLText(lambda x:{True : "true", False : "false"}[x]),
+        "generate": GenerateSimpleTypeXMLText(lambda x: {True: "true", False: "false"}[x]),
         "initial": lambda: False,
-        "check": lambda x: isinstance(x, BooleanType)
-    },	
+        "check": lambda x: isinstance(x, bool)
+    },
 
     "duration": {
         "type": SIMPLETYPE,
@@ -2315,7 +2434,7 @@
         "facets": NUMBER_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "dateTime": {
@@ -2324,7 +2443,7 @@
         "extract": GetDateTime,
         "facets": NUMBER_FACETS,
         "generate": GenerateSimpleTypeXMLText(datetime.datetime.isoformat),
-        "initial": lambda: datetime.datetime(1,1,1,0,0,0,0),
+        "initial": lambda: datetime.datetime(1, 1, 1, 0, 0, 0, 0),
         "check": lambda x: isinstance(x, datetime.datetime)
     },
 
@@ -2334,17 +2453,17 @@
         "extract": GetDate,
         "facets": NUMBER_FACETS,
         "generate": GenerateSimpleTypeXMLText(datetime.date.isoformat),
-        "initial": lambda: datetime.date(1,1,1),
+        "initial": lambda: datetime.date(1, 1, 1),
         "check": lambda x: isinstance(x, datetime.date)
     },
-    
+
     "time": {
         "type": SIMPLETYPE,
         "basename": "time",
         "extract": GetTime,
         "facets": NUMBER_FACETS,
         "generate": GenerateSimpleTypeXMLText(datetime.time.isoformat),
-        "initial": lambda: datetime.time(0,0,0,0),
+        "initial": lambda: datetime.time(0, 0, 0, 0),
         "check": lambda x: isinstance(x, datetime.time)
     },
 
@@ -2355,7 +2474,7 @@
         "facets": NUMBER_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "gYearMonth": {
@@ -2365,7 +2484,7 @@
         "facets": NUMBER_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "gMonth": {
@@ -2375,7 +2494,7 @@
         "facets": NUMBER_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "gMonthDay": {
@@ -2385,7 +2504,7 @@
         "facets": NUMBER_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "gDay": {
@@ -2395,7 +2514,7 @@
         "facets": NUMBER_FACETS,
         "generate": GenerateSimpleTypeXMLText(str),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "Name": {
@@ -2405,9 +2524,9 @@
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
-    },
-    
+        "check": lambda x: isinstance(x, string_types)
+    },
+
     "QName": {
         "type": SIMPLETYPE,
         "basename": "QName",
@@ -2415,7 +2534,7 @@
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "NCName": {
@@ -2425,7 +2544,7 @@
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "anyURI": {
@@ -2435,7 +2554,7 @@
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "language": {
@@ -2445,7 +2564,7 @@
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "en",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "ID": {
@@ -2455,7 +2574,7 @@
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "IDREF": {
@@ -2465,7 +2584,7 @@
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "IDREFS": {
@@ -2475,7 +2594,7 @@
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "ENTITY": {
@@ -2485,7 +2604,7 @@
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "ENTITIES": {
@@ -2495,7 +2614,7 @@
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "NOTATION": {
@@ -2505,7 +2624,7 @@
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "NMTOKEN": {
@@ -2515,7 +2634,7 @@
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     "NMTOKENS": {
@@ -2525,10 +2644,9 @@
         "facets": STRING_FACETS,
         "generate": GenerateSimpleTypeXMLText(lambda x: x),
         "initial": lambda: "",
-        "check": lambda x: isinstance(x, (StringType, UnicodeType))
+        "check": lambda x: isinstance(x, string_types)
     },
 
     # Complex Types
-    "anyType": {"type": COMPLEXTYPE, "extract": lambda x:None},
+    "anyType": {"type": COMPLEXTYPE, "extract": lambda x: None},
 }
-